dropout理解(二)
Dropout在做什么
Train時Dropout在做什么?
當dropout(p)時,意味著每個neuron, 有p%的可能性被去除;(這里需要注意的是,不是去除p%的neuron)
我們可以看到的是,每一次進行dropout的時候,網絡的結構都會發生改變,會變成一個比之前thin的網絡結構。
所以,總結一下:dropout在訓練的時候步驟如下:
- 每次前向傳播時, 去除一些neuron;
- 網絡的結構發生了改變;
- 使用新的網絡結構進行訓練;
- 對于每一個min-batch, 每次都會修改網絡的結構;
Test時Dropout在做什么
在進行test的時候,我們是不進行dropout,同時要修改之前的系數,我們看一下具體的步驟。
- 不進行dropout(即每個節點都不會被去掉)
- 同時, 若train時dropout§, 則在test時候, 所有系數需要乘(1-p%);
- 例如, dropout(0.9), 則最后所有系數需要乘(1-0.9);
下面我們來解釋一下為什么最后所有系數要乘(1-p%),他的最終的目標是為了保持不進行dropout時候網絡輸出的值與進行dropout時,網絡輸出值的期望相同。我們看下面一個具體的例子:
上圖中,我們的Dropout(0.5)。則每個點有50%的可能性被去掉。
原始的結構如藍框所示,則dropout后會有四種不同的可能性,分別如圖左邊的四個小結構所示,其中每個結構的可能性都是1/4。
我們對上面可能的四個結構的輸出求期望,得到1/2×w1×x1+1/2×w2×x2,相當于在原始的網絡的系數上都乘了(1-0.5)。這也就是為什么在最后進行test的時候,所有的系數都需要乘上(1-p)了。
對于線性結構來說,我們都是可以這么進行計算的,即dropout和最后系數乘(1-p)是等價的。這樣大概解釋了一下為什么最后系數要乘(1-p).
Dropout的具體實現
在pytorch中,dropout在train和test的時候不會改變系數,他會直接在訓練的時候,將dropout層的輸出的值,除(1-p),這樣就不需要改變系數了。在test的時候只需要不進行dropout即可。
下面是一個簡答的測試結果的圖片:
我們看到,在dropout(0.9),且在train模式下,輸出的值會直接乘10,相當于除(1-0.9)。在test的時候,就會直接關閉dropout。
在pytorch中,我們可以通過如下的方式控制model是train還是test模式:
model.train() # Set model to training mode model.eval() # Set model to evaluate mode 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的dropout理解(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dropout理解(一)
- 下一篇: dropout理解(三)