Implement the Backpropagation with Python step by step (I)

栏目: Python · 发布时间: 5年前

自己刻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

  1. Fully-connected layer (forward)

下圖為Fully-connected Network的架構圖,此種神經網路主要是由Fully-connected layer(以下簡稱FC)所建構的,此節將針對FC的運算做介紹

Implement the Backpropagation with Python step by step (I)
The architecture of fully-connected neural network(with one hidden layer, Num = Number of data = 1)

我們取出第一個隱藏層的第一個神經元來看

Implement the Backpropagation with Python step by step (I)
first neuron in first hidden layer , num: number of input data, in: dimension of input feature, b1: bias value in dimension one, a1: value of first neuron in first hidden layer
Implement the Backpropagation with Python step by step (I)
the first neuron value in first hidden layer

如果我們想看第一個隱藏層的最後一個神經元

Implement the Backpropagation with Python step by step (I)
in: the input vector dimension in this layer, out: the neuron number in this layer
Implement the Backpropagation with Python step by step (I)

我們可以發現,input vector的值都維持固定,但後面乘的weight matrix以及後面的bias值會隨著我們想求不同的neuron的值而改變,因此我們可以獲得一個更大的weight以及bias矩陣,來直接描述neuron1 ~neuronOut的關係

Implement the Backpropagation with Python step by step (I)

下面是用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

Implement the Backpropagation with Python step by step (I)

2. Batch Normalization (forward)

Implement the Backpropagation with Python step by step (I)

在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

程式碼如下:

Implement the Backpropagation with Python step by step (I)

momentum: Momentum for the moving mean and the moving variance

3. Activation function (forward)

Activation function分別介紹:Relu & sigmoid

Implement the Backpropagation with Python step by step (I)
Relu output = input if input > 0 else 0
Implement the Backpropagation with Python step by step (I)
sigmoid output = 1 / (1 + exp(-input))
Implement the Backpropagation with Python step by step (I)

4. Dropout (forward)

dropout是在神經網路訓練的過程中,按照一個固定的機率暫時且隨機的丟棄部分神經元,每一個batch都在訓練不同的網路分支,用途是來防止overfitting。

Implement the Backpropagation with Python step by step (I)
dropout示意圖

以下直接實作(此處的p: we drop each neuron output with probability p):

Implement the Backpropagation with Python step by step (I)

你可能會有疑問,為什麼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能產生出資料 ₁, …, 的可能性是多少

Implement the Backpropagation with Python step by step (I)

我們 假裝 h就是f,把上圖中的f用h代替,想知道h能產生一模一樣資料的可能性(likelihood)是多少?而f能產生D的Probability會很高,因為D就是從f產生出來的,如果今天h跟f很接近的話那likelihood的值(上圖右)就會高,反過來說,likelihood值很高,那h跟f就會很接近

因此我們可以透過下式,在hypothesis set H中,找一個可能性最高的h來當作g

Implement the Backpropagation with Python step by step (I)

接著,h(xi | )可以看作第i個樣本正確的機率,就是模型預測第i個樣本是類別 C的機率,而分類問題的label是one-hot,因此也只在乎正確類別C的機率,我們改寫 h( | ) 如下:

Implement the Backpropagation with Python step by step (I)
第一個等式是因為h(xi | )表示第i個樣本是類別C的機率,第二個等式是因為label是one-hot,所以也只在乎正確的類別

綜合以上說明,我們可以將cross-entropy loss用下式表達:

Implement the Backpropagation with Python step by step (I)

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實作程式碼:

Implement the Backpropagation with Python step by step (I)

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的这本书将改变人们的看法。本书首先介绍计算机的体系结构,然后......一起来看看 《深入理解程序设计》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具