机器学习 - 神经网络
一、机器学习与神经网络概述
1. 机器学习核心目标
机器学习的核心目标是通过数据学习一个函数 f(x),完成从输入到输出的映射。主要分为:
- 回归 (Regression): 函数的输出是一个数值。
- 分类 (Classification): 函数的输出是一个类别。
- 生成 (Generation): 函数的输出是一个数据(如图像、文本)。
2. 神经网络 (Neural Networks)
- 起源: 尝试模拟生物大脑的算法。
- 历史: 80年代和90年代初广泛使用,90年代末期热度有所下降,近年来凭借其卓越性能在许多应用中成为最先进的技术并再次复苏。
- 类比人脑: 人脑神经网络是由大量具有适应性的简单同构单元(神经元)组成的广泛并行互连网络,能够模拟生物神经系统对真实世界的交互反应。
二、神经元模型
1. 生物神经元结构
- 树突 (Dendrites): 多个,主要用来接受传入信息。
- 轴突 (Axon): 一条,尾端有许多轴突末梢。
- 突触 (Synapse): 轴突末梢与其他神经元的树突产生连接,传递信号。
- 信息传递: 当神经元接收的信号累积到一定阈值时,会释放神经递质,通过突触刺激下一个神经元。
2. MP神经元模型 (McCulloch-Pitts Neuron Model, 1943)
这是最早的抽象神经元模型,类比生物神经元结构:
- 输入 (Inputs): 类比树突,接收信号。
- 计算 (Computation): 类比细胞核,处理信息。
- 输出 (Output): 类比轴突,传递信号。
一个典型的MP神经元模型包含:
- N 个输入:a1,a2,…,aN
- 对应的权值 (Weights):w1,w2,…,wN
- 一个求和单元:计算输入的加权和 ∑i=1Nwiai
- 一个非线性激活函数 (Activation Function) g(⋅)
- 一个输出:z
graph LR
A[输入 a1] --> C[计算单元]
B[输入 a2] --> C
C --> D[输出 z]
style C fill:#f9f,stroke:#333
输出计算过程:
输入信号首先被加权求和:
sum=w1a1+w2a2+⋯+wNaN=wTa
然后,加权和经过激活函数 g 处理得到输出:
z=g(sum)=g(wTa)
在最初的MP模型中,激活函数 g 通常是 符号函数 (sign function, sgn):
sgn(x)={1,−1,if x≥0if x<0
模型理解:
可以将神经元模型看作一个根据已知属性(特征)预测未知属性(目标)的单元。
- 已知属性值 (特征):a1,a2,a3,…
- 未知属性值 (目标):z
局限性: MP模型中的权值 wi 是预先设定的,不能通过学习过程自动调整。
3. Hebb学习率 (Hebb’s Rule, 1949)
心理学家Hebb提出,人脑神经细胞突触的强度(即连接权重)是可以变化的。这启发了研究者们思考如何通过调整权值让机器自我学习,为后续的感知机等学习算法奠定了基础。
三、感知机 (Perceptron)
感知机是由Frank Rosenblatt于1957年提出的,它在MP模型的基础上引入了权值学习机制。
1. 结构
感知机通常由两层神经元构成:
- 输入层 (Input Layer): 接收输入数据,仅传递数据,不做计算。节点数等于特征维度。
- 输出层 (Output Layer): 对前一层的输入进行计算。可以有一个或多个神经元。
如果输出层只有一个神经元,且激活函数为符号函数,则感知机是一个二分类模型。
感知机可以看作是 单层神经网络 (指其只有一个计算层/权重层)。
graph LR
A[a1] --> C[z1]
A --> D[z2]
B[a2] --> C
B --> D
C --> E[输出]
D --> E
style C fill:#9f9,stroke:#333
style D fill:#9f9,stroke:#333
2. 计算公式
对于有 N 个输入 a1,…,aN 和 M 个输出神经元的感知机:
输入向量:a=[a1,a2,…,aN]T
权重矩阵:W∈RM×N (其中 Wji 是从输入 ai 到输出神经元 zj 的权重)
输出向量:z=[z1,z2,…,zM]T
计算公式(以矩阵形式):
z=g(Wa)
其中 g 是激活函数,逐元素应用于向量 Wa。
例如,对于第 j 个输出神经元:
zj=g(i=1∑NWjiai)
3. 感知机训练法则 (Perceptron Learning Rule)
与MP模型不同,感知机的权重 W 是通过训练得到的。
对于单个输出神经元的感知机 (二分类,激活函数为sgn),其更新规则为:
令 y 为真实目标标签 (+1 或 -1),y^=sgn(wTa) 为感知机输出。
权重更新:
wnew=wold+Δw
Δw=η(y−y^)a
其中 η 是学习速率 (learning rate),是一个小的正数 (如 0.1)。
训练目标是最小化预测错误,例如通过迭代调整权重直到所有训练样本都被正确分类(对于线性可分数据)。
4. 决策边界与局限性
- 决策边界: 感知机在特征空间中创建一个线性决策边界。对于二维数据,是一条直线;三维数据是一个平面;N维数据是一个N-1维的超平面。
wTa=0
- 局限性 (Minsky & Papert, 1969): 单层感知机只能解决线性可分问题。它无法解决像 异或 (XOR) 这样的简单非线性分类任务。
- XOR问题:
- (0, 0) -> 0
- (0, 1) -> 1
- (1, 0) -> 1
- (1, 1) -> 0
在二维平面上,无法用一条直线将 XOR 的两类点分开。
四、多层感知机 (Multi-Layer Perceptron, MLP)
为了克服单层感知机的局限性,引入了多层感知机,即包含一个或多个隐藏层的神经网络。
graph LR
I[输入层] --> H1[隐藏层1]
H1 --> H2[隐藏层2]
H2 --> O[输出层]
style H1 fill:#f99,stroke:#333
style H2 fill:#f99,stroke:#333
style O fill:#99f,stroke:#333
1. 结构
MLP通常包含三个或更多层次:
- 输入层 (Input Layer): 接收原始数据。
- 隐藏层 (Hidden Layer(s)): 一个或多个。这些层对输入数据进行非线性变换。
- 输出层 (Output Layer): 输出最终结果(分类、回归值等)。
2. 数学表达式
考虑一个具有一个隐藏层的MLP:
- 输入向量:x
- 输入层到隐藏层的权重矩阵:W(1),偏置向量:b(1)
- 隐藏层的激活函数:g1
- 隐藏层的输出:h=g1(W(1)x+b(1))
- 隐藏层到输出层的权重矩阵:W(2),偏置向量:b(2)
- 输出层的激活函数:g2
- 最终输出 (预测值):y^=g2(W(2)h+b(2))
代入 h:
y^=g2(W(2)g1(W(1)x+b(1))+b(2))
注意: 偏置单元 (bias units) 通常会引入,它们的值恒为1,并与后一层的所有节点连接,其权重可学习。
3. 激活函数
在MLP中,通常使用平滑的、可微的非线性激活函数,常见的有:
-
Sigmoid (Logistic) 函数:
σ(x)=1+e−x1
输出范围 (0, 1),常用于二分类问题的输出层或旧式网络的隐藏层。
-
Tanh (双曲正切) 函数:
tanh(x)=ex+e−xex−e−x=2σ(2x)−1
输出范围 (-1, 1),通常比Sigmoid在隐藏层中表现更好,因为其输出均值为0。
-
ReLU (Rectified Linear Unit) 函数:
ReLU(x)=max(0,x)
输出范围 [0,∞)。目前在深度神经网络中非常流行,因其计算简单且能有效缓解梯度消失问题。
4. 通用近似定理 (Universal Approximation Theorem)
该定理表明:一个具有 一个隐藏层、有限数量神经元 和 非线性激活函数 (如Sigmoid) 的MLP,可以以任意精度近似任何定义在输入空间紧集上的连续函数。
形式化表述(简化版):
对于任何连续函数 f(x),存在一个MLP F(x) 使得对所有 x:
∣F(x)−f(x)∣<ϵ
其中 ϵ>0 是一个任意小的正数。
这意味着MLP具有强大的函数拟合能力,因此能够解决XOR等非线性问题。
5. MLP如何解决非线性问题 (如XOR)?
-
关键在于非线性激活函数和隐藏层。
-
如果隐藏层使用线性激活函数,则整个MLP仍然是一个线性模型:
W(2)(W(1)x+b(1))+b(2)=(W(2)W(1))x+(W(2)b(1)+b(2))=W′x+b′
这等效于一个单层线性模型。
-
空间变换: 隐藏层通过非线性激活函数对输入数据进行 空间变换 (space transformation)。原始线性不可分的数据,在变换后的新空间中可能变得线性可分。然后,输出层在这个新的表示空间中执行线性分类/回归。
-
本质: 多层神经网络的本质就是通过学习到的矩阵参数 (W,b) 与固定的非线性激活函数来拟合特征与目标之间的真实函数关系。
6. 隐藏层节点数的选择
- 输入层节点数由特征维度决定。
- 输出层节点数由目标维度(如分类类别数、回归值数量)决定。
- 隐藏层节点数是一个超参数,通常根据经验或通过 网格搜索 (Grid Search) 等超参数优化方法来确定。
五、神经网络的训练
1. 损失函数 (Loss Function)
衡量模型预测值 y^ 与真实目标值 y 之间差异的函数。训练的目标是最小化损失函数。
例如,对于回归问题,常用 均方误差 (Mean Squared Error, MSE):
L(y,y^)=21∣∣y−y^∣∣2=21i∑(yi−y^i)2
(常数 1/2 是为了求导方便)
2. 前向传播 (Forward Propagation)
从输入层开始,逐层计算神经元的输出,直到得到最终的输出层结果 y^。
例如,对于一个两层网络 (一个隐藏层,一个输出层):
- 计算隐藏层输出:h=g1(W(1)x+b(1))
- 计算输出层输出:y^=g2(W(2)h+b(2))
3. 反向传播 (Backward Propagation, BP)
反向传播算法是计算损失函数 L 关于网络中所有参数(权重 W 和偏置 b)梯度的有效方法。它基于微积分中的 链式法则 (Chain Rule)。
梯度信息用于通过 梯度下降 (Gradient Descent) 或其变种 (如Adam, SGD) 来更新参数,以最小化损失函数。
梯度下降更新规则:
对于任意参数 θ (可以是某个 Wij 或 bi):
θnew=θold−η∂θ∂L
其中 η 是学习速率。
BP过程概述:
-
前向传播: 计算网络每一层的输出,最终得到预测值 y^ 和损失 L。
-
反向传播梯度:
- 从输出层开始,计算 L 关于输出层激活值(激活函数作用后的值)的梯度。
- 然后计算 L 关于输出层加权和(激活函数作用前的值)的梯度。
- 接着计算 L 关于输出层权重 W(L) 和偏置 b(L) 的梯度。
- 将梯度传播到前一层(第 L−1 层),计算 L 关于第 L−1 层激活值的梯度。
- 依此类推,逐层向后计算梯度,直到输入层。
示例:链式法则的应用 (考虑 Etotal 对 w5 的偏导)
假设 Etotal 是总误差,outo1 是某个输出神经元的激活输出,neto1 是其加权输入, w5 是连接到 neto1 的一个权重。
∂w5∂Etotal=∂outo1∂Etotal×∂neto1∂outo1×∂w5∂neto1
- ∂outo1∂Etotal: 总误差对该神经元输出的偏导。如果 Etotal=21(targeto1−outo1)2+…,则此项为 −(targeto1−outo1)。
- ∂neto1∂outo1: 激活函数的导数。例如,如果激活函数是Sigmoid σ(x),其导数为 σ(x)(1−σ(x))。所以此项为 outo1(1−outo1)。
- ∂w5∂neto1: 加权输入对权重 w5 的偏导。如果 neto1=w5⋅outh1+…,则此项为 outh1 (连接到 w5 的前一层神经元的输出)。
反向传播到隐藏层 (例如,误差对 w1 的偏导):
当计算隐藏层权重的梯度时,需要将来自所有它所连接的后一层神经元的误差贡献加起来。
∂w1∂Etotal=(k∑∂outok∂Etotal∂netok∂outok∂outh1∂netok)×∂neth1∂outh1×∂w1∂neth1
其中,outh1 是 w1 所连接的隐藏神经元的输出,outok 是该隐藏神经元连接到的第 k 个输出神经元的输出。
4. 梯度消失问题 (Vanishing Gradient Problem)
在使用Sigmoid或Tanh等饱和激活函数(在其取值范围两端梯度趋近于0)的深层网络中,梯度在反向传播时会逐层衰减。
- Sigmoid函数的导数 σ′(x)=σ(x)(1−σ(x)) 的最大值是 0.25 (当 x=0 时)。
- 当梯度从输出层向输入层传播时,每经过一层,梯度至少会乘以一个小于等于0.25的因子 (如果是Sigmoid) 和权重的乘积。
- 在层数很多的情况下,靠近输入层的梯度可能变得非常小 (趋近于0),导致这些层的参数几乎不更新,网络难以训练。
5. ReLU激活函数与梯度消失
ReLU (Rectified Linear Unit) 函数及其导数:
ReLU(x)=max(0,x)
ReLU′(x)={1,0,if x>0if x≤0
ReLU的优点:
- 缓解梯度消失: 对于 x>0 的部分,导数恒为1,梯度可以无衰减地向后传播,有助于训练深层网络。
- 计算效率高: 相比Sigmoid/Tanh,ReLU及其导数的计算非常简单。
- 稀疏性: 对于 x≤0 的输入,ReLU的输出为0,这会使一部分神经元失活,从而使网络具有稀疏性,可能减少参数间的相互依赖,缓解过拟合。
六、总结
- 人工神经元结构: 模拟生物神经元,包含输入、加权、求和、激活、输出等步骤。
- 感知机: 单计算层网络,能解决线性分类问题,但无法处理XOR等非线性问题。
- 多层感知机 (MLP): 通过引入隐藏层和非线性激活函数,能够拟合复杂的非线性函数关系(通用近似定理),解决非线性问题。关键在于隐藏层对数据的空间变换。
- 训练: 通过前向传播计算输出和损失,再通过反向传播计算梯度,并使用梯度下降等优化算法更新网络参数。
- 挑战与改进: 梯度消失问题可通过ReLU等激活函数得到缓解。
神经网络是现代机器学习和人工智能领域的核心技术之一,在计算机视觉、语音识别、自然语言处理等众多领域取得了巨大成功。
课后作业
答案(仅供参考)
给定的初始值:
- x1=1,x2=0.5
- t=4
- w1=0.5,w2=1.5,w3=2.3,w4=3,w5=1,w6=1
- η=0.1
- 激活函数: ReLU, f(z)=max(0,z), f′(z)=1 if z>0, 0 if z≤0.
- 损失函数: L=21(y−t)2
1. 前向传播
-
计算隐藏层输入:
neth1=w1x1+w2x2=(0.5)(1)+(1.5)(0.5)=0.5+0.75=1.25
neth2=w3x1+w4x2=(2.3)(1)+(3)(0.5)=2.3+1.5=3.8
-
计算隐藏层输出 (经过ReLU):
h1=ReLU(neth1)=ReLU(1.25)=1.25
h2=ReLU(neth2)=ReLU(3.8)=3.8
-
计算输出层输入:
nety=w5h1+w6h2=(1)(1.25)+(1)(3.8)=1.25+3.8=5.05
-
计算输出层输出 (经过ReLU):
y=ReLU(nety)=ReLU(5.05)=5.05
-
计算损失:
L=21(y−t)2=21(5.05−4)2=21(1.05)2=21(1.1025)=0.55125
2. 反向传播
由于 nety=5.05>0, neth1=1.25>0, neth2=3.8>0,所有ReLU的导数在其激活区域内都为1。
-
计算输出层误差项 δy:
δy=∂y∂L⋅∂nety∂y=(y−t)⋅ReLU′(nety)=(5.05−4)⋅1=1.05
-
更新 w5:
w5 是连接 h1 到 y 的权重。
∂w5∂L=δy⋅∂w5∂nety=δy⋅h1=1.05⋅1.25=1.3125
Δw5=−η∂w5∂L=−0.1⋅1.3125=−0.13125
w5+=w5+Δw5=1−0.13125=0.86875
-
更新 w1:
w1 是连接 x1 到 h1 的权重。
∂w1∂L=δy⋅∂h1∂nety⋅∂neth1∂h1⋅∂w1∂neth1
-
∂h1∂nety=w5=1
-
∂neth1∂h1=ReLU′(neth1)=ReLU′(1.25)=1
-
∂w1∂neth1=x1=1 (因为 neth1=w1x1+w2x2)
所以, ∂w1∂L=δy⋅w5⋅1⋅x1=1.05⋅1⋅1⋅1=1.05
Δw1=−η∂w1∂L=−0.1⋅1.05=−0.105
w1+=w1+Δw1=0.5−0.105=0.395