从0了解深度学习——前馈神经网络

本文章将介绍深度学习知识中的前馈神经网络

在之前的机器学习文章中,就已经对前馈神经网络进行讲解,这里将进行更详细的说明

(如果文章中的公式不能正常显示,请刷新该页面。如果还不能解决,请邮箱联系我,谢谢...)

基本结构

激活函数的性质:

  • 连续并可导(允许在少数点上不可导)的非线性函数

可导的激活函数可以直接利用优化方法来学习网络参数

  • 激活函数及其导函数要尽可能简单

有利于提高网络计算效率

  • 激活函数的导函数的值域要在一个合适的区间内

不能太大也不能太小,否则会影响训练效率和稳定性

  • 单调递增(一种对应关系,参数小对应激活也应该小)

目前一些函数不一定单调递增,但整体趋势向上,局部不为单调递增

激活函数

S型函数

Logistic函数(Sigmoid) \[ \sigma(x)=\frac{1}{1+e^{-x}}\quad\quad (0,+\infty) \]

Tanh函数 \[ \begin{gather} tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\quad\quad (-1,1) \\ \\ tanh(x)=2\sigma(2x)-1 \end{gather} \]

性质:

  • 饱和函数:两边梯度—>0,中间—>线性
  • Tanh函数是0中心化的,而Logistic函数的输出恒大于0

非0中心化会使得后一层神经元输入发生偏移,进一步减缓收敛速度

解决方法:归一化、加偏置: \(\sigma(x)+b\)

斜坡函数

ReLu函数 \[ ReLu(x)=max(0,x) \]

优点:计算更高效,生物学合理性,缓解梯度消失问题

  • 死亡ReLu问题:若参数大量为0,则参数不更新

Leaky-ReLu函数 \[ Leaky-ReLu(x)= \begin{cases} x\quad x>0 \\ \gamma{x}\quad x\leq 0 \end{cases} \]

近似0中心化的非线性函数 \[ ELU(x)= \begin{cases} x\quad x>0 \\ \gamma(e^x-1)\quad x\leq0 \end{cases} \] Rectifier函数的平滑版本 \[ Softplus(x)=\log(1+e^x) \]

复合函数

Swish函数

一种自门控的激活函数 \[ \begin{gather} \sigma(x)=\frac{1}{1+e^x} \\ \\ Swish(x)=x·\sigma(\beta x) \end{gather} \] 相当于斜坡函数与S型函数的结合

高斯误差线性单元(GELU)

与Swish类似: \[ GELU=x·P(X\leq x) \] \(P(X\leq x)\) 为高斯分布 \(N(\mu,\sigma^2)\) 的累积分布函数 ,一般为标准高斯分布

由于其累积分布函数为S型函数,因此GELU可以用Tanh或Logistic来近似: \[ \begin{gather} GELU(x)\approx 0.5x(1+tanh(\sqrt{\frac{2}{\pi}}(x+0.044715x^3))) \\ GELU(x)\approx x\sigma(1.702x) \end{gather} \] GELU常用于GPT-3 或 BERT 和其他 transformers 模型

激活函数 函数 导数
Logistic函数 \(f(x)=\frac{1}{1+e^{-x}}\) \(f'(x)=f(x)(1-f(x))\)
Tanh函数 \(f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\) \(f'(x)=1-f(x)^2\)
ReLu函数 \(f(x)=max(0,x)\) \(f'(x)=I(x>0)\)
ELU函数 \(f(x)=max(0,x)+min(0,\gamma(e^x-1))\) \(f'(x)=I(x>0)+I(x\leq0)·\gamma e^x\)
Softplus函数 \(f(x)=\log(1+e^x)\) \(f'(x)=\frac{1}{1+e^{-x}}\)

人工神经网络

人工神经网络三方面:

  • 神经元的激活规则:神经元输入到输出之间的映射关系,一般为非线性函数
  • 网络的拓扑结构:不同神经元之间的连接关系
  • 学习算法:通过训练数据来学习神经网络的参数(不一定都是梯度下降)

神经网络: 一种主要的连接主义模型

20世纪80年代后期,最流行的连接注意模型为 分布式并行处理网络 有三个特征:

  • 信息表示是分布式的(非局部)
  • 记忆和知识是存储在单元之间的连接上
  • 通过逐渐改变单元之间的连接强度来学习新知识

上述三个特征同样是神经网络的特点

引入误差反向传播来改进其学习能力后,神经网络也越来越多地应用在各种机器学习任务上

前馈神经网络

前馈神经网络是全连接神经网络、多层感知器

  • 各神经元分属不同的层,层内无连接
  • 相邻两层之间的神经元全部 两两连接
  • 整个网络中无反馈,信号从输入到输出单向传播,可用一个有向无环图表示:

我们使用以下记号来描述一个前馈神经网络:

  • \(L:\) 表示神经网络的层数
  • \(m^{(l)}:\) 表示第 \(l\) 层神经元的个数
  • \(f_l(·):\) 表示 \(l\) 层神经元的激活函数
  • \(W^{(l)}\in \mathbb{R}^{m^{(l)}\times m^{(l-1)}}:\) 表示 \(l-1\) 层到 \(l\) 层的权重矩阵
  • \(b^{(l)}\in \mathbb{R}^{m^{l}}:\) 表示 \(l-1\) 层到第 \(l\) 层的偏置
  • \(z^{(l)}\in \mathbb{R}^{m^{l}}:\) 表示 \(l\) 层神经元的净输入(净活性值)
  • \(a^{(l)}\in \mathbb{R}^{m^{l}}:\) 表示 \(l\) 层神经元的输出(活性值)

信息传递

网络通过以下公式进行信息传递 $$ \[\begin{gather} \begin{bmatrix} . \\ . \\ M_l \\ . \\ . \end{bmatrix}= \begin{bmatrix} ... \\ ... \\ M_l\times M_{l-1} \\ ... \\ ... \end{bmatrix}· \begin{bmatrix} . \\ . \\ M_{l-1} \\ . \\ . \end{bmatrix}+ \begin{bmatrix} . \\ . \\ M_l \\ . \\ . \end{bmatrix} \\ \\ z^l=W^l·a^{l-1}+b^l \\ a^l=f_l(z^l) \\ \downarrow \\ a^l=f_l(W^l·a^{l-1}+b^l) \end{gather}\] $$

前馈计算: \[ x=a^0\xrightarrow{W^1}z^1\xrightarrow{f_1(·)}a^1\xrightarrow{W^2}z^2\xrightarrow{f_2(·)}a^2\xrightarrow{W^3}...\xrightarrow{f_{l-1}}a^{l-1}\xrightarrow{W^l}z^l\xrightarrow{f_l(·)}a^l=\phi(x;W,b) \]

通用近似定理

根据通用近似定理,对于具有 线性输出层 和至少一个 使用“挤压”性质的激活函数的隐藏层 组成的神经网络,只要隐藏层神经元足够多,它可以以任意精度来近似任何一个定义在实数空间中的有界闭集函数

反向传播算法

梯度下降法需要计算损失函数对参数的偏导数,如果通过链式法则逐一对每个参数进行求偏导效率比较低。在神经网络的训练中经常使用 反向传播算法 来计算高效地梯度

矩阵微积分

分母布局:分母的尺寸作为结果的行数,分子布局相反

标量关于向量的偏导数:

  • \(y\) :标量
  • \(\vec{x}\) :大小为 M 的向量

\[ \frac{\partial y}{\partial \vec{x}}=[\frac{\partial y}{\partial x_1},...,\frac{\partial y}{\partial x_M}]^T \in \mathbb{R}^{M\times1} \]

向量关于向量的偏导数:

  • \(\vec{f(x)}\) :大小为 N 的向量

  • \(\vec{x}\) :大小为 M 的向量

\[ \frac{\partial \vec{f(x)}}{\partial \vec{x}}= \begin{bmatrix} \frac{\partial y_1}{\partial x_1},...,\frac{\partial y_N}{\partial x_1} \\ ... \\ \frac{\partial y_1}{\partial x_M},...,\frac{\partial y_N}{\partial x_M} \end{bmatrix} \in \mathbb{R}^{M\times N} \]

链式法则

\(x\in R\,,\;\vec{y}=g(x)\in\mathbb{R}^M\,,\;\vec{z}=f(y)\in\mathbb{R}^N\) 则: \[ \frac{\partial \vec{z}}{\partial x}=\frac{\partial \vec{y}}{\partial x}·\frac{\partial \vec{z}}{\partial \vec{y}}\in\mathbb{R}^{1\times N}\qquad<1> \]

\(\vec{x}\in \mathbb{R}^M\,,\;\vec{y}=g(x)\in\mathbb{R}^K\,,\;\vec{z}=f(y)\in\mathbb{R}^N\) 则: \[ \frac{\partial \vec{z}}{\partial \vec{x}}=\frac{\partial \vec{y}}{\partial \vec{x}}·\frac{\partial \vec{z}}{\partial \vec{y}}\in\mathbb{R}^{M\times N}\qquad<2> \]

\(X\in \mathbb{R}^{M\times N}\,,\;\vec{y}=g(X)\in\mathbb{R}^K\,,\;z=f(y)\in\mathbb{R}\) 则: \[ \frac{\partial z}{\partial x_{ij}}=\frac{\partial \vec{y}}{\partial x_{ij}}·\frac{\partial z}{\partial \vec{y}}\in\mathbb{R}\qquad<3> \]

计算梯度

假设损失函数为:\(L(y,\hat{y})\) ,要进行参数学习,就需要计算损失函数关于每个参数的导数: \[ W^l:\quad\frac{\partial L(y,\hat{y})}{\partial W^l}\qquad b:\quad\frac{\partial L(y,\hat{y})}{\partial b^l} \] 对于 \(W^l\) ,是标量对矩阵求导,应用上述公式<3>,转化为: \[ \frac{\partial L(y,\hat{y})}{\partial w_{ij}} \] 对矩阵内每个数单独求导后拼成一个矩阵

已知: \(z^l=W^l·a^{l-1}+b^l\) 求: \[ \begin{gather} W:\qquad \frac{\partial L(y,\hat{y})}{\partial w_{ij}^l}=\frac{\partial z^l}{\partial w_{ij}^l}·\frac{\partial L(y,\hat{y})}{\partial z^l} \\ \\ b:\qquad \frac{\partial L(y,\hat{y})}{\partial b^l}=\frac{\partial z^l}{\partial b^l}·\frac{\partial L(y,\hat{y})}{\partial z^l} \end{gather} \] 所求为三部分组成:

  • w和b各自的部分:\(\frac{\partial z^l}{\partial w_{ij}^l}\)\(\frac{\partial z^l}{\partial b^l}\)
  • 公共部分:\(\frac{\partial L(y,\hat{y})}{\partial z^l}\)

W部分

计算: \(\frac{\partial z^l}{\partial w_{ij}^l}\) \[ \frac{\partial z^l}{\partial w_{ij}^l}=[\frac{\partial z^l_1}{\partial w_{ij}^l}.....\frac{\partial z^l_i}{\partial w_{ij}^l}.....\frac{\partial z^l_{M^l}}{\partial w_{ij}^l}] \] 展开为一个和 z 维度相同的矩阵,其中只有中间项 \(\frac{\partial z^l_i}{\partial w_{ij}^l}\) 和分母有关,即其它项都是无关项,求导为0,简化为: \[ \begin{gather} \frac{\partial z^l}{\partial w_{ij}^l}=[0,.....,\frac{\partial (w_{ij}^l·a^{l-1}+b_i^l)}{\partial w_{ij}^l},.....,0] \\ \\ =[0,.....,a_j^{l-1},.....,0]\,\overset{\triangle}{=}\,I_i(a_j^{l-1})\;\in\mathbb{R}^{1\times M_l} \end{gather} \]

b部分

计算: \(\frac{\partial z^l}{\partial b^l}\) \[ \frac{\partial z^l}{\partial b^l}=\frac{\partial (W^l·a^{l-1}+b^l)}{\partial b^l}=I_{M_l}\;(单位阵)\;\in\mathbb{R}^{M_l\times M_l} \]

公共部分(误差项)

我们可以将其称为误差项:\(\delta^l\overset{\triangle}{=}\frac{\partial L(y,\hat{y})}{\partial z^l}\in\mathbb{R}^{M_l}\)

已知: \[ \begin{cases} z^{l+1}=w^{l+1}·a^l+b^{l+1} \\ a^l=f_l(z^l) \end{cases} \] 计算误差项: \[ \begin{gather} \delta^l\overset{\triangle}{=}\frac{\partial L(y,\hat{y})}{\partial z^l} \\ =\frac{\partial a^l}{\partial z^l}·\frac{\partial z^{l+1}}{\partial a^l}·\frac{\partial L(y,\hat{y})}{\partial z^{l+1}} \end{gather} \]

  • 对于 \(\frac{\partial a^l}{\partial z^l}\)

\[ \frac{\partial a^l}{\partial z^l}=\frac{\partial f_l(z^l)}{\partial z^l} \]

由于只有对应位置有效,其余为无效项,其结果为对角阵: \[ \frac{\partial a^l}{\partial z^l}=diag(f'_l(z^l))\in\mathbb{R}^{M_l\times M_l} \]

  • 对于 \(\frac{\partial z^{l+1}}{\partial a^l}\)

\[ \frac{\partial z^{l+1}}{\partial a^l}=\frac{\partial (W^{l+1}·a^l+b^{l+1})}{\partial a^l}=W^{l+1} \]

  • 对于 \(\frac{\partial L(y,\hat{y})}{\partial z^{l+1}}\)

\[ \begin{gather} \because\delta^l\overset{\triangle}{=}\frac{\partial L(y,\hat{y})}{\partial z^l} \\ \therefore\frac{\partial L(y,\hat{y})}{\partial z^{l+1}}=\delta^{l+1} \end{gather} \]

将三者合并: \[ \begin{gather} \delta^l\overset{\triangle}{=}\frac{\partial L(y,\hat{y})}{\partial z^l} \\ =\frac{\partial a^l}{\partial z^l}·\frac{\partial z^{l+1}}{\partial a^l}·\frac{\partial L(y,\hat{y})}{\partial z^{l+1}} \\ =diag(f'_l(z^l))·(W^{l+1})^T·\delta^{l+1} \end{gather} \] 因为对角阵乘以向量,相当于其中元素乘以向量中的每一元素,所以: \[ \begin{gather} \delta^l\overset{\triangle}{=}\frac{\partial L(y,\hat{y})}{\partial z^l} \\ =diag(f'_l(z^l))·(W^{l+1})^T·\delta^{l+1} \\ =f'_l(z^l)·((W^{l+1})^T·\delta^{l+1})\in\mathbb{R}^{M_l} \end{gather} \] 根据公式可以看出:

\(l\) 层的误差项可以通过第 \(l+1\) 层的误差项计算得到,这就是误差的反向传播。反向传播算法的含义是:第 \(l\) 层的一个神经元的误差项(或敏感性)是所有与该神经元相连的第 \(l+1\) 层的神经元的误差项的权重和。然后,再乘上该神经元激活函数的梯度

三者合并

对于W: \[ \begin{gather} \frac{\partial L(y,\hat{y})}{\partial w_{ij}^l}=I_i(a_j^{l-1})·\delta^l=[0,...,a_j^{l-1},...,0]·[\delta^l_1,...,\delta^l_i,...,\delta^l_{M_l}] \\ =\delta_i^l·a_j^{l-1} \end{gather} \] 对于b: \[ \frac{\partial L(y,\hat{y})}{\partial b^l}=\delta^l \] 在计算出每一层的误差项之后,我们就可以得到每一层参数的梯度。因此,基于误差反向传播算法(backpropagation,BP)的前馈神经网络训练过程可以 分为以下三步:

  • 前馈计算每一层的净输入 \(z^{(l)}\) 和激活值 \(a^{(l)}\) ,直到最后一层
  • 反向传播计算每一层的误差项 \(\delta^{(l)}\)
  • 计算每一层参数的偏导数,并更新参数

计算图与自动微分

自动微分:利用链式法则来自动计算一个复合函数的梯度

计算图

例如: \[ f(x;w,b)=\frac{1}{e^{-(wx+b)}+1} \]\(x=1,w=0,b=0\) 时的计算图为:

函数 导数
\(h_1=x·w\) \(\frac{\partial h_1}{\partial w}=x\) \(\frac{\partial h_1}{\partial x}=w\)
\(h_2=h_1+b\) \(\frac{\partial h_2}{\partial h_1}=1\) \(\frac{\partial h_2}{\partial b}=1\)
\(h_3=-h_2\) \(\frac{\partial h_3}{\partial h_2}=-1\)
\(h_4=e^{h_3}\) \(\frac{\partial h_4}{\partial h_3}=e^{h_3}\)
\(h_5=h_4+1\) \(\frac{\partial h_5}{\partial h_4}=1\)
\(h_6=\frac{1}{h_5}\) \(\frac{\partial h_6}{\partial h_5}=-\frac{1}{h_5^2}\)

整个复合函数 \(f(x;w,b)\) 关于参数w和b的导数可以通过计算图上的节点 \(f(x;w,b)\) 与参数 \(w\)\(b\) 之间路径上所有的导数连乘来得到,即: \[ \begin{gather} \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} \end{gather} \]\(x=1,w=0,b=0\) 时,可以得到: \[ \begin{gather} \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{gather} \]

自动微分:

  • 反向模式:以上述计算图为例,从左到右过程中,依次计算 \(h_1,.....,h_6\) 的值之后,从 \(h_6,.....,h_1\) 反向计算梯度,累乘后得到结果
  • 前向模式:从左到右过程中,依次计算 \(h_1,.....,h_6\) 的值之后累乘就能马上得到梯度,但最终还需要在反向时才能更新参数
    • 缺点:需要临时空间存储计算过程中的 \(h_i\) 的导数值,对于大模型会占用更大空间

反向传播算法(自动微分的反向模式)

  • 前向计算:每一层的状态和激活值,直到最后一层
  • 反向计算:每一层的参数的偏导数
  • 更新参数

静态计算图和动态计算图

  • 静态计算图是在编译时构建的计算图,计算图构建好后在程序运行时不能改变
    • Theano和TensorFlow
  • 动态计算图是在程序运行时动态构建
    • DyNet,Chainer和PyTorch

两种构建方式各有优缺点

  • 静态计算图在构建时可以进行优化,并行能力强,但灵活性比较差
  • 动态计算图则不容易优化,当不同输入的网络结构不一致时,难以并行计算,但是灵活性比较高

优化问题

非凸优化问题

梯度消失问题

对于反向传播: \[ \begin{gather} y=f^5(f^4(f^3(f^2(f^1(x))))) \\ \frac{\partial y}{\partial x}=\frac{\partial f^1}{\partial x}\frac{\partial f^2}{\partial f^1}\frac{\partial f^3}{\partial f^2}\frac{\partial f^4}{\partial f^3}\frac{\partial f^5}{\partial f^4} \end{gather} \] 对于值域为 (0,1)的激活函数来说:

小于1的非负数累乘将会趋近于0,造成梯度消失

难点

  • 非凸优化问题:存在局部最优解而非全局最优解,影响迭代

  • 梯度消失问题,下层参数比较难调

  • 参数过多,影响训练

    • 参数解释起来比较困难

需求

  • 计算资源要大
  • 数据要多
  • 算法效率要好:快收敛

从0了解深度学习——前馈神经网络

http://www.heimaolala.top/2025/06/23/DL2/

作者

heimaolala

发布于

2025-06-23

更新于

2025-09-15

许可协议

评论