在学习神经网络之前,你可能需要一点机器学习的基础。其中机器学习的相关内容可以参考:超级简单的机器学习入门
人工神经网络(Artificial Neural Network,ANN)模拟了生物神经网络,构建人工神经元,并按照一定拓扑结构来建立人工神经元之间的连接.
神经网络一般可以看作一个
非线性模型,其基本组成单元为具有非线性激活函数的神经元,大量神经元之间相互连接,神经元之间的连接权重就是需要学习的参数。误差反向传播机制大大提高了神经网络的学习能力,基于此可以在机器学习的框架下通过梯度下降方法来进行学习。
1)神经元是构成神经网络的基本单元,用来接收一组输入信号并产生输出.
其中MP神经元是比较原始基础的神经元。
特点:MP 神经元中的激活函数𝑓为0或1的阶跃函数,而现代神经元中的激活函数通常要求是连续可导的函数.
2)假设一个神经元接收𝐷 个输入𝑥1,𝑥2,⋯,𝑥𝐷𝑥_1, 𝑥_2, ⋯ , 𝑥_𝐷x1,x2,⋯,xD,令向量𝒙=[𝑥1;𝑥2;⋯;𝑥𝐷]𝒙 = [𝑥_1; 𝑥_2; ⋯ ; 𝑥_𝐷]x=[x1;x2;⋯;xD]来表示这组输入,并用净输入 𝑧 ∈ ℝ 表示一个神经元所获得的输入信号𝒙的加权和。
其计算公式如下:
z=∑d=1Dwdxd+b=w⊤x+b\begin{aligned} z & =\sum_{d=1}^{D} w_{d} x_{d}+b \\ & =\boldsymbol{w}^{\top} \boldsymbol{x}+b \end{aligned}z=d=1∑Dwdxd+b=w⊤x+b
3)净输入𝑧在经过一个非线性函数𝑓(⋅)后,得到神经元的活性值 𝑎,
𝑎=𝑓(𝑧)𝑎 = 𝑓(𝑧)a=f(z)
激活函数.激活函数的具体介绍可以看下一小节。4)一个典型的神经元结构示例

单一的神经元是远远不够完成复杂的功能,需要通过很多神经元一起协作.这样通过一定的连接方式或信息传递方式进行协作的神经元可以看作一个网络,就是神经网络.
目前常用的神经网络有三种
1)前馈网络
有向无环路图表示.全连接前馈网络和卷积神经网络等.2)记忆网络
记忆网络,也称为反馈网络,网络中的神经元不但可以接收其他神经元的信息,也可以接收自己的历史信息循环神经网络、Hopfield 网络、玻尔兹曼机、受限玻尔兹曼机等.3)图网络
知识图谱、社交网络、分子网络等.图卷积网络、图注意力网络、消息传递神经网络等.4)三种网络结构的对比

1)激活函数在神经元中非常重要的.可以增强网络的表示能力和学习能力
激活函数需要具备以下几点性质:
连续并可导(允许少数点上不可导)的非线性函数.- 激活函数及其导函数要尽可能的
简单,有利于提高网络计算效率.- 激活函数的导函数的值域要
在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性.
以下是几种常见的激活函数。
Sigmoid 型函数是指一类 S 型曲线函数,为两端饱和函数.常用的 Sigmoid型函数有Logistic函数和Tanh函数.
对于函数 𝑓(𝑥),若 𝑥 → −∞ 时,其导数 𝑓′(𝑥) → 0,则称其为
左饱和.若𝑥 → +∞时,其导数𝑓′(𝑥) → 0,则称其为右饱和.当同时满足左、右饱和时,就称为两端饱和.
Logistic函数 Logistic函数定义为:线性函数;当输入值靠近两端时对输入进行抑制.输入越小,越接近 0;输入越大,越接近 1.阶跃激活函数相比,Logistic函数是连续可导的,其数学性质更好.
Tanh函数 Tanh函数也是一种Sigmoid型函数.其定义为:tanh(x)=exp(x)−exp(−x)exp(x)+exp(−x)\tanh (x)=\frac{\exp (x)-\exp (-x)}{\exp (x)+\exp (-x)}tanh(x)=exp(x)+exp(−x)exp(x)−exp(−x)
Tanh函数 可以看作放大并平移的 Logistic函数,其值域是(−1, 1)。以下是 Tanh函数 与 Logistic函数的相互转化公式
tanh(x)=2σ(2x)−1\tanh (x)=2 \sigma(2 x)-1tanh(x)=2σ(2x)−1
Tanh函数 和 Logistic函数 的对比
Tanh函数的输出是零中心化的,而 Logistic 函数的输出恒大于 0.非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移,并进一步使得梯度下降的收敛速度变慢.Logistic函数 和 Tanh函数 在中间(0附近)近似线性,两端饱和,计算开销较大。因此,这两个函数可以通过分段函数来近似.
以 Logistic 函数 𝜎(𝑥) 为例,其导数为 𝜎′(𝑥) = 𝜎(𝑥)(1 − 𝜎(𝑥)).Logistic 函数在0附近的一阶泰勒展开为
gl(x)≈σ(0)+x×σ′(0)=0.25x+0.5\begin{aligned} g_{l}(x) & \approx \sigma(0)+x \times \sigma^{\prime}(0) \\ & =0.25 x+0.5 \end{aligned}gl(x)≈σ(0)+x×σ′(0)=0.25x+0.5
这样Logistic函数可以用 分段函数 hard-logistic(𝑥)来近似.
hard−logistic(x)={1gl(x)≥1gl0
同样,Tanh函数在0附近的一阶泰勒展开为
gt(x)≈tanh(0)+x×tanh′(0)=x,g_{t}(x) \approx \tanh (0)+x \times \tanh ^{\prime}(0) =x, gt(x)≈tanh(0)+x×tanh′(0)=x,
这样 Tanh函数 也可以用 分段函数 hard-tanh(𝑥)来近似.
hard−tanh(x)=max(min(gt(x),1),−1)=max(min(x,1),−1)\begin{aligned} \operatorname{hard}-\tanh (x) & =\max \left(\min \left(g_{t}(x), 1\right),-1\right) \\ & =\max (\min (x, 1),-1) \end{aligned}hard−tanh(x)=max(min(gt(x),1),−1)=max(min(x,1),−1)
以下是Hard-Logistic函数和Hard-Tanh函数的形状.

ReLU 是目前深度神经网络中经常使用的激活函数,其定义为:
ReLU(x)={xx≥00x<0=max(0,x)\begin{aligned} \operatorname{ReLU}(x) & =\left\{\begin{array}{ll} x & x \geq 0 \\ 0 & x<0 \end{array}\right. \\ & =\max (0, x) \end{aligned}ReLU(x)={x0x≥0x<0=max(0,x)其图像为:

优点
缺点:
解决方案:
在实际使用中,为了避免上述情况,有几种ReLU的变种也会被广泛使用.
1. 带泄露的ReLU:在输入 𝑥 < 0时,保持一个很小的梯度 γ\gammaγ(往往小于1)
LeakyReLU(x)={xif x>0γxif x≤0=max(0,x)+γmin(0,x)=max(x,γx)\begin{aligned} \operatorname{LeakyReLU}(x) & =\left\{\begin{array}{ll} x & \text { if } x>0 \\ \gamma x & \text { if } x \leq 0 \end{array}\right. \\ & =\max (0, x)+\gamma \min (0, x)\\ & = \max (x,\gamma x) \end{aligned} LeakyReLU(x)={xγx if x>0 if x≤0=max(0,x)+γmin(0,x)=max(x,γx)
2.带参数的ReLU:引入一个可学习的参数,不同神经元可以有不同的参数。对于第 𝑖 个神经元,其 PReLU 的定义为:
PReLUi(x)={xif x>0γixif x≤0=max(0,x)+γimin(0,x),\begin{aligned} \operatorname{PReLU}_{i}(x) & =\left\{\begin{array}{ll} x & \text { if } x>0 \\ \gamma_{i} x & \text { if } x \leq 0 \end{array}\right. \\ & =\max (0, x)+\gamma_{i} \min (0, x), \end{aligned}PReLUi(x)={xγix if x>0 if x≤0=max(0,x)+γimin(0,x),
3.ELU函数:一个近似的零中心化的非线性函数
ELU(x)={xif x>0γ(exp(x)−1)if x≤0=max(0,x)+min(0,γ(exp(x)−1))\begin{aligned} \operatorname{ELU}(x) & =\left\{\begin{array}{ll} x & \text { if } x>0 \\ \gamma(\exp (x)-1) & \text { if } x \leq 0 \end{array}\right. \\ & =\max (0, x)+\min (0, \gamma(\exp (x)-1)) \end{aligned}ELU(x)={xγ(exp(x)−1) if x>0 if x≤0=max(0,x)+min(0,γ(exp(x)−1))
4.Softplus 函数:可以看作 ReLU 函数的平滑版本,其定义为
Softplus (x)=log(1+exp(x)). \text { Softplus }(x)=\log (1+\exp (x)) \text {. } Softplus (x)=log(1+exp(x)).
5.不同ReLU函数的对比

| 激活函数 | 函数 | 导数 |
|---|---|---|
Logistic 函数 | f(x)=11+exp(−x)f(x)=\frac{1}{1+\exp (-x)}f(x)=1+exp(−x)1 | f′(x)=f(x)(1−f(x))f^{\prime}(x)=f(x)(1-f(x))f′(x)=f(x)(1−f(x)) |
Tanh 函数 | f(x)=exp(x)−exp(−x)exp(x)+exp(−x)f(x)=\frac{\exp (x)-\exp (-x)}{\exp (x)+\exp (-x)}f(x)=exp(x)+exp(−x)exp(x)−exp(−x) | f′(x)=1−f(x)2f^{\prime}(x)=1-f(x)^{2}f′(x)=1−f(x)2 |
ReLU 函数 | f(x)=max(0,x)f(x)=\max (0, x)f(x)=max(0,x) | f′(x)=I(x>0)f^{\prime}(x)=I(x>0)f′(x)=I(x>0) |
ELU 函数 | f(x)=max(0,x)+min(0,γ(exp(x)−1))f(x)=\max (0, x)+\min (0, \gamma(\exp (x)-1))f(x)=max(0,x)+min(0,γ(exp(x)−1)) | f′(x)=I(x>0)+I(x≤0)⋅γexp(x)f^{\prime}(x)=I(x>0)+I(x \leq 0) \cdot \gamma \exp (x)f′(x)=I(x>0)+I(x≤0)⋅γexp(x) |
SoftPlus 函数 | f(x)=log(1+exp(x))f(x)=\log (1+\exp (x))f(x)=log(1+exp(x)) | f′(x)=11+exp(−x)f^{\prime}(x)=\frac{1}{1+\exp (-x)}f′(x)=1+exp(−x)1 |
前馈神经网络(Feedforward Neural Network,FNN)是最早发明的简单人工神经网络。
输入层,最后一层称为输出层,其他中间层称为隐藏层.无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示.前馈神经网络的图示

前馈神经网络的记号
| 记号 | 含义 |
|---|---|
| LLL | 神经网络的层数 |
| MlM_lMl | 第 𝑙 层神经元的个数 |
| 𝑓𝑙(⋅)𝑓_𝑙(⋅)fl(⋅) | 第𝑙 层神经元的激活函数 |
| W(l)∈RMl×Ml−1\boldsymbol{W}^{(l)} \in \mathbb{R}^{M_{l} \times M_{l-1}}W(l)∈RMl×Ml−1 | 第𝑙 − 1层到第 𝑙 层的权重矩阵 |
| b(l)∈RMl\boldsymbol{b}^{(l)} \in \mathbb{R}^{M_{l}}b(l)∈RMl | 第𝑙 − 1层到第𝑙 层的偏置 |
| z(l)∈RMl\boldsymbol{z}^{(l)} \in \mathbb{R}^{M_{l}}z(l)∈RMl | 第𝑙 层神经元的净输入(净活性值) |
| a(l)∈RMl\boldsymbol{a}^{(l)} \in \mathbb{R}^{M_{l}}a(l)∈RMl | 第𝑙 层神经元的输出(活性值) |
令𝒂(0) = 𝒙,前馈神经网络通过不断迭代下面公式进行信息传播:
z(l)=W(l)a(l−1)+b(l)a(l)=fl(z(l))\begin{aligned} \boldsymbol{z}^{(l)} & =\boldsymbol{W}^{(l)} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}^{(l)} \\ \boldsymbol{a}^{(l)} & =f_{l}\left(\boldsymbol{z}^{(l)}\right) \end{aligned}z(l)a(l)=W(l)a(l−1)+b(l)=fl(z(l))
活性值 𝒂(𝑙−1) 计算出第𝑙层神经元的净活性值 𝒛(𝑙),然后经过一个激活函数得到第 𝑙 层神经元的活性值损失函数:
L(y,y^)=−y⊤logy^\mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})=-\boldsymbol{y}^{\top} \log \hat{\boldsymbol{y}}L(y,y^)=−y⊤logy^
结构化风险函数:
R(W,b)=1N∑n=1NL(y(n),y^(n))+12λ∥W∥F2\mathcal{R}(\boldsymbol{W}, \boldsymbol{b})=\frac{1}{N} \sum_{n=1}^{N} \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)+\frac{1}{2} \lambda\|\boldsymbol{W}\|_{F}^{2}R(W,b)=N1n=1∑NL(y(n),y^(n))+21λ∥W∥F2
在梯度下降方法的每次迭代中,第𝑙 层的参数𝑾(𝑙)𝑾^{(𝑙)}W(l) 和𝒃(𝑙)𝒃^{(𝑙)}b(l) 参数更新方式为:
W(l)←W(l)−α∂R(W,b)∂W(l)=W(l)−α(1N∑n=1N(∂L(y(n),y^(n))∂W(l))+λW(l)),b(l)←b(l)−α∂R(W,b)∂b(l)=b(l)−α(1N∑n=1N∂L(y(n),y^(n))∂b(l)),\begin{aligned} \boldsymbol{W}^{(l)} & \leftarrow \boldsymbol{W}^{(l)}-\alpha \frac{\partial \mathcal{R}(\boldsymbol{W}, \boldsymbol{b})}{\partial \boldsymbol{W}^{(l)}} \\ & =\boldsymbol{W}^{(l)}-\alpha\left(\frac{1}{N} \sum_{n=1}^{N}\left(\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}}\right)+\lambda \boldsymbol{W}^{(l)}\right), \\\\ \boldsymbol{b}^{(l)} & \leftarrow \boldsymbol{b}^{(l)}-\alpha \frac{\partial \mathcal{R}(\boldsymbol{W}, \boldsymbol{b})}{\partial \boldsymbol{b}^{(l)}} \\ & =\boldsymbol{b}^{(l)}-\alpha\left(\frac{1}{N} \sum_{n=1}^{N} \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}}\right), \end{aligned}W(l)b(l)←W(l)−α∂W(l)∂R(W,b)=W(l)−α⎝⎛N1n=1∑N⎝⎛∂W(l)∂L(y(n),y^(n))⎠⎞+λW(l)⎠⎞,←b(l)−α∂b(l)∂R(W,b)=b(l)−α⎝⎛N1n=1∑N∂b(l)∂L(y(n),y^(n))⎠⎞,
偏导数,如果通过链式法则逐一对每个参数进行求偏导比较低效.反向传播算法来高效地计算梯度∂L(y,y^)∂wij(l)=∂z(l)∂wij(l)∂L(y,y^)∂z(l),∂L(y,y^)∂b(l)=∂z(l)∂b(l)∂L(y,y^)∂z(l)\begin{array}{l} \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial w_{i j}^{(l)}}=\frac{\partial \boldsymbol{z}^{(l)}}{\partial w_{i j}^{(l)}} \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}}, \\\\ \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{b}^{(l)}}=\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol{b}^{(l)}} \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} \end{array}∂wij(l)∂L(y,y^)=∂wij(l)∂z(l)∂z(l)∂L(y,y^),∂b(l)∂L(y,y^)=∂b(l)∂z(l)∂z(l)∂L(y,y^)
(1)计算偏导数∂z(l)∂wij(l)\frac{\partial \boldsymbol{z}^{(l)}}{\partial w_{i j}^{(l)}}∂wij(l)∂z(l),因为z(l)=W(l)a(l−1)+b(l)\boldsymbol{z}^{(l)}=\boldsymbol{W}^{(l)} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}^{(l)}z(l)=W(l)a(l−1)+b(l)
∂z(l)∂wij(l)=[∂z1(l)∂wij(l),⋯,∂zi(l)∂wij(l),⋯,∂zMl(l)∂wij(l)]=[0,⋯,∂(wi:(l)a(l−1)+bi(l))∂wij(l),⋯,0]=[0,⋯,aj(l−1),⋯,0]≜[](aj(l−1))∈R1×Ml,\begin{aligned} \frac{\partial \boldsymbol{z}^{(l)}}{\partial w_{i j}^{(l)}} & =\left[\frac{\partial z_{1}^{(l)}}{\partial w_{i j}^{(l)}}, \cdots, \frac{\partial z_{i}^{(l)}}{\partial w_{i j}^{(l)}}, \cdots, \frac{\partial z_{M_{l}}^{(l)}}{\partial w_{i j}^{(l)}}\right] \\\\ & =\left[0, \cdots, \frac{\partial\left(\boldsymbol{w}_{i:}^{(l)} \boldsymbol{a}^{(l-1)}+b_{i}^{(l)}\right)}{\partial w_{i j}^{(l)}}, \cdots, 0\right] \\\\ & =\left[0, \cdots, a_{j}^{(l-1)}, \cdots, 0\right] \\\\ & \triangleq []\left(a_{j}^{(l-1)}\right) \quad \in \mathbb{R}^{1 \times M_{l}}, \end{aligned}∂wij(l)∂z(l)=[∂wij(l)∂z1(l),⋯,∂wij(l)∂zi(l),⋯,∂wij(l)∂zMl(l)]=⎣⎡0,⋯,∂wij(l)∂(wi:(l)a(l−1)+bi(l)),⋯,0⎦⎤=[0,⋯,aj(l−1),⋯,0]≜[](aj(l−1))∈R1×Ml,
(2)计算偏导数 ∂z(l)∂b(l)\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol{b}^{(l)}}∂b(l)∂z(l) 因为 𝒛(𝑙)𝒛^{(𝑙)}z(l) 和 𝒃(𝑙)𝒃^{(𝑙)}b(l) 的函数关系为 z(l)=W(l)a(l−1)+𝒃(𝑙)\boldsymbol{z}^{(l)}=\boldsymbol{W}^{(l)} \boldsymbol{a}^{(l-1)}+ 𝒃^{(𝑙)}z(l)=W(l)a(l−1)+b(l)
∂z(l)∂b(l)=IMl∈RMl×Ml\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol{b}^{(l)}}=\boldsymbol{I}_{M_{l}} \quad \in \mathbb{R}^{M_{l} \times M_{l}}∂b(l)∂z(l)=IMl∈RMl×Ml
(3)计算偏导数∂L(y,y^)∂z(l)\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}}∂z(l)∂L(y,y^). 偏导数 ∂L(y,y^)∂z(l)\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}}∂z(l)∂L(y,y^)表示第𝑙层神经元对最终损失的影响,因此一般称为第 𝑙 层神经元的误差项,用 δ(𝑙)\delta ^{(𝑙)}δ(l) 来表示.
误差项 δ(𝑙)\delta ^{(𝑙)}δ(l) 也间接反映了不同神经元对网络能力的贡献程度,从而比较好地解决了贡献度分配问题
根据链式法则,第 𝑙 层的误差项为
δ(l)≜∂L(y,y^)∂z(l)=∂a(l)∂z(l)⋅∂z(l+1)∂a(l)⋅∂L(y,y^)∂z(l+1)=diag(fl′(z(l)))⋅(W(l+1))⊤⋅δ(l+1)=fl′(z(l))⊙((W(l+1))⊤δ(l+1))∈RMl,\begin{aligned} \delta^{(l)} & \triangleq \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} \\ & =\frac{\partial \boldsymbol{a}^{(l)}}{\partial \boldsymbol{z}^{(l)}} \cdot \frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol{a}^{(l)}} \cdot \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l+1)}} \\ & =\operatorname{diag}\left(f_{l}^{\prime}\left(\boldsymbol{z}^{(l)}\right)\right) \cdot\left(\boldsymbol{W}^{(l+1)}\right)^{\top} \cdot \delta^{(l+1)} \\ & =f_{l}^{\prime}\left(\boldsymbol{z}^{(l)}\right) \odot\left(\left(\boldsymbol{W}^{(l+1)}\right)^{\top} \delta^{(l+1)}\right) \in \mathbb{R}^{M_{l}}, \end{aligned}δ(l)≜∂z(l)∂L(y,y^)=∂z(l)∂a(l)⋅∂a(l)∂z(l+1)⋅∂z(l+1)∂L(y,y^)=diag(fl′(z(l)))⋅(W(l+1))⊤⋅δ(l+1)=fl′(z(l))⊙((W(l+1))⊤δ(l+1))∈RMl,
其中⊙是向量的点积运算符,表示每个元素相乘.
第 𝑙 层的误差项可以通过第𝑙 + 1层的误差项计算得到,这就是误差的反向传播.
第 𝑙 层的一个神经元的误差项是所有与该神经元相连的第 𝑙 + 1 层的神经元的误差项的权重和,再乘上该神经元激活函数的梯度.
因此,L(y,y^)\mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})L(y,y^) 关于第𝑙 层权重 𝑾(𝑙)𝑾^{(𝑙)}W(l) 的梯度为
∂L(y,y^)∂W(l)=δ(l)(a(l−1))⊤∈RMl×Ml−1\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{W}^{(l)}}=\delta^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\top} \quad \in \mathbb{R}^{M_{l} \times M_{l-1}}∂W(l)∂L(y,y^)=δ(l)(a(l−1))⊤∈RMl×Ml−1
同理,L(y,y^)\mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})L(y,y^) 关于第 𝑙 层偏置 𝒃(𝑙)𝒃^{(𝑙)}b(l) 的梯度为
∂L(y,y^)∂b(l)=δ(l)∈RMl\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{b}^{(l)}}=\delta^{(l)} \quad \in \mathbb{R}^{M_{l}}∂b(l)∂L(y,y^)=δ(l)∈RMl
因此,使用误差反向传播算法的前馈神经网络训练过程可以分为以下三步:
(1) 前馈计算每一层的净输入 𝒛(𝑙)𝒛^{(𝑙)}z(l) 和激活值𝒂(𝑙)𝒂^{(𝑙)}a(l),直到最后一层;
(2) 反向传播计算每一层的误差项 δ(𝑙)\delta^{(𝑙)}δ(l);
(3) 计算每一层参数的偏导数,并更新参数.
输入: 训练集𝒟,验证集𝒱,学习率𝛼, 正则化系数𝜆,网络层数𝐿,神经元数量 MlM_lMl, 1 ≤ 𝑙 ≤ 𝐿.
随机初始化 𝑾, 𝒃 ;
repeat
对训练集𝒟 中的样本随机重排序
for 𝑛 = 1 ⋯ 𝑁 do
从训练集𝒟 中选取样本(𝒙(𝑛),𝑦(𝑛))(𝒙^{(𝑛)}, 𝑦^{(𝑛)})(x(n),y(n))
前馈计算每一层的净输入𝒛(𝑙)𝒛^{(𝑙)}z(l) 和激活值𝒂(𝑙)𝒂^{(𝑙)}a(l),直到最后一层;
反向传播计算每一层的误差δ(𝑙)\delta^{(𝑙)}δ(l);
// 计算每一层参数的导数
∀l,∂L(y(n),y^(n))∂W(l)=δ(l)(a(l−1))⊤\forall l, \quad \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial W^{(l)}}=\delta^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\top}∀l,∂W(l)∂L(y(n),y^(n))=δ(l)(a(l−1))⊤
∀l,∂L(y(n),y^(n))∂b(l)=δ(l)\forall l, \quad \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}}=\delta^{(l)}∀l,∂b(l)∂L(y(n),y^(n))=δ(l)
// 更新参数
W(l)←W(l)−α(δ(l)(a(l−1))⊤+λW(l))\boldsymbol{W}^{(l)} \leftarrow \boldsymbol{W}^{(l)}-\alpha\left(\delta^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\top}+\lambda\boldsymbol{W}^{(l)}\right)W(l)←W(l)−α(δ(l)(a(l−1))⊤+λW(l))
b(l)←b(l)−αδ(l)\boldsymbol{b}^{(l)} \leftarrow \boldsymbol{b}^{(l)}-\alpha \delta^{(l)}b(l)←b(l)−αδ(l)
end
until 神经网络模型在验证集𝒱 上的错误率不再下降;
输出: 𝑾, bbb
神经网络的参数学习比线性模型要更加困难,主要原因有两点:
非凸优化问题神经网络的优化问题是一个
非凸优化问题.
- 以一个最简单的1-1-1结构的两层神经网络为例,
y=σ(w2σ(w1x))y=\sigma\left(w_{2} \sigma\left(w_{1} x\right)\right)y=σ(w2σ(w1x))- 其中 𝑤1𝑤_1w1 和 𝑤2𝑤_2w2 为网络参数,𝜎(⋅)为Logistic函数.
- 通过图可以看出,平方误差和交叉熵损失函数都是关于参数的非凸函数
梯度消失问题梯度消失问题:
Sigmoid 型函数饱和区的导数接近于 0.误差经过每一层传递都会不断衰减.当网络层数很深时,梯度就会不停衰减,甚至消失,使得整个网络很难训练.
因为手动用链式法则来计算风险函数对每个参数的梯度非常琐碎并容易出错,导致实现神经网络变得十分低效.实际上,参数的梯度可以让计算机来自动计算.
主流的深度学习框架都包含了自动梯度计算的功能,自动计算梯度的方法可以分为以下三类:数值微分、符号微分和自动微分.
数值微分是用数值方法来计算函数𝑓(𝑥)的导数.函数𝑓(𝑥)的点𝑥的导数定义为
f′(x)=limΔx→0f(x+Δx)−f(x)Δxf^{\prime}(x)=\lim _{\Delta x \rightarrow 0} \frac{f(x+\Delta x)-f(x)}{\Delta x}f′(x)=Δx→0limΔxf(x+Δx)−f(x)
数值微分方法非常容易实现,但找到一个合适的扰动 Δ𝑥 却十分困难.
如果 Δ𝑥 过小,会引起数值计算问题,比如舍入误差;如果Δ𝑥 过大,会增加截断误差,使得导数计算不准确.
因此,数值微分的实用性比较差.
截断误差.f′(x)=limΔx→0f(x+Δx)−f(x−Δx)2Δx.f^{\prime}(x)=\lim _{\Delta x \rightarrow 0} \frac{f(x+\Delta x)-f(x-\Delta x)}{2 \Delta x} .f′(x)=Δx→0lim2Δxf(x+Δx)−f(x−Δx).
数值微分的另外一个问题是
计算复杂度.假设参数数量为𝑁,则每个参数都需要单独施加扰动,并计算梯度.
假设每次正向传播的计算复杂度为𝑂(𝑁),则计算数值微分的总体时间复杂度为𝑂(𝑁^2).
符号微分是一种基于符号计算的自动求导方法.即将数值代入数学表示中进行计算.符号计算也叫代数计算.
这里的变量被看作符号,一般不需要代入具体的值.
符号计算的输入和输出都是数学表达式,一般包括对数学表达式的化简、因式分解、微分、积分、解代数方程、求解常微分方程等运算.
自动微分是一种可以对一个(程序)函数进行计算导数的方法.
自动微分的基本原理是所有的数值计算可以分解为一些基本操作,包含+, −, ×, / 和一些初等函数 exp, log,sin, cos 等,然后利用链式法则来自动计算一个复合函数的梯度.
例:令复合函数𝑓(𝑥; 𝑤, 𝑏)为
f(x;w,b)=1exp(−(wx+b))+1f(x ; w, b)=\frac{1}{\exp (-(w x+b))+1}f(x;w,b)=exp(−(wx+b))+11
其计算图为:

前向模式和反向模式可以看作应用链式法则的两种梯度累积方式.
标量,因此采用反向模式为最有效的计算方式,只需要一遍计算.
上一篇:LVGL自定义组件__页面指示器
下一篇:前端给数字添加横线贯穿