计算机视觉(四)全连接神经网络MLP
目錄
多層感知器/全連接神經(jīng)網(wǎng)絡(luò)
一、全連接神經(jīng)網(wǎng)絡(luò)繪制
二、激活函數(shù)
常用的激活函數(shù)
三、網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計
四、損失函數(shù)
softmax
交叉熵損失
對比多類支持向量機損失
五、優(yōu)化算法
計算圖與反向傳播
計算圖的顆粒度(例子)
常見的門單元
激活函數(shù)
六、梯度算法改進
梯度下降算法存在的問題
動量法
自適應(yīng)梯度(AdaGrad,RMSProp)
ADAM
七、訓(xùn)練過程
隨機權(quán)值初始化:保證正反向傳遞
批歸一化Batch Normal:保證正反向傳遞
欠擬合,過擬合,Dropout
模型正則化
超參數(shù)調(diào)優(yōu)
多層感知器/全連接神經(jīng)網(wǎng)絡(luò)
- 定義:級聯(lián)多個線性分類器來實現(xiàn)輸入到輸出的映射。
- 兩層全連接網(wǎng)絡(luò):max函數(shù)是激活函數(shù)Relu?
- 三層全連接網(wǎng)絡(luò):
- 因為線性分類器中只有一個模版記錄不夠準(zhǔn)確,比如有兩個馬頭的模版,w是權(quán)值模版,w2的行數(shù)必須跟類別個數(shù)一樣,對w1沒有需求。那么可以指定模版行數(shù)w1如100行,大約用4-5個模版去存儲馬,再用w2融合多個模版的匹配結(jié)果來實現(xiàn)最終類別打分。
- w1維度是100*3072,b1維度是100*1,f維度是100*1
- w2維度是10*100,b2維度是10*1,f維度是10*1
一、全連接神經(jīng)網(wǎng)絡(luò)繪制
- 兩層全連接神經(jīng)網(wǎng)絡(luò):
二、激活函數(shù)
如果沒有激活函數(shù),全連接神經(jīng)網(wǎng)絡(luò)又退化成了一個線性分類器
常用的激活函數(shù)
- Sigmoid:將數(shù)據(jù)壓縮在0到1之間,非對稱
- Relu:大于0的值是值本身,小于0的值是0
- tanh:雙曲正切函數(shù),將數(shù)據(jù)壓縮在1到-1之間,對稱
- Leaky Relu:使小于0的值都有一個小的斜率0.1
三、網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計
- 指定隱藏層/深度:增加深度更好
- 指定神經(jīng)元/寬度:神經(jīng)元越多,非線性能力越強,復(fù)雜的分類越強,但也越可能過擬合
- 指定激活函數(shù):同層用同一個激活函數(shù)
四、損失函數(shù)
softmax
- 定義:輸出為概率分布,不僅可以預(yù)測分類,還可以預(yù)測出分到該類的概率
- 概率化之后,訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)需要有標(biāo)答與之對應(yīng),那么就用onehot向量編碼表示標(biāo)答,用1表示真實類別,用0表示其它類別,該向量與分類器預(yù)測的維度一致,計算預(yù)測分類器與標(biāo)答的差異,用交叉熵/相對熵來比較。
交叉熵損失
- 使預(yù)測分布與真實分布越接近越好
- 真實分布用onehot編碼形式來表示
- 熵是信息量的體現(xiàn),信息最不確定的情況,就是onehot,熵最大,比如比賽贏的概率?
- 交叉熵是度量預(yù)測與真實兩個分布之間的差異關(guān)系
- 相對熵/KL散度是度量預(yù)測與真實兩個分布之間的不相似程度
- 交叉熵 = 熵 + 相對熵
- 當(dāng)真實分布為onehot時,交叉熵損失簡化為:j是真實類別?
對比多類支持向量機損失
- 支持向量機只要有一個比其它的分值高1分即可,交叉熵損失需要盡可能保證一個最大,其它盡可能小
五、優(yōu)化算法
計算圖與反向傳播
- 有向圖,用來表達輸入輸出以及中間變量之間的計算關(guān)系,圖中的每個節(jié)點對應(yīng)著一種數(shù)學(xué)運算。
- ?PyTorch,TensorFlow
- 正向是計算輸入到輸出之間的關(guān)系
- 反向是計算輸出到輸入之間的梯度(導(dǎo)數(shù)),鏈?zhǔn)椒▌t一直兩梯度相乘,即計算局部梯度時,需要輸入值代入導(dǎo)數(shù)公式中,得到局部梯度,然后乘以上游梯度,才能得到當(dāng)前梯度
- 如果梯度很小的情況,會導(dǎo)致梯度消失
計算圖的顆粒度(例子)
- ?-0.77*1=-0.77
- -0.77*e^(-2)=-0.1
- -0.1*(-1)=0.1
- 0.1*1=0.1
- ?在tensorflow中把sigmoid函數(shù)當(dāng)作一個計算單元,無需拆解,可以加速運算
常見的門單元
激活函數(shù)
1. Sigmoid激活函數(shù):
- 梯度消失:當(dāng)輸入大于10或小于-10時,局部梯度都為0,由于鏈?zhǔn)椒▌t的乘法特性,會導(dǎo)致梯度消失,梯度為0時,參數(shù)無法更新訓(xùn)練
- 梯度爆炸:梯度乘以學(xué)習(xí)率后得到一個非常大的值,每次更新步長后必須走那么遠,從而無法收斂到最低點。需要限制步長,也稱梯度裁剪。新梯度權(quán)值=舊權(quán)值-學(xué)習(xí)率*當(dāng)前梯度
?2. 雙曲正切激活函數(shù):
- ?
- ?類似sigmoid,不利于反向梯度傳遞,會導(dǎo)致梯度消失
3. Relu激活函數(shù):
- ?
- 當(dāng)輸入大于0時,局部梯度永遠不會為0,不會導(dǎo)致梯度消失,利于梯度流的傳遞
- 但當(dāng)輸入小于0時,梯度為0
4. Leakly Relu激活函數(shù):
- ?使輸入永遠乘以一個斜率0.1,保證梯度永遠不會為0
為了避免梯度消失的問題,盡可能選擇Relu和LeaklyRelu作為激活函數(shù),訓(xùn)練過程收斂的快
六、梯度算法改進
梯度下降算法存在的問題
動量法
自適應(yīng)梯度(AdaGrad,RMSProp)
- 分別改變步長:減小震蕩方向步長,增大平坦方向步長
- 判斷震蕩方向和平坦方向:梯度幅度大平方,較大為震蕩,較小為平坦
- AdaGrad自適應(yīng)梯度法:
- RMSProp自適應(yīng)梯度法:
ADAM
- 同時使用動量和自適應(yīng)梯度的思想,但是調(diào)整傳統(tǒng)的SGD+動量法的學(xué)習(xí)率會比adam更好,找到合適的學(xué)習(xí)率就是煉丹過程
- 步驟3:v是歷史梯度的累加值,用于更新速度,是動量法,決定了要走的方向
- 步驟4:r是歷史梯度的平方的累加值,表示當(dāng)前點是否為震蕩方向,用于改變學(xué)習(xí)率
- 步驟6:根號r那一項用于減小震蕩方向步長,增大平坦方向步長
- 步驟5:修正偏差可以解決算法初期的冷啟動問題,當(dāng)mean=0.9時,1-mean=0.1,梯度值僅為0.1,縮小了10倍更新,會使系統(tǒng)初始時走的很慢,累加變量r也會變得很小。修正偏差v冒可以保證不縮小梯度值,
七、訓(xùn)練過程
隨機權(quán)值初始化:保證正反向傳遞
- 如何給定一個初始點進行梯度下降,同時保證正向的數(shù)據(jù)流和反向的梯度正常不消失,也就是保證輸出y與輸入z具有相同的分布
-
?定義:z為輸入,w為權(quán)值,z與w獨立,f是激活函數(shù),n是輸入神經(jīng)元個數(shù)
-
目標(biāo):每次輸出和輸入有相同的分布,使各層的激活值和局部梯度的方差保持一致,即尋找w的分布使得輸出y與輸入z的方差一致
- Xavier初始化方法(針對tahn/Sigmoid函數(shù))
- ?HE初始化/MSRA方法(針對Relu/LeaklyRelu函數(shù))
批歸一化Batch Normal:保證正反向傳遞
- 對神經(jīng)元的輸出進行批歸一化:對輸出y進行減均值除方差,得到y(tǒng)',以保證當(dāng)前神經(jīng)元的輸出分布符合0均值1方差,可以解決前向傳遞過程中的信號消失問題
- ?把批歸一化插入到全連接層后,非線性激活前
- 通常全連接層之后的輸入數(shù)據(jù)會落在小梯度或無梯度的區(qū)域,但是經(jīng)過批歸一化之后,會保證輸入數(shù)據(jù)回到有梯度的地方,再進行激活,可以保證信息流傳遞正常,保證輸出數(shù)據(jù)是0均值1方差,不會呈現(xiàn)飽和狀態(tài),從而解決梯度消失問題
- 定義:
- 步驟4是讓神經(jīng)網(wǎng)絡(luò)自己選擇適合分布的均值和方差
欠擬合,過擬合,Dropout
模型正則化
超參數(shù)調(diào)優(yōu)
未完。。。
總結(jié)
以上是生活随笔為你收集整理的计算机视觉(四)全连接神经网络MLP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dz php debug,开发dz插件后
- 下一篇: 光耦w314的各引脚图_单通道光耦ACP