1. 程式人生 > >深度學習——線性單元和梯度下降

深度學習——線性單元和梯度下降

每次 總結 只知道 指向 預測 模型 pre 叠代 $$

機器學習的一些基本概念,模型、目標函數、優化算法等等,這些概念對於機器學習算法來說都是通用的套路。

線性單元

  當我們面對的數據不是線性可分的時候,感知器規則就無法收斂,為了解決這個問題,我們使用一個可導的線性函數來替代感知器的階躍函數,這種感知器就叫做線性單元。線性單元在面對線性不可分的數據集的時候,會收斂到一個最佳的近似上。

  線性單元將返回一個實數值而不是0,1分類,因此線性單元用來解決回歸問題而不是分類問題。

線性模型

  模型:實際上就是根據輸入x預測輸出y的算法。$y=h(x)=w*x_i+b$,$h(x)$函數叫做假設,w和b叫做參數。$x_i$稱為特征。

$y=h(x)=\mathrm{w}^T\mathrm{x}\qquad\qquad(式1)$稱為線性模型,

監督學習和無監督學習

有監督學習:為了訓練一個模型,我們要提供一堆訓練樣本:每個訓練樣本既包括輸入特征x,也包括對應的輸出y(標記),讓模型既看到輸入特征x,也看到對應標記y。當模型看到足夠多的樣本之後,它就能總結出其中的一些規律。然後,就可以預測那些它沒看過的輸入所對應的答案了。

無監督學習:這種方法的訓練樣本只知道輸入特征x,沒有輸出標記。

梯度下降算法

梯度是一個向量:指向函數上升最快的方向。梯度的反方向就是梯度下降的最快的方向。

梯度下降算法的公式$$\mathrm{x}_{new}=\mathrm{x}_{old}-\eta\nabla{f(x)}$$

其中,$\nabla$是梯度算子

,$\nabla{f(x)}$就是指$f(x)$的梯度。$\eta$是步長,也稱作學習速率

我們拿線性模型的目標函數來說:$$E(\mathrm{w})=\frac{1}{2}\sum_{i=1}^{n}(\mathrm{y^{(i)}-\bar{y}^{(i)}})^2$$

梯度下降算法可以完成$$\mathrm{w}_{new}=\mathrm{w}_{old}-\eta\nabla{E(\mathrm{w})}$$

如果我們要求目標函數的最大值,我們可以使用梯度上升算法,$$\mathrm{w}_{new}=\mathrm{w}_{old}+\eta\nabla{E(\mathrm{w})}$$

我們通過求$\nabla{E}(\mathrm{w})$帶入上式,就能得到線性單元的參數修改規則。

$\nabla{E}(\mathrm{w})$的推導

關於w的偏導數

$$\begin{align}
\nabla{E(\mathrm{w})}&=\frac{\partial}{\partial\mathrm{w}}E(\mathrm{w})\\
&=\frac{\partial}{\partial\mathrm{w}}\frac{1}{2}\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})^2\\
&=\frac{1}{2}\sum_{i=1}^{n}\frac{\partial}{\partial\mathrm{w}}(y^{(i)}-\bar{y}^{(i)})^2\\
\end{align}$$

$$\begin{align}
&\frac{\partial}{\partial\mathrm{w}}(y^{(i)}-\bar{y}^{(i)})^2\\
=&\frac{\partial}{\partial\mathrm{w}}(y^{(i)2}-2\bar{y}^{(i)}y^{(i)}+\bar{y}^{(i)2})\\
\end{align}$$

$y$是與$w$無關的參數,而$\bar{y}=\mathrm{w}^T\mathrm{x}$,下面我們用復合函數求導法

$$\frac{\partial{E(\mathrm{w})}}{\partial\mathrm{w}}=\frac{\partial{E(\bar{y})}}{\partial\bar{y}}\frac{\partial{\bar{y}}}{\partial\mathrm{w}}$$

分別計算上式等號右邊的兩個偏導數

$$\begin{align}
\frac{\partial{E(\mathrm{w})}}{\partial\bar{y}}=
&\frac{\partial}{\partial\bar{y}}(y^{(i)2}-2\bar{y}^{(i)}y^{(i)}+\bar{y}^{(i)2})\\
=&-2y^{(i)}+2\bar{y}^{(i)}\\\\
\frac{\partial{\bar{y}}}{\partial\mathrm{w}}=
&\frac{\partial}{\partial\mathrm{w}}\mathrm{w}^T\mathrm{x}\\
=&\mathrm{x}
\end{align}$$

代入,我們求得$\sum$裏面的偏導數是

$$\begin{align}
&\frac{\partial}{\partial\mathrm{w}}(y^{(i)}-\bar{y}^{(i)})^2\\
=&2(-y^{(i)}+\bar{y}^{(i)})\mathrm{x}
\end{align}$$

最後代入$\nabla{E}(\mathrm{w})$,求得

$$\begin{align}
\nabla{E(\mathrm{w})}&=\frac{1}{2}\sum_{i=1}^{n}\frac{\partial}{\partial\mathrm{w}}(y^{(i)}-\bar{y}^{(i)})^2\\
&=\frac{1}{2}\sum_{i=1}^{n}2(-y^{(i)}+\bar{y}^{(i)})\mathrm{x}\\
&=-\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})\mathrm{x}
\end{align}$$

經過推導,目標函數$E(w)$的梯度是$$\nabla{E(\mathrm{w})}=-\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})\mathrm{x}^{(i)}$$

所以線性單元的參數修改規則最後是這個樣子

$$\nabla{E(\mathrm{w})}=-\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})\mathrm{x}^{(i)}$$

有了上面的式子,我們就能寫出訓練線性單元的代碼

$$\begin{bmatrix}
w_0 \\
w_1 \\
w_2 \\
... \\
w_m \\
\end{bmatrix}_{new}=
\begin{bmatrix}
w_0 \\
w_1 \\
w_2 \\
... \\
w_m \\
\end{bmatrix}_{old}+\eta\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})
\begin{bmatrix}
1 \\
x_1^{(i)} \\
x_2^{(i)} \\
... \\
x_m^{(i)} \\
\end{bmatrix}$$

隨機梯度下降算法(Stochastic Gradient Descent,SGD)

如果我們每次更新w的叠代,要遍歷訓練數據中所有的樣本進行計算,我們稱這種算法叫做批梯度下降(Batch Gradient Descent),如果我們數據樣本非常大達到了上百萬億,就需要用SGD算法,在SGD算法中,每次更新w的叠代,只計算一個樣本,這樣對於一個具有數百萬樣本的訓練數據,完成一次遍歷就會對更新數百萬次,效率大大提升。由於樣本的噪音和隨機性,每次更新$w$並不一定按照$E$減少的方向。然而,雖然存在一定隨機性,大量的更新總體上沿著$E$減少的方向前進的,因此最後也能收斂到最小值附近。

$\mathrm{w}_{new}=\mathrm{w}_{old}+\eta\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})\mathrm{x}^{(i)}\qquad\qquad(式3)$

深度學習——線性單元和梯度下降