【代價函數】均方誤差MSE


【代價函數】均方誤差MSE

一、總結

一句話總結:

在線性回歸問題中,常常使用MSE(Mean Squared Error)作為loss函數,而在分類問題中常常使用交叉熵作為loss函數。

 

 

1、sigmoid激活函數的問題?

a、我們可以從sigmoid激活函數的導數特性圖中發現,當激活值很大的時候,sigmoid的梯度(就是曲線的斜率)會比較小,權重更新的步幅會比較小,這時候網絡正處在誤差較大需要快速調整的階段,而上述特性會導致網絡收斂的會比較慢;
b、而當激活值很小的時候,sigmoid的梯度會比較大,權重更新的步幅也會比較大,這時候網絡的預測值正好在真實值的邊緣,太大的步幅也會導致網絡的震盪。

 

 

 

二、【代價函數】MSE:均方誤差(L2 loss)

轉自或參考:【代價函數】MSE:均方誤差(L2 loss)
https://blog.csdn.net/qiu931110/article/details/82111201

MSE均方誤差(L2 loss)

1.代碼展示MAE和MSE圖片特性
import tensorflow as tf
import matplotlib.pyplot as plt
sess = tf.Session()
x_val = tf.linspace(-1.,-1.,500)
target = tf.constant(0.)

#計算L2_loss
l2_y_val = tf.square(target - x_val)
l2_y_out = sess.run(l2_y_val)#用這個函數打開計算圖

#計算L1_loss
l1_y_val = tf.abs(target - x_val)
l1_y_out = sess.run(l1_y_val)#用這個函數打開計算圖

#打開計算圖輸出x_val,用來畫圖
#用畫圖來體現損失函數的特點
x_array = sess.run(x_val)
plt.plot(x_array, l1_y_out, 'b--', lable = 'L1_loss')
plt.plot(x_array, l2_y_out, 'r--', lable = 'L2_loss')

 

 

2.MSE公式及導數推導

損失函數:

 

 

以單個樣本舉例:
a=σ(z), where z=wx+b

利用SGD算法優化損失函數,通過梯度下降法改變參數從而最小化損失函數:
對兩個參數權重和偏置進行求偏導(這個過程相對較容易):

 

 

參數更新:
這邊就說一種簡單的更新策略(隨機梯度下降):

3.分析L2 Loss的特點

根據上面的損失函數對權重和偏置求導的公式我們發現:

 

 

其中,z表示神經元的輸入,σ表示激活函數。從以上公式可以看出,w和b的梯度跟激活函數的梯度成正比,激活函數的梯度越大,w和b的大小調整得越快,訓練收斂得就越快。但是L2 Loss的這個特點存在的缺陷在於,對於我們常用的sigmoid激活函數來說,並不是很符合我們的實際需求。
先介紹下sigmoid激活函數的特性:
sigmoid函數就是損失函數的輸入:a=σ(z) 中的σ()的一種。這是一個激活函數,該函數的公式,導數以及導數的分布圖如下圖所示:


 

 

 

 


 

 

我們可以從sigmoid激活函數的導數特性圖中發現,當激活值很大的時候,sigmoid的梯度(就是曲線的斜率)會比較小,權重更新的步幅會比較小,這時候網絡正處在誤差較大需要快速調整的階段,而上述特性會導致網絡收斂的會比較慢;而當激活值很小的時候,sigmoid的梯度會比較大,權重更新的步幅也會比較大,這時候網絡的預測值正好在真實值的邊緣,太大的步幅也會導致網絡的震盪。這我們的期望不符,即:不能像人一樣,錯誤越大,改正的幅度越大,從而學習得越快。而錯誤越小,改正的幅度小一點,從而穩定的越快。而交叉熵損失函數正好可以解決這個問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM