--- tags: 深度學習筆記 --- # loss function * 回歸常用的損失函數: 均方誤差(Mean square error,MSE)和平均絕對值誤差(Mean absolute error,MAE) * 分類問題常用的損失函數: 交叉熵(cross-entropy) ![](https://i.imgur.com/XXXhFsJ.png) ![](https://i.imgur.com/JFLwbWD.png) 預測出來的東西基本上跟實際值都會有落差,這個落差在統計上稱為「殘差(residual)」。 y表示實際值,ŷ表示預測值。「損失/殘差」數學表示為 ![](https://i.imgur.com/0QU8mba.png) 透過Tensorflow API實現MSE: ```python= import tensorflow as tf import numpy as np prediction = tf.constant([[1.0, 4.0, 2.0],[1.0, 2.0, 3.0],[2.0, 3.0, 1.0]]) ground_truth = tf.constant([[1.0, 1.0, 1.0],[2.0, 2.0, 2.0],[1.0, 1.0, 1.0]]) ##第一種方式,直接照著公式刻 Square_Error = tf.square(ground_truth -prediction) mse = tf.reduce_mean(Square_Error) with tf.Session() as sess: print(sess.run(mse)) #1.8888888 ##透過L2 loss轉換 # tf.nn.l2_loss=sum(error ** 2) / 2 mse1 = (2.0*tf.nn.l2_loss(ground_truth - prediction))/tf.reshape(prediction,[-1]).get_shape().as_list()[0] with tf.Session() as sess: print(sess.run(mse1)) #1.8888888 ##直接套API mse2 = tf.losses.mean_squared_error(ground_truth, prediction) with tf.Session() as sess: print(sess.run(mse2)) #1.8888888 ``` --- ![](https://i.imgur.com/QVZ8Xgb.png) 在分類的問題中,**不會直接拿分類錯誤率**當作損失函數進行最佳化,但損失函數在分類問題的設計會有錯誤率的核心在內 1. 單看錯誤率比較不出此兩模型的差異 2. 這樣後續模型學習時,比較難得到較好的學習方向,因為用錯誤率得到只知道此筆資料判別錯誤,但模型不會知道現在的模型錯的很多還是很少,這樣模型在學習時根本不知道最佳的模型在那的方向,也不知道要更新多少。 --- MSE小問題: 如果用**MSE**來推估模型時,因為模型在學習基本上目的就是要**消除(最小化)residual**,所以一定先拿residual最大的開刀,因此Outlier(離群值)的權重基本上會比其他的大,所以參數在更新(深度學習)**會往Outlier誤差的方向**去更新,更容易造成模型performance變差。 MAE小問題: MAE在梯度學習部分存在一個問題,更新參數時,MAE的**梯度始終相同**,所以當loss很小的時候,梯度一樣很大,這樣在學習時,容易在快學習到最佳解時,**更新的解進不到最佳**的地方。 **(收斂速度很慢)** ![](https://i.imgur.com/UhhtjCh.png) MSE的梯度變化會隨著你帶進去的點變化,離**最佳解越遠梯度越大**,越**靠近解梯度越小**,而MAE的部分梯度是一個定值,看起來很小,但靠近解的時候這個值又太大。下表為更新20次的結果。 ![](https://i.imgur.com/SWEl0d8.png) ![](https://i.imgur.com/MEetN0a.gif) 平方跟絕對值的**貢獻不是在找解部分**,因為大多數的資料頂多一兩個outlier,如果樣本數多一點,outlier根本不太影響,所以這兩個方法基本上都在**正規化參數上**比較常用**來比較差異**(關鍵字是L1和L2 Regularization)。 * L1 Regularization其實是norm-1正規化→絕對值。 * L2 Regularization其實是norm-2正規化→平方值。 (正規化還不清楚 以後待查) --- ## 交叉熵(cross-entropy) ### **訊息量**和**熵(Entropy)**。 先介紹什麼是**訊息量**和**熵(Entropy)**。 Entropy是接收的所有訊息中所包含的資訊的平均量 先假設X是一個隨機變數,機率密度函數為p(x)= p(X=x),**訊息量(information gain)**的定義 ![](https://i.imgur.com/yMrC5gc.png) 例子:(如不需要可跳過) A考試都考50分,B很聰明考試都滿分。 假設 A考試及格的機率是p(xA)=0.4,B考試及格的機率是p(xB)=0.99。 這時候I(xA)=-log(0.4)= 1.322,I(xB)=-log(0.99)= 0.014 結論: 訊息量在什麼時候會比較大? 機率越隨機(可能一下成績高一下成績低)的情況,訊息量比較大。 Entropy是接收的所有訊息中所包含的資訊的平均量,也可以解釋entropy是看資料的亂度或是資料的不確定性,**entropy的公式**![](https://i.imgur.com/tVIVB85.png) 將公視到套用到以上例子 所有的事件只有考試(1)及格和(2)不及格兩種狀況 A考試及格的機率是p(xA=及格)=0.4,所以不及格機率是p(xA=不及格)=1–0.4=0.6 **Entropy**: H(A)=-0.4log(0.4)-0.6 log(0.6)= **0.971** B考試及格的機率是p(xB=及格)=0.99,所以不及格機率是p(xB=不及格)=1–0.99=0.01 **Entropy**: H(B)=-0.99log(0.99)-0.01 log(0.01)= **0.081** ![](https://i.imgur.com/kTszrMZ.png) ### Cross-entropy ![](https://i.imgur.com/eIKCvwj.png) C是類別數(比如男生、女生、其他三類),n是所有的資料數。 yc,i是binary indicator (0 or 1) from one hot encode (第i筆資料屬於第c類真實類別)。 pc,i是第i筆資料屬於第c類預測出來的機率。 套用以上{分類: 男生、女生和其他}的例子: ![](https://i.imgur.com/daN2xkE.png) 模型一 各項 男生的cross-entropy: -(1 × log(0.4)+0 × log(0.3)+1 × log(0.5)+0 × log(0.8))=2.322 女生的cross-entropy: -(0 × log(0.3)+1 × log(0.4)+0 × log(0.2)+0 × log(0.1))= 1.322 其他的cross-entropy: -(0 × log(0.4)+0 × log(0.3)+0 × log(0.3)+ 1 × log(0.1))= 3.322 模型一的cross-entropy =男生的cross-entropy+女生的cross-entropy其他的cross-entropy =2.322+1.322+3.322= 6.966 從上面計算可以發現,其實在大多項目上面幾乎都是0,所以cross-entropy其實**只是算真實類別機率的訊息量相加。** **模型一的cross-entropy 簡化計算** =-(1 × log(0.4) +1 × log(0.5)+ 1 × log(0.4) + 1 × log(0.1))= 6.966 **模型二的cross-entropy 簡化計算** =-(1 × log(0.7) +1 × log(0.8)+ 1 × log(0.9) + 1 × log(0.3))= 2.725 輸出機率跟loss (cross-entropy)的關係圖 ![](https://i.imgur.com/e6rQ2ii.png) *不同p值下所計算出的loss=-log( p )* --- Reference heng-huang821.medium.com/機器-深度學習-基礎介紹-損失函數-loss-function-2dcac5ebb6cb ---