概念
神经网络的学习通过某个指标表示现在的状态。然后以这个指标为基准,寻找最优权重参数。神经网络的学习中所用的指标称为损失函数(loss function)。这个损失函数可以使用任意函数, 但一般用均方误差和交叉熵误差等。
损失函数是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。 以“性能的恶劣程度”为指标可能会使人感到不太自然,但是如果给损失函数乘上一个负值,就可以解释为“在多大程度上不坏”, 即“性能有多好”。
均方误差
上面的公式中,yk是表示神经网络的输出,tk表示监督数据,k表示数据的维数。以0~9手写数字识别为例,神经网络softmax函数的输出y是:
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
由于softmax函数的输出可以理解为概率,因此上例表示“0”的概率是0.1,“ 1”的概率是0.05,“ 2”的概率是0.6 等。
t是监督数据,将正确解标签设为1,其他均设为0。假设该案例的t值为:
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
这里,标签“2”为 1, 表示正确解是“2”。(将正确解标签表示为1,其他标签表示为0的表示方法称为one-hot表示。)
均方误差会计算神经网络的输出和正确解监督数据的各个元素之差的平方,再求总和。则python实现代码为:
def mean_squared_error(y, t):
return 0.5 * np.sum((y-t)**2)
假设该案例的正确解为2,即:
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
1)第一种情况:
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
此时,标签为2的概率为0.6. 则计算的损失函数结果为:
loss1 = mean_squared_error(np.array(y1), np.array(t))
loss1 = 0.097500000000000031
2)第二种情况:
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
此时,标签为7的概率最高,为0.6.此时计算损失函数的结果是:
loss2 = mean_squared_error(np.array(y2), np.array(t))
loss2 = 0.59750000000000003
比较两个损失函数结果,第一个例子的损失函数的值更小,表示结果数据和监督数据之间的误差较小。即,均方误差显示第一个例子的输出结果与监督数据更加吻合。
交叉熵误差
log表示以e为底数的自然对数(log e)。 yk是神经网络的输出,tk是正确解标签。
因为 tk中只有正确解标签的索引为1,其他均为0(one-hot表示)。 因此,式实际上只计算对应正确解标签的输出的自然对数。交叉熵误差的值是由正确解标签所对应的输出结果决定的。
如上图所示,x等于1时,y为0;随着x向0靠近,y逐渐变小。因此,正确解标签对应的输出越大,损失函数的值越接近0。python实现代码如下:
def cross_entropy_error(y, t):
delta = 1e-7
return -np.sum(t * np.log(y + delta))
同上述案例,假设正确解为2,即:
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
1)第一种情况:
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
此时,标签为2的概率为0.6. 则计算的损失函数结果为:
loss1 = cross_entropy_error(np.array(y1), np.array(t))
loss1 = 0.51082545709933802
2)第二种情况:
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
此时,标签为7的概率最高,为0.6.此时计算损失函数的结果是:
loss2 = cross_entropy_error(np.array(y2), np.array(t))
loss2 = 2.3025840929945458
比较两个损失函数结果,第一个例子的损失函数的值更小,表示结果数据和监督数据之间的误差较小。即,交叉熵误差显示第一个例子的输出结果与监督数据更加吻合。
参考:深度学习入门–基于python的理论与实现(Deep learning from scratch)