神经网络学习
1. 神经元模型
神经网络的研究始于对生物神经系统的模拟。生物神经元通过突触相互连接,当一个神经元接收到的电信号超过一定阈值(Threshold)时,它就会被激活(兴奋),向其他神经元发送化学物质。
1.1 M-P 神经元模型
1943年,McCulloch和Pitts将上述生物过程抽象为M-P神经元模型。这是现代神经网络的基石。
在这个模型中,神经元接收来自nnn个其他神经元传递过来的输入信号。这些信号并非等同视之,而是通过带权重的连接(Connection Weight)进行传递。
数学定义:
假设第iii个输入信号为xix_ixi,对应的权重为wiw_iwi,神经元的阈值为θ\thetaθ。神经元接收到的总输入与阈值进行比较,然后通过一个激活函数(Activation Function)fff处理以产生输出yyy。
公式如下:
y=f(∑i=1nwixi−θ) y = f\left( \sum_{i=1}^{n} w_i x_i - \theta \right)y=f(i=1∑nwixi−θ)
1.2 激活函数的选择
理想的激活函数是阶跃函数,即:
sgn(x)={1,x≥00,x<0 \text{sgn}(x) = \begin{cases} 1, & x \ge 0 \\ 0, & x < 0 \end{cases}sgn(x)={1,0,x≥0x<0
但这函数不连续、不光滑,性质不好。因此,实际中常用Sigmoid函数(也称Logistic函数)作为激活函数。它将较大范围的输入挤压到(0,1)(0, 1)(0,1)区间内,且具有良好的数学性质(处处可导)。
Sigmoid函数公式:
sigmoid(x)=11+e−x \text{sigmoid}(x) = \frac{1}{1 + e^{-x}}sigmoid(x)=1+e−x1
重要性质:Sigmoid函数的导数性质在后续BP推导中至关重要:
f′(x)=f(x)(1−f(x)) f'(x) = f(x)(1 - f(x))f′(x)=f(x)(1−f(x))
importnumpyasnpimportmatplotlib.pyplotaspltdefsigmoid(x):"""Sigmoid 激活函数"""return1/(1+np.exp(-x))defsigmoid_derivative(x):"""Sigmoid 导数: f'(x) = f(x)(1 - f(x))"""s=sigmoid(x)returns*(1-s)# 测试代码x=np.arange(-6,6,0.1)y=sigmoid(x)dy=sigmoid_derivative(x)# 导数最大值在0处,两端趋向于0(梯度消失)print(f"Sigmoid(0) ={sigmoid(0)}")# 输出 0.5print(f"Derivative(0) ={sigmoid_derivative(0)}")# 输出 0.252. 感知机与多层网络
2.1 感知机 (Perceptron)
感知机由两层神经元组成:输入层和输出层。输入层只负责传递信号,输出层是M-P神经元。
感知机能容易地实现逻辑运算。例如:
- 与 (x1∧x2x_1 \wedge x_2x1∧x2):令w1=w2=1,θ=2w_1=w_2=1, \theta=2w1=w2=1,θ=2,则仅当x1=x2=1x_1=x_2=1x1=x2=1时,1⋅1+1⋅1−2=0≥01\cdot1 + 1\cdot1 - 2 = 0 \ge 01⋅1+1⋅1−2=0≥0,输出1。
- 或 (x1∨x2x_1 \vee x_2x1∨x2):令w1=w2=1,θ=0.5w_1=w_2=1, \theta=0.5w1=w2=1,θ=0.5。
- 非 (¬x1\neg x_1¬x1):令w1=−0.6,θ=−0.5w_1=-0.6, \theta=-0.5w1=−0.6,θ=−0.5。
感知机的学习规则:
给定训练样例(x,y)(\boldsymbol{x}, y)(x,y),若当前输出为y^\hat{y}y^,则权重调整规则为:
wi←wi+Δwi w_i \leftarrow w_i + \Delta w_iwi←wi+ΔwiΔwi=η(y−y^)xi \Delta w_i = \eta (y - \hat{y}) x_iΔwi=η(y−y^)xi其中η∈(0,1)\eta \in (0,1)η∈(0,1)称为学习率 (Learning Rate)。
- 若预测正确 (y=y^y = \hat{y}y=y^),权重不更新。
- 若预测错误,权重会向减少误差的方向调整。
importnumpyasnp# 数据集:逻辑与 (AND)X=np.array([[0,0],[0,1],[1,0],[1,1]])y=np.array([0,0,0,1])# 初始化参数w=np.zeros(2)# 权重b=0# 阈值 (bias)lr=0.1# 学习率 etadefstep_function(x):return1ifx>=0else0# 训练过程forepochinrange(10):foriinrange(len(X)):xi=X[i]target=y[i]# 前向传播output=step_function(np.dot(w,xi)+b)# 权重更新规则error=target-outputiferror!=0:w+=lr*error*xi b+=lr*error# 阈值更新类似权重,输入视为1print(f"训练后权重:{w}, 阈值:{b}")# 验证:[1, 1] -> 1*w1 + 1*w2 + b 应该 >= 02.2 线性可分与异或问题
感知机本质上是在寻找一个线性超平面(Linear Hyperplane)将两类样本分开。
- 对于线性可分问题(如与、或、非),感知机一定收敛。
- 对于非线性可分问题(如异或 XOR),单层感知机无法解决,学习过程会发生振荡。
要解决非线性问题,我们需要多层功能神经元,即引入隐层 (Hidden Layer)。隐层和输出层神经元都拥有激活函数。这种结构被称为多层前馈神经网络 (Multi-layer Feedforward Neural Networks)。
3. 误差逆传播算法 (BP算法)
多层网络的学习能力比单层感知机强得多,但如何训练多层网络?误差逆传播 (Error BackPropagation, BP) 算法是目前最杰出的解决方法。
3.1 变量定义与网络结构
为了清晰地进行数学推导,我们先严格定义符号:
- 数据集:D={(xk,yk)}k=1mD = \{(\boldsymbol{x}_k, \boldsymbol{y}_k)\}_{k=1}^mD={(xk,yk)}k=1m,输入维度ddd,输出维度lll。
- 网络结构:
- 输入层神经元个数:ddd
- 隐层神经元个数:qqq
- 输出层神经元个数:lll
- 权重与阈值(我们要学习的参数):
- vihv_{ih}vih:输入层第iii个神经元到隐层第hhh个神经元的权重。
- whjw_{hj}whj:隐层第hhh个神经元到输出层第jjj个神经元的权重。
- γh\gamma_hγh:隐层第hhh个神经元的阈值。
- θj\theta_jθj:输出层第jjj个神经元的阈值。
- 中间变量:
- αh=∑i=1dvihxi\alpha_h = \sum_{i=1}^d v_{ih} x_iαh=∑i=1dvihxi:隐层第hhh个神经元的接收输入。
- bh=f(αh−γh)b_h = f(\alpha_h - \gamma_h)bh=f(αh−γh):隐层第hhh个神经元的输出。
- βj=∑h=1qwhjbh\beta_j = \sum_{h=1}^q w_{hj} b_hβj=∑h=1qwhjbh:输出层第jjj个神经元的接收输入。
- y^j=f(βj−θj)\hat{y}_j = f(\beta_j - \theta_j)y^j=f(βj−θj):输出层第jjj个神经元的最终输出。
3.2 损失函数 (Loss Function)
对于第kkk个训练样例(xk,yk)(\boldsymbol{x}_k, \boldsymbol{y}_k)(xk,yk),网络的预测输出为y^k\hat{\boldsymbol{y}}_ky^k,均方误差(Mean Squared Error)定义为:
Ek=12∑j=1l(y^jk−yjk)2 E_k = \frac{1}{2} \sum_{j=1}^{l} (\hat{y}_j^k - y_j^k)^2Ek=21j=1∑l(y^jk−yjk)2
这里的12\frac{1}{2}21是为了方便求导时抵消指数。
3.3 BP算法推导过程
BP算法基于梯度下降 (Gradient Descent)策略,即以目标的负梯度方向对参数进行调整。我们需要针对四组参数 (whj,θj,vih,γhw_{hj}, \theta_j, v_{ih}, \gamma_hwhj,θj,vih,γh) 分别求偏导。
第一步:更新输出层权重whjw_{hj}whj
我们要求∂Ek∂whj\frac{\partial E_k}{\partial w_{hj}}∂whj∂Ek。根据链式法则 (Chain Rule),误差EkE_kEk先影响输出y^j\hat{y}_jy^j,再由y^j\hat{y}_jy^j影响输入βj\beta_jβj,最后由βj\beta_jβj影响权重whjw_{hj}whj。
∂Ek∂whj=∂Ek∂y^j⋅∂y^j∂βj⋅∂βj∂whj \frac{\partial E_k}{\partial w_{hj}} = \frac{\partial E_k}{\partial \hat{y}_j} \cdot \frac{\partial \hat{y}_j}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial w_{hj}}∂whj∂Ek=∂y^j∂Ek⋅∂βj∂y^j⋅∂whj∂βj
我们逐项计算:
- 第一项∂Ek∂y^j\frac{\partial E_k}{\partial \hat{y}_j}∂y^j∂Ek:
∂∂y^j(12∑j=1l(y^j−yj)2)=y^j−yj \frac{\partial}{\partial \hat{y}_j} \left( \frac{1}{2} \sum_{j=1}^{l} (\hat{y}_j - y_j)^2 \right) = \hat{y}_j - y_j∂y^j∂(21j=1∑l(y^j−yj)2)=y^j−yj - 第二项∂y^j∂βj\frac{\partial \hat{y}_j}{\partial \beta_j}∂βj∂y^j:
因为y^j=f(βj−θj)\hat{y}_j = f(\beta_j - \theta_j)y^j=f(βj−θj),且fff是Sigmoid函数,利用性质f′(x)=f(x)(1−f(x))f'(x)=f(x)(1-f(x))f′(x)=f(x)(1−f(x)):
∂y^j∂βj=f′(βj−θj)=y^j(1−y^j) \frac{\partial \hat{y}_j}{\partial \beta_j} = f'(\beta_j - \theta_j) = \hat{y}_j (1 - \hat{y}_j)∂βj∂y^j=f′(βj−θj)=y^j(1−y^j) - 第三项∂βj∂whj\frac{\partial \beta_j}{\partial w_{hj}}∂whj∂βj:
因为βj=∑h=1qwhjbh\beta_j = \sum_{h=1}^q w_{hj} b_hβj=∑h=1qwhjbh:
∂βj∂whj=bh \frac{\partial \beta_j}{\partial w_{hj}} = b_h∂whj∂βj=bh
定义输出层神经元的梯度项gjg_jgj:
我们将前两项合并,定义为−gj-g_j−gj:
gj=−∂Ek∂y^j⋅∂y^j∂βj=−(y^j−yj)⋅y^j(1−y^j)=y^j(1−y^j)(yj−y^j) g_j = - \frac{\partial E_k}{\partial \hat{y}_j} \cdot \frac{\partial \hat{y}_j}{\partial \beta_j} = -(\hat{y}_j - y_j) \cdot \hat{y}_j (1 - \hat{y}_j) = \hat{y}_j(1-\hat{y}_j)(y_j - \hat{y}_j)gj=−∂y^j∂Ek⋅∂βj∂y^j=−(y^j−yj)⋅y^j(1−y^j)=y^j(1−y^j)(yj−y^j)
因此,权重的更新量为:
Δwhj=−η∂Ek∂whj=ηgjbh \Delta w_{hj} = -\eta \frac{\partial E_k}{\partial w_{hj}} = \eta g_j b_hΔwhj=−η∂whj∂Ek=ηgjbh
第二步:更新输出层阈值θj\theta_jθj
同理,
∂Ek∂θj=∂Ek∂y^j⋅∂y^j∂θj \frac{\partial E_k}{\partial \theta_j} = \frac{\partial E_k}{\partial \hat{y}_j} \cdot \frac{\partial \hat{y}_j}{\partial \theta_j}∂θj∂Ek=∂y^j∂Ek⋅∂θj∂y^j
因为y^j=f(βj−θj)\hat{y}_j = f(\beta_j - \theta_j)y^j=f(βj−θj),所以∂y^j∂θj=−f′(βj−θj)\frac{\partial \hat{y}_j}{\partial \theta_j} = -f'(\beta_j - \theta_j)∂θj∂y^j=−f′(βj−θj)。
结合上面定义的gjg_jgj,可得:
Δθj=−η∂Ek∂θj=−ηgj \Delta \theta_j = -\eta \frac{\partial E_k}{\partial \theta_j} = -\eta g_jΔθj=−η∂θj∂Ek=−ηgj
第三步:更新隐层权重vihv_{ih}vih(关键难点)
这是BP算法体现“误差逆传播”精髓的地方。隐层的输出bhb_hbh影响了输出层所有的神经元,因此误差需要从所有输出神经元反向传回。
∂Ek∂vih=∑j=1l∂Ek∂βj⋅∂βj∂bh⋅∂bh∂αh⋅∂αh∂vih \frac{\partial E_k}{\partial v_{ih}} = \sum_{j=1}^{l} \frac{\partial E_k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial b_h} \cdot \frac{\partial b_h}{\partial \alpha_h} \cdot \frac{\partial \alpha_h}{\partial v_{ih}}∂vih∂Ek=j=1∑l∂βj∂Ek⋅∂bh∂βj⋅∂αh∂bh⋅∂vih∂αh
注意到∂Ek∂βj=−gj\frac{\partial E_k}{\partial \beta_j} = -g_j∂βj∂Ek=−gj(这是我们在第一步计算过的输出层梯度)。
- 中间传递∂βj∂bh=whj\frac{\partial \beta_j}{\partial b_h} = w_{hj}∂bh∂βj=whj(因为βj=⋯+whjbh+…\beta_j = \dots + w_{hj}b_h + \dotsβj=⋯+whjbh+…)。
- 隐层激活导数∂bh∂αh=f′(αh−γh)=bh(1−bh)\frac{\partial b_h}{\partial \alpha_h} = f'(\alpha_h - \gamma_h) = b_h(1-b_h)∂αh∂bh=f′(αh−γh)=bh(1−bh)。
- 输入层∂αh∂vih=xi\frac{\partial \alpha_h}{\partial v_{ih}} = x_i∂vih∂αh=xi。
定义隐层神经元的梯度项ehe_heh:
我们将与vihv_{ih}vih无关的求和项提取出来定义为ehe_heh:
eh=∂bh∂αh∑j=1l∂Ek∂βj∂βj∂bh=bh(1−bh)∑j=1l(−gj)whj e_h = \frac{\partial b_h}{\partial \alpha_h} \sum_{j=1}^{l} \frac{\partial E_k}{\partial \beta_j} \frac{\partial \beta_j}{\partial b_h} = b_h(1-b_h) \sum_{j=1}^{l} (-g_j) w_{hj}eh=∂αh∂bhj=1∑l∂βj∂Ek∂bh∂βj=bh(1−bh)j=1∑l(−gj)whj
整理负号后得到公式:
eh=bh(1−bh)∑j=1lwhjgj e_h = b_h(1-b_h) \sum_{j=1}^{l} w_{hj} g_jeh=bh(1−bh)j=1∑lwhjgj
于是,隐层权重的更新量为:
Δvih=ηehxi \Delta v_{ih} = \eta e_h x_iΔvih=ηehxi
第四步:更新隐层阈值γh\gamma_hγh
同理可得:
Δγh=−ηeh \Delta \gamma_h = -\eta e_hΔγh=−ηeh
3.4 BP算法总结
至此,我们得到了完整的参数更新公式:
- 计算输出层梯度:gj=y^j(1−y^j)(yj−y^j)g_j = \hat{y}_j(1-\hat{y}_j)(y_j - \hat{y}_j)gj=y^j(1−y^j)(yj−y^j)
- 计算隐层梯度:eh=bh(1−bh)∑j=1lwhjgje_h = b_h(1-b_h) \sum_{j=1}^{l} w_{hj} g_jeh=bh(1−bh)∑j=1lwhjgj
- 更新参数:
- Δwhj=ηgjbh\Delta w_{hj} = \eta g_j b_hΔwhj=ηgjbh
- Δθj=−ηgj\Delta \theta_j = -\eta g_jΔθj=−ηgj
- Δvih=ηehxi\Delta v_{ih} = \eta e_h x_iΔvih=ηehxi
- Δγh=−ηeh\Delta \gamma_h = -\eta e_hΔγh=−ηeh
算法流程就是:输入信号→\to→前向传播计算输出→\to→计算误差→\to→反向传播计算梯度gj,ehg_j, e_hgj,eh→\to→更新权重→\to→迭代直到收敛。
importnumpyasnp# 1. 准备数据 (XOR问题)X=np.array([[0,0],[0,1],[1,0],[1,1]])y=np.array([[0],[1],[1],[0]])# 2. 初始化网络结构input_size=2hidden_size=2output_size=1learning_rate=0.1# 初始化权重和阈值 (随机初始化非常重要)# v: 输入层->隐层权重, w: 隐层->输出层权重v=np.random.uniform(size=(input_size,hidden_size))w=np.random.uniform(size=(hidden_size,output_size))# gamma: 隐层阈值, theta: 输出层阈值gamma=np.zeros((1,hidden_size))theta=np.zeros((1,output_size))defsigmoid(x):return1/(1+np.exp(-x))defsigmoid_deriv(x):returnx*(1-x)# 输入是激活后的值# 3. 训练循环 (标准BP算法,单样本更新)forepochinrange(10000):foriinrange(len(X)):# --- 前向传播 ---# 隐层输入 alpha, 输出 bb_input=np.dot(X[i],v)-gamma b=sigmoid(b_input)# 输出层输入 beta, 输出 y_haty_input=np.dot(b,w)-theta y_hat=sigmoid(y_input)# --- 误差逆传播 (Backprop) ---# 计算输出层梯度 g (对应推导中的 g_j)error=y[i]-y_hat g=y_hat*(1-y_hat)*error# 计算隐层梯度 e (对应推导中的 e_h)e=b*(1-b)*np.dot(g,w.T)# --- 更新参数 ---w+=learning_rate*np.dot(b.reshape(-1,1),g.reshape(1,-1))theta-=learning_rate*g v+=learning_rate*np.dot(X[i].reshape(-1,1),e.reshape(1,-1))gamma-=learning_rate*e# 4. 测试print("XOR 预测结果:")foriinrange(len(X)):b=sigmoid(np.dot(X[i],v)-gamma)res=sigmoid(np.dot(b,w)-theta)print(f"输入:{X[i]}-> 预测:{res.round(2)}(真实:{y[i]})")4. 全局最小 vs. 局部极小
训练神经网络的本质,是在参数空间中寻找一组最优参数(w∗,θ∗)(\boldsymbol{w}^*, \boldsymbol{\theta}^*)(w∗,θ∗),使得误差函数EEE最小化。
4.1 数学定义
直观上,全局最小(Global Minimum)是整个山谷的最低点,而局部极小(Local Minimum)只是某个坑底。
对于参数(w∗,θ∗)(\boldsymbol{w}^*, \boldsymbol{\theta}^*)(w∗,θ∗),若存在ϵ>0\epsilon > 0ϵ>0,使得对于参数空间内所有满足∣(w;θ)−(w∗;θ∗)∣≤ϵ|(\boldsymbol{w}; \boldsymbol{\theta}) - (\boldsymbol{w}^*; \boldsymbol{\theta}^*)| \le \epsilon∣(w;θ)−(w∗;θ∗)∣≤ϵ的点,都有:
E(w;θ)≥E(w∗;θ∗) E(\boldsymbol{w}; \boldsymbol{\theta}) \ge E(\boldsymbol{w}^*; \boldsymbol{\theta}^*)E(w;θ)≥E(w∗;θ∗)
则称(w∗;θ∗)(\boldsymbol{w}^*; \boldsymbol{\theta}^*)(w∗;θ∗)为局部极小解。
若对于参数空间中的任意(w;θ)(\boldsymbol{w}; \boldsymbol{\theta})(w;θ)都有上述不等式成立,则称为全局最小解。
结论:全局最小一定是局部极小,但局部极小不一定是全局最小。基于梯度的搜索方法(如BP)很容易陷入局部极小,因为在这些点上梯度为0,参数更新会停止。
4.2 跳出局部极小的策略
为了避免模型“死”在半山腰,常用的策略包括:
- 多组初始化:像空降兵一样,从不同的位置开始搜索,最后取误差最小的解。
- 模拟退火 (Simulated Annealing):源于物理退火原理。每一步以一定概率接受“更差”的结果(即误差增大的结果)。接受次优解的概率随着时间推移逐渐降低。
- 随机梯度下降 (SGD):计算梯度时加入随机因素(例如只用一个样本计算梯度),使得即使陷入局部极小,梯度也不完全为0,有机会跳出。
5. 其它神经网络
除了标准的前馈神经网络,针对不同的任务,研究者们设计了多种网络结构。
5.1 RBF网络 (径向基函数网络)
RBF (Radial Basis Function)网络是一种单隐层前馈网络。它的特点是:隐层使用径向基函数作为激活函数,输出层则是隐层输出的线性组合。
假设输入为ddd维向量x\boldsymbol{x}x,输出为实值,RBF网络的数学表示为:
φ(x)=∑i=1qwiρ(x,ci) \varphi(\boldsymbol{x}) = \sum_{i=1}^{q} w_i \rho(\boldsymbol{x}, \boldsymbol{c}_i)φ(x)=i=1∑qwiρ(x,ci)
其中:
- qqq是隐层神经元个数。
- ci\boldsymbol{c}_ici是第iii个隐层神经元的中心 (Center)。
- wiw_iwi是权重。
- ρ(x,ci)\rho(\boldsymbol{x}, \boldsymbol{c}_i)ρ(x,ci)是径向基函数,最常用的是高斯函数 (Gaussian):
ρ(x,ci)=e−β∣∣x−ci∣∣2 \rho(\boldsymbol{x}, \boldsymbol{c}_i) = e^{-\beta ||\boldsymbol{x} - \boldsymbol{c}_i||^2}ρ(x,ci)=e−β∣∣x−ci∣∣2
训练策略:通常分两步。
- 确定中心ci\boldsymbol{c}_ici:使用聚类算法(如K-means)从数据中找中心。
- 确定权重wiw_iwi:固定中心后,这就变成了一个线性方程组求解问题,也可以用BP算法微调。
5.2 ART网络 (自适应谐振理论)
ART (Adaptive Resonance Theory)解决了稳定性-可塑性窘境 (Stability-Plasticity Dilemma):既要学习新知识(可塑性),又要不遗忘旧知识(稳定性)。
- 机制:竞争型学习(Competitive Learning)。输出层神经元相互竞争,“胜者通吃” (Winner-take-all)。
- 过程:输入样本与各神经元比较相似度。若相似度超过识别阈值,则该神经元微调权重(学习);若都不超过,则产生一个新的神经元来记忆这个新样本(增量学习)。
5.3 SOM网络 (自组织映射)
SOM (Self-Organizing Map)是一种无监督学习算法,能将高维数据映射到低维空间(通常是2D矩阵),同时保持拓扑结构不变(即高维空间相似的样本,在SOM输出层也相邻)。
训练流程:
- 每个输出神经元拥有一个权向量。
- 接收输入样本后,计算距离最近的神经元,称为最佳匹配单元 (Best Matching Unit, BMU)。
- 更新BMU及其邻域内神经元的权向量,使其向输入样本靠近。
Δw=η(x−w) \Delta w = \eta (x - w)Δw=η(x−w)
这使得SOM具有聚类和可视化的功能。
5.4 级联相关网络 (Cascade-Correlation)
这是一种结构自适应网络。
- 构造性:网络从只有输入输出层开始。
- 级联:随着训练,新的隐层神经元一个接一个地加入,且冻结旧的权重。
- 相关:训练目标是最大化新神经元输出与网络误差之间的相关性。
5.5 Elman网络 (递归神经网络)
这是RNN (Recurrent Neural Networks)的一种。
与前馈网络不同,隐层的输出会被反馈回来,与下一时刻的输入一起作为新的输入。
- 结构:增加了接纳单元 (Context Unit),用于存储t−1t-1t−1时刻隐层的状态。
- 功能:能够处理序列数据,具有“记忆”能力。
6. 玻尔兹曼机 (Boltzmann Machine)
这是一类基于能量的模型 (Energy-based Model)。网络状态被定义一个“能量”,训练目的是为了最小化系统的总能量,达到热平衡分布。
6.1 能量函数与概率分布
神经元分为两层:显层(Visible,vvv)和隐层(Hidden,hhh),状态取值为{0,1}\{0, 1\}{0,1}。
定义状态向量s∈{0,1}n\boldsymbol{s} \in \{0, 1\}^ns∈{0,1}n,其能量函数为:
E(s)=−∑i=1n−1∑j=i+1nwijsisj−∑i=1nθisi E(\boldsymbol{s}) = - \sum_{i=1}^{n-1} \sum_{j=i+1}^{n} w_{ij} s_i s_j - \sum_{i=1}^{n} \theta_i s_iE(s)=−i=1∑n−1j=i+1∑nwijsisj−i=1∑nθisi
在平衡态下,状态s\boldsymbol{s}s出现的概率服从玻尔兹曼分布:
P(s)=e−E(s)Z,Z=∑te−E(t) P(\boldsymbol{s}) = \frac{e^{-E(\boldsymbol{s})}}{Z}, \quad Z = \sum_{\boldsymbol{t}} e^{-E(\boldsymbol{t})}P(s)=Ze−E(s),Z=t∑e−E(t)
其中ZZZ是配分函数(Partition Function),用于归一化。
6.2 受限玻尔兹曼机 (RBM)
标准玻尔兹曼机全是连接,训练极其困难。实际常用RBM (Restricted Boltzmann Machine)。
- 结构:二部图。显层与隐层全连接,但层内无连接。
- 性质:给定显层,隐层各单元独立;给定隐层,显层各单元独立。
P(v∣h)=∏i=1dP(vi∣h),P(h∣v)=∏j=1qP(hj∣v) P(\boldsymbol{v}|\boldsymbol{h}) = \prod_{i=1}^{d} P(v_i | \boldsymbol{h}), \quad P(\boldsymbol{h}|\boldsymbol{v}) = \prod_{j=1}^{q} P(h_j | \boldsymbol{v})P(v∣h)=i=1∏dP(vi∣h),P(h∣v)=j=1∏qP(hj∣v)
6.3 对比散度 (Contrastive Divergence, CD) 算法
为了训练RBM(求解权重w\boldsymbol{w}w),我们需要最大化训练数据的似然。通常使用CD算法近似梯度更新:
- 正相 (Positive Phase):根据输入v\boldsymbol{v}v计算隐层h\boldsymbol{h}h的概率并采样。
- 负相 (Negative Phase):根据h\boldsymbol{h}h重构v′\boldsymbol{v}'v′,再根据v′\boldsymbol{v}'v′生成h′\boldsymbol{h}'h′。
- 权重更新:
Δw=η(vhT−v′h′T) \Delta w = \eta (\boldsymbol{v}\boldsymbol{h}^T - \boldsymbol{v}'\boldsymbol{h}'^T)Δw=η(vhT−v′h′T)
这里vhT\boldsymbol{v}\boldsymbol{h}^TvhT是数据分布的期望,v′h′T\boldsymbol{v}'\boldsymbol{h}'^Tv′h′T是模型分布的期望近似。
7. 深度学习 (Deep Learning)
随着计算能力的提升和数据量的激增,单隐层网络已无法满足需求,深度学习应运而生。
7.1 为什么变“深”?
理论上,单隐层网络可以逼近任意连续函数。但是,为了达到同样的逼近精度,单隐层网络可能需要指数级增加的神经元。而多层网络通过层层嵌套,能以更少的参数高效地表示复杂的函数(例如:点→\to→线→\to→面→\to→形状)。
7.2 深度学习的训练挑战
直接用BP算法训练深层网络(如5层以上)往往很难,原因包括:
- 梯度消失/爆炸:误差反向传播时,梯度逐层相乘,到底层时往往变得微乎其微或巨大。
- 发散:容易陷入局部极小或难以收敛。
fromtensorflow.kerasimportlayers,models,regularizers# 定义一个带有正则化机制的网络model=models.Sequential([layers.Dense(100,activation='relu',input_shape=(20,)),# Dropout: 随机让50%的神经元不工作,防止依赖特定路径layers.Dropout(0.5),# L2正则化: 约束权重不要过大,对应公式 E + lambda * sum(w^2)layers.Dense(50,activation='relu',kernel_regularizer=regularizers.l2(0.01)),layers.Dense(1,activation='sigmoid')])7.3 解决方案一:无监督逐层训练 (Pre-training + Fine-tuning)
这是Hinton在2006年提出的经典思路(深度置信网络 DBN):
- 预训练 (Pre-training):每次训练一层。将上一层的输出作为下一层的输入,使用无监督算法(如RBM)进行训练。这相当于把参数初始化到一个较好的位置。
- 微调 (Fine-tuning):预训练完成后,对整个网络进行微调(通常使用BP算法)。
7.4 解决方案二:权共享 (Weight Sharing) —— CNN
卷积神经网络 (CNN) 是深度学习在图像领域的代表。
- 卷积层 (Convolutional Layer):通过卷积核 (Kernel)提取局部特征。
- 权共享:同一个卷积核在图像上滑动,无论在哪个位置,用的权重是一样的。这极大减少了参数量。
- 汇合/池化层 (Pooling Layer):对特征图进行下采样(如Max Pooling),减少数据量并保持平移不变性。
importtensorflowastffromtensorflow.kerasimportlayers,models# 构建一个简单的卷积神经网络 (CNN)# 对应书中提到的:卷积层 -> 池化层 -> 堆叠model=models.Sequential([# 卷积层:32个3x3的卷积核,激活函数ReLUlayers.Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)),# 池化层:2x2最大池化 (下采样)layers.MaxPooling2D((2,2)),# 再接一个卷积层layers.Conv2D(64,(3,3),activation='relu'),layers.MaxPooling2D((2,2)),# 展平后连接全连接层 (传统的BP网络部分)layers.Flatten(),layers.Dense(64,activation='relu'),layers.Dense(10,activation='softmax')# 输出10类])# 打印网络结构,可以看到参数数量的巨大减少model.summary()7.5 特征学习 (Feature Learning)
深度学习的核心优势在于特征学习(或称表示学习 Representation Learning)。
- 传统机器学习:依赖人工设计的特征(Feature Engineering),好坏全靠专家经验。
- 深度学习:将原始数据(如像素)直接输入,通过多层非线性变换,自动学习出从底层(边缘)到高层(物体部件)的特征表示。