---
tags: 深度學習筆記
---
# loss function
* 回歸常用的損失函數: 均方誤差(Mean square error,MSE)和平均絕對值誤差(Mean absolute error,MAE)
* 分類問題常用的損失函數: 交叉熵(cross-entropy)


預測出來的東西基本上跟實際值都會有落差,這個落差在統計上稱為「殘差(residual)」。
y表示實際值,ŷ表示預測值。「損失/殘差」數學表示為

透過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
```
---

在分類的問題中,**不會直接拿分類錯誤率**當作損失函數進行最佳化,但損失函數在分類問題的設計會有錯誤率的核心在內
1. 單看錯誤率比較不出此兩模型的差異
2. 這樣後續模型學習時,比較難得到較好的學習方向,因為用錯誤率得到只知道此筆資料判別錯誤,但模型不會知道現在的模型錯的很多還是很少,這樣模型在學習時根本不知道最佳的模型在那的方向,也不知道要更新多少。
---
MSE小問題:
如果用**MSE**來推估模型時,因為模型在學習基本上目的就是要**消除(最小化)residual**,所以一定先拿residual最大的開刀,因此Outlier(離群值)的權重基本上會比其他的大,所以參數在更新(深度學習)**會往Outlier誤差的方向**去更新,更容易造成模型performance變差。
MAE小問題:
MAE在梯度學習部分存在一個問題,更新參數時,MAE的**梯度始終相同**,所以當loss很小的時候,梯度一樣很大,這樣在學習時,容易在快學習到最佳解時,**更新的解進不到最佳**的地方。 **(收斂速度很慢)**

MSE的梯度變化會隨著你帶進去的點變化,離**最佳解越遠梯度越大**,越**靠近解梯度越小**,而MAE的部分梯度是一個定值,看起來很小,但靠近解的時候這個值又太大。下表為更新20次的結果。


平方跟絕對值的**貢獻不是在找解部分**,因為大多數的資料頂多一兩個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)**的定義

例子:(如不需要可跳過)
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的公式**
將公視到套用到以上例子
所有的事件只有考試(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**

### Cross-entropy

C是類別數(比如男生、女生、其他三類),n是所有的資料數。
yc,i是binary indicator (0 or 1) from one hot encode (第i筆資料屬於第c類真實類別)。
pc,i是第i筆資料屬於第c類預測出來的機率。
套用以上{分類: 男生、女生和其他}的例子:

模型一 各項
男生的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)的關係圖

*不同p值下所計算出的loss=-log( p )*
---
Reference
heng-huang821.medium.com/機器-深度學習-基礎介紹-損失函數-loss-function-2dcac5ebb6cb
---