自己刻Neuron Network的forward & backward pass是一個 深度學習工程師/研究員 應該要具備的能力之一,剛好這段時間有空,就把之前手寫稿整理一下,以下部分示意圖將採用線上繪圖軟體 sketchpad 繪製,可能稍微潦草、 Python 的example code為方便矩陣意義辨識,沒有使用主流coding style,請見諒,公式則採用Mac的 Daum Equation Editor 。
這系列文章將分為幾篇,循序漸進地說明原理及用Python實作Fully-connected Network及Convolution Neuron Network中所有forward & backward pass的細節,本篇則主要針對以下主題進行說明:
(1) Fully-connected layer(forward)
(2) Batch Normalization(forward)
(3) Activation function(forward)
(4) Dropout(forward)
(5) Softmax function
- Fully-connected layer (forward)
下圖為Fully-connected Network的架構圖,此種神經網路主要是由Fully-connected layer(以下簡稱FC)所建構的,此節將針對FC的運算做介紹
我們取出第一個隱藏層的第一個神經元來看
如果我們想看第一個隱藏層的最後一個神經元
我們可以發現,input vector的值都維持固定,但後面乘的weight matrix以及後面的bias值會隨著我們想求不同的neuron的值而改變,因此我們可以獲得一個更大的weight以及bias矩陣,來直接描述neuron1 ~neuronOut的關係
下面是用Python寫一個FC的forward的部分(以第一個隱藏層為例):
x: input data為n張32*32的RGB image,n為batch_size,也是x.shape的第一個維度,在此為了方便說明,因此x.reshpae後變成(n, 3072),也就是有n個3072-d的input vector
w: 如上面所示,是一個input dimension * output dimension的matrix
b: 如上面所示,是一個1 * output dimension的matrix
2. Batch Normalization (forward)
在Batch Normalization這層(以下簡稱BN層),會做幾個操作:
1. 統計出該層的input(以下簡稱x)的mean&variance
2. 對x的每個元素進行上圖公式的normalize運算->x_normalized
in training: mean_now & var_now使用該次的統計結果
in testing: mean_history & var_history使用歷史的統計結果
3. 算出output(以下簡稱y):
in training: y = gamma * x + beta
in testing: y = gamma * x_normalized + beta
4. update mean & variance變成歷史統計結果(only in training)
mean_history = momentum * mean_history + (1 – momentum) * mean_now
var_history = momentum * var_history + (1 – momentum) * var_now
程式碼如下:
momentum: Momentum for the moving mean and the moving variance
3. Activation function (forward)
Activation function分別介紹:Relu & sigmoid
4. Dropout (forward)
dropout是在神經網路訓練的過程中,按照一個固定的機率暫時且隨機的丟棄部分神經元,每一個batch都在訓練不同的網路分支,用途是來防止overfitting。
以下直接實作(此處的p: we drop each neuron output with probability p):
你可能會有疑問,為什麼mask還要/(1-p)?有點像是為了抑制剩下的(1-p)的神經元去過度增強所屬的weight,所以先將它們的input feature的值變大1/(1-p)的倍率。
5. Softmax function
因為是一個將32*32的RGB圖像分類成10個Class的分類問題,所以Loss function選用Cross Entropy Loss,Cross Entropy是用likelihood的觀念去推導出來的,講到likelihood就必須向我機器學習的入門老師林軒田老師的機器學習基石致敬,此外也參考了其它blog,附註在最後下面的reference,以下引用一張課程的投影片內容作為這部分介紹的開頭:
我們今天要找一個好的hypothesis h(x1,…,xN| )來跟這個target function f(x1,…,xN| )很接近。 是該模型的參數,而 h( ₁, …, | ) 表示在參數 下,h這個hypothesis能產生出資料 ₁, …, 的可能性是多少
我們 假裝 h就是f,把上圖中的f用h代替,想知道h能產生一模一樣資料的可能性(likelihood)是多少?而f能產生D的Probability會很高,因為D就是從f產生出來的,如果今天h跟f很接近的話那likelihood的值(上圖右)就會高,反過來說,likelihood值很高,那h跟f就會很接近
因此我們可以透過下式,在hypothesis set H中,找一個可能性最高的h來當作g
接著,h(xi | )可以看作第i個樣本正確的機率,就是模型預測第i個樣本是類別 C的機率,而分類問題的label是one-hot,因此也只在乎正確類別C的機率,我們改寫 h( | ) 如下:
綜合以上說明,我們可以將cross-entropy loss用下式表達:
N:
the number of samples
k:
the number of classes
t_i,j:
is 1 if sample i
is in class j
and 0
otherwise
p_i,j:
is the predicted probability that sample i
is in class j
.
以下為python實作程式碼:
keepdims:keep後shape為(11, 1),沒keep則為(11,)
-max:避免avoiding overflowing and resulting in nan
,For 以float 64為例,其上限為10的308次方,對於exponential這有可能超過這個限制
Indexing Multi-dimensional arrays:最後一行probs[…]則可以直接參考reference 9
以上為Fully-connected Network forward pass& loss function的部分,下一篇則會介紹各層backward pass的部分,敬請期待XD
Reference:
1. optimizer http://cs231n.stanford.edu/slides/2018/cs231n_2018_lecture07.pdf
2. dropout
http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2015_2/Lecture/Deep%20More%20(v2).pdf
3. dropout
https://wiseodd.github.io/techblog/2016/06/25/dropout/
4. https://zh-yue.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%B6%93%E7%B6%B2%E7%B5%A1
5. bactchnorm https://zhuanlan.zhihu.com/p/52877669
6. softmax & Cross Entropy https://deepnotes.io/softmax-crossentropy
7. cross entropy https://stackoverflow.com/questions/47377222/cross-entropy-function-python
8. cross entropy https://medium.com/%E9%BB%83%E6%8C%AF%E5%93%B2-william/%E6%AF%94%E8%BC%83-cross-entropy-%E8%88%87-mean-squared-error-8bebc0255f5
9. Indexing Multi-dimensional arrays https://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi-dimensional-arrays
以上所述就是小编给大家介绍的《Implement the Backpropagation with Python step by step (I)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入理解程序设计
[美] Jonathan Bartlett / 郭晴霞 / 人民邮电出版社 / 2014-1 / 49.00
是否真正理解汇编语言,常常是普通程序员和优秀程序员的分水岭。《深入理解程序设计:使用Linux汇编语言》介绍了Linux平台下的汇编语言编程,教你从计算机的角度看问题,从而了解汇编语言及计算机的工作方式,为成就自己的优秀程序员之梦夯实基础。 很多人都认为汇编语言晦涩难懂,但New Medio技术总监Jonathan Bartlett的这本书将改变人们的看法。本书首先介绍计算机的体系结构,然后......一起来看看 《深入理解程序设计》 这本书的介绍吧!