ToB企服应用市场:ToB评测及商务社交产业平台

标题: 11.28深度学习_bp算法 [打印本页]

作者: 大号在练葵花宝典    时间: 2024-11-29 06:03
标题: 11.28深度学习_bp算法
七、BP算法

多层神经网络的学习本领比单层网络强得多。想要练习多层网络,需要更强大的学习算法。误差反向传播算法(Back Propagation)是其中最杰出的代表,它是目前最成功的神经网络学习算法。实际任务利用神经网络时,大多是在利用 BP 算法举行练习,值得指出的是 BP 算法不但可用于多层前馈神经网络,还可以用于其他类型的神经网络。通常说 BP 网络时,一样平常是指用 BP 算法练习的多层前馈神经网络。

误差反向传播算法(BP)的根本步骤:
1. 前向传播

前向传播(Forward Propagation)把输入数据经过各层神经元的运算并逐层向前传输,不停到输出层为止。

下面是一个简单的三层神经网络(输入层、隐蔽层、输出层)前向传播的根本步骤分析。
1.1输入层到隐蔽层
给定输入                                         x                                  x                     x 和权重矩阵                                                    W                               1                                            W_1                     W1​ 及偏置向量                                                    b                               1                                            b_1                     b1​,隐蔽层的输出(激活值)盘算如下:
                                                    z                                           (                                  1                                  )                                                 =                                       W                               1                                      ⋅                            x                            +                                       b                               1                                            z^{(1)} = W_1 \cdot x + b_1                     z(1)=W1​⋅x+b1​
将                                                   z                                           (                                  1                                  )                                                       z^{(1)}                     z(1) 通过激活函数                                         σ                                  \sigma                     σ举行激活:
                                                    a                                           (                                  1                                  )                                                 =                            σ                            (                                       z                                           (                                  1                                  )                                                 )                                  a^{(1)} = \sigma(z^{(1)})                     a(1)=σ(z(1))
1.2隐蔽层到输出层
隐蔽层的输出                                                    a                                           (                                  1                                  )                                                       a^{(1)}                     a(1) 通过输出层的权重矩阵                                                    W                               2                                            W_2                     W2​和偏置                                                    b                               2                                            b_2                     b2​ 天生最终的输出:
                                                    z                                           (                                  2                                  )                                                 =                                       W                               2                                      ⋅                                       a                                           (                                  1                                  )                                                 +                                       b                               2                                            z^{(2)} = W_2 \cdot a^{(1)} + b_2                     z(2)=W2​⋅a(1)+b2​
输出层的激活值                                                    a                                           (                                  2                                  )                                                       a^{(2)}                     a(2) 是最终的猜测结果:
                                                    y                               pred                                      =                                       a                                           (                                  2                                  )                                                 =                            σ                            (                                       z                                           (                                  2                                  )                                                 )                                  y_{\text{pred}} = a^{(2)} = \sigma(z^{(2)})                     ypred​=a(2)=σ(z(2))
前向传播的主要作用是:
2. 反向传播

反向传播(Back Propagation,简称BP)通过盘算损失函数相对于每个参数的梯度来调解权重,使模型在练习数据上的表现逐渐优化。反向传播结合了链式求导法则和梯度降落算法,是神经网络模型练习过程中更新参数的关键步骤。
2.1 原理

利用链式求导法则对每一层举行求导,直到求出输入层x的导数,然后利用导数值举行梯度更新
2.2. 链式法则

链式求导法则(Chain Rule)是微积分中的一个重要法则,用于求复合函数的导数。在深度学习中,链式法则是反向传播算法的基础,如许就可以通过分层的盘算求得损失函数相对于每个参数的梯度。以下面的复合函数为例:
                                         f                            (                            x                            )                            =                                       1                                           1                                  +                                               e                                                   −                                        (                                        w                                        x                                        +                                        b                                        )                                                                                \mathrm{f(x)=\frac{1}{1+e^{-(wx+b)}}}                     f(x)=1+e−(wx+b)1​
其中                                         x                                  x                     x 是输入数据,                                        w                                  w                     w 是权重,                                        b                                  b                     b 是偏置。
2.2.1 函数分解

可以将该复合函数分解为:
函数导数我们假设 w=0, b=0, x=1                                                               h                                     1                                              =                                  x                                  ×                                  w                                          h_1 = x \times w                           h1​=x×w                                                                             ∂                                                       h                                           1                                                                              ∂                                        w                                                           =                                  x                                  ,                                                                        ∂                                                       h                                           1                                                                              ∂                                        x                                                           =                                  w                                          \frac{\partial h_1}{\partial w} = x, \quad \frac{\partial h_1}{\partial x} = w                           ∂w∂h1​​=x,∂x∂h1​​=w                                                               h                                     1                                              =                                  x                                  ×                                  w                                  =                                  0                                          h_1 = x \times w = 0                           h1​=x×w=0                                                               h                                     2                                              =                                               h                                     1                                              +                                  b                                          h_2 = h_1 + b                           h2​=h1​+b                                                                             ∂                                                       h                                           2                                                                              ∂                                                       h                                           1                                                                         =                                  1                                  ,                                                                        ∂                                                       h                                           2                                                                              ∂                                        b                                                           =                                  1                                          \frac{\partial h_2}{\partial h_1} = 1, \quad \frac{\partial h_2}{\partial b} = 1                           ∂h1​∂h2​​=1,∂b∂h2​​=1                                                               h                                     2                                              =                                               h                                     1                                              +                                  b                                  =                                  0                                  +                                  0                                  =                                  0                                          h_2 = h_1 + b = 0 + 0 = 0                           h2​=h1​+b=0+0=0                                                               h                                     3                                              =                                               h                                     2                                              ×                                  −                                  1                                          h_3 = h_2 \times -1                           h3​=h2​×−1                                                                             ∂                                                       h                                           3                                                                              ∂                                                       h                                           2                                                                         =                                  −                                  1                                          \frac{\partial h_3}{\partial h_2} = -1                           ∂h2​∂h3​​=−1                                                               h                                     3                                              =                                               h                                     2                                              ×                                  −                                  1                                  =                                  0                                  ×                                  −                                  1                                  =                                  0                                          h_3 = h_2 \times -1=0 \times -1 = 0                           h3​=h2​×−1=0×−1=0                                                               h                                     4                                              =                                  e                                  x                                  p                                  (                                               h                                     3                                              )                                          h_4 = exp(h_3)                           h4​=exp(h3​)                                                                             ∂                                                       h                                           4                                                                              ∂                                                       h                                           3                                                                         =                                  e                                  x                                  p                                  (                                               h                                     3                                              )                                          \frac{\partial h_4}{\partial h_3} = exp(h_3)                           ∂h3​∂h4​​=exp(h3​)                                                               h                                     4                                              =                                  e                                  x                                  p                                  (                                               h                                     3                                              )                                  =                                  e                                  x                                  p                                  (                                  0                                  )                                  =                                  1                                          h_4 = exp(h_3) = exp(0)=1                           h4​=exp(h3​)=exp(0)=1                                                               h                                     5                                              =                                               h                                     4                                              +                                  1                                          h_5 = h_4 + 1                           h5​=h4​+1                                                                             ∂                                                       h                                           5                                                                              ∂                                                       h                                           4                                                                         =                                  1                                          \frac{\partial h_5}{\partial h_4} = 1                           ∂h4​∂h5​​=1                                                               h                                     5                                              =                                               h                                     4                                              +                                  1                                  =                                  1                                  +                                  1                                  =                                  2                                          h_5 = h_4 + 1 = 1 + 1 = 2                           h5​=h4​+1=1+1=2                                                               h                                     6                                              =                                  1                                  /                                               h                                     5                                                      h_6 = 1/h_5                           h6​=1/h5​                                                                             ∂                                                       h                                           6                                                                              ∂                                                       h                                           5                                                                         =                                  −                                               1                                                   h                                        5                                        2                                                                   \frac{\partial h_6}{\partial h_5} = -\frac{1}{h^2_5}                           ∂h5​∂h6​​=−h52​1​                                                               h                                     6                                              =                                  1                                  /                                               h                                     5                                              =                                  1                                  /                                  2                                  =                                  0.5                                          h_6 = 1/h_5 = 1 / 2 = 0.5                           h6​=1/h5​=1/2=0.5 2.2.2 链式求导

复合函数数学过程如下:
                                                                ∂                                  f                                  (                                  x                                  ;                                  w                                  ,                                  b                                  )                                                      ∂                                  w                                                 =                                                   ∂                                  f                                  (                                  x                                  ;                                  w                                  ,                                  b                                  )                                                      ∂                                               h                                     6                                                                                    ∂                                               h                                     6                                                                  ∂                                               h                                     5                                                                                    ∂                                               h                                     5                                                                  ∂                                               h                                     4                                                                                    ∂                                               h                                     4                                                                  ∂                                               h                                     3                                                                                    ∂                                               h                                     3                                                                  ∂                                               h                                     2                                                                                    ∂                                               h                                     2                                                                  ∂                                               h                                     1                                                                                    ∂                                               h                                     1                                                                  ∂                                  w                                                                                          ∂                                  f                                  (                                  x                                  ;                                  w                                  ,                                  b                                  )                                                      ∂                                  b                                                 =                                                   ∂                                  f                                  (                                  x                                  ;                                  w                                  ,                                  b                                  )                                                      ∂                                               h                                     6                                                                                    ∂                                               h                                     6                                                                  ∂                                               h                                     5                                                                                    ∂                                               h                                     5                                                                  ∂                                               h                                     4                                                                                    ∂                                               h                                     4                                                                  ∂                                               h                                     3                                                                                    ∂                                               h                                     3                                                                  ∂                                               h                                     2                                                                                    ∂                                               h                                     2                                                                  ∂                                  b                                                       \frac{\partial f(x;w,b)}{\partial w}=\frac{\partial f(x;w,b)}{\partial h_6}\frac{\partial h_6}{\partial h_5}\frac{\partial h_5}{\partial h_4}\frac{\partial h_4}{\partial h_3}\frac{\partial h_3}{\partial h_2}\frac{\partial h_2}{\partial h_1}\frac{\partial h_1}{\partial w} \\ \\ \frac{\partial f(x;w,b)}{\partial b}=\frac{\partial f(x;w,b)}{\partial h_6}\frac{\partial h_6}{\partial h_5}\frac{\partial h_5}{\partial h_4}\frac{\partial h_4}{\partial h_3}\frac{\partial h_3}{\partial h_2}\frac{\partial h_2}{\partial b}                     ∂w∂f(x;w,b)​=∂h6​∂f(x;w,b)​∂h5​∂h6​​∂h4​∂h5​​∂h3​∂h4​​∂h2​∂h3​​∂h1​∂h2​​∂w∂h1​​∂b∂f(x;w,b)​=∂h6​∂f(x;w,b)​∂h5​∂h6​​∂h4​∂h5​​∂h3​∂h4​​∂h2​∂h3​​∂b∂h2​​
可以得到:
                                                                                                                          ∂                                              f                                              (                                              x                                              ;                                              w                                              ,                                              b                                              )                                                                          ∂                                              w                                                                                    ∣                                                           x                                              =                                              1                                              ,                                              w                                              =                                              0                                              ,                                              b                                              =                                              0                                                                                                                                                    =                                                                       ∂                                              f                                              (                                              x                                              ;                                              w                                              ,                                              b                                              )                                                                          ∂                                                               h                                                 6                                                                                                                    ∂                                                               h                                                 6                                                                                          ∂                                                               h                                                 5                                                                                                                    ∂                                                               h                                                 5                                                                                          ∂                                                               h                                                 4                                                                                                                    ∂                                                               h                                                 4                                                                                          ∂                                                               h                                                 3                                                                                                                    ∂                                                               h                                                 3                                                                                          ∂                                                               h                                                 2                                                                                                                    ∂                                                               h                                                 2                                                                                          ∂                                                               h                                                 1                                                                                                                    ∂                                                               h                                                 1                                                                                          ∂                                              w                                                                                                                                                                                                                            =                                        1                                        ×                                        −                                        0.25                                        ×                                        1                                        ×                                        1                                        ×                                        −                                        1                                        ×                                        1                                        ×                                        1                                                                                                                                                                                               =                                        0.25.                                                                                \begin{aligned} \frac{\partial f(x;w,b)}{\partial w}|_{x=1,w=0,b=0}& =\frac{\partial f(x;w,b)}{\partial h_6}\frac{\partial h_6}{\partial h_5}\frac{\partial h_5}{\partial h_4}\frac{\partial h_4}{\partial h_3}\frac{\partial h_3}{\partial h_2}\frac{\partial h_2}{\partial h_1}\frac{\partial h_1}{\partial w} \\ &=1\times-0.25\times1\times1\times-1\times1\times1 \\ &=0.25. \end{aligned}                     ∂w∂f(x;w,b)​∣x=1,w=0,b=0​​=∂h6​∂f(x;w,b)​∂h5​∂h6​​∂h4​∂h5​​∂h3​∂h4​​∂h2​∂h3​​∂h1​∂h2​​∂w∂h1​​=1×−0.25×1×1×−1×1×1=0.25.​
2.2.3 代码实现

我们通过代码来实现以上过程:
  1. import torch
  2. import torch.nn as nn
  3. def test006():
  4.     x = torch.tensor(1.0)
  5.     w = torch.tensor(0.0, requires_grad=True)
  6.     b = torch.tensor(0.0, requires_grad=True)
  7.     # 计算函数
  8.     y = (torch.exp(-(w * x + b)) + 1) ** -1
  9.     # 自动微分
  10.     y.backward()
  11.     # 梯度打印
  12.     print(w.grad)
  13. if __name__ == "__main__":
  14.     test006()
复制代码
打印结果:
  1. tensor(0.2500)
复制代码
2.4 重要性

反向传播算法极大地提高了多层神经网络练习的效率,使得练习深度模型成为可能。通过链式法则逐层盘算梯度,反向传播可以有用地处置惩罚复杂的网络结构,确保每一层的参数都能得到合理的调解。
2.5 案例助解

这里我们通过一个实际的案例,去理解反向传播整个过程~
2.5.1 数据预备

整体网络结构及神经元数据和权重参数如下图所示:

数据解释如下:

2.5.2 神经元盘算

以是,我们可以得到如下数据:
盘算h1的相干数据:
                                                    h                               1                                      =                                       w                               1                                      ∗                                       i                               1                                      +                                       w                               2                                      ∗                                       i                               2                                      +                                       b                               1                                               =                            0.15                            ∗                            0.05                            +                            0.20                            ∗                            0.10                            +                            0.35                            =                            0.3775                                                k                               1                                      =                            s                            i                            g                            m                            o                            i                            d                            (                            h                            1                            )                            =                            s                            i                            g                            m                            o                            i                            d                            (                            0.3775                            )                            =                            0.5933                                  \mathrm{h}_{1}=\mathrm{w}_{1}*\mathrm{i}_{1}+\mathrm{w}_{2}*\mathrm{i}_{2}+\mathrm{b}_{1}\quad =0.15 * 0.05 + 0.20 * 0.10 + 0.35 =0.3775 \\ k_{1}=sigmoid(h1)=sigmoid(0.3775)=0.5933                     h1​=w1​∗i1​+w2​∗i2​+b1​=0.15∗0.05+0.20∗0.10+0.35=0.3775k1​=sigmoid(h1)=sigmoid(0.3775)=0.5933
盘算h2的相干数据:
                                                    h                               2                                      =                                       w                               3                                      ∗                                       i                               1                                      +                                       w                               4                                      ∗                                       i                               2                                      +                                       b                               1                                               =                            0.25                            ∗                            0.05                            +                            0.30                            ∗                            0.10                            +                            0.35                            =                            0.3925                                                k                               2                                      =                            s                            i                            g                            m                            o                            i                            d                            (                            h                            2                            )                            =                            s                            i                            g                            m                            o                            i                            d                            (                            0.3925                            )                            =                            0.5969                                  \mathrm{h}_{2}=\mathrm{w}_{3}*\mathrm{i}_{1}+\mathrm{w}_{4}*\mathrm{i}_{2}+\mathrm{b}_{1}\quad =0.25 * 0.05 + 0.30 * 0.10 + 0.35 =0.3925 \\ k_{2}=sigmoid(h2)=sigmoid(0.3925)=0.5969                     h2​=w3​∗i1​+w4​∗i2​+b1​=0.25∗0.05+0.30∗0.10+0.35=0.3925k2​=sigmoid(h2)=sigmoid(0.3925)=0.5969
盘算o1的相干数据:
                                                    o                               1                                      =                                       w                               5                                      ∗                                       k                               1                                      +                                       w                               6                                      ∗                                       k                               2                                      +                                       b                               2                                               =                            0.40                            ∗                            0.5933                            +                            0.45                            ∗                            0.5969                            +                            0.60                            =                            1.1059                                                m                               1                                      =                            s                            i                            g                            m                            o                            i                            d                            (                            o                            1                            )                            =                            s                            i                            g                            m                            o                            i                            d                            (                            1.1059                            )                            =                            0.7514                                  \mathrm{o}_{1}=\mathrm{w}_{5}*\mathrm{k}_{1}+\mathrm{w}_{6}*\mathrm{k}_{2}+\mathrm{b}_{2}\quad =0.40 * 0.5933 + 0.45 * 0.5969 + 0.60 =1.1059 \\ m_{1}=sigmoid(o1)=sigmoid(1.1059)=0.7514                     o1​=w5​∗k1​+w6​∗k2​+b2​=0.40∗0.5933+0.45∗0.5969+0.60=1.1059m1​=sigmoid(o1)=sigmoid(1.1059)=0.7514
盘算o2的相干数据:
                                                    o                               2                                      =                                       w                               7                                      ∗                                       k                               1                                      +                                       w                               8                                      ∗                                       k                               2                                      +                                       b                               2                                               =                            0.50                            ∗                            0.5933                            +                            0.55                            ∗                            0.5969                            +                            0.60                            =                            1.2249                                                m                               2                                      =                            s                            i                            g                            m                            o                            i                            d                            (                            o                            2                            )                            =                            s                            i                            g                            m                            o                            i                            d                            (                            1.2249                            )                            =                            0.7729                                  \mathrm{o}_{2}=\mathrm{w}_{7}*\mathrm{k}_{1}+\mathrm{w}_{8}*\mathrm{k}_{2}+\mathrm{b}_{2}\quad =0.50 * 0.5933 + 0.55 * 0.5969 + 0.60 =1.2249 \\ m_{2}=sigmoid(o2)=sigmoid(1.2249)=0.7729                     o2​=w7​∗k1​+w8​∗k2​+b2​=0.50∗0.5933+0.55∗0.5969+0.60=1.2249m2​=sigmoid(o2)=sigmoid(1.2249)=0.7729
以是,最终的猜测结果分别为: 0.7514、0.7729
2.5.3 损失盘算

猜测值和真实值(target)举行比较盘算损失:
                                         M                            S                            E                            L                            o                            s                            s                            =                                       1                               2                                      (                            (                                       m                               1                                                             −                                  t                                  a                                  r                                  g                                  e                                  t                                          1                                                 )                               2                                      +                            (                            (                                       m                               2                                                             −                                  t                                  a                                  r                                  g                                  e                                  t                                          2                                                 )                               2                                      )                                     =                                       1                               2                                      (                            (                            0.7514                            −                            0.01                                       )                               2                                      +                            (                            (                            0.7729                            −                            0.99                                       )                               2                                      )                            =                            0.2984                                  MSELoss = \frac{1}{2}((\mathrm{m}_{1}\mathrm{-target}_{1})^{2}+((\mathrm{m}_{2}\mathrm{-target}_{2})^{2}) \\ = \frac{1}{2}((0.7514-0.01)^{2}+((0.7729-0.99)^{2}) =0.2984                     MSELoss=21​((m1​−target1​)2+((m2​−target2​)2)=21​((0.7514−0.01)2+((0.7729−0.99)2)=0.2984
得到损失是:0.2984
2.5.4 梯度盘算

接下来,我们举行梯度盘算和参数更新
盘算 w5 权重的梯度
                                                                                                          ∂                                           L                                                                     ∂                                                           w                                              5                                                                                                                                                    =                                                                       ∂                                              L                                                                          ∂                                                                                 o                                                    1                                                                  1                                                                                     ∗                                                                       ∂                                                               m                                                 1                                                                                          ∂                                                               o                                                 1                                                                                     ∗                                                                       ∂                                                               o                                                 1                                                                                          ∂                                                               w                                                 5                                                                                                                                                                                                                                            =                                        (                                                       m                                           1                                                      −                                                                       t                                              a                                              r                                              g                                              e                                              t                                                          1                                                      )                                        ∗                                                       s                                           i                                           g                                           m                                           o                                           i                                           d                                                      (                                                       o                                           1                                                      )                                        ∗                                                       (                                           1                                           −                                                           s                                              i                                              g                                              m                                              o                                              i                                              d                                                          (                                                           o                                              1                                                          )                                           )                                                      ∗                                                       k                                           1                                                                                                                                                                                                             =                                        (                                        0.7514                                        −                                        0.01                                        )                                        ∗                                        s                                        i                                        g                                        m                                        o                                        i                                        d                                        (                                        1.1059                                        )                                        ∗                                                       (                                           1                                           −                                           s                                           i                                           g                                           m                                           o                                           i                                           d                                           (                                           1.1059                                           )                                           )                                                      ∗                                        0.5933                                                                                                                                                                                               =                                        0.0822                                                                                \begin{aligned} \frac{\partial\mathrm{L}}{\partial\mathrm{w}_{5}}& =\frac{\partial\mathrm{L}}{\partial\mathrm{o1}_{1}}*\frac{\partial\mathrm{m}_{1}}{\partial\mathrm{o}_{1}}*\frac{\partial\mathrm{o}_{1}}{\partial\mathrm{w}_{5}} \\ &=(\mathrm{m}_{1}-\mathrm{target}_{1})*\mathrm{sigmoid}(\mathrm{o}_{1})*\left(1-\mathrm{sigmoid}(\mathrm{o}_{1})\right)*\mathrm{k}_{1} \\ &=(0.7514-0.01)*sigmoid(1.1059)*\left(1-sigmoid(1.1059)\right)*0.5933 \\ &=0.0822 \end{aligned}                     ∂w5​∂L​​=∂o11​∂L​∗∂o1​∂m1​​∗∂w5​∂o1​​=(m1​−target1​)∗sigmoid(o1​)∗(1−sigmoid(o1​))∗k1​=(0.7514−0.01)∗sigmoid(1.1059)∗(1−sigmoid(1.1059))∗0.5933=0.0822​
盘算 w7 权重的梯度
                                                                                                          ∂                                           L                                                                     ∂                                                           w                                              7                                                                                                                                                    =                                                                       ∂                                              L                                                                          ∂                                                               m                                                 2                                                                                     ∗                                                                       ∂                                                               m                                                 2                                                                                          ∂                                                               o                                                 2                                                                                     ∗                                                                       ∂                                                               o                                                 2                                                                                          ∂                                                               w                                                 7                                                                                                                                                                                                                                            =                                        (                                                       m                                           2                                                      −                                                                       t                                              a                                              r                                              g                                              e                                              t                                                          2                                                      )                                        ∗                                                       s                                           i                                           g                                           m                                           o                                           i                                           d                                                      (                                                       o                                           2                                                      )                                        ∗                                                       (                                           1                                           −                                                           s                                              i                                              g                                              m                                              o                                              i                                              d                                                          (                                                           o                                              2                                                          )                                           )                                                      ∗                                                       k                                           1                                                                                                                                                                                                             =                                        (                                        0.7729                                        −                                        0.99                                        )                                        ∗                                        s                                        i                                        g                                        m                                        o                                        i                                        d                                        (                                        1.2249                                        )                                        ∗                                                       (                                           1                                           −                                           s                                           i                                           g                                           m                                           o                                           i                                           d                                           (                                           1.2249                                           )                                           )                                                      ∗                                        0.5933                                                                                                                                                                                               =                                        −                                        0.0226                                                                                \begin{aligned} \frac{\partial\mathrm{L}}{\partial\mathrm{w}_7}& =\frac{\partial\mathrm{L}}{\partial\mathrm{m}_2}*\frac{\partial\mathrm{m}_2}{\partial\mathrm{o}_2}*\frac{\partial\mathrm{o}_2}{\partial\mathrm{w}_7} \\ &=(\mathrm{m}_{2}-\mathrm{target}_{2})*\mathrm{sigmoid}(\mathrm{o}_{2})*\left(1-\mathrm{sigmoid}(\mathrm{o}_{2})\right)*\mathrm{k}_{1} \\ &=(0.7729-0.99)*sigmoid(1.2249)*\left(1-sigmoid(1.2249)\right)*0.5933 \\ &=-0.0226 \end{aligned}                     ∂w7​∂L​​=∂m2​∂L​∗∂o2​∂m2​​∗∂w7​∂o2​​=(m2​−target2​)∗sigmoid(o2​)∗(1−sigmoid(o2​))∗k1​=(0.7729−0.99)∗sigmoid(1.2249)∗(1−sigmoid(1.2249))∗0.5933=−0.0226​
盘算 w1 权重的梯度

2.5.5 参数更新

现在就可以举行权重更新了:假设学习率是0.5
                                                    w                               5                                      =                            0.40                            −                            0.5                            ∗                            0.0822                            =                            0.3589                                                w                               7                                      =                            0.50                            +                            0.5                            ∗                            0.0226                            =                            0.5113                                                w                               1                                      =                            0.15                            −                            0.5                            ∗                            0.0004                            =                            0.1498                                  w_5=0.40-0.5*0.0822=0.3589 \\ w_7=0.50+0.5*0.0226=0.5113 \\ w_1=0.15-0.5*0.0004=0.1498                     w5​=0.40−0.5∗0.0822=0.3589w7​=0.50+0.5∗0.0226=0.5113w1​=0.15−0.5∗0.0004=0.1498
2.5.6 代码实现

参考代码如下:
  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. class Net(nn.Module):
  5.     def __init__(self):
  6.         super(Net, self).__init__()
  7.         self.linear1 = nn.Linear(2, 2)
  8.         self.linear2 = nn.Linear(2, 2)
  9.         # 网络参数初始化
  10.         self.linear1.weight.data = torch.tensor([[0.15, 0.20], [0.25, 0.30]])
  11.         self.linear2.weight.data = torch.tensor([[0.40, 0.45], [0.50, 0.55]])
  12.         self.linear1.bias.data = torch.tensor([0.35, 0.35])
  13.         self.linear2.bias.data = torch.tensor([0.60, 0.60])
  14.     def forward(self, x):
  15.         x = self.linear1(x)
  16.         x = torch.sigmoid(x)
  17.         x = self.linear2(x)
  18.         x = torch.sigmoid(x)
  19.         return x
  20. if __name__ == "__main__":
  21.     inputs = torch.tensor([[0.05, 0.10]])
  22.     target = torch.tensor([[0.01, 0.99]])
  23.     # 获得网络输出值
  24.     net = Net()
  25.     output = net(inputs)
  26.     # 计算误差
  27.     loss = torch.sum((output - target) ** 2) / 2
  28.     # 优化方法
  29.     optimizer = optim.SGD(net.parameters(), lr=0.5)
  30.     # 梯度清零
  31.     optimizer.zero_grad()
  32.     # 反向传播
  33.     loss.backward()
  34.     # 打印(w1-w8)观察w5、w7、w1 的梯度值是否与手动计算一致
  35.     print(net.linear1.weight.grad.data)
  36.     print(net.linear2.weight.grad.data)
  37.     #更新梯度
  38.     optimizer.step()
  39.    
  40.     # 打印更新后的网络参数
  41.     print(net.state_dict())
复制代码
打印结果:
  1. tensor([[0.0004, 0.0009],
  2.         [0.0005, 0.0010]])
  3. tensor([[ 0.0822,  0.0827],
  4.         [-0.0226, -0.0227]])
  5. OrderedDict([('linear1.weight', tensor([[0.1498, 0.1996],
  6.         [0.2498, 0.2995]])), ('linear1.bias', tensor([0.3456, 0.3450])), ('linear2.weight', tensor([[0.3589, 0.4087],
  7.         [0.5113, 0.5614]])), ('linear2.bias', tensor([0.5308, 0.6190]))])
复制代码
另一种写法(常用)
  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. import os
  5. class MyModel(nn.Module):
  6.     def __init__(self, input_size, output_size):
  7.         super(MyModel, self).__init__()
  8.         # 定义网络结构
  9.         # 输入层到隐藏层
  10.         self.hidden=nn.Sequential(nn.Linear(input_size, 2),nn.Sigmoid())
  11.         # 初始化隐藏层权重和偏置(默认自动,这里手动是为了测试案例中运算的数字)
  12.         self.hidden[0].weight.data = torch.tensor([[0.15, 0.20], [0.25, 0.30]])
  13.         self.hidden[0].bias.data = torch.tensor([0.35, 0.35])
  14.         # 隐藏层到输出层
  15.         self.out = nn.Sequential(nn.Linear(2, output_size),nn.Sigmoid())
  16.         self.out[0].weight.data = torch.tensor([[0.40, 0.45], [0.50, 0.55]])
  17.         self.out[0].bias.data = torch.tensor([0.60, 0.60])
  18.     def forward(self, x):
  19.         x = self.hidden(x)
  20.         output = self.out(x)
  21.         return output
  22. def train(epochs=10):
  23.     # 模型
  24.     model = MyModel(input_size=2, output_size=2)
  25.     # 优化器
  26.     optimizer = optim.SGD(model.parameters(), lr=0.5)
  27.     #损失函数
  28.     criterion = nn.MSELoss()
  29.     # 输入数据
  30.     input = torch.tensor([[0.05, 0.10]])
  31.     target = torch.tensor([[0.01, 0.99]])
  32.     #前向传播
  33.     output = model(input)
  34.     #计算损失
  35.     loss = criterion(output, target)
  36.     # 梯度清零
  37.     optimizer.zero_grad()
  38.     # 反向传播
  39.     loss.backward()
  40.     # 更新权重参数:让损失尽可能小
  41.     optimizer.step()
  42.     #更新后的模型参数
  43.     state_dict=model.state_dict()
  44.     print("更新后的模型参数:",state_dict)
  45.     #保存模型参数
  46.     filepath = os.path.relpath(os.path.join(os.path.dirname(__file__),"weights/model.pth"))
  47.    
  48.    
  49. def detect():
  50.     # 加载模型参数
  51.     filepath = os.path.relpath(os.path.join(os.path.dirname(__file__),"weights/model.pth"))
  52.     model = MyModel(input_size=2, output_size=2)
  53.     model.load_state_dict(torch.load(filepath))
  54.     input = torch.tensor([[0.05, 0.10]])
  55.     output = model(input)
  56.     print("预测推理",output)
  57.    
  58.    
  59. if __name__=="__main__":
  60.     train()
  61.     detect()
复制代码
3. BP之梯度降落

梯度降落算法的目的是找到使损失函数                                         L                            (                            θ                            )                                  L(\theta)                     L(θ) 最小的参数                                         θ                                  \theta                     θ,其核心是沿着损失函数梯度的负方向更新参数,以逐步逼近局部或全局最优解,从而使模型更好地拟合练习数据。
3.1 数学描述

简单回顾下数学知识。
3.1.1 数学公式

                                                    w                                           i                                  j                                                      n                                  e                                  w                                                 =                                       w                                           i                                  j                                                      o                                  l                                  d                                                 −                            α                                                   ∂                                  E                                                      ∂                                               w                                                   i                                        j                                                                                w_{ij}^{new}= w_{ij}^{old} - \alpha \frac{\partial E}{\partial w_{ij}}                     wijnew​=wijold​−α∂wij​∂E​
其中,                                        α                                  \alpha                     α是学习率:


3.1.2 过程论述

3.2 传统降落方式

根据盘算梯度时数据量不同,常见的方式有:
3. 2.1 批量梯度降落

Batch Gradient Descent BGD

3.2.2 随机梯度降落

Stochastic Gradient Descent, SGD

3.2.3 小批量梯度降落

Mini-batch Gradient Descent MGBD

3.3 存在的问题



3.4 优化梯度降落方式

传统的梯度降落优化算法中,可能会碰到以下环境:
碰到平缓地区,梯度值较小,参数优化变慢 碰到 “鞍点” ,梯度为 0,参数无法优化 碰到局部最小值 对于这些问题, 出现了一些对梯度下
降算法的优化方法,例如:Momentum、AdaGrad、RMSprop、Adam 等.
3.4.1 指数加权平均

我们最常见的算数平均指的是将全部数加起来除以数的个数,每个数的权重是相同的。
加权平均指的是给每个数赋予不同的权重求得平均数。
移动平均数,指的是盘算近来邻的 N 个数来获得平均数。
指数移动加权平均(Exponential Moving Average简称EMA)则是参考各数值,而且各数值的权重都不同,间隔越远的数字对平均数盘算的贡献就越小(权重较小),间隔越近则对平均数的盘算贡献就越大(权重越大)。
比如:明气候温怎么样,和昨气候温有很大关系,而和一个月前的气温关系就小一些。
盘算公式可以用下面的式子来表示:

其中:

代码演示:
  1. import torch
  2. import matplotlib.pyplot as plt
  3. ELEMENT_NUMBER = 30
  4. # 1. 实际平均温度
  5. def test01():
  6.     # 固定随机数种子
  7.     torch.manual_seed(0)
  8.     # 产生30天的随机温度
  9.     temperature = torch.randn(size=[ELEMENT_NUMBER,]) * 10
  10.     print(temperature)
  11.     # 绘制平均温度
  12.     days = torch.arange(1, ELEMENT_NUMBER + 1, 1)
  13.     plt.plot(days, temperature, color='r')
  14.     plt.scatter(days, temperature)
  15.     plt.show()
  16. # 2. 指数加权平均温度
  17. def test02(beta=0.9):
  18.     # 固定随机数种子
  19.     torch.manual_seed(0)
  20.     # 产生30天的随机温度
  21.     temperature = torch.randn(size=[ELEMENT_NUMBER,]) * 10
  22.     print(temperature)
  23.     exp_weight_avg = []
  24.     for idx, temp in enumerate(temperature):
  25.         # 第一个元素的的 EWA 值等于自身
  26.         if idx == 0:
  27.             exp_weight_avg.append(temp)
  28.             continue
  29.         # 第二个元素的 EWA 值等于上一个 EWA 乘以 β + 当前气温乘以 (1-β)
  30.         new_temp = exp_weight_avg[-1] * beta + (1 - beta) * temp
  31.         exp_weight_avg.append(new_temp)
  32.     days = torch.arange(1, ELEMENT_NUMBER + 1, 1)
  33.     plt.plot(days, exp_weight_avg, color='r')
  34.     plt.scatter(days, temperature)
  35.     plt.show()
  36. if __name__ == '__main__':
  37.     test01()
  38.     test02(0.5)
  39.     test02(0.9)
复制代码
执行结果:

3.4.2 Momentum

a.特点
动量(Momentum)是对梯度降落的优化方法,可以更好地应对梯度变化和梯度消散问题,从而提高练习模型的效率和稳定性。

b.梯度盘算公式
梯度盘算公式:Dt = β * St-1 + (1- β) * Dt
举个例子,假设:权重 β 为 0.9,例如:
  1. 第一次梯度值:s1 = d1 = w1
  2. 第二次梯度值:s2 = 0.9 + s1 + d2 * 0.1
  3. 第三次梯度值:s3 = 0.9 * s2 + d3 * 0.1
  4. 第四次梯度值:s4 = 0.9 * s3 + d4 * 0.1
  5. - w 表示初始梯度
  6. - d 表示当前轮数计算出的梯度值
  7. - s 表示历史梯度值
复制代码
梯度降落公式中梯度的盘算,就不再是当前时候 t 的梯度值,而是历史梯度值的指数移动加权平均值。
公式修改为:                                                   W                                           t                                  +                                  1                                                 =                                       W                               t                                      −                            α                            ∗                                       D                               t                                            W_{t+1}=W_t-α*D_t                     Wt+1​=Wt​−α∗Dt​
c.原理
那么,Monmentum 优化方法是如何肯定程度上克服 “平缓”、”鞍点”、”峡谷” 的问题呢?

当处于鞍点位置时,由于当前的梯度为 0,参数无法更新。但是 Momentum 动量梯度降落算法已经在先前积聚了一些梯度值,很有可能使得跨过鞍点。
由于 mini-batch 平凡的梯度降落算法,每次选取少数的样本梯度确定前进方向,可能会出现震荡,使得练习时间变长。Momentum 利用移动加权平均,平滑了梯度的变化,使得前进方向更加平缓,有利于加速练习过程。肯定程度上有利于低落 “峡谷” 问题的影响。
峡谷问题:就是会使得参数更新出现剧烈震荡.
Momentum 算法可以理解为是对梯度值的一种调解,我们知道梯度降落算法中还有一个很重要的学习率,Momentum 并没有学习率举行优化。
d.API
  1. optimizer = optim.SGD(model.parameters(), lr=0.6, momentum=0.9)  # 学习率和动量值可以根据实际情况调整,momentum 参数指定了动量系数,默认为0。动量系数通常设置为 0 到0.5 之间的一个值,但也可以根据具体的应用场景调整
复制代码
e.总结

Momentum 算法是对梯度值的平滑调解,但是并没有对梯度降落中的学习率举行优化。
3.4.3 AdaGrad

​ AdaGrad(Adaptive Gradient Algorithm)为每个参数引入独立的学习率,它根据历史梯度的平方和来调解这些学习率,如许就使得参数具有较大的历史梯度的学习率减小,而参数具有较小的历史梯度的学习率保持较大,从而实现更有用的学习。AdaGrad避免了统一学习率的不敷,更多用于处置惩罚希奇数据和梯度变化较大的问题。
AdaGrad流程:

优点

缺点
AdaGrad是一种有用的自适应学习率算法,然而由于学习率衰减问题,我们会利用改 RMSProp 或 Adam 来替换。
API
  1. optimizer = optim.Adagrad(model.parameters(), lr=0.9)  # 设置学习率
复制代码
3.4.4 RMSProp

RMSProp(Root Mean Square Propagation)在时间步中,不是简单地累积全部梯度平方和,而是利用指数加权平均来逐步衰减过期的梯度信息。这种方法专门用于解决AdaGrad在练习过程中学习率过分衰减的问题。
RMSProp过程
优点

缺点
需要注意的是:AdaGrad 和 RMSProp 都是对于不同的参数分量利用不同的学习率,如果某个参数分量的梯度值较大,则对应的学习率就会较小,如果某个参数分量的梯度较小,则对应的学习率就会较大一些
API
  1. optimizer = optim.RMSprop(model.parameters(), lr=0.7, momentum=0.9)  # 设置学习率和动量
复制代码
3.4.5 Adam

Adam(Adaptive Moment Estimation)算法将动量法和RMSProp的优点结合在一起:

优点
缺点
API
  1. optimizer = optim.Adam(model.parameters(), lr=0.05)  # 设置学习率
复制代码
3.5 总结

​ 梯度降落算法通过不停更新参数来最小化损失函数,是反向传播算法中盘算权重调解的基础。在实际应用中,根据数据的规模和盘算资源的环境,选择符合的梯度降落方式(批量、随机、小批量)及其变种(如动量法、Adam等)可以显著提高模型练习的效率和结果。
​ Adam是目前最为流行的优化算法之一,因其稳定性和高效性,广泛应用于各种深度学习模型的练习中。Adam结合了动量法和RMSProp的优点,能够在不同环境下自适应调解学习率,并提供快速且稳定的收敛表现。
[code][/code]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4