dropout理解(一)
1.Dropout原理
1.概述
作用:防止過擬合
方法:訓練時,隨機停止某些神經元的參數訓練
2. Dropout工作流程及使用
2.1 Dropout具體工作流程
假設我們要訓練這樣一個神經網絡,如圖2所示。
上圖表示標準的神經網絡。
輸入是x輸出是y,正常的流程是:我們首先把x通過網絡前向傳播,然后把誤差反向傳播以決定如何更新參數讓網絡進行學習。使用Dropout之后,過程變成如下:
(1)首先隨機(臨時)刪掉網絡中一半的隱藏神經元,輸入輸出神經元保持不變(圖3中虛線為部分臨時被刪除的神經元)
(2) 然后把輸入x通過修改后的網絡前向傳播,然后把得到的損失結果通過修改的網絡反向傳播。一小批訓練樣本執行完這個過程后,在沒有被刪除的神經元上按照隨機梯度下降法更新對應的參數(w,b)。
(3)然后繼續重復這一過程:
. 恢復被刪掉的神經元(此時被刪除的神經元保持原樣,而沒有被刪除的神經元已經有所更新)
. 從隱藏層神經元中隨機選擇一個一半大小的子集臨時刪除掉(備份被刪除神經元的參數)。
. 對一小批訓練樣本,先前向傳播然后反向傳播損失并根據隨機梯度下降法更新參數(w,b) (沒有被刪除的那一部分參數得到更新,刪除的神經元參數保持被刪除前的結果)。
Dropout在神經網絡中的使用
Dropout的具體工作流程上面已經詳細的介紹過了,但是具體怎么讓某些神經元以一定的概率停止工作(就是被刪除掉)?代碼層面如何實現呢?
下面,我們具體講解一下Dropout代碼層面的一些公式推導及代碼實現思路。
(1)在訓練模型階段
無可避免的,在訓練網絡的每個單元都要添加一道概率流程。
圖4:標準網絡和帶有Dropout網絡的比較
對應的公式變化如下:
. 沒有Dropout的網絡計算公式:
. 采用Dropout的網絡計算公式:
上面公式中Bernoulli函數是為了生成概率r向量,也就是隨機生成一個0、1的向量。
代碼層面實現讓某個神經元以概率p停止工作,其實就是讓它的激活函數值以概率p變為0。比如我們某一層網絡神經元的個數為1000個,其激活函數輸出值為y1、y2、y3、…、y1000,我們dropout比率選擇0.4,那么這一層神經元經過dropout后,1000個神經元中會有大約400個的值被置為0。
注意: 經過上面屏蔽掉某些神經元,使其激活值為0以后,我們還需要對向量y1……y1000進行縮放,也就是乘以1/(1-p)。如果你在訓練的時候,經過置0后,沒有對y1……y1000進行縮放(rescale),那么在測試的時候,就需要對權重進行縮放,操作如下。
在測試模型階段
預測模型的時候,每一個神經單元的權重參數要乘以概率p。
圖5:預測模型時Dropout的操作
測試階段Dropout公式:
3.通過代碼理解
# coding:utf-8 import numpy as np# dropout函數的實現,函數中,x是本層網絡的激活值。Level就是dropout就是每個神經元要被丟棄的概率。 def dropout(x, level):if level < 0. or level >= 1: #level是概率值,必須在0~1之間raise ValueError('Dropout level must be in interval [0, 1[.')retain_prob = 1. - level# 我們通過binomial函數,生成與x一樣的維數向量。binomial函數就像拋硬幣一樣,我們可以把每個神經元當做拋硬幣一樣# 硬幣 正面的概率為p,n表示每個神經元試驗的次數# 因為我們每個神經元只需要拋一次就可以了所以n=1,size參數是我們有多少個硬幣。random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即將生成一個0、1分布的向量,0表示這個神經元被屏蔽,不工作了,也就是dropout了print(random_tensor)x *= random_tensorprint(x)x /= retain_probreturn x#對dropout的測試,大家可以跑一下上面的函數,了解一個輸入x向量,經過dropout的結果 x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32) print(dropout(x,0.4)) import torch import torch.nn as nn import torch.nn.functional as Fclass LinearFC(nn.Module):def __init__(self):super(LinearFC, self).__init__()self.fc = nn.Linear(3, 2)def forward(self, input):out = self.fc(input)out = F.dropout(out, p=0.5, training=self.training)return outNet = LinearFC() x = torch.randint(10, (2, 3)).float() # 隨機生成不大于10的整數,轉為float, 因為nn.linear需要float類型數據 Net.train() output = Net(x) print(output)# train the Net可以看到經過dropout之后,數據變為:tensor([[-0.0000, -0.0000], [0.0000, 1.2420]], grad_fn=<MulBackward0>)
轉載:https://blog.csdn.net/powu0193/article/details/99573632
總結
以上是生活随笔為你收集整理的dropout理解(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021央视合格洗发水排行榜(全球最佳洗
- 下一篇: dropout理解(二)