1. 程式人生 > >第五章(1.4)深度學習——神經網路架構和原理

第五章(1.4)深度學習——神經網路架構和原理

一、為什麼需要機器學習

有些任務直接編碼較為複雜,我們不能處理所有的細微之處和簡單編碼,因此,機器學習很有必要。相反,我們向機器學習演算法提供大量資料,讓演算法不斷探索資料並構建模型來解決問題。比如:在新的雜亂照明場景內,從新的角度識別三維物體;編寫一個計算信用卡交易詐騙概率的程式。

機器學習方法如下:它沒有為每個特定的任務編寫相應的程式,而是收集大量事例,為給定輸入指定正確輸出。演算法利用這些事例產生程式。該程式與手寫程式不同,可能包含數百萬的資料量,也適用於新事例以及訓練過的資料。若資料改變,程式在新資料上訓練且被更新。大量的計算比支付手寫程式要便宜的多。

機器學習的應用如下:

  • 模式識別:識別實際場景的面部或表情、語言識別。

  • 識別異常:信用卡交易順序異常,核電廠感測器讀數模式異常。

  • 預測:未來股價或貨幣匯率,個人觀影喜好。

二、什麼是神經網路

神經網路是一種通用機器學習模型,是一套特定的演算法集,在機器學習領域掀起了一場變革,本身就是普通函式的逼近,可以應用到任何機器學習輸入到輸出的複雜對映問題。一般來說,神經網路架構可分為3類:

  • 前饋神經網路:是最常見的型別,第一層為輸入,最後一層為輸出。如果有多個隱藏層,則稱為“深度”神經網路。它能夠計算出一系列事件間相似轉變的變化,每層神經元的活動是下一層的非線性函式。

  • 迴圈神經網路:各節點之間構成迴圈圖,可以按照箭頭的方向回到初始點。迴圈神經網路具有複雜的動態,難以訓練,它模擬連續資料,相當於每個時間片段具有一個隱藏層的深度網路,除了在每個時間片段上使用相同的權重,也有輸入。網路可以記住隱藏狀態的資訊,但是很難用這點來訓練網路。

  • 對稱連線網路:和迴圈神經網路一樣,但單元間的連線是對稱的(即在兩個方向的連線權重相同),它比迴圈神經網路更容易分析,但是功能受限。沒有隱藏單元的對稱連線的網路被稱為“Hopfiels網路”,有隱藏單元的對稱連線的網路則被稱為“波茲曼機器”。

三、感知機(Perceptron)
這裡寫圖片描述

作為第一代神經網路,感知機是隻有一個神經元的計算模型。首先將原始輸入向量轉化為特徵向量,再用手寫程式定義特徵,然後學習如何對每個特徵加權得到一個標量,如果標量值高於某一閾值,則認為輸入向量是目標類的一個積極樣例。標準的感知機結構是前饋模型,即輸入傳送到節點,處理後產生輸出結果:從底部輸入,頂部輸出,如下圖所示。但也有其侷限性:一旦確定了手寫編碼特徵,在學習上就受到了較大限制。這對感知器來說是毀滅性的,儘管轉換類似於翻譯,但是模式識別的重點是識別模式。如果這些轉換形成了一個組,學習的感知器部分不能學會識別,所以需要使用多個特徵單元識別子模式的轉換。

沒有隱藏單元的網路在輸入輸出對映建模上也有很大侷限性。增加線性單元層也解決不了,因為線性疊加依然是線性的,固定的非線性輸出也不能建立這種對映。因此需要建立多層自適應的非線性隱藏單元。

四、卷積神經網路(Convolutional Neural Network)

一直以來,機器學習研究廣泛集中在物件檢測上,但仍有諸多因素使其難以

識別物件:

  • 物件分割、遮擋問題
  • 照明影響畫素強度
  • 物體以各種不同的形式展現
  • 相同功能的物件具有不同的物理形狀
  • 視覺不同帶來的變化
  • 維度跳躍問題

這裡寫圖片描述

複製特徵方法是當前CNN用於目標檢測的主要方法,大規模的複製不同位置上相同的特徵檢測圖,大大減少了要學習的自由引數數量。它使用不同的特徵型別,每種型別都有自己的複製檢測圖,也允許以各種方式表示每個影象塊。

CNN可用於手寫數字識別到3D物件識別等,但從彩色影象中識別物件比手寫數字識別要複雜,它的類別、畫素是數字的100倍(1000 vs 100,256*256彩色vs28*28灰度)。

2012年的ILSVRC-2012競賽中的ImageNet提供一個包含120萬張高解析度訓練影象的資料集。測試影象沒有標註,參賽者需要識別影象中物件的型別。獲勝者Alex Krizhevsky開發了一個深度卷積神經網路,除了一些最大池化層,架構還有7個隱藏層,前面都是卷積層,最後2層是全域性連線。啟用函式在每個隱藏層都是線性單元,比邏輯單元速度更快,還使用競爭性規範標準抑制隱藏活動,有助於強度變化。硬體上,在兩個Nvidia GTX 580 GPU(超過1000個快速核心)上使用一個高效卷積網路實現,非常適合矩陣乘法,具有很高的記憶體頻寬。

五、迴圈神經網路( Recurrent Neural Network)

迴圈神經網路(RNN)有兩個強大的屬性可以計算任何計算機計算出來的東西:

  • 允許儲存大量有效資訊的分散式隱藏狀態
  • 用複雜的方式允許更新隱藏狀態的非線性動態。RNN強大的計算能力和梯度消失(或爆炸)使其很難訓練。通過多層反向傳播時,若權重很小,則梯度呈指數縮小;若權重很大,則梯度呈指數增長。典型的前饋神經網路的一些隱藏層可以應對指數效應,另一方面,在長序列RNN中,梯度容易消失(或爆照),即使有好的初始權重,也很難檢測出當前依賴於多個時間輸入的目標輸出因此很難處理遠端依賴性。

這裡寫圖片描述

學習RNN的方法如下:

長短期記憶:用具有長期記憶值的小模組製作RNN

Hessian Free Optimization:使用優化器處理梯度消失問題。

回聲狀態網路:初始化輸入→隱藏和隱藏→隱藏和輸出→隱藏連結,使隱藏狀態有一個巨大的弱耦合振盪器儲備,可以選擇性的由輸入驅動。

用動量初始化:和回聲狀態網路一樣,再用動量學習所有連線。

六、長短期記憶網路(Long/Short Term Memory Network)

這裡寫圖片描述

Hochreiter & Schmidhuber(1997年)構建了長短期記憶網路,解決了獲取RNN長時間記憶問題,使用乘法邏輯線性單元設計儲存單元,只要保持“寫入”門開啟,資訊就會寫入並保持在單元中,也可以開啟“讀取”門從中獲取資料。

RNN可以閱讀行書,筆尖的輸入座標為(x,y,p),p代表筆是向上還是向下,輸出則為一個字元序列,使用一系列小影象作為輸入而不是筆座標。Graves & Schmidhuber(2009年)稱帶有LSTMRNN是閱讀行書的最佳系統。

七、霍普菲爾德網路(Hopfield Networks)

非線性迴圈網路有很多種表現方式,較難分析:能達到穩定、震盪或餛飩狀態這三種表現形式。Hopfield網路是由有迴圈連線的二進位制閾值單元組成。1982年,約翰·霍普菲爾德發現,如果連線對稱,則存在一個全域性能量函式,整個網路的每個二進位制“結構”都有能量,而二進位制閾值決策規則使網路為能量函式設定一個最小值。使用這種計算型別最簡單的方法是將記憶作為神經網路的能量最小值。使用能量最小值表示記憶給出了一個內容可尋記憶體,可通過了解區域性內容來訪問整個專案。

這裡寫圖片描述

每記憶一次配置,都希望能產生一個能量最小值。但若有兩個最小值就會限制Hopfield網路容量。伊麗莎白·加德納發現有一個更好的儲存規則,它使用了所有的權重。而不是試圖一次儲存多個向量,她通過訓練集進行多次迴圈,並用感知器收斂程式訓練每個單元,使該向量的所有其它單元具有正確的狀態。

八、玻爾茲曼機(Boltzmann Machine Network)

玻爾茲曼機是一種隨機迴圈神經網路,可以被看作是Hopfield網路的隨機生成產物,是最先學習內部representations的神經網路之一。該演算法旨在最大限度地提高機器在訓練集中分配給二進位制向量的概率的乘積,相當於最大化其分配給訓練向量的對數概率之和,方法如下:

  • 網路沒有外部輸入時,使網路在不同時間分佈穩定
  • 每次對可見向量取樣

這裡寫圖片描述

2012年,SalakhutdinovHinton為玻爾茲曼機寫了有效的小批量學習程式。2014年將模型更新,稱之為受限玻爾茲曼機,詳情請檢視原文。

九、深度信念網路(Deep Belief Network)
這裡寫圖片描述

反向傳播,是人工神經網路計算處理一批資料後每個神經元的誤差分佈的標準方法,但是也存在一些問題。首先要標註訓練資料,但幾乎所有資料都沒有標註;其次,學習時間不足,這意味著隱藏層數較多的網路較慢;第三,可能會使區域性陷入最不利局面。因此,對於深度網路來說這遠遠不夠。

無監督學習方法克服了反向傳播的限制,使用梯度方法調整權重有助於保持架構的效率和簡單性,還可以將它用於對感官輸入結構建模。特別的是,它調整權重,將產生感官輸入的生成模型概率最大化。信念網路是由隨機變數組成的有向非迴圈圖,可推斷未觀測變數的狀態,還可以調整變數間的互動,使網路更可能產生訓練資料。

早期圖形模型是專家定義影象結構和條件概率,這些圖形是稀疏連線的,他們專注於做正確的推論,而不是學習。但對於神經網路來說,學習是重點,其目的不在於可解釋性或稀疏連線性使推斷變得更容易。

十、深度自動編碼器(Deep Auto-encoders)

該架構提供了兩種對映方式,好像是一個做非線性降維非常好的方法,它在訓練事例的數量上是線性的(或更好的),而最終編碼模型相當緊湊和快速。然而,使用反向傳播優化深度自動編碼器很困難,若初始權重較小,反向傳播梯度會消失。我們使用無監督逐層預訓練或像回聲狀態網路一樣認真的初始化權重。

這裡寫圖片描述

對於預訓練任務有三種不同型別的淺自動編碼器:

  • RBM作為自動編碼器
  • 去噪自動編碼器
  • 壓縮自動編碼器。對於沒有大量標註的資料集,預訓練有助於後續的判別式學習。即便是深度神經網路,對於大量的標註資料集,無監督訓練對權重初始化並不是必要的,預訓練是初始化深度網路權重的第一個好方法,現在也有其它方法。但如果擴大網路,需要再次做預訓練

總結:傳統的程式設計方法是我們告訴計算機做什麼,將大問題分解成很多小而精確的且計算機可以輕鬆執行的任務。神經網路則不需要告訴計算機如何解決問題,而是從觀測到的資料中學習,找到解決問題的辦法。