Pytorch中Linear層預設的初始化方式中a sqrt 5 的原理是什麼?

時間 2021-06-09 20:24:37

1樓:Renovamen

這個問題在這兩個地方有解釋:

Kaiming init of conv and linear layers, why gain = sqrt(5)

Why the default negative_slope for kaiming_uniform initialization of Convolution and Linear layers is √5?

如果還想繼續往下看,那麼理論上 a 代表的是 Leaky ReLU 啟用函式 部分的斜率 negative slop,在用 kaiming uniform 時,PyTorch 會根據這個 negative slop 算乙個放縮因子gain出來(文件):

然後 kaiming uniform 的邊界為:,其中 fan_in 是輸入節點數量。

也就是說如果用別的啟用函式,就不該有 negative slop 這個引數,gain也會用別的公式計算,PyTorch 也在文件裡說了 a 「only used with leaky_relu」,所以這裡的強行設定 a = sqrt(5) 看上去會比較奇怪。

PyTorch 的預設初始化方式進行過一次重構(pr #9038),重構前 linear 層和 conv 層的預設初始化是:

defreset_parameters

(self

):stdv=1.

/math

.sqrt

(self

.weight

.size(1

))self

.weight

.data

.uniform_(-

stdv

,stdv)if

self

.bias

isnot

None

:self

.bias

.data

.uniform_(-

stdv

,stdv

)即邊界為 的均勻分布。重構後才變成了題目中說的 kaiming uniform。而為了為了保證向後相容,需要讓重構前後的邊界等價:

所以這個 a = sqrt(5) 的奇怪的預設值就是這樣來的,看完了之後是不是覺得很無聊 2333

2樓:HZBhhh

樓主學的可真認真啊,可以理解為預設情況下kaiming init中不是有個2在根號下的分子上嗎,把2改成根號5。這也是我Google半天找到的乙個比較好理解的答案,也有不少人認為這是leaky relu的負斜率預設值,但是我感覺好像說不通,我也希望有乙個統一明確的解答,可惜官方文件各方面都沒有對這個引數的解釋。

這個引數背後有乙個很有意思的故事。我在fastai課程上了解到這個引數,課程中帶著你完整地走了一遍卷積神經網路的原始碼,其中fastai創始人Jeremy向pytorch官方問了。這其實是乙個bug,但是跑出來的結果還都挺好,於是pytorch開發者發現之後就把這個good bug保留下來當作預設值,但由於是bug也就沒有任何文件說明~

大概我就了解這些吧

PyTorch 中,nn 與 nn functional 有什麼區別?

老實人 上面使用者有糖吃可好 講的已經挺好了,我再插兩句 在建圖過程中,往往有兩種層,一種含引數 有Variable,如全連線層,卷積層 Batch Normlization層等 另一種不含引數 無Variable,如Pooling層,Relu層,損失函式層等。閱讀原始碼發現 nn.裡面的是繼承自n...

pytorch中,相同的batchsize,多GPU會比單GPU快多少?雙路能是單路的兩倍嗎?

張懷文 相同的batchsize,多gpu會不會比單卡快都是個問題。我遇到過多卡時候,每個卡頻率撞牆的問題,甚至比單卡慢。就是快的時候,也不會有N張卡,提速N倍的能力。多卡並行相關程式的開銷 多卡策略的開銷都不小。 勒布朗詹姆斯哈登 不會,pytorch有很多計算都是只在第一塊卡上進行的。而且如果雙...

Pytorch內部中optim和loss是如何互動的?

zhangqi SGD繼承了Optimizer,再看Optimizer類 net.parameters params快遞進去了Optimizer類,通過add param group新增進了self.param groups 屬性params的字典裡。最後看SDG裡的step 根據gradient更...