神经网络利用哪种算法将损失函数的值降到最低
深度學習之損失函數與激活函數的選擇
深度學習之損失函數與激活函數的選擇在深度神經網絡(DNN)反向傳播算法(BP)中,我們對DNN的前向反向傳播算法的使用做了總結。其中使用的損失函數是均方差,而激活函數是Sigmoid。
實際上DNN可以使用的損失函數和激活函數不少。這些損失函數和激活函數如何選擇呢?以下是本文的內容。MSE損失+Sigmoid激活函數的問題先來看看均方差+Sigmoid的組合有什么問題。
回顧下Sigmoid激活函數的表達式為:函數圖像如下:從圖上可以看出,對于Sigmoid,當z的取值越來越大后,函數曲線變得越來越平緩,意味著此時的導數σ′(z)也越來越小。
同樣的,當z的取值越來越小時,也有這個問題。僅僅在z取值為0附近時,導數σ′(z)的取值較大。在均方差+Sigmoid的反向傳播算法中,每一層向前遞推都要乘以σ′(z),得到梯度變化值。
Sigmoid的這個曲線意味著在大多數時候,我們的梯度變化值很小,導致我們的W,b更新到極值的速度較慢,也就是我們的算法收斂速度較慢。那么有什么什么辦法可以改進呢?
交叉熵損失+Sigmoid改進收斂速度Sigmoid的函數特性導致反向傳播算法收斂速度慢的問題,那么如何改進呢?換掉Sigmoid?這當然是一種選擇。
另一種常見的選擇是用交叉熵損失函數來代替均方差損失函數。每個樣本的交叉熵損失函數的形式:其中,?為向量內積。
這個形式其實很熟悉,在邏輯回歸原理小結中其實我們就用到了類似的形式,只是當時我們是用最大似然估計推導出來的,而這個損失函數的學名叫交叉熵。
使用了交叉熵損失函數,就能解決Sigmoid函數導數變化大多數時候反向傳播算法慢的問題嗎?我們來看看當使用交叉熵時,我們輸出層δL的梯度情況。
對比一下均方差損失函數時在δL梯度使用交叉熵,得到的的δl梯度表達式沒有了σ′(z),梯度為預測值和真實值的差距,這樣求得的Wl,bl的梯度也不包含σ′(z),因此避免了反向傳播收斂速度慢的問題。
通常情況下,如果我們使用了sigmoid激活函數,交叉熵損失函數肯定比均方差損失函數好用。
對數似然損失+softmax進行分類輸出在前面我們都假設輸出是連續可導的值,但是如果是分類問題,那么輸出是一個個的類別,那我們怎么用DNN來解決這個問題呢?
DNN分類模型要求是輸出層神經元輸出的值在0到1之間,同時所有輸出值之和為1。很明顯,現有的普通DNN是無法滿足這個要求的。但是我們只需要對現有的全連接DNN稍作改良,即可用于解決分類問題。
在現有的DNN模型中,我們可以將輸出層第i個神經元的激活函數定義為如下形式:這個方法很簡潔漂亮,僅僅只需要將輸出層的激活函數從Sigmoid之類的函數轉變為上式的激活函數即可。
上式這個激活函數就是我們的softmax激活函數。它在分類問題中有廣泛的應用。將DNN用于分類問題,在輸出層用softmax激活函數也是最常見的了。
對于用于分類的softmax激活函數,對應的損失函數一般都是用對數似然函數,即:其中yk的取值為0或者1,如果某一訓練樣本的輸出為第i類。則yi=1,其余的j≠i都有yj=0。
由于每個樣本只屬于一個類別,所以這個對數似然函數可以簡化為:可見損失函數只和真實類別對應的輸出有關,這樣假設真實類別是第i類,則其他不屬于第i類序號對應的神經元的梯度導數直接為0。
對于真實類別第i類,它的WiL對應的梯度計算為:可見,梯度計算也很簡潔,也沒有第一節說的訓練速度慢的問題。
當softmax輸出層的反向傳播計算完以后,后面的普通DNN層的反向傳播計算和之前講的普通DNN沒有區別。梯度爆炸or消失與ReLU學習DNN,大家一定聽說過梯度爆炸和梯度消失兩個詞。
尤其是梯度消失,是限制DNN與深度學習的一個關鍵障礙,目前也沒有完全攻克。什么是梯度爆炸和梯度消失呢?
簡單理解,就是在反向傳播的算法過程中,由于我們使用了是矩陣求導的鏈式法則,有一大串連乘,如果連乘的數字在每層都是小于1的,則梯度越往前乘越小,導致梯度消失,而如果連乘的數字在每層都是大于1的,則梯度越往前乘越大,導致梯度爆炸。
比如如下的梯度計算:如果不巧我們的樣本導致每一層的梯度都小于1,則隨著反向傳播算法的進行,我們的δl會隨著層數越來越小,甚至接近越0,導致梯度幾乎消失,進而導致前面的隱藏層的W,b參數隨著迭代的進行,幾乎沒有大的改變,更談不上收斂了。
這個問題目前沒有完美的解決辦法。而對于梯度爆炸,則一般可以通過調整我們DNN模型中的初始化參數得以解決。
對于無法完美解決的梯度消失問題,一個可能部分解決梯度消失問題的辦法是使用ReLU(Rectified Linear Unit)激活函數,ReLU在卷積神經網絡CNN中得到了廣泛的應用,在CNN中梯度消失似乎不再是問題。
那么它是什么樣子呢?其實很簡單,比我們前面提到的所有激活函數都簡單,表達式為:也就是說大于等于0則不變,小于0則激活后為0。
其他激活函數DNN常用的激活函數還有:tanh這個是sigmoid的變種,表達式為:tanh激活函數和sigmoid激活函數的關系為:tanh和sigmoid對比主要的特點是它的輸出落在了[-1,1],這樣輸出可以進行標準化。
同時tanh的曲線在較大時變得平坦的幅度沒有sigmoid那么大,這樣求梯度變化值有一些優勢。當然,要說tanh一定比sigmoid好倒不一定,還是要具體問題具體分析。
softplus這個其實就是sigmoid函數的原函數,表達式為:它的導數就是sigmoid函數。softplus的函數圖像和ReLU有些類似。它出現的比ReLU早,可以視為ReLU的鼻祖。
PReLU從名字就可以看出它是ReLU的變種,特點是如果未激活值小于0,不是簡單粗暴的直接變為0,而是進行一定幅度的縮小。如下圖。
小結上面我們對DNN損失函數和激活函數做了詳細的討論,重要的點有:1)如果使用sigmoid激活函數,則交叉熵損失函數一般肯定比均方差損失函數好;2)如果是DNN用于分類,則一般在輸出層使用softmax激活函數和對數似然損失函數;3)ReLU激活函數對梯度消失問題有一定程度的解決,尤其是在CNN模型中。
谷歌人工智能寫作項目:神經網絡偽原創
神經網絡里面的代價函數是什么意思?
下面是就是神經網絡中代價函數J(Θ)J(Θ)的表達式,看起來還是稍微有點復雜寫作貓。這個表達式到底在計算什么?下面我們先用一個簡單的例子來分開一步步計算一下。
J(Θ)=?1m∑i=1m∑k=1K[y(i)klog((hΘ(x(i)))k)+(1?y(i)k)log(1?(hΘ(x(i)))k)]+λ2m∑l=1L?1∑i=1sl∑j=1sl+1(Θ(l)j,i)2J(Θ)=?1m∑i=1m∑k=1K[yk(i)log?((hΘ(x(i)))k)+(1?yk(i))log?(1?(hΘ(x(i)))k)]+λ2m∑l=1L?1∑i=1sl∑j=1sl+1(Θj,i(l))2有如下神經網絡:其中:LslK=神經網絡總共包含的層數=第l層的神經元數目=輸出層的神經元數,亦即分類的數目L=神經網絡總共包含的層數sl=第l層的神經元數目K=輸出層的神經元數,亦即分類的數目假設s1=3,s2=2,s3=3s1=3,s2=2,s3=3,則Θ1Θ1的維度為2×42×4,Θ2Θ2的維度為3×33×3。
則有:XT=?????1x1x2x3?????,Θ1=[θ110θ120θ111θ121θ112θ122θ113θ123]2×4,Θ2=????θ210θ220θ230θ211θ221θ231θ212θ222θ232????3×3XT=[1x1x2x3],Θ1=[θ101θ111θ121θ131θ201θ211θ221θ231]2×4,Θ2=[θ102θ112θ122θ202θ212θ222θ302θ312θ322]3×3先回憶一下正向傳播的計算公式:?z(j)=Θ(j?1)a(j?1)……(1)a(j)=g(z(j)),setting?a(j)0=1……(2)hΘ(x)=a(j)=g(z(j))……(3)z(j)=Θ(j?1)a(j?1)……(1)a(j)=g(z(j)),setting?a0(j)=1……(2)hΘ(x)=a(j)=g(z(j))……(3)詳解戳此處?此時我們先忽略 regularized term?①當m=1時;?J(Θ)=?1m∑k=1K[y(i)klog((hΘ(x(i)))k)+(1?y(i)k)log(1?(hΘ(x(i)))k)]J(Θ)=?1m∑k=1K[yk(i)log?((hΘ(x(i)))k)+(1?yk(i))log?(1?(hΘ(x(i)))k)]1.令a1=XT;?z2=Θ1?a1=[θ110θ120θ111θ121θ112θ122θ113θ123]2×4×?????1x1x2x3?????=[θ110+θ111?x1+θ112?x2+θ113?x3θ120+θ121?x1+θ122?x2+θ123?x3]2×11.令a1=XT;?z2=Θ1?a1=[θ101θ111θ121θ131θ201θ211θ221θ231]2×4×[1x1x2x3]=[θ101+θ111?x1+θ121?x2+θ131?x3θ201+θ211?x1+θ221?x2+θ231?x3]2×1=[z21z22],?a2=g(z2);=[z12z22],?a2=g(z2);2.給a2添加偏置項,并計算a3即hθ(x)?2.給a2添加偏置項,并計算a3即hθ(x);?a2=???1a21a22???;?z3=Θ2?a2=????θ210θ220θ230θ211θ221θ231θ212θ222θ232????3×3×???1a21a22???=????z31z32z33????;a2=[1a12a22];?z3=Θ2?a2=[θ102θ112θ122θ202θ212θ222θ302θ312θ322]3×3×[1a12a22]=[z13z23z33];?hθ(x)=a3=g(z3)=????g(z31)g(z32)g(z33)????=???h(x)1h(x)2h(x)3)????hθ(x)=a3=g(z3)=[g(z13)g(z23)g(z33)]=[h(x)1h(x)2h(x)3)]此時我們知道,對于每一個example,最終都會輸出3個結果,那么這時代價函數所做的就是將這3個輸出取對數然后乘以對應的預期期望值y之后,再累加起來。
具體如下:假設?input:XT=?????1x1x2x3?????;output:y=???100???=???y1y2y3???input:XT=[1x1x2x3];output:y=[100]=[y1y2y3]則有:?J(Θ)?m=[?y1×log(h(x)1)?(1?y1)×log(1?h(x)1)]+[?y2×log(h(x)2)?(1?y2)×log(1?h(x)2)]+[?y3×log(h(x)3)?(1?y3)×log(1?h(x)3)]=[?1×log(h(x)1)?(1?1)×log(1?h(x)1)]+[?0×log(h(x)2)?(1?0)×log(1?h(x)2)]+[?0×log(h(x)3)?(1?0)×log(1?h(x)3)]=?log(h(x)1)?log(1?h(x)2)?log(1?h(x)3)J(Θ)?m=[?y1×log(h(x)1)?(1?y1)×log(1?h(x)1)]+[?y2×log(h(x)2)?(1?y2)×log(1?h(x)2)]+[?y3×log(h(x)3)?(1?y3)×log(1?h(x)3)]=[?1×log(h(x)1)?(1?1)×log(1?h(x)1)]+[?0×log(h(x)2)?(1?0)×log(1?h(x)2)]+[?0×log(h(x)3)?(1?0)×log(1?h(x)3)]=?log(h(x)1)?log(1?h(x)2)?log(1?h(x)3)在matlab中,矢量化之后的代價函數為:?J(Θ)=(1/m)?(sum(?labelY.?log(Hθ)?(1?labelY).?log(1?Hθ)));J(Θ)=(1/m)?(sum(?labelY.?log(Hθ)?(1?labelY).?log(1?Hθ)));②當m>1時;J(Θ)=?1m∑i=1m∑k=1K[y(i)klog((hΘ(x(i)))k)+(1?y(i)k)log(1?(hΘ(x(i)))k)]J(Θ)=?1m∑i=1m∑k=1K[yk(i)log?((hΘ(x(i)))k)+(1?yk(i))log?(1?(hΘ(x(i)))k)]此時,對于每一個example都會產生一個上面的代價,所以只需要把所有的對于每一個example產生的代價累加起來即可。
再來分解一下:假設,X=????111x11x21x31x12x22x32x13x23x33????,假設,X=[1x11x21x311x12x22x321x13x23x33],1.令a1=XT;?z2=Θ1?a1=[θ110θ120θ111θ121θ112θ122θ113θ123]2×4×??????1x11x12x131x21x22x231x31x32x33??????4×3=1.令a1=XT;?z2=Θ1?a1=[θ101θ111θ121θ131θ201θ211θ221θ231]2×4×[111x11x12x13x21x22x23x31x32x33]4×3=[θ110+θ111?x11+θ112?x12+θ113?x13θ120+θ121?x11+θ122?x12+θ123?x13θ110+θ111?x21+θ112?x22+θ113?x23θ120+θ121?x21+θ122?x22+θ123?x23θ110+θ111?x31+θ112?x32+θ113?x33θ120+θ121?x31+θ122?x32+θ123?x33]2×3[θ101+θ111?x11+θ121?x21+θ131?x31θ101+θ111?x12+θ121?x22+θ131?x32θ101+θ111?x13+θ121?x23+θ131?x33θ201+θ211?x11+θ221?x21+θ231?x31θ201+θ211?x12+θ221?x22+θ231?x32θ201+θ211?x13+θ221?x23+θ231?x33]2×3=[z211z221z212z222z213z223]2×3,?a2=g(z2);=[z112z122z132z212z222z232]2×3,?a2=g(z2);2.給a2添加偏置項,并計算a3即hθ(x)?2.給a2添加偏置項,并計算a3即hθ(x);a2=???1a211a2211a212a2221a213a223???3×3;?z3=Θ2?a2=????θ210θ220θ230θ211θ221θ231θ212θ222θ232????3×3×???1a211a2211a212a2221a213a223???3×3a2=[111a112a122a132a212a222a232]3×3;?z3=Θ2?a2=[θ102θ112θ122θ202θ212θ222θ302θ312θ322]3×3×[111a112a122a132a212a222a232]3×3?hθ(x)=a3=g(z3)=????g(z311)g(z321)g(z331)g(z312g(z322g(z332)g(z313))g(z323))g(z333)?????hθ(x)=a3=g(z3)=[g(z113)g(z123g(z133))g(z213)g(z223g(z233))g(z313)g(z323)g(z333)]=??????m=1時每個example對應的所有輸出;h(x1)1h(x1)2h(x1)3m=2時h(x2)1h(x2)2h(x2)3m=3時;h(x3)1h(x3)2h(x3)3??????=[m=1時每個example對應的所有輸出;m=2時m=3時;h(x1)1h(x2)1h(x3)1h(x1)2h(x2)2h(x3)2h(x1)3h(x2)3h(x3)3]假設?input:X=????111x11x21x31x12x22x32x13x23x33????;output:y=???122???=???y1y2y3???input:X=[1x11x21x311x12x22x321x13x23x33];output:y=[122]=[y1y2y3]該例子的背景為用神經網絡識別手寫體,即y1=1表示期望輸出為1,y2=y3=2,表示其期望輸出為2。
在計算代價函數的時候要將其每一個對應的輸出轉換為只含有0,1的向量y1=1表示期望輸出為1,y2=y3=2,表示其期望輸出為2。
在計算代價函數的時候要將其每一個對應的輸出轉換為只含有0,1的向量則有:?y1=???100???;y2=???010???;y3=???010????labelY=?????m=1100m=2010m=3010?????y1=[100];y2=[010];y3=[010]?labelY=[m=1m=2m=3100011000]對于如何將普通的輸出值轉換成只含有0,1的向量,戳此處則有(Malab中的矢量化形式):?J(Θ)=(1/m)?(sum(sum[?labelY.?log(Hθ)?(1?labelY).?log(1?Hθ)]));J(Θ)=(1/m)?(sum(sum[?labelY.?log(Hθ)?(1?labelY).?log(1?Hθ)]));加上 regularized term?regular=λ2m∑l=1L?1∑i=1sl∑j=1sl+1(Θ(l)j,i)2;regular=λ2m∑l=1L?1∑i=1sl∑j=1sl+1(Θj,i(l))2;其實regularized term 就是所有每一層的參數(Θlj,i,j≠0,即除了每一層的第一列偏置項所對應的參數)(Θj,il,j≠0,即除了每一層的第一列偏置項所對應的參數)的平方和相加即可。
具體到本文的例子就是:Θ1=[θ110θ120θ111θ121θ112θ122θ113θ123]2×4,Θ2=????θ210θ220θ230θ211θ221θ231θ212θ222θ232????3×3Θ1=[θ101θ111θ121θ131θ201θ211θ221θ231]2×4,Θ2=[θ102θ112θ122θ202θ212θ222θ302θ312θ322]3×3regular=(θ111)2+(θ112)2+(θ113)2+(θ121)2+(θ122)2+(θ123)2+(θ211)2+(θ212)2+(θ221)2+(θ222)2+(θ231)2+(θ232)2regular=(θ111)2+(θ121)2+(θ131)2+(θ211)2+(θ221)2+(θ231)2+(θ112)2+(θ122)2+(θ212)2+(θ222)2+(θ312)2+(θ322)2Matlab中矢量化為:s_Theta1 = sum(Theta1 .^ 2);%先求所有元素的平方,然后再每一列相加r_Theta1 = sum(s_Theta1)-s_Theta1(1,1);%減去第一列的和s_Theta2 = sum(Theta2 .^ 2);r_Theta2 = sum(s_Theta2)-s_Theta2(1,1);regular = (lambda/(2*m))*(r_Theta1+r_Theta2);。
神經網絡激活函數與損失函數的作用
卷及神經網絡中loss怎么計算
這個問題比較泛,因為網絡的損失函數是由自己設計的,如果不特殊說明一般是有均方誤差和交叉熵兩種損失函數的。
其中均方誤差當然就是指的輸出與標簽的差的平方和的平均,計算方式如下:而交叉熵則是為了防止網絡在訓練后期遲緩而提出的一種損失函數,計算方式如下:
在神經網絡使用elu激活函數時怎么使用交叉熵作為損失函數
P、T矩陣均為一列為一個樣本,因此P、T的列數必須相等,否則報錯。你參考下別人的程序,我建議使用newff函數,不要弄得這么復雜。
還有P、T的生成不需要那么復雜,只需要:P(i,:)=YY(i:i+2);附上newff函數的格式為:net=newff(PR,[S1S2SN],{TF1TF2TFN},BTF,BLF,PF),函數newff建立一個可訓練的前饋網絡。
輸入參數說明:PR:Rx2的矩陣以定義R個輸入向量的最小值和最大值;Si:第i層神經元個數;TFi:第i層的傳遞函數,默認函數為tansig函數;BTF:訓練函數,默認函數為trainlm函數;BLF:權值/閥值學習函數,默認函數為learngdm函數;PF:性能函數,默認函數為mse函數。
?
總結
以上是生活随笔為你收集整理的神经网络利用哪种算法将损失函数的值降到最低的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python精彩语句(来日方长,慢慢录入
- 下一篇: 怎么制作有趣的表情包