A. 循環神經網路
花書中關於RNN的內容記錄於 https://www.jianshu.com/p/206090600f13 。
在前饋神經網路中,信息的傳遞是單向的,這種限制雖然使得網路變得更容易學習,但在一定程度上也減弱了神經網路模型的能力。在生物神經網路中,神經元之間的連接關系要復雜的多。 前饋神經網路可以看作是一個復雜的函數,每次輸入都是獨立的,即網路的輸出只依賴於當前的輸入。但是在很多現實任務中,網路的輸入不僅和當前時刻的輸入相關,也和其過去一段時間的輸出相關 。因此,前饋網路難以處理時序數據,比如視頻、語音、文本等。時序數據的長度一般是不固定的,而前饋神經網路要求輸入和輸出的維數都是固定的,不能任意改變。因此,當處理這一類和時序相關的問題時,就需要一種能力更強的模型。
循環神經網路(Recurrent Neural Network,RNN)是一類具有短期記憶能力的神經網路。在循環神經網路中,神經元不但可以接受其它神經元的信息,也可以接受自身的信息,形成具有環路的網路結構。 和前饋神經網路相比,循環神經網路更加符合生物神經網路的結構。循環神經網路已經被廣泛應用在語音識別、語言模型以及自然語言生成等任務上。循環神經網路的參數學習可以通過 隨時間反向傳播演算法 來學習。
為了處理這些時序數據並利用其歷史信息,我們需要讓網路具有短期記憶能力。而前饋網路是一個靜態網路,不具備這種記憶能力。
一種簡單的利用歷史信息的方法是建立一個額外的延時單元,用來存儲網路的歷史信息(可以包括輸入、輸出、隱狀態等)。比較有代表性的模型是延時神經網路。
延時神經網路是在前饋網路中的非輸出層都添加一個延時器,記錄最近幾次神經元的輸出。在第 個時刻,第 層神經元和第 層神經元的最近 次輸出相關,即:
延時神經網路在時間維度上共享權值,以降低參數數量。因此對於序列輸入來講,延時神經網路就相當於卷積神經網路 。
自回歸模型(Autoregressive Model,AR) 是統計學上常用的一類時間序列模型,用一個變數 的歷史信息來預測自己:
其中 為超參數, 為參數, 為第 個時刻的雜訊,方差 和時間無關。
有外部輸入的非線性自回歸模型(Nonlinear Autoregressive with ExogenousInputs Model,NARX) 是自回歸模型的擴展,在每個時刻 都有一個外部輸入 ,產生一個輸出 。NARX通過一個延時器記錄最近幾次的外部輸入和輸出,第 個時刻的輸出 為:
其中 表示非線性函數,可以是一個前饋網路, 和 為超參數。
循環神經網路通過使用帶自反饋的神經元,能夠處理任意長度的時序數據。
給定一個輸入序列 ,循環神經網路通過下面
公式更新帶反饋邊的隱藏層的活性值 :
其中 , 為一個非線性函數,也可以是一個前饋網路。
從數學上講,上式可以看成一個動力系統。動力系統(Dynamical System)是一個數學上的概念,指 系統狀態按照一定的規律隨時間變化的系統 。具體地講,動力系統是使用一個函數來描述一個給定空間(如某個物理系統的狀態空間)中所有點隨時間的變化情況。因此, 隱藏層的活性值 在很多文獻上也稱為狀態(State)或隱狀態(Hidden States) 。理論上,循環神經網路可以近似任意的非線性動力系統。
簡單循環網路(Simple Recurrent Network,SRN)是一個非常簡單的循環神經網路,只有一個隱藏層的神經網路。
在一個兩層的前饋神經網路中,連接存在相鄰的層與層之間,隱藏層的節點之間是無連接的。而 簡單循環網路增加了從隱藏層到隱藏層的反饋連接 。
假設在時刻 時,網路的輸入為 ,隱藏層狀態(即隱藏層神經元活性值) 不僅和當前時刻的輸入 相關,也和上一個時刻的隱藏層狀態 相關:
其中 為隱藏層的凈輸入, 是非線性激活函數,通常為Logistic函數或Tanh函數, 為狀態-狀態權重矩陣, 為狀態-輸入權重矩陣, 為偏置。上面兩式也經常直接寫為:
如果我們把每個時刻的狀態都看作是前饋神經網路的一層的話,循環神經網路可以看作是在時間維度上權值共享的神經網路 。下圖給出了按時間展開的循環神經網路。
由於循環神經網路具有短期記憶能力,相當於存儲裝置,因此其計算能力十分強大。 前饋神經網路可以模擬任何連續函數,而循環神經網路可以模擬任何程序。
定義一個完全連接的循環神經網路,其輸入為 ,輸出為 :
其中 為隱狀態, 為非線性激活函數, 和 為網路參數。
這樣一個完全連接的循環神經網路可以近似解決所有的可計算問題 。
循環神經網路可以應用到很多不同類型的機器學習任務。根據這些任務的特點可以分為以下幾種模式: 序列到類別模式、同步的序列到序列模式、非同步的序列到序列模式 。
序列到類別模式主要用於序列數據的分類問題:輸入為序列,輸出為類別。比如在文本分類中,輸入數據為單詞的序列,輸出為該文本的類別。
假設一個樣本 為一個長度為 的序列,輸出為一個類別 。我們可以將樣本 按不同時刻輸入到循環神經網路中,並得到不同時刻的隱藏狀態 。我們可以將 看作整個序列的最終表示(或特徵),並輸入給分類器 進行分類:
其中 可以是簡單的線性分類器(比如Logistic 回歸)或復雜的分類器(比如多層前饋神經網路)
除了將最後時刻的狀態作為序列表示之外,我們還可以對整個序列的所有狀態進行平均,並用這個平均狀態來作為整個序列的表示:
同步的序列到序列模式 主要用於序列標注(Sequence Labeling)任務,即每一時刻都有輸入和輸出,輸入序列和輸出序列的長度相同 。比如詞性標注(Partof-Speech Tagging)中,每一個單詞都需要標注其對應的詞性標簽。
輸入為序列 ,輸出為序列 。樣本 按不同時刻輸入到循環神經網路中,並得到不同時刻的隱狀態 。每個時刻的隱狀態 代表當前和歷史的信息,並輸入給分類器 得到當前時刻的標簽 。
非同步的序列到序列模式也稱為 編碼器-解碼器(Encoder-Decoder)模型,即輸入序列和輸出序列不需要有嚴格的對應關系,也不需要保持相同的長度。 比如在機器翻譯中,輸入為源語言的單詞序列,輸出為目標語言的單詞序列。
在非同步的序列到序列模式中,輸入為長度為 的序列 ,輸出為長度為 的序列 。經常通過 先編碼後解碼 的方式來實現。先將樣本 按不同時刻輸入到一個循環神經網路(編碼器)中,並得到其編碼 。然後再使用另一個循環神經網路(解碼器)中,得到輸出序列 。為了建立輸出序列之間的依賴關系,在解碼器中通常使用非線性的自回歸模型。
其中 分別為用作編碼器和解碼器的循環神經網路, 為分類器, 為預測輸出 的向量表示。
循環神經網路的參數可以通過梯度下降方法來進行學習。給定一個訓練樣本 ,其中 為長度是 的輸入序列, 是長度為 的標簽序列。即在每個時刻 ,都有一個監督信息 ,我們定義時刻 的損失函數為:
其中 為第 時刻的輸出, 為可微分的損失函數,比如交叉熵。那麼整個序列上損失函數為:
整個序列的損失函數 關於參數 的梯度為:
即每個時刻損失 對參數 的偏導數之和。
循環神經網路中存在一個遞歸調用的函數 ,因此其計算參數梯度的方式和前饋神經網路不太相同。在循環神經網路中主要有兩種計算梯度的方式: 隨時間反向傳播(BPTT)和實時循環學習(RTRL)演算法。
隨時間反向傳播(Backpropagation Through Time,BPTT) 演算法的主要思想是通過類似前饋神經網路的錯誤反向傳播演算法來進行計算梯度。
BPTT演算法將循環神經網路看作是一個展開的多層前饋網路,其中「每一層」對應循環網路中的「每個時刻」。在「展開」的前饋網路中,所有層的參數是共享的,因此參數的真實梯度是將所有「展開層」的參數梯度之和 。
因為參數 和隱藏層在每個時刻 的凈輸入 有關,因此第 時刻的損失函數 關於參數 的梯度為:
其中 表示「直接」偏導數,即公式 中保持 不變,對 求偏導數,得到:
其中 為第 時刻隱狀態的第 維; 除了第 個值為 外,其餘都為 的行向量。
定義誤差項 為第 時刻的損失對第 時刻隱藏神經層的凈輸入 的導數,則:
從而:
寫成矩陣形式為:
由此得到整個序列的損失函數 關於參數 的梯度:
同理可得, 關於權重 和偏置 的梯度為:
在BPTT演算法中,參數的梯度需要在一個完整的「前向」計算和「反向」計算後才能得到並進行參數更新。如下圖所示。
與反向傳播的BPTT演算法不同的是,實時循環學習(Real-Time Recurrent Learning)是通過前向傳播的方式來計算梯度。
假設循環神經網路中第 時刻的狀態 為:
其關於參數 的偏導數為:
RTRL演算法從第1 個時刻開始,除了計算循環神經網路的隱狀態之外,還依次前向計算偏導數 。
兩種學習演算法比較:
RTRL演算法和BPTT演算法都是基於梯度下降的演算法,分別通過前向模式和反向模式應用鏈式法則來計算梯度。 在循環神經網路中,一般網路輸出維度遠低於輸入維度,因此BPTT演算法的計算量會更小,但BPTT演算法需要保存所有時刻的中間梯度,空間復雜度較高。RTRL演算法不需要梯度回傳,因此非常適合於需要在線學習或無限序列的任務中 。
循環神經網路在學習過程中的主要問題是由於 梯度消失或爆炸問題 ,很難建模長時間間隔(Long Range)的狀態之間的依賴關系。
在BPTT演算法中,我們有:
如果定義 ,則:
若 ,當 時, ,會造成系統不穩定,稱為梯度爆炸問題;相反,若 ,當 時, ,會出現和深度前饋神經網路類似的梯度消失問題。
雖然簡單循環網路理論上可以建立長時間間隔的狀態之間的依賴關系,但是由於梯度爆炸或消失問題,實際上只能學習到短期的依賴關系。這樣,如果t時刻的輸出 依賴於 時刻的輸入 ,當間隔 比較大時,簡單神經網路很難建模這種長距離的依賴關系,稱為 長程依賴問題(Long-Term dependencies Problem) 。
一般而言,循環網路的梯度爆炸問題比較容易解決,一般 通過權重衰減或梯度截斷來避免。 權重衰減是通過給參數增加 或 范數的正則化項來限制參數的取值范圍,從而使得 。梯度截斷是另一種有效的啟發式方法,當梯度的模大於一定閾值時,就將它截斷成為一個較小的數。
梯度消失是循環網路的主要問題。除了使用一些優化技巧外,更有效的方式就是改變模型,比如讓 ,同時使用 ,即:
其中 是一個非線性函數, 為參數。
上式中, 和 之間為線性依賴關系,且權重系數為1,這樣就不存在梯度爆炸或消失問題。但是,這種改變也丟失了神經元在反饋邊上的非線性激活的性質,因此也降低了模型的表示能力。
為了避免這個缺點,我們可以採用一種更加有效的改進策略:
這樣 和 之間為既有線性關系,也有非線性關系,並且可以緩解梯度消失問題。但這種改進依然存在兩個問題:
為了解決這兩個問題,可以通過引入 門控機制 來進一步改進模型。
為了改善循環神經網路的長程依賴問題,一種非常好的解決方案是引入門控機制來控制信息的累積速度,包括 有選擇地加入新的信息,並有選擇地遺忘之前累積的信息 。這一類網路可以稱為基於門控的循環神經網路(Gated RNN)。本節中,主要介紹兩種基於門控的循環神經網路: 長短期記憶網路和門控循環單元網路。
長短期記憶(Long Short-Term Memory,LSTM)網路 是循環神經網路的一個變體,可以有效地解決簡單循環神經網路的梯度爆炸或消失問題。
在 基礎上,LSTM網路主要改進在以下兩個方面:
其中 和 三個門(gate)來控制信息傳遞的路徑; 為向量元素乘積; 為上一時刻的記憶單元; 是通過非線性函數得到的候選狀態:
在每個時刻 ,LSTM網路的內部狀態 記錄了到當前時刻為止的歷史信息。
在數字電路中,門(Gate)為一個二值變數{0, 1},0代表關閉狀態,不許任何信息通過;1代表開放狀態,允許所有信息通過。LSTM網路中的「門」是一種「軟」門,取值在(0, 1) 之間,表示 以一定的比例運行信息通過 。LSTM網路中三個門的作用為:
(1)遺忘門 控制上一個時刻的內部狀態 需要遺忘多少信息。
(2)輸入門 控制當前時刻的候選狀態 有多少信息需要保存。
(3)輸出門
B. BP神經網路中的激勵函數除了S型函數,還有什麼函數
一般來說,神經網路的激勵函數有以下幾種:階躍函數 ,准線性函數,雙曲正切函數,Sigmoid函數等等,其中sigmoid函數就是你所說的S型函數。以我看來,在你訓練神經網路時,激勵函數是不輕易換的,通常設置為S型函數。如果你的神經網路訓練效果不好,應從你所選擇的演算法上和你的數據上找原因。演算法上BP神經網路主要有自適應學習速率動量梯度下降反向傳播演算法(traingdx),Levenberg-Marquardt反向傳播演算法(trainlm)等等,我列出的這兩種是最常用的,其中BP默認的是後一種。數據上,看看是不是有誤差數據,如果有及其剔除,否則也會影響預測或識別的效果。
C. 神經網路模型-27種神經網路模型們的簡介
【1】Perceptron(P) 感知機
【1】感知機
感知機是我們知道的最簡單和最古老的神經元模型,它接收一些輸入,然後把它們加總,通過激活函數並傳遞到輸出層。
【2】Feed Forward(FF)前饋神經網路
【2】前饋神經網路
前饋神經網路(FF),這也是一個很古老的方法——這種方法起源於50年代。它的工作原理通常遵循以下規則:
1.所有節點都完全連接
2.激活從輸入層流向輸出,無回環
3.輸入和輸出之間有一層(隱含層)
在大多數情況下,這種類型的網路使用反向傳播方法進行訓練。
【3】Radial Basis Network(RBF) RBF神經網路
【3】RBF神經網路
RBF 神經網路實際上是 激活函數是徑向基函數 而非邏輯函數的FF前饋神經網路(FF)。兩者之間有什麼區別呢?
邏輯函數--- 將某個任意值映射到[0 ,... 1]范圍內來,回答「是或否」問題。適用於分類決策系統,但不適用於連續變數。
相反, 徑向基函數--- 能顯示「我們距離目標有多遠」。 這完美適用於函數逼近和機器控制(例如作為PID控制器的替代)。
簡而言之,RBF神經網路其實就是, 具有不同激活函數和應用方向的前饋網路 。
【4】Deep Feed Forword(DFF)深度前饋神經網路
【4】DFF深度前饋神經網路
DFF深度前饋神經網路在90年代初期開啟了深度學習的潘多拉盒子。 這些依然是前饋神經網路,但有不止一個隱含層 。那麼,它到底有什麼特殊性?
在訓練傳統的前饋神經網路時,我們只向上一層傳遞了少量的誤差信息。由於堆疊更多的層次導致訓練時間的指數增長,使得深度前饋神經網路非常不實用。 直到00年代初,我們開發了一系列有效的訓練深度前饋神經網路的方法; 現在它們構成了現代機器學習系統的核心 ,能實現前饋神經網路的功能,但效果遠高於此。
【5】Recurrent Neural Network(RNN) 遞歸神經網路
【5】RNN遞歸神經網路
RNN遞歸神經網路引入不同類型的神經元——遞歸神經元。這種類型的第一個網路被稱為約旦網路(Jordan Network),在網路中每個隱含神經元會收到它自己的在固定延遲(一次或多次迭代)後的輸出。除此之外,它與普通的模糊神經網路非常相似。
當然,它有許多變化 — 如傳遞狀態到輸入節點,可變延遲等,但主要思想保持不變。這種類型的神經網路主要被使用在上下文很重要的時候——即過去的迭代結果和樣本產生的決策會對當前產生影響。最常見的上下文的例子是文本——一個單詞只能在前面的單詞或句子的上下文中進行分析。
【6】Long/Short Term Memory (LSTM) 長短時記憶網路
【6】LSTM長短時記憶網路
LSTM長短時記憶網路引入了一個存儲單元,一個特殊的單元,當數據有時間間隔(或滯後)時可以處理數據。遞歸神經網路可以通過「記住」前十個詞來處理文本,LSTM長短時記憶網路可以通過「記住」許多幀之前發生的事情處理視頻幀。 LSTM網路也廣泛用於寫作和語音識別。
存儲單元實際上由一些元素組成,稱為門,它們是遞歸性的,並控制信息如何被記住和遺忘。
【7】Gated Recurrent Unit (GRU)
【7】GRU是具有不同門的LSTM
GRU是具有不同門的LSTM。
聽起來很簡單,但缺少輸出門可以更容易基於具體輸入重復多次相同的輸出,目前此模型在聲音(音樂)和語音合成中使用得最多。
實際上的組合雖然有點不同:但是所有的LSTM門都被組合成所謂的更新門(Update Gate),並且復位門(Reset Gate)與輸入密切相關。
它們比LSTM消耗資源少,但幾乎有相同的效果。
【8】Auto Encoder (AE) 自動編碼器
【8】AE自動編碼器
Autoencoders自動編碼器用於分類,聚類和特徵壓縮。
當您訓練前饋(FF)神經網路進行分類時,您主要必須在Y類別中提供X個示例,並且期望Y個輸出單元格中的一個被激活。 這被稱為「監督學習」。
另一方面,自動編碼器可以在沒有監督的情況下進行訓練。它們的結構 - 當隱藏單元數量小於輸入單元數量(並且輸出單元數量等於輸入單元數)時,並且當自動編碼器被訓練時輸出盡可能接近輸入的方式,強制自動編碼器泛化數據並搜索常見模式。
【9】Variational AE (VAE) 變分自編碼器
【9】VAE變分自編碼器
變分自編碼器,與一般自編碼器相比,它壓縮的是概率,而不是特徵。
盡管如此簡單的改變,但是一般自編碼器只能回答當「我們如何歸納數據?」的問題時,變分自編碼器回答了「兩件事情之間的聯系有多強大?我們應該在兩件事情之間分配誤差還是它們完全獨立的?」的問題。
【10】Denoising AE (DAE) 降噪自動編碼器
【10】DAE降噪自動編碼器
雖然自動編碼器很酷,但它們有時找不到最魯棒的特徵,而只是適應輸入數據(實際上是過擬合的一個例子)。
降噪自動編碼器(DAE)在輸入單元上增加了一些雜訊 - 通過隨機位來改變數據,隨機切換輸入中的位,等等。通過這樣做,一個強制降噪自動編碼器從一個有點嘈雜的輸入重構輸出,使其更加通用,強制選擇更常見的特徵。
【11】Sparse AE (SAE) 稀疏自編碼器
【11】SAE稀疏自編碼器
稀疏自編碼器(SAE)是另外一個有時候可以抽離出數據中一些隱藏分組樣試的自動編碼的形式。結構和AE是一樣的,但隱藏單元的數量大於輸入或輸出單元的數量。
【12】Markov Chain (MC) 馬爾科夫鏈
【12】Markov Chain (MC) 馬爾科夫鏈
馬爾可夫鏈(Markov Chain, MC)是一個比較老的圖表概念了,它的每一個端點都存在一種可能性。過去,我們用它來搭建像「在單詞hello之後有0.0053%的概率會出現dear,有0.03551%的概率出現you」這樣的文本結構。
這些馬爾科夫鏈並不是典型的神經網路,它可以被用作基於概率的分類(像貝葉斯過濾),用於聚類(對某些類別而言),也被用作有限狀態機。
【13】Hopfield Network (HN) 霍普菲爾網路
【13】HN霍普菲爾網路
霍普菲爾網路(HN)對一套有限的樣本進行訓練,所以它們用相同的樣本對已知樣本作出反應。
在訓練前,每一個樣本都作為輸入樣本,在訓練之中作為隱藏樣本,使用過之後被用作輸出樣本。
在HN試著重構受訓樣本的時候,他們可以用於給輸入值降噪和修復輸入。如果給出一半圖片或數列用來學習,它們可以反饋全部樣本。
【14】Boltzmann Machine (BM) 波爾滋曼機
【14】 BM 波爾滋曼機
波爾滋曼機(BM)和HN非常相像,有些單元被標記為輸入同時也是隱藏單元。在隱藏單元更新其狀態時,輸入單元就變成了輸出單元。(在訓練時,BM和HN一個一個的更新單元,而非並行)。
這是第一個成功保留模擬退火方法的網路拓撲。
多層疊的波爾滋曼機可以用於所謂的深度信念網路,深度信念網路可以用作特徵檢測和抽取。
【15】Restricted BM (RBM) 限制型波爾滋曼機
【15】 RBM 限制型波爾滋曼機
在結構上,限制型波爾滋曼機(RBM)和BM很相似,但由於受限RBM被允許像FF一樣用反向傳播來訓練(唯一的不同的是在反向傳播經過數據之前RBM會經過一次輸入層)。
【16】Deep Belief Network (DBN) 深度信念網路
【16】DBN 深度信念網路
像之前提到的那樣,深度信念網路(DBN)實際上是許多波爾滋曼機(被VAE包圍)。他們能被連在一起(在一個神經網路訓練另一個的時候),並且可以用已經學習過的樣式來生成數據。
【17】Deep Convolutional Network (DCN) 深度卷積網路
【17】 DCN 深度卷積網路
當今,深度卷積網路(DCN)是人工神經網路之星。它具有卷積單元(或者池化層)和內核,每一種都用以不同目的。
卷積核事實上用來處理輸入的數據,池化層是用來簡化它們(大多數情況是用非線性方程,比如max),來減少不必要的特徵。
他們通常被用來做圖像識別,它們在圖片的一小部分上運行(大約20x20像素)。輸入窗口一個像素一個像素的沿著圖像滑動。然後數據流向卷積層,卷積層形成一個漏斗(壓縮被識別的特徵)。從圖像識別來講,第一層識別梯度,第二層識別線,第三層識別形狀,以此類推,直到特定的物體那一級。DFF通常被接在卷積層的末端方便未來的數據處理。
【18】Deconvolutional Network (DN) 去卷積網路
【18】 DN 去卷積網路
去卷積網路(DN)是將DCN顛倒過來。DN能在獲取貓的圖片之後生成像(狗:0,蜥蜴:0,馬:0,貓:1)一樣的向量。DNC能在得到這個向量之後,能畫出一隻貓。
【19】Deep Convolutional Inverse Graphics Network (DCIGN) 深度卷積反轉圖像網路
【19】 DCIGN 深度卷積反轉圖像網路
深度卷積反轉圖像網路(DCIGN),長得像DCN和DN粘在一起,但也不完全是這樣。
事實上,它是一個自動編碼器,DCN和DN並不是作為兩個分開的網路,而是承載網路輸入和輸出的間隔區。大多數這種神經網路可以被用作圖像處理,並且可以處理他們以前沒有被訓練過的圖像。由於其抽象化的水平很高,這些網路可以用於將某個事物從一張圖片中移除,重畫,或者像大名鼎鼎的CycleGAN一樣將一匹馬換成一個斑馬。
【20】Generative Adversarial Network (GAN) 生成對抗網路
【20】 GAN 生成對抗網路
生成對抗網路(GAN)代表了有生成器和分辨器組成的雙網路大家族。它們一直在相互傷害——生成器試著生成一些數據,而分辨器接收樣本數據後試著分辨出哪些是樣本,哪些是生成的。只要你能夠保持兩種神經網路訓練之間的平衡,在不斷的進化中,這種神經網路可以生成實際圖像。
【21】Liquid State Machine (LSM) 液體狀態機
【21】 LSM 液體狀態機
液體狀態機(LSM)是一種稀疏的,激活函數被閾值代替了的(並不是全部相連的)神經網路。只有達到閾值的時候,單元格從連續的樣本和釋放出來的輸出中積累價值信息,並再次將內部的副本設為零。
這種想法來自於人腦,這些神經網路被廣泛的應用於計算機視覺,語音識別系統,但目前還沒有重大突破。
【22】Extreme Learning Machine (ELM) 極端學習機
【22】ELM 極端學習機
極端學習機(ELM)是通過產生稀疏的隨機連接的隱藏層來減少FF網路背後的復雜性。它們需要用到更少計算機的能量,實際的效率很大程度上取決於任務和數據。
【23】Echo State Network (ESN) 回聲狀態網路
【23】 ESN 回聲狀態網路
回聲狀態網路(ESN)是重復網路的細分種類。數據會經過輸入端,如果被監測到進行了多次迭代(請允許重復網路的特徵亂入一下),只有在隱藏層之間的權重會在此之後更新。
據我所知,除了多個理論基準之外,我不知道這種類型的有什麼實際應用。。。。。。。
【24】Deep Resial Network (DRN) 深度殘差網路
【24】 DRN 深度殘差網路
深度殘差網路(DRN)是有些輸入值的部分會傳遞到下一層。這一特點可以讓它可以做到很深的層級(達到300層),但事實上它們是一種沒有明確延時的RNN。
【25】Kohonen Network (KN) Kohonen神經網路
【25】 Kohonen神經網路
Kohonen神經網路(KN)引入了「單元格距離」的特徵。大多數情況下用於分類,這種網路試著調整它們的單元格使其對某種特定的輸入作出最可能的反應。當一些單元格更新了, 離他們最近的單元格也會更新。
像SVM一樣,這些網路總被認為不是「真正」的神經網路。
【26】Support Vector Machine (SVM)
【26】 SVM 支持向量機
支持向量機(SVM)用於二元分類工作,無論這個網路處理多少維度或輸入,結果都會是「是」或「否」。
SVM不是所有情況下都被叫做神經網路。
【27】Neural Turing Machine (NTM) 神經圖靈機
【27】NTM 神經圖靈機
神經網路像是黑箱——我們可以訓練它們,得到結果,增強它們,但實際的決定路徑大多數我們都是不可見的。
神經圖靈機(NTM)就是在嘗試解決這個問題——它是一個提取出記憶單元之後的FF。一些作者也說它是一個抽象版的LSTM。
記憶是被內容編址的,這個網路可以基於現狀讀取記憶,編寫記憶,也代表了圖靈完備神經網路。
D. 循環神經網路
為什麼卷積神經網路不會出現嚴重的數值問題呢?
卷積神經網路中每一層的權重矩陣 W 是不同的,並且在初始化時它們是獨立同分布的,因此可以相互抵消,在多層之後一般不會出現嚴重的數值問題。
循環神經網路採用 ReLu 激活函數,只有當 W 的取值在單位矩陣附近時才能取得比較好的效果,因此需要將 W 初始化為單位矩陣。
Seq2Seq 模型最基礎的解碼方法是貪心法,即選取一種度量標准後,每次都在當前狀態下選擇最佳的一個結果,直到結束。貪心法的計算代價低,適合作為基準結果與其他方法相比較。貪心法獲得的是一個局部最優解,由於實際問題的復雜性,該方法往往不能取得最好的結果。
集束搜索: 是一種啟發式演算法,會保存 beam size 個當前的較佳選擇,然後解碼時每一步根據保存的選則進行下一步擴展和排序,接著選擇前 b 個進行保存,循環迭代,知道結束時選擇最佳的一個作為解碼的結果。 b 往往選擇一個適中的范圍,以 8-12 為佳。
Seq2Seq 模型引入注意力機制是為了解決什麼問題?為什麼選用了雙向的循環神經網路模型?
編碼時輸入序列的全部信息壓縮到了一個向量中,隨著序列增長,句子越前面的詞的信息丟失越嚴重。同時,Seq2Seq 模型的輸出序列中,常常會損失部分輸入序列信息,這是解碼時,當前詞及對應的源語言詞的上下文信息和位置信息在編解碼過程中丟失了。 引入注意力機制,解決上述問題 。使用雙向的循環神經網路進行建模,可以獲取前後文的信息。
E. MATLAB中一些函數,用於神經網路
一:minmax()
minmax(A) 即是求解A矩陣中每個 行向量 中的最小值和最大值
eg:A=[1 2 4 -6 ;
3 -4 90 6;
4 6 -23 -35];
P=minmax(A)
P = -6 4
-4 90
-35 6
二:hold on 和hold off
hold on 是當前軸及圖像保持而不被刷新,准備接受此後將繪制的圖形,多圖共存.即,啟動圖形保持功能,當前坐標軸和圖形都將保持,從此繪制的圖形都將添加在這個圖形的基礎上,並自動調整坐標軸的范圍。
hold off 使當前軸及圖像不再具備被刷新的性質,新圖出現時,取消原圖。即,關閉圖形保持功能。
hold on 和hold off,是相對使用的
前者的意思是,你在當前圖的軸(坐標系)中畫了一幅圖,再畫另一幅圖時,原來的圖還在,與新圖共存,都看得到
後者表達的是,你在當前圖的軸(坐標系)中畫了一幅圖,此時,狀態是hold off,則再畫另一幅圖時,原來的圖就看不到了,在軸上繪制的是新圖,原圖被替換了。
三:rand 和 randn
rand是0-1的均勻分布,randn是均值為0方差為1的正態分布;
rand(n)或randn(n)生成n*n的隨機數矩陣。
rand(n,m)或randn(m,n)生成m*n的隨機數矩陣。
四:gac、gca 和 gco
gcf 返回當前Figure對象的句柄值
gca 返回當前axes對象的句柄值
gco 返回當前滑鼠單擊的句柄值,該對象可以是除root對象外的任意圖形對象,並且Matlab會把當前圖形對象的句柄值存放在Figure的CurrentObject屬性中。
五:compet
compet是神經網路的競爭傳遞函數,用於指出矩陣中每列的最大值。對應最大值的行的值為1,其他行的值都為0。
六:bar和barn
二維條形圖:bar()
bar(Y) 如果Y為矢量,其每一個元素繪制一個條形;如果Y為矩陣,側bar函數對每一行元素繪制的條形進行分組。
bar(x,Y) 按x中指定的位置繪制Y中每一元素的條形。
bar(…,width) 設置相鄰條形的寬度並控制組內條形的分離,默認值為0.8,如果指定width=1,則組內的條形挨在一起。
bar(…,』style』) 指定繪制條形的類型,style有兩個選項:(1) stacked 矩陣Y中每一行繪制一個條形,條形的高度為行元素中元素的和,每一個條形都用多種顏色表示,顏色對應不同種類的元素並表示每行元素對總和的相對貢獻。(2) group 繪制n條形圖組,每一個條形組中有m個垂直條形,其中n對應矩陣Y的行數,m對應列數,group為style的默認值。
bar(…,LineSpec) 用LineSpec指定的顏色繪制條形。
h=bar(…) 返回圖形句柄。
barh(…) 繪制水平條形圖。
h=barh(…) 返回水平條形圖的圖形句柄。
三維條形圖:bar3()和barah()
bar3(Y) 繪制三維條形圖,如果Y為矢量,其每一個元素繪制一個條形;如果Y為矩陣,側bar函數對每一行元素繪制的條形進行分組。
bar3(x,Y) 按x中指定的位置繪制Y中每一元素的條形。
bar3(…,width) 設置相鄰條形的寬度並控制組內條形的分離,默認值為0.8,如果指定width=1,則組內的條形挨在一起。
bar3(…,』style』) 指定繪制條形的類型,style有3個選項:(1) stacked 矩陣Y中每一行繪制一個條形,條形的高度為行元素中元素的和,每一個條形都用多種顏色表示,顏色對應不同種類的元素並表示每行元素對總和的相對貢獻。(2) group 繪制n條形圖組,每一個條形組中有m個垂直條形,其中n對應矩陣Y的行數,m對應列數,group為style的默認值。(3) detached 在x方向用單獨的條形塊繪制Y中的每一行元素,detached為style的默認值;
bar3(…,LineSpec) 用LineSpec指定的顏色繪制條形。
h=bar3(…) 返回三維條形圖的圖形句柄。
barh(…) 繪制三維水平條形圖。
h=barh(…) 返回三維水平條形圖的圖形句柄。
三維條形圖有兩種顯示形式:分組形式和行列形式。
未完待續
F. 如何用PyTorch實現遞歸神經網路
從 Siri 到谷歌翻譯,深度神經網路已經在機器理解自然語言方面取得了巨大突破。這些模型大多數將語言視為單調的單詞或字元序列,並使用一種稱為循環神經網路(recurrent neural network/RNN)的模型來處理該序列。但是許多語言學家認為語言最好被理解為具有樹形結構的層次化片語,一種被稱為遞歸神經網路(recursive neural network)的深度學習模型考慮到了這種結構,這方面已經有大量的研究。雖然這些模型非常難以實現且效率很低,但是一個全新的深度學習框架 PyTorch 能使它們和其它復雜的自然語言處理模型變得更加容易。
雖然遞歸神經網路很好地顯示了 PyTorch 的靈活性,但它也廣泛支持其它的各種深度學習框架,特別的是,它能夠對計算機視覺(computer vision)計算提供強大的支撐。PyTorch 是 Facebook AI Research 和其它幾個實驗室的開發人員的成果,該框架結合了 Torch7 高效靈活的 GPU 加速後端庫與直觀的 Python 前端,它的特點是快速成形、代碼可讀和支持最廣泛的深度學習模型。
開始 SPINN
鏈接中的文章(https://github.com/jekbradbury/examples/tree/spinn/snli)詳細介紹了一個遞歸神經網路的 PyTorch 實現,它具有一個循環跟蹤器(recurrent tracker)和 TreeLSTM 節點,也稱為 SPINN——SPINN 是深度學習模型用於自然語言處理的一個例子,它很難通過許多流行的框架構建。這里的模型實現部分運用了批處理(batch),所以它可以利用 GPU 加速,使得運行速度明顯快於不使用批處理的版本。
SPINN 的意思是堆棧增強的解析器-解釋器神經網路(Stack-augmented Parser-Interpreter Neural Network),由 Bowman 等人於 2016 年作為解決自然語言推理任務的一種方法引入,該論文中使用了斯坦福大學的 SNLI 數據集。
該任務是將語句對分為三類:假設語句 1 是一幅看不見的圖像的准確標題,那麼語句 2(a)肯定(b)可能還是(c)絕對不是一個准確的標題?(這些類分別被稱為蘊含(entailment)、中立(neutral)和矛盾(contradiction))。例如,假設一句話是「兩只狗正跑過一片場地」,蘊含可能會使這個語句對變成「戶外的動物」,中立可能會使這個語句對變成「一些小狗正在跑並試圖抓住一根棍子」,矛盾能會使這個語句對變成「寵物正坐在沙發上」。
特別地,研究 SPINN 的初始目標是在確定語句的關系之前將每個句子編碼(encoding)成固定長度的向量表示(也有其它方式,例如注意模型(attention model)中將每個句子的每個部分用一種柔焦(soft focus)的方法相互比較)。
數據集是用句法解析樹(syntactic parse tree)方法由機器生成的,句法解析樹將每個句子中的單詞分組成具有獨立意義的短語和子句,每個短語由兩個詞或子短語組成。許多語言學家認為,人類通過如上面所說的樹的分層方式來組合詞意並理解語言,所以用相同的方式嘗試構建一個神經網路是值得的。下面的例子是數據集中的一個句子,其解析樹由嵌套括弧表示:
( ( The church ) ( ( has ( cracks ( in ( the ceiling ) ) ) ) . ) )
這個句子進行編碼的一種方式是使用含有解析樹的神經網路構建一個神經網路層 Rece,這個神經網路層能夠組合詞語對(用詞嵌入(word embedding)表示,如 GloVe)、 和/或短語,然後遞歸地應用此層(函數),將最後一個 Rece 產生的結果作為句子的編碼:
X = Rece(「the」, 「ceiling」)
Y = Rece(「in」, X)
... etc.
但是,如果我希望網路以更類似人類的方式工作,從左到右閱讀並保留句子的語境,同時仍然使用解析樹組合短語?或者,如果我想訓練一個網路來構建自己的解析樹,讓解析樹根據它看到的單詞讀取句子?這是一個同樣的但方式略有不同的解析樹的寫法:
The church ) has cracks in the ceiling ) ) ) ) . ) )
或者用第 3 種方式表示,如下:
WORDS: The church has cracks in the ceiling .
PARSES: S S R S S S S S R R R R S R R
我所做的只是刪除開括弧,然後用「S」標記「shift」,並用「R」替換閉括弧用於「rece」。但是現在可以從左到右讀取信息作為一組指令來操作一個堆棧(stack)和一個類似堆棧的緩沖區(buffer),能得到與上述遞歸方法完全相同的結果:
1. 將單詞放入緩沖區。
2. 從緩沖區的前部彈出「The」,將其推送(push)到堆棧上層,緊接著是「church」。
3. 彈出前 2 個堆棧值,應用於 Rece,然後將結果推送回堆棧。
4. 從緩沖區彈出「has」,然後推送到堆棧,然後是「cracks」,然後是「in」,然後是「the」,然後是「ceiling」。
5. 重復四次:彈出 2 個堆棧值,應用於 Rece,然後推送結果。
6. 從緩沖區彈出「.」,然後推送到堆棧上層。
7. 重復兩次:彈出 2 個堆棧值,應用於 Rece,然後推送結果。
8. 彈出剩餘的堆棧值,並將其作為句子編碼返回。
我還想保留句子的語境,以便在對句子的後半部分應用 Rece 層時考慮系統已經讀取的句子部分的信息。所以我將用一個三參數函數替換雙參數的 Rece 函數,該函數的輸入值為一個左子句、一個右子句和當前句的上下文狀態。該狀態由神經網路的第二層(稱為循環跟蹤器(Tracker)的單元)創建。Tracker 在給定當前句子上下文狀態、緩沖區中的頂部條目 b 和堆棧中前兩個條目 s1\s2 時,在堆棧操作的每個步驟(即,讀取每個單詞或閉括弧)後生成一個新狀態:
context[t+1] = Tracker(context[t], b, s1, s2)
容易設想用你最喜歡的編程語言來編寫代碼做這些事情。對於要處理的每個句子,它將從緩沖區載入下一個單詞,運行跟蹤器,檢查是否將單詞推送入堆棧或執行 Rece 函數,執行該操作;然後重復,直到對整個句子完成處理。通過對單個句子的應用,該過程構成了一個大而復雜的深度神經網路,通過堆棧操作的方式一遍又一遍地應用它的兩個可訓練層。但是,如果你熟悉 TensorFlow 或 Theano 等傳統的深度學習框架,就知道它們很難實現這樣的動態過程。你值得花點時間回顧一下,探索為什麼 PyTorch 能有所不同。
圖論
圖 1:一個函數的圖結構表示
深度神經網路本質上是有大量參數的復雜函數。深度學習的目的是通過計算以損失函數(loss)度量的偏導數(梯度)來優化這些參數。如果函數表示為計算圖結構(圖 1),則向後遍歷該圖可實現這些梯度的計算,而無需冗餘工作。每個現代深度學習框架都是基於此反向傳播(backpropagation)的概念,因此每個框架都需要一個表示計算圖的方式。
在許多流行的框架中,包括 TensorFlow、Theano 和 Keras 以及 Torch7 的 nngraph 庫,計算圖是一個提前構建的靜態對象。該圖是用像數學表達式的代碼定義的,但其變數實際上是尚未保存任何數值的佔位符(placeholder)。圖中的佔位符變數被編譯進函數,然後可以在訓練集的批處理上重復運行該函數來產生輸出和梯度值。
這種靜態計算圖(static computation graph)方法對於固定結構的卷積神經網路效果很好。但是在許多其它應用中,有用的做法是令神經網路的圖結構根據數據而有所不同。在自然語言處理中,研究人員通常希望通過每個時間步驟中輸入的單詞來展開(確定)循環神經網路。上述 SPINN 模型中的堆棧操作很大程度上依賴於控制流程(如 for 和 if 語句)來定義特定句子的計算圖結構。在更復雜的情況下,你可能需要構建結構依賴於模型自身的子網路輸出的模型。
這些想法中的一些(雖然不是全部)可以被生搬硬套到靜態圖系統中,但幾乎總是以降低透明度和增加代碼的困惑度為代價。該框架必須在其計算圖中添加特殊的節點,這些節點代表如循環和條件的編程原語(programming primitive),而用戶必須學習和使用這些節點,而不僅僅是編程代碼語言中的 for 和 if 語句。這是因為程序員使用的任何控制流程語句將僅運行一次,當構建圖時程序員需要硬編碼(hard coding)單個計算路徑。
例如,通過詞向量(從初始狀態 h0 開始)運行循環神經網路單元(rnn_unit)需要 TensorFlow 中的特殊控制流節點 tf.while_loop。需要一個額外的特殊節點來獲取運行時的詞長度,因為在運行代碼時它只是一個佔位符。
# TensorFlow
# (this code runs once, ring model initialization)
# 「words」 is not a real list (it』s a placeholder variable) so
# I can』t use 「len」
cond = lambda i, h: i < tf.shape(words)[0]
cell = lambda i, h: rnn_unit(words[i], h)
i = 0
_, h = tf.while_loop(cond, cell, (i, h0))
基於動態計算圖(dynamic computation graph)的方法與之前的方法有根本性不同,它有幾十年的學術研究歷史,其中包括了哈佛的 Kayak、自動微分庫(autograd)以及以研究為中心的框架 Chainer和 DyNet。在這樣的框架(也稱為運行時定義(define-by-run))中,計算圖在運行時被建立和重建,使用相同的代碼為前向通過(forward pass)執行計算,同時也為反向傳播(backpropagation)建立所需的數據結構。這種方法能產生更直接的代碼,因為控制流程的編寫可以使用標準的 for 和 if。它還使調試更容易,因為運行時斷點(run-time breakpoint)或堆棧跟蹤(stack trace)將追蹤到實際編寫的代碼,而不是執行引擎中的編譯函數。可以在動態框架中使用簡單的 Python 的 for 循環來實現有相同變數長度的循環神經網路。
# PyTorch (also works in Chainer)
# (this code runs on every forward pass of the model)
# 「words」 is a Python list with actual values in it
h = h0
for word in words:
h = rnn_unit(word, h)
PyTorch 是第一個 define-by-run 的深度學習框架,它與靜態圖框架(如 TensorFlow)的功能和性能相匹配,使其能很好地適合從標准卷積神經網路(convolutional network)到最瘋狂的強化學習(reinforcement learning)等思想。所以讓我們來看看 SPINN 的實現。
代碼
在開始構建網路之前,我需要設置一個數據載入器(data loader)。通過深度學習,模型可以通過數據樣本的批處理進行操作,通過並行化(parallelism)加快訓練,並在每一步都有一個更平滑的梯度變化。我想在這里可以做到這一點(稍後我將解釋上述堆棧操作過程如何進行批處理)。以下 Python 代碼使用內置於 PyTorch 的文本庫的系統來載入數據,它可以通過連接相似長度的數據樣本自動生成批處理。運行此代碼之後,train_iter、dev_iter 和 test_itercontain 循環遍歷訓練集、驗證集和測試集分塊 SNLI 的批處理。
from torchtext import data, datasets
TEXT = datasets.snli.ParsedTextField(lower=True)
TRANSITIONS = datasets.snli.ShiftReceField()
LABELS = data.Field(sequential=False)train, dev, test = datasets.SNLI.splits(
TEXT, TRANSITIONS, LABELS, wv_type='glove.42B')TEXT.build_vocab(train, dev, test)
train_iter, dev_iter, test_iter = data.BucketIterator.splits(
(train, dev, test), batch_size=64)
你可以在 train.py中找到設置訓練循環和准確性(accuracy)測量的其餘代碼。讓我們繼續。如上所述,SPINN 編碼器包含參數化的 Rece 層和可選的循環跟蹤器來跟蹤句子上下文,以便在每次網路讀取單詞或應用 Rece 時更新隱藏狀態;以下代碼代表的是,創建一個 SPINN 只是意味著創建這兩個子模塊(我們將很快看到它們的代碼),並將它們放在一個容器中以供稍後使用。
import torchfrom torch import nn
# subclass the Mole class from PyTorch』s neural network package
class SPINN(nn.Mole):
def __init__(self, config):
super(SPINN, self).__init__()
self.config = config self.rece = Rece(config.d_hidden, config.d_tracker)
if config.d_tracker is not None:
self.tracker = Tracker(config.d_hidden, config.d_tracker)
當創建模型時,SPINN.__init__ 被調用了一次;它分配和初始化參數,但不執行任何神經網路操作或構建任何類型的計算圖。在每個新的批處理數據上運行的代碼由 SPINN.forward 方法定義,它是用戶實現的方法中用於定義模型向前過程的標准 PyTorch 名稱。上面描述的是堆棧操作演算法的一個有效實現,即在一般 Python 中,在一批緩沖區和堆棧上運行,每一個例子都對應一個緩沖區和堆棧。我使用轉移矩陣(transition)包含的「shift」和「rece」操作集合進行迭代,運行 Tracker(如果存在),並遍歷批處理中的每個樣本來應用「shift」操作(如果請求),或將其添加到需要「rece」操作的樣本列表中。然後在該列表中的所有樣本上運行 Rece 層,並將結果推送回到它們各自的堆棧。
def forward(self, buffers, transitions):
# The input comes in as a single tensor of word embeddings;
# I need it to be a list of stacks, one for each example in
# the batch, that we can pop from independently. The words in
# each example have already been reversed, so that they can
# be read from left to right by popping from the end of each
# list; they have also been prefixed with a null value.
buffers = [list(torch.split(b.squeeze(1), 1, 0))
for b in torch.split(buffers, 1, 1)]
# we also need two null values at the bottom of each stack,
# so we can from the nulls in the input; these nulls
# are all needed so that the tracker can run even if the
# buffer or stack is empty
stacks = [[buf[0], buf[0]] for buf in buffers]
if hasattr(self, 'tracker'):
self.tracker.reset_state()
for trans_batch in transitions:
if hasattr(self, 'tracker'):
# I described the Tracker earlier as taking 4
# arguments (context_t, b, s1, s2), but here I
# provide the stack contents as a single argument
# while storing the context inside the Tracker
# object itself.
tracker_states, _ = self.tracker(buffers, stacks)
else:
tracker_states = itertools.repeat(None)
lefts, rights, trackings = [], [], []
batch = zip(trans_batch, buffers, stacks, tracker_states)
for transition, buf, stack, tracking in batch:
if transition == SHIFT:
stack.append(buf.pop())
elif transition == REDUCE:
rights.append(stack.pop())
lefts.append(stack.pop())
trackings.append(tracking)
if rights:
reced = iter(self.rece(lefts, rights, trackings))
for transition, stack in zip(trans_batch, stacks):
if transition == REDUCE:
stack.append(next(reced))
return [stack.pop() for stack in stacks]
在調用 self.tracker 或 self.rece 時分別運行 Tracker 或 Rece 子模塊的向前方法,該方法需要在樣本列表上應用前向操作。在主函數的向前方法中,在不同的樣本上進行獨立的操作是有意義的,即為批處理中每個樣本提供分離的緩沖區和堆棧,因為所有受益於批處理執行的重度使用數學和需要 GPU 加速的操作都在 Tracker 和 Rece 中進行。為了更干凈地編寫這些函數,我將使用一些 helper(稍後將定義)將這些樣本列表轉化成批處理張量(tensor),反之亦然。
我希望 Rece 模塊自動批處理其參數以加速計算,然後解批處理(unbatch)它們,以便可以單獨推送和彈出。用於將每對左、右子短語表達組合成父短語(parent phrase)的實際組合函數是 TreeLSTM,它是普通循環神經網路單元 LSTM 的變型。該組合函數要求每個子短語的狀態實際上由兩個張量組成,一個隱藏狀態 h 和一個存儲單元(memory cell)狀態 c,而函數是使用在子短語的隱藏狀態操作的兩個線性層(nn.Linear)和將線性層的結果與子短語的存儲單元狀態相結合的非線性組合函數 tree_lstm。在 SPINN 中,這種方式通過添加在 Tracker 的隱藏狀態下運行的第 3 個線性層進行擴展。
圖 2:TreeLSTM 組合函數增加了第 3 個輸入(x,在這種情況下為 Tracker 狀態)。在下面所示的 PyTorch 實現中,5 組的三種線性變換(由藍色、黑色和紅色箭頭的三元組表示)組合為三個 nn.Linear 模塊,而 tree_lstm 函數執行位於框內的所有計算。圖來自 Chen et al. (2016)。
G. 一文看懂四種基本的神經網路架構
原文鏈接:
http://blackblog.tech/2018/02/23/Eight-Neural-Network/
更多干貨就在我的個人博客 http://blackblog.tech 歡迎關注
剛剛入門神經網路,往往會對眾多的神經網路架構感到困惑,神經網路看起來復雜多樣,但是這么多架構無非也就是三類,前饋神經網路,循環網路,對稱連接網路,本文將介紹四種常見的神經網路,分別是CNN,RNN,DBN,GAN。通過這四種基本的神經網路架構,我們來對神經網路進行一定的了解。
神經網路是機器學習中的一種模型,是一種模仿動物神經網路行為特徵,進行分布式並行信息處理的演算法數學模型。這種網路依靠系統的復雜程度,通過調整內部大量節點之間相互連接的關系,從而達到處理信息的目的。
一般來說,神經網路的架構可以分為三類:
前饋神經網路:
這是實際應用中最常見的神經網路類型。第一層是輸入,最後一層是輸出。如果有多個隱藏層,我們稱之為「深度」神經網路。他們計算出一系列改變樣本相似性的變換。各層神經元的活動是前一層活動的非線性函數。
循環網路:
循環網路在他們的連接圖中定向了循環,這意味著你可以按照箭頭回到你開始的地方。他們可以有復雜的動態,使其很難訓練。他們更具有生物真實性。
循環網路的目的使用來處理序列數據。在傳統的神經網路模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連接的,每層之間的節點是無連接的。但是這種普通的神經網路對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。
循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。
對稱連接網路:
對稱連接網路有點像循環網路,但是單元之間的連接是對稱的(它們在兩個方向上權重相同)。比起循環網路,對稱連接網路更容易分析。這個網路中有更多的限制,因為它們遵守能量函數定律。沒有隱藏單元的對稱連接網路被稱為「Hopfield 網路」。有隱藏單元的對稱連接的網路被稱為玻爾茲曼機。
其實之前的帖子講過一些關於感知機的內容,這里再復述一下。
首先還是這張圖
這是一個M-P神經元
一個神經元有n個輸入,每一個輸入對應一個權值w,神經元內會對輸入與權重做乘法後求和,求和的結果與偏置做差,最終將結果放入激活函數中,由激活函數給出最後的輸出,輸出往往是二進制的,0 狀態代表抑制,1 狀態代表激活。
可以把感知機看作是 n 維實例空間中的超平面決策面,對於超平面一側的樣本,感知器輸出 1,對於另一側的實例輸出 0,這個決策超平面方程是 w⋅x=0。 那些可以被某一個超平面分割的正反樣例集合稱為線性可分(linearly separable)樣例集合,它們就可以使用圖中的感知機表示。
與、或、非問題都是線性可分的問題,使用一個有兩輸入的感知機能容易地表示,而異或並不是一個線性可分的問題,所以使用單層感知機是不行的,這時候就要使用多層感知機來解決疑惑問題了。
如果我們要訓練一個感知機,應該怎麼辦呢?
我們會從隨機的權值開始,反復地應用這個感知機到每個訓練樣例,只要它誤分類樣例就修改感知機的權值。重復這個過程,直到感知機正確分類所有的樣例。每一步根據感知機訓練法則來修改權值,也就是修改與輸入 xi 對應的權 wi,法則如下:
這里 t 是當前訓練樣例的目標輸出,o 是感知機的輸出,η 是一個正的常數稱為學習速率。學習速率的作用是緩和每一步調整權的程度,它通常被設為一個小的數值(例如 0.1),而且有時會使其隨著權調整次數的增加而衰減。
多層感知機,或者說是多層神經網路無非就是在輸入層與輸出層之間加了多個隱藏層而已,後續的CNN,DBN等神經網路只不過是將重新設計了每一層的類型。感知機可以說是神經網路的基礎,後續更為復雜的神經網路都離不開最簡單的感知機的模型,
談到機器學習,我們往往還會跟上一個詞語,叫做模式識別,但是真實環境中的模式識別往往會出現各種問題。比如:
圖像分割:真實場景中總是摻雜著其它物體。很難判斷哪些部分屬於同一個對象。對象的某些部分可以隱藏在其他對象的後面。
物體光照:像素的強度被光照強烈影響。
圖像變形:物體可以以各種非仿射方式變形。例如,手寫也可以有一個大的圓圈或只是一個尖頭。
情景支持:物體所屬類別通常由它們的使用方式來定義。例如,椅子是為了讓人們坐在上面而設計的,因此它們具有各種各樣的物理形狀。
卷積神經網路與普通神經網路的區別在於,卷積神經網路包含了一個由卷積層和子采樣層構成的特徵抽取器。在卷積神經網路的卷積層中,一個神經元只與部分鄰層神經元連接。在CNN的一個卷積層中,通常包含若干個特徵平面(featureMap),每個特徵平面由一些矩形排列的的神經元組成,同一特徵平面的神經元共享權值,這里共享的權值就是卷積核。卷積核一般以隨機小數矩陣的形式初始化,在網路的訓練過程中卷積核將學習得到合理的權值。共享權值(卷積核)帶來的直接好處是減少網路各層之間的連接,同時又降低了過擬合的風險。子采樣也叫做池化(pooling),通常有均值子采樣(mean pooling)和最大值子采樣(max pooling)兩種形式。子采樣可以看作一種特殊的卷積過程。卷積和子采樣大大簡化了模型復雜度,減少了模型的參數。
卷積神經網路由三部分構成。第一部分是輸入層。第二部分由n個卷積層和池化層的組合組成。第三部分由一個全連結的多層感知機分類器構成。
這里舉AlexNet為例:
·輸入:224×224大小的圖片,3通道
·第一層卷積:11×11大小的卷積核96個,每個GPU上48個。
·第一層max-pooling:2×2的核。
·第二層卷積:5×5卷積核256個,每個GPU上128個。
·第二層max-pooling:2×2的核。
·第三層卷積:與上一層是全連接,3*3的卷積核384個。分到兩個GPU上個192個。
·第四層卷積:3×3的卷積核384個,兩個GPU各192個。該層與上一層連接沒有經過pooling層。
·第五層卷積:3×3的卷積核256個,兩個GPU上個128個。
·第五層max-pooling:2×2的核。
·第一層全連接:4096維,將第五層max-pooling的輸出連接成為一個一維向量,作為該層的輸入。
·第二層全連接:4096維
·Softmax層:輸出為1000,輸出的每一維都是圖片屬於該類別的概率。
卷積神經網路在模式識別領域有著重要應用,當然這里只是對卷積神經網路做了最簡單的講解,卷積神經網路中仍然有很多知識,比如局部感受野,權值共享,多卷積核等內容,後續有機會再進行講解。
傳統的神經網路對於很多問題難以處理,比如你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNN之所以稱為循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNN能夠對任何長度的序列數據進行處理。
這是一個簡單的RNN的結構,可以看到隱藏層自己是可以跟自己進行連接的。
那麼RNN為什麼隱藏層能夠看到上一刻的隱藏層的輸出呢,其實我們把這個網路展開來開就很清晰了。
從上面的公式我們可以看出,循環層和全連接層的區別就是循環層多了一個權重矩陣 W。
如果反復把式2帶入到式1,我們將得到:
在講DBN之前,我們需要對DBN的基本組成單位有一定的了解,那就是RBM,受限玻爾茲曼機。
首先什麼是玻爾茲曼機?
[圖片上傳失敗...(image-d36b31-1519636788074)]
如圖所示為一個玻爾茲曼機,其藍色節點為隱層,白色節點為輸入層。
玻爾茲曼機和遞歸神經網路相比,區別體現在以下幾點:
1、遞歸神經網路本質是學習一個函數,因此有輸入和輸出層的概念,而玻爾茲曼機的用處在於學習一組數據的「內在表示」,因此其沒有輸出層的概念。
2、遞歸神經網路各節點鏈接為有向環,而玻爾茲曼機各節點連接成無向完全圖。
而受限玻爾茲曼機是什麼呢?
最簡單的來說就是加入了限制,這個限制就是將完全圖變成了二分圖。即由一個顯層和一個隱層構成,顯層與隱層的神經元之間為雙向全連接。
h表示隱藏層,v表示顯層
在RBM中,任意兩個相連的神經元之間有一個權值w表示其連接強度,每個神經元自身有一個偏置系數b(對顯層神經元)和c(對隱層神經元)來表示其自身權重。
具體的公式推導在這里就不展示了
DBN是一個概率生成模型,與傳統的判別模型的神經網路相對,生成模型是建立一個觀察數據和標簽之間的聯合分布,對P(Observation|Label)和 P(Label|Observation)都做了評估,而判別模型僅僅而已評估了後者,也就是P(Label|Observation)。
DBN由多個限制玻爾茲曼機(Restricted Boltzmann Machines)層組成,一個典型的神經網路類型如圖所示。這些網路被「限制」為一個可視層和一個隱層,層間存在連接,但層內的單元間不存在連接。隱層單元被訓練去捕捉在可視層表現出來的高階數據的相關性。
生成對抗網路其實在之前的帖子中做過講解,這里在說明一下。
生成對抗網路的目標在於生成,我們傳統的網路結構往往都是判別模型,即判斷一個樣本的真實性。而生成模型能夠根據所提供的樣本生成類似的新樣本,注意這些樣本是由計算機學習而來的。
GAN一般由兩個網路組成,生成模型網路,判別模型網路。
生成模型 G 捕捉樣本數據的分布,用服從某一分布(均勻分布,高斯分布等)的雜訊 z 生成一個類似真實訓練數據的樣本,追求效果是越像真實樣本越好;判別模型 D 是一個二分類器,估計一個樣本來自於訓練數據(而非生成數據)的概率,如果樣本來自於真實的訓練數據,D 輸出大概率,否則,D 輸出小概率。
舉個例子:生成網路 G 好比假幣製造團伙,專門製造假幣,判別網路 D 好比警察,專門檢測使用的貨幣是真幣還是假幣,G 的目標是想方設法生成和真幣一樣的貨幣,使得 D 判別不出來,D 的目標是想方設法檢測出來 G 生成的假幣。
傳統的判別網路:
生成對抗網路:
下面展示一個cDCGAN的例子(前面帖子中寫過的)
生成網路
判別網路
最終結果,使用MNIST作為初始樣本,通過學習後生成的數字,可以看到學習的效果還是不錯的。
本文非常簡單的介紹了四種神經網路的架構,CNN,RNN,DBN,GAN。當然也僅僅是簡單的介紹,並沒有深層次講解其內涵。這四種神經網路的架構十分常見,應用也十分廣泛。當然關於神經網路的知識,不可能幾篇帖子就講解完,這里知識講解一些基礎知識,幫助大家快速入(zhuang)門(bi)。後面的帖子將對深度自動編碼器,Hopfield 網路長短期記憶網路(LSTM)進行講解。
H. 如何用PyTorch實現遞歸神經網路
如何用PyTorch實現遞歸神經網路
其實一般都叫遞歸神經網路,只是recurrent是時間遞歸(常用),而recursive是指結構遞歸神經網路
I. BP神經網路函數選擇
神經網路不同的網路有這不同的訓練函數,BP神經網路有兩種訓練函數,trainbp(),利用BP演算法訓練前向神經網路。trainbpx(),利用快速BP演算法訓練前向神經網路,即採用了動量或自適應學習,可減少訓練時間,tansig函數是神經元的傳遞函數,與訓練函數無關,在trainbp()函數中含有要訓練神經元的函數。
求採納為滿意回答。
J. rbf神經網路中的訓練函數是什麼
RBF (Radial Basis Function)可以看作是一個高維空間中的曲面擬合(逼近)問題,學習是為了在多維空間中尋找一個能夠最佳匹配訓練數據的曲面,然後來一批新的數據,用剛才訓練的那個曲面來處理(比如分類、回歸)。RBF的本質思想是反向傳播學習演算法應用遞歸技術,這種技術在統計學中被稱為隨機逼近。RBF里的basis function(徑向基函數里的基函數)就是在神經網路的隱單元里提供了提供了一個函數集,該函數集在輸入模式(向量)擴展至隱空間時,為其構建了一個任意的「基」。這個函數集中的函數就被稱為徑向基函數。
如果對於輸入空間的某個局部區域只有少數幾個連接權值影響輸出,則該網路稱為局部逼近網路。常見的局部逼近網路有RBF網路、小腦模型(CMAC)網路、B樣條網路等。
徑向基函數解決插值問題
完全內插法要求插值函數經過每個樣本點,即。樣本點總共有P個。
RBF的方法是要選擇P個基函數,每個基函數對應一個訓練數據,各基函數形式為,由於距離是徑向同性的,因此稱為徑向基函數。||X-Xp||表示差向量的模,或者叫2范數