前言
最近跟着《神經網絡與深度學習》把機器學習的內容簡單回顧了一遍,並進行了一定的查缺補漏,比如SVM的一些理解,one-hot向量,softmax回歸等等。
然后我將繼續跟着這本書,開始學習深度學習的內容。
前饋神經網絡
人工神經網絡是指一系列受生物學和神經科學啟發的數學模型。這些模型主要是通過對人腦的神經元網絡進行抽象,構造人工神經元,並按照一定拓撲結構來建立人工神經元之間的連接,來模擬生物神經網絡。
早期的神經網絡是一種主要的連接主義模型。20世紀80年代中后期,最流行的是分布式並行處理,主要特性是:1)信息表是是分布式的(非局部的);2)記憶和知識是存儲在單元之間的連接上;3)通過逐漸改變單元之間的連接強度來學習新知識
連接主義的神經網絡有許多網絡結構以及學習方法,雖然早期模型強調模型的生物學合理性,但后期更加關注對某種特性認知能力的模擬。尤其在引入誤差反向傳播來改進學習能力后,神經網絡也越來越多的應用在各種機器學習任務上。
本章主要關注采用誤差反向傳播來進行學習的神經網絡,及作為一種機器學習模型的神經網絡。從機器學習的角度看,神經網絡模型而可以看作一個非線性模型,其基本組成單元為具有非線性激活函數的神經元,通過大量神經元之間的連接,使得神經網絡成為一種高度的非線性的模型,神經元之間的連接的權重就是需要學習的參數,可以在機器學習的框架下通過梯度下降方法來進行學習
- 線性”與“非線性”是數學上的叫法。線性,指的就是兩個變量之間成正比例的關系,在平面直角坐標系中表現出來,就是一條直線;而非線性指的就是兩個變量之間不成正比,在直角坐標系中是曲線而非直線,例如一元二次方程的拋物線、對數函數等等關系。
神經元
人工神經元簡稱神經元,是構成神經網絡的基本單元,其主要是模擬生物神經元的結構和特性,接受一組信號並產生輸出。
假設一個神經元接受了一組輸入后,這些輸入又會分別各自做出加權和偏置操作,最后得出一個值稱之為凈輸入,這時我們的凈輸入需要經過一個非線性函數f(·)后,得到神經元的活性值a,其中的非線性函數稱為激活函數。
激活函數 激活函數在神經元中非常重要,為了增強網絡的表示能力和學習能力,激活函數需要具備以下幾個性質:
- 連續並可導(允許少數點上不可導)的非線性函數,可導的激活函數可以直接利用數值優化的方法來學習網絡參數
- 激活函數及其導函數要盡可能的簡單,有利提高網絡計算效率
- 激活函數的導函數的值域要在一個合適的區間內,不能太大也不能太小,否則會影響訓練的效率和穩定性
Sigmoid型函數
- Logistic函數
Logistic函數在邏輯斯蒂回歸博文中有介紹 https://www.cnblogs.com/lugendary/p/16023648.html - Tanh函數
Tanh函數可以看作放大並平移的Logistic函數,值域為(-1,1)
- Hard-Logistic函數和Hard-Tanh函數
Logistic函數和Tanh函數都是Sigmoid型函數,具有飽和性,但是計算開銷較大,因為兩個函數都是在0附近接近線性,兩端飽和,所以這兩個函數可以通過分段函數來近似,也
就是Hard-Logistic函數和Hard-Tanh函數
ReLU函數
ReLU函數(Rectified Linear Unit,修正線性單元),也叫Rectifier函數,是目前深度神經網絡中經常使用的激活函數,ReLU實際上是一個斜坡函數,定義為:
從上圖不難看出,ReLU函數其實是分段線性函數,把所有的負值都變為0,而正值不變,這種操作被成為單側抑制。可別小看這個簡單的操作,正因為有了這單側抑制,才使得神經網絡中的神經元也具有了稀疏激活性。尤其體現在深度神經網絡模型(如CNN)中,當模型增加N層之后,理論上ReLU神經元的激活率將降低2的N次方倍。這里或許有童鞋會問:ReLU的函數圖像為什么一定要長這樣?反過來,或者朝下延伸行不行?其實還不一定要長這樣。只要能起到單側抑制的作用,無論是鏡面翻轉還是180度翻轉,最終神經元的輸出也只是相當於加上了一個常數項系數,並不影響模型的訓練結果。之所以這樣定,或許是為了契合生物學角度,便於我們理解吧。
那么問題來了:這種稀疏性有何作用?換句話說,我們為什么需要讓神經元稀疏?不妨舉栗子來說明。當看名偵探柯南的時候,我們可以根據故事情節進行思考和推理,這時用到的是我們的大腦左半球;而當看蒙面唱將時,我們可以跟着歌手一起哼唱,這時用到的則是我們的右半球。左半球側重理性思維,而右半球側重感性思維。也就是說,當我們在進行運算或者欣賞時,都會有一部分神經元處於激活或是抑制狀態,可以說是各司其職。再比如,生病了去醫院看病,檢查報告里面上百項指標,但跟病情相關的通常只有那么幾個。與之類似,當訓練一個深度分類模型的時候,和目標相關的特征往往也就那么幾個,因此通過ReLU實現稀疏后的模型能夠更好地挖掘相關特征,擬合訓練數據。
此外,相比於其它激活函數來說,ReLU有以下優勢:對於線性函數而言,ReLU的表達能力更強,尤其體現在深度網絡中;而對於非線性函數而言,ReLU由於非負區間的梯度為常數,因此不存在梯度消失問題(Vanishing Gradient Problem),使得模型的收斂速度維持在一個穩定狀態。這里稍微描述一下什么是梯度消失問題:當梯度小於1時,預測值與真實值之間的誤差每傳播一層會衰減一次,如果在深層模型中使用sigmoid作為激活函數,這種現象尤為明顯,將導致模型收斂停滯不前
優點:采用ReLU的神經元只需要進行加、乘和比較的操作,計算上更加高效.ReLU 函數也被認為具有生物學合理性(Biological Plausibility),比如單側抑制、寬興奮邊界(即興奮程度可以非常高).在生物神經網絡中,同時處於興奮狀態的神經元非常稀疏.人腦中在同一時刻大概只有 1% ∼ 4% 的神經元處於活躍狀態.Sigmoid 型激活函數會導致一個非稀疏的神經網絡,而 ReLU 卻具有很好的稀疏性,大約50%的神經元會處於激活狀態.在優化方面,相比於Sigmoid型函數的兩端飽和,ReLU函數為左飽和函數,且在 𝑥 > 0 時導數為1,在一定程度上緩解了神經網絡的梯度消失問題,加速梯度下降的收斂速度.
缺點:ReLU函數的輸出是非零中心化的,給后一層的神經網絡引入偏置偏移,會影響梯度下降的效率.此外,ReLU神經元在訓練時比較容易“死亡”.在訓練時,如果參數在一次不恰當的更新后,第一個隱藏層中的某個ReLU神經元在所有的訓練數據上都不能被激活,那么這個神經元自身參數的梯度永遠都會是0,在以后的訓練過程中永遠不能被激活.這種現象稱為死亡ReLU問題,並且也有可能會發生在其他隱藏層.在實際使用中,為了避免上述情況,有幾種ReLU的變種也會被廣泛使用.
- 帶泄露的ReLU
帶泄露的ReLU(Leaky ReLU)在輸入𝑥 < 0時,保持一個很小的梯度𝛾.這樣當神經元非激活時也能有一個非零的梯度可以更新參數,避免永遠不能被激活
- 帶參數的ReLU
帶參數的 ReLU(Parametric ReLU,PReLU)引入一個可學習的參數,不同神經元可以有不同的參數。對於第 𝑖 個神經元,其 PReLU 的定義為
其中 𝛾𝑖 為 𝑥 ≤ 0 時函數的斜率.因此,PReLU 是非飽和函數.如果 𝛾𝑖 = 0,那么PReLU就退化為ReLU.如果𝛾𝑖 為一個很小的常數,則PReLU可以看作帶泄露的ReLU.PReLU 可以允許不同神經元具有不同的參數,也可以一組神經元共享一個參數. - ELU函數
ELU(Exponential Linear Unit,指數線性單元)是一個近似的零中心化的非線性函數,其定義為
其中𝛾 ≥ 0是一個超參數,決定𝑥≤0時的飽和曲線,並調整輸出均值在0附近. - Softplus函數
Softplus 函數可以看作 Rectifier 函數的平滑版本,其定義為
Softplus函數其導數剛好是Logistic函數.Softplus函數雖然也具有單側抑制、寬興奮邊界的特性,卻沒有稀疏激活性. - ReLU各個函數的圖像
給出了ReLU、Leaky ReLU、ELU以及Softplus函數的示例。
Swish函數
Swish 函數是一種自門控(Self-Gated)激活函數,定義為
其中 𝜎(⋅) 為 Logistic 函數,𝛽 為可學習的參數或一個固定超參數.𝜎(⋅) ∈ (0, 1) 可以看作一種軟性的門控機制.當𝜎(𝛽𝑥)接近於1時,門處於“開”狀態,激活函數的輸出近似於𝑥 本身;當𝜎(𝛽𝑥)接近於0時,門的狀態為“關”,激活函數的輸出近似於0.
當𝛽 = 0時,Swish函數變成線性函數𝑥/2.當𝛽 = 1時,Swish函數在𝑥 > 0時近似線性,在 𝑥 < 0 時近似飽和,同時具有一定的非單調性.當 𝛽 → +∞ 時,𝜎(𝛽𝑥)趨向於離散的0-1函數,Swish函數近似為ReLU函數.因此,Swish函數可以看作線性函數和ReLU函數之間的非線性插值函數,其程度由參數𝛽控制.
GELU函數
GELU(Gaussian Error Linear Unit,高斯誤差線性單元)也是一種通過門控機制來調整其輸出值的激活函數,和Swish函數比較類似.其中𝑃(𝑋 ≤ 𝑥)是高斯分布𝒩(𝜇,𝜎2)的累積分布函數,其中𝜇,𝜎為超參數,一般設𝜇=0,𝜎=1即可.由於高斯分布的累積分布函數為S型函數,因此GELU函數可以用Tanh函數或Logistic函數來近似,當使用Logistic函數來近似時,GELU相當於一種特殊的Swish函數.
Maxout單元
Maxout 單元也是一種分段線性函數.Sigmoid型函數、ReLU等激活函數的輸入是神經元的凈輸入𝑧,是一個標量.而 Maxout 單元的輸入是上一層神經元的全部原始輸出,是一個向量𝒙=[𝑥1;𝑥2;⋯;𝑥𝐷].每個Maxout單元有𝐾個權重向量𝒘𝑘∈ℝ𝐷和偏置𝑏𝑘(1 ≤ 𝑘 ≤ 𝐾).對於輸入𝒙,可以得到𝐾個凈輸入𝑧𝑘, 1≤𝑘≤𝐾.
Maxout單元不單是凈輸入到輸出之間的非線性映射,而是整體學習輸入到輸出之間的非線性映射關系.采用 Maxout 單元的神經網絡也叫作Maxout網絡.Maxout激活函數可以看作任意凸函數的分段線性近似,並且在有限的點上是不可微的.
網絡結構
通過一定的連接方式或信息傳遞方式進行協作的神經元可以看作一個網絡,就是神經網絡.到目前為止,研究者已經發明了各種各樣的神經網絡結構.目前常用的神經網絡結構有以下三種:
前饋網絡
前饋網絡中各個神經元按接收信息的先后分為不同的組.每一組可以看作一個神經層.每一層中的神經元接收前一層神經元的輸出,並輸出到下一層神經元.整個網絡中的信息是朝一個方向傳播,沒有反向的信息傳播,可以用一個有向無環路圖表示.前饋網絡包括全連接前饋網絡和卷積神經網絡等.前饋網絡可以看作一個函數,通過簡單非線性函數的多次復合,實現輸入空間到輸出空間的復雜映射.這種網絡結構簡單,易於實現.
記憶網絡
記憶網絡,也稱為反饋網絡,網絡中的神經元不但可以接收其他神經元的信息,也可以接收自己的歷史信息.和前饋網絡相比,記憶網絡中的神經元具有記憶功能,在不同的時刻具有不同的狀態.記憶神經網絡中的信息傳播可以是單向或雙向傳遞,因此可用一個有向循環圖或無向圖來表示.記憶網絡包括循環神經網絡、Hopfield 網絡、玻爾茲曼機、受限玻爾茲曼機等.記憶網絡可以看作一個程序,具有更強的計算和記憶能力.為了增強記憶網絡的記憶容量,可以引入外部記憶單元和讀寫機制,用來保存一些網絡的中間狀態,稱為記憶增強神經網絡(Memory Augmented NeuralNetwork,MANN),比如神經圖靈機和記憶網絡等.
圖網絡
前饋網絡和記憶網絡的輸入都可以表示為向量或向量序列.但實際應用中很多數據是圖結構的數據,比如知識圖譜、社交網絡、分子(Molecular )網絡等.前饋網絡和記憶網絡很難處理圖結構的數據.圖網絡是定義在圖結構數據上的神經網絡(第6.8節).圖中每個節點都由一個或一組神經元構成.節點之間的連接可以是有向的,也可以是無向的.每個節點可以收到來自相鄰節點或自身的信息.圖網絡是前饋網絡和記憶網絡的泛化,包含很多不同的實現方式,比如 圖卷積網絡(Graph Convolutional Network,GCN)[Kipf et al., 2016]、圖注意力網絡(Graph Attention Network,GAT)、消息傳遞神經網絡(Message Passing Neural Network,MPNN)等.
圖給出了前饋網絡、記憶網絡和圖網絡的網絡結構示例,其中圓形節點表示一個神經元,方形節點表示一組神經元.
前饋神經網絡
在前饋神經網絡中,各神經元分別屬於不同的層.每一層的神經元可以接收前一層神經元的信號,並產生信號輸出到下一層.第0層稱為輸入層,最后一層稱為輸出層,其他中間層稱為隱藏層.整個網絡中無反饋,信號從輸入層向輸出層單向傳播,可用一個有向無環圖表示.
描述前饋神經網絡的記號
令𝒂(0) = 𝒙,前饋神經網絡通過不斷迭代下面公式進行信息傳播:
首先根據第𝑙−1層神經元的活性值(Activation)𝒂(𝑙−1) 計算出第𝑙層神經元的凈活性值(Net Activation)𝒛(𝑙),然后經過一個激活函數得到第 𝑙 層神經元的活性值.因此,我們也可以把每個神經層看作一個仿射變換(Affine Transformation)和一個非線性變換.
這樣,前饋神經網絡可以通過逐層的信息傳遞,得到網絡最后的輸出 𝒂(𝐿).整個網絡可以看作一個復合函數𝜙(𝒙;𝑾, 𝒃),將向量𝒙作為第1層的輸入𝒂(0),將第𝐿層的輸出𝒂(𝐿) 作為整個函數的輸出.
通用近似定理
通用近似定理指的是:如果一個前饋神經網絡具有線性輸出層和至少一層隱藏層,只要給予網絡足夠數量的神經元,便可以實現以足夠高精度來逼近任意一個在 ℝn 的緊子集 (Compact subset) 上的連續函數。
所謂“擠壓”性質的函數是指像 Sigmoid函數的有界函數,但神經網絡的通用近似性質也被證明對於其他類型的激活函 數,比如ReLU也都是適用的.
通用近似定理只是說明了神經網絡的計算能力可以去近似一個給定的連續函數,但並沒有給出如何找到這樣一個網絡,以及是否是最優的.此外,當應用到機器學習時,真實的映射函數並不知道,一般是通過經驗風險最小化和正則化來進行參數學習.因為神經網絡的強大能力,反而容易在訓練集上過擬合
應用到機器學習
多層前饋神經網絡也可以看成是一種特征轉換方法,其輸出𝜙(𝒙)作為分類器的輸入進行分類.特別地,如果分類器𝑔(⋅)為Logistic回歸分類器或Softmax回歸分類器,那么𝑔(⋅)也可以看成是網絡的最后一層,即神經網絡直接輸出不同類別的條件概率𝑝(𝑦|𝒙).
- 對於二分類問題𝑦∈{0,1},並采用Logistic回歸,那么 Logistic 回歸分類器可以看成神經網絡的最后一層.也就是說,網絡的最后一層只用一個神經元,並且其激活函數為Logistic函數.網絡的輸出可以直接作為類別𝑦=1的條件概率,
- 對於多分類問題𝑦∈{1,⋯,𝐶},如果使用Softmax回歸分類器,相當於網絡最后一層設置𝐶個神經元,其激活函數為Softmax函數.網絡最后一層(第𝐿層)的輸出可以作為每個類的條件概率
參數學習
給定訓練集為𝒟 = {(𝒙(𝑛), 𝑦(𝑛))}𝑁𝑛=1,將每個樣本𝒙(𝑛) 輸入給前饋神經網絡,得到網絡輸出為𝒚̂(𝑛),其在數據集𝒟 上的結構化風險函數為
有了學習准則和訓練樣本,網絡參數可以通過梯度下降法來進行學習.在梯度下降方法的每次迭代中,第𝑙 層的參數𝑾(𝑙) 和𝒃(𝑙) 參數更新方式為
其中𝛼為學習率.
梯度下降法需要計算損失函數對參數的偏導數,如果通過鏈式法則逐一對每個參數進行求偏導比較低效.在神經網絡的訓練中經常使用反向傳播算法來高效地計算梯度.
反向傳播算法
前面的神經網絡,就是用很多個感知機(這樣算起來比較快)組成一組神經元,不同的神經元組組合在一起就形成了神經網絡,我們把訓練數據帶入,不斷的對我們的初始參數進行優化,就是學習過程,這里的訓練參數w和b,w代表權重,b代表偏差,偏差可以調整激活閾值。而調整參數的方法就是梯度下降。
反向傳播的本質就是我們前饋方法傳播一輪后,到最后的輸出項的准確率相對於我們的計算復雜程度性價比沒有那么高,所以我們要盡可能的榨干我們手上所擁有的數據價值,所以第一輪傳播完,還要根據真實值,把第一輪調整好的結果和真實值再做一個損失函數,對這個損失函數進行梯度下降,反過來從最后一層再調整一波一直到第一層的參數(當然也是利用梯度下降),這種方法就是反向傳播,這里我要感謝一下這個視頻,講的太好了,通俗易懂,清晰明了,之前看過他的線代的本質沒想到還涉足了神經網絡,活菩薩啊屬於是: https://www.bilibili.com/video/BV16x411V7Qg?spm_id_from=333.337.search-card.all.click
下面給出書中更為詳實(但理解起來不太友好的解釋)
反向傳播算法的含義是:第 𝑙 層的一個神經元的誤差項(或敏感性)是所有與該神經元相連的第 𝑙 + 1 層的神經元的誤差項的權重和.然后,再乘上該神經元激活函數的梯度,因此,使用誤差反向傳播算法的前饋神經網絡訓練過程可以分為以下三步:
- 前饋計算每一層的凈輸入𝒛(𝑙) 和激活值𝒂(𝑙),直到最后一層;
- 反向傳播計算每一層的誤差項𝛿(𝑙);
- 計算每一層參數的偏導數,並更新參數.
下面給出使用反向傳播算法的隨機梯度下降訓練過程
自動梯度計算
神經網絡的參數主要通過梯度下降來進行優化.當確定了風險函數以及網絡結構后,我們就可以手動用鏈式法則來計算風險函數對每個參數的梯度,並用代碼進行實現.但是手動求導並轉換為計算機程序的過程非常瑣碎並容易出錯,導致實現神經網絡變得十分低效.實際上,參數的梯度可以讓計算機來自動計算.目前,主流的深度學習框架都包含了自動梯度計算的功能,即我們可以只考慮網絡結構並用代碼實現,其梯度可以自動進行計算,無須人工干預,這樣可以大幅提高開發效率.自動計算梯度的方法可以分為以下三類:數值微分、符號微分和自動微分.
由於這一部分內容對我目前而言並無太大的實際意義,主要是講述了計算機怎么求導求梯度,所以簡單了解一下,不做深究
優化問題
神經網絡的參數學習比線性模型要更加困難,主要原因有兩點
- 非凸優化問題
- 梯度消失問題
非凸優化問題
神經網絡的優化問題是一個非凸優化問題。以一個最簡單的1-1-1結構的兩層神經網絡為例
分別使用平方誤差損失和交叉熵損失,損失函數與參數𝑤1和𝑤2的關系如圖所示,可以看出兩種損失函數都是關於參數的非凸函數.
梯度消失問題
誤差從輸出層反向傳播時,在每一層都要乘以該層的激活函數的導數.當我們使用Sigmoid型函數:Logistic函數𝜎(𝑥)或Tanh函數時,Sigmoid型函數的導數的值域都小於或等於1,如圖
由於Sigmoid型函數的飽和性,飽和區的導數更是接近於 0.這樣,誤差經過每一層傳遞都會不斷衰減.當網絡層數很深時,梯度就會不停衰減,甚至消失,使得整個網絡很難訓練.這就是所謂的梯度消失問題(Vanishing GradientProblem),也稱為梯度彌散問題.
在深度神經網絡中,減輕梯度消失問題的方法有很多種.一種簡單有效的方式是使用導數比較大的激活函數,比如ReLU等.
注意:飽和的意思通過查閱得知,就是一個函數的導數如果趨近於0,我就把這個函數稱為飽和函數,導數如果向左趨近於0就稱之為左趨近,反之就是右趨近
- 課后題:梯度消失問題是否可以通過增加學習率來緩解
對此我的解釋是:有一定效果,但不完全有效,因為梯度消失的本質是你函數設計導致導數容易偏低,多次累乘后導致消失,如果一開始把梯度強行拉大,也不能改變函數拉跨的本質,屬於治標不治本
小結
前饋神經網絡作為一種能力很強的非線性模型,其能力可以由通用近似定理來保證.前饋神經網絡在20世紀80年代后期就已被廣泛使用,但是大部分都采用兩層網絡結構(即一個隱藏層和一個輸出層),神經元的激活函數基本上都是Sigmoid型函數,並且使用的損失函數也大多數是平方損失.雖然當時前饋神經網絡的參數學習依然有很多難點,但其作為一種連接主義的典型模型,標志人工智能從高度符號化的知識期向低符號化的學習期開始轉變.
我的銳評:確實難