在2023年,hinton在其**《improving neural networks by preventing co-adaptation of feature detectors》中提出dropout。當乙個複雜的前饋神經網路被訓練在小的資料集時,容易造成過擬合。為了防止過擬合,可以通過阻止特徵檢測器的共同作用來提高神經網路的效能。
dropout也是正則化的一種方法,它可以隨機掐死一部分神經元,阻止它們的前向和方向傳播,有效緩解過擬合的發生。
dropout簡單來說就是:我們在前向傳播的時候,讓某個神經元的啟用值以一定的概率p停止工作(掐死),這樣可以使模型泛化性更強,因為它不會太依賴某些區域性的特徵,隨機搭配不同的神經元。(在**階段不使用dropout)
dropout缺點:訓練時間增大
1、模型整合說:dropout相當於生成了若干更瘦小的神經網路。對於n個神經元的神經網路來說,dropout可以看做2的n次方個共享某些引數模型的整合(n等於全連線層的神經元的數量)。dropout率等於0.5時效果最好,因為0.5時隨機生成的網路結構最多。模型整合「取平均」讓一些「相反的」擬合互相抵消。相互依賴的大部隊(神經網路)不能適應各種各樣的變化,應變能力不強,容易團滅,但dropout一些神經元後就像打游擊戰了,很靈活,可以對付各種情況。
2、強制協同工作說:強迫每個神經元每次和隨機挑選出來的不同神經元共同工作,減弱了神經元節點間的聯合適應依賴性。
3、有性繁殖說:無性繁殖的基因很少變異,但有性繁殖可以將海量的基因片段重新組合,每個基因片段都要與其它基因片段協同工作。
4、記憶消除說:將死記硬背的過擬合的知識掐死在搖籃中,學習大而化之的知識。
5、資料增強說:總可以找到乙個資料樣本,使得在原始的網路上也能到達dropout單元後的效果。比如,對於某一層網路,dropout一些單元後,形成的結果是(1.5, 0,2.5, 0,1,2,0),其中 0 是被drop的單元,那麼總能找到乙個樣本,使得到結果也是如此。這樣,每一次dropout其實都相當於增加了資料樣本。
但資料很小的時候加了dropout也會過擬合。
下面是keras中dropout的實現,它是遮蔽掉某些神經元,使其啟用值為0以後,對啟用值向量x1……x1000進行放大,也就是乘以1/(1-p)。函式中,x是本層網路的啟用值。level就是dropout就是每個神經元要被丟棄的概率。
# coding:utf-8
import numpy as np
# dropout函式的實現
defdropout
(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_tensor
print
(x) x /= retain_prob
return x
#對dropout的測試,大家可以跑一下上面的函式,了解乙個輸入x向量,經過dropout的結果
x=np.asarray([1
,2,3
,4,5
,6,7
,8,9
,10],dtype=np.float32)
dropout(x,
0.4)
為純Python搭建的神經網路新增Dropout
之前在自學神經網路的時候,一般都是呼叫當前主流的框架,例如keras tensorflow等等。不得不說keras是乙個極其簡單的框架,在它的中文文件可以輕鬆找到關於dropout的呼叫方法。然而最近由於學習的需要,網路是自己手動搭建的,又在訓練中遇到了過擬合的情況,於是需要自己在網路中手動加入dr...
閒話深度神經網路中的正則化方法之一 Dropout
本文主要聊下inverted dropout。想看英文解釋的可以檢視 regularization of neural networks using dropconnect 所謂inverted dropout,當模型使用了dropout layer,訓練的時候只有佔比為 p的隱藏層單元參與訓練,那...
怎麼看神經網路過早收斂 你的神經網路真的收斂了麼?
1 為什麼小模型的作為backbone效果會差?在深度學習目標檢測 影象分割 領域,我們發現當我們使用層數越深,並且在imagenet上表現越好的分類網路作為backbone時,它的檢測和分割效果越好效果越好。比如我們使用resnet101作為backbone時候,faster rcnn在coco2...