写在前面
搭建完网络层后,在每层网络中都要进行前向计算,下一步就是选择合适的误差函数来计算误差。其中均方差函数和交叉熵函数在深度学习中比较常见,均方差函数主要用于回归问题,交叉熵函数主要用于分类问题。
写在中间
均方差函数
( 1 )简单介绍
均方差函数(简称 MSE)把输出向量和真实向量映射到笛卡尔坐标系的两个点上,通过计算这两个点之间的欧式距离(准确地说是欧式距离的平方)来衡量两个向量之间的差距:
MSE 误差函数的值总是大于等于 0,值越小,越接近真实值。
当 MSE 函数达到最小值 0 时,输出值等于真实标签,此时神经网络的参数达到最优状态。
( 2 )函数实现
# 均方差函数的实现有多种
import tensorflow as tf
# 方法一:
tf.reduce_mean(tf.square(y_true - y_pred))
# 方法二:
tf.keras.losses.MSE(y_true, y_pred)
交叉熵函数
介绍交叉熵函数之前,我们先了解 熵 和 KL散度 这两个概念
熵
熵用来衡量信息的不确定度,熵越大,代表不确定性越大。
公式如下:
熵的计算
熵怎样计算?对于分类问题:
- 如果某个样本的标签的 One-hot 编码为[0, 0, 0, 1],即这张图片的分类是唯一确定的,不确定性为 0。它属于第 4 类的概率𝑃(𝑦为 4|𝒙) = 1,此标签的熵可以简单的计算为:
- 如果某个样本的标签的 One-hot 编码为[0.1, 0.1, 0.1, 0.7],即这张图片的分类属于第四类的概率较大,此标签的熵就可以计算为:
很明显,第二个结果的熵比第一个熵大,不确定度也大得多,因此最小化熵的过程也是最大化正确类别的预测概率的过程。从这个角度去理解交叉熵损失函数,非常地直观易懂。
KL散度
如果我们对于同一个随机变量 i 有两个单独的概率分布 p(i) 和 q(i),我们可以使用 KL 散度来衡量这两个分布的差异:
在深度学习中,我们通常把真实的标签分布(通常是 one-hot 编码)视为 p,把模型预测的概率分布视为 q。
KL散度的计算公式为
我们仍然使用上面的例子,标签的one-hot编码为[0, 0, 0, 1],预测值为[0.1, 0.1, 0.1, 0.7],KL散度计算结果为:
交叉熵
终于要介绍交叉熵了,你一定会猜到讲上面的知识会和交叉熵有关,对你猜的没错!
交叉熵损失函数的计算公式为:
其实就是熵和KL散度的加和,稍加变形就得到:
交叉熵函数的实现
import tensorflow as tf
# 假设 y_true 是真实的标签,y_pred 是模型的预测值
y_true = [[0, 0, 0, 1], [0, 1, 0, 0]]
y_pred = [[0.1, 0.1, 0.1, 0.7], [0.1, 0.6, 0.1, 0.2]]
loss = tf.keras.losses.categorical_crossentropy(y_true, y_pred)