- 在深度學(xué)習(xí)中的各種操作實(shí)際上是矩陣乘法操作,使用乘法操作就容易造成數(shù)值的消失和爆炸,就是一個(gè)非常小的數(shù)乘以一個(gè)非常小的數(shù)可能就下溢了,一個(gè)大的數(shù)乘以一個(gè)大的數(shù)字就上溢了,并且由于梯度的原因,即使不溢出也會(huì)很難收斂。
- 所以問(wèn)題就變?yōu)榱巳绾握业?code>sweet point,這樣就會(huì)加速收斂。
推理過(guò)程
- 假設(shè)我們有一個(gè)
100層的網(wǎng)絡(luò),沒(méi)有激活函數(shù),因此每個(gè)網(wǎng)絡(luò)的參數(shù)是一個(gè)矩陣,假設(shè)我們已經(jīng)將參數(shù)scale到均值0方差1。 - 我們的輸入是
a,因此到最終輸出結(jié)果要和這100個(gè)矩陣做矩陣乘法,我們接下來(lái)可以看到從一個(gè)標(biāo)準(zhǔn)的正態(tài)分布中初始化不是一個(gè)好的選擇,可以看到經(jīng)過(guò)100次乘法以后已經(jīng)Nan了。
- 可以看到在
29層的時(shí)候就已經(jīng)數(shù)值爆炸了,因此使用標(biāo)準(zhǔn)的正太分布初始化的值太大了。
-
當(dāng)初始化的值太小了,會(huì)數(shù)值消失,盡管此時(shí)的均值仍是0,標(biāo)準(zhǔn)差是0.1。
- 令
y表示網(wǎng)絡(luò)的輸出,輸入x和使用標(biāo)準(zhǔn)正太分布初始化的權(quán)重矩陣a的乘積的標(biāo)準(zhǔn)差與輸入連接數(shù)(此處是512)的平方根非常相近。因此如果我們對(duì)權(quán)重矩陣的所有值除以他連接數(shù)目的根號(hào)(√512)那么就可以保證輸出y的方差是1。
- 因此這次的權(quán)重矩陣再次規(guī)范化以后得到的值就是連乘后不會(huì)讓輸出爆炸和消失的數(shù)值,可以看到盡管是
100層的網(wǎng)絡(luò)但是還是沒(méi)有數(shù)值爆炸或者數(shù)值消失。
Xavier Initialization
- 在使用了比如
sigmoid和tanh這樣的對(duì)稱的激活函數(shù),初始化的時(shí)候就要更加的小心了,因?yàn)榻?jīng)過(guò)這些激活函數(shù)一樣,只有很小的部分是在激活區(qū)里面,其他地方都很平(在飽和區(qū)里面),因此梯度信息就會(huì)非常趨近于0,因此難以訓(xùn)練。
-
Glorot and Bengio提出了一種叫做Xavier initialization的初始化方法,這種初始化的方式是從下面的上下界中進(jìn)行隨機(jī)均勻初始化,ni是輸入的連接數(shù)目,ni+1是輸出的連接數(shù)目。
-
可以看到這樣的方法和之前的方法表現(xiàn)是差不多的。
kaiming Initialization
- 當(dāng)我們使用
relu作為激活函數(shù)的時(shí)候,可以看到使用標(biāo)準(zhǔn)的正太分布初始化的方差與輸入連接數(shù)目除以二(512/2)的平方根很接近。
- 在實(shí)驗(yàn)中可以發(fā)現(xiàn)使用何凱明初始化100層的網(wǎng)絡(luò)可以
prevent activation outputs from exploding or vanishing
- 使用的是
relu激活函數(shù),如果使用Xavier初始化方式的話直接爆炸。
- 可以看到一個(gè)
30層的CNN網(wǎng)絡(luò),使用Xavier初始化幾乎不能學(xué)習(xí)。














