dropout 被廣泛地用作全連線層的正則化技術,但是對於卷積層,通常不太有效。dropout 在卷積層不 work 的原因可能是由於卷積層的特徵圖中相鄰位置元素在空間上共享語義資訊, 所以儘管某個單元被 dropout 掉,但與其相鄰的元素依然可以保有該位置的語義資訊,資訊 仍然可以在卷積網路中流通。因此,針對卷積神經網路就需要一種結構形式的 dropout 來正 則化,即按塊來丟棄。
dropout 是一種結構化的 dropout 形式,它將 feature map 相鄰區域中的單元放在一起 drop 掉。除了卷積層外,在跳躍連線中應用 dropblock 可以提高精度。此外,在訓練過程中,逐 漸增加 dropped unit 的數量會有更好的準確性和對超引數選擇的魯棒性。
dropblock 模組主要有兩個引數:block_size,γ。
● block_size:為所有的特徵圖設定乙個恆定的塊大小,不管特徵圖的解析度如何。當 block_size=1 時 , dropblock 類 似 於 dropout , 當 block_size=1 時 , dropblock 類 似 於 spatialdropblock(dropout 正常可以取 3,5,7)。
● γ(表示 drop 過程中的概率,伯努利分布概率):沒有顯式的設定γ,γ控制要刪除的特徵數。假設希望保持每個啟用單元的概率為 keep_prob,考慮到 block_size*block_size 中的元素都要置為 0,所以γ可以計算為:
通常:
其中:
解釋如下:
傳統的 dropout drop 的元素個數為 drop 概率乘以全部的元素個數((1-keep_prob)表示dorp掉的比例):
在實現中,為了保證 drop 的 block 不會超出原始影象,需要先設定乙個 drop 的有效區域,如下圖(a)中的綠色區域,也就是原始的圖減去 block,即:
這裡的γ為伯努利函式的概率,而這個概率只表示了隨機 drop 的中間點的概率,如下圖 (a)中紅色的 x,實際需要的是要 drop 掉 x 周圍的 block_size 大小的區域,也就是乙個 x 對應乙個 block_size 大小的區域(假設不互相重疊)。所以 drop 的概率即:
有效的區域面積為:
最終得到 drop 掉的元素數目為:
最後,dropout=dropblock,即:
演算法流程如下:
# block_size : drop掉的block大小
def __init__
(self, drop_rate=
0.1, block_size=7)
:super
(drop, self)
.__init__()
self.drop_rate = drop_rate
self.block_size = block_size
def forward
(self, x)
:if self.drop_rate ==0:
return x
# 設定gamma,比gamma小的設定為1
,大於gamma的為0(得到丟棄比率的隨機點個數)演算法第五步
# all droped feature center points
gamma = self.drop_rate /
(self.block_size**2
)# torch.rand(*sizes, out=none) : 返回乙個張量,包含了從區間[0, 1)的均勻分布中抽取的一組隨機數。張量的形狀由引數sizes定義
mask =
(torch.
rand
(x.shape[0]
,*x.shape[2:
])< gamma)
.float()
mask = mask.
to(x.device)
# compute block mask
block_mask = self.
_compute_block_mask
(mask)
out = x * block_mask[
:, none,:,
:]# normalize the features,對應第七步
out = out * block_mask.
numel()
/ block_mask.
sum(
)return out
def _compute_block_mask
(self, mask)
: # 取最大值,這樣就能夠取出乙個block的塊大小的1作為drop,當然需要翻轉大小,使得1為0
,0為1
block_mask = f.
max_pool2d
(input=mask[
:, none,:,
:], kernel_size=
(self.block_size,
self.block_size)
, stride=(1
,1),
padding=self.block_size // 2)
if self.block_size %2==
0:# 如果block大小是2的話,會邊界會多出1
,要去掉才能輸出與原圖一樣大小.
block_mask = block_mask[:,
:,:-
1,:-
1]block_mask =
1- block_mask.
squeeze(1
)return block_mask
正則化 L1正則化(稀疏性正則化)
稀疏向量通常包含許多維度。建立特徵組合會導致包含更多維度。由於使用此類高維度特徵向量,因此模型可能會非常龐大,並且需要大量的 ram。在高維度稀疏向量中,最好盡可能使權重正好降至 0。正好為 0 的權重基本上會使相應特徵從模型中移除。將特徵設為 0 可節省 ram 空間,且可以減少模型中的噪點。以乙...
誤差 過擬合 正則化 交叉驗證 泛化能力詳解
機器學習的目的就是使學習得到的模型不僅對訓練資料有好的表現能力,同時也要對未知資料具有很好的 能力,因此給定損失函式的情況下,我們可以得到模型的訓練誤差 訓練集 和測試誤差 測試集 根據模型的訓練誤差和測試誤差,我們可以評價學習得到的模型的好壞。同時需要注意的是,統計學習方法具體採用的損失函式未必是...
正則化 機器學習系列9 正則化
機器學習系列9 正則化 在介紹正則化之前,我們先來介紹一下什麼是欠擬合和過擬合問題。欠擬合和過擬合 發現擬合地並不是很好,我們稱它為欠擬合。當我們用二次多項式去擬合時 我們發現這個擬合的剛剛好。當我們用高次多項式去擬合時 發現這個函式影象異常扭曲,雖然資料集全部擬合到影象上了,但是這個函式並不能很好...