从87页往下
总结:其实神经网络(深度学习),使用训练数据进行学习,严格地说,就是针对训练数据计算损失函数的值,找出使该值尽可能小的参数。
4.2.2交叉熵误差
均方差(均方差公式是什么)
除了均方差之外,交叉熵误差(crossentropyerror)也经常被用作损失函数。交叉熵误差如下式所示:
图4.2
log表示以e为底数的自然对数(loge).yk是神经网络的输出,tk是正确解标签。并且,tk中只有正确解标签的索引为1,其它均为0(one-hot表示)。因此,式(4.2)实际上只计算对应正确解标签的输出的自然对数。
比如,假设正确解标签的索引是“2”,与之对应的神经网络的输出是0.6,则交叉熵误差是-log0.6=0.51;若“2”对应的输出是0.1,则交叉熵误差为-log0.1=2.3.
也就是说,交叉熵误差的值是由正确解标签所对应的输出结果决定的。
自然对数y=logx的图像
如上图所示,x等1是,y为0;随着x向0靠近,y逐渐变小。因此正确解标签对应的输出E越大,式4.2中yk越接近0;当yk输出为1时,E(交叉熵误差)为0。此外,如果正确解标签对应的输出较小,则式4.2的值较大。
下面,我们用代码实现交叉熵误差。
这里,参数y和t是numpy数组。函数内部在计算Log时,加上一个微小值delta,这是因为,当出现np.log(0)时会变成负无穷大的-inf,导致后续计算无法进行。作为保护性对策,添加一个微小值可以防止负无限大的发生。
下面我们使用cross_entropy_error(y,t)进行一些简单计算。
第一个例子中,正确解标签对应的输出是0.6,此时交叉熵误差大约为0.51,。第二个例子中,正确解标签对应的输出为0.1的低值,此时交叉熵误差大约为2.3.
(这样可以看出,yk是神经网络的输出,tk是正确解标签,当正确解标签yk输出越大,表示命中概率越大<这里是0.6>,此时交叉熵误差E越小<这里是0.51>当yk的输出越大,也就是概率越大,交叉熵的误差越小)-by飞霜
4.2.3mini-batch学习
机器学习使用训练数据进行学习。使用训练数据进行学习,严格地说,就是针对训练数据计算损失函数的值,找出使该值尽可能小的参数。因此计算损失函数时,必须将所有的训练数据作为对象。也就是说,如果训练数据有100个的话,我们就要把这100个损失函数的总和作为学习的指标。
前面介绍的损失函数的例子中考虑的都是针对单个数据的损失函数。如果要求所有训练数据的损失函数的总和,以交叉熵误差为例,可以写成下面的式(4.3)
式4.3
这里,假设数据有N个,tnk表示第n个数据的第k个元素的值(ynk是神经网络的输出,tnk是监督数据)式子虽然看起来有一些复杂,其实只是把求单个数据的损失函数的式(4.2)扩大到了N份数据,不过最后还要除以N进行正规化。
通过除以N,可以求单个数据的“平均损失函数”。通过这样的平均化,可以获得和训练数据的数量无关的统一指标。比如,即便训练数据有1000个或10000个,也可以求得单个数据的平均损失函数。
如果遇到大数据,数据量会有几百万、几千万之多,这种情况下以全部数据为对象计算损失函数是不现实的,因此,我们从全部数据中选出一部分,作为全部数据的“近似”。
神经网络的学习也是从训练数据中选出一批数据(称为mini-batch,小批量),然后对每个mini-batch进行学习。比如,从60000个训练数据中随机选择100笔,再用这100笔数据进行学习,这种学习方式称为mini-batch学习。
下面,我们来编写从训练数据中随机选择指定个数的数据的代码,以进行mini-batch学习。在这之前,先来看一下用于读入MNIST数据集的代码。
load_minist函数是用于读入MNIST数据集的函数,这个函数在本书提供的mnist.py中,它会读入训练数据和测试数据。
读入数据时,通过设定参数one_hot_label=True,可以得到one-hot表示,(即仅正确解标签为1,其余为0的数据结构。)
读入上面的MNIST数据后,训练数据有60000个,输入数据是784维(28*28)的图像数据,监督数据是10维的数据。因此,上面的x_train\t_train的形状分别是(60000,784)和(60000,10)。
那么,如何从这个训练数据中随机抽取10笔数据呢?我们可以使用NumPy的np.random.choice(),写成如下形式。
使用np.random.choice()可以从指定的数字中随机选择想要的数字。比如np.random.choice(60000,10)会从0到59999之间随机选择10个数字。如下面的实际代码所示,我们可以得到一个包含备选数据的索引的数组。
之后,我们只需要指定这些随机选出的索引,取出mini-batch,然后使用这个mini-batch计算损失函数即可。
计算电视收视率时,并不会统计所有家庭的电视机,而是仅以被选中的家庭为统计对象。比如,通过从关东地区随机选择1000个家庭计算收视率,可以近似地求得关东地区整体的收视率。和收视率一样,mini-batch的损失函数也是利用一部分样本数据来近似地计算整体。也就是说,用随机选择的小批量数据(mini-batch)作为全体训练数据的近似值。
4.2.4mini-batch版交叉熵误差的实现
如何实现对应mini-batch的交叉熵误差呢?只要改良一下之前实现的对应单个数据的交叉熵误差就可以了。这里,我们来实现一个可以同时处理单个数据和批量数据(数据作为batch集中输入)两种情况的函数。
备注:
2.y.ndim:表示array的行数:
3.np.reshape()
矩阵改变形状,但是不改变里面的数据。
参考:
这里,y是神经网络的输出,t是监督数据。y的维度为1时,即求单个数据的交叉熵误差是,需要改变数据的形状。并且,当输入为mini-batch时,要用batch的个数进行正规化,计算单个数据的平均交叉熵误差。
-----------------------------看到这里---------
看了下这里还挺复杂,明天单独写吧。
看到page91页。
补一下对上图公式的理解:
发表评论