【AI實戰】快速掌握TensorFlow(四):損失函數

在前面的文章中,咱們已經學習了TensorFlow激勵函數的操做使用方法(見文章:快速掌握TensorFlow(三)),今天咱們將繼續學習TensorFlowpython

本文主要是學習掌握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),獲取更多信息

相關文章
相關標籤/搜索