我们知道神经网络是由很多神经元组成的多层网络结构,我们的最终目标是找到各层合适的权重参数w使得最终的输出结果能够与实际结果更加接近。**那神经网络的这些权重参数是如何的得到的呢?**其实主要就是靠“损失函数”这个指标来进行一步步训练优化的。下面一起来了解一下神经网络的驱动核心—损失函数吧。
神经网络的学习目标
神经网络的“学习”是指从训练数据中自动获取最优权重参数的过程,即神经网络自我训练的过程。为了使神经网络能进行学习,将导入损失函数这一指标。通过使损失函数最小,来寻找最优权重参数。
学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。
从数据中学习
神经网络的特征就是可以从数据中学习。所谓“从数据中学习”,是指可以由数据自动决定权重参数的值。以如何实现数字5的识别为例,下图给出了三种方式:
1,通过人想的算法;
2,通过人为的进行特征量的提取,然后使用机器学习算法;
3,直接通过神经网络深度学习,此处没有人的介入,不需要人来进行特征选择。
注:深 度 学 习 有 时 也 称 为 端 到 端 机 器 学 习(end-to-end machine learning)。这里所说的端到端是指从一端到另一端的意思,也就是从原始数据(输入)中获得目标结果(输出)的意思。神经网络的优点是对于所有问题都可以用同样的流程来进行解决。
训练数据和测试数据
机器学习中,一般将数据分为训练数据和测试数据两部分来进行学习和实验等。首先,使用训练数据进行学习,寻找最优的参数;然后,使用测试数据评价训练得到的模型的实际能力。为什么需要将数据分为训练数据和测试数据呢?因为我们追求的是模型的泛化能力。为了正确评价模型的泛化能力,就必须划分训练数据和测试数据。另外,训练数据也可以称为监督数据。
泛化能力是指处理未被观察过的数据(不包含在训练数据中的数据)的能力。获得泛化能力是机器学习的最终目标。仅仅用一个数据集去学习和评价参数,是无法进行正确评价的。这样会导致可以顺利地处理某个数据集,但无法处理其他数据集的情况。只对某个数据集过度拟合的状态称为过拟合( over fitting)。
损失函数
在神经网络的学习中,神经网络需要以某个指标为线索寻找最优参数(权重和偏置),而这个指标就是损失函数( loss function)。更新参数的方向是以损失函数的值尽可能小为参考标准。为了找到使损失函数的值尽可能小的地方,需要计算参数的导数(确切地讲是梯度),然后以这个导数为指引,逐步更新参数的值。
假设有一个神经网络,现在我们来关注这个神经网络中的某一个权重参数。此时,对该权重参数的损失函数求导,表示的是“如果稍微改变这个权重参数的值,损失函数的值会如何变化”。如果导数的值为负,通过使该权重参数向正方向改变,可以减小损失函数的值;反过来,如果导数的值为正,则通过使该权重参数向负方向改变,可以减小损失函数的值。不过,当导数的值为0时,无论权重参数向哪个方向变化,损失函数的值都不会改变,此时该权重参数的更新会停在此处。
一般用均方误差和交叉熵误差等。损失函数是表示神经网络性能的“恶劣程度”的指标。
均方误差
均方误差的数学公式如下:
yk是表示神经网络的输出, tk表示监督数据, k表示输出目标数据的维数。
交叉熵误差
交叉熵误差( cross entropy error)的数学公式如下:
如图所示, x等于1时, y为0;随着x向0靠近, y逐渐变小。因此,正确解标签对应的输出越大,式( 4.2)的值越接近0;当输出为1时,交叉熵误差为0。此外,如果正确解标签对应的输出较小,则式的值较大。
代码实现交叉熵误差:
min-batch学习损失函数计算
上述仅对单个数据进行了损失函数的计算,而机器学习需要对大批量的数据进行训练,因此在计算损失函数时必须将所有的训练数据作为对象。也就是说,如果训练数据有100个的话,我们就要把这100个损失函数的总和作为学习的指标。
如果有N个数据,则将平均损失函数作为训练目标,可以获得和训练数据的数量无关的统一指标:
假设数据有N个, tnk表示第n个数据的第k个元素的值( ynk是神经网络的输出, tnk是监督数据)。通过除以N可以将求的单个数据的平均损失函数,与训练数据的数量无关。
但是如果数据量非常大,比如 MNIST数据集的训练数据有60000个,要是以全部数据为对象求损失函数的和,则计算过程需要花费较长的时间。再者,如果遇到大数据,数据量会有几百万、几千万之多,这种情况下以全部数据为对象计算损失函数是不现实的。因此,我们从全部数据中选出一部分,作为全部数据的“近似”。神经网络的学习也是从训练数据中选出一批数据(称为mini-batch,小批量),然后对每个mini-batch进行学习。比如,从60000个训练数据中随机选择100笔,再用这100笔数据进行学习。这种学习方式称为mini-batch学习。
注:mini-batch的损失函数是利用一部分样本数据来近似地计算整体。也就是说,用随机选择的小批量数据(mini-batch)作为全体训练数据的近似值。
min-batch版交叉熵误差的代码实现:
其中,y为神经网络的输出,t为监督数据,y+1e-7主要是为了防止y为0时,出现负无穷大,导致计算失败的情况。
总结
1. 了解了神经网络的学习目标–损失函数最小;
2. 学习了两种常用的损失函数:均方误差与交叉熵误差;
3. 如何计算批量数据的交叉熵误差。
那么如何通过损失函数来逐步改变参数的值,从而使参数逐渐达到最优解,即损失函数值最小呢?下篇文章《神经网络参数梯度的计算方式》会进行说明。