神经网络基础知识

手上没有什么教材,都是听网课自学,好多东西都是学了忘忘了翻笔记,心里想着不如记一些电子笔记。纸质笔记不会全部搬运,这篇文章随缘记一些有意思的神经网络知识。

1 反向传播

1.1 概念理解

反向传播( Backpropagation)是什么先不谈,它的作用就是一点:使 Gradient Descent的计算更快速。
首先,梯度下降的计算过程如下:

神经网络基础知识
在计算过程中,类似下面的计算组成了计算的核心部分。
∂ L ( θ ) / ∂ w 1 \partial L(\theta) / \partial w_1 ∂L (θ)/∂w 1 ​
如果不往深的想,可能这就是一个公式。但是这个公式的计算过程,正是反向传播优化的地方。
首先补充一下高数的链式法则:
神经网络基础知识
我们把 L ( θ ) L(\theta)L (θ) 用 C n C^n C n 代替:
神经网络基础知识
这样,公式的计算核心就转移到了下面这个公式上:∂ C / ∂ w \partial C / \partial w ∂C /∂w
根据链式法则:
神经网络基础知识
计算 zw的偏导很简单,因为z = x1w1+ x2w2 + b。
神经网络基础知识
但是计算 Cz的偏导就很麻烦了。因为 C是最后的 output layer与标准答案的 Loss,这一项很难计算。所以还得对这一项进行拆解(使用链式法则):
神经网络基础知识
拆解完 Cz的偏导,我们发现永远都是拆完后的第二项偏导很难算。这样我们就得反复拆下去,直到 output layer
神经网络基础知识
对于输出层,这个第二项就很好算了, y就是 output layer的输出值, C就是选一个 Loss函数将 y和标准答案做运算。这些对于前面的神经元来说计算起来很麻烦,得算到最后一步。
如果我们从前往后求偏导,那每次都得从后往前推一次。既然这样我们不如建一个反向的神经网络,负责去计算每一次的第二项偏导值,且只计算一次。这就是反向传播的精髓所在。
下面两张图是一个神经元的反向,和整个网络的反向:
神经网络基础知识
神经网络基础知识
反向传播能够使梯度的计算更快,就是这样一个原理了。
本小节课件参考:李宏毅2020机器学习

; 1.2 举例

1.2.1 例1(摘自文章推荐2)

神经网络基础知识
上图为网络的前向传播过程及其公式,现在求:∂ C ∂ w 1 \frac{\partial C}{\partial w_1}∂w 1 ​∂C ​
因为 C一般代表 loss,所以会先有:∂ C ∂ w 1 = ∂ C ∂ y 4 ∂ y 4 ∂ w 1 \frac{\partial C}{\partial w_1} = \frac{\partial C}{\partial y_4}\frac{\partial y_4}{\partial w_1}∂w 1 ​∂C ​=∂y 4 ​∂C ​∂w 1 ​∂y 4 ​​
剩下的就按照图,从后往前写:
神经网络基础知识
∂ C ∂ w 1 = ∂ C ∂ y 4 ∂ y 4 ∂ z 4 ∂ z 4 ∂ x 4 ∂ x 4 ∂ z 3 ∂ z 3 ∂ x 3 ∂ x 3 ∂ z 2 ∂ z 2 ∂ x 2 ∂ x 2 ∂ z 1 ∂ z 1 ∂ w 1 \frac{\partial C}{\partial w_1} = \frac{\partial C}{\partial y_4}\frac{\partial y_4}{\partial z_4}\frac{\partial z_4}{\partial x_4}\frac{\partial x_4}{\partial z_3}\frac{\partial z_3}{\partial x_3}\frac{\partial x_3}{\partial z_2}\frac{\partial z_2}{\partial x_2}\frac{\partial x_2}{\partial z_1}\frac{\partial z_1}{\partial w_1}∂w 1 ​∂C ​=∂y 4 ​∂C ​∂z 4 ​∂y 4 ​​∂x 4 ​∂z 4 ​​∂z 3 ​∂x 4 ​​∂x 3 ​∂z 3 ​​∂z 2 ​∂x 3 ​​∂x 2 ​∂z 2 ​​∂z 1 ​∂x 2 ​​∂w 1 ​∂z 1 ​​
下标更整齐一些的话,可以把y4改成x5。
按照链式法则展开成上面这样,除了 C对y4的偏导(因为这个取决于 outputlabel到底用了什么 loss函数),其他每一项就都是可以求解了:
∂ C ∂ w 1 = ∂ C ∂ y 4 σ ′ ( z 4 ) w 4 σ ′ ( z 3 ) w 3 σ ′ ( z 2 ) w 2 σ ′ ( z 1 ) x 1 \frac{\partial C}{\partial w_1} = \frac{\partial C}{\partial y_4} \sigma'(z_4)w_4\sigma'(z_3)w_3\sigma'(z_2)w_2\sigma'(z_1)x_1 ∂w 1 ​∂C ​=∂y 4 ​∂C ​σ′(z 4 ​)w 4 ​σ′(z 3 ​)w 3 ​σ′(z 2 ​)w 2 ​σ′(z 1 ​)x 1 ​

同理,如果要求:∂ C ∂ b 1 \frac{\partial C}{\partial b_1}∂b 1 ​∂C ​
则:
∂ C ∂ b 1 = ∂ C ∂ y 4 ∂ y 4 ∂ z 4 ∂ z 4 ∂ x 4 ∂ x 4 ∂ z 3 ∂ z 3 ∂ x 3 ∂ x 3 ∂ z 2 ∂ z 2 ∂ x 2 ∂ x 2 ∂ z 1 ∂ z 1 ∂ b 1 \frac{\partial C}{\partial b_1} = \frac{\partial C}{\partial y_4}\frac{\partial y_4}{\partial z_4}\frac{\partial z_4}{\partial x_4}\frac{\partial x_4}{\partial z_3}\frac{\partial z_3}{\partial x_3}\frac{\partial x_3}{\partial z_2}\frac{\partial z_2}{\partial x_2}\frac{\partial x_2}{\partial z_1}\frac{\partial z_1}{\partial b_1}∂b 1 ​∂C ​=∂y 4 ​∂C ​∂z 4 ​∂y 4 ​​∂x 4 ​∂z 4 ​​∂z 3 ​∂x 4 ​​∂x 3 ​∂z 3 ​​∂z 2 ​∂x 3 ​​∂x 2 ​∂z 2 ​​∂z 1 ​∂x 2 ​​∂b 1 ​∂z 1 ​​
最终:
∂ C ∂ b 1 = ∂ C ∂ y 4 σ ′ ( z 4 ) w 4 σ ′ ( z 3 ) w 3 σ ′ ( z 2 ) w 2 σ ′ ( z 1 ) \frac{\partial C}{\partial b_1} = \frac{\partial C}{\partial y_4} \sigma'(z_4)w_4\sigma'(z_3)w_3\sigma'(z_2)w_2\sigma'(z_1)∂b 1 ​∂C ​=∂y 4 ​∂C ​σ′(z 4 ​)w 4 ​σ′(z 3 ​)w 3 ​σ′(z 2 ​)w 2 ​σ′(z 1 ​)

; 1.2.2 例2 BPTT(摘自文章推荐1)

BPTT(back-propagation through time)RNN的训练方法,看到 BP就知道本质还是反向传播,只不过 RNN处理的是时间序列的数据,所以要随时间反向传播。
对标准 RNN来说,这是一个前向传播过程。具体的前向传播过程自行查阅链接。

神经网络基础知识
在1.2.1的例子中,前向传播就只是1.2.2例子中的某一列(代表一个时刻)从下往上的过程,损失函数Loss也自然就是一个时刻的反向传播过程。而1.2.2每一个时刻的Loss,需要追溯这一时刻前所有时刻的信息,即:(以L(t)对W求偏导为例)
∂ L ( t ) ∂ W = ∑ k = 1 t . . . \frac{\partial L^{(t)}}{\partial W} = \sum_{k=1}^t …∂W ∂L (t )​=k =1 ∑t ​…

而1.2.2例子的总Loss,即为:
L = ∑ t = 1 n L ( t ) L = \sum_{t=1}^nL^{(t)}L =t =1 ∑n ​L (t )
举个栗子:
如果要求在第三个时刻 LW的偏导,即:
∂ L ( 3 ) ∂ W \frac{\partial L^{(3)}}{\partial W}∂W ∂L (3 )​

神经网络基础知识
L(3) 不仅会影响 h(t) 到 h(t+1) 的 W,前面两个 W也会影响,这就是和上一个例子最大的区别。
我们按照上图的①②③可以写出:
∂ L ( 3 ) ∂ W = ∂ L ( 3 ) ∂ o ( 3 ) ∂ o ( 3 ) ∂ h ( 3 ) ∂ h ( 3 ) ∂ W + ∂ L ( 3 ) ∂ o ( 3 ) ∂ o ( 3 ) ∂ h ( 3 ) ∂ h ( 3 ) ∂ h ( 2 ) ∂ h ( 2 ) ∂ W + ∂ L ( 3 ) ∂ o ( 3 ) ∂ o ( 3 ) ∂ h ( 3 ) ∂ h ( 3 ) ∂ h ( 2 ) ∂ h ( 2 ) ∂ h ( 1 ) ∂ h ( 1 ) ∂ W \frac{\partial L^{(3)}}{\partial W} = \frac{\partial L^{(3)}}{\partial o^{(3)}}\frac{\partial o^{(3)}}{\partial h^{(3)}}\frac{\partial h^{(3)}}{\partial W} + \frac{\partial L^{(3)}}{\partial o^{(3)}}\frac{\partial o^{(3)}}{\partial h^{(3)}}\frac{\partial h^{(3)}}{\partial h^{(2)}} \frac{\partial h^{(2)}}{\partial W} + \frac{\partial L^{(3)}}{\partial o^{(3)}}\frac{\partial o^{(3)}}{\partial h^{(3)}}\frac{\partial h^{(3)}}{\partial h^{(2)}}\frac{\partial h^{(2)}}{\partial h^{(1)}} \frac{\partial h^{(1)}}{\partial W}∂W ∂L (3 )​=∂o (3 )∂L (3 )​∂h (3 )∂o (3 )​∂W ∂h (3 )​+∂o (3 )∂L (3 )​∂h (3 )∂o (3 )​∂h (2 )∂h (3 )​∂W ∂h (2 )​+∂o (3 )∂L (3 )​∂h (3 )∂o (3 )​∂h (2 )∂h (3 )​∂h (1 )∂h (2 )​∂W ∂h (1 )​
把每一个L(t)(t从1~n)表示出来,最后累加,这个偏导就求出来了。

题外话:
这样的偏导既包含了空间信息,也包含了时间信息,因此后来也被STBP方法借鉴了思路。

2 好文章推荐

1)RNN训练算法-BPTT:RNN
2)梯度消失、梯度爆炸、常用激活函数对比分析:常用的激活函数(Sigmoid、Tanh、ReLU等)

3 LSTM的理解

神经网络基础知识

3.1 三个门的理解

fgate:控制从cell中丢弃哪些信息
igate:确定什么样的新信息要被存放在cell中
ogate:确定输出什么样的值
h:新的候选值
三个门的作用可以理解为 yes or no,h的作用可以理解为 what

3.2 激活函数的选择

三个σ:sigmoid函数选择更新内容
其他的act:tanh、ReLU、GeLU等,创建新的候选值

3.3 流程

首先,由fgate决定从cell中丢弃哪些信息。
其次,由igate和h决定什么样的新信息要存放在新的cell中。非要分开理解的话,可以这样理解:igate决定什么样的信息我们要更新(yes or no),h决定输入怎样的新信息(what)。
最后,fgate和igate、h对cell更新,从celli-1→celli,由ogate控制要输出哪些信息(或者说信息都给ogate,它决定输不输出)。

3.4 结合表达式理解

神经网络基础知识

; 4 CNN的理解(参考链接2-3))

这一部分是因为写代码时想不通 conv2d的参数,所以想着记录一下。

4.1 例子

下面的例子, param1、2、3分别代表: height, width, channel。一般卷积核( kernel_size)这个参数只用给出 size(即 height, width),不用给出 channel。为了方便理解,先给出 channel,见 eg1
eg1
图片样本:[6, 6, 3]
卷积核:[3, 3, 3]
output → [4, 4, 1]
如果没有卷积核的 channel,见 eg2
eg2
图片样本:[5, 4, 1]
卷积核:[2, 3]
output → [4, 2, 未知](output channel取决于Conv2d的参数)

比如图片样本是 [5, 4, 1],现在进行 nn.Conv2d(1, 4, (2, 3))操作,那么输出的图片就是 [4, 2, 4],前两维的 42是由 样本size和、 kernel size共同决定的,最后一维的 4是自己规定的, output channel是多少,自己定义就好,torch会自动给你匹配你卷积核需要的 channel数。

Original: https://blog.csdn.net/qq_45520647/article/details/123826260
Author: 御用厨师
Title: 神经网络基础知识

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/547947/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球