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

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)

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

text 复制代码
输入层     隐藏层     输出层
   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))

其中 fff 和 ggg 是激活函数。

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+e−x1 σ(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+e−xex−e−x 1−tanh⁡2(x) 1 - \tanh^2(x) 1−tanh2(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的梯度消失问题

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

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

4.1 前向传播(Forward Propagation)

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

python 复制代码
# 单层前向传播
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+1⋅Wl+1T⊙σ′(zl)
  3. 计算梯度 ∂L∂Wl=al−1Tδl\frac{\partial L}{\partial W_l} = a_{l-1}^T \delta_l∂Wl∂L=al−1Tδl
  4. 更新参数 Wl:=Wl−α∂L∂WlW_l := W_l - \alpha \frac{\partial L}{\partial W_l}Wl:=Wl−α∂Wl∂L

4.3 反向传播示例(手算)

python 复制代码
# 简化示例:单隐藏层网络
# 输入: 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 学习率调度

学习率衰减策略

python 复制代码
# 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

python 复制代码
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
)
相关推荐
逻辑君1 小时前
认知神经科学研究报告【20260019】
人工智能·神经网络
sali-tec1 小时前
C# 基于OpenCv的视觉工作流-章59-九点标定
图像处理·人工智能·opencv·计算机视觉
2zcode1 小时前
基于MATLAB深度学习与传统机器学习的脑肿瘤MRI图像分类系统(GUI界面+数据集+训练代码)
深度学习·机器学习·matlab
GISer_Jing1 小时前
AI原生全栈架构理论体系:从分布式范式演进到全链路工程化理论基石
前端·人工智能·学习·ai编程
一只叫煤球的猫1 小时前
别再把 Codex 念成“Code-X”,全错了,AI编程英语发音纠正
人工智能·面试·程序员
GISer_Jing1 小时前
从“切图仔”到“增长架构师”:AI时代营销前端的范式革命
前端·人工智能·ai编程
lohiecan1 小时前
国产自研开源新语言|梦丘 MOS-LANG 重磅登场!深耕 AI 编程与嵌入式生态
人工智能·junit
一水鉴天1 小时前
从“AI内在机制探询”到“三重三九格人本主权智能体架构”的演进 之1 20260503 (腾讯元宝)
人工智能
Hello world.Joey1 小时前
OSTrack
人工智能·算法·目标检测·目标跟踪