手推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!