① 如何訓練自己的神經網路權重
說的確定應該就是訓練方法吧,神經網路的權值不是人工給定的。而是用訓練集(包括輸入和輸出)訓練,用訓練集訓練一遍稱為一個epoch,一般要許多epoch才行,目的是使得目標與訓練結果的誤差(一般採用均方誤差)小到一個給定的閾值。以上所說是有監督的學習方法,還有無監督的學習方法。
② 深度前饋網路
看過西瓜書和李航的《統計學習方法》,對機器學習的基本演算法算是有了初步的理解。機器學習的演算法和思想固然重要,在實際中也有很多應用場景,但在超大數據集的表現上,深度學習才是當下效果最好的工具。可惜的是,花書這樣一本經典著作的中文版翻譯和機翻差不多水平,因此看的時候只能放慢速度。閑言少敘,下面是第六章的學習記錄。
深度前饋網路(deep feedforward network) ,也叫作前饋神經網路(feedforward neural network)或者多層感知機(multilayer perceptron, MLP),是典型的深度學習模型。 前饋網路的目標是近似某個函數 。例如,對於分類器, 將輸入 映射到一個類別 。前饋網路定義了一個映射 ,並且學習參數 的值使它能夠得到最佳的函數近似。
下面我們把「深度前饋網路」這個詞拆開來看:
那麼深度前饋網路的各層之間有什麼區別呢?從功能來講,訓練樣本直接指明了 輸出層 在每一點x上必須做什麼,它必須產生一個接近 y 的值。但訓練數據並沒有給出其它層中的所需的輸出,所以這些層被稱為 隱藏層(hidden layer) 。
一種理解前饋網路的方式是從線性模型開始,並考慮如何克服它的局限性。如果各層的函數 都是線性函數,那麼復合後的函數依然是線性的,此時我們的網路模型等價於線性模型。為了提高模型的表示能力,我們需要將各層的 設置為非線性的,從而得到一個非線性映射 。我們可以認為 提供了一組描述 的特徵,或者認為它提供了 的一個新的表示。
設計和訓練神經網路與使用梯度下降訓練其他任何機器學習模型並沒有太大不同。神經網路和線性模型等演算法的最大區別,在於神經網路的非線性導致大多數我們感興趣的代價函數都變得 非凸 。這意味著神經網路的訓練通常使用迭代的、基於梯度的優化, 僅僅使得代價函數達到一個非常小的值 ;而不是像用於訓練線性回歸模型的線性方程求解器或者用於訓練邏輯回歸或 SVM 的凸優化演算法那樣保證全局收斂。
用於非凸損失函數的隨機梯度下降沒有這種收斂性保證,並且 對參數的初始值很敏感。對於前饋神經網路,將所有的權重值初始化為小隨機數是很重要的。偏置可以初始化為零或者小的正值。
大多數現代的神經網路使用最大似然來訓練。這意味著代價函數就是負的對數似然,它與訓練數據和模型分布間的 交叉熵 等價。這個代價函數表示為
使用最大似然來導出代價函數的方法的一個優勢是,它減輕了為每個模型設計代價函數的負擔。明確一個模型 則自動地確定了一個代價函數 。
用於實現最大似然估計的交叉熵代價函數有一個不同尋常的特性,那就是當它被應用於實踐中經常遇到的模型時,它 通常沒有最小值。 如果模型可以控制輸出分布的密度(例如,通過學習高斯輸出分布的方差參數),那麼它可能對正確的訓練集輸出賦予極其高的密度,這將導致交叉熵趨向負無窮。 正則化技術提供了一些不同的方法來修正學習問題,使得模型不會通過這種方式來獲得無限制的收益。
一種簡單的輸出單元是基於仿射變換的輸出單元,仿射變換不具有非線性。這些單元往往被直接稱為 線性單元 。給定特徵 ,線性輸出層產生一個向量 ,線性輸出層經常被用來 產生條件高斯分布的均值 :
最大化其對數似然此時等價於最小化均方誤差。
許多任務需要預測二值型變數 的值。具有兩個類的分類問題可以歸結為這種形式。此時最大似然的方法是定義 在 條件下的 Bernoulli 分布。為保證模型給出了錯誤答案時,總能有一個較大的梯度。可以使用 sigmoid輸出單元 結合最大似然來實現。sigmoid 輸出單元定義為:
這種在對數空間里預測概率的方法可以很自然地使用最大似然學習。因為用於最大似然的代價函數是 ,代價函數中的 抵消了 中的 。如果沒有這個效果,sigmoid 的飽和性會阻止基於梯度的學習做出好的改進。因此, 最大似然幾乎總是訓練 輸出單元的優選方法。
當我們想要表示一個具有 n 個可能取值的離散型隨機變數的分布時,我們可以使用 函數。它可以看作是 函數的擴展。
函數最常用作分類器的輸出,來表示 個不同類上的概率分布。比較少見的是, 函數可以在模型內部使用,例如如果我們想要在某個內部變數的 個不同選項中進行選擇。 函數的形式為:
和 一樣,當使用最大化對數似然訓練 來輸出目標值 時,使用指數函數工作地非常好。
隱藏單元的設計是一個非常活躍的研究領域,並且還沒有許多明確的指導性理論原則。
整流線性單元(Rectified Linear Unit, ReLU)是隱藏單元極好的默認選擇。許多其他類型的隱藏單元也是可用的。決定何時使用哪種類型的隱藏單元是困難的事(盡管整流線性單元通常是一個可接受的選擇)。我們這里描述對於每種隱藏單元的一些基本直覺。這些直覺可以用來建議我們何時來嘗試一些單元。 通常不可能預先預測出哪種隱藏單元工作得最好。設計過程充滿了試驗和錯誤,先直覺認為某種隱藏單元可能表現良好,然後用它組成神經網路進行訓練,最後用驗證集來評估它的性能。
大多數的隱藏單元都接受輸入向量 x,計算仿射變換 ,然後使用一個逐元素的非線性函數 。大多數隱藏單元的區別僅僅在於激活函數 的形式。
整流線性單元使用激活函數:
整流線性單元通常作用於仿射變換之上:
當初始化仿射變換的參數時,可以將 b 的所有元素設置成一個小的正值,例如 0.1。這使得整流線性單元很可能初始時就對訓練集中的大多數輸入呈現激活狀態,並且允許導數通過。
整流線性單元的一個缺陷是它們不能通過基於梯度的方法學習那些使它們激活為零的樣本。整流線性單元的各種擴展保證了它們能在各個位置都接收到梯度。
整流線性單元的三個擴展基於當 時使用一個非零的斜率 :
絕對值整流(absolute value rectification) 固定 來得到: ,它用於圖像中的對象識別 (Jarrett et al., 2009a); 滲漏整流線性單元(Leaky ReLU) (Maas et al., 2013) 將 固定成一個類似 0.01 的小值; 參數化整流線性單元(parametric ReLU) 將 作為學習的參數 (He et al., 2015)。
maxout 單元(maxout unit) (Goodfellow et al., 2013a) 進一步擴展了整流線性單元。maxout單元將 劃分為每組有 個值的組,而不是使用作用於每個元素的函數 。每個maxout單元則輸出每組中的最大元素:
這里 是組 的輸入索引集 。因為激活函數中有了max操作,所以整個maxout網路也是一種非線性的變換。
maxout的擬合能力是非常強的,它可以擬合任意的的凸函數。最直觀的解釋就是任意的凸函數都可以由分段線性函數以任意精度擬合,而maxout又是取k個隱隱含層節點的最大值,這些」隱隱含層"節點也是線性的,所以在不同的取值范圍下,最大值也可以看做是分段線性的(分段的個數與k值有關)。
整流線性單元和它們的這些擴展都是基於一個原則,那就是如果它們的行為更接近線性,那麼模型更容易優化。
在引入整流線性單元之前,大多數神經網路使用 logistic sigmoid 激活函數:
或者是雙曲正切激活函數:
這些激活函數緊密相關,因為:
我們已經看過 sigmoid 單元作為輸出單元用來預測二值型變數取值為 1 的概率。與分段線性單元不同,sigmoid 單元在其大部分定義域內都飽和——當 z 取絕對值很大的正值時,它們飽和到一個高值,當 z 取絕對值很大的負值時,它們飽和到一個低值,並且僅僅當 z 接近 0 時它們才對輸入強烈敏感。sigmoid 單元的廣泛飽和性會使得基於梯度的學習變得非常困難。因為這個原因,現在不鼓勵將它們用作前饋網路中的隱藏單元。當使用一個合適的代價函數來抵消 sigmoid 的飽和性時,它們作為輸出單元可以與基於梯度的學習相兼容。
當必須要使用 sigmoid 激活函數時,雙曲正切激活函數通常要比 logistic sigmoid 函數表現更好。在 而 的意義上,它更像是單位函數。因為 tanh 在 0 附近與單位函數類似。
架構(architecture) 一詞是指網路的整體結構: 它應該具有多少單元,以及這些單元應該如何連接。
在鏈式架構中,主要的架構考慮是選擇網路的深度和每一層的寬度。我將會看到,即使只有一個隱藏層的網路也足夠適應訓練集。 更深層的網路通常能夠對每一層使用更少的單元數和更少的參數,並且經常容易泛化到測試集,但是通常也更難以優化。 對於一個具體的任務,理想的網路架構必須通過實驗,觀測在驗證集上的誤差來找到。
萬能近似定理(universal approximation theorem)
一個前饋神經網路如果具有線性輸出層和至少一層具有任何一種 『『擠壓』』 性質的激活函數(例如logistic sigmoid激活函數)的隱藏層,只要給予網路足夠數量的隱藏單元,它可以 以任意的精度來近似任何從一個有限維空間到另一個有限維空間的 Borel 可測函數 。前饋網路的導數也可以任意好地來近似函數的導數 (Hornik et al., 1990)。
萬能近似定理意味著無論我們試圖學習什麼函數,我們知道一個大的MLP一定能夠表示這個函數。
然而,我們不能保證訓練演算法能夠學得這個函數。即使 MLP能夠表示該函數,學習也可能因兩個不同的原因而失敗。 首先,用於訓練的優化演算法可能找不到用於期望函數的參數值。其次,訓練演算法可能由於過擬合而選擇了錯誤的函數。
總之,具有單層的前饋網路足以表示任何函數,但是網路層可能大得不可實現,並且可能無法正確地學習和泛化。在很多情況下,使用更深的模型能夠減少表示期望函數所需的單元的數量,並且可以減少泛化誤差。
存在一些函數族能夠在網路的深度大於某個值d時被高效地近似,而當深度被限制到小於或等於d時需要一個遠遠大於之前的模型。在很多情況下,淺層模型所需的隱藏單元的數量是n的指數級。
Montufar et al. (2014) 的主要定理指出, 具有 個輸入深度為 每個隱藏層具有 個單元的深度整流網路可以描述的線性區域的數量是 :
根據經驗,更深的模型似乎確實在廣泛的任務中泛化得更好。
目前為止,我們都將神經網路描述成層的簡單鏈式結構,主要的考慮因素是網路的深度和每層的寬度。在實踐中,神經網路顯示出相當的多樣性。
一般的,層不需要連接在鏈中,盡管這是最常見的做法。許多架構構建了一個主鏈,但隨後又添加了額外的架構特性,例如從層 i 到層 i + 2 或者更高層的 跳躍連接 。這些跳躍連接使得梯度更容易從輸出層流向更接近輸入的層。
架構設計考慮的另外一個關鍵點是如何將層與層之間連接起來。默認的神經網路層採用矩陣 W 描述的線性變換,每個輸入單元連接到每個輸出單元。許多專用網路具有較少的連接,使得輸入層中的每個單元僅連接到輸出層單元的一個小子集。這些用於 減少連接數量 的策略減少了參數的數量以及用於評估網路的計算量,但通常高度依賴於問題。
當我們使用前饋神經網路接收輸入 並產生輸出 時,信息通過網路向前流動。輸入 提供初始信息,然後傳播到每一層的隱藏單元,最終產生輸出 。這稱之為 前向傳播(forward propagation) 。在訓練過程中,前向傳播可以持續向前直到它產生一個標量代價函數 。 反向傳播(back propagation) 演算法 (Rumelhart et al., 1986c),經常簡稱為backprop,允許來自代價函數的信息通過網路向後流動,以便計算梯度。
將計算形式化為圖形的方法有很多。這里,我們使用圖中的每一個節點來表示一個變數。變數可以是標量、向量、矩陣、張量、或者甚至是另一類型的變數。為了形式化我們的圖形,我們還需引入操作(operation)這一概念。操作是指一個或多個變數的簡單函數。我們的圖形語言伴隨著一組被允許的操作。我們可以通過將多個操作復合在一起來描述更為復雜的函數。
如果變數 y 是變數 x 通過一個操作計算得到的,那麼我們畫一條從 x 到 y 的有向邊。我們有時用操作的名稱來注釋輸出的節點,當上下文很明確時,有時也會省略這個標注。計算圖的實例如下:
使用符號到符號的方法計算導數的示例如下。在這種方法中,反向傳播演算法不需要訪問任何實際的特定數值。相反,它將節點添加到計算圖中來描述如何計算這些導數。通用圖形求值引擎可以在隨後計算任何特定數值的導數。 本例從表示 的圖開始,運行反向傳播演算法,指導它構造表達式 對應的圖。
這部分花書上講了很多內容……我看得有些失去耐心……可能是講得太細致了吧……我對反向傳播演算法的認識很簡單,就是一個鏈式法則,一層一層計算梯度然後向後傳播。這里根據之前上課時候的課件內容做下簡單回顧:
總之反向傳播演算法的要點就是 以恰當的順序計算梯度,從而充分利用鏈式法則來提高計算效率 。我個人認為理解BP的最佳方式就是自己畫個圖手推一遍。
③ 入門 | 一文簡述循環神經網路
入門 | 一文簡述循環神經網路
本文簡要介紹了什麼是循環神經網路及其運行原理,並給出了一個 RNN 實現示例。
什麼是循環神經網路(RNN)?它們如何運行?可以用在哪裡呢?本文試圖回答上述這些問題,還展示了一個 RNN 實現 demo,你可以根據自己的需要進行擴展。
循環神經網路架構
基礎知識。Python、CNN 知識是必備的。了解 CNN 的相關知識,是為了與 RNN 進行對比:RNN 為什麼以及在哪些地方比 CNN 更好。
我們首先從「循環」(Recurrent)這個詞說起。為什麼將其稱為循環?循環的意思是:
經常或重復出現
將這類神經網路稱為循環神經網路是因為它對一組序列輸入重復進行同樣的操作。本文後續部分將討論這種操作的意義。
我們為什麼需要 RNN?
也許你現在想的是,已經有像卷積網路這樣表現非常出色的網路了,為什麼還需要其他類型的網路呢?有一個需要用到 RNN 的特殊例子。為了解釋 RNN,你首先需要了解序列的相關知識,我們先來講一下序列。
序列是相互依賴的(有限或無限)數據流,比如時間序列數據、信息性的字元串、對話等。在對話中,一個句子可能有一個意思,但是整體的對話可能又是完全不同的意思。股市數據這樣的時間序列數據也是,單個數據表示當前價格,但是全天的數據會有不一樣的變化,促使我們作出買進或賣出的決定。
當輸入數據具有依賴性且是序列模式時,CNN 的結果一般都不太好。CNN 的前一個輸入和下一個輸入之間沒有任何關聯。所以所有的輸出都是獨立的。CNN 接受輸入,然後基於訓練好的模型輸出。如果你運行了 100 個不同的輸入,它們中的任何一個輸出都不會受之前輸出的影響。但想一下如果是文本生成或文本翻譯呢?所有生成的單詞與之前生成的單詞都是獨立的(有些情況下與之後的單詞也是獨立的,這里暫不討論)。所以你需要有一些基於之前輸出的偏向。這就是需要 RNN 的地方。RNN 對之前發生在數據序列中的事是有一定記憶的。這有助於系統獲取上下文。理論上講,RNN 有無限的記憶,這意味著它們有無限回顧的能力。通過回顧可以了解所有之前的輸入。但從實際操作中看,它只能回顧最後幾步。
本文僅為了與人類大體相關聯,而不會做任何決定。本文只是基於之前關於該項目的知識做出了自己的判斷(我甚至尚未理解人類大腦的 0.1%)。
何時使用 RNN?
RNN 可用於許多不同的地方。下面是 RNN 應用最多的領域。
1. 語言建模和文本生成
給出一個詞語序列,試著預測下一個詞語的可能性。這在翻譯任務中是很有用的,因為最有可能的句子將是可能性最高的單片語成的句子。
2. 機器翻譯
將文本內容從一種語言翻譯成其他語言使用了一種或幾種形式的 RNN。所有日常使用的實用系統都用了某種高級版本的 RNN。
3. 語音識別
基於輸入的聲波預測語音片段,從而確定詞語。
4. 生成圖像描述
RNN 一個非常廣泛的應用是理解圖像中發生了什麼,從而做出合理的描述。這是 CNN 和 RNN 相結合的作用。CNN 做圖像分割,RNN 用分割後的數據重建描述。這種應用雖然基本,但可能性是無窮的。
5. 視頻標記
可以通過一幀一幀地標記視頻進行視頻搜索。
深入挖掘
本文按照以下主題進行。每一部分都是基於之前的部分進行的,所以不要跳著讀。
前饋網路循環網路循環神經元基於時間的反向傳播(BPTT)RNN 實現
前饋網路入門
前饋網路通過在網路的每個節點上做出的一系列操作傳遞信息。前饋網路每次通過每個層直接向後傳遞信息。這與其他循環神經網路不同。一般而言,前饋網路接受一個輸入並據此產生輸出,這也是大多數監督學習的步驟,輸出結果可能是一個分類結果。它的行為與 CNN 類似。輸出可以是以貓狗等作為標簽的類別。
前饋網路是基於一系列預先標注過的數據訓練的。訓練階段的目的是減少前饋網路猜類別時的誤差。一旦訓練完成,我們就可以用訓練後的權重對新批次的數據進行分類。
一個典型的前饋網路架構
還有一件事要注意。在前饋網路中,無論在測試階段展示給分類器的圖像是什麼,都不會改變權重,所以也不會影響第二個決策。這是前饋網路和循環網路之間一個非常大的不同。
與循環網路不同,前饋網路在測試時不會記得之前的輸入數據。它們始終是取決於時間點的。它們只會在訓練階段記得歷史輸入數據。
循環網路
也就是說,循環網路不僅將當前的輸入樣例作為網路輸入,還將它們之前感知到的一並作為輸入。
我們試著建立了一個多層感知器。從簡單的角度講,它有一個輸入層、一個具備特定激活函數的隱藏層,最終可以得到輸出。
多層感知器架構示例
如果在上述示例中的層數增加了,輸入層也接收輸入。那麼第一個隱藏層將激活傳遞到下一個隱藏層上,依此類推。最後到達輸出層。每一個隱藏層都有自己的權重和偏置項。現在問題變成了我們可以輸入到隱藏層嗎?
每一層都有自己的權重(W)、偏置項(B)和激活函數(F)。這些層的行為不同,合並它們從技術層面上講也極具挑戰性。為了合並它們,我們將所有層的權重和偏置項替換成相同的值。如下圖所示:
現在我們就可以將所有層合並在一起了。所有的隱藏層都可以結合在一個循環層中。所以看起來就像下圖:
我們在每一步都會向隱藏層提供輸入。現在一個循環神經元存儲了所有之前步的輸入,並將這些信息和當前步的輸入合並。因此,它還捕獲到一些當前數據步和之前步的相關性信息。t-1 步的決策影響到第 t 步做的決策。這很像人類在生活中做決策的方式。我們將當前數據和近期數據結合起來,幫助解決手頭的特定問題。這個例子很簡單,但從原則上講這與人類的決策能力是一致的。這讓我非常想知道我們作為人類是否真的很智能,或者說我們是否有非常高級的神經網路模型。我們做出的決策只是對生活中收集到的數據進行訓練。那麼一旦有了能夠在合理時間段內存儲和計算數據的先進模型和系統時,是否可以數字化大腦呢?所以當我們有了比大腦更好更快的模型(基於數百萬人的數據訓練出的)時,會發生什麼?
另一篇文章(https://deeplearning4j.org/lstm.html)的有趣觀點:人總是被自己的行為所困擾。
我們用一個例子來闡述上面的解釋,這個例子是預測一系列字母後的下一個字母。想像一個有 8 個字母的單詞 namaskar。
namaskar(合十禮):印度表示尊重的傳統問候或姿勢,將手掌合起置於面前或胸前鞠躬。
如果我們在向網路輸入 7 個字母後試著找出第 8 個字母,會發生什麼呢?隱藏層會經歷 8 次迭代。如果展開網路的話就是一個 8 層的網路,每一層對應一個字母。所以你可以想像一個普通的神經網路被重復了多次。展開的次數與它記得多久之前的數據是直接相關的。
循環神經網路的運作原理
循環神經元
這里我們將更深入地了解負責決策的實際神經元。以之前提到的 namaskar 為例,在給出前 7 個字母後,試著找出第 8 個字母。輸入數據的完整詞彙表是 {n,a,m,s,k,r}。在真實世界中單詞或句子都會更復雜。為了簡化問題,我們用的是下面這個簡單的詞彙表。
在上圖中,隱藏層或 RNN 塊在當前輸入和之前的狀態中應用了公式。在本例中,namaste 的字母 n 前面什麼都沒有。所以我們直接使用當前信息推斷,並移動到下一個字母 a。在推斷字母 a 的過程中,隱藏層應用了上述公式結合當前推斷 a 的信息與前面推斷 n 的信息。輸入在網路中傳遞的每一個狀態都是一個時間步或一步,所以時間步 t 的輸入是 a,時間步 t-1 的輸入就是 n。將公式同時應用於 n 和 a 後,就得到了一個新狀態。
用於當前狀態的公式如下所示:
h_t 是新狀態,h_t-1 是前一個狀態。x_t 是時間 t 時的輸入。在對之前的時間步應用了相同的公式後,我們已經能感知到之前的輸入了。我們將檢查 7 個這樣的輸入,它們在每一步的權重和函數都是相同的。
現在試著以簡單的方式定義 f()。我們使用 tanh 激活函數。通過矩陣 W_hh 定義權重,通過矩陣 W_xh 定義輸入。公式如下所示:
上例只將最後一步作為記憶,因此只與最後一步的數據合並。為了提升網路的記憶能力,並在記憶中保留較長的序列,我們必須在方程中添加更多的狀態,如 h_t-2、h_t-3 等。最後輸出可以按測試階段的計算方式進行計算:
其中,y_t 是輸出。對輸出與實際輸出進行對比,然後計算出誤差值。網路通過反向傳播誤差來更新權重,進行學習。本文後續部分會對反向傳播進行討論。
基於時間的反向傳播演算法(BPTT)
本節默認你已經了解了反向傳播概念。如果需要對反向傳播進行深入了解,請參閱鏈接:?http://cs231n.github.io/optimization-2/?。
現在我們了解了 RNN 是如何實際運作的,但是在實際工作中如何訓練 RNN 呢?該如何決定每個連接的權重呢?如何初始化這些隱藏單元的權重呢?循環網路的目的是要准確地對序列輸入進行分類。這要靠誤差值的反向傳播和梯度下降來實現。但是前饋網路中使用的標准反向傳播無法在此應用。
與有向無環的前饋網路不同,RNN 是循環圖,這也是問題所在。在前饋網路中可以計算出之前層的誤差導數。但 RNN 的層級排列與前饋網路並不相同。
答案就在之前討論過的內容中。我們需要展開網路。展開網路使其看起來像前饋網路就可以了。
展開 RNN
在每個時間步取出 RNN 的隱藏單元並復制。時間步中的每一次復制就像前饋網路中的一層。在時間步 t+1 中每個時間步 t 層與所有可能的層連接。因此我們對權重進行隨機初始化,展開網路,然後在隱藏層中通過反向傳播優化權重。通過向最低層傳遞參數完成初始化。這些參數作為反向傳播的一部分也得到了優化。
展開網路的結果是,現在每一層的權重都不同,因此最終會得到不同程度的優化。無法保證基於權重計算出的誤差是相等的。所以每一次運行結束時每一層的權重都不同。這是我們絕對不希望看到的。最簡單的解決辦法是以某種方式將所有層的誤差合並到一起。可以對誤差值取平均或者求和。通過這種方式,我們可以在所有時間步中使用一層來保持相同的權重。
RNN 實現
本文試著用 Keras 模型實現 RNN。我們試著根據給定的文本預測下一個序列。
代碼地址:?https://gist.github.com/.git?
該模型是 Yash Katariya 建的。我對該模型做了一些細微的改動以適合本文的要求。
④ 【神經網路原理】如何利用梯度下降法更新權重與偏置
損失函數的值減小,意味著神經網路的預測值(實際輸出)和標簽值(預期的輸出)越接近。
損失函數通常為 多元函數 ,其自變數包括網路中包含的所有的權重w、以及所有的偏置b,有的地方也將其稱作代價函數(Cost function)或價值函數(Value function),這里只介紹均方誤差損失函數(MSE):
多元函數的梯度類似於一元函數導數 :對多元函數各變數依次求一階偏導,然後將各偏導值組合成一個一維列向量,就得到了該多元函數梯度。損失函數通常為 多元函數 ,其梯度如下:
對於神經網路結構 & 符號約定有疑惑的可以參考我的這篇文章—— 【神經網路原理】神經網路結構 & 符號約定
梯度的負方向 :因為梯度是一個向量,具有方向性。這里的 下降 是指損失函數值的減小。
那麼為什麼沿梯度的負方向損失函數值減小最快呢?這里主要利用 多元函數的一階泰勒展開 (一階形式還是比較簡單的)和 向量點積公式 來證明:
這里只給出了第 l 層的網路參數——權重(矩陣)與偏置(向量)的梯度下降更新公式,其他層網路參數的更新公式同理可得,對符號有疑惑的請參考: 【神經網路原理】神經網路結構 & 符號約定 。
有了各層網路參數(向量/矩陣)的更新公式,其中損失函數對各參數的梯度又該如何求解呢?事實上由於神經網路中參數(權重W和偏置b)通常較多,要想直接求解損失函數對這些參數的梯度,難度極大,所以在實際訓練網路時,我們通常採用 反向誤差傳播,即BP演算法 ,巧妙地利用預測值與標簽值的殘差,從輸出層到輸入層反向地求解出損失函數對各層網路參數的梯度。
⑤ BP原理(前饋神經網路)
公式中的e叫自然常數,也叫歐拉數,e=2.71828…。e是個很神秘的數字,它是「自然律」的精髓,其中暗藏著自然增長的奧秘,它的圖形表達是旋渦形的螺線。
e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + 1/5! + 1/6! + 1/7! + … = 1 + 1 + 1/2 + 1/6 + 1/24 + 1/120+ … ≈ 2.71828
bp基本原理是:
利用前向傳播最後輸出的結果來計算誤差的偏導數,再用這個偏導數和前面的隱藏層進行加權求和,如此一層一層的向後傳下去,直到輸入層(不計算輸入層),最後利用每個節點求出的偏導數來更新權重。
注意:隱藏層和輸出層的值,都需要前一層加權求和之後 再代入激活函數 獲得。
殘差(error term) : 表示誤差的偏導數
(注意:激活函數的導數中代入的值是前一層的加權值)
如果輸出層用Purelin作激活函數,Purelin的導數是1,輸出層→隱藏層:殘差 = -(輸出值-樣本值)
如果用Sigmoid(logsig)作激活函數,那麼: Sigmoid導數 = Sigmoid*(1-Sigmoid)
(Sigmoid指的是Sigmoid函數代入前一層的加權值得到的值,即輸出值)
輸出層→隱藏層:
殘差 = -(輸出值-樣本值) * Sigmoid*(1-Sigmoid) = -(輸出值-樣本值)輸出值(1-輸出值)
隱藏層→隱藏層:
殘差 = (右層每個節點的殘差加權求和)* 當前節點的Sigmoid*(1-當前節點的Sigmoid)
如果用tansig作激活函數,那麼:tansig導數 = 1 - tansig^2
殘差全部計算好後,就可以更新權重了:
學習率是一個預先設置好的參數,用於控制每次更新的幅度。
此後,對全部數據都反復進行這樣的計算,直到輸出的誤差達到一個很小的值為止。
這里介紹的是計算完一條記錄,就馬上更新權重,以後每計算完一條都即時更新權重。實際上批量更新的效果會更好,方法是在不更新權重的情況下,把記錄集的每條記錄都算過一遍,把要更新的增值全部累加起來求平均值,然後利用這個平均值來更新一次權重,然後利用更新後的權重進行下一輪的計算,這種方法叫批量梯度下降(Batch Gradient Descent)。
⑥ 神經網路模型-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。
記憶是被內容編址的,這個網路可以基於現狀讀取記憶,編寫記憶,也代表了圖靈完備神經網路。
⑦ 多層前饋網路模型及BP演算法
多層前饋網中,以單隱層網的應用最為普遍,如圖6.1所示。習慣上將其稱為三層前饋網或三層感知器,所謂三層即輸入層、隱層和輸出層。
圖6.1 三層前饋神經網路結構
Fig.6.1 BP neural network structure
三層前饋網中,輸入向量為X=(x1,x2,…,xi,…,xn)T,如加入x0=-1,可為輸出層神經元引入閾值;隱層輸出向量為Y=(y1,y2,…,yl,…,ym)T,如加入y0=-1,可為輸出層神經元引入閾值;輸出層輸出向量為O=(o1,o2,…,ok,…,ol)T。輸入層到隱層之間的權值陣用V表示,V=(V1,V2,…,Vj,…,Vm),其中列向量Vj為隱層第j個神經元對應的權向量;隱層到輸出層之間的權值矩陣用W 表示,W=(W1,W2,…,Wk,…,Wl),其中列向量Wk為輸出層第k個神經元對應的權向量。下面分析各層信號之間的數學關系。
輸出層:
ok=f(netk)k=1,2,…,ι(6-1)
煤層開采頂板導水裂隙帶高度預測理論與方法
隱層:
yj=f(netj)j=1,2,…,m(6-3)
煤層開采頂板導水裂隙帶高度預測理論與方法
以上兩式中,轉移函數f(x)均為單極性Sigmoid函數
煤層開采頂板導水裂隙帶高度預測理論與方法
f(x)具有連續、可導的特點,且有
煤層開采頂板導水裂隙帶高度預測理論與方法
根據應用需要,也可以採用雙極性Sigmoid函數(或稱雙曲線正切函數)
煤層開采頂板導水裂隙帶高度預測理論與方法
式6-1~式6-6共同構成了三層前饋網的數學模型。
BP學習演算法中按以下方法調整其權重與誤差:
當網路輸出與期望輸出不相等時,存在輸出誤差E,定義如下:
煤層開采頂板導水裂隙帶高度預測理論與方法
將以上誤差定義式展開到隱層,
煤層開采頂板導水裂隙帶高度預測理論與方法
進一步展開到輸入層,
煤層開采頂板導水裂隙帶高度預測理論與方法
由上式可以看出,網路輸入誤差是各層權值ωjk、υij的函數,因此調整權值可改變誤差E。
顯然,調整權值的原則是使誤差不斷減小,因此權值的調整量與誤差的負梯度成正比,即
煤層開采頂板導水裂隙帶高度預測理論與方法
煤層開采頂板導水裂隙帶高度預測理論與方法
式中負號表示梯度下降,常數η∈(0,1)表示比例系數,在訓練中反映了學習速率。可以看出BP法屬於δ學習規則類,這類演算法常被稱為誤差的梯度下降(GradientDescent)演算法。
⑧ 2.前饋型神經網路與反饋型神經網路
隨著神經網路的不斷發展,越來越多的人工神經網路模型也被創造出來了,其中,具有代表性的就是前饋型神經網路模型以及反饋型神經網路模型。
1.前饋型神經網路模型
前饋神經網路(Feedforward Neural Network),簡稱前饋網路,是人工神經網路的一種。在此種神經網路中,各神經元從輸入層開始,接收前一級輸入,並輸出到下一級,直至輸出層。整個網路中無反饋,可用一個有向無環圖表示。
前饋神經網路採用一種單向多層結構,其拓撲結構如圖1所示。其中每一層包含若干個神經元,同一層的神經元之間沒有互相連接,層間信息的傳送只沿一個方向進行。其中第一層稱為輸入層。最後一層為輸出層.中間為隱含層,簡稱隱層。隱層可以是一層。也可以是多層
2.反饋型神經神經網路
反饋神經網路是一種反饋動力學系統。在這種網路中,每個神經元同時將自身的輸出信號作為輸入信號反饋給其他神經元,它需要工作一段時間才能達到穩定。Hopfield神經網路是反饋網路中最簡單且應用廣泛的模型,它具有聯想記憶的功能,如果將李雅普諾夫函數定義為巡遊函數,Hopfield神經網路還可以用來解決快速尋優問題,Hopfield網路可以分為離散型Hopfield網路和連續型Hopfield網路,其中,離散型Hopfield網路拓撲結構如圖2所示。
⑨ CNN(卷積神經網路)演算法
基礎知識講解:
卷積:通過兩個函數f 和g 生成第三個函數的一種數學運算元,表徵函數f 與g經過翻轉和平移的重疊部分函數值乘積對重疊長度的積分。
前饋神經網路:各神經元分層排列,每個神經元只與前一層的神經元相連,接收前一層的輸出,並輸出給下一層.各層間沒有反饋。
卷積神經網路:是一類包含卷積計算且具有深度結構的前饋神經網路
卷積核:就是圖像處理時,給定輸入圖像,輸入圖像中一個小區域中像素加權平均後成為輸出圖像中的每個對應像素,其中權值由一個函數定義,這個函數稱為卷積核。
下采樣:對於一個樣值序列間隔幾個樣值取樣一次,這樣得到新序列就是原序列的下采樣。
結構介紹
輸入層:用於數據輸入
卷積層:利用卷積核進行特徵提取和特徵映射
激勵層:非線性映射,卷積是線性映射,彌補不足
池化層:進行下采樣,對特徵圖稀疏處理,減少數據運算量
全連接層:在CNN的尾部進行重新擬合,減少特徵信息的損失
輸入層:
在CNN的輸入層中,(圖片)數據輸入的格式 與 全連接神經網路的輸入格式(一維向量)不太一樣。CNN的輸入層的輸入格式保留了圖片本身的結構。
對於黑白的 28×28 的圖片,CNN的輸入是一個 28×28 的的二維神經元:
而對於RGB格式的28×28圖片,CNN的輸入則是一個 3×28×28 的三維神經元(RGB中的每一個顏色通道都有一個 28×28 的矩陣)
卷積層:
左邊是輸入,中間部分是兩個不同的濾波器Filter w0、Filter w1,最右邊則是兩個不同的輸出。
ai.j=f(∑m=02∑n=02wm,nxi+m,j+n+wb)
wm,n:filter的第m行第n列的值
xi,j: 表示圖像的第i行第j列元素
wb:用表示filter的偏置項
ai,j:表示Feature Map的第i行第j列元素
f:表示Relu激活函數
激勵層:
使用的激勵函數一般為ReLu函數:
f(x)=max(x,0)
卷積層和激勵層通常合並在一起稱為「卷積層」。
池化層:
當輸入經過卷積層時,若感受視野比較小,布長stride比較小,得到的feature map (特徵圖)還是比較大,可以通過池化層來對每一個 feature map 進行降維操作,輸出的深度還是不變的,依然為 feature map 的個數。
池化層也有一個「池化視野(filter)」來對feature map矩陣進行掃描,對「池化視野」中的矩陣值進行計算,一般有兩種計算方式:
Max pooling:取「池化視野」矩陣中的最大值
Average pooling:取「池化視野」矩陣中的平均值
訓練過程:
1.前向計算每個神經元的輸出值aj( 表示網路的第j個神經元,以下同);
2.反向計算每個神經元的誤差項σj,σj在有的文獻中也叫做敏感度(sensitivity)。它實際上是網路的損失函數Ed對神經元加權輸入的偏導數
3.計算每個神經元連接權重wi,j的梯度( wi,j表示從神經元i連接到神經元j的權重)
1.最後,根據梯度下降法則更新每個權重即可。
參考: https://blog.csdn.net/love__live1/article/details/79481052
⑩ 梯度下降法怎麼改變神經網路中的權重
梯度下降演算法是神經網路在每代更新網路權值的一種方法。
神經網路還有很多其他更新權值的方法,不只這一種