跳至内容

神经网络基础

深度学习的核心就是神经网络。这篇从感知机出发,讲清楚「数据怎么流动、误差怎么反传、参数怎么更新」——这三个问题搞懂了,就掌握了深度学习的骨架。

从感知机到多层网络

最简单的神经元(感知机)做一件事:线性加权求和,再套一个激活函数

输入 x₁, x₂, x₃
    ↓  ↓  ↓   × 对应权重 w₁, w₂, w₃
    └──┴──┘
      求和 + 偏置 b
    激活函数 f(·)
       输出

单个神经元只能做线性分类。把多个神经元堆成「层」,多层串联,就能拟合任意复杂的非线性关系——这就是多层感知机(MLP),也叫全连接网络。

层的角色:

  • 输入层:接收原始特征,一一对应,不做计算。
  • 隐藏层:做特征提取和变换,可以有多层。
  • 输出层:分类任务通常接 Softmax 输出概率;回归任务直接线性输出。

激活函数

激活函数的作用是给网络引入非线性。没有它,多少层都等价于一个线性变换。

函数公式特点与用途
ReLUmax(0, x)隐藏层默认首选;计算快,缓解梯度消失
Sigmoid1/(1+e^-x)输出 0~1,二分类输出层用
Softmaxe^xᵢ / Σe^xⱼ多分类输出层,输出加和为 1 的概率分布
Tanh(e^x - e^-x)/(e^x + e^-x)输出 -1~1,偶尔用于 RNN
GELU平滑版 ReLUTransformer 隐藏层首选

前向传播与损失函数

数据从输入层逐层向前计算,得到预测值,这叫前向传播。然后用损失函数衡量预测值与真实值的差距:

  • 交叉熵(Cross-Entropy):分类任务标准损失,惩罚把真实类别的概率预测低的情况。
  • 均方误差(MSE):回归任务标准损失。

反向传播与梯度下降

训练就是「最小化 Loss」的过程。通过对 Loss 关于每个参数的偏导数(梯度),知道参数往哪个方向调整能让 Loss 减小。

反向传播就是用链式法则,从输出层往输入层逐层计算梯度,效率极高。框架(PyTorch、TensorFlow)自动完成这步,不需要手写。

梯度下降更新参数:

weight = weight - learning_rate × gradient
  • learning_rate(学习率)控制每步走多大。太大会震荡,太小收敛慢。
  • Adam 优化器是目前默认首选,自适应调整各参数学习率,比基础 SGD 稳定。

批归一化与 Dropout

这两个技巧解决深网络训练的稳定性和过拟合问题。

  • 批归一化(Batch Normalization):把每层的输出归一化到均值 0、方差 1,加速收敛,让网络对初始化不那么敏感。通常加在激活函数之前。
  • Dropout:训练时随机「丢弃」一部分神经元(置为 0),强迫其他神经元学会独立表征,减少过拟合。预测时关闭 Dropout(用全部神经元)。

用 PyTorch 写一个两层分类网络

import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset

# 定义网络结构
class MLP(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_classes):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(input_dim, hidden_dim),
            nn.BatchNorm1d(hidden_dim),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(hidden_dim, num_classes),
        )

    def forward(self, x):
        return self.net(x)


# 训练循环
def train(model, loader, optimizer, criterion, device):
    model.train()
    for X_batch, y_batch in loader:
        X_batch, y_batch = X_batch.to(device), y_batch.to(device)
        optimizer.zero_grad()
        loss = criterion(model(X_batch), y_batch)
        loss.backward()     # 反向传播:自动计算梯度
        optimizer.step()    # 梯度下降:更新参数


device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model     = MLP(input_dim=30, hidden_dim=128, num_classes=2).to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()

# 假设 X_train / y_train 已是 Tensor
loader = DataLoader(TensorDataset(X_train, y_train), batch_size=64, shuffle=True)
for epoch in range(20):
    train(model, loader, optimizer, criterion, device)
optimizer.zero_grad()loss.backward()optimizer.step() 是 PyTorch 训练的标准三部曲,顺序不可颠倒。忘记 zero_grad() 会导致梯度累积,结果异常。

框架选择

  • PyTorch:学术界主流,动态图调试友好,研究和生产均大量使用。入门首选。
  • TensorFlow / Keras:Google 维护,生产部署生态成熟,Keras API 简洁。
  • 两者核心概念完全相通,会了一个切换另一个成本很低。

一句话小结

神经网络 = 前向传播得预测值 + 损失函数量化误差 + 反向传播算梯度 + 梯度下降更新参数,循环迭代直到收敛。其余技巧(BatchNorm、Dropout、Adam)都是为了让这个循环更稳、更快、效果更好。

最后更新于