损失函数度量的是训练的模型与真实模型之间的距离。一般以最小化损失函数为目标,对模型进行不断优化。

常见的损失函数在计算过程中都会接受两个参数:模型预测值y_pred和正确答案y_true

由于背后的数学计算过程相同,所以即使是不同深度学习框架这些损失函数的api也是大同小异。本文以keras为例,罗列出几个常见的损失函数。

均方误差 mean squared error, MSE

回归任务常用的损失函数,也是最简单粗暴的损失函数。

loss = mean(square(y_true - y_pred), axis=-1)

api: keras.losses.mean_squared_error(y_true, y_pred)

平均绝对误差 mean absolute error, MAE

loss = abs(y_true - y_pred)

api: keras.losses.mean_absolute_error(y_true, y_pred)

mean absolute percentage error

没了解过,先记着。

loss = 100 * abs(y_true - y_pred) / y_true

api:keras.losses.mean_absolute_percentage_error(y_true, y_pred)

hinge loss

合页损失函数

loss = mean(maximum(1 - y_true * y_pred, 0), axis=-1)

api: keras.losses.hinge(y_true, y_pred)

相对熵 Kullback-Leibler divergence, KL散度

loss = y_true * log(y_true / y_pred)

api: keras.losses.KLD()

sparse categorical crossentropy

稀疏的类别交叉熵,主要用于多分类。

其中y_pred是一般是未经处理的logits,当然也可以是softmax归一化后的概率分布(keras默认)

y_true是标签

categorical crossentropy

类别交叉熵,和sparse categorical crossentropy唯一的区别就是,这里的y_true是one-hot形式

binary_crossentropy 二元交叉熵

对于二分类的问题,多分类的交叉熵直接使用二元交叉熵

api:keras.losses.binary_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)

余弦相似度

余弦相似度是两个向量的夹角的余弦值。

一般计算方法为:

\[cosine\_similarity = \frac{a \cdot b}{||a|| ||b||}
\]

keras计算的时候,会把上式拆成两个l2_norm的相乘:

loss = -sum(l2_norm(y_true) * l2_norm(y_pred))

这里的l2_norm就是

\[l2\_norm(x) = \frac{x}{max(\sum_i x_i^2, epsilon)}
\]

epsilon就是为了避免向量的元素和为0

api: keras.losses.cosine_similarity(y_true, y_pred, axis=-1)

keras把计算的值取负了,这样越接近-1相似度越高。