聊聊 神经网络模型 传播计算逻辑

发布时间 2023-12-02 14:41:54作者: 又见阿郎

概述

预训练过程就是在不断地更新权重超参数与偏置超参数,最后选择合适的超参数,生成超参数文件。上一篇博客 是使用已有的预训练超参数文件,要训练自己的超参数,需要对神经网络层中前向传播与反向传播计算熟悉,了解计算逻辑,才能不断地更新选择合适的超参数。

神经网络计算详解

整个神经网络的层数是4层,从顺序来分别是:输入层,两层隐藏层,输出层。隐藏层的激活函数选择sigmoid函数;输出层用softmax函数归一化处理。
神经网络的各层参数和激活函数符号化如下:

  • 输入层:(x)
  • 第一个隐藏层:($h^1$)
  • 第二个隐藏层:($h^2$)
  • 输出层:(y)
  • 权重参数:($W^1, W^2, W^3$)
  • 偏置参数:($b^1, b^2, b^3$)
  • 激活函数:($g(\cdot)$) (例如,Sigmoid、ReLU)
  • 损失函数:(L)

为简化推导,假设使用平方损失函数 ($L = \frac{1}{2} |y - \hat{y}|^2$),其中 ($\hat{y}$) 为真实标签。

前向传播

前向传播过程如下:

  1. 输入层到第一个隐藏层:
    $h^1 = g(W^1 \cdot x + b^1)$
  2. 第一个隐藏层到第二个隐藏层:
    $h^2 = g(W^2 \cdot h^1 + b^2)$
  3. 第二个隐藏层到输出层:
    $y = g(W^3 \cdot h^2 + b^3)$

接下来计算反向传播的过程,反向传播的计算过程基于链式法则,目的是计算损失函数相对于网络参数(权重和偏置)的梯度。

图文并茂可以阅读 聊聊神经网络的基础知识

反向传播

损失函数对输出层输出的梯度

对于平方损失函数:
$\frac{\partial L}{\partial y} = y - \hat{y}$

损失函数对输出层输入的梯度

记输出层的输入为
$a^3 = W^3 \cdot h^2 + b^3$
根据链式法则:$\frac{\partial L}{\partial a^3} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial a^3}$
$\frac{\partial L}{\partial a^3} = \frac{\partial L}{\partial y} \cdot g'(a^3)$
=> $\frac{\partial L}{\partial a^3} = \frac{\partial L}{\partial y} \cdot g'(W^3 \cdot h^2 + b^3)$
这里 $a'(\cdot)$ 是激活函数 $a(\cdot)$ 的导数。比如,如果使用 Sigmoid 激活函数,那么$a'(\cdot) = a(\cdot) \cdot (1 - a(\cdot))$

损失函数对输出层超参数的梯度

$\frac{\partial L}{\partial w^3} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial a^3} \cdot \frac{\partial a^3}{\partial w^3}$

$a^3 = W^3 \cdot h^2 + b^3$

$\frac{\partial a^3}{\partial w^3} = (h2)T$
=>$\frac{\partial L}{\partial w^3} =$$\frac{\partial L}{\partial a^3} \cdot (h2)T$= $\frac{\partial L}{\partial y} \cdot g'(W^3 \cdot h^2 + b^3) \cdot (h2)T$

第二个隐藏层,损失函数对输入的梯度

根据链式求导法则:
$\frac{\partial L}{\partial h^2} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial a^3}\cdot \frac{\partial a^3}{\partial h^2}$

由上可知,$a^3 = W^3 \cdot h^2 + b^3$
其中$W^3$和 $b3$是输出层的参数矩阵,$h2$ 是向量。我们想要计算 $a^3$ 对 $h^2$ 的导数。
我们对 $h^2$求导数,由于 $w^3$和 $b^3$ 不包含 $h^2$,它们在导数中变为零:
$\frac{\partial a^3}{\partial h^2} = \frac{\partial (w^3 \cdot h^2)}{\partial h^2} + \frac{\partial b^3}{\partial h^2}$
由于第二项为零。只需要计算第一项:
$\frac{\partial (w^3 \cdot h^2)}{\partial h^2}$
这里 $w^3$ 是矩阵, $h^2$ 是向量。使用矩阵微积分规则:
$\frac{\partial (w^3 \cdot h^2)}{\partial h^2} = (w3)T$
所以,导数 $(\frac{\partial a^3}{\partial h^2})$是 $(w3)T$,其中 $(w3)T$是$w^3$ 的转置矩阵。
最终, $a^3$ 对 $h2$的导数是$(w3)^T$。
$\frac{\partial L}{\partial h^2} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial a^3}\cdot \frac{\partial a^3}{\partial h^2}$
=>$\frac{\partial L}{\partial h^2} = \frac{\partial L}{\partial a^3} \cdot (W^{(3)T})$

第二个隐藏层,损失函数权重和偏置的梯度

根据上述计算逻辑,可以很方便的推出,损失函数对超参数$w2,b2$的梯度为
$\frac{\partial L}{\partial W^2} =h^{(1)T} \cdot \frac{\partial L}{\partial h^2}$
$\frac{\partial L}{\partial b^2} = \sum \frac{\partial L}{\partial h^2}$

第一个隐藏层,损失函数对输入,超参数的梯度

损失函数对输入$h^1$的梯度为
$\frac{\partial L}{\partial h^1} = \frac{\partial L}{\partial h^2} \cdot (W^{(2)T})$
损失函数对超参数$w1,b1$的梯度为
$\frac{\partial L}{\partial W^1} = x^T \cdot \frac{\partial L}{\partial h^1}$
$\frac{\partial L}{\partial b^1} = \sum \frac{\partial L}{\partial h^1}$
这样就完成了反向传播的输入、超参数计算过程。这些梯度的计算用于以更新神经网络的权重和偏置。

超参数的更新

上述已计算出来了超参数的梯度,现在用于更新神经网络的超参数,以输出层的权重超参数$w^3$更新为例;其公式为:
$W^{(3)} = W^{(3)} - \alpha \cdot \frac{\partial L}{\partial w^{(3)}}$
其中 $\alpha$为学习率 .