top of page
アンカー 1

一、前文回顾

上一节我们使用提前训练好的权重参数尝试了神经网络识别手写数字,正确率可以达到94%。但是这个训练好的权重是怎么训练的?这便是这节的内容:神经网络的自我学习。


二、神经网络的自我学习

我们在讲感知器的时候,权重参数(w1,w2,b)都是手动设置的,这是一个只有三个参数的很小的神经元,所以我们可以做到手动设置参数。但是如果面对几十层的神经网络,权重参数会达到上亿个,手动设置那简直就是不可能完成的任务了。

那么这个问题怎么解决?答案就是我们只负责给神经网络一堆训练数据,让神经网络自己去寻找最佳权重参数,神经网络的这个寻找最佳参数的过程就叫做自我学习过程。而根据学习好的权重参数对目标进行识别的过程,叫做推理过程

用我们生活中的例子来讲,比如教小孩子识数,你拿出一张写有数字1的卡片(训练数据)给他看,然后告诉他这是1(标签),小孩学会以后(找到最佳权重参数),你再拿出另外一张写有数字1的卡片(测试数据)让他去识别,如果他真的学会了的话肯定会告诉你这是数字1。(推理过程)

我们结合神经网络整理一下学习的详细过程:

①小孩子看到一个数字卡片,觉得是2.

⇒给神经网络输入训练数据(数字卡片),并且随机设置权重参数,然后让神经网络进行推理,它判断这是2

②你告诉错了,这是1.(他貌似懂了)

⇒上一步推理得出的结果与标签数据(可以理解为正确答案)进行比较,发现错了,那么说明现在的权重参数不对,那就修改一下。

③你再拿出一张卡片给他看,他又觉得是3

⇒给神经网络重新输入训练数据(数字卡片),并且使用上一步调整过的权重参数让神经网络进行推理,它判断这是3

④你再告诉他,错了,这还是1(他貌似又懂了)

⇒上一步推理得出的结果与标签数据进行比较,发现又错了,那么说明现在的权重参数还是不对,那就再修改一下。

然后一直重复修改,直到找到最佳权重,这时候就代表它学会了。


听起来似乎也不是很难,但是这里会有一个问题,上面的②④都需要修改权重参数,那么怎么修改权重参数?如果是随便瞎改的话,就没有任何意义了,毕竟1亿个权重参数就算是通过计算机随机修改的话,100年估计都找不到最佳权重。所以这中间肯定有什么规律的。没错,这就是接下来要说的损失函数。(又来一个函数。。)


三、损失函数之均方误差函数(Mean-Square Error)

什么是损失函数,顾名思义,就是推理结果和正确结果之间的损失,用数学公式来表达是这样子的

其中t代表标签数据,也就是正确答案,y代表推理出来的结果,下表k代表输出个数,例如在手写数字识别的时候,神经网络的输出y和训练标签t如下:

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 ]

那么损失函数E=((0.1-0)**2 +(0.05-1)**2 +(0.6-0)**2省略+(0.0-0)**2 )/2

用python的话就是

def sum_squared_error(y, t):
    return 0.5 * np.sum((y - t) ** 2)

这个损失函数也叫均方误差(mean-square error, MSE)函数,是反映估计量与被估计量之间差异程度的一种度量。它的值越小,说明推理结果越接近正确值,如果把神经网络的输出y=f(w*x+b)代入到损失函数就会变成这样子:

f代表激活函数,x代表输入数据,b代表偏置项,W代表权重参数。

这时候再回到神经网络,我们调整权重参数W,只要使得上面这个损失函数的值最小,那么就说明我们的推理值越接近正确值。到此为止成功把一个抽象问题转为了数学问题。至于怎么调整W可以使损失函数的值最小,下一节再讲。


四、损失函数之交叉熵代价函数(Cross Entry Error)

上面讲到的均方差损失函数之外还有一种损失函数:交叉熵代价函数

其中t代表标签数据,也就是正确答案,y代表推理出来的结果,下表k代表输出个数。

上节讲过神经网络训练的时候一般都是批处理(比如100张图片同时输入神经网络),所以这个损失函数对应也需要修改一下

N代表批处理个数,下标nk代表第n个数据的第k个值,其实就是把单个损失函数扩张为N个而已,然后最后除以N进行正规化。

相应的Python

def cross_entropy_error(y, t):
    # y为推理值,t为标签
    # 如果是一维数组,转为二维数组,以便行列式相乘时不会出错。比如[1 2 3]转为 [[1 2 3]]
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    batch_size = y.shape[0]
    # 极小值1e-7是为了防止log(0)发生
    return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

五、总结

自主学习能力(自动调整权重参数)是神经网络的最厉害的地方,学习的过程如下:

①随机设置权重参数

②数据输入神经网络进行推理

③通过损失函数计算推理结果和正确结果的偏差

④如果损失函数没有达到最小值,调整权重

⑤返回步骤②

下一节就来看看怎么样调整权重才能使得损失函数达到最小值。

bottom of page