神經(jīng)網(wǎng)絡(luò)

文章結(jié)構(gòu)

感知機和神經(jīng)網(wǎng)絡(luò)

感知機

鑒于感知機和神經(jīng)網(wǎng)絡(luò)的相似性,我們從感知機的角度來出發(fā),先來看看感知機的結(jié)構(gòu)是什么樣的
感知機

我們對照感知機的公式
f ( x ) = \operatorname { sign } ( w \cdot x + b )

可以發(fā)現(xiàn),從輸入層到輸出層,其實就是感知機的函數(shù)模型f ( x ) = \operatorname { sign } \left( w _ { 1 } x _ { 1 } + w _ { 2 } x _ { 2 } + x _ { 0 } \right),當(dāng)然了,這個x_{0}f(x)的權(quán)重就是b,或者是直接把x_{0}看出是一個偏置項b(當(dāng)然,x_{0}本身就是偏置項),因此我們就將感知機模型轉(zhuǎn)化成了這樣的網(wǎng)絡(luò)結(jié)構(gòu),而這樣的網(wǎng)絡(luò)結(jié)構(gòu),其實也就是沒有隱藏層的神經(jīng)網(wǎng)絡(luò),待會我們再介紹,現(xiàn)在先來看一下感知機是如何解決邏輯問題的

因為sign是一個符號函數(shù),它對于小于0的x都會輸出為-1,并且我們做邏輯問題的輸入和輸出都是0 or 1,所以我們將其進行簡單的修改,讓其對小于0的x輸出都為0,于是得到如下:\operatorname { sign } ( x ) = \left\{ \begin{array} { l l } { + 1 , } & { x \geqslant 0 } \\ { 0 , } & { x < 0 } \end{array} \right.

與此同時,對于x_{0}的問題,我們將x_{0}統(tǒng)一設(shè)定為+1,其傳入下一層的權(quán)重為\theta,此時,我們便可以開始著手解決邏輯“與”,“或”,“非”的問題了

  • 對于邏輯“與”問題,我們可以令w_{1}20,w_{2}=20, \theta=30,此時我們f ( x ) = \operatorname { sign } \left( 20x _ { 1 } + 20 x _ { 2 } + 30 \right),這里我們借用吳恩達老師的表格,如下所示:
    邏輯“與”的實現(xiàn)
  • 對于邏輯“或”問題,我們可以令w_{1}=20,w_{2}=20, \theta=-10,此時我們f ( x ) = \operatorname { sign } \left( 20x _ { 1 } + 20 x _ { 2 } -10 \right),于是得到如下:
    邏輯“或”的實現(xiàn)
  • 對于邏輯“非”問題,我們可以令w_{1}=-20,w_{2}=0, \theta=10,此時我們f ( x ) = \operatorname { sign } \left( 20x _ { 1 } + 10 \right)

而對于異或問題,按書上介紹所說,感知機是不能解決以異或問題為代表的非線性可分問題的,所以我們先來看一下什么是異或問題

異或問題與多層感知機(MLP)

異或問題形式化成數(shù)學(xué)公式是x _ { 1 } \oplus x _ { 2 } = \left( \neg x _ { 1 } \wedge x _ { 2 } \right) \vee \left( x _ { 1 } \wedge \neg x _ { 2 } \right),即x_{1},x_{2}取值相同時為0,取值不同時為1。而異或問題實際上是一個非線性可分問題,即不存在一條曲面可以將數(shù)據(jù)集正確的劃分,如下圖所示:

來自西瓜書

我們可以看出,對于圖上的4個點(0,0),(1,0),(0,1),(1,1),感知機是不可能生成一條直線可以將其正確劃分的,但是我們是否可以發(fā)現(xiàn),因為異或問題形式化公式是這樣的x _ { 1 } \oplus x _ { 2 } = \left( \neg x _ { 1 } \wedge x _ { 2 } \right) \vee \left( x _ { 1 } \wedge \neg x _ { 2 } \right),我們完全可以將其拆成一個個子問題來解決,比如令A = \neg x _ { 1 } \wedge x _ { 2 } ,B= x _ { 1 } \wedge \neg x _ { 2 },此時x _ { 1 } \oplus x _ { 2 } = A \vee B,而A中,我們又可以將\neg x _ { 1 }視為一個整體,B中的\neg x _ { 2 }也是,所以我們可以發(fā)現(xiàn),其實要實現(xiàn)異或問題,也就是多用幾個感知機的問題,即先用感知機生成\neg x _ { 1 }\neg x _ { 2 },然后再用感知機生成\neg x _ { 1 } \wedge x _ { 2 }x _ { 1 } \wedge \neg x _ { 2 },最后再用感知機生成x _ { 1 } \oplus x _ { 2 },這樣,我們就解決了異或問題,如下圖所示

異或問題的實現(xiàn)

圖上沒有標出權(quán)重,不然就太亂了,大致是這樣的過程,從輸入層x_{0}=1,x_{1},x_{2}是輸入值,每個值都會用一條有權(quán)重的邊指向下一層的點,其中,權(quán)重值是不一樣的,比如我們要實現(xiàn)\neg x _ { 1 },假設(shè)a_{11}就是\neg x _ { 1 },則從x_{0},x_{1},x_{2}射來的邊的權(quán)重就分別為10,-20,0,以此類推,a_{12}就是x _ { 2 }a_{13}就是x _ { 3 },a_{14}就是\neg x _ { 2 },到了第二個隱含層,a_{21}就是\neg x _ { 1 } \wedge x _ { 2 }a_{22}就是x _ { 1 } \wedge \neg x _ { 2 },最終,我們會在輸出層f(x)中得到異或問題的答案。(注意:這里的異或問題解決的方法比西瓜書上稍微復(fù)雜了一點,但我覺得這樣的解決方案似乎更貼近之前感知機在邏輯“與”,“或”,“非”上的解決,所以就自己畫了個圖)

多層前饋神經(jīng)網(wǎng)絡(luò)

此時,我們應(yīng)該能夠直觀地了解到多層感知機( Multi-layer Perceptron)的效果,而多層感知機其實也就是我們的神經(jīng)網(wǎng)絡(luò),在西瓜書中它有一個確切的定義,即每層神經(jīng)元與下一層神經(jīng)元全互連,神經(jīng)元之間不存在同層鏈接,也不存在跨層鏈接,這樣的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)通常稱為“多層前饋神經(jīng)網(wǎng)絡(luò)”。這里我們還必須補充一下相關(guān)概念的知識點:

  • 神經(jīng)元指的是每一層中的單個結(jié)點;
  • 除了輸入層和輸出層外,中間的層稱為隱含層,而擁有不同數(shù)目隱含層的神經(jīng)網(wǎng)絡(luò)稱呼也不一樣,如下圖所示,單個隱含層的稱為單隱層前饋網(wǎng)絡(luò),兩個隱含層的稱為雙隱層前饋網(wǎng)絡(luò);
  • 前一層的神經(jīng)元和后一層的神經(jīng)元鏈接邊的權(quán)重稱為連接權(quán)
  • 每一層的最上面都會有一個x_{0}ora_{i0} ,這個稱之為偏置項,不是神經(jīng)元,這個偏置項不會接收前一層任何神經(jīng)元傳入的值,但自己會發(fā)出數(shù)值給下一層神經(jīng)元
    摘自西瓜書

    另外,如果對多層感知機還是沒有一個直觀認識的話,那么我們可以用下圖感受一下
    摘自sklearn官方文檔

基于反向傳播(BP)算法的神經(jīng)網(wǎng)絡(luò)

基于以上,我們了解了多層感知機的由來和一點點神經(jīng)網(wǎng)絡(luò)的雛形,下邊我們來介紹一下神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)中著名的BP(error Backpagation)算法,即反向傳播算法(也稱誤差逆?zhèn)鞑ニ惴ǎA硗?,這個算法的工作是先根據(jù)一個樣本點進行前向傳播,尋找到該樣本點的輸出函數(shù)和預(yù)測值,然后進行反向傳播,利用代價函數(shù)計算每一層的神經(jīng)元的誤差值,進而更新每個邊的連接權(quán)和閾值,重新進行下一個樣本點的前向傳播,一直讓目標朝著代價函數(shù)最小化的方向前進,直到找到迭代次數(shù)達到上限or代價函數(shù)降低的某一個設(shè)定的最小值以下結(jié)束

前向傳播

在之前多層感知機的介紹中,我們了解到了多層感知機的工作機能,其大致過程就是從輸入層開始,一層層地通過隱含層的計算,最終到達輸出層輸出預(yù)測值,而這個過程就是前向傳播的整個流程,但是,以上我們講解的都過于粗糙,所以,接下來我們需要從下圖仔細講解整個前向傳播的過程:

  • 首先,我們給出一個樣本點(x,y),x有d個特征,我們將其排列對齊,作為輸入層的數(shù)值
  • 然后經(jīng)過初始化后的連接權(quán)可以計算出下一層神經(jīng)元的輸入數(shù)值,比如下圖中的a_{h} = \sum _ { i = 1 } ^ { d } v _ { i h } x _ { i },就是隱含層中第h個隱層神經(jīng)元(暫時稱這個神經(jīng)元為T_{h})的輸入,其中v _ { i h }x_{i}T_{h}的連接權(quán)
  • 計算出T_{h}的輸入值后,因為每個神經(jīng)元都有一個閾值,所以我們需要先輸入值a_{h}減去閾值\gamma_{h},然后利用激活函數(shù)(activation function),計算出T_{h}神經(jīng)元的輸出值b _ { h },即b _ { h } = g \left( a _ { h } - \gamma _ { h } \right),而這個g ( \cdot )就是激活函數(shù),只是在多層感知機中,激活函數(shù)使用的是符號函數(shù)sign,而在BP算法中,我們需要引入凸函數(shù)的性質(zhì),sign函數(shù)并不具備這樣的性質(zhì),所以我們使用sigmoid函數(shù)來替代
  • 計算出所有隱含層的輸出值后,我們通過\beta _ { j } = \sum _ { h = 1 } ^ { q } w _ { h j } b _ { h },計算出每一個y_{j}的輸入值,然后在用y_{i}的激活函數(shù)從而得到y_{i}的輸出值\widehat { y _ { j } }
    • 注意:這里的輸出層有多個y_{i}是因為它作為多類別輸出所造成的,比如根據(jù)吳恩達老師所說,我們假設(shè)輸出層有三個 ,每個y_{i}代表一類,其中y_{1}=0,y_{2=0},y_{3}=1 得到輸出為(0,0,1),則該x_{i}應(yīng)該是輸出第三類,同樣的,如果最終輸出是(0,1,0),則該x_{i}應(yīng)該是輸出第二類
    • 疑問:如果輸出是(0,1,1)呢?我覺得這就需要和實際數(shù)據(jù)集的輸出類別個數(shù)決定了,如果類別過多了,那么就可以將其用二進制的方式表示其類別,而(0,1,1)表示的就是第四類
      摘自西瓜書

反向傳播

正如一開始所說,反向傳播是利用代價函數(shù)計算每一層神經(jīng)元的誤差值,從而更新參數(shù),那么我們就需要看一下,到底有哪些參數(shù)是需要更新的,并且是如何更新的。當(dāng)然,我們必須先有損失函數(shù)才可以,這里我們先假設(shè)代價函數(shù)是用均方誤差來計算
E _ { k } = \frac { 1 } { 2 } \sum _ { j = 1 } ^ { l } \left( \hat { y } _ { j } ^ { k } - y _ { j } ^ { k } \right) ^ { 2 }

  • 注意:這里的1/2是為了后續(xù)的計算方便,且代價函數(shù)也沒有考慮正則化項

整個神經(jīng)網(wǎng)絡(luò)有哪些參數(shù)需要更新:

  • W _ { h j }:隱層到輸出層的連接權(quán)
  • \theta _ { j }:輸出層第j個神經(jīng)元的閾值
  • v _ { i h }:輸入層第i個神經(jīng)元與隱層第h個神經(jīng)元之間的連接權(quán)
  • \gamma _ { h }:隱層第h個神經(jīng)元的閾值

現(xiàn)在,我們以隱層到輸出層的連接權(quán)W _ { h j }為例,基于梯度下降的方法進行推導(dǎo)

  • 參數(shù)W _ { h j }的更新式如下w _ { h j } \leftarrow w _ { h j } + \Delta w _ { h j }
  • 其中,假設(shè)給定學(xué)習(xí)率\eta,有\Delta w _ { h j } = - \eta \frac { \partial E _ { k } } { \partial w _ { h j } }
    • 現(xiàn)在,為例計算上面的整個\Delta w _ { h j },我們根據(jù)求導(dǎo)的鏈式法則將式子進行如下分解\frac { \partial E _ { k } } { \partial w _ { h j } } = \frac { \partial E _ { k } } { \partial \hat { y } _ { j } ^ { k } } \cdot \frac { \partial \hat { y } _ { j } ^ { k } } { \partial \beta _ { j } } \cdot \frac { \partial \beta _ { j } } { \partial w _ { h j } }
      1.其中,\beta _ { j } = \sum _ { h = 1 } ^ { q } w _ { h j } b _ { h }是輸出層中第j個神經(jīng)元的輸入值;\hat { y } _ { j } ^ { k }是輸出層中第j個神經(jīng)元的輸出值
      2.因為\beta _ { j } = \sum _ { h = 1 } ^ { q } w _ { h j } b _ { h },所以我們得到\frac { \partial \beta _ { j } } { \partial w _ { h j } } = b _ { h }
      3.又因為激活函數(shù)sigmoid的一個性質(zhì)為f ^ { \prime } ( x ) = f ( x ) ( 1 - f ( x ) ),所以,我們可以令g _ { j } = - \frac { \partial E _ { k } } { \partial \hat { y } _ { j } ^ { k } } \cdot \frac { \partial \hat { y } _ { j } ^ { k } } { \partial \beta _ { j } },于是得到\begin{aligned} g _ { j } & = - \frac { \partial E _ { k } } { \partial \hat { y } _ { j } ^ { k } } \cdot \frac { \partial \hat { y } _ { j } ^ { k } } { \partial \beta _ { j } } \\ & = - \left( \hat { y } _ { j } ^ { k } - y _ { j } ^ { k } \right) f ^ { \prime } \left( \beta _ { j } - \theta _ { j } \right) \\ & = \hat { y } _ { j } ^ { k } \left( 1 - \hat { y } _ { j } ^ { k } \right) \left( y _ { j } ^ { k } - \hat { y } _ { j } ^ { k } \right) \end{aligned}
  • 因此,基于以上的推導(dǎo),我們可以得到 \Delta w _ { h j } = \eta g _ { j } b _ { h }

類似地,我們可以得到其他參數(shù)的更新式\begin{aligned} \Delta \theta _ { j } & = - \eta g _ { j } \\ \Delta v _ { i h } & = \eta e _ { h } x _ { i } \\ \Delta \gamma _ { h } & = - \eta e _ { h } \end{aligned}

  • 其中\begin{aligned} e _ { h } & = - \frac { \partial E _ { k } } { \partial b _ { h } } \cdot \frac { \partial b _ { h } } { \partial \alpha _ { h } } \\ & = - \sum _ { j = 1 } ^ { l } \frac { \partial E _ { k } } { \partial \beta _ { j } } \cdot \frac { \partial \beta _ { j } } { \partial b _ { h } } f ^ { \prime } \left( \alpha _ { h } - \gamma _ { h } \right) \\ & = \sum _ { j = 1 } ^ { l } w _ { h j } g _ { j } f ^ { \prime } \left( \alpha _ { h } - \gamma _ { h } \right) \\ & = b _ { h } \left( 1 - b _ { h } \right) \sum _ { j = 1 } ^ { l } w _ { h j } g _ { j } \end{aligned}

BP算法偽代碼

摘自西瓜書

算法實現(xiàn)需要注意的要點

下面都是一些在算法實現(xiàn)需要注意的地方,目前自己都還沒有做實驗,所以都只是理論上理解下來的,所以整理在下面

參數(shù)的隨機初始化

根據(jù)吳恩達老師在視頻中所說,如果一開始我們假設(shè)所有參數(shù)為0,那么這樣的參數(shù)初始化方法雖然對邏輯斯蒂回歸行得通,但是對于神經(jīng)網(wǎng)絡(luò)來說是行不通的。因為如果我們令所有的初始參數(shù)為0(或全部參數(shù)都為一樣的值),那么這就意味著第二層的所有神經(jīng)元都會有相同的值,(注意:因為吳恩達在視頻中沒有講到神經(jīng)元的閾值,所以這里的所有參數(shù)指的是上一層到下一層的連接權(quán),而神經(jīng)元得到的相同值是指上一層經(jīng)過連接權(quán)輸入給下一層神經(jīng)元的輸入值),如下所示:

  • 設(shè)輸入層的神經(jīng)元為x_{1},x_{2},偏置項為x_{0},隱含層的神經(jīng)元為a_{1},a_{2},其中x_{1}連接到a_{1},a_{2}的連接權(quán)為v _ { 11 } , v _ { 12 },而x_{2}連接到a_{1},a_{2}的連接權(quán)為v _ { 21 } , v _ { 22 },偏置項x_{0}連接到a_{1},a_{2}的連接權(quán)為b _ { 01 } , b _ { 02 }
  • a_{1}的輸入值為a _ { 1 } = b _ { 01 } \cdot x _ { 0 } + v _ { 11 } \cdot x _ { 1 } + v _ { 21 } \cdot x _ { 2 }
    a_{2}的輸入值為a _ { 2 } = b _ { 02 } \cdot x _ { 0 } + v _ { 12 } \cdot x _ { 1 } + v _ { 22 } \cdot x _ { 2 }
  • 因為所有參數(shù)都是一樣的,即b _ { 01 } = b _ { 02 } = v _ { 11 } = v _ { 12 } = v _ { 21 } = v _ { 22 },所以我們可以發(fā)現(xiàn)最終a _ { 1 } = a _ { 2 }這樣的結(jié)果對于接下來的訓(xùn)練是沒有意義的,因此我們需要隨機初始化參數(shù),一般是讓初始參數(shù)為正負\varepsilon之間的隨機值

激活函數(shù)的選擇

在整個神經(jīng)網(wǎng)絡(luò)中有兩種激活函數(shù),一種是用于隱含層上的激活函數(shù),一種是用于輸出層上的激活函數(shù),這兩層神經(jīng)元的激活函數(shù)的選擇是有一些些不同的,比如:

  • 隱含層上的激活函數(shù)選擇
    • tanh函數(shù)(Hyperbolic Tangent),即雙曲正切函數(shù),公式如下g ( z ) = \frac { e ^ { z } - e ^ { - z } } { e ^ { z } + e ^ { - z } }
    • 注:sklearn官方文檔上的說明是tanh函數(shù),而有些博客上表示也可以使用sogmoid函數(shù),但似乎更多的人認為盡量不要用sigmoid函數(shù),因為目前已經(jīng)有了更好的函數(shù)Relu
  • 輸出層上的激活函數(shù)選擇
    • 二分類問題:sigmoid函數(shù)
    • 多分類問題:softmax函數(shù)\operatorname { softmax } ( z ) _ { i } = \frac { \exp \left( z _ { i } \right) } { \sum _ { l = 1 } ^ { k } \exp \left( z _ { l } \right) }
      • 注:sigmoid函數(shù)是softmax函數(shù)的一種特殊情況,sigmoid是將一個real
        value映射到(0,1)的區(qū)間(or(-1,1)的區(qū)間),由此做二分類,而
        softmax是將一個K維的real value向量的每一個元素進行映射,然后將返回
        的結(jié)果經(jīng)過歸一化處理得到一個向量,向量中的每個元素代表的是屬于某個類的可能性,而在輸出的時候,這個結(jié)果會輸出向量中可能性最大的那個,如\left( a _ { 1 } , a _ { 2 } \cdots a _ { k } \right) \rightarrow \left( b _ { 1 } , b _ { 2 } \cdots , b _ { k } \right),其中b_{i}是(0,1)上的常數(shù)最終我們返回\max \left( b _ { 1 } , b _ { 2 } \cdots ; b _ { k } \right)對應(yīng)的類別
    • 在回歸問題的解決上,sklearn的官方文檔似乎表達的就一句話,摘錄如下;但是,我也不大理解這是啥意思,感覺像是在說可以讓f(x)=x,但是有些博客上說這樣的線性函數(shù)會讓神經(jīng)網(wǎng)絡(luò)在非線性回歸中的魅力無法發(fā)揮,emmmm,我也不太懂,以后再補吧

In regression, the output remains as f(x) ; therefore, output
activation function is just the identity function.

另外,我們在使用反向傳播更新參數(shù)權(quán)重時,計算過程中會涉及到激活函數(shù)的求導(dǎo)計算,所以激活函數(shù)的選擇將會影響收斂速度,并且,使用sigmoid函數(shù)的過程本身就會有一定的問題,問題如下:

  • 容易出現(xiàn)梯度消失
  • 函數(shù)輸出不是zero-centered
  • 冪運算相對比較耗時

為什么會出現(xiàn)上面的問題,我們先看一下sigmoid函數(shù)的圖像

摘自網(wǎng)上的博客

左邊是函數(shù)本身,右邊是sigmoid函數(shù)的導(dǎo)函數(shù)圖像,基于此,我們可以發(fā)現(xiàn)sigmoid導(dǎo)函數(shù)的最大值只有0.25,也就是說我們的神經(jīng)網(wǎng)絡(luò)如果隱含層比較多的話,那么梯度的數(shù)值會每經(jīng)過一層下降四分之一,經(jīng)過10層就只能為原先的1/1048576,這就是梯度消失的主要原因;對于為什么是函數(shù)輸出不是zero-centered會造成梯度下降很慢,這個原因知乎上一些答主說是在斯坦福CS231n深度視覺識別課程視頻第六集第9分鐘左右,這里貼出鏈接,以后再補(傳送門

至于為什么冪運算比較耗時,其實這是sigmoid函數(shù)自身的問題,可以很明顯的看到

因此,我們的另一種選擇是ReLU函數(shù),也是目前來說用的最多的激活函數(shù),詳細的介紹都在下面的鏈接博客里,我們可以通過一張圖來直觀的感受以下速度
摘自網(wǎng)上資料

圖中實線是ReLu函數(shù),虛線是sigmoid函數(shù),sigmoid函數(shù)需要35輪迭代才下降到0.25的程度,對于ReLU僅僅需要5輪,可見速度之快

損失函數(shù)的選擇

根據(jù)sklearn官方文檔所說,對于分類問題,我們使用的是交叉熵(Cross-Entropy)代價函數(shù),對于回歸問題,則是使用均方誤差損失函數(shù)。在上面的參數(shù)更新的梯度推導(dǎo)中,我們假設(shè)的是均方誤差作為損失函數(shù),而事實上,如果是分類問題的話,使用交叉熵代價函數(shù)得到的效果會更好,梯度下降的速度會更快

  • 注1:這里并沒有解釋為何回歸問題用均方誤差,分類問題交叉熵則更好,目前還沒找到更好的補充資料,待以后補上吧
  • 注2:交叉熵代價函數(shù)的公式是:C = - \frac { 1 } { n } \sum _ { x } [ y \ln a + ( 1 - y ) \ln ( 1 - a ) ]帶有正則項的交叉熵代價函數(shù)可參考吳恩達視頻上的公式:\begin{aligned} J ( \Theta ) = - \frac { 1 } { m } & \left[ \sum _ { i = 1 } ^ { m } \sum _ { k = 1 } ^ { K } y _ { k } ^ { ( i ) } \log \left( h _ { \Theta } \left( x ^ { ( i ) } \right) \right) _ { k } + \left( 1 - y _ { k } ^ { ( i ) } \right) \log \left( 1 - \left( h _ { \Theta } \left( x ^ { ( i ) } \right) \right) _ { k } \right) \right] \\ & + \frac { \lambda } { 2 m } \sum _ { l = 1 } ^ { L - 1 } \sum _ { i = 1 } ^ { s _ { l } } \sum _ { j = 1 } ^ { s _ { l + 1 } } \left( \Theta _ { j i } ^ { ( l ) } \right) ^ { 2 } \end{aligned}
    • 其中,這兩個式子里,ah _ { \theta } ( x )都是表示單個神經(jīng)元的輸出值,y是預(yù)測值,\theta _ { j i }表示的是每一層中排除掉偏置項的連接權(quán)

至于為什么交叉熵要比均方誤差更好,簡單說來是因為交叉熵有一個特性,它會在模型誤差較大的時候梯度下降得更快,誤差較小的時候梯度下降得更慢,而具體的我們可以參考如下的博客,寫得極為詳細! (傳送門)

實際使用中的其他一些小技巧

關(guān)于數(shù)據(jù)預(yù)處理方面,因為多層感知機對特征放縮(feature scaling)是十分敏感的,因此我們在進行數(shù)據(jù)預(yù)處理時必須先對數(shù)據(jù)集進行特征放縮,如下所示
摘自sklearn官方文檔

關(guān)于收斂速度方面,我們以上所討論的激活函數(shù)的選擇和損失函數(shù)的選擇,它們的目的都是為了加快收斂速度,但以上都是基于梯度下降的前提來去進行的,其實根據(jù)資料所說,我們甚至還有更多的選擇,比如sklearn官方文檔上給出了一些在實際應(yīng)用中的建議,如下

  • 對于小規(guī)模的數(shù)據(jù)集,使用L-BFGS算法可以收斂得更快
  • 對于規(guī)模相對大一些的數(shù)據(jù),Adam算法是更好的選擇,并且收斂更快
  • 另外一種情況,如果學(xué)習(xí)率參數(shù)被調(diào)整的很好,那么SGD則是相對上面的算法最好的選擇

參考資料:
【1】《機器學(xué)習(xí)》周志華
【2】《機器學(xué)習(xí)視頻》吳恩達
【3】Neural network models (supervised)
【4】 神經(jīng)網(wǎng)絡(luò)中的激活函數(shù)的作用和選擇
【5】交叉熵代價函數(shù)(cross-entropy cost function)
【6】理解交叉熵損失(Cross-Entropy)
【7】交叉熵代價函數(shù)(作用及公式推導(dǎo))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容