[机器学习-从入门到入土] 神经网络

个人导航

知乎:https://www.zhihu.com/people/byzh_rc

CSDN:https://blog.csdn.net/qq_54636039

注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码

参考文章:各方资料

符号说明

m m m:样本数
k k k:神经元编号 / 输出维度索引

权重矩阵 Θ ( l ) \Theta^{(l)} Θ(l)

Θ ( l ) \Theta^{(l)} Θ(l) 表示 l l l 层 → 第 l + 1 l+1 l+1 层的权重矩阵

  • 包含该层的 权重 + bias
  • 行:第 l + 1 l+1 l+1 层神经元
  • 列: 1 + 1+ 1+ l l l 层神经元数(首列为 bias)

维度:(下一层神经元数, 1+当前层神经元数)

Θ ( l ) ∈ R ( next ,   1 + self ) \Theta^{(l)} \in \mathbb{R}^{(\text{next},\,1+\text{self})} Θ(l)R(next,1+self)

误差项 δ ( l ) \delta^{(l)} δ(l)

δ ( l ) \delta^{(l)} δ(l) 表示 l l l 层神经元的误差项

  • 本质: ∂ E ∂ z ( l ) \displaystyle \frac{\partial E}{\partial z^{(l)}} z(l)E
  • 用于将误差从输出层反向传播

特殊记号:

  • δ ( L ) \delta^{(L)} δ(L):输出层误差( L L L 为网络总层数)
单样本梯度矩阵 δ k ( l + 1 ) ( a k ( l ) ) T \delta_{k}^{(l+1)} \left(a_{k}^{(l)}\right)^{T} δk(l+1)(ak(l))T

δ k ( l + 1 ) ( a k ( l ) ) T \delta_{k}^{(l+1)} \left(a_{k}^{(l)}\right)^{T} δk(l+1)(ak(l))T

  • 表示 单个样本 Θ ( l ) \Theta^{(l)} Θ(l) 的梯度
  • 外积形式
  • 维度与 Θ ( l ) \Theta^{(l)} Θ(l) 相同
批量梯度累加矩阵 Δ ( l ) \Delta^{(l)} Δ(l)

Δ ( l ) \Delta^{(l)} Δ(l) 表示 l l l 层在一个 batch( m m m 个样本)上的梯度累加

Δ ( l ) ∈ R ( next ,   1 + self ) \Delta^{(l)} \in \mathbb{R}^{(\text{next},\,1+\text{self})} Δ(l)R(next,1+self)

总梯度(代价函数梯度) ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial \Theta_{ij}^{(l)}} J(\Theta) Θij(l)J(Θ)

∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial \Theta_{ij}^{(l)}} J(\Theta) Θij(l)J(Θ)

  • 维度与 Θ ( l ) \Theta^{(l)} Θ(l) 相同
  • Δ ( l ) \Delta^{(l)} Δ(l) 的平均
符号 形状 解释
a ( l ) a^{(l)} a(l) ( self , 1 ) (\text{self},1) (self,1) l l l 层神经元的激活后的输出(不含 bias)
a ~ ( l ) \tilde a^{(l)} a~(l) ( 1 + self , 1 ) (1+\text{self},1) (1+self,1) l l l 层激活向量补 1 后的输入(首元素为 bias)
z ( l + 1 ) z^{(l+1)} z(l+1) ( next , 1 ) (\text{next},1) (next,1) l + 1 l+1 l+1 层的加权后的输入(线性部分)
Θ ( l ) \Theta^{(l)} Θ(l) ( next , 1 + self ) (\text{next},1+\text{self}) (next,1+self) l l l 层 → 第 l + 1 l+1 l+1 层的权重矩阵(含 bias)
δ ( l ) \delta^{(l)} δ(l) ( self , 1 ) (\text{self},1) (self,1) l l l 层神经元的误差项 ∂ E ∂ z ( l ) \displaystyle \frac{\partial E}{\partial z^{(l)}} z(l)E
δ ( l + 1 ) ( a ~ ( l ) ) T \delta^{(l+1)}(\tilde a^{(l)})^T δ(l+1)(a~(l))T ( next , 1 + self ) (\text{next},1+\text{self}) (next,1+self) 单样本 Θ ( l ) \Theta^{(l)} Θ(l) 的梯度(外积)
Δ ( l ) \Delta^{(l)} Δ(l) ( next , 1 + self ) (\text{next},1+\text{self}) (next,1+self) batch 内 m m m 个样本的梯度累加矩阵
∂ ∂ Θ ( l ) J ( Θ ) \dfrac{\partial}{\partial \Theta^{(l)}}J(\Theta) Θ(l)J(Θ) ( next , 1 + self ) (\text{next},1+\text{self}) (next,1+self) 代价函数对权重的总梯度 1 m Δ ( l ) \frac{1}{m}\Delta^{(l)} m1Δ(l)

在这里插入图片描述

激活函数(Activation Function)

1. Sigmoid

定义:
g ( z ) = 1 1 + exp ⁡ ( − z ) \mathbf{g(z)=\frac{1}{1+\exp(-z)}} g(z)=1+exp(z)1

梯度:
g ′ ( z ) = g ( z ) ( 1 − g ( z ) ) \mathbf{g'(z)=g(z)(1-g(z))} g(z)=g(z)(1g(z))

a = g ( z ) a=g(z) a=g(z)
g ′ ( z ) = a ( 1 − a ) g'(z)=a(1-a) g(z)=a(1a)

2. Tanh

定义:
g ( z ) = tanh ⁡ ( z ) = e z − e − z e z + e − z \mathbf{g(z)=\tanh(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}} g(z)=tanh(z)=ez+ezezez

梯度:
g ′ ( z ) = 1 − tanh ⁡ 2 ( z ) \mathbf{g'(z)=1-\tanh^2(z)} g(z)=1tanh2(z)

a = g ( z ) a=g(z) a=g(z)
g ′ ( z ) = 1 − a 2 g'(z)=1-a^2 g(z)=1a2

3. ReLU

定义:
ReLU ( z ) = max ⁡ ( 0 , z ) \text{ReLU}(z)=\max(0,z) ReLU(z)=max(0,z)

梯度:
ReLU ′ ( z ) = { 1 , z > 0 0 , z ≤ 0 \text{ReLU}'(z)= \begin{cases} 1,&z>0\\ 0,&z\le0 \end{cases} ReLU(z)={1,0,z>0z0

损失函数 E E E(单样本)

单个样本的误差,用于衡量模型输出与目标之间的差异

y y y: 预测值
t t t: 真实标签

1.均方误差(MSE)

E = 1 2 ( y − t ) 2 E=\frac{1}{2}(y-t)^2 E=21(yt)2

2.交叉熵(Binary Cross-Entropy)

E = − [ t log ⁡ y + ( 1 − t ) log ⁡ ( 1 − y ) ] E=-[t\log y+(1-t)\log(1-y)] E=[tlogy+(1t)log(1y)]

代价函数 J J J(全样本)

整个训练集的平均损失:
J ( Θ ) = 1 m ∑ i = 1 m E ( i ) J(\Theta)=\frac{1}{m}\sum_{i=1}^{m}E^{(i)} J(Θ)=m1i=1mE(i)

误差项 δ \delta δ(核心)

误差项是 损失函数对加权输入 z z z 的偏导数
δ ( l ) = ∂ E ∂ z ( l ) \delta^{(l)}=\frac{\partial E}{\partial z^{(l)}} δ(l)=z(l)E

  • 输出层误差项 δ ( L ) \delta^{(L)} δ(L)
  • 隐藏层误差项 δ ( L − 1 ) \delta^{(L-1)} δ(L1)

输出层误差项 δ ( L ) \delta^{(L)} δ(L)

假设:
a ( L ) = g ( z ( L ) ) a^{(L)}=g(z^{(L)}) a(L)=g(z(L))

定义:
δ ( L ) = ∂ E ∂ a ( L ) ⊙ g ′ ( z ( L ) ) \delta^{(L)}=\frac{\partial E}{\partial a^{(L)}} \odot g'(z^{(L)}) δ(L)=a(L)Eg(z(L))

1. Sigmoid + MSE

合法但过时, 早期大量使用
-> 梯度结构是根本问题
E = 1 2 ∑ k ( a k − t k ) 2 E = \frac{1}{2} \sum_k \left(a_k - t_k\right)^2 E=21k(aktk)2

δ k = ( a k − t k )   a k ( 1 − a k ) \delta_k = (a_k - t_k)\, a_k(1 - a_k) δk=(aktk)ak(1ak)

δ = ( a − t ) ⊙ ( a ⊙ ( 1 − a ) ) \delta = (a - t) \odot \bigl(a \odot (1 - a)\bigr) δ=(at)(a(1a))

2. Sigmoid + Binary Cross-Entropy

神经网络常用
E = − [ t log ⁡ a + ( 1 − t ) log ⁡ ( 1 − a ) ] E = -\bigl[t \log a + (1 - t)\log(1 - a)\bigr] E=[tloga+(1t)log(1a)]

δ ( L ) = a ( L ) − t \delta^{(L)} = a^{(L)} - t δ(L)=a(L)t

3. Sigmoid + Categorical Cross-Entropy

没人这么做

概率假设层面:

  • Sigmoid 的假设: 多标签独立事件

    • 每个 a k a_k ak 是 独立 Bernoulli 概率
    • 不要求 ∑ k a k = 1 \sum_k a_k = 1 kak=1
  • Categorical Cross-Entropy 的假设: 单标签互斥事件

    • t t t 是 one-hot, 事件是 互斥且完备
    • 必须要求 ∑ k a k = 1 \sum_k a_k = 1 kak=1
4. Softmax + MSE

E = 1 2 ∑ k ( a k − t k ) 2 E = \frac{1}{2} \sum_k (a_k - t_k)^2 E=21k(aktk)2

δ  无法化简,包含 Softmax 的 Jacobian \delta \ \text{无法化简,包含 Softmax 的 Jacobian} δ 无法化简,包含 Softmax  Jacobian

δ \delta δ无法化简, 极其复杂 -> 没人用

5. Softmax + Binary Cross-Entropy

E = − [ t log ⁡ a + ( 1 − t ) log ⁡ ( 1 − a ) ] E = -\bigl[t \log a + (1 - t)\log(1 - a)\bigr] E=[tloga+(1t)log(1a)]

δ ( L ) = a ( L ) − t \delta^{(L)} = a^{(L)} - t δ(L)=a(L)t

6. Softmax + Categorical Cross-Entropy

这正是现在神经网络最常用的:

  • 直接拿linear的输出结果logits传给CrossEntropy的criterion
  • 而该criterion内封装了一个softmax

E = − ∑ k t k log ⁡ a k E = -\sum_k t_k \log a_k E=ktklogak

δ ( L ) = a ( L ) − t \delta^{(L)} = a^{(L)} - t δ(L)=a(L)t

隐藏层误差项 δ ( L − 1 ) \delta^{(L-1)} δ(L1)

递推公式(反向传播核心):
δ ( L − 1 ) = ∂ E ∂ a ( L − 1 ) ⊙ g ′ ( z ( L − 1 ) ) = ( ∂ E ∂ z ( L ) ⋅ ∂ z ( L ) ∂ a ( L − 1 ) ) ⊙ g ′ ( z ( L − 1 ) ) = δ ( L ) Θ ( L − 1 ) ⊙ g ′ ( z ( L − 1 ) ) \begin{align} \delta^{(L-1)} &= \frac{\partial E}{\partial a^{(L-1)}}⊙g'(z^{(L-1)}) \\ &=(\frac{\partial E}{\partial z^{(L)}} \cdot \frac{\partial z^{(L)}}{\partial a^{(L-1)}})⊙g'(z^{(L-1)}) \\ &= \delta^{(L)} \Theta^{(L-1)} ⊙ g^{\prime} (z^{(L-1)}) \\ \end{align} δ(L1)=a(L1)Eg(z(L1))=(z(L)Ea(L1)z(L))g(z(L1))=δ(L)Θ(L1)g(z(L1))

说明:

  • 先通过权重矩阵传播误差
  • 再乘以激活函数梯度

批量梯度累加 Δ ( l ) \Delta^{(l)} Δ(l)

单样本梯度:
∂ E ∂ Θ j k ( l ) = ∂ E ∂ z j ( l + 1 ) ⋅ ∂ z j ( l + 1 ) ∂ Θ j k ( l ) = δ j ( l + 1 ) a k ( l ) → δ ( l + 1 ) ( a ( l ) ) T \frac{\partial E}{\partial \Theta_{jk}^{(l)}} = \frac{\partial E}{\partial z_j^{(l+1)}} \cdot \frac{\partial z_j^{(l+1)}}{\partial \Theta_{jk}^{(l)}} = \delta_j^{(l+1)} a_k^{(l)} \\ \rightarrow \\ \mathbf{\delta^{(l+1)}(a^{(l)})^T} Θjk(l)E=zj(l+1)EΘjk(l)zj(l+1)=δj(l+1)ak(l)δ(l+1)(a(l))T

批量梯度累加:
Δ ( l ) = ∑ i = 1 m δ i ( l + 1 ) ( a i ( l ) ) T \Delta^{(l)}=\sum_{i=1}^m \delta_i^{(l+1)}(a_i^{(l)})^T Δ(l)=i=1mδi(l+1)(ai(l))T

总梯度(用于更新)

是批量梯度累加 Δ ( l ) \Delta^{(l)} Δ(l)的平均
∂ ∂ Θ ( l ) J ( Θ ) = 1 m Δ ( l ) \frac{\partial}{\partial \Theta^{(l)}}J(\Theta)= \frac{1}{m}\Delta^{(l)} Θ(l)J(Θ)=m1Δ(l)

前向传播(Forward Propagation)

每一层输入补 1(bias):
a ~ ( l ) = [ 1 a ( l ) ] \tilde a^{(l)}= \begin{bmatrix} 1\\ a^{(l)} \end{bmatrix} a~(l)=[1a(l)]

线性变换:
z ( l + 1 ) = Θ ( l ) a ~ ( l ) z^{(l+1)}=\Theta^{(l)}\tilde a^{(l)} z(l+1)=Θ(l)a~(l)

非线性激活:
a ( l + 1 ) = g ( z ( l + 1 ) ) a^{(l+1)}=g(z^{(l+1)}) a(l+1)=g(z(l+1))

反向传播(Backpropagation)

假设三层全连接网络,Sigmoid + BCE

输出层:
δ ( 3 ) = a ( 3 ) − y \delta^{(3)}=a^{(3)}-y δ(3)=a(3)y

隐藏层:
δ ( 2 ) = ( Θ ( 2 ) ) T δ ( 3 ) ⊙ g ′ ( z ( 2 ) ) \delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}\odot g'(z^{(2)}) δ(2)=(Θ(2))Tδ(3)g(z(2))

梯度下降更新

学习率 α \alpha α

Θ ( l ) ← Θ ( l ) − α 1 m Δ ( l ) \Theta^{(l)} \leftarrow \Theta^{(l)}-\alpha\frac{1}{m}\Delta^{(l)} Θ(l)Θ(l)αm1Δ(l)

总结(反向传播主线)

前向传播:
a → z → a a \rightarrow z \rightarrow a aza

反向传播:
δ ( L ) → δ ( L − 1 ) → ⋯ \delta^{(L)} \rightarrow \delta^{(L-1)} \rightarrow \cdots δ(L)δ(L1)

梯度构造:
δ ( l + 1 ) ( a ( l ) ) T \delta^{(l+1)}(a^{(l)})^T δ(l+1)(a(l))T

拓展 - 为什么要神经网络

如果用线性回归, 那么分界面就是一条直线
如果用广义线性, 那么多项式的项数会特别多, 导致数据集的数量需求也特别多

-> 线性模型的维度灾难(The curse of dimensionality)

当数据特征维度越多, 线性模型的代价越高 -> 发展其他模型 -> 神经网络

用神经网络解决逻辑异或XOR

神经网络实现交集∩:

  • 二式+三式: w 1 + w 2 + 2 w 0 < = − 20 w_1+w_2+2w_0<=-20 w1+w2+2w0<=20
    结合一式, 得到: w 0 w_0 w0的临界是 − 30 -30 30
  • 二式: w 1 = 20 w_1=20 w1=20
  • 三式: w 2 = 20 w_2=20 w2=20

在这里插入图片描述

神经网络实现并集∪:

  • 同理: w 0 = − 10 , w 1 = 20 , w 2 = 20 w_0=-10, w_1=20, w_2=20 w0=10,w1=20,w2=20

在这里插入图片描述

同理得到非的并集:

  • 同理: w 0 = 10 , w 1 = − 20 , w 2 = − 20 w_0=10, w_1=-20, w_2=-20 w0=10,w1=20,w2=20

在这里插入图片描述

综合上述结构:

在这里插入图片描述

拓展 - 数值差分

参数数量为 W W W

1.有限差分 finite differences
  • 定义:数值差分的一种,通过 “给参数 w j i w_{ji} wji 加一个小扰动 ε ε ε”,用函数值的变化量近似梯度,公式为:
    ∂ E n ∂ w j i ≈ E n ( w j i + ε ) − E n ( w j i ) ε = E n ( w j i + ε ) − E n ( w j i ) ε + O ( ε ) \begin{align} \frac{\partial E_n}{\partial w_{ji}} &\approx \frac{E_n(w_{ji}+\varepsilon) - E_n(w_{ji})}{\varepsilon} \\ &= \frac{E_n(w_{ji}+\varepsilon) - E_n(w_{ji})}{\varepsilon}+O(ε) \end{align} wjiEnεEn(wji+ε)En(wji)=εEn(wji+ε)En(wji)+O(ε)

  • 误差阶:近似误差是 O ( ε ) O(ε) O(ε)(即误差和 ε ε ε 同量级)

  • 计算复杂度:需要对每个参数 w 单独计算一次函数值,复杂度是 O ( W 2 ) O(W^2) O(W2)

要给每个参数单独加扰动,所以需要额外算 W 次损失
加上原始参数的 1 次,共 W+1 次计算损失

而每次计算损失的复杂度为 O ( W ) O(W) O(W)

-> 总计算复杂度: O ( W 2 ) O(W^2) O(W2)

2.中心差分 central differences
  • 定义:数值差分的一种,通过 “给参数 w j i w_{ji} wji 同时加、减小扰动 ε ε ε”,用函数值的变化量近似梯度,公式为:
    ∂ E n ∂ w j i ≈ E n ( w j i + ε ) − E n ( w j i − ε ) 2 ε = E n ( w j i + ε ) − E n ( w j i − ε ) 2 ε + O ( ε 2 ) \begin{align} \frac{\partial E_n}{\partial w_{ji}} &\approx \frac{E_n(w_{ji}+\varepsilon) - E_n(w_{ji}-\varepsilon)}{2\varepsilon} \\ &= \frac{E_n(w_{ji}+\varepsilon) - E_n(w_{ji}-\varepsilon)}{2\varepsilon}+O(ε^2) \end{align} wjiEn2εEn(wji+ε)En(wjiε)=2εEn(wji+ε)En(wjiε)+O(ε2)

  • 误差阶:近似误差是 O ( ε 2 ) O(ε^2) O(ε2)(误差是 ε ε ε 的平方量级,比有限差分更精确

  • 计算复杂度:同样需要对每个参数单独计算两次函数值,复杂度还是 O ( W 2 ) O(W^2) O(W2)

要给每个参数单独分别加两次扰动,共 2n 次损失计算损失

而每次计算损失的复杂度为 O ( W ) O(W) O(W)

-> 总计算复杂度: O ( W 2 ) O(W^2) O(W2)

BP算法

反向传播BP算法是基于“链式法则”的解析梯度计算方法,核心思路是“正向传播计算输出与误差,反向传播回传误差并求解各层参数梯度”

  • 正向传播
  • 反向传播
  • 梯度求解

优势:无需对参数施加扰动,直接通过数学推导得到梯度解析表达式,计算效率极高,复杂度仅为 O ( W ) O(W) O(W)

例题1

在这里插入图片描述

在这里插入图片描述

例题2

试给出使用数值差分方法计算神经网络损失函数的梯度的公式,并分析其计算复杂度

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐