系列之3-损失函数

Copyright © Microsoft Corporation. All rights reserved.
适用于License版权许可
更多微软人工智能学习资源,请见微软人工智能教育与学习共建社区html

在这一章,咱们将简要介绍一下损失函数~git

损失函数

做用

在有监督的学习中,须要衡量神经网络输出和所预期的输出之间的差别大小。这种偏差函数须要可以反映出当前网络输出和实际结果之间一种量化以后的不一致程度,也就是说函数值越大,反映出模型预测的结果越不许确。github

仍是拿练枪的Bob作例子,Bob预期的目标是所有命中靶子的中心,但他如今的命中状况是这个样子的:算法

最外圈是1分,以后越向靶子中心分数是2,3,4分,正中靶心能够得5分。网络

那Bob每次射击结果和目标之间的差距是多少呢?在这个例子里面,用得分来衡量的话,就是说Bob获得的反馈结果从差4分,到差3分,到差2分,到差1分,到差0分,这就是用一种量化的结果来表示Bob的射击结果和目标之间差距的方式。也就是偏差函数的做用。由于是一次只有一个样本,因此这里采用的是偏差函数的称呼。若是一次有多个样本,那么就要称呼这样子衡量不一致程度的函数就要叫作损失函数了。框架

以作线性回归的实际值和预测值为例,若自变量x是[-2, -1, 0, 1, 2]这样5个值,对应的指望值y是[-3, 0, 0, 3, 4]这样的值,目前预测使用的参数是(w, b) = (2, 1), 那么预测获得的值y_ = [-3, -1, 1, 3, 5], 采用均方偏差计算这个预测和实际的损失就是\(\sum_{i = 0}^{4}(y[i] - y_\_[i])^{2}\), 也就是3。那么若是采用的参量是(0, 0),预测出来的值是[0, 0, 0, 0, 0],这是一个显然错误的预测结果,此时的损失大小就是34,\(3 < 34\), 那么(2, 1)是一组比(0, 0)要合适的参量。函数

那么经常使用的损失函数有哪些呢?
这里先给一些前提,好比神经网络中的一个神经元:学习

图中 \(z = \sum\limits_{i}w_i*x_i+b_i=\theta^Tx\)\(\sigma(z)\)是对应的激活函数,也就是说,在反向传播时梯度的链式法则中,测试

\[\frac{\partial{z}}{\partial{w_i}}=x_i \tag{1}\]
\[\frac{\partial{z}}{\partial{b_i}}=1 \tag{2}\]
\[\frac{\partial{loss}}{\partial{w_i}}=\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}}\frac{\partial{z}}{\partial{w_i}}=\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}}x_i \tag{3}\]
\[\frac{\partial{loss}}{\partial{b_i}}=\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}}\frac{\partial{z}}{\partial{b_i}}=\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}} \tag{4}\]优化

从公式\((3),(4)\)能够看出,梯度计算中的公共项是\(\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}} = \frac{\partial{loss}}{\partial{z}}\)

下面咱们来探讨\(\frac{\partial{loss}}{\partial{z}}\)的影响。因为梯度的计算和函数的形式是有关系的,因此咱们会从经常使用损失函数入手来逐个说明。

经常使用损失函数

  1. MSE (均方偏差函数)
    该函数就是最直观的一个损失函数了,计算预测值和真实值之间的欧式距离。预测值和真实值越接近,二者的均方差就越小。
  • 想法来源
    在给定一些点去拟合直线的时候(好比上面的例子),常采用最小二乘法,使各个训练点到拟合直线的距离尽可能小。这样的距离最小在损失函数中的表现就是预测值和真实值的均方差的和。
  • 函数形式:

    \[loss = \frac{1}{2}\sum_{i}(y[i] - a[i]) ^ 2\],
    其中, \(a\)是网络预测所获得的结果,\(y\)表明指望获得的结果,也就是数据的标签,\(i\)是样本的序号。
  • 反向传播:

    \[\frac{\partial{loss}}{\partial{z}} = \sum_{i}(y[i] - a[i])*\frac{\partial{a[i]}}{\partial{z}}\]
  • 缺点:
    \(\frac{\partial{a[i]}}{\partial{z}}\)关系密切,可能会产生收敛速度缓慢的现象,如下图为例(激活函数为sigmoid)

    在激活函数的两端,梯度(黄色)都会趋向于0,采起MSE的方法衡量损失,在\(a\)趋向于1而\(y\)是0的状况下,损失loss是1,而梯度会趋近于0,在偏差很大时收敛速度也会很是慢。

    在这里咱们能够参考activation中关于sigmoid函数求导的例子,假定x保持不变,只有一个输入的一个神经元,权重\(w = ln(9)\), 偏置\(b = 0\),也就是这样一个神经元:

    保持参数统一不变,也就是学习率\(\eta = 0.2\),目标输出\(y = 0.5\), 此处输入x固定不变为\(x = 1\),采用MSE做为损失函数计算,同样先作公式推导,

    第一步,计算当前偏差

    \[loss = \frac{1}{2}(a - y)^2 = \frac{1}{2}(0.9 - 0.5)^2 = 0.08\]

    第二步,求出当前梯度

    \[grad = (a - y) \times \frac{\partial{a}}{\partial{z}} \frac{\partial{z}}{\partial{w}} = (a - y) \times a \times (1 - a) \times x = (0.9 - 0.5) \times 0.9 \times (1-0.9) \times 1= 0.036\]

    第三步,根据梯度更新当前输入值

    \[w = w - \eta \times grad = ln(9) - 0.2 \times 0.036 = 2.161\]

    第四步,计算当前偏差是否小于阈值(此处设为0.001)

    \[a = \frac{1}{1 + e^{-wx}} = 0.8967\]
    \[loss = \frac{1}{2}(a - y)^2 = 0.07868\]

    第五步,重复步骤2-4直到偏差小于阈值

    做出函数图像如图所示:

    能够看到函数迭代了287次从才收敛到接近0.5的程度,这比单独使用sigmoid函数还要慢了不少。

  1. 交叉熵函数

这个损失函数的目的是使得预测获得的几率分布和真实的几率分布尽可能的接近。两个分布越接近,那么这个损失函数获得的函数值就越小。怎么去衡量两个分布的接近程度呢?这就要用到香农信息论中的内容了。两个几率分布之间的距离,也叫作KL Divergence,他的定义是这个形式的,给定离散几率分布P(x), Q(x),这两个分布之间的距离是

\[ D_{KL}(P || Q) = - \sum_{i}P(i)log(\frac{Q(i)}{P(i)})\]

试想若是两个分布彻底相同,那么\(log(\frac{Q(i)}{P(i)}) = 0\), 也就是两个分布之间的距离是零,若是两个分布差别很大,好比一个是\(P(0)=0.9, P(1)=0.1\),另外一个是\(Q(0)=0.1,Q(1)=0.9\),那么这两个分布之间的距离就是0.763,若是是\(Q(0)=0.5,Q(1)=0.5\),那么距离就是0.160,直觉上来讲两个分布越接近那么他们之间的距离就是越小的,具体的理论证实参看《信息论基础》,不过为何要选用这个做为损失函数呢?

  • 从最大似然角度开始说
    关于最大似然,请参看:

    https://www.zhihu.com/question/20447622/answer/161722019

    将神经网络的参数做为\(\theta\),数据的真实分布是\(P_{data}(y;x)\), 输入数据为\(x\),那么在\(\theta\)固定状况下,神经网络输出\(y\)的几率就是\(P(y;x, \theta)\),构建似然函数,
    \[L = \sum_{i}log(P(y_i;x_i, \theta))\]
    \(\theta\)为参数最大化该似然函数,即\(\theta^{*} = {argmax}_{\theta}L\)
    真实分布\(P(x_i)\)对于每个\((i, x_i, y_i)\)来讲均是定值,在肯定\(x_i\)状况下,输出是\(y_i\)的几率是肯定的。在通常的状况下,对于每个肯定的输入,输出某个类别的几率是0或者1,因此能够将真实几率添加到上述式子中而不改变式子自己的意义:

    \[\theta^{*} = {argmax}_{\theta}\sum_{i}P_{data}(y_i;x_i)log(P(y_i;x_i, \theta))\]

    \(D_{KL}\)展开,获得,

    \[D_{KL}(P || Q) = - \sum_{i}P(i)log(\frac{Q(i)}{P(i)}) = \sum_{i}P(i)log(P(i)) - \sum_{i}P(i)log(Q(i)) \]

    \(P(i)\)表明\(P_{data}(y_i;x_i)\)\(Q(i)\)表明\(P(y_i;x_i,\theta)\)

    上述右侧式中第一项是和仅真实分布\(P(i)\)有关的,在最小化\(D_{KL}\)过程当中是一个定值,因此最小化\(D_{KL}\)等价于最小化\(-\sum_{i}P(i)log(Q(i))\),也就是在最大化似然函数。
    • 函数形式(以二分类任务为例)

      \[loss = \sum_{i}y(x_i)log(a(x_i)) + (1 - y(x_i))log(1 - a(x_i))\]
      其中,\(y(x_i)\)是真实分布,\(a(x_i)\)是神经网络输出的几率分布
    • 反向传播

      \[\frac{\partial{loss}}{\partial{z}} = (-\frac{y(z)}{a(z)} + \frac{1 - y(z)}{1 - a(z)})*\frac{\partial{a(z)}}{\partial{z}} = \frac{a(z) - y(z)}{a(z)(1-y(z))}*\frac{\partial{a(z)}}{\partial{z}}\]

      在使用sigmoid做为激活函数状况下,\(\frac{\partial{a(z)}}{\partial{z}} = a(z)(1-a(z))\),也就是说,sigmoid自己的梯度和分母相互抵消,获得,

      \[\frac{\partial{loss}}{\partial{z}} = \frac{a(z) - y(z)}{y(z)(1-a(z))}*\frac{\partial{a(z)}}{\partial{z}} = a(z) - y(z)\]

      在上述反向传播公式中再也不涉及到sigmoid自己的梯度,故不会受到在偏差很大时候函数饱和致使的梯度消失的影响。

      总的说来,在使用sigmoid做为激活函数时,使用交叉熵计算损失每每比使用均方偏差的结果要好上一些。可是,这个也并非绝对的,须要具体问题具体分析,针对具体应用,有时须要自行设计损失函数来达成目标。

      参考资料:

      http://www.javashuo.com/article/p-orarojbi-ko.html

      https://www.zhihu.com/question/20447622/answer/161722019

      《信息论基础》

点击这里提交问题与建议
联系咱们: msraeduhub@microsoft.com
学习了这么多,还没过瘾怎么办?欢迎加入“微软 AI 应用开发实战交流群”,跟你们一块儿畅谈AI,答疑解惑。扫描下方二维码,回复“申请入群”,即刻邀请你入群。

相关文章
相关标签/搜索