损失函数是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。以“性能的恶劣程度”为指标可能会使人感到不太自然,但是如果给损失函数乘上一个负值,就可以解释为“在多大程度上不坏”,即“性能有多好”。并且,“使性能的恶劣程度达到最小”和“使性能的优良程度达到最大”是等价的,不管是用“恶劣程度”还是“优良程度”,做的事情本质上都是一样的。这个损失函数可以使用任意函数,但一般用均方误差和交叉熵误差等。
1. 均方误差(mean squared error):该值越大说明误差越大,说明神经网络性能越差。
单个样本的均方误差:
所有样本的均方误差:,就是把单个样本的均方误差累加,并除以样本数量N,进行正规化。
这里,yk 是表示神经网络的输出,tk 表示监督数据,k 表示数据的维数。
比如,yk、tk 是由如下 10 个元素构成的数据(单个样本)。
>>> y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
>>> t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
数组元素的索引从第一个开始依次对应数字“0”“1”“2”……这里,神经网络的输出 y
是 softmax 函数的输出。由于 softmax 函数的输出可以理解为概率,因此上例表示“0”的概率是 0.1,“1”的概率是 0.05,“2”的概率是 0.6 等。t
是监督数据,将正确解标签设为 1,其他均设为 0。这里,标签“2”为 1,表示正确解是“2”。将正确解标签表示为 1,其他标签表示为 0 的表示方法称为 one-hot 表示。
现在,我们使用这个函数,来实际地计算一下。
>>> # 设“2”为正确解
>>> t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
>>>
>>> # 例1:“2”的概率最高的情况(0.6)
>>> y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
>>> mean_squared_error(np.array(y), np.array(t))
0.097500000000000031
>>>
>>> # 例2:“7”的概率最高的情况(0.6)
>>> y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
>>> mean_squared_error(np.array(y), np.array(t))
0.59750000000000003
这里举了两个例子。第一个例子中,正确解是“2”,神经网络的输出的最大值是“2”;第二个例子中,正确解是“2”,神经网络的输出的最大值是“7”。如实验结果所示,我们发现第一个例子的损失函数的值更小,和监督数据之间的误差较小。也就是说,均方误差显示第一个例子的输出结果与监督数据更加吻合。
2. 交叉熵误差(cross entropy error):该值越大说明误差越大,说明神经网络性能越差。
单个样本的交叉熵误差:
所有样本的交叉熵误差:,这个式子看起来复杂,其实就是把n个样本的单个样本交叉熵误差进行了累加,然后除以样本数N进行正规化。
这里,log 表示以 e为底数的自然对数(loge)。yk 是神经网络的输出,tk 是正确解标签。并且,tk 中只有正确解标签的索引为 1,其他均为 0(one-hot 表示)。因此,式(4.2)实际上只计算对应正确解标签的输出的自然对数。比如,假设正确解标签的索引是“2”,与之对应的神经网络的输出是 0.6,则交叉熵误差是 -log 0.6 = 0.51;若“2”对应的输出是 0.1,则交叉熵误差为 -log 0.1 = 2.30。也就是说,交叉熵误差的值是由正确解标签所对应的输出结果决定的。