神经网络在进行学习的过程中,会通过前一次学习所得到的权重参数作为一个指标来进行下一轮的学习,如果学习到的权重参数已经是最优解的话,那么学习将结束,得出最优权重参数,继而进行泛化能力(指处理未被学习过的数据是否准确的能力)的测试。所以,神经网络以某个指标为基准寻求最优权重参数,而这个指标即可称之为 “损失函数” 。(例如:在使用神经网络进行识别手写数字时,在学习阶段找出最佳参数中,最常用的方法是通过梯度下降法找出最优参数,使得通过损失函数计算的值降到最低)
———————————————下面是正文————————————————
损失函数是体现了神经网络在学习过程中对于监督数据(训练数据)在多大程度上不拟合(实际结果与预期结果相差多少)的函数,通常,神经网络在学习的过程中,如果对权重参数的损失函数进行求导操作,即可通过查看结果来了解到权重参数如果稍微增加或者减少时,损失函数的值将会如何进行变化,如果得出的结果为正,则需要通过将权重参数调小来减少损失函数的值,相反,如果损失函数为负,则需要通过将权重参数增大来减少损失函数的值,由此可知,损失函数得出的值越小,该权重参数就越优。
下面介绍几种比较常用的损失函数
一.均方误差
话不多说,先直接给出公式:
其中y表示神经网络经过了训练和激活之后的输出信号,t表示监督数据(训练数据),k表示维度
在这里假定y的输出信号为:
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] 十个数据,用1表示真实信号,0表示假信号,从中可以得知,第三个数据即为正确解
下面我们将使用python来对公式进行检验,选取 t 中的第三个数据作为正确解,而第三个正确解的 y 中概率为:0.6,所以:
def mean_squared(y,t):
return 0.5 * np.sum((y-t)**2)
y = np.array([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])
print(mean_squared(y,t))
得到的结果为:
而如果选取选取 t 中的第一个数据作为正确解,那么得出的结果为:
我们可以从例子中发现,第一个例子的损失函数的值更小,和监督数据之间的误差较小,所以第一个例子的输出结果和监督数据更加吻合。
二.交叉熵误差
公式:
此处先上公式的实现:
def cross_entropy(y,t):
value = 1e-10
return -np.sum(t*np.log(y+value))
从代码可以看出,公式中多出了一个值 value ,这是因为当对数 log 的输入 x 为 0 时,将会出现 log(0) = 负无限大,在代码里表示为 -inf:
如此,当加上一个极小值时,可以防止负无限大的情况发生。如此,我们使用上面的例子,选取 t 中的第三个数据作为正确解,而第三个正确解的 y 中概率为:0.6,所以:
def cross_entropy(y,t):
value = 1e-10
return -np.sum(t*np.log(y+value))
y = np.array([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])
print(cross_entropy(y,t))
得到的结果为:
而如果选取选取 t 中的第一个数据作为正确解,那么得出的结果为:
参考文献:
《深度学习入门-基于python的理论与实现》(日)斋藤康毅. 人民邮电出版社