Day 17:神经网络入门(MLP、激活函数、反向传播、优化器)

📋 目录

  1. 神经网络概述
  2. 感知机与多层感知机(MLP)
  3. 激活函数详解
  4. 前向传播与反向传播
  5. 优化器与学习率
  6. 过拟合与正则化

第一部分:神经网络概述

1.1 什么是神经网络?

人工神经网络(ANN) 是受生物神经系统启发而设计的计算模型,由大量相互连接的神经元组成。

生物神经元 vs 人工神经元

生物神经元 人工神经元
树突(接收信号) 输入 xix_ixi
细胞体(处理) 加权和 + 激活函数
轴突(输出) 输出 yyy
突触(连接强度) 权重 wiw_iwi

1.2 神经网络的发展历程

时间 里程碑 贡献者
1958年 感知机 Rosenblatt
1986年 反向传播算法 Rumelhart, Hinton
2006年 深度学习 Hinton
2012年 AlexNet Krizhevsky
2017年 Transformer Vaswani

1.3 为什么需要神经网络?

传统机器学习 vs 神经网络

特性 传统ML 神经网络
特征工程 需要手动构造 自动学习特征
非线性 需核技巧 天然非线性
大数据 性能饱和 随数据增长
可解释性 较好 较差

第二部分:感知机与多层感知机(MLP)

2.1 单层感知机

结构:输入层 → 输出层(无隐藏层)

数学形式
y=sign(w1x1+w2x2+⋯+wnxn+b) y = \text{sign}(w_1x_1 + w_2x_2 + \dots + w_nx_n + b) y=sign(w1x1+w2x2++wnxn+b)

局限性:只能解决线性可分问题(如XOR问题无法解决)

2.2 多层感知机(MLP)

结构:输入层 → 隐藏层 → 输出层

输入层     隐藏层     输出层
   x₁ ────→ h₁ ────→ y₁
   x₂ ────→ h₂
   x₃ ────→ h₃
   ...

数学形式

h=f(W(1)x+b(1)) h = f(W^{(1)}x + b^{(1)}) h=f(W(1)x+b(1))

y=g(W(2)h+b(2)) y = g(W^{(2)}h + b^{(2)}) y=g(W(2)h+b(2))

其中 fffggg 是激活函数。

2.3 MLP的表示能力

万能近似定理:一个具有足够神经元的单隐藏层MLP可以逼近任意连续函数。


第三部分:激活函数详解

3.1 为什么需要激活函数?

没有激活函数:多层线性变换等价于单层线性变换

W2(W1x+b1)+b2=Wx+bW_2(W_1x+b_1)+b_2 = Wx+bW2(W1x+b1)+b2=Wx+b

有了激活函数:引入非线性,可以学习复杂模式

3.2 常用激活函数对比

函数 公式 导数 优点 缺点
Sigmoid σ(x)=11+e−x \sigma(x) = \cfrac{1}{1+e^{-x}} σ(x)=1+ex1 σ(x)(1−σ(x)) \sigma(x)(1 - \sigma(x)) σ(x)(1σ(x)) 平滑,输出[0,1] 梯度消失,非零中心
Tanh tanh⁡(x)=ex−e−xex+e−x \tanh(x) = \cfrac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex 1−tanh⁡2(x) 1 - \tanh^2(x) 1tanh2(x) 输出[-1,1],零中心 梯度消失
ReLU ReLU(x)=max⁡(0,x) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x) 0或1 计算快,缓解梯度消失 神经元死亡
Leaky ReLU max⁡(0.01x,x) \max(0.01x, x) max(0.01x,x) 0.01或1 解决神经元死亡 参数固定
Softmax exi∑exj \cfrac{e^{x_i}}{\sum e^{x_j}} exjexi 特殊 输出概率 多分类专用

3.3 激活函数选择指南

层类型 推荐激活 原因
隐藏层 ReLU 计算快,缓解梯度消失
隐藏层(备选) Leaky ReLU, ELU 解决神经元死亡
输出层(二分类) Sigmoid 输出概率
输出层(多分类) Softmax 输出概率分布
输出层(回归) Linear 输出连续值

3.4 Sigmoid和Tanh的梯度消失问题

# ReLU vs Sigmoid 梯度对比
# Sigmoid在|x|>3时梯度接近0
# ReLU在x>0时梯度=1,x<0时梯度=0

第四部分:前向传播与反向传播

4.1 前向传播(Forward Propagation)

过程:输入 → 逐层计算 → 输出

# 单层前向传播
def forward_pass(X, W, b, activation):
    z = np.dot(X, W) + b
    a = activation(z)
    return a

损失函数:衡量预测与真实值的差距

任务 损失函数 公式
回归 MSE $ L = \frac{1}{n}\sum(y - \hat{y})^2 $
二分类 二元交叉熵 $ L = -[y\log\hat{y} + (1 - y)\log(1 - \hat{y})] $
多分类 分类交叉熵 $ L = -\sum y_i\log\hat{y}_i $

4.2 反向传播(Backpropagation)

核心思想:利用链式法则计算损失函数对每个参数的梯度。

链式法则
$ \frac{\partial L}{\partial w} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial z} \cdot \frac{\partial z}{\partial w} $

步骤

  1. 计算输出层误差 δL\delta_LδL
  2. 逐层反向传播误差 δl=δl+1⋅Wl+1T⊙σ′(zl)\delta_l = \delta_{l+1} \cdot W_{l+1}^T \odot \sigma'(z_l)δl=δl+1Wl+1Tσ(zl)
  3. 计算梯度 ∂L∂Wl=al−1Tδl\frac{\partial L}{\partial W_l} = a_{l-1}^T \delta_lWlL=al1Tδl
  4. 更新参数 Wl:=Wl−α∂L∂WlW_l := W_l - \alpha \frac{\partial L}{\partial W_l}Wl:=WlαWlL

4.3 反向传播示例(手算)

# 简化示例:单隐藏层网络
# 输入: x = [x1, x2]
# 隐藏层: h = σ(W1·x + b1)
# 输出: y = σ(W2·h + b2)
# 损失: L = (y - y_true)²

# 梯度计算:
# dL/dW2 = dL/dy * dy/dz2 * dz2/dW2
# dL/dW1 = dL/dy * dy/dz2 * dz2/dh * dh/dz1 * dz1/dW1

第五部分:优化器与学习率

5.1 梯度下降变体

优化器 特点 更新公式
BGD 使用全部样本 $ \theta := \theta - \alpha \nabla J(\theta) $
SGD 每次一个样本 快但不稳定
Mini-batch 每次一个batch 速度和稳定性平衡

5.2 自适应优化器

优化器 核心思想 特点
Momentum 加入惯性 加速收敛,减少震荡
RMSprop 自适应学习率 适合非平稳目标
Adam Momentum + RMSprop 最常用,默认选择
AdamW Adam + 权重衰减 更好的正则化

5.3 Adam优化器详解

Adam (Adaptive Moment Estimation)

  • 一阶矩估计(均值):$ m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t $
  • 二阶矩估计(未中心化方差):$ v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 $
  • 偏差校正后更新:$ \theta_{t+1} = \theta_t - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} $

推荐配置:

  • $ \alpha = 0.001 $(学习率)
  • $ \beta_1 = 0.9 $
  • $ \beta_2 = 0.999 $
  • $ \epsilon = 10^{-8} $

5.4 学习率调度

学习率衰减策略

# 1. 阶梯衰减
# 2. 指数衰减
# 3. 余弦退火
# 4. 循环学习率

第六部分:过拟合与正则化

6.1 神经网络的过拟合

原因

  • 模型参数远多于样本数
  • 训练时间过长
  • 网络结构过复杂

6.2 正则化方法

方法 原理 效果
L1/L2正则化 权重大小惩罚 防止权重过大
Dropout 随机丢弃神经元 集成效果
早停 验证集监控 防止过度训练
Batch Normalization 层间标准化 稳定训练
数据增强 增加训练样本 提高泛化

6.3 Dropout详解

原理:训练时以概率 ppp 随机丢弃神经元

效果

  • 防止神经元共适应
  • 相当于训练多个子网络的集成
  • Dropout比率通常取 0.2-0.5

6.4 Early Stopping

from sklearn.neural_network import MLPClassifier

# 使用早停
mlp = MLPClassifier(
    hidden_layer_sizes=(100, 50),
    early_stopping=True,
    validation_fraction=0.1,
    n_iter_no_change=10
)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐