项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
1.均方差损失函数(Mean Squared Error)
均方差损失函数是预测数据和原始数据对应点误差的平方和的均值。计算方式也比较简单
M
S
E
=
1
N
(
y
^
−
y
)
2
MSE = \frac{1}{N}(\hat y - y) ^ 2
MSE=N1(y^−y)2
其中,N为样本个数。
2.交叉熵损失函数(Cross Entropy Error Function)
在分类问题中,尤其是在神经网络中,交叉熵函数非常常见。因为经常涉及到分类问题,需要计算各类别的概率,所以交叉熵损失函数又都是与sigmoid函数或者softmax函数成对出现。
比如用神经网络最后一层作为概率输出,一般最后一层神经网络的计算方式如下:
1.网络的最后一层得到每个类别的scores。
与sigmoid函数或者softmax函数进行计算得到概率输出。
3.第二步得到的类别概率与真实类别的one-hot形式进行交叉熵计算。
二分类的交叉熵损失函数形式
∑
−
y
i
l
o
g
(
y
^
i
)
−
(
1
−
y
i
)
l
o
g
(
1
−
y
^
i
)
\sum -y_ilog(\hat y_i) - (1-y_i)log(1-\hat y_i)
∑−yilog(y^i)−(1−yi)log(1−y^i)
上面的
y
i
y_i
yi表示类别为1,
y
^
i
\hat y_i
y^i表示预测类别为1的概率。
而多分类的交叉熵损失函数形式为
−
∑
i
=
1
n
y
i
l
o
g
(
y
^
i
)
-\sum_{i=1} ^n y_i log(\hat y_i)
−i=1∑nyilog(y^i)
上面的式子表示类别有n个。单分类问题的时候,n个类别是one-hot的形式,只有一个类别 y i = 1 y_i=1 yi=1,其他n-1个类别为0。
与sigmoid函数不适合配合使用
MSE的loss为
M
S
E
=
−
1
N
(
y
^
−
y
)
2
MSE =- \frac{1}{N}(\hat y - y) ^ 2
MSE=−N1(y^−y)2
如果其与sigmoid函数配合使用,偏导数为
∂
L
o
s
s
i
∂
w
=
(
y
−
y
^
)
σ
′
(
w
x
i
+
b
)
x
i
\frac{\partial Loss_i}{\partial w} = (y - \hat y) \sigma '(wx _i+ b)x_i
∂w∂Lossi=(y−y^)σ′(wxi+b)xi
其中
σ
′
(
w
x
i
+
b
)
=
σ
(
w
x
i
+
b
)
(
1
−
σ
(
w
x
i
+
b
)
)
\sigma '(wx _i+ b) = \sigma (wx _i+ b) (1 - \sigma (wx _i+ b))
σ′(wxi+b)=σ(wxi+b)(1−σ(wxi+b))
于是,在 σ ( w x i + b ) \sigma (wx _i+ b) σ(wxi+b)的值接近0或者1的时候,其导数都接近0。这样会导致模型一开始的学习速度非常慢,所以MSE一般不会与sigmoid函数配合使用。
4.交叉熵损失函数与sigmoid函数配合使用
交叉熵损失函数与sigmoid函数配合使用,最终损失函数求导的结果为
∂
L
o
s
s
i
∂
w
=
(
y
^
i
−
y
i
)
x
i
\frac{\partial Loss_i}{\partial w} = (\hat y_i - y_i)x_i
∂w∂Lossi=(y^i−yi)xi
由此可见,求导的结果与 y ^ i − y i \hat y_i - y_i y^i−yi与 x i x_i xi的值有关,不会出现模型开始训练速度很慢的现象。
具体的推导过程见参考文献1
交叉熵损失函数求导
5.交叉熵损失函数与softmax函数配合使用
前面提到,在神经网络中,交叉熵损失函数经常与softmax配合使用。
L
o
s
s
=
−
∑
i
t
i
l
n
y
i
Loss = - \sum_i t_i lny_i
Loss=−i∑tilnyi
softmax函数
y
i
=
e
i
∑
j
e
j
=
1
−
∑
j
≠
i
e
j
∑
j
e
j
y_i = \frac{e^i}{\sum_j e^j} = 1 - \frac{\sum_{j \neq i} e^j}{\sum_j e^j}
yi=∑jejei=1−∑jej∑j=iej
接下来求导
∂ L o s s i ∂ i = − ∂ l n y i ∂ i = − ∑ j e j e i ⋅ ∂ ( e i ∑ j e j ) ∂ i = − ∑ j e j e i ⋅ ( − ∑ j ≠ i e j ) ⋅ ∂ ( 1 ∑ j e j ) ∂ i = ∑ j e j ⋅ ∑ j ≠ i e j e i ⋅ − e i ( ∑ j e j ) 2 = − ∑ j ≠ i e j ∑ j e j = − ( 1 − e i ∑ j e j ) = y i − 1 {\begin{aligned} \frac{\partial Loss_i}{\partial _i} & = - \frac{\partial ln y_i}{\partial _i} \\ & = -\frac{\sum_j e^j}{e^i} \cdot \frac {\partial (\frac{e_i}{\sum_j e^j})}{\partial_i} \\ & = -\frac{\sum_j e^j}{e^i} \cdot (- \sum _ {j \neq i}e^j ) \cdot \frac{\partial( \frac {1} {\sum_j e^j} ) } { \partial _i} \\ & = \frac { \sum_j e^j \cdot \sum_{j \neq i} e^j} {e^i } \cdot \frac { - e^i} { (\sum_j e^j) ^ 2} \\ & = -\frac { \sum_{j \neq i} e^j } { \sum_j e^j } \\ & = -(1 - \frac{ e ^ i } { \sum_j e^j } ) \\ & = y_i - 1 \end{aligned}} ∂i∂Lossi=−∂i∂lnyi=−ei∑jej⋅∂i∂(∑jejei)=−ei∑jej⋅(−j=i∑ej)⋅∂i∂(∑jej1)=ei∑jej⋅∑j=iej⋅(∑jej)2−ei=−∑jej∑j=iej=−(1−∑jejei)=yi−1
由此可见,交叉熵函数与softmax函数配合,损失函数求导非常简单!
参考文献
:///bitcarmanlee/article/details/51473567