损失函数的作用
“学习”本身是一个根据环境反馈(或观察),不断调整自我认知及行为的过程。
机器学习的过程也是一个“输入->输出->计算误差->调整模型”的过程。
将输入送入模型,经由模型内部大量参数计算,输出一个结果,再计算“误差”,并基于误差调整内部的参数。
这个误差就是由损失函数计算。
损失函数的种类
现假设有一个回归问题,将我们的模型抽象为一个函数H,输入为X,输出为H(X),真实标签为Y。
损失函数的作用就是度量模型输出 H(X) 与 真实标签 Y 之间的差距
最朴素的损失函数
直觉性的,我们可以将H(X)和Y做差,得到最朴素的损失函数。
显然,如果目标值为1,模型预测为0.5和1.5时,我们的损失函数给出的值应当是一致的。我们只希望计算“距离”,而不希望计算“方向”。
绝对值损失函数
因此,给这个朴素的损失函数加上一个绝对值,就演变成了最简单的绝对值损失函数
- 优点:1. 对异常点不敏感;2. 收敛速度快
- 缺点:1. 在0处不连续,需要额外处理; 2. 梯度固定,无论误差大小梯度都是一样的,需要动态调整学习率才能较好地收敛。
平方损失函数
我们也可以给这个损失函数求个平方,就得到了平方损失函数
- 优点:1. 处处可导; 2. 梯度随误差变化,不需要额外调整学习率
- 缺点:1. 扩大了误差,对异常点敏感
对数损失函数
我们还可以给这个损失函数求对数(这里面涉及分类问题和回归问题的区别,这里不细讲,本质上都是相似的)
在简单的二分类问题下,Y取值为0或1,输出的H(X)可以理解为1的概率,于是可以式子可以简化为
Hinge损失函数
交叉熵损失函数
熵的定义:p(x)log(p(x)),为什么?待填坑。 KL散度:用Q(x)建立编码来表达P(X),所需要的数据量,与用P(x)建立编码来表达P(X)的信息量不同。即为下式
这就是KL散度。 该式中,前一项plogp为p的熵。在实际计算分类问题时,p的值只能取0和1,因此可以将该项忽略,直接计算后一项。 这就是交叉熵,J为类别的数量,单个样本的交叉熵为
针对二分类问题,可以简化为
损失函数与风险函数
- 损失函数计算的是某一个样本点的误差。
- 风险函数:用于衡量'样本点平均意义'下的好坏,就是说要除以batch_size。 风险函数又分为经验风险与结构风险。经验风险即预测结果与实际结果的差值,结构风险即预测经验风险加上正则项。