Loss
引言:在Resnet实现CIFAR-10图像分类中,我们需要定义损失和优化器。损失函数是深度学习的训练目标,也叫目标函数,可以理解为神经网络的输出(Logits)和标签(Labels)之间的距离,是一个标量数据。
常见的损失函数包括均方误差、L2损失、Hinge损失、交叉熵等等。图像分类应用通常采用交叉熵损失(CrossEntropy)。
优化器用于神经网络求解(训练)。通过调用MindSpore中的API:Momentum
和SoftmaxCrossEntropyWithLogits
,设置损失函数和优化器的参数。
均方误差
均方误差单独扽概念是很简单的,这里只做介绍,更深一步的内容会在后面列出来。
- SSE(和方差、误差平方和):The sum of squares due to error
- MSE(均方差、方差):Mean squared error
- RMSE(均方根、标准差):Root mean squared error
数理统计中均方误差是指参数估计值与参数真值之差平方的期望值,记为MSE。MSE是衡量“平均误差”的一种较方便的方法,MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
首先先回顾复习三个概念:
1)方差:方差是在概率论和统计方差衡量随机变量或一组数据的离散程度的度量方式,方差越大,离散度越大。求解方式为,各随机变量与平均值差值的平方和的平均数(先求差,再平方,再平均)
平均数:
M = x 1 + x 2 + ⋯ + x n n M=\frac{x_1+x_2+⋯+x_n}{n} M=nx1+x2+⋯+xn
M = x 1 + x 2 + ⋯ + x n n M=\frac{x_1+x_2+\cdots+x_n}{n} M=nx1+x2+⋯+xn
方差公式:
s
2
=
(
x
1
−
M
)
2
+
(
x
1
−
M
)
2
+
⋯
+
(
x
n
−
M
)
2
n
s^2=\frac{(x_1-M)^2+(x_1-M)^2+\cdots+(x_n-M)^2}{n}
s2=n(x1−M)2+(x1−M)2+⋯+(xn−M)2
也可以通过以下的方式进行求解方差
D ( x ) = E ( x 2 ) − ( E ( x ) ) 2 D(x)=E(x^2)-(E(x))^2 D(x)=E(x2)−(E(x))2
2)标准差:标准差就是方差的算术平方根,它反映组内个体间的离散程度。因此它的过程是与平均值之间进行差值计算。
标准差公式:
σ = 1 n ∑ i = 1 n ( x i − μ ) 2 \sigma=\sqrt{\frac{1}{n}\sum_{i=1}^n(x_i-\mu)^2} σ=n1∑i=1n(xi−μ)2
3)样本方差
σ ^ 2 = 1 n − 1 ∑ i = 1 n ( x i − μ ) 2 \hat{\sigma}^2=\frac{1}{n-1}\sum_{i=1}^n(x_i-\mu)^2 σ^2=n−11∑i=1n(xi−μ)2
这里之所以列出样本方差的样子,是因为样本方差更多被采用,因为他是无偏估计的,只做了解。感兴趣的可以到网上搜下与方差的“无偏”证明。
1.SSE(和方差)
在统计学里,该参数计算的是拟合数据很原始数据对应点的误差的平方和,计算公式为:
S S E = ∑ i = 1 m w i ( y i − y i ^ ) 2 SSE=\sum_{i=1}^{m}w_i(y_i-\hat{y_i })^2 SSE=∑i=1mwi(yi−yi^)2
其中 y i y_i yi是真实数据, y i ^ \hat{y_i} yi^是拟合的数据, w i > 0 w_i>0 wi>0从这里可以看出SSE越接近于0,说明模型选择和拟合更好,数据预测也越成功。接下来的MSE和RMSE因为和SSE是同出一宗,所以效果一样。
2.MSE(均方方差)
该统计参数是预测数据和原始数据对应点误差的平方和的均值,也就是 $ \frac{SSE}{n}$,和 S S E SSE SSE没有太大的区别,计算公式为,
M S E = S S E n = 1 n ∑ i = 1 m w i ( y i − y i ^ ) 2 MSE=\frac{SSE}{n}=\frac{1}{n}\sum_{i=1}^{m}w_i(y_i-\hat{y_i })^2 MSE=nSSE=n1∑i=1mwi(yi−yi^)2
其中 n 为样本的个数。
3.MSE(均方根)
该统计参数,也叫回归系统的拟合标准差,是MSE的平方根,计算公式为
R
M
S
E
=
M
S
E
=
S
S
E
n
=
1
n
∑
i
=
1
m
w
i
(
y
i
−
y
i
^
)
2
RMSE=\sqrt{MSE}=\sqrt{\frac{SSE}{n}}=\sqrt{\frac{1}{n}\sum_{i=1}^{m}w_i(y_i-\hat{y_i })^2}
RMSE=MSE=nSSE=n1∑i=1mwi(yi−yi^)2
以上三个统计参数,虽然略有细微的差别,但是代表的都是数据拟合的好坏,只是标准不一样。
L2损失
一、易混概念
对于一些常见的距离先做一个简单的说明
1.欧式距离
假设X和Y都是一个n维的向量,即 X = ( x 1 , x 2 , x 3 , … x n ) , Y = ( y 1 , y 2 , y 3 , … y n ) X=(x_1, x_2, x_3, … x_n),Y=(y_1, y_2, y_3, … y_n) X=(x1,x2,x3,…xn),Y=(y1,y2,y3,…yn)
则欧氏距离: D ( X , Y ) = ∑ i = 1 n ( x i − y i ) 2 D(X,Y)=\sqrt{\sum_{i=1}^n(x_i-y_i)^2} D(X,Y)=∑i=1n(xi−yi)2
2.L2范数
假设X是n维的特征 X = ( x 1 , x 2 , x 3 , … x n ) X=(x_1, x_2, x_3, … x_n) X=(x1,x2,x3,…xn)
L2范数: ∣ ∣ X ∣ ∣ 2 = ∑ i = 1 n x i 2 ||X||_2=\sqrt{\sum_{i=1}^nx_i^2} ∣∣X∣∣2=∑i=1nxi2
3 .闵可夫斯基距离
这里的p值是一个变量,当p=2的时候就得到了欧氏距离。
D ( X , Y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p D(X,Y)=(\sum_{i=1}^n|x_i-y_i|^p)^{\frac{1}{p}} D(X,Y)=(∑i=1n∣xi−yi∣p)p1
4 .曼哈顿距离
来源于美国纽约市曼哈顿区,因为曼哈顿是方方正正的。
D ( X , Y ) = ∑ i = 1 n ∣ x i − y i ∣ D(X,Y)=\sum_{i=1}^n|x_i-y_i| D(X,Y)=∑i=1n∣xi−yi∣
二、损失函数
L1和L2都可以做损失函数使用。
1. L2损失函数
L2范数损失函数,也被称为最小平方误差(LSE)。它是把目标值 y i y_i yi与估计值 f ( x i ) f(x_i) f(xi)的差值的平方和最小化。一般回归问题会使用此损失,离群点对次损失影响较大。
L = ∑ i = 1 n ( y i − f ( x i ) ) 2 L=\sum_{i=1}^n(y_i−f(x_i))^2 L=∑i=1n(yi−f(xi))2
2. L1损失函数
也被称为最小绝对值偏差(LAD),绝对值损失函数(LAE)。总的说来,它是把目标值 y i y_i yi与估计值 f ( x i ) f(x_i) f(xi) 的绝对差值的总和最小化。
L = ∑ i = 1 n ∣ y i − f ( x i ) ∣ L=\sum_{i=1}^n|y_i−f(x_i)| L=∑i=1n∣yi−f(xi)∣
3. 二者对比
L1损失函数相比于L2损失函数的鲁棒性更好。
因为L2范数将误差平方化(如果误差大于1,则误差会放大很多),模型的误差会比L1范数大的多,因此模型会对这种类型的样本更加敏感,这就需要调整模型来最小化误差。但是很大可能这种类型的样本是一个异常值,模型就需要调整以适应这种异常值,那么就导致训练模型的方向偏离目标了。
三、正则化
1. 正则化为什么可以避免过拟合?
正规化是防止过拟合的一种重要技巧。
正则化通过降低模型的复杂性, 缓解过拟合。过拟合发生的情况,拟合函数的系数往往非常大,为什么?
如下图所示,就是过拟合的情况,拟合函数考虑到了每一个样本点,最终形成的拟合函数波动很大,也就是在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的系数非常大,就是模型中的w会很大。
2. L1正则
L1正则常被用来进行特征选择,主要原因在于L1正则化会使得较多的参数为0,从而产生稀疏解,我们可以将0对应的特征遗弃,进而用来选择特征。一定程度上L1正则也可以防止模型过拟合。
假设 L ( W ) L(W) L(W)是未加正则项的损失, λ \lambda λ 是一个超参,控制正则化项的大小。
对应的损失函数: L = L ( W ) + λ ∑ i = 1 n ∣ w i ∣ L=L(W)+\lambda \sum_{i=1}^n |w_i| L=L(W)+λ∑i=1n∣wi∣
3. L2正则
主要用来防止模型过拟合,直观上理解就是L2正则化是对于大数值的权重向量进行严厉惩罚。鼓励参数是较小值,如果 w w w小于1,那么 w 2 w^2 w2会更小。
对应的损失函数: L = L ( W ) + λ ∑ i = 1 n w i 2 L=L(W)+\lambda \sum_{i=1}^n w_i^2 L=L(W)+λ∑i=1nwi2
4. 为什么L1会产生稀疏解
稀疏性:很多参数值为0。
1)梯度的方式:
对其中的一个参数 w i w_i wi计算梯度,其他参数同理, η \eta η是步进, s i g n ( w i ) sign(w_i) sign(wi)是符号函数
w i w_i wi>0, s i g n ( w i ) sign(w_i) sign(wi)=1; w i w_i wi<0, s i g n ( w i ) sign(w_i) sign(wi)=-1。
L1的梯度:
L = L ( W ) + λ ∑ i = 1 n ∣ w i ∣ ∂ L ∂ w i = ∂ L ( W ) ∂ w i + λ s i g n ( w i ) w i = w i − η ∂ L ( W ) ∂ w i − η λ s i g n ( w i ) L=L(W)+\lambda \sum_{i=1}^n |w_i|\\ \frac{\partial L}{\partial w_i}=\frac{\partial L(W)}{\partial w_i}+\lambda sign(w_i)\\ w_i=w_i-\eta \frac{\partial L(W)}{\partial w_i}-\eta \lambda sign(w_i) L=L(W)+λ∑i=1n∣wi∣∂wi∂L=∂wi∂L(W)+λsign(wi)wi=wi−η∂wi∂L(W)−ηλsign(wi)
L2的梯度:
L = L ( W ) + λ ∑ i = 1 n w i 2 ∂ L ∂ w i = ∂ L ( W ) ∂ w i + 2 λ w i w i = w i − η ∂ L ( W ) ∂ w i − η 2 λ w i L=L(W)+\lambda \sum_{i=1}^n w_i^2\\ \frac{\partial L}{\partial w_i}=\frac{\partial L(W)}{\partial w_i}+2\lambda w_i\\ w_i=w_i-\eta \frac{\partial L(W)}{\partial w_i}-\eta 2\lambda w_i L=L(W)+λ∑i=1nwi2∂wi∂L=∂wi∂L(W)+2λwiwi=wi−η∂wi∂L(W)−η2λwi
当 w i w_i wi小于1的时候,L2的惩罚项会越来越小,而L1还是会非常大,所以L1会使参数为0,而L2很难。
2)图形的方式:
损失函数L与参数 w w w的关系图,绿点是最优点。
如果加上L2正则,损失函数L为 L + λ w 2 L+\lambda w^2 L+λw2 ,对应的函数是蓝线,最优点是黄点。
如果是加上L1损失,那么损失函数L是 L + λ ∣ w ∣ L+\lambda |w| L+λ∣w∣,对应的函数是粉线,最优点是红点,参数 w w w变为0。
两种正则化,能不能将最优的参数变为0,取决于最原始的损失函数在0点处的导数,如果原始损失函数在0点处的导数 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L不为0,则加上L2正则化项 2 λ w 2 \lambda w 2λw之后,导数依然不为0,说明在0这点不是极值点,最优值不在w=0处。
而施加 L 1 = L + λ ∣ w ∣ L1 =L+\lambda |w| L1=L+λ∣w∣正则项时,导数在 w = 0 w=0 w=0这点不可导。不可导点是否是极值点,就是看不可导点左右的单调性。单调性可以通过这个点左、右两侧的导数符号判断,导数符号相同则不是极值点,左侧导数正,右侧导数负,则是极大值,左侧导数负,右侧导数正,极小值。
根据极值点判断原则, w = 0 w=0 w=0左侧导数 ∂ L 1 ∂ w = ∂ L ∂ w − λ \frac{\partial L1}{\partial w}=\frac{\partial L}{\partial w}-\lambda ∂w∂L1=∂w∂L−λ ,只要正则项的系数 λ \lambda λ大于 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L,那么左侧导数小于0, w = 0 w=0 w=0右侧导数 ∂ L 1 ∂ w = ∂ L ∂ w + λ > 0 \frac{\partial L1}{\partial w}=\frac{\partial L}{\partial w}+\lambda > 0 ∂w∂L1=∂w∂L+λ>0,所以 w = 0 w=0 w=0就会变成一个极小值点,所以L1经常会把参数变为0,产生稀疏解。
参考资料:L1正则化引起稀疏解的多种解释 - 知乎 (zhihu.com)
Hinge损失
声明:
- 参考自维基百科
- 后面可能会更新
Hinge Loss
在机器学习中,hinge loss作为一个损失函数(loss function),通常被用于最大间隔算法(maximum-margin),而最大间隔算法又是SVM(支持向量机support vector machines)用到的重要算法(注意:SVM的学习算法有两种解释:1. 间隔最大化与拉格朗日对偶;2. Hinge Loss)。
Hinge loss专用于二分类问题,标签值
y
=
±
1
y=\pm1
y=±1,预测值
y
^
∈
R
\hat y \in R
y^∈R。该二分类问题的目标函数的要求如下:
当
y
^
\hat y
y^大于等于+1或者小于等于-1时,都是分类器确定的分类结果,此时的损失函数loss为0;而当预测值
y
^
∈
(
−
1
,
1
)
\hat y \in (-1, 1)
y^∈(−1,1)时,分类器对分类结果不确定,loss不为0。显然,当
y
^
=
0
\hat y=0
y^=0时,loss达到最大值。
如果你想到了一个可以定义这种loss的函数,那说明有成为数学家的潜质。想不到的话就乖乖的往下看:hinge loss出场。
对于输出
y
=
±
1
y=\pm 1
y=±1,当前
y
^
\hat y
y^的损失为:
ℓ
(
y
)
=
max
(
0
,
1
−
y
⋅
y
^
)
\ell(y) = \max(0, 1-y \cdot \hat y)
ℓ(y)=max(0,1−y⋅y^)
上式是Hinge loss在二分类问题的的变体,可以看做双向Hinge loss。难以理解的话,可以先看单方向的hinge loss。以y=+1,为例。当
y
⩾
1
y \geqslant 1
y⩾1时,loss为0,否则loss线性增大。函数图像如下所示:
参考资料: 机器学习基础(四十二)—— 常用损失函数的设计(multiclass SVM loss & hinge loss)
Hinge loss在SVM中的应用
SVM在简单情况下(线性可分情况下)使用的就是一个最大间隔算法。几何意义如下图所示(实心的数据点就是该类别的支持向量),最大化分离超平面到两个类别的支持向量之间的距离 。
参考资料: 知乎-支持向量机(SVM)是什么意思?
线性可分SVM的预测值 $ \hat y = w \cdot x + b , 其 中 ,其中 ,其中w 和 和 和b$都是分类器通过样本学习到的参数。正如前面所说, y ^ ∈ R \hat y \in R y^∈R。如果分离超平面在如上图所示的位置(这是最大分割情况)并且支持向量与分割平面之间的距离=1,每个 y = 1 y=1 y=1的样本其 y ^ ⩾ 1 \hat y \geqslant 1 y^⩾1,每个$ y=-1$的样本其 y ^ ⩽ − 1 \hat y \leqslant -1 y^⩽−1,每个点的Hinge loss为0,整体loss作为平均值,也等于0。 如果分割超平面误分类,则Hinge loss大于0。Hinge loss驱动分割超平面作出调整。 如果分割超平面距离支持向量的距离小于1,则Hinge loss大于0,且就算分离超平面满足最大间隔,Hinge loss仍大于0。
拓展
再强调一下,使用Hinge loss的分类器的 y ^ ∈ R \hat y \in R y^∈R。 |ŷ | | y ^ | |\hat y|越大,说明样本点离分割超平面越远,即该样本点很容易被分类。但是,我们在选择合适的损失函数进行优化时,没必要关注那些离超平面很远的样本。为此,我们可以通过对距分离超平面的距离选择一个阈值,来过滤这些离超平面很远的样本。这就是Hinge loss的精髓, ℓ ( y ) = max ( 0 , 1 − y ⋅ y ^ ) \ell(y) = \max(0, 1-y \cdot \hat y) ℓ(y)=max(0,1−y⋅y^),式中的1就是我们选择的阈值,这个可以作为一个超参数。通过一个max(0, )函数,忽略 y ^ \hat y y^值过高的情况。
SVM
这个思想可以拓展到SVM的多分类问题。SVM的多分类有两种损失函数:
ℓ ( y ) = max ( 0 , 1 + max y ^ ≠ y w y ^ x − w y x ) \ell (y)=\max(0,1+\max _{{\hat y\neq y}}{\mathbf {w}}_{\hat y}{\mathbf {x}}-{\mathbf {w}}_{y}{\mathbf {x}}) ℓ(y)=max(0,1+maxy^=ywy^x−wyx)
其中,KaTeX parse error: Got function '\hat' with no arguments as subscript at position 32: … y}(\mathbf w_ \̲h̲a̲t̲ ̲y \mathbf x + \…表示对于某一标签值 y y y,分类器错误预测的最大值, w y x + b \mathbf w_y \mathbf x + \mathbf b wyx+b表示正确的分类器预测值, 1 1 1表示分类阈值。注意:即使是分类器,也是先产生预测值,再根据预测值和分类阈值进行分类的。
ℓ
(
y
)
=
∑
t
≠
y
max
(
0
,
1
+
w
y
^
x
−
w
y
x
)
{\displaystyle \ell (y)=\sum _{t\neq y}\max(0,1+\mathbf {w} _{\hat y}\mathbf {x} -\mathbf {w} _{y}\mathbf {x} )}
ℓ(y)=t=y∑max(0,1+wy^x−wyx)
其中,
w
y
^
x
+
b
\mathbf {w} _{\hat y}\mathbf {x} + \mathbf b
wy^x+b表示错误的分类器预测值,
w
y
x
+
b
\mathbf w_y \mathbf x + \mathbf b
wyx+b表示正确的分类器预测值,1表示分类阈值。
如下图SVM的预测结果所示:
参考资料:CS231n 2016 通关 第三章-SVM与Softmax
运用公式1:
x 1 x_1 x1的Hinge lossℓ ( y ) = max ( 0 , 1 + 5.1 − 3.2 ) = 2.9 \ell (y)=\max(0,1+5.1-3.2)=2.9 ℓ(y)=max(0,1+5.1−3.2)=2.9
x 2 x_2 x2的Hinge loss
ℓ ( y ) = max ( 0 , 1 + 2.0 − 4.9 ) = 0 \ell (y)=\max(0,1+2.0-4.9)=0 ℓ(y)=max(0,1+2.0−4.9)=0
x 3 x_3 x3的Hinge loss
ℓ ( y ) = max ( 0 , 1 + 2.5 − ( − 3.1 ) ) = 6.6 \ell (y)=\max(0,1+2.5-(-3.1))=6.6 ℓ(y)=max(0,1+2.5−(−3.1))=6.6
则 L = 1 3 ∑ i 3 ( 2.9 + 0 + 6.6 ) L =\frac 1 3\sum_{i}^{3}(2.9 +0 + 6.6) L=31∑i3(2.9+0+6.6)
运用公式2:
也差不多,最后的结果是2.9, 0, 10.9,然后再求平均。PS: 公式2在实际中应用更多。SSVM
Hinge loss的变体也被应用于Structured SVMs中。这里不太懂…
优化
Hinge loss是一个凸函数(convex function),所以适用所有的机器学习凸优化方法。
虽然Hinge loss函数不可微,但我们可以求它的分段梯度:∂ ℓ ∂ w i = { − t ⋅ x i if t ⋅ y < 1 0 otherwise {\frac {\partial \ell }{\partial w_{i}}}={\begin{cases}-t\cdot x_{i}&{\text{if }}t\cdot y<1\\0&{\text{otherwise}}\end{cases}} ∂wi∂ℓ={−t⋅xi0if t⋅y<1otherwise
当然,Hinge loss的梯度在 t y = 1 \displaystyle ty=1 ty=1点处未定义。
平滑
为了解决Hinge loss的优化问题,现在有两种平滑(smoothed)策略:
ℓ ( y ) = { 1 2 − t y if t y ≤ 0 , 1 2 ( 1 − t y ) 2 if 0 < t y ≤ 1 , 0 if 1 ≤ t y \ell (y)={\begin{cases}{\frac {1}{2}}-ty&{\text{if}}~~ty\leq 0,\\{\frac {1}{2}}(1-ty)^{2}&{\text{if}}~~0<ty\leq 1,\\0&{\text{if}}~~1\leq ty\end{cases}} ℓ(y)=⎩⎪⎨⎪⎧21−ty21(1−ty)20if ty≤0,if 0<ty≤1,if 1≤ty
ℓ ( y ) = 1 2 γ max ( 0 , 1 − t y ) 2 其 中 通 常 取 γ = 2 γ = 2 γ = 2 \ell(y) = \frac{1}{2\gamma} \max(0, 1 - ty)^2其中通常取 γ=2 γ = 2 \displaystyle \gamma =2 ℓ(y)=2γ1max(0,1−ty)2其中通常取γ=2γ=2γ=2
交叉熵
参考资料:损失函数:交叉熵详解 - 知乎 (zhihu.com)
将交叉熵引入计算语言学消岐领域,采用语句的真实语义作为交叉熵的训练集的先验信息,将机器翻译的语义作为测试集后验信息。计算两者的交叉熵,并以交叉熵指导对歧义的辨识和消除。实例表明,该方法简洁有效.易于计算机自适应实现。交叉熵不失为计算语言学消岐的一种较为有效的工具。
在信息论中,交叉熵是表示两个概率分布p,q,其中p表示真实分布,q表示非真实分布,在相同的一组事件中,其中,用非真实分布q来表示某个事件发生所需要的平均比特数。从这个定义中,我们很难理解交叉熵的定义。下面举个例子来描述一下:
假设现在有一个样本集中两个概率分布p,q,其中p为真实分布,q为非真实分布。假如,按照真实分布p来衡量识别一个样本所需要的编码长度的期望为:
H§=
但是,如果采用错误的分布q来表示来自真实分布p的平均编码长度,则应该是:
H(p,q)=
此时就将H(p,q)称之为交叉熵。交叉熵的计算方式如下:
对于离散变量采用以下的方式计算:H(p,q)=
对于连续变量采用以下的方式计算: