机器学习损失函数🤔
更多代码: Gitee主页:https://gitee.com/GZHzzz
博客主页: CSDN:https://blog.csdn.net/gzhzzaa
概念区别
- 均方差损失函数(MSE)
简单来说,均方误差(MSE)的含义是求一个batch中n个样本的n个输出与期望输出的差的平方的平均值
- Cross-entropy(交叉熵损失函数)
交叉熵是用来评估当前训练得到的概率分布与真实分布的差异情况
。它刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近
为什么不用MSE(两者区别详解)
原因 1:交叉熵loss权重更新更快😝
- M S E MSE MSE
比如对于一个神经元(单输入单输出,
s
i
g
m
o
i
d
sigmoid
sigmoid函数),定义其代价函数为:
C
=
(
y
−
a
)
2
2
C= \frac {(y-a)^ {2}}{2}
C=2(y−a)2 其中
C
C
C是损失,
y
y
y是我们期望的输出(真实值target),
a
a
a为神经元的实际输出(输出值):
z
=
w
x
+
b
,
a
=
σ
(
z
)
z=wx+b,a=\sigma(z)
z=wx+b,a=σ(z)在训练神经网络过程中,我们通过梯度下降算法来更新
w
w
w和
b
b
b ,因此需要计算损失函数对
w
w
w和
b
b
b的导数:
d
C
d
w
\frac{dC}{dw}
dwdC=(a-y)
σ
\sigma
σ’(z)x=(a-y)a(1-a)x
≈
\approx
≈a
σ
\sigma
σ’(z)
d
C
d
b
\frac{dC}{db}
dbdC=(a-y)
σ
\sigma
σ’(z)=(a-y)a(1-a)
≈
\approx
≈a
σ
\sigma
σ’(z)
(其中
x
x
x 和
y
y
y 都是已知量,因为网络输入都是以
(
x
,
y
)
(x,y)
(x,y) 形式输入的,所以上式直接的
“
≈
”
“≈”
“≈” 把
x
x
x和
y
y
y 略去了)
因为
s
i
g
m
o
i
d
sigmoid
sigmoid函数的性质,如图的两端,几近于平坦,导致
σ
\sigma
σ‘(z) 在 z 取大部分值时会很小,这样会使得 w 和 b 更新非常慢
再定量解释如下:
由上式:
d
C
d
w
\frac{dC}{dw}
dwdC=(a-y)
σ
\sigma
σ’(z)x=(a-y)a(1-a)x
≈
\approx
≈a
σ
\sigma
σ’(z)
a) 当真实值 y = 1:
- 若 输出值 a = 1, d C d w \frac{dC}{dw} dwdC=0
- 若 输出值 a = 0, d C d w \frac{dC}{dw} dwdC=0
b) 当真实值 y = 0:
- 若 输出值 a = 1, d C d w \frac{dC}{dw} dwdC=0
- 若 输出值 a = 0, d C d w \frac{dC}{dw} dwdC=0
这就带来实际操作的问题。当梯度很小的时候,应该减小步长(否则容易在最优解附近产生来回震荡),但是如果采用 MSE ,当梯度很小的时候,无法知道是离目标很远还是已经在目标附近了。(离目标很近和离目标很远,其梯度都很小
)
- C r o s s − e n t r o p y Cross-entropy Cross−entropy
为了克服上述 MSE 不足,引入了categorical_crossentropy(交叉熵损失函数)
二分类 Binary Cross-entropy,激活函数为 sigmoid: f ( z ) = 1 1 + e x p ( − z ) f(z)=\frac {1}{1+exp(-z)} f(z)=1+exp(−z)1 损失函数:L(w)=- 1 N \frac {1}{N} N1 ∑ i = 1 n \sum _ {i=1}^ {n} ∑i=1n[ y i y_{i} yi log f \log _ {f} logff(xi)+(1-yi) log \log log(1-f(xi))]
简写为:C=- 1 N \frac {1}{N} N1 ∑ i = 1 N \sum_{i=1}^{N} ∑i=1N[ y i y_{i} yi ln \ln lna+(1- y i y_ {i} yi) ln \ln ln(1-a)]
同样求导可得:
δ C δ w j \frac{\delta C}{\delta wj} δwjδC = 1 N \frac {1}{N} N1 ∑ i = 1 N \sum _ {i=1}^ {N} ∑i=1N( σ \sigma σ(z)-y) x j x_ {j} xj= 1 N \frac {1}{N} N1 ∑ i = 1 N \sum _ {i=1}^ {N} ∑i=1N(a-y) x j x_ {j} xj
δ C δ b \frac {\delta C}{\delta b} δbδC = 1 N \frac{1}{N} N1 ∑ i = 1 N \sum _ {i=1}^ {N} ∑i=1N( σ \sigma σ(z)-y)= 1 N \frac {1}{N} N1 ∑ i = 1 N \sum _ {i=1}^ {N} ∑i=1N(a-y)
证明如下:
-
δ
C
δ
w
j
\frac {\delta C}{\delta w_ {j}}
δwjδC =-
1
N
\frac {1}{N}
N1
∑
i
=
1
N
\sum _ {i=1}^ {N}
∑i=1N(
y
σ
(
z
)
\frac {y}{\sigma (z)}
σ(z)y -
(
1
−
y
)
1
−
σ
(
z
)
\frac {(1-y)}{1-\sigma (z)}
1−σ(z)(1−y))
δ
σ
d
w
j
\frac {\delta \sigma }{dwj}
dwjδσ
=- 1 N \frac {1}{N} N1 ∑ i = 1 N \sum _ {i=1}^ {N} ∑i=1N( y σ ( z ) \frac{y}{\sigma (z)} σ(z)y - ( 1 − y ) 1 − σ ( z ) \frac {(1-y)}{1-\sigma (z)} 1−σ(z)(1−y)) σ \sigma σ’(z) x j x_ {j} xj
= 1 N \frac {1}{N} N1 ∑ i = 1 N \sum_ {i=1}^ {N} ∑i=1N σ ′ ( z ) x j σ ( z ) ( 1 − σ ( z ) ) \frac{\sigma'(z)x_ {j}}{\sigma (z)(1-\sigma (z))} σ(z)(1−σ(z))σ′(z)xj( σ \sigma σ(z)-y)
= 1 N \frac {1}{N} N1 ∑ x = 1 N \sum _ {x=1}^ {N} ∑x=1N( σ \sigma σ(z)-y) x j x_ {j} xj
因此, w 的梯度公式中原来的
σ
\sigma
σ'(z)被消掉了,所以导数中没有这一项,权重的更新是受
(
a
−
y
)
(a-y)
(a−y) 这一项影响(表示真实值和输出值之间的误差
),即受误差的影响,所以当误差大的时候,权重更新就快,当误差小的时候,权重的更新就慢。
原因 2:MSE是非凸优化问题而 Cross-entropy 是凸优化问题😝
- M S E MSE MSE
我们从最简单的线性回归开始讨论:
线性回归(回归问题)使用的是平方损失:L( ω \omega ω,b)= 1 2 N \frac{1}{2N} 2N1 ∑ i = 1 N \sum _ {i=1}^ {N} ∑i=1N ( y i − ω x i − b ) 2 (y_ {i}-\omega x_ {i}-b)^ {2} (yi−ωxi−b)2
因为这个函数 L ( w , b ) L(w,b) L(w,b)是凸函数,直接求导等于零,即可求出解析解,很简单。但是对于逻辑回归则不行(分类问题)【注意:逻辑回归不是回归!是分类!!】。因为如果逻辑回归也用平方损失作为损失函数,则: L ( w ) L_ {(w)} L(w)= 1 2 N \frac {1}{2N} 2N1 ∑ i = 1 N \sum _ {i=1}^ { N} ∑i=1N( y i y_ {i} yi- 1 1 + e − ( w x i ) ) \frac {1}{1+e^{-(wx_{i})}}) 1+e−(wxi)1)
上式是非凸的,不能直接求解析解,而且不宜优化,易陷入局部最优解,即使使用梯度下降也很难得到全局最优解。如下图所示:
- C r o s s − e n t r o p y Cross-entropy Cross−entropy
而Cross-entropy 计算 loss,则依旧是一个凸优化问题。
直观理解:
L
(
w
)
=
{
−
log
(
π
(
x
i
)
)
.
i
f
(
y
=
1
)
−
log
(
1
−
π
(
x
i
)
)
.
i
f
(
y
=
0
)
L(w)= \begin{cases}-\log(\pi(x_{i})). if (y=1)\\-\log(1-\pi(x_{i})).if(y=0)\end{cases}
L(w)={−log(π(xi)).if(y=1)−log(1−π(xi)).if(y=0)其中:
π
\pi
π(
x
i
x_ {i}
xi)=P(Y=1|x)=
e
w
x
1
+
e
w
x
\frac {e^ {wx}}{1+e^ {w}x}
1+ewxewx =
1
1
+
e
−
(
w
⋅
x
)
\frac {1}{1+e^{-(w\cdot x)}}
1+e−(w⋅x)1
当类别标签为
y
=
1
y=1
y=1 时,越靠近1则损失越小;当类别标签为
y
=
0
y=0
y=0 时,越靠近1则损失越大
补充 Cross-entropy 的缺点
- s i g m o i d ( s o f t m a x ) + c r o s s − e n t r o p y l o s s sigmoid(softmax)+cross-entropy loss sigmoid(softmax)+cross−entropyloss 擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。基于这个问题的优化有很多,比如对softmax进行改进,如L-Softmax、SM-Softmax、AM-Softmax等。这些在本篇不展开讨论。
写在最后
十年磨剑,与君共勉!
更多代码:Gitee主页:https://gitee.com/GZHzzz
博客主页:CSDN:https://blog.csdn.net/gzhzzaa
- Fighting!😎
基于pytorch的经典模型:基于pytorch的典型智能体模型
强化学习经典论文:强化学习经典论文
while True:
Go life