神经网络基础
深度学习的核心就是神经网络。这篇从感知机出发,讲清楚「数据怎么流动、误差怎么反传、参数怎么更新」——这三个问题搞懂了,就掌握了深度学习的骨架。
从感知机到多层网络
最简单的神经元(感知机)做一件事:线性加权求和,再套一个激活函数。
输入 x₁, x₂, x₃
↓ ↓ ↓ × 对应权重 w₁, w₂, w₃
└──┴──┘
求和 + 偏置 b
↓
激活函数 f(·)
↓
输出单个神经元只能做线性分类。把多个神经元堆成「层」,多层串联,就能拟合任意复杂的非线性关系——这就是多层感知机(MLP),也叫全连接网络。
层的角色:
- 输入层:接收原始特征,一一对应,不做计算。
- 隐藏层:做特征提取和变换,可以有多层。
- 输出层:分类任务通常接 Softmax 输出概率;回归任务直接线性输出。
激活函数
激活函数的作用是给网络引入非线性。没有它,多少层都等价于一个线性变换。
| 函数 | 公式 | 特点与用途 |
|---|---|---|
| ReLU | max(0, x) | 隐藏层默认首选;计算快,缓解梯度消失 |
| Sigmoid | 1/(1+e^-x) | 输出 0~1,二分类输出层用 |
| Softmax | e^xᵢ / Σe^xⱼ | 多分类输出层,输出加和为 1 的概率分布 |
| Tanh | (e^x - e^-x)/(e^x + e^-x) | 输出 -1~1,偶尔用于 RNN |
| GELU | 平滑版 ReLU | Transformer 隐藏层首选 |
前向传播与损失函数
数据从输入层逐层向前计算,得到预测值,这叫前向传播。然后用损失函数衡量预测值与真实值的差距:
- 交叉熵(Cross-Entropy):分类任务标准损失,惩罚把真实类别的概率预测低的情况。
- 均方误差(MSE):回归任务标准损失。
反向传播与梯度下降
训练就是「最小化 Loss」的过程。通过对 Loss 关于每个参数的偏导数(梯度),知道参数往哪个方向调整能让 Loss 减小。
反向传播就是用链式法则,从输出层往输入层逐层计算梯度,效率极高。框架(PyTorch、TensorFlow)自动完成这步,不需要手写。
梯度下降更新参数:
weight = weight - learning_rate × gradientlearning_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)都是为了让这个循环更稳、更快、效果更好。
最后更新于