第2章 神經網絡基礎
2.1 機器學習基本概念
2.1.1 機器學習的分類
機器學習有以下幾種常見的分類方法:
- 根據訓練數據是否有標簽可分為:
- 監督學習:訓練數據中每個樣本都有標簽,通過標簽指導模型進行訓練
- 無監督學習:訓練數據完全沒有標簽,算法從數據中發現約束關系,如數據之間的關聯等,典型的無監督算法有如聚類算法
- 半監督學習:訓練數據又有有標簽數據,又有無標簽數據(GNN划時代的論文GCN的模型就是半監督的)
- 從算法輸出的形式上可分為:
- 分類問題:模型輸出離散值
- 回歸問題:模型輸出連續值
2.1.2 機器學習的流程
機器學習的流程可以簡單概括為:提取特征-->建立模型-->確定損失函數和進行優化求解。
提取特征這一步沒什么好說的,如果用的是經典的數據集那么特征都是被提取好的,如果要自己提取特定數據的特征那就要具體問題具體分析了。
建立模型這一步,書中介紹傳統的機器學習模型有邏輯回歸、隨機森林等(話說我之前一直以為這些就算是分類器還算不上機器學習來着...);而深度學習的方法有多層感知機(MLP),卷積網絡等。模型可以看做是一個函數\(Y=f(X;W)\),函數建立了特征X到標簽Y到映射,而W則是模型中的參數。
確定損失函數才能評估一個模型的好壞,可以通過損失函數的值來優化模型。在2.1.3中介紹了一些常見的損失函數。
我們接着對流程中的后兩步進行細致一點的說明,假設現在有訓練集有N個樣本,有\(X=\{(x_i, y_i)|i=1,2,...,N\}\),分別為樣本特診及其對應的標簽,特征\(x_i\in R^d\),標簽\(y_i\in Y=\{0,1,...,K\}\)是離散的。模型就是要給出\(f:R^d\to R^K\)這樣的映射,最后的輸出在每個類別上有一個概率\(P(Y|x_i)=f(x_i;\theta)\),我們要取的就是最大的概率值作為最后模型給出的標簽\(y_i^*=argmax(P(Y|x_i))\),\(argmax\)取到的最大的參數就是最大的概率值。
那么我們前面提到了該如何評估一個模型的好壞,就是要評價我們得到的預測和真實值的差異,即\(y_i\)和\(y_i^*\)之間的差異,而且我們需要一個可以量化的方法,這個方法就是定義一個損失函數(Loss Function)。通常用\(L(y,f(x;\theta))\)表示,通過最小化損失函數訓練模型就是優化求解的過程,可以表示為\(\theta^*=argmin[\frac{1}{N}\Sigma^N_{i=1}L(y_i,f(x_i;\theta))+\lambda\Phi(\theta)]\),期中均值函數表示的經驗風險函數,L表示的是損失函數,\(\Phi\)表示的是正則化項(regularizer)或者懲罰項(penalty term),可以是L1或L2以及其他正則函數。總之過程就是在尋找是的目標函數最小的\(\theta\)值。
這個過程當然不是一蹴而就的,在訓練過程中可能要迭代訓練非常多輪直到損失不再變化,這時就稱模型已經收斂。這一過程還有兩個隱患,一個是訓練過程一直用的是訓練集,模型可能過擬合,變得只認識訓練集而不認識測試集;也可能欠擬合,無論如何也無法在訓練集上收斂。
2.1.3 常見損失函數
- 平方損失函數:\(L(y,f(x,\theta))=\frac{1}{N}\Sigma^N_{i=1}(y_i-f(x_i;\theta))^2\),常用於回歸類問題
- 交叉熵函數:\(L(y,f(x))=H(p,q)=-\frac{1}{N}\Sigma^N_{i=1}p(y_i|x_i)log[q(\hat y_i|x_i)]\),p表示數據標簽的真實分布,q表示模型預測的分布,所以有\(p(y_i|x_i)\)就是數據的真實標簽。對於二分類問題交叉熵可以化為二元交叉熵:\(L(y,f(x))=-\frac{1}{N}\Sigma^N_{i=1}[y_ilogq(y_i=1|x_i)+(1-y_i)log(1-logq(y_i=1|x_i))]\)
2.1.4 梯度下降算法
原理
前面提到了訓練模型時需要最小化損失函數,那么這個最小化的過程也不是說小就小了,最常用的就是梯度下降算法。
考慮多元函數\(f(x)\)(帶入機器學習過程就是損失函數\(L\)),梯度就是對其中每個自變量的偏導數構成的向量,有\(f'(x)=\nabla f(x)=[\nabla f(x_1),...,\nabla f(x_n)]^T\),考慮\(f(x+\Delta x)=f(x)+f'(x)^T\Delta x+o(x)\)。
回顧我們的目標:最小化損失函數。那么就是想要\(f(x+\Delta x)<f(x)\),忽略泰勒展開中的高階項,就需要有\(f'(x)^T\Delta x<0\)。而又有\(f'(x)^T\Delta x=||f'(x)^T||·||\Delta x||·cos\theta\)。
向量的點積可以用二范數來表示,\(x^Ty=||x||·||y||·cos\theta\)。
我們取\(\Delta x=-\alpha f'(x)\)來保證每次更新都會使得原式越來越小。這里\(\alpha\)是一個超參數,就是學習率(代碼中常出現的\(lr\))。
所以梯度下降的過程就是先初始化參數,之后讓模型給出預測,計算損失函數,求導得到梯度,最后基於梯度更新,並不斷重復直到模型收斂。
隨機初始化參數:\(\{\theta_0^{(0)},...,\theta_0^{(k)}\}\),計算\(L_t=L(Y,f(X;\Theta_t))\),得到梯度\(\nabla \Theta_t=\frac{\partial L_t}{\partial \Theta_t}=\{\nabla \theta_t^{(0)},...,\nabla \theta_t^{(k)}\}\),並更新\(\Theta_{t+1}=\{\theta_t^{(0)}-\alpha \nabla \theta_t^{(0)},...,\theta_t^{(k)}-\alpha \nabla \theta_t^{(k)}\}\)。
隨機梯度下降算法
原理所說的梯度下降算法被稱作批梯度下降算法(BGD),其使用了全量的樣本進行計算。
使用單一樣本近似估計梯度的方法則被稱為隨機梯度下降(SGD)。具體來說,訓練時每次從訓練集中隨機選擇一個樣本,計算損失和梯度,進行參數更新。顯然其計算復雜度很低,但也有缺陷:雖然單一樣本的梯度對全體樣本的梯度是一個無偏估計,但仍然存在着偏差和不確定性,收斂速度會更慢。
改進的方法自然就是多選一些樣本(但仍然少於全體樣本),這樣的方法被稱作小批量隨機梯度下降(mini-batch SGD)。
2.2 神經網絡
2.2.1 神經元
基本神經元包括三個部分:輸入信號,線性組合和非線性激活函數。
\(z_i=\Sigma^m_{j=1}w_{ij}x_j\),這里\(x\)是輸入信號,\(w\)是神經元的權值,而\(z\)則是輸入信號的線性組合。
\(a_i=\sigma(z_i+b)\),這里\(\sigma\)是激活函數,\(b\)是偏置,\(a\)就是神經元的輸出信號。
2.2.2 多層感知器
單隱層感知器

對於如圖所示的感知器,計算過程可以表示為:\(f(x)=f_2(b^{(2)}+W^{(2)}(f_1(b^{(1)}+W^{(1)}x)))\)
感知器的信息傳遞
多層感知器MLP:

不同的就是有多個隱藏層,所以有更一般的MLP信息傳播公式:
\(z^{(l)}=W^{(l)}·a^{(l-1)}+b^{(l)},a^{(l)}=\sigma_l(z^{(l)})\)
每層網絡中,可訓練的是\(\{W^{(l)},b^{(l)}\}\)
2.3 激活函數
激活函數的非線性讓神經網絡可以逼近任何非線性函數,因為注意到神經網絡中會先進行線性組合,如果沒有非線性元素的引入,那么神經網絡最后的結果一定是線性的,表達能力有限。
2.3.1 S型激活函數
Sigmoid:\(\sigma(x)=\frac{1}{1+e^{-x}}\),常用於二分類器最后一層的激活函數
Tanh:\(tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\)

2.3.2 ReLU及其變種
ReLU:$ReLU(x)=\begin{cases} x&\text{if $$ x}\ge0 \ 0& \text{if $$ x < 0} \end{cases}$
輸入為負梯度為0,輸入為正梯度為1,單側抑制。可能會導致某個神經元“死亡”。
LeakyReLU:$LeakyReLU(x)=\begin{cases} x&\text{if $$ x}>0 \ \lambda x& \text{if $$ x} \le 0 \end{cases}$
\(\lambda\)是一個超參數用來避免神經元“死亡”。
PReLU則就是將LeakyReLU中的\(\lambda\)變為可訓練的參數。
ELU:$ELU(x)=\begin{cases} x&\text{if $$ x}\le0 \ \alpha(e^x)-1& \text{if $$ x} < 0 \end{cases}$
輸入為負時進行非線性變換,其中\(\alpha\)是一個超參數,可以調節梯度為0。

2.4 訓練神經網絡
2.4.1 神經網絡運行過程
- 前向傳播:給定輸入和參數,向前計算,得到模型預測結果
- 反向傳播:基於預測結果,計算損失函數,計算梯度
- 參數更新
2.4.2 反向傳播
對樣本\((x,y)\),前向傳播得到\(\hat y\),對應損失\(L(y, \hat y)\),參數矩陣梯度\(\nabla W^{(l)}=\frac{\partial L(y,\hat y)}{\partial W^{(l)}}\)。
根據鏈式法則展開參數矩陣梯度有\(\nabla W^{(l)}=\frac{\partial z^{(l)}}{\partial W^{(l)}}\frac{\partial L(y,\hat y)}{\partial z^{(l)}}\)。
定義\(\delta^{(l)}=\frac{\partial L(y,\hat y)}{\partial z^{(l)}}\)為誤差項,其衡量了\(z^{(l)}\)對損失的影響,可進一步展開得到\(\delta^{(l)}=\frac{\partial a^{(l)}}{\partial z^{(l)}}\frac{\partial z^{(l+1)}}{\partial a^{(l)}}\frac{\partial L(y,\hat y)}{\partial z^{(l+1)}}\)。
回想:\(z^{(l)}=W^{(l)}·a^{(l-1)}+b^{(l)},a^{(l)}=\sigma_l(z^{(l)})\)
可繼續變換得到:\(\delta^{(l)}=\sigma'(z^{(l)})\odot W^{(l+1)^T}\delta^{(l+1)}\),其中\(\odot\)是Hadamard積。
可以看到第\(l\)和第\(l+1\)層的誤差項是相關的,這也是為什么可以反向傳播。
(再后續的推導看的就更懵了,沒怎么給過程,讀了一些其他人的讀書筆記發現有人反應這里的推導有誤,參考了其他書籍的BP推導發現從一開始符號用的就不一樣,所以這部分就先不多寫了,等啃明白了BP再回來補。這里給一個個人認為寫的比較清晰的推導https://zhuanlan.zhihu.com/p/45190898,其實和書上的思路是一致的,就是書上的過程太簡略了...)
2.4.3 優化困境
梯度消失:Sigmoid和Tanh函數在逼近上下邊界的時候梯度會比較小,導致參數更新慢甚至不更新,模型難以訓練,稱為梯度消失
局部最優:損失函數和參數之間的關系是非凸的,在梯度下降的時候可能陷入局部最優