PyTorch入门实战教程笔记(十二):梯度相关操作3

PyTorch入门实战教程笔记(十二):梯度相关操作3

感知机的梯度推导

  1. 单层感知机
    y = ΣxiWi + b,结合下图简化结构,我们讲一下命名规则。
    PyTorch入门实战教程笔记(十二):梯度相关操作3_第1张图片
    我们把输入层即第0层编号为x00-n; 上图横线部分为第一层,包含W1ij, 1代表第一层的参数W,i表示连接上一层的神经元的序号,j代表连接这一层的神经元的序号;激活函数用Sigmoid激活函数,用δ表示,经过激活函数的输出用O10表示,代表第一层的输出,第0号节点。E代表error,t代表target。
    详细求导过程如下图:
    PyTorch入门实战教程笔记(十二):梯度相关操作3_第2张图片
    即最终结果为下式,也就是Wj0的梯度只与输出O0, x0j有关。
    在这里插入图片描述
    pytorch例子,定义一个输入x,其shape为[1, 10], 参数W,其shape为[1, 10], 然后通过x @ W.t(), 即[1, 10] @ [1,10]T得 [1, 1]. 通过F.mse_loss(torch.ones(1,1), o) 来计算标签[1, 1]和输出[1, 1]之间的mse均方差。然后利用loss.backward(),即可计算出所有Wj0的梯度,然后利用W = W - 0.001
    ▽W来更新W,直到x*W接近真实值y,完成梯度更新。代码如下:
    PyTorch入门实战教程笔记(十二):梯度相关操作3_第3张图片
  2. 多层感知机
    多层感知机的结构如下图:一共有N×M个连接
    PyTorch入门实战教程笔记(十二):梯度相关操作3_第4张图片
    详细求导过程如下图(可以发现形式基本和单层感知机一样):
    PyTorch入门实战教程笔记(十二):梯度相关操作3_第5张图片
    pytorch例子,定义一个输入x,其shape为[1, 10], 参数W,其shape为[2, 10], 然后通过x @ W.t(), 即[1, 10] @ [2, 10]T得 [1, 2]. 通过F.mse_loss(torch.ones(1,2), o) 来计算标签[1, 1]和输出[1, 1]之间的mse均方差。然后利用loss.backward(),即可计算出所有Wj,0-1的梯度,然后利用W = W - 0.001▽W来更新W,直到xW接近真实值y,完成梯度更新。代码如下:
    PyTorch入门实战教程笔记(十二):梯度相关操作3_第6张图片

链式法则

通过链式法则,将最后一层的误差,一层一层的输出到中间层的权值上面去,从而得到中间层的一个梯度信息,来更新权值,达到最优化的效果。表达式及运算举例如下图;
PyTorch入门实战教程笔记(十二):梯度相关操作3_第7张图片
现在我们拿一个两层的神经元来举例,输入x,中间层为O1,输出层为O2,误差E对W2的偏导直接能求(就是单层感知机),误差E对W1求解需要通过链式法则,具体如下式,这样E对O2k的偏导,O2k对O1k的偏导,O1k
输入x的偏导,都比较好求,进而求得误差E对W1的梯度。
PyTorch入门实战教程笔记(十二):梯度相关操作3_第8张图片
pythorch代码实现,y1 = xw1 + b1, y2 = xw2 + b2, dy2_dy1为y2对y1的求导,dy1_dw1为y1对w1的求导,dy2_dw1为y2对w1的求导,可以验证链式法则,dy2_dy1*dy1_dw1 = dy2_dw1是成立的。注意到,pytorch一个语句即可实现对所有w的自动求导,大大减少了人为的运算和代码的繁琐度。
PyTorch入门实战教程笔记(十二):梯度相关操作3_第9张图片

你可能感兴趣的:(PyTorch实战学习笔记)