手推Assignment2中BN反向傳播
- 2019 年 10 月 5 日
- 筆記
手推Assignment2中BN反向傳播
0.說在前面
或許有些人對於上一節說的BN推導沒有深入理解,那麼本節則從一篇非常好的論文中來實踐帶大家手推一遍,與此同時,完成Week6的作業!
下面第二篇是我總結的numpy在cs231n中使用及一些常見用法,建議手敲!
對於本節內容,請各位拿出紙與筆,下面一起來實戰吧!
1.Paper
這裡推薦一篇論文,非常值得看!也非常經典,看不懂的,可以到網上去看,有很多大佬做了相應的闡述。這裡放出論文地址:
https://arxiv.org/abs/1502.03167
或者直接搜:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
2.手推
這裡直接放出論文中的相關公式,以及自己的手推BN反向傳播!

3.任務及BN實現
【任務】
本節作業是
- 完成 assignment2 中
BatchNormalization.ipynb
- 完成 assignment2 中
Dropout.ipynb
第二個dropout已經在上節給出程式碼了,直接運行就可以了,只需要做的就是裡面的cell問題即可!
今天這篇重點講解本節難點:也就是第一個任務,完成BatchNormalization!
由於上一節已經介紹了反向傳播,程式碼也給了,但是在這裡缺少實現batchnorm_backward_alt,於是我們今天重點就放到了完成這個程式碼上面,同時溫故上一節BN方向傳播公式,並給出今日這個未完成方法的完整手推及實現!
【BN實現】
有關BN的手推上面給出了圖片解釋,這裡只需要完成相應程式碼即可!
實現在layers.py找到下面方法完善即可!
def batchnorm_backward_alt(dout, cache): dx, dgamma, dbeta = None, None, None x_normalized, gamma, beta, sample_mean, sample_var, x, eps = cache N, D = x.shape dx_normalized = dout * gamma # [N,D] x_mu = x - sample_mean # [N,D] sample_std_inv = 1.0 / np.sqrt(sample_var + eps) # [1,D] dgamma = np.sum(dout * x_normalized, axis=0, keepdims=True) dbeta = np.sum(dout, axis=0, keepdims=True) dx = (1./N)*sample_std_inv*(N*dx_normalized-np.sum(dx_normalized,axis=0,keepdims=True)*x_normalized-np.sum(dx_normalized,axis=0,keepdims=True)) return dx, dgamma, dbeta
這裡給出為什麼這個任務需要完成這個呢?
對於cs231n的課程作業,有個很好的優點,就是注釋詳細,不懂的直接看,下面給出英文及中文解釋!
英文解釋:
After doing so, implement the simplified batch normalization backward pass in the function batchnorm_backward_alt
and compare the two implementations by running the following. Your two implementations should compute nearly identical results, but the alternative implementation should be a bit faster.
在這樣做之後,在函數batchnorm_backward_alt
中實現簡化的批量規範化反向傳遞,並通過運行以下命令來比較這兩個實現。您的兩個實現應該計算幾乎相同的結果,但替代實現應該更快一點!
哈哈,這個是我Google翻譯的,我就直接照搬過來了,想表達的意思就是最後的求導盡量用原來公式來代替!這也就是方法裡面有個alt,這個英文全拼就是alternative!