从page106 继续往下。
4.4.2 神经网络的梯度
神经网络的学习也要求梯度。这里所说的梯度是指损失函数关于权重参数的梯度。比如,有一个只有一个形状为2*3的权重W的神经网络,损失函数用L表示。此时,梯度可以用 表示。用数学式表示的话,如下所示
权重回顾:w11,w12 就是权重
的元素由各个元素关于W的偏导数构成。比如第一行第一列的元素 表示当稍微变化时,损失函数L会发生多大变化。这里的重点是, 的形状和W相同。实际上,式(4.8)的W和都是2*3的形状。
下面,我们以一个简单的神经网络为例,来实现求梯度的代码。为此,我们要实现一个名为simpleNet的类(源代码在ch04/gradient_simplenet.py)中。不知道为啥头条代码展示抽风了,代码截图如下:
图1:备注:-对gradient_simplenet.py的函数注解
这里使用了common/functions.py中的softmax 和 cross_entroy_error 方法,以及common/gradient.py中的numerical_gradient方法。simpleNet类只有一个实例变量,即形状为2*3的权重参数。它有两个方法,一个是用于预测的predict(x),另一个是用于求损失函数值的loss(x,t), 这里参数x 接受输入数据,t接收正确解标签。
predict 函数:page73页,神经网络的推理处理
page64页,softmax()函数的含义
page 67页,softmax函数的公式
2.关于cross_entropy_error方法原理:
page 87 关于交叉熵误差
page 88,cross_entorpy_error 函数代码
3.关于numerical_gradient函数:
page101,numerical_gradient函数的代码
书上是按照步骤一步步生成,先net.w生成随机数,然后用随机数做运算。(模拟 图1 gradient_simplenet.py 函数)
最后的梯度值为 :print(dW)
dW是一个形状为2*3的二维数组,观察一下dw的内容,例如,会发现 中的
的值大约是0.2,这表示如果将w11增加h,那么损失函数的值会增加0.2h。再如, 对应的值是-0.5,这表示如果将w23 增加h,损失函数将减小0.5h. 因此,从减小损失函数值的观点来看,w23应向正方向更新,w11应向负方向更新,更新的程度,w23 比w11的贡献要打。
另外,在上面的代码中,定义新函数时使用了“def f(x): ... ”,使用了lamda代码,关于lamda代码的解释:https://www.w3schools.com/python/python_lambda.asp
求出神经网络的梯度后,接下来只需根据梯度法,更新权重参数即可。在下一节中,我们会以2层神经网络为例,实现整个学习过程。
看到page109. 待续。
早上7点多开始打字,到现在才800多字,感觉到后面越看越慢了。
留言与评论(共有 0 条评论) “” |