Keras深度学习——深度学习中常用损失函数详解

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

损失函数

利用损失函数计算损失值,模型就可以通过反向传播去更新各个参数,通过降低真实值与预测值之间的损失,使得模型计算得到的预测值趋近于真实值,从而达到模型训练的目的,在构建神经网络时通常使用的损失函数如下。损失函数需要为非负实值函数。

均方误差

误差是网络输出的预测值与实际值之差。我们对误差取平方,是因为误差可以是正值或负值。平方确保正误差和负误差不会相互抵消。我们计算均方误差 (Mean Square Error, MSE),以便当两个数据集的大小不相同时,它们间的误差是可比较的。预测值 (p) 和实际值 (y) 之间的均方误差计算如下:

m s e ( p , y ) = 1 n i = 1 n ( p y ) 2 mse(p,y)=\frac 1 n \sum _{i=1} ^n(p-y)^2

使用 Python 实现此函数:

def mse(p, y):
    return np.mean(np.square(p - y))
复制代码

当神经网络需要预测连续值时,通常使用均方误差。

平均绝对误差

平均绝对误差 (Mean Absolute Error, MSE) 的工作方式与均方误差非常相似。平均绝对误差通过对所有数据点上的实际值和预测值之间的绝对差值取平均值,从而确保正误差和负误差不会相互抵消。预测值 (p) 和实际值 (y) 之间的平均绝对误差的实现方式如下:

m s e ( p , y ) = 1 n i = 1 n p y mse(p,y)=\frac 1 n \sum _{i=1} ^n|p-y|

使用 Python 实现此函数:

def mae(p, y):
    return np.mean(np.abs(p - y))
复制代码

与均方误差相似,平均绝对误差通常用于连续变量值的预测。

分类交叉熵

交叉熵是对两种不同分布(实际分布和预测分布)之间差异的度量。与上述两个损失函数不同,它被广泛用于离散值输出数据。两种分布之间的交叉熵计算如下:

( y l o g 2 p + ( 1 y ) l o g 2 ( 1 p ) ) -(ylog_2p+(1-y)log_2(1-p))

y y 是实际结果, p p 是预测结果。预测值 (p) 和实际值 (y) 之间的分类交叉熵的 python 实现方式如下:

def categorical_cross_entropy(p, y):
    return -np.sum((y*np.log2(p) + (1-y)*np.log2(1-p)))
复制代码

当预测值远离实际值时,分类交叉熵损失具有较高的值,而当与实际值接近时,分类交叉熵损失具有较低的值。

Smooth L1 损失

通常我们将平均绝对误差成为 L1 损失,而均方误差称为 L2 损失,但是它们都是有缺陷的,前者的问题在于梯度不平滑,后者则容易导师梯度爆炸,为了客服它们的缺陷,smooth L1 损失被提出,其融合和 L1 和 L2 损失的优点,解决梯度不平滑或梯度爆炸问题,其公式如下:

s m o o t h _ L 1 = { 0.5 ( p y ) 2 , p y < 1 p y 0.5 , x 0 smooth\_L1= \begin{cases} 0.5(p-y)^2, & {|p-y|<1} \\ |p-y|-0.5, & {x\ge0} \end{cases}

当预测值与真实值间的差距较大时,上式等价于 L1 损失,当它们的差距较小时,等价于 L2 损失,这样就可以防止梯度过大。

猜你喜欢

转载自juejin.im/post/7086447923738705956
今日推荐