INT301 Bio-computation 生物计算(神经网络)Pt.4 多层感知机(Multilayer Perceptron,MLP)

文章目录

  • [1.多层感知机(Multilayer Perceptron,MLP)](#1.多层感知机(Multilayer Perceptron,MLP))
    • [1.1 多层感知机的结构](#1.1 多层感知机的结构)
    • [1.2 多层感知机(MLP,Multilayer Perceptron)在表示能力(representational power)方面的特性](#1.2 多层感知机(MLP,Multilayer Perceptron)在表示能力(representational power)方面的特性)
    • [1.3 反向传播(Backpropagation)学习算法](#1.3 反向传播(Backpropagation)学习算法)
      • [1.3.1 反向传播](#1.3.1 反向传播)
      • [1.3.2 在线训练(On-line Training)或增量学习(Incremental Learning)](#1.3.2 在线训练(On-line Training)或增量学习(Incremental Learning))
      • [1.3.3 反向传播(Backpropagation)算法的推导过程](#1.3.3 反向传播(Backpropagation)算法的推导过程)
      • [1.3.4 批量学习(Batch Learning)](#1.3.4 批量学习(Batch Learning))
      • [1.3.5 反向传播算法的相关问题](#1.3.5 反向传播算法的相关问题)
        • [1.3.5.1 反向传播算法的训练样本的呈现顺序问题](#1.3.5.1 反向传播算法的训练样本的呈现顺序问题)
        • [1.3.5.2 反向传播算法的初始化问题](#1.3.5.2 反向传播算法的初始化问题)
        • [1.3.5.3 反向传播算法中隐藏层的问题](#1.3.5.3 反向传播算法中隐藏层的问题)
        • [1.3.5.4 反向传播算法的停止标准(Stopping Criteria)](#1.3.5.4 反向传播算法的停止标准(Stopping Criteria))
        • [1.3.5.5 反向传播算法的学习率问题](#1.3.5.5 反向传播算法的学习率问题)
        • [1.3.5.6 动量(Momentum)](#1.3.5.6 动量(Momentum))
        • [1.3.5.7 泛化(Generalization)和过拟合(Overfitting)](#1.3.5.7 泛化(Generalization)和过拟合(Overfitting))
        • [1.3.5.8 防止过拟合的技术](#1.3.5.8 防止过拟合的技术)
          • [1.3.5.8.1 权重衰减(Weight Decay)](#1.3.5.8.1 权重衰减(Weight Decay))
          • [1.3.5.8.2 交叉验证(Cross-validation)](#1.3.5.8.2 交叉验证(Cross-validation))
          • [1.3.5.8.3 K折交叉验证(K-fold cross validation)](#1.3.5.8.3 K折交叉验证(K-fold cross validation))
          • [1.3.5.8.4 留一法交叉验证(Leave-One-Out Cross-Validation,LOOCV)](#1.3.5.8.4 留一法交叉验证(Leave-One-Out Cross-Validation,LOOCV))
      • [1.3.6 多层感知机(MLP,Multilayer Perceptron)的局限性和能力](#1.3.6 多层感知机(MLP,Multilayer Perceptron)的局限性和能力)

1.多层感知机(Multilayer Perceptron,MLP)

MLP 是由多个感知机组成的层次结构,它克服了单层网络的局限性。

MLP 神经网络能够学习非线性函数映射,这使得 MLP 在处理复杂问题时更加灵活和强大。

非线性函数可以通过使用非线性激活函数的 MLP 来表示。激活函数(如 Sigmoid、ReLU 等)引入了非线性,使得网络能够学习和模拟复杂的函数关系。

即使有多个层级联的线性单元,如果这些单元都是线性的(即没有使用非线性激活函数),那么整个网络仍然只能产生线性映射。这意味着网络无法捕捉数据中的非线性关系。

MLP 的训练算法需要使用可微分的、连续的非线性激活函数。例如我们常用的Sigmoid 函数,其数学表达式为: o = σ ( s ) = 1 1 + e − s o = \sigma(s) = \frac{1}{1 + e^{-s}} o=σ(s)=1+e−s1,其中, s s s是加权输入和,计算公式为: s = ∑ i = 0 d w i x i s = \sum_{i=0}^{d} w_i x_i s=∑i=0dwixi,这里, d d d是权重的数量(包括偏置项), w i w_i wi是第 i i i个权重, x i x_i xi是第 i i i个输入特征。

另一种常用的可微分激活函数------双曲正切函数(Hyperbolic Tangent,tanh),其数学表达式为 o = tanh ⁡ ( s ) = e s − e − s e s + e − s o = \tanh(s) = \frac{e^s - e^{-s}}{e^s + e^{-s}} o=tanh(s)=es+e−ses−e−s

双曲正切函数的一个重要特性是其输出的均值为 0。这意味着当输入数据在正负值和正值之间均匀分布时,tanh 函数的输出也会在 -1 和 1 之间均匀分布,这有助于缓解梯度消失问题。

1.1 多层感知机的结构

下图展示了一个多层感知机的结构

这里的主要差异在于多了一个隐藏层,显著提高了模型的学习能力、表示能力和泛化能力,使其能够处理更复杂的任务。

一个两层神经网络的计算过程如下:
f ( x ) = σ ( ∑ j = 1 J w j k σ ( ∑ i = 1 I w i j x i + w o j ) + w o k ) f(x) = \sigma \left( \sum_{j=1}^{J} w_{jk} \sigma \left( \sum_{i=1}^{I} w_{ij} x_i + w_{oj} \right) + w_{ok} \right) f(x)=σ(∑j=1Jwjkσ(∑i=1Iwijxi+woj)+wok)

其中 σ ( ∑ i = 1 I w i j x i + w o j ) \sigma \left( \sum_{i=1}^{I} w_{ij} x_i + w_{oj} \right) σ(∑i=1Iwijxi+woj)是来自因此层的输出。
x x x是输入向量。
w i j w_{ij} wij是是连接输入层第 i i i个节点到隐藏层第 j j j个节点的权重。
w o j w_{oj} woj是隐藏层第 j j j个节点的偏置项。
σ σ σ是Sigmoid激活函数。
w j k w_{jk} wjk是连接隐藏层第 j j j个节点到输出层第 k k k个节点的权重。
w o k w_{ok} wok是输出层第 k k k个节点的偏置项。

隐藏层(hidden units)使多层网络能够通过从输入样本中提取越来越有意义的信息来学习复杂任务。隐藏层能够捕捉输入数据中的非线性关系和特征,从而提高网络的表达能力和学习能力。

MLP(多层感知机)具有高度连接的拓扑结构,因为每个输入都连接到第一个隐藏层的所有节点,每个隐藏层的单元都连接到下一层的所有节点,依此类推。这种全连接的结构使得网络能够学习输入数据的复杂模式。

输入信号(最初是输入样本)在神经网络中以层对层(layer-by-layer)的方式向前传播,这就是为什么它们通常被称为前馈多层网络(feedforward multilayer networks)。前馈意味着信息从输入层流向输出层,没有反馈连接(feedback connections)。

1.2 多层感知机(MLP,Multilayer Perceptron)在表示能力(representational power)方面的特性

MLP能够学习和表示不同类型的函数:

  1. 学习任意函数(learning arbitrary functions):
    理论上,两层神经网络(一个输入层、一个隐藏层和一个输出层)能够以任意精度学习任何函数。这是基于通用逼近定理(Universal Approximation Theorem),它表明具有足够数量隐藏单元的MLP可以逼近任何连续函数。
  2. 学习连续函数(learning continuous functions):
    对于任何有界连续函数,两层神经网络都可以以较小的误差学习该函数。这意味着,只要隐藏层的神经元数量足够,MLP就能近似这些函数,尽管所需的神经元数量可能取决于要近似的函数的复杂性。
  3. 学习布尔函数(learning Boolean functions):
    两层神经网络可以精确地学习任何布尔函数。布尔函数是离散的,表示逻辑运算(如与、或、非等)。然而,随着输入维度的增加,所需的隐藏单元数量会呈指数级增长。这意味着对于高维输入,可能需要大量的隐藏单元来精确表示布尔函数。

1.3 反向传播(Backpropagation)学习算法

目前流行的大型语言模型如GPT(Generative Pre-trained Transformer)系列就使用了反向传播(Backpropagation)算法进行训练。

反向传播是一种监督学习算法,用于训练多层神经网络,使其能够根据输入数据学习到正确的输出。

该算法包括两个主要过程:

  1. 前向传播(Forward Pass):
    在前向传播阶段,输入数据从输入层通过网络向前传播,经过每一层的加权求和与激活函数处理,直到达到输出层。
    每一层的输出会作为下一层的输入,这样逐层地计算,直到得到最终的输出结果。
  2. 反向传播(Backward Pass):
    在计算出输出层的结果之后,反向传播阶段开始。这个阶段会计算输出结果与期望值(真实标签)之间的误差。
    误差从输出层开始,通过网络反向传播,逐层计算每层每个权重对最终误差的贡献(即梯度)。
    利用这些梯度信息,按照梯度下降的规则更新网络中所有权重,目的是减少误差。

1.3.1 反向传播

在反向传播阶段,权重会根据误差校正规则进行调整。具体来说,就是将网络的实际输出与训练样本中给定的期望输出进行比较,计算误差,然后调整权重以使网络输出更接近期望值。

反向传播算法执行的是梯度下降(Gradient Descent)操作。这意味着算法会沿着误差梯度的反方向更新权重。梯度指向误差增加最快的方向,因此其反方向就是误差减少最快的方向。

通过同时调整所有权重,反向传播算法寻找误差最快速减少的方向。这是通过计算损失函数相对于所有权重的梯度(即偏导数),然后沿着这个梯度的反方向更新权重来实现的。

公式为 ∇ E ( w ) = [ ∂ E ∂ w 0 , ∂ E ∂ w 1 , ... , ∂ E ∂ w d ] \nabla E(w) = \left[ \frac{\partial E}{\partial w_0}, \frac{\partial E}{\partial w_1}, \ldots, \frac{\partial E}{\partial w_d} \right] ∇E(w)=[∂w0∂E,∂w1∂E,...,∂wd∂E],它表示损失函数 E E E对每个权重 w i w_i wi的偏导数组成的向量,称为梯度向量。这个向量指出了损失函数在参数空间中增长最快的方向。

反向传播算法通过梯度下降搜索来最小化代价函数 E,代价函数通常是期望输出和实际网络输出之间的均方误差(Mean Squared Error, MSE)。

在训练开始之前,网络的权重会被初始化为小的随机值。

训练数据不是一次性全部提供给网络,而是增量地(incrementally)逐个样本或逐批样本地呈现给网络。

在每次试验后,使用正确类别的边信息来调整权重,直到权重收敛并且代价函数降低到一个可接受的值。

具体步骤如下:

  1. 初始化(Initialization):
    样本集: { ( x e , y e ) } e = 1 N \{(x_e, y_e)\}_{e=1}^{N} {(xe,ye)}e=1N其中 x e x_e xe是输入特征, y e y_e ye是对应的输出标签。
    初始权重: w i w_i wi设置为小的随机值。
    学习率参数: η η η,控制每次更新的步长。
  2. 重复执行(Repeat):
    对于每个训练样本 ( x e , y e ) (x_e, y_e) (xe,ye):
    前向传播(Forward):
    计算网络的输出,使用 Sigmoid 激活函数: o j = σ ( s j ) = 1 1 + e − s j , s j = ∑ i = 0 d w i j o i o_j = \sigma(s_j) = \frac{1}{1 + e^{-s_j}}, s_j = \sum_{i=0}^{d} w_{ij} o_i oj=σ(sj)=1+e−sj1,sj=∑i=0dwijoi,其中 o j o_j oj是隐藏层的输出, s j s_j sj是隐藏层的加权输入和, o i o_i oi是输入层的输出(对于输入层, o i = x i o_i=x_i oi=xi)。
    对于输出层,计算输出 o k o_k ok: o k = σ ( s k ) = 1 1 + e − s k , s k = ∑ i = 0 d w j k o j o_k = \sigma(s_k) = \frac{1}{1 + e^{-s_k}}, s_k = \sum_{i=0}^{d} w_{jk} o_j ok=σ(sk)=1+e−sk1,sk=∑i=0dwjkoj,其中 o k o_k ok是输出层的输出, s k s_k sk是输出层的加权输入和, o j o_j oj是隐藏层的输出。
    反向传播(Backward):
    计算输出层节点 k k k的效益 β k β_k βk,效益 β k β_k βk是衡量输出层节点 k k k对最终误差的贡献。 公式为: β k = o k ( 1 − o k ) [ y k − o k ] \beta_k = o_k (1 - o_k)[y_k - o_k] βk=ok(1−ok)[yk−ok],这里, o k o_k ok是输出层节点 k k k的输出, y k y_k yk是期望输出, o k o_k ok是实际输出。
    计算输出层权重 j → k j→k j→k的变化量,我们根据效益 β k β_k βk计算权重 w j k w_{jk} wjk和偏置 w 0 k w_{0k} w0k的变化量: Δ w j k = η β k o j \Delta w_{jk} = \eta \beta_k o_j Δwjk=ηβkoj
    Δ w 0 k = η β k \Delta w_{0k} = \eta \beta_k Δw0k=ηβk
    其中, η η η是学习率, o j o_j oj是隐藏层节点 j j j的输出。
    计算隐藏层节点 j j j的效益 β j β_j βj效益 β j β_j βj是衡量输出层节点 j j j对最终误差的贡献。 公式为: β j = o j ( 1 − o j ) [ ∑ k β k w j k ] \beta_j = o_j (1 - o_j) \left[ \sum_k \beta_k w_{jk} \right] βj=oj(1−oj)[∑kβkwjk]
    计算隐藏层权重 i → j i→j i→j的变化量,我们根据效益 β j β_j βj计算权重 w i j w_{ij} wij和偏置 w 0 j w_{0j} w0j的变化量: Δ w i j = η β j o i \Delta w_{ij} = \eta \beta_j o_i Δwij=ηβjoi
    Δ w 0 j = η β j \Delta w_{0j} = \eta \beta_j Δw0j=ηβj
    其中, η η η是学习率, o i o_i oi是输入层节点 i i i的输出。
    更新权重:
    然后,根据计算出的变化量更新权重:
    w = w + Δ w w = w + \Delta w w=w+Δw
    重复上述过程,直到满足某个终止条件(如达到最大迭代次数、误差降低到可接受的水平或权重更新量非常小)。

1.3.2 在线训练(On-line Training)或增量学习(Incremental Learning)

类似地,我们每次只使用一个训练样本来计算梯度并更新权重。

步骤如下:

  1. 初始化(Initialization):
    样本集: { ( x e , y e ) } e = 1 N \{(x_e, y_e)\}_{e=1}^{N} {(xe,ye)}e=1N其中 x e x_e xe是输入特征, y e y_e ye是对应的输出标签。
    初始权重: w i w_i wi设置为小的随机值。
    学习率参数: η η η,控制每次更新的步长。
  2. 重复执行(Repeat):
    对于每个训练样本 ( x e , y e ) (x_e, y_e) (xe,ye):
    前向传播(Forward):
    将选定的训练样本前向传播通过神经网络,并使用 Sigmoid 函数计算输出。
    反向传播(Backward):
    计算误差,并将误差反向传播回网络,以确定每个权重对最终误差的贡献(即梯度)。
    更新权重:
    然后,根据计算出的变化量更新权重:
    w = w + Δ w w = w + \Delta w w=w+Δw
    重复上述过程,直到满足某个终止条件(如达到最大迭代次数、误差降低到可接受的水平或权重更新量非常小)。

1.3.3 反向传播(Backpropagation)算法的推导过程

反向传播算法是一种广义的梯度下降规则,用于更新神经网络中的权重。对于每个训练样本,权重更新规则为: w = w + Δ w w = w + \Delta w w=w+Δw

其中, Δ w Δw Δw是权重的变化量,计算公式为: Δ w = − η ∂ E e ∂ w \Delta w = -\eta \frac{\partial E_e}{\partial w} Δw=−η∂w∂Ee,损失函数 E e E_e Ee通常定义为输出误差的平方和: E e = 1 2 ∑ k ( y k − o k ) 2 E_e = \frac{1}{2} \sum_k (y_k - o_k)^2 Ee=21∑k(yk−ok)2

实现广义梯度下降规则需要计算导数 ∂ E e ∂ w \frac{\partial E_e}{\partial w} ∂w∂Ee,这可以通过链式法则(Chain Rule)来完成: ∂ E e ∂ w = ∂ E e ∂ s ⋅ ∂ s ∂ w \frac{\partial E_e}{\partial w} = \frac{\partial E_e}{\partial s} \cdot \frac{\partial s}{\partial w} ∂w∂Ee=∂s∂Ee⋅∂w∂s

第一部分 ∂ E e ∂ s \frac{\partial E_e}{\partial s} ∂s∂Ee反映了网络加权输入 s s s变化对误差的影响。

第二部分 ∂ s ∂ w \frac{\partial s}{\partial w} ∂w∂s反映了特定权重 w w w变化对网络加权输入 s s s的影响。

因为加权输入 s s s是所有输入特征 o i o_i oi与对应权重 w i w_i wi乘积的和,所以 ∂ s ∂ w = ∂ ∂ w ( ∑ l w l o l ) = o \frac{\partial s}{\partial w} = \frac{\partial}{\partial w} \left( \sum_{l} w_{l} o_{l} \right) = o ∂w∂s=∂w∂(∑lwlol)=o

因此,损失函数 E e E_e Ee相对于权重 w w w的偏导数可以简化为: ∂ E e ∂ w = ∂ E e ∂ s ⋅ o \frac{\partial E_e}{\partial w} = \frac{\partial E_e}{\partial s} \cdot o ∂w∂Ee=∂s∂Ee⋅o

所以对于连接隐藏层节点 j j j到输出层节点 k k k的权重 w j k w_{jk} wjk,损失函数 E e E_e Ee对 w j k w_{ jk} wjk的偏导数可以通过链式法则计算: ∂ E e ∂ w j k = ∂ E e ∂ s k ⋅ o j \frac{\partial E_e}{\partial w_{jk}} = \frac{\partial E_e}{\partial s_k} \cdot o_j ∂wjk∂Ee=∂sk∂Ee⋅oj

根据链式法则,我们可以进一步分解这个偏导数: ∂ E e ∂ s k = ∂ E e ∂ o k ⋅ ∂ o k ∂ s k \frac{\partial E_e}{\partial s_k} = \frac{\partial E_e}{\partial o_k} \cdot \frac{\partial o_k}{\partial s_k} ∂sk∂Ee=∂ok∂Ee⋅∂sk∂ok

对于均方误差损失函数, ∂ E e ∂ o k \frac{\partial E_e}{\partial o_k} ∂ok∂Ee可以表示为:
∂ E e ∂ o k = ∂ ( 1 2 ∑ k ( y l − o l ) 2 ) ∂ o k = ∂ ( 1 2 ( y k − o k ) 2 ) ∂ o k \frac{\partial E_e}{\partial o_k} = \frac{\partial \left( \frac{1}{2} \sum_k (y_l - o_l)^2 \right)}{\partial o_k} = \frac{\partial \left( \frac{1}{2} (y_k - o_k)^2 \right)}{\partial o_k} ∂ok∂Ee=∂ok∂(21∑k(yl−ol)2)=∂ok∂(21(yk−ok)2)

根据链式法则,我们有:
= 1 2 ⋅ 2 ⋅ ( y k − o k ) ∂ ( y k − o k ) ∂ o k = \frac{1}{2} \cdot 2 \cdot (y_k - o_k) \frac{\partial (y_k - o_k)}{\partial o_k} =21⋅2⋅(yk−ok)∂ok∂(yk−ok)

由于 y k y_k yk是常数,其导数为 0
= − ( y k − o k ) = -(y_k - o_k) =−(yk−ok)

对于 Sigmoid 激活函数, ∂ o k ∂ s k \frac{\partial o_k}{\partial s_k} ∂sk∂ok可以表示为: ∂ o k ∂ s k = o k ( 1 − o k ) \frac{\partial o_k}{\partial s_k} = o_k (1 - o_k) ∂sk∂ok=ok(1−ok)

因此,我们可以得到 ∂ E e ∂ s k = − ( y k − o k ) o k ( 1 − o k ) \frac{\partial E_e}{\partial s_k} = -(y_k - o_k) o_k (1 - o_k) ∂sk∂Ee=−(yk−ok)ok(1−ok)
∂ E e ∂ w j k = ∂ E e ∂ s k ⋅ o j \frac{\partial E_e}{\partial w_{jk}} = \frac{\partial E_e}{\partial s_k} \cdot o_j ∂wjk∂Ee=∂sk∂Ee⋅oj

使用上述偏导数,我们可以推导出权重更新规则:
Δ w j k = − η ∂ E e ∂ w j k = η β k o j \Delta w_{jk} = -\eta \frac{\partial E_e}{\partial w_{jk}} = \eta \beta_k o_j Δwjk=−η∂wjk∂Ee=ηβkoj,其中 β k = ( y k − o k ) o k ( 1 − o k ) \beta_k=(y_k - o_k) o_k (1 - o_k) βk=(yk−ok)ok(1−ok)

最后,将 β k β_k βk代入梯度下降规则中,得到最终的权重更新公式:
Δ w i = Δ w i + η ( y e − o e ) σ ( s ) ( 1 − σ ( s ) ) x i e \Delta w_i = \Delta w_i + \eta (y_e - o_e) \sigma(s)(1 - \sigma(s)) x_{ie} Δwi=Δwi+η(ye−oe)σ(s)(1−σ(s))xie

类似地,从输入层到隐藏层的权重 i → j i→j i→j,损失函数 E e E_e Ee对 w i j w_{ ij} wij的偏导数可以通过链式法则计算: ∂ E e ∂ w i j = ∂ E e ∂ s j ⋅ o i \frac{\partial E_e}{\partial w_{ij}} = \frac{\partial E_e}{\partial s_j} \cdot o_i ∂wij∂Ee=∂sj∂Ee⋅oi

在这种情况下,误差不仅依赖于单个输出节点的误差,还依赖于所有输出单元的误差。具体来说,损失函数 E e E_e Ee对 s j s_j sj的偏导数可以表示为: ∂ E e ∂ s j = ∑ k ∂ E e ∂ s k ⋅ ∂ s k ∂ s j \frac{\partial E_e}{\partial s_j} = \sum_k \frac{\partial E_e}{\partial s_k} \cdot \frac{\partial s_k}{\partial s_j} ∂sj∂Ee=∑k∂sk∂Ee⋅∂sj∂sk

因为 ∂ E e ∂ s k = − ( y k − o k ) o k ( 1 − o k ) \frac{\partial E_e}{\partial s_k} = -(y_k - o_k) o_k (1 - o_k) ∂sk∂Ee=−(yk−ok)ok(1−ok), β k = ( y k − o k ) o k ( 1 − o k ) \beta_k=(y_k - o_k) o_k (1 - o_k) βk=(yk−ok)ok(1−ok)

所以 ∂ E e ∂ w i j = ∑ k ( − β k ) ⋅ ∂ s k ∂ s j \frac{\partial E_e}{\partial w_{ij}} = \sum_k (-\beta_k) \cdot \frac{\partial s_k}{\partial s_j} ∂wij∂Ee=∑k(−βk)⋅∂sj∂sk

根据链式法则,我们可以得到:
= ∑ k ( − β k ) ⋅ ∂ s k ∂ o j ⋅ ∂ o j ∂ s j =\sum_k (-\beta_k) \cdot \frac{\partial s_k}{\partial o_j}\cdot \frac{\partial o_j}{\partial s_j} =∑k(−βk)⋅∂oj∂sk⋅∂sj∂oj

因为 o k = σ ( s k ) = 1 1 + e − s k , s k = ∑ i = 0 d w j k o j o_k = \sigma(s_k) = \frac{1}{1 + e^{-s_k}}, s_k = \sum_{i=0}^{d} w_{jk} o_j ok=σ(sk)=1+e−sk1,sk=∑i=0dwjkoj, o j = σ ( s j ) = 1 1 + e − s j , s j = ∑ i = 0 d w i j o i o_j = \sigma(s_j) = \frac{1}{1 + e^{-s_j}}, s_j = \sum_{i=0}^{d} w_{ij} o_i oj=σ(sj)=1+e−sj1,sj=∑i=0dwijoi

所以, = ∑ k ( − β k ) ⋅ w j k ⋅ ∂ o j ∂ s j = = ∑ k ( − β k ) ⋅ w j k ⋅ o j ( 1 − o j ) =\sum_k (-\beta_k) \cdot w_{jk}\cdot \frac{\partial o_j}{\partial s_j}==\sum_k (-\beta_k) \cdot w_{jk}\cdot o_j(1-o_j) =∑k(−βk)⋅wjk⋅∂sj∂oj==∑k(−βk)⋅wjk⋅oj(1−oj)

对于隐藏层的权重更新:
Δ w i j = η β j o i \Delta w_{ij} = \eta \beta_j o_i Δwij=ηβjoi
Δ w 0 j = η β j \Delta w_{0j} = \eta \beta_j Δw0j=ηβj

误差项 β j β_j βj表示隐藏层节点 j j j对损失函数 E e E_e Ee的贡献,计算公式为: β j = − ∂ E e ∂ s j = o j ( 1 − o j ) [ ∑ k β k w j k ] \beta_j = -\frac{\partial E_e}{\partial s_j} = o_j (1 - o_j) \left[ \sum_k \beta_k w_{jk} \right] βj=−∂sj∂Ee=oj(1−oj)[∑kβkwjk],这里, s j s_j sj是隐藏层节点 j j j的加权输入, ∑ k β k w j k ∑_kβ_kw {jk} ∑kβkwjk表示所有输出层节点的误差项 β k β_k βk通过权重 w j k w{jk} wjk传播到隐藏层节点 j j j的总和。

最后对于整个训练集的总误差 E t o t a l E_{total} Etotal,可以通过对每个样本的误差 E e E_e Ee对权重 w i j w_{ij} wij的偏导数求和来计算: ∂ E t o t a l ∂ w i j = ∑ e ∂ E e ∂ w i j \frac{\partial E_{total}}{\partial w_{ij}} = \sum_e \frac{\partial E_e}{\partial w_{ij}} ∂wij∂Etotal=∑e∂wij∂Ee

1.3.4 批量学习(Batch Learning)

从数学角度来看,误差的导数应该在每个时代(epoch)之后计算。一个时代指的是处理完整个训练集一次。

这种方法意味着在处理完整个训练集之后才更新权重,即在每个时代结束后进行一次权重更新。

尽管按时代更新在理论上可能有更强的动机,但针对特定样本的更新可能会产生更好的结果,并且更常用。

因此等待时代的更新就是我们说的批量学习(Batch Learning)。

我们这里出示一遍简化的步骤如下:

  1. 初始化(Initialization):
    样本集: { ( x e , y e ) } e = 1 N \{(x_e, y_e)\}_{e=1}^{N} {(xe,ye)}e=1N其中 x e x_e xe是输入特征, y e y_e ye是对应的输出标签。
    初始权重: w i w_i wi设置为小的随机值。
    学习率参数: η η η,控制每次更新的步长。
  2. 重复执行(Repeat):
    对于每个训练样本 ( x e , y e ) (x_e, y_e) (xe,ye):
    前向传播(Forward):
    将选定的训练样本前向传播通过神经网络,并使用 Sigmoid 函数计算输出。
    反向传播(Backward):
    计算误差,并将误差反向传播回网络,以确定每个权重对最终误差的贡献(即梯度)。
    更新权重:
    在处理完所有样本后,根据计算出的梯度更新权重:
    w = w + Δ w w = w + \Delta w w=w+Δw
    重复上述过程,直到满足某个终止条件(如达到最大迭代次数、误差降低到可接受的水平或权重更新量非常小)。

1.3.5 反向传播算法的相关问题

1.3.5.1 反向传播算法的训练样本的呈现顺序问题

在训练过程中,可以选择按顺序或随机顺序呈现训练样本给模型。

时代是训练的基本单位,通常用来衡量训练的长度。

一个时代指的是遍历整个训练集一次。

在处理特定样本后进行权重更新时,可以选择按相同顺序或不同随机顺序呈现样本。

随机呈现通常产生更好的结果:

随机呈现训练样本通常会产生更好的训练结果。

这是因为随机化有助于模型泛化,减少过拟合(overfitting)的风险。

顺序呈现可能导致模型对训练数据的特定顺序产生依赖,从而影响模型在未见数据上的泛化能力。

1.3.5.2 反向传播算法的初始化问题

随机初始状态(Random initial state):

与许多其他学习系统不同,神经网络在开始训练时处于一个随机状态。这意味着网络的权重被初始化为一组随机数,这些数通常在 -0.5 到 0.5 的范围内(输入数据通常被归一化到 0 到 1 之间的数值)。

这导致了第二点结果的可变性(Variability of results):

即使在相同的学习条件下,随机初始化的权重也可能导致每次训练会话的结果有所不同。这是因为权重的随机性引入了训练过程中的随机性,使得即使是相同的数据和学习率,不同的初始化可能导致模型参数收敛到不同的局部最小值。

1.3.5.3 反向传播算法中隐藏层的问题

虽然指定多个隐藏层可能更方便,但额外的层并不会增加模型的表示能力(representational power)。

双层隐藏层网络(即两个隐藏层)通常比单隐藏层网络更强大,但单隐藏层网络对于许多实际遇到的任务已经足够准确。

单隐藏层网络一般训练速度更快,因为它们需要的计算资源和时间较少。

一种启发式(heuristic)建议从具有 n n n个隐藏神经元的单个隐藏层开始,其中 n = ( i n p u t s + o u t p u t n e u r o n s ) / 2 n=(inputs+output_neurons)/2 n=(inputs+outputneurons)/2。这是一个经验公式,用于估计隐藏层中神经元的合理数量。

1.3.5.4 反向传播算法的停止标准(Stopping Criteria)

停止标准在每个时代(epoch)结束时检查。一个时代指的是完整遍历一次训练集。

如果一个时代的结束时误差(平均绝对误差或平均平方误差)低于某个阈值,训练将停止。

所有训练样本都被前向传播,计算平均(绝对或平方)误差。

阈值通常是经验性确定的,例如 0.01。

如果达到最大设定的时代数,训练也会停止。

使用一个验证集来决定是否提前停止训练(稍后解释)。

神经网络(NN)通常需要数百或数千个时代才能收敛。

使用验证集进行早期停止(Early Stopping)。早期停止是一种正则化技术,用于防止模型过拟合(overfitting)。过拟合是指模型在训练数据上表现很好,但在新数据上表现不佳。为了避免这种情况,可以使用一部分数据作为验证集,不参与训练过程。

1.3.5.5 反向传播算法的学习率问题

尽管反向传播算法能够很好地拟合训练数据,但在预测独立测试数据上的性能可能会遇到困难和陷阱。

在应用梯度下降方法时,有许多选择需要做出,这些选择中的关键变化是学习率和局部最小值的问题。

学习率的选择对于找到误差距离的真正全局最小值至关重要:

如果学习率设置得过小,训练过程会非常缓慢,因为权重更新的步长太小,导致模型学习速度慢。

如果学习率设置得过大,虽然训练过程会快很多,但可能会导致模型在不同的次优解之间震荡,无法收敛到一个好的解。

可以通过实验和在固定数量的训练时代(epochs)后对结果进行抽样来判断学习率是否合适。

学习率的典型值通常在0到1之间的数字,例如: 0.05 < η < 0.75 0.05<η<0.75 0.05<η<0.75。

理想情况下,我们希望使用最大的学习率,同时仍然能够收敛到最小解。

1.3.5.6 动量(Momentum)

动量是一种优化技术,用于加速梯度下降算法的收敛,并帮助算法避免陷入局部最小值。

动量的主要目的是稳定权重的变化。它通过结合梯度下降项和前一次权重变化的一部分来实现这一点。
Δ w ( t ) = − η ∂ E e ∂ w ( t ) + α Δ w ( t − 1 ) \Delta w(t) = -\eta \frac{\partial E_e}{\partial w(t)} + \alpha \Delta w(t-1) Δw(t)=−η∂w(t)∂Ee+αΔw(t−1)

其中, Δ w ( t ) Δw(t) Δw(t)是当前权重变化量, η η η是学习率, ∂ E e ∂ w ( t ) \frac{\partial E_e}{\partial w(t)} ∂w(t)∂Ee是损失函数对权重的偏导数(梯度), α α α是动量系数,用于控制前一次权重变化在当前更新中的影响, Δ w ( t − 1 ) Δw(t−1) Δw(t−1)是前一次的权重变化量。

这种方法给系统带来了一定的惯性,因为权重向量倾向于沿着相同方向继续移动,除非梯度项与之相反。

这意味着,如果权重更新在某个方向上是有益的,动量会帮助权重继续在该方向上移动更远,从而加速收敛。

同时,动量还可以减少梯度下降过程中的震荡,使得训练过程更加平滑。

动量项 α α α控制了之前权重变化在当前权重更新中的影响。

如果 α = 0 α=0 α=0,权重更新完全由梯度下降决定,这就是普通的反向传播。

如果 α = 1 α=1 α=1,梯度下降被完全忽略,权重更新仅基于之前的动量,这可能导致模型无法有效学习。

通常, α α α的值在 0.6 到 0.9 之间。这个范围内的值可以在保持梯度下降的影响的同时,利用动量加速收敛。

权重更新公式为: Δ w ( t ) = − η ∂ E e ∂ w ( t ) + α Δ w ( t − 1 ) \Delta w(t) = -\eta \frac{\partial E_e}{\partial w(t)} + \alpha \Delta w(t-1) Δw(t)=−η∂w(t)∂Ee+αΔw(t−1),这里 η = 1 − α \eta=1-α η=1−α

1.3.5.7 泛化(Generalization)和过拟合(Overfitting)

监督学习:使用有限数量的适当行为的样本 { ( p i , t i ) } i = 1 n \{(p_i, t_i)\}_{i=1}^{n} {(pi,ti)}i=1n进行训练,其中 p i p_i pi是输入, t i t_i ti是对应的输出标签。

基于这些样本,网络应该能够将其学到的知识泛化到整个样本总体上。泛化是指模型对未见过的新数据的预测能力。

过拟合:当训练集上的误差非常小,但当新数据呈现给网络时,误差却很高。

这意味着网络已经记住了训练样本,但没有学到如何泛化到新情况。换句话说,模型在训练数据上表现良好,但在新数据上表现不佳。

所以过拟合意味着模型的泛化能力差。

所以过拟合什么时候会出现呢?

当训练样本包含噪声时,模型可能会学习到这些噪声,而不仅仅是数据的一般模式。

这样就是对于含有噪声的数据表现良好,没有过度学习到这些噪声。

这里就是过拟合的情况,模型在训练数据上表现非常好,但在测试数据上表现不佳,因为它学习到了噪声而不是数据的一般模式。

过拟合的一个常见原因是模型的自由参数(即模型中的权重和偏置项)数量超过了训练样本的数量。这意味着模型可能过于复杂,能够记住训练数据中的每一个样本,而不是学习到数据的一般模式。

例如函数 f ( x ) = 1 + sin ⁡ ( 6 π 4 ⋅ x ) f(x) = 1 + \sin\left(\frac{6\pi}{4} \cdot x\right) f(x)=1+sin(46π⋅x)被采样以创建11个训练样本。

这里模型可能较为简单,能够很好地拟合训练数据,没有明显的过拟合现象。

这里模型可能过于复杂,不仅拟合了训练数据的一般趋势,还拟合了数据中的噪声和异常值,导致过拟合。

为了预防过拟合,我们应该考虑:

  1. 应该使用一个大小刚好能够提供充分拟合的网络。
  2. 当一个较小的网络就能工作时,不要使用更大的网络。这是因为更大的网络可能会导致更多的自由参数,从而增加过拟合的风险。
  3. 网络不应该拥有比训练样本更多的自由参数。如果自由参数的数量超过了训练样本的数量,网络可能会记住训练数据中的噪声,而不是学习到数据的一般模式。
  4. 然而,事先很难知道对于特定应用来说网络应该有多大。这通常需要通过实验和经验来确定。

下图展示了一个过拟合模型(红色线)和一个"真实"模型(黄色线)。

过拟合模型过于复杂,以至于它不仅捕捉到了数据的一般趋势,还捕捉到了噪声和异常值,导致在新数据上表现不佳。

下图展示了训练误差和验证误差随训练周期(cycles)的变化。

红色线代表训练误差,黄色线代表验证误差(holdout)。

随着训练的进行,训练误差持续下降,但验证误差在某个点后开始上升,表明模型开始过拟合。

1.3.5.8 防止过拟合的技术

防止过拟合的方法有:

  1. 早停(Early Stopping):在验证误差开始上升时停止训练。
  2. 网络剪枝(Network Pruning):减少网络的复杂性,例如通过剪枝技术移除不重要的神经元或连接。
  3. 正则化技术(Regularization Techniques):添加正则化项到损失函数中,限制模型复杂性。
1.3.5.8.1 权重衰减(Weight Decay)

权重衰减是一种正则化技术,它通过在每次迭代过程中减小权重值来防止模型过拟合。权重衰减的主要动机是保持权重值较小,从而减少模型的复杂性和过拟合风险。

权重衰减通过在损失函数中添加一个惩罚项来实现,这个惩罚项对大权重进行惩罚,以减少模型的方差(variance)。

权重衰减的方程通常表示为: w = w − η ⋅ λ ⋅ w w=w−η⋅λ⋅w w=w−η⋅λ⋅w,其中 w w w是当前权重, η η η是学习率, λ λ λ是衰减系数,用于控制权重衰减的幅度。

权重衰减通过在损失函数中添加一个惩罚项,使得权重收敛到比没有衰减时更小的绝对值。这种技术有助于减少过拟合,因为它限制了模型的复杂性。

大权重可能以两种方式损害泛化能力:

导致隐藏单元输出过于粗糙:

过大的权重可能导致隐藏单元的输出函数过于粗糙,可能存在近似不连续点(near discontinuities)。这是因为权重过大可能放大了输入的微小变化,导致输出函数的梯度在某些区域接近于零,从而影响学习过程。

输出单元产生极端输出:

过大的权重可能导致输出单元产生极端的输出值,远远超出数据的范围。如果激活函数的输出范围与数据的范围不一致,这可能导致模型输出不合理的预测。

大权重的主要风险是非线性节点的输出可能处于传递函数的平坦区域,即梯度为零的区域。在这种情况下,学习过程可能会不可逆地停止,因为梯度为零意味着权重更新停滞不前。

1.3.5.8.2 交叉验证(Cross-validation)

除了训练数据集之外,还保留一部分数据作为验证数据集。

在训练过程中,算法监控验证数据集上的误差,以评估模型在未见过的数据上的表现。

确定权重更新迭代的次数应基于验证集上的最低误差。这意味着,当验证集上的误差开始增加时,应停止训练,因为模型可能开始过拟合。

保留两份权重副本:一份用于训练,另一份用于记录到目前为止在验证集上表现最好的权重。

一旦验证集上的误差高于存储的权重对应的误差,停止训练,并返回存储的权重。

1.3.5.8.3 K折交叉验证(K-fold cross validation)

当数据集较小时,可能没有足够的数据来提供一个有效的验证集。这意味着模型可能无法得到足够的评估,以确保其在新数据上的表现。

对于小数据集,过拟合问题尤其严重,因为模型可能会过度拟合训练数据中的噪声和细节,而不是学习数据的一般模式。

为了解决上述问题,可以使用K折交叉验证方法:

  1. 每次确定最佳迭代次数:
    每次迭代时,确定导致在相应的测试分区(test partition)上表现最佳的迭代次数(epochs)。
  2. 计算平均迭代次数(ep: ep mean):
    计算所有测试分区上表现最佳的迭代次数的平均值(ep: ep mean)。
  3. 最终运行:
    使用计算出的平均迭代次数(ep mean)在所有样本上训练网络。

K折交叉验证的详细过程如下:

  1. 随机划分:
    原始样本集被随机划分为K个子样本(subsamples)。
  2. 留出一个子样本作为验证集:
    在K个子样本中,选择一个作为验证集(validation set),用于测试模型。
    剩下的K-1个子样本用作训练集(training set),用于训练模型。
  3. 重复K次:
    交叉验证过程重复K次(即K个folds),每次选择不同的子样本作为验证集。
    每个子样本都恰好被用作一次验证集。
  4. 评估模型性能:
    在每次迭代中,模型在验证集上的性能被评估。
    通过K次迭代,可以获取模型在不同数据子集上的性能表现。

如图所示。

每个实验中,原始样本集被划分为几个部分,其中一部分被用作验证集(灰色区域),其余部分用作训练集(白色区域)。

每个子样本都恰好被用作一次验证集,确保每个样本都参与了模型的训练和验证过程。

1.3.5.8.4 留一法交叉验证(Leave-One-Out Cross-Validation,LOOCV)

留一法交叉验证是一种特殊的 K 折交叉验证方法,其中 K 等于原始样本中的观测值数量。(例如数据量是400,那么400折交叉验证就是留一法交叉验证)

在每次迭代中,从原始样本中选择一个观测值作为验证集(validation set),其余的观测值用作训练集(training set)。

这个过程重复进行,使得样本中的每个观测值都恰好被用作一次验证集。

如图所示。

在每个实验中,一个样本被用作验证集(灰色区域),其余样本用作训练集(白色区域)。

每个样本都恰好被用作一次验证集,确保所有样本都被用于模型的训练和验证。

1.3.6 多层感知机(MLP,Multilayer Perceptron)的局限性和能力

经过反向传播训练的MLP能够执行函数逼近和模式分类任务。

理论上,它们可以执行任何线性和非线性映射。

它们能够很好地逼近任何合理的函数。

它们克服了感知机的局限性。

但是在实际表现中,MLP可能并不总是能找到解决方案,可能会陷入局部最小值(local minima)。

模型的性能对起始条件(权重的初始化)非常敏感。这意味着不同的权重初始化可能导致不同的训练结果,甚至可能导致模型无法收敛到最优解。

因此在实际使用中需要考虑:

  1. 隐藏层和神经元数量的敏感性:
    神经元过少:可能导致欠拟合(underfitting),模型无法学习到所需的复杂模式。
    神经元过多:可能导致过拟合(overfitting),模型学习速度变慢。
  2. 隐藏层和神经元数量的决定:
    隐藏层和神经元的数量需要由设计者决定,这通常基于经验和实验。
    需要根据具体问题和数据集的特性来选择合适的网络结构。
  3. 学习率的敏感性:
    学习率过小:学习过程缓慢,可能需要更多的迭代次数。
    学习率过大:可能导致训练过程不稳定,性能不佳。
  4. 适当的选择依赖于数据的性质:
    正确的网络结构和参数选择依赖于数据集的性质。
    需要通过试验和错误来找到最佳的配置。
  5. 成功的应用需要时间和经验:
    神经网络的成功应用需要时间和经验的积累。
    参考在类似问题中表现良好的选择。
相关推荐
大千AI助手5 小时前
神经网络中的随机高斯初始化技术
人工智能·深度学习·神经网络·高斯分布·正态分布·参数初始化·随机高斯初始化
CoovallyAIHub5 小时前
ICCV 2025 最佳论文出炉:CMU 团队用「AI 积木大师」BrickGPT 摘得桂冠!
深度学习·算法·计算机视觉
hans汉斯5 小时前
【计算机科学与应用】基于多光谱成像与边缘计算的物流安全风险预警模式及系统实现
大数据·数据库·人工智能·设计模式·机器人·边缘计算·论文笔记
aneasystone本尊5 小时前
深入 Dify 的应用运行器之知识库检索(续)
人工智能
许泽宇的技术分享5 小时前
Windows MCP.Net:解锁AI助手的Windows桌面自动化潜能
人工智能·windows·.net·mcp
从后端到QT5 小时前
大语言模型本地部署之转录文本总结
人工智能·语言模型·自然语言处理
AI新兵5 小时前
AI大事记13:GPT 与 BERT 的范式之争(上)
人工智能·gpt·bert
文火冰糖的硅基工坊5 小时前
[人工智能-大模型-43]:模型层技术 - 强化学学习:学习的目标、收敛条件、评估依据、应用到的模型、应用场景 - 通俗易懂。
人工智能·学习
Fibocom广和通6 小时前
禾赛科技与广和通战略合作,联合推出机器人解决方案加速具身智能商业化落地
人工智能