Skip to content

02 - 神经网络

掌握深度学习核心技术与训练方法,从零构建神经网络。

模块概览

属性
前置要求01-机器学习基础, 线性代数, 微积分
学习时长3-4 周
Notebooks15+
难度⭐⭐⭐ 中级

学习目标

完成本模块后,你将能够:

  • ✅ 理解神经网络的数学原理和计算图
  • ✅ 手写实现前向传播和反向传播算法
  • ✅ 掌握各种激活函数的特性和选择策略
  • ✅ 熟练使用 SGD、Adam 等优化器
  • ✅ 应用 Dropout、BatchNorm 等正则化技术
  • ✅ 使用 Keras/PyTorch 构建自定义模型

子模块详解

01. 神经网络基础

理解神经网络的基本构成和工作原理。

主题内容关键概念
感知器单层神经元模型线性分类器
多层感知器MLP 架构通用近似定理
激活函数ReLU, Sigmoid, Tanh, GELU非线性变换
前向传播逐层计算输出计算图

激活函数对比

函数公式优点缺点
Sigmoidσ(x)=11+ex输出 (0,1)梯度消失
Tanhtanh(x)=exexex+ex零中心化梯度消失
ReLUmax(0,x)计算简单,缓解梯度消失Dead ReLU
GELUxΦ(x)平滑,Transformer 常用计算稍复杂

02. 反向传播算法

深度学习的核心训练算法。

链式法则

Lw=Lyyzzw

计算图示例

输入 x ──► 线性变换 z=Wx+b ──► 激活 a=σ(z) ──► 损失 L
                │                    │              │
                ▼                    ▼              ▼
           ∂L/∂W = ∂L/∂a · ∂a/∂z · ∂z/∂W

代码实现

python
class Layer:
    def forward(self, x):
        self.x = x
        self.z = np.dot(x, self.W) + self.b
        self.a = self.activation(self.z)
        return self.a

    def backward(self, grad_output):
        # 激活函数梯度
        grad_z = grad_output * self.activation_derivative(self.z)
        # 权重梯度
        self.grad_W = np.dot(self.x.T, grad_z)
        self.grad_b = np.sum(grad_z, axis=0)
        # 传递给上一层
        grad_input = np.dot(grad_z, self.W.T)
        return grad_input

03. 优化器

选择合适的优化算法加速训练。

优化器更新规则特点
SGDθ=θηL简单,需调学习率
Momentumv=γv+ηL加速收敛
Adam自适应学习率 + 动量最常用,鲁棒
AdamWAdam + 权重衰减解耦Transformer 首选

Adam 更新公式

mt=β1mt1+(1β1)gtvt=β2vt1+(1β2)gt2m^t=mt1β1t,v^t=vt1β2tθt=θt1ηv^t+ϵm^t

04. 正则化技术

防止过拟合,提升泛化能力。

技术原理使用场景
Dropout随机丢弃神经元全连接层
BatchNorm标准化中间层输出CNN, MLP
LayerNorm对单样本标准化Transformer
L2 正则化权重衰减所有模型

Dropout 实现

python
def dropout(x, p=0.5, training=True):
    if not training:
        return x
    mask = np.random.binomial(1, 1-p, size=x.shape) / (1-p)
    return x * mask

BatchNorm 公式

x^i=xiμBσB2+ϵyi=γx^i+β

05. 权重初始化

正确的初始化对训练至关重要。

方法公式适用激活函数
XavierWN(0,2nin+nout)Sigmoid, Tanh
HeWN(0,2nin)ReLU
Orthogonal正交矩阵RNN

06. 自定义模型 (Keras/PyTorch)

使用框架构建灵活的模型架构。

python
import tensorflow as tf
from tensorflow import keras

class CustomModel(keras.Model):
    def __init__(self, hidden_dim, num_classes):
        super().__init__()
        self.dense1 = keras.layers.Dense(hidden_dim, activation='relu')
        self.bn = keras.layers.BatchNormalization()
        self.dropout = keras.layers.Dropout(0.5)
        self.dense2 = keras.layers.Dense(num_classes)

    def call(self, x, training=False):
        x = self.dense1(x)
        x = self.bn(x, training=training)
        x = self.dropout(x, training=training)
        return self.dense2(x)
python
import torch
import torch.nn as nn

class CustomModel(nn.Module):
    def __init__(self, hidden_dim, num_classes):
        super().__init__()
        self.dense1 = nn.Linear(784, hidden_dim)
        self.bn = nn.BatchNorm1d(hidden_dim)
        self.dropout = nn.Dropout(0.5)
        self.dense2 = nn.Linear(hidden_dim, num_classes)

    def forward(self, x):
        x = torch.relu(self.dense1(x))
        x = self.bn(x)
        x = self.dropout(x)
        return self.dense2(x)

实验列表

实验内容文件
感知器实现从零实现感知器01_perceptron.ipynb
MLP 手写NumPy 实现多层感知器02_mlp_from_scratch.ipynb
反向传播手动计算梯度03_backpropagation.ipynb
优化器对比SGD vs Adam vs AdamW04_optimizers.ipynb
正则化实验Dropout, BatchNorm 效果05_regularization.ipynb
Keras 入门Sequential 和 Functional API06_keras_intro.ipynb
自定义层实现自定义 Layer07_custom_layers.ipynb
自定义训练自定义训练循环08_custom_training.ipynb

参考资源

教材

  • Goodfellow et al. (2016). Deep Learning - 在线阅读
  • Nielsen, M. (2015). Neural Networks and Deep Learning - 在线阅读

论文

  • Kingma & Ba (2014). Adam: A Method for Stochastic Optimization
  • Ioffe & Szegedy (2015). Batch Normalization
  • Srivastava et al. (2014). Dropout

视频课程

Released under the MIT License.