機器學習小社-3

講師 000

  • 你可以叫我 000 / Lucas

  • 建國中學資訊社37th學術長

  • 建國中學電子計算機研習社44th學術

  • 校際交流群創群者

  • 不會音遊不會競程不會數學的笨

  • 資訊技能樹亂點但都一樣爛

  • 專案爛尾大師

  • IZCC x SCINT x Ruby Taiwan 聯課負責人

講師 章魚

  • 建國中學電子計算機研習社44th學術+總務

  • 是的,我是總務。在座的你各位下次記得交社費束脩給我

  • 技能樹貧乏

  • 想拿機器學習做專題結果只學會使用API

  • 上屆社展烙跑到資訊社的叛徒

  • 科班墊神

殭屍沒那麼抱柑橘

四天連假得了MVP

  • 複習

  • 分類問題

  • 神經網路

  • 損失函數

  • 最佳化

  • 反向傳播

目錄

複習

\vec X
Y

感知機

Perceptron

\sigma( (\sum_{i=1}^{n} x_i \times w_i) +b)
\vec X
Y
= \sigma( \left[ \begin{matrix} x_{0} \\ x_{1} \\ \vdots \\ x_{n} \\ \end{matrix} \right] \cdot \left[ \begin{matrix} w_{0} & w_{1} \cdots w_{n} \end{matrix} \right] + b)
\vec X
Y
\sigma(\vec X \cdot \vec W + b) = Y
\vec X
Y
class Neuron:
    def __init__(self, w: np.ndarray, b: int) -> None:
        self.w = w
        self.b = b
      
    def forward(self, x) -> int:
        return relu(np.dot(x, self.w.T) + self.b)
#$%#*@)$!#)$%(#)$%

Neuron Code

Binary step / Sign

\sigma(x) = \begin{cases} 0 & \text{if $x$ $\lt$ 0 } \\ 1 & \text{if $x$ $\ge$ 0 } \\ \end{cases}

Sigmoid

\sigma(x) = \frac {1} {1+e^{-x}}

tanh

\sigma(x) = tanh(x) = \frac {e^{x} - e^{-x}} {e^{x} + e^{-x}}

ReLU

\sigma(x) = \begin{cases} 0 & \text{if $x$ $\le$ 0 } \\ x & \text{if $x$ $\gt$ 0 } \\ \end{cases}

ReLU

\sigma(x) = max(0, x)

Softmax

\sigma_{i} (\vec x) = \frac {e^{x_{i}}} {\sum\limits_{j=0}^{J} e^{x_{j}}}
e^x_0 + e^x_1 + ... + e^x_n = 1
\sigma(\vec X \cdot \vec W + b) = Y
\vec X
Y

以上就是我們知道的感知機

\sigma(\vec X \cdot \vec W + b) = Y
\vec X
Y

以上就是我們知道的感知機

一個感知機能變成的函數很有限

因此我們會將許多感知機結合

\sigma(\vec X \cdot \vec W + b) = Y
\vec X
Y

最常見的多重感知機應用便是神經網路

此時我們習慣將感知機稱為 Neuron(神經元)

分類問題

鳶尾花資料集

Iris Species dataset

透過花瓣跟萼片分辨鳶尾花種類

經典分類問題

輸入:花瓣長寬+花萼長寬(4項)

輸出:鳶尾花種類(3種)

山鳶尾(setosa)

雜色鳶尾(vesicolor)

維吉尼亞鳶尾(virginica)

二元分類

Binary Classification

輸出一個機率

山鳶尾(setosa) => 1

雜色鳶尾(vesicolor) => 0

\hat y = \sigma( \left[ \begin{matrix} x_{0} \\ x_{1} \\ x_{2} \\ x_{3} \\ \end{matrix} \right] \cdot \left[ \begin{matrix} w_{0} & w_{1} & w_{2} & w_{3} \end{matrix} \right] + b)

Activation Function

=> Sigmoid

Activation Function

=> Sigmoid

\(\hat y=\sigma(\vec X \cdot \vec W +b)\)

Loss Function

\(L = -\sum [y\ln (\hat y)+(1-y)\ln (1-\hat y)]\)

\(y\)是實際機率

\(\hat y\)是預估機率

Gradient Descent

\(\frac{\partial L}{\partial w_i}=\frac{\partial L}{\partial u}\frac{\partial u}{\partial w_i}\), \(u=x_i\times w_i+b\)

\(\frac{\partial L}{\partial u}=\frac{\partial L}{\partial \sigma(u)}\frac{\partial \sigma(u)}{\partial u}=\sum (\hat y-y)\)

\(\frac{\partial L}{\partial u}=\frac{\partial L}{\partial \hat y}\frac{\partial \hat y}{\partial u}\)

\(\frac{\partial L}{\partial u}=\frac{\partial L}{\partial \sigma (u)}\frac{\partial \sigma (u)}{\partial u}\)

Gradient Descent

\(\frac{\partial L}{\partial w_i}=\sum(\hat y_i-y_i)\times x_i\)

\(\frac{\partial L}{\partial w_i}=\sum(\hat y-y)\times\frac{\partial u}{\partial w_i}\), \(u=x_i\times w_i+b\)

\(\frac{\partial L}{\partial b}=\sum(\hat y-y)\times\frac{\partial u}{\partial b}\), \(u=x_i\times w_i+b\)

\(\frac{\partial L}{\partial b}=\sum(\hat y_i-y_i)\)

實作

id 花萼長 花萼寬 花瓣長 花瓣寬 品種
1 5.1 3.5 1.4 0.2 Iris-setosa
2 4.9 3.0 1.4 0.2 Iris-setosa
... ... ... ... ... ...
150 5.9 3.0 5.1 1.8 Iris-virginica

Iris Species dataset

setosa

versicolor

virginica

id

1~50

51~100

101~150

id 花萼長 花萼寬 花瓣長 花瓣寬 品種
1 5.1 3.5 1.4 0.2 Iris-setosa
2 4.9 3.0 1.4 0.2 Iris-setosa
... ... ... ... ... ...
100 5.7 2.8 4.1 1.3 Iris-versicolor

setosa

versicolor

id

1~50

51~100

data = data[ :100, : ]

id 花萼長 花萼寬 花瓣長 花瓣寬 Label
1 5.1 3.5 1.4 0.2 1
2 4.9 3.0 1.4 0.2 1
... ... ... ... ... ...
100 5.7 2.8 4.1 1.3 0

setosa => 1

versicolor => 0

id

1~50

51~100

Label

花萼長 花萼寬 花瓣長 花瓣寬 Label
5.1 3.5 1.4 0.2 1
4.9 3.0 1.4 0.2 1
... ... ... ... ...
5.7 2.8 4.1 1.3 0

setosa => 1

versicolor => 0

1~50

51~100

data = data[ :, 1: ]

花萼長 花萼寬 花瓣長 花瓣寬 Label
5.0 2.3 3.3 1.0 0
5.1 3.8 1.9 0.4 1
... ... ... ... ...
4.7 3.2 1.6 0.2 1

setosa => 1

versicolor => 0

np.random.shuffle(data)

y = data[:,4].reshape(-1,1)

花萼長 花萼寬
5.0 2.3
5.1 3.8
... ...
4.7 3.2
Label
0
1
...
1

x = data[:,0:2]

y = data[:,4].reshape(-1,1)

x = data[:,0:2]

x = \left[ \begin{matrix} x_{00}&x_{01}\\ x_{10}&x_{11}\\ \vdots&\vdots\\ x_{1000}&x_{1001}\\ \end{matrix} \right]
y = \left[ \begin{matrix} y_{0}\\ y_{1}\\ \vdots\\ y_{100}\\ \end{matrix} \right]

W = np.random.randn(2,1)

b = np.random.randn(1)

\left[ \begin{matrix} w_{0}\\ w_{1}\\ \end{matrix} \right]
\left[ \begin{matrix} b\\ \end{matrix} \right]

Sigmoid

\sigma(x) = \frac {1} {1+e^{-x}}

\(\hat y=\sigma(\vec X \cdot \vec W +b)\)

F(X)

Loss

\(-\sum [y\ln (\hat y)+(1-y)\ln (1-\hat y)]\)

\(\hat y=\sigma(\vec X \cdot \vec W +b)\)

F(X)

\left[ \begin{matrix} x_{00}&x_{01}\\ x_{10}&x_{11}\\ \vdots&\vdots\\ x_{1000}&x_{1001}\\ \end{matrix} \right] \left[ \begin{matrix} w_{0}\\ w_{1}\\ \end{matrix} \right] = \left[ \begin{matrix} x_{00}w_{0}+x_{01}w_{1}\\ x_{10}w_{0}+x_{11}w_{1}\\ \vdots\\ x_{1000}w_{0}+x_{1001}w_{1}\\ \end{matrix} \right]
\left[ \begin{matrix} x_{00}&x_{01}\\ x_{10}&x_{11}\\ \vdots&\vdots\\ x_{1000}&x_{1001}\\ \end{matrix} \right] \left[ \begin{matrix} w_{0}\\ w_{1}\\ \end{matrix} \right]

\(\hat y=\sigma(\vec X \cdot \vec W +b)\)

F(X)

\left[ \begin{matrix} x_{00}w_{0}+x_{01}w_{1}\\ x_{10}w_{0}+x_{11}w_{1}\\ \vdots\\ x_{1000}w_{0}+x_{1001}w_{1}\\ \end{matrix} \right] + \left[ \begin{matrix} b \end{matrix} \right]
\left[ \begin{matrix} x_{00}w_{0}+x_{01}w_{1}+b\\ x_{10}w_{0}+x_{11}w_{1}+b\\ \vdots\\ x_{1000}w_{0}+x_{1001}w_{1}+b\\ \end{matrix} \right]

\(\hat y=\sigma(\vec X \cdot \vec W +b)\)

F(X)

\sigma ( \left[ \begin{matrix} x_{00}w_{0}+x_{01}w_{1}+b\\ x_{10}w_{0}+x_{11}w_{1}+b\\ \vdots\\ x_{1000}w_{0}+x_{1001}w_{1}+b\\ \end{matrix} \right])
\left[ \begin{matrix} \sigma (x_{00}w_{0}+x_{01}w_{1}+b)\\ \sigma (x_{10}w_{0}+x_{11}w_{1}+b)\\ \vdots\\ \sigma (x_{1000}w_{0}+x_{1001}w_{1}+b)\\ \end{matrix} \right]

\(\hat y=\sigma(\vec X \cdot \vec W +b)\)

F(X)

\left[ \begin{matrix} y_{0}\\ y_{1}\\ \vdots\\ y_{100}\\ \end{matrix} \right] = \left[ \begin{matrix} \sigma (x_{00}w_{0}+x_{01}w_{1}+b)\\ \sigma (x_{10}w_{0}+x_{11}w_{1}+b)\\ \vdots\\ \sigma (x_{1000}w_{0}+x_{1001}w_{1}+b)\\ \end{matrix} \right]

Gradient Descent

\(\frac{\partial L}{\partial w_i}=\sum(\hat y_i-y_i)\times x_i\)

\(\frac{\partial L}{\partial b}=\sum(\hat y_i-y_i)\)

\(\frac{\partial L}{\partial w_i}=\sum(\hat y_i-y_i)\times x_i\)

\left[ \begin{matrix} \Delta w_{0}\\ \Delta w_{1}\\ \end{matrix} \right]

\(\frac{\partial L}{\partial w_i}=\sum(\hat y_i-y_i)\times x_i\)

x = \left[ \begin{matrix} x_{00}&x_{01}\\ x_{10}&x_{11}\\ \vdots&\vdots\\ x_{1000}&x_{1001}\\ \end{matrix} \right]

\(\frac{\partial L}{\partial w_i}=\sum(\hat y_i-y_i)\times x_i\)

x^T = \left[ \begin{matrix} x_{00}&x_{10}&\cdots &x_{1000}\\ x_{01}&x_{11}&\cdots &x_{1001}\\ \end{matrix} \right]

\(\frac{\partial L}{\partial w_i}=\sum(\hat y_i-y_i)\times x_i\)

\left[ \begin{matrix} \hat y_{0}\\ \hat y_{1}\\ \vdots\\ \hat y_{100}\\ \end{matrix} \right] - \left[ \begin{matrix} y_{0}\\ y_{1}\\ \vdots\\ y_{100}\\ \end{matrix} \right] = \left[ \begin{matrix} \hat y_{0}-y_{0}\\ \hat y_{1}-y_{1}\\ \vdots\\ \hat y_{100}-y_{100}\\ \end{matrix} \right]

\(\frac{\partial L}{\partial w_i}=\sum(\hat y_i-y_i)\times x_i\)

\left[ \begin{matrix} x_{00}&x_{10}&\cdots &x_{1000}\\ x_{01}&x_{11}&\cdots &x_{1001}\\ \end{matrix} \right] \left[ \begin{matrix} \hat y_{0}-y_{0}\\ \hat y_{1}-y_{1}\\ \vdots\\ \hat y_{100}-y_{100}\\ \end{matrix} \right]

\(\frac{\partial L}{\partial w_i}=\sum(\hat y_i-y_i)\times x_i\)

\left[ \begin{matrix} \Delta w_{0}\\ \Delta w_{1}\\ \end{matrix} \right] = \left[ \begin{matrix} \sum (\hat y_{i}-y_{i})\times x_{i0}\\ \sum (\hat y_{i}-y_{i})\times x_{i1}\\ \end{matrix} \right]

\(\frac{\partial L}{\partial b}=\sum(\hat y_i-y_i)\)

\left[ \begin{matrix} \hat y_{0}-y_{0}\\ \hat y_{1}-y_{1}\\ \vdots\\ \hat y_{100}-y_{100}\\ \end{matrix} \right]

np.sum

\left[ \begin{matrix} \hat y_{0}-y_{0}\\ +\\ \hat y_{1}-y_{1}\\ +\\ \vdots\\ +\\ \hat y_{100}-y_{100}\\ \end{matrix} \right]
[\Delta b] = \left[ \begin{matrix} \hat y_{0}-y_{0}\\ +\\ \hat y_{1}-y_{1}\\ +\\ \vdots\\ +\\ \hat y_{100}-y_{100}\\ \end{matrix} \right]

可視化

\(\hat y = w_0x_0+w_1x_1+b=0.5\)

\(w_0x_0+w_1x_1+b=0.5\)

\(w_1x_1=-w_0x_0+0.5-b\)

\(x_1=-\frac{w_0}{w_1}x_0+\frac{-b+0.5}{w_1}\)

神經網路

layer

\vec X
\vec Y

layer

\sigma(\vec X \cdot \vec W + \vec B) = \vec Y
\vec X
\vec Y
\vec X \cdot \vec W + \vec B
\sigma(\vec X \cdot \vec W + \vec B) = \vec Y
\vec X
\vec Y
= \left[ \begin{matrix} x_{0} \\ x_{1} \\ \vdots \\ x_{n} \\ \end{matrix} \right] \cdot \left[ \begin{matrix} w_{00} & w_{10} & \cdots & w_{m0}\\ w_{01} & w_{11} & \cdots & w_{m1}\\ \vdots & \vdots & \cdots & \vdots\\ w_{0n} & w_{1n} & \cdots & w_{mn}\\ \end{matrix} \right] + \left[ \begin{matrix} b_{0} \\ b_{1} \\ \vdots \\ b_{n} \\ \end{matrix} \right]
\sigma(\vec X \cdot \vec W + \vec B) = \vec Y
\vec X
\vec Y

Neural Network

#&#%(@$#@)*%

Neural Network

#&#%(@$#@)*%

Neural Network

#&#%(@$#@)*%
#&#%(@$#@)*%
#&#%(@$#@)*%

Input Layer

#&#%(@$#@)*%

Input Layer

Hidden Layer

#&#%(@$#@)*%

Input Layer

Hidden Layer

Output Layer

#&#%(@$#@)*%

Input Layer

Hidden Layer

Output Layer

#&#%(@$#@)*%
\vec X
\vec Y

Input Layer

Hidden Layer

Output Layer

#&#%(@$#@)*%
\vec X
\vec Y

我們的目的就是幫要解決的問題

找出一個完美的函式

使同一類問題的輸入都能夠得到正確的輸出

#&#%(@$#@)*%
\vec X
\vec Y

但是我要怎麼知道

每個神經元的參數應該要是多少呢?

我們的目的就是幫要解決的問題

找出一個完美的函式

使同一類問題的輸入都能夠得到正確的輸出

損失函數

\vec X
\vec Y
\vec X
\vec Y

如何讓他們成為應該成為這個

目標函式的正確參數?

很多的權重與偏移

\vec X
\vec Y

先隨便帶入任意數字

\vec X
\vec Y
\vec X
\vec Y
\text{將} \vec X帶入
\vec X
\vec Y
\vec X
\vec Y
\text{得到} \vec Y_{output}
\text{用} \vec Y_{output} 與 \vec Y_{ans} 計算Loss
再根據Loss去調整 \vec W, \vec B
\text{用} \vec Y_{output} 與 \vec Y_{ans} 計算Loss
再根據Loss去調整 \vec W, \vec B

而Loss Function就是用來

計算Loss的函式

Mean Absolute Error

\text{MAE} = \frac {1} {n} \sum_{i=1}^{n} |y_{i} - \hat y_{i} |

平均絕對值誤差

Mean Square Error

平均平方誤差 / 均方誤差

\text{MSE} = \frac {1} {n} \sum_{i=1}^{n} (y_{i} - \hat y_{i} )^2
\text{MAE}
\text{MSE}

交叉

Cross Entropy

-\sum_{i} \hat y_{i} \log_{2} y_{i}

交叉

Cross Entropy

為正確的數據

為輸出的數據

\hat y
y
-\sum_{i} \hat y_{i} \log_{2} y_{i}

Cross Entropy

交叉

我們先把算式簡化(適用於單一結果正確情況)

y = - \log_2 x

Cross Entropy

交叉

y = - \log_2 x
x=0.1 \text{ } y=3.3\\ x=0.5 \text{ } y=1.0\\ x=0.8 \text{ } y=0.32

我們先把算式簡化(適用於單一結果正確情況)

Cross Entropy

交叉

y = - \log_2 x
x=0.1 \text{ } y=3.3\\ x=0.5 \text{ } y=1.0\\ x=0.8 \text{ } y=0.32

代表著當x的比例越低 數值越高

我們先把算式簡化(適用於單一結果正確情況)

Cross Entropy

交叉

Cross Entropy

交叉

當預測值偏離1(正確)越遠,熵增加的越快

所以說我們要讓Loss越低越好

Cross Entropy

交叉

def cross_entropy(self, y_output: np.ndarray, y_label: np.ndarray) -> int:
    return -np.dot(y_label, np.log2(y_output))

交叉

得到了Loss之後

就可以準備來更新參數了

Cross Entropy

def cross_entropy(self, y_output: np.ndarray, y_label: np.ndarray) -> int:
    return -np.dot(y_label, np.log2(y_output))

最佳化

我們先將不同的W對應的Loss來作圖

我們先將不同的W對應的Loss來作圖

Loss

W

我們要做的就是找到圖中Loss最低點

並將W更新

Loss

W

我們要做的就是找到圖中Loss最低點

並將W更新

問題是要怎麼讓程式知道最低點呢?

Loss

W

直接把每個組合試過一遍

Loss

W

Loss

W

Loss

W

Loss

W

直接把每個組合試過一遍

各位競程大師用腳想都知道那個時間複雜度會爆炸

Loss

W

Loss

W

Loss

W

Loss

W

況且我們還不只一個參數

Gradient Descent

梯度下降

Gradient Descent

x^{t+1} = x^t - \gamma \nabla f(x^t)

梯度下降

Gradient Descent

x^{t+1} = x^t - \gamma \nabla f(x^t)

梯度下降

看起來很難懂

Gradient Descent

x^{t+1} = x^t - \gamma \nabla f(x^t)

梯度下降

看起來很難懂

直接上圖

Gradient Descent

梯度下降

Loss

W

Gradient Descent

梯度下降

Loss

W

目標點

Gradient Descent

梯度下降

Loss

W

起始點

Gradient Descent

梯度下降

Loss

W

起始點

對起始點做微分

Loss

W

對起始點做微分

從微分後得到的斜率就可以判斷低點是在左邊還是右邊

Loss

W

對起始點做微分

從微分後得到的斜率就可以判斷低點是在左邊還是右邊

Loss

W

對起始點做微分

從微分後得到的斜率就可以判斷低點是在左邊還是右邊

Loss

W

對起始點做微分

從微分後得到的斜率就可以判斷低點是在左邊還是右邊

並且向那個方向前進直到斜率=0

Loss

W

對起始點做微分

從微分後得到的斜率就可以判斷低點是在左邊還是右邊

並且向那個方向前進直到斜率=0

x^{t+1} = x^t - \gamma \nabla f(x^t)

但是我們的參數顯然不是只有一個

所以要對每個參數分別進行偏微分

x^{t+1} = x^t - \gamma \nabla f(x^t)
x^{t+1} = x^t - \gamma \nabla f(x^t)

下一次的位置

x^{t+1} = x^t - \gamma \nabla f(x^t)

下一次的位置

這次的位置

x^{t+1} = x^t - \gamma \nabla f(x^t)

下一次的位置

這次的位置

學習率

x^{t+1} = x^t - \gamma \nabla f(x^t)

下一次的位置

這次的位置

學習率

偏微分

梯度下降會產生的問題

x^{t+1} = x^t - \gamma \nabla f(x^t)

Plateaus

Exploding Gradients

Saddle Points

Local Minima

Oscillations

Vanishing Gradients

Local Minima

局部最小值

有機率找到的不是全域最小值

而是局部最小值

Saddle Points

鞍點

長得像鞍一樣的形狀

若是結果趨近於這種形狀

將會產生其中一軸最低點

=另一軸最高點

在梯度下降時便會容易卡在裡面

Plateaus

高原 (?

如果一部份的路徑過於平緩可能會

導致梯度下降的速度變很慢

Oscillations

震盪

當學習率過高時有可能一直卡在一個谷中找不到最低點

Vanishing Gradients

梯度消失

反向傳播時重複對梯度做微分後的activation function

有時候會造成梯度快速減少最終消失

x^{t+1} = x^t - \gamma \nabla f(x^t)

舉個例子

Sigmoid在微分過後函數落在[1/4, 0]之區間

若重複進行便有可能會使梯度趨近於0

Sigmoid

藍線: 原

紅線: 微分後

Exploding Gradients

梯度爆炸

Exploding Gradients

梯度爆炸

同理於梯度消失

當梯度不斷變大之後會發生超過程式上限的狀況

最終會導致bug

各種優化型

Momentum

x^{(t+1)} = x^{(t)} - v^{(t)} \\ g^{(t)} = \nabla f(x^{(t)})
v^{(t)} = \begin{cases} \gamma g^{(t)} & \text{if $t$ = 0 } \\ \beta v^{(t-1)} + \gamma g^{(t)} & \text{if $t$ $\ge$ 1 } \\ \end{cases}

Momentum

這種優化方式會讓每次梯度下降時

只要與之前的更新方向相同便加快速度(v)

反之減慢速度(v)

x^{(t+1)} = x^{(t)} - v^{(t)} \\ g^{(t)} = \nabla f(x^{(t)})
v^{(t)} = \begin{cases} \gamma g^{(t)} & \text{if $t$ = 0 } \\ \beta v^{(t-1)} + \gamma g^{(t)} & \text{if $t$ $\ge$ 1 } \\ \end{cases}

Momentum

x^{(t+1)} = x^{(t)} - v^{(t)} \\ g^{(t)} = \nabla f(x^{(t)})

第一次操作與一般梯度下降相同

v^{(t)} = \begin{cases} \gamma g^{(t)} & \text{if $t$ = 0 } \\ \beta v^{(t-1)} + \gamma g^{(t)} & \text{if $t$ $\ge$ 1 } \\ \end{cases}

Momentum

之後的操作則會以前一次的速度乘上

運動量阻力係數(   ) ※這東西小於等於1

再拿去跟前一次的梯度做差

\beta
x^{(t+1)} = x^{(t)} - v^{(t)} \\ g^{(t)} = \nabla f(x^{(t)})
v^{(t)} = \begin{cases} \gamma g^{(t)} & \text{if $t$ = 0 } \\ \beta v^{(t-1)} + \gamma g^{(t)} & \text{if $t$ $\ge$ 1 } \\ \end{cases}

Adagrad

x^{(t+1)} = x^{(t)} - \frac{\gamma^{(t)}}{\sqrt{\sum^t_{i=0} (g^{(i)})^2 + \varepsilon}} g^{(t)}
\gamma^{(t)} = \frac{\gamma}{\sqrt{t+1}}
g^{(t)} = \nabla f(x^{(t)})

Adagrad

這種優化方式會讓學習率隨著梯度去進行調整

x^{(t+1)} = x^{(t)} - \frac{\gamma^{(t)}}{\sqrt{\sum^t_{i=0} (g^{(i)})^2 + \varepsilon}} g^{(t)}
\gamma^{(t)} = \frac{\gamma}{\sqrt{t+1}}
g^{(t)} = \nabla f(x^{(t)})

Adagrad

      僅是一個極小的數

用以防止分母為0無法計算

\varepsilon

x^{(t+1)} = x^{(t)} - \frac{\gamma^{(t)}}{\sqrt{\sum^t_{i=0} (g^{(i)})^2 + \varepsilon}} g^{(t)}
\gamma^{(t)} = \frac{\gamma}{\sqrt{t+1}}
g^{(t)} = \nabla f(x^{(t)})

Adagrad

對過去時間點的所有梯度做平方和後開根號

可得到過去梯度的大致數值

而拿當前時間點的梯度除以過去時間點的梯度

便可得知當前時間點的梯度與過去的偏差

x^{(t+1)} = x^{(t)} - \frac{\gamma^{(t)}}{\sqrt{\sum^t_{i=0} (g^{(i)})^2 + \varepsilon}} g^{(t)}
\gamma^{(t)} = \frac{\gamma}{\sqrt{t+1}}
g^{(t)} = \nabla f(x^{(t)})

Adagrad

有點難理解?

沒關係 直接上圖!

x^{(t+1)} = x^{(t)} - \frac{\gamma^{(t)}}{\sqrt{\sum^t_{i=0} (g^{(i)})^2 + \varepsilon}} g^{(t)}
\gamma^{(t)} = \frac{\gamma}{\sqrt{t+1}}
g^{(t)} = \nabla f(x^{(t)})

Adagrad

Adagrad

總而言之就是如果這次的梯度特別大/小

這次的學習率便提升/降低

 

反之如果梯度差異不大

學習率便隨著更新次數降低

x^{(t+1)} = x^{(t)} - \frac{\gamma^{(t)}}{\sqrt{\sum^t_{i=0} (g^{(i)})^2 + \varepsilon}} g^{(t)}
\gamma^{(t)} = \frac{\gamma}{\sqrt{t+1}}
g^{(t)} = \nabla f(x^{(t)})

Adam

m^{(t)} = \beta_1 m^{(t-1)} + (1 - \beta_1) g^{(t)}
\hat m^{(t)} = \frac{m^{(t)}}{1 - \beta_1^t}
\hat v^{(t)} = \frac{v^{(t)}}{1 - \beta_2^t}
x_i^{(t+1)} = x_i^{(t)} - \frac{\gamma}{\sqrt{\hat v^{(t)} + \varepsilon}} \hat m^{(t)}
v^{(t)} = \beta_2 v^{(t-1)} + (1 - \beta_2) (g^{(t)})^2

Adam

m^{(t)} = \beta_1 m^{(t-1)} + (1 - \beta_1) g^{(t)}
\hat m^{(t)} = \frac{m^{(t)}}{1 - \beta_1^t}
\hat v^{(t)} = \frac{v^{(t)}}{1 - \beta_2^t}
x_i^{(t+1)} = x_i^{(t)} - \frac{\gamma}{\sqrt{\hat v^{(t)} + \varepsilon}} \hat m^{(t)}
v^{(t)} = \beta_2 v^{(t-1)} + (1 - \beta_2) (g^{(t)})^2

是不是覺得有點眼熟呢?

Adam

m^{(t)} = \beta_1 m^{(t-1)} + (1 - \beta_1) g^{(t)}
\hat m^{(t)} = \frac{m^{(t)}}{1 - \beta_1^t}
\hat v^{(t)} = \frac{v^{(t)}}{1 - \beta_2^t}
x_i^{(t+1)} = x_i^{(t)} - \frac{\gamma}{\sqrt{\hat v^{(t)} + \varepsilon}} \hat m^{(t)}
v^{(t)} = \beta_2 v^{(t-1)} + (1 - \beta_2) (g^{(t)})^2

沒錯!!! Adam其實就是融合了上面2種優化型而誕生的東西

Adam

m^{(t)} = \beta_1 m^{(t-1)} + (1 - \beta_1) g^{(t)}
\hat m^{(t)} = \frac{m^{(t)}}{1 - \beta_1^t}
\hat v^{(t)} = \frac{v^{(t)}}{1 - \beta_2^t}
x_i^{(t+1)} = x_i^{(t)} - \frac{\gamma}{\sqrt{\hat v^{(t)} + \varepsilon}} \hat m^{(t)}
v^{(t)} = \beta_2 v^{(t-1)} + (1 - \beta_2) (g^{(t)})^2

同時也是目前使用率最高的Optimizer

反向傳播

先來固定等一下用的符號

z^{(n)}_0
z^{(n)}_1
z^{(n)}_2
z^{(n-1)}_0
z^{(n-1)}_1
\hat y
L

以z表示該神經元過激勵函數前的輸出

以y表示神經網路的輸出

以L表示Loss

w_{i}^{(n)}(grad)

先來假設現在要求某個w的梯度

Loss

W

w_{i}^{(n)}(grad) = \frac{\partial L}{\partial w_i^{(n)}}
\frac{\partial L}{\partial w_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial w_i^{(n)}}

該w的梯度為在整個產生Loss的函式中對w微分的結果

w_{i}^{(n)}(grad) = \frac{\partial L}{\partial w_i^{(n)}}
\frac{\partial L}{\partial w_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial w_i^{(n)}}

該w的梯度為在整個產生Loss的函式中對w微分的結果

我們先來求在該神經元中對w微分

->

\hat y

->

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2

->

\hat y

->

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2
w_0

->

\hat y

->

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2
w_0
w_1
\frac{\partial z_0^{(1)}}{\partial w_0} = a_0^{(0)}
z_0^{(1)} = w_0a_0^{(0)} + w_1a_1^{(0)} + b
\frac{\partial z_0^{(1)}}{\partial w_1} = a_1^{(0)}
a_0^{(0)} = \sigma(z_0^{(0)})
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2
w_0
a_0^{(0)}
a_1^{(0)}
w_1

這邊的算式可得知欲求之值之後其實就是前一項的a

(a亦為乘上權重前的參數)

w_{i}^{(n)}(grad) = \frac{\partial L}{\partial w_i^{(n)}}
\frac{\partial L}{\partial w_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial w_i^{(n)}}

回到這一頁

w_{i}^{(n)}(grad) = \frac{\partial L}{\partial w_i^{(n)}}
\frac{\partial L}{\partial w_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial w_i^{(n)}}

接下來求整個函式中對該神經元的微分

\frac{\partial L}{\partial z_0^{(0)}} = \frac{\partial a}{\partial z_0^{(0)}} \frac{\partial L}{\partial a}
w_0
w_1
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
a
\frac{\partial L}{\partial z_0^{(0)}} = \sigma^{\prime}(z_0^{(0)}) \frac{\partial L}{\partial a}
w_0
w_1
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
a
\frac{\partial L}{\partial z_0^{(0)}} = \sigma^{\prime}(z_0^{(0)}) ( \frac{\partial z_0^{(1)}}{\partial a} \frac{\partial L}{\partial z_0^{(1)}} + \frac{\partial z_1^{(1)}}{\partial a} \frac{\partial L}{\partial z_1^{(1)}} )
w_0
w_1
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
a
\frac{\partial L}{\partial z_0^{(0)}} = \sigma^{\prime}(z_0^{(0)}) ( w_0 \frac{\partial L}{\partial z_0^{(1)}} + w_1 \frac{\partial L}{\partial z_1^{(1)}} )
w_0
w_1
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
a
\frac{\partial L}{\partial z_0^{(0)}} = \sigma^{\prime}(z_0^{(0)}) ( w_0 \frac{\partial L}{\partial z_0^{(1)}} + w_1 \frac{\partial L}{\partial z_1^{(1)}} )
w_0
w_1
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
a

這邊可以發現說其實我們可以藉由這個遞迴關係直接拿最後面的資訊往前算

\frac{\partial L}{\partial z_0^{(0)}} = \frac{\partial a}{\partial z_0^{(0)}} \frac{\partial L}{\partial a}
a = \sigma(z_0^{(0)})
\frac{\partial L}{\partial a} = \frac{\partial z_0^{(1)}}{\partial a} \frac{\partial L}{\partial z_0^{(1)}} + \frac{\partial z_1^{(1)}}{\partial a} \frac{\partial L}{\partial z_1^{(1)}}
\frac{\partial L}{\partial z_0^{(0)}} = \sigma^{\prime}(z_0^{(0)})[ w_0 \frac{\partial L}{\partial z_0^{(1)}} + w_1 \frac{\partial L}{\partial z_1^{(1)}} ]
w_0
w_1
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
a
\frac{\partial L}{\partial z_0^{(0)}} = \frac{\partial a}{\partial z_0^{(0)}} \frac{\partial L}{\partial a}
a = \sigma(z_0^{(0)})
\frac{\partial L}{\partial a} = \frac{\partial z_0^{(1)}}{\partial a} \frac{\partial L}{\partial z_0^{(1)}} + \frac{\partial z_1^{(1)}}{\partial a} \frac{\partial L}{\partial z_1^{(1)}}
\frac{\partial L}{\partial z_0^{(0)}} = \sigma^{\prime}(z_0^{(0)})[ w_0 \frac{\partial L}{\partial z_0^{(1)}} + w_1 \frac{\partial L}{\partial z_1^{(1)}} ]
w_0
w_1
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
a

至於最後面的資訊....

根據選用的loss function不同計算也會不一樣

如果是範例中的softmax + cross entropy的話

微分過後會變成          

y_i - t_i
w_{i}^{(n)}(grad) = \frac{\partial L}{\partial w_i^{(n)}}
\frac{\partial L}{\partial w_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial w_i^{(n)}}

由此可知先記錄一開始向前傳播時拿到的資訊(z)後

從後方再進行一次傳播便可獲得每個參數的梯度

->

\hat y

->

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2

統整一下整個神經網路的最佳化流程

->

\hat y

->

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2

資訊傳入

->

\hat y

->

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2

過神經網路運算

->

\hat y

->

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2

得到結果與Loss

<-

\hat y

<-

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2

從結果計算反向傳播時的輸入

<-

\hat y

<-

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2

更新參數

<-

\hat y

<-

L
z^{(0)}_0
z^{(0)}_1
z^{(1)}_0
z^{(1)}_1
z^{(1)}_2

更新參數完畢

b_{i}^{(n)}(grad) = \frac{\partial L}{\partial b_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial b_i^{(n)}}

最後補充一下b的部分

b_{i}^{(n)}(grad) = \frac{\partial L}{\partial b_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial b_i^{(n)}}

最後補充一下b的部分

\frac{\partial L}{\partial z_i^{(n)}} = \text{同$w$情況}
b_{i}^{(n)}(grad) = \frac{\partial L}{\partial b_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial b_i^{(n)}}

最後補充一下b的部分

z_0^{(1)} = w_1z_0^{(0)} + w_2z_1^{(0)} + \cdots + b
b_{i}^{(n)}(grad) = \frac{\partial L}{\partial b_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial b_i^{(n)}}

最後補充一下b的部分

z_0^{(1)} = w_1z_0^{(0)} + w_2z_1^{(0)} + \cdots + b
= 1

*視為常數

b_{i}^{(n)}(grad) = \frac{\partial L}{\partial b_i^{(n)}} = \frac{\partial L}{\partial z_i^{(n)}} \cdot \frac{\partial z_i^{(n)}}{\partial b_i^{(n)}}

最後補充一下b的部分

\frac{\partial L}{\partial z_i^{(n)}} = \text{同$w$情況}
\frac{\partial z_i^{(n)}}{\partial b_i^{(n)}} = 1
z_0^{(1)} = w_1z_0^{(0)} + w_2z_1^{(0)} + \cdots + b

機器學習社課 第三堂

By lucasw

機器學習社課 第三堂

  • 290