在前面的文章中,咱們已經學習了TensorFlow激勵函數的操做使用方法(見文章:快速掌握TensorFlow(三)),今天咱們將繼續學習TensorFlow。python
本文主要是學習掌握TensorFlow的損失函數。git
1、什麼是損失函數算法
損失函數(loss function)是機器學習中很是重要的內容,它是度量模型輸出值與目標值的差別,也就是做爲評估模型效果的一種重要指標,損失函數越小,代表模型的魯棒性就越好。微信
2、怎樣使用損失函數網絡
在TensorFlow中訓練模型時,經過損失函數告訴TensorFlow預測結果相比目標結果是好仍是壞。在多種狀況下,咱們會給出模型訓練的樣本數據和目標數據,損失函數便是比較預測值與給定的目標值之間的差別。機器學習
下面將介紹在TensorFlow中經常使用的損失函數。分佈式
一、迴歸模型的損失函數函數
首先講解迴歸模型的損失函數,迴歸模型是預測連續因變量的。爲方便介紹,先定義預測結果(-1至1的等差序列)、目標結果(目標值爲0),代碼以下:oop
import tensorflow as tf sess=tf.Session() y_pred=tf.linspace(-1., 1., 100) y_target=tf.constant(0.)
注意,在實際訓練模型時,預測結果是模型輸出的結果值,目標結果是樣本提供的。學習
(1)L1正則損失函數(即絕對值損失函數)
L1正則損失函數是對預測值與目標值的差值求絕對值,公式以下:
在TensorFlow中調用方式以下:
loss_l1_vals=tf.abs(y_pred-y_target) loss_l1_out=sess.run(loss_l1_vals)
L1正則損失函數在目標值附近不平滑,會致使模型不能很好地收斂。
(2)L2正則損失函數(即歐拉損失函數)
L2正則損失函數是預測值與目標值差值的平方和,公式以下:
當對L2取平均值,就變成均方偏差(MSE, mean squared error),公式以下:
在TensorFlow中調用方式以下:
# L2損失 loss_l2_vals=tf.square(y_pred - y_target) loss_l2_out=sess.run(loss_l2_vals) # 均方偏差 loss_mse_vals= tf.reduce.mean(tf.square(y_pred - y_target)) loss_mse_out = sess.run(loss_mse_vals)
L2正則損失函數在目標值附近有很好的曲度,離目標越近收斂越慢,是很是有用的損失函數。
L一、L2正則損失函數以下圖所示:
(3)Pseudo-Huber 損失函數
Huber損失函數常常用於迴歸問題,它是分段函數,公式以下:
從這個公式能夠看出當殘差(預測值與目標值的差值,即y-f(x) )很小的時候,損失函數爲L2範數,殘差大的時候,爲L1範數的線性函數。
Peseudo-Huber損失函數是Huber損失函數的連續、平滑估計,在目標附近連續,公式以下:
該公式依賴於參數delta,delta越大,則兩邊的線性部分越陡峭。
在TensorFlow中的調用方式以下:
delta=tf.constant(0.25) loss_huber_vals = tf.mul(tf.square(delta), tf.sqrt(1. + tf.square(y_target – y_pred)/delta)) – 1.) loss_huber_out = sess.run(loss_huber_vals)
L一、L二、Huber損失函數的對比圖以下,其中Huber的delta取0.2五、5兩個值:
二、分類模型的損失函數
分類損失函數主要用於評估預測分類結果,從新定義預測值(-3至5的等差序列)和目標值(目標值爲1),以下:
y_pred=tf.linspace(-3., 5., 100) y_target=tf.constant(1.) y_targets=tf.fill([100, ], 1.)
(1)Hinge損失函數
Hinge損失經常使用於二分類問題,主要用來評估向量機算法,但有時也用來評估神經網絡算法,公式以下:
在TensorFlow中的調用方式以下:
loss_hinge_vals = tf.maximum(0., 1. – tf.mul(y_target, y_pred)) loss_hinge_out = sess.run(loss_hinge_vals)
上面的代碼中,目標值爲1,當預測值離1越近,則損失函數越小,以下圖:
(2)兩類交叉熵(Cross-entropy)損失函數
交叉熵來自於信息論,是分類問題中使用普遍的損失函數。交叉熵刻畫了兩個機率分佈之間的距離,當兩個機率分佈越接近時,它們的交叉熵也就越小,給定兩個機率分佈p和q,則距離以下:
對於兩類問題,當一個機率p=y,則另外一個機率q=1-y,所以代入化簡後的公式以下:
在TensorFlow中的調用方式以下:
loss_ce_vals = tf.mul(y_target, tf.log(y_pred)) – tf.mul((1. – y_target), tf.log(1. – y_pred)) loss_ce_out = sess.run(loss_ce_vals)
Cross-entropy損失函數主要應用在二分類問題上,預測值爲機率值,取值範圍爲[0,1],損失函數圖以下:
(3)Sigmoid交叉熵損失函數
與上面的兩類交叉熵相似,只是將預測值y_pred值經過sigmoid函數進行轉換,再計算交叉熵損失。在TensorFlow中有內置了該函數,調用方式以下:
loss_sce_vals=tf.nn.sigmoid_cross_entropy_with_logits(y_pred, y_targets) loss_sce_out=sess.run(loss_sce_vals)
因爲sigmoid函數會將輸入值變小不少,從而平滑了預測值,使得sigmoid交叉熵在預測值離目標值比較遠時,其損失的增加沒有那麼的陡峭。與兩類交叉熵的比較圖以下:
(4)加權交叉熵損失函數
加權交叉熵損失函數是Sigmoid交叉熵損失函數的加權,是對正目標的加權。假定權重爲0.5,在TensorFlow中的調用方式以下:
weight = tf.constant(0.5) loss_wce_vals = tf.nn.weighted_cross_entropy_with_logits(y)vals, y_targets, weight) loss_wce_out = sess.run(loss_wce_vals)
(5)Softmax交叉熵損失函數
Softmax交叉熵損失函數是做用於非歸一化的輸出結果,只針對單個目標分類計算損失。
經過softmax函數將輸出結果轉化成機率分佈,從而便於輸入到交叉熵裏面進行計算(交叉熵要求輸入爲機率),softmax定義以下:
結合前面的交叉熵定義公式,則Softmax交叉熵損失函數公式以下:
在TensorFlow中調用方式以下:
y_pred=tf.constant([[1., -3., 10.]] y_target=tf.constant([[0.1, 0.02, 0.88]]) loss_sce_vals=tf.nn.softmax_cross_entropy_with_logits(y_pred, y_target) loss_sce_out=sess.run(loss_sce_vals)
用於迴歸相關的損失函數,對比圖以下:
三、總結
下面對各類損失函數進行一個總結,以下表所示:
在實際使用中,對於迴歸問題常常會使用MSE均方偏差(L2取平均)計算損失,對於分類問題常常會使用Sigmoid交叉熵損失函數。
你們在使用時,還要根據實際的場景、具體的模型,選擇使用的損失函數,但願本文對你有幫助。
接下來的「快速掌握TensorFlow」系列文章,還會有更多講解TensorFlow的精彩內容,敬請期待。
歡迎關注本人的微信公衆號「大數據與人工智能Lab」(BigdataAILab),獲取更多信息
推薦相關閱讀
關注本人公衆號「大數據與人工智能Lab」(BigdataAILab),獲取更多信息。