Day 7: 神经网络基础 - 深度学习的入门关键
导语:欢迎进入“60天算法工程师”计划的第二阶段——深度学习基础。在完成数学原理与传统机器学习内容的学习后,我们将从今天起正式迈入深度学习领域。
深度学习的核心在于利用多层神经网络自动从数据中提取特征表示(Representation)。作为该模块的第一课,本文将抛开复杂的结构细节,回归本质,深入探讨神经网络的基本构成单元:感知机、多层架构、激活函数、损失函数,以及支撑模型训练的核心机制——反向传播算法。
1. 感知机到多层网络的发展路径
1.1 感知机(Perceptron)
感知机由 Frank Rosenblatt 于1957年提出,是神经网络发展的起点,属于一种简单的线性二分类器。
其数学表达式为:
y = f(wTx + b)
其中,f 为阶跃函数(Step Function),用于输出类别判断。
局限性:感知机无法处理线性不可分问题,典型例子如“异或”(XOR)逻辑运算。这一缺陷曾导致神经网络研究陷入低谷,引发第一次发展寒冬。
nn.Module
1.2 多层感知机(MLP)
为了突破线性限制,引入了隐藏层和非线性激活函数,从而构建出多层感知机(Multi-Layer Perceptron, MLP)。
- 隐藏层的作用:将原始输入映射至更高维的空间,在新空间中实现线性可分。
- 非线性的必要性:若仅使用线性变换叠加,无论多少层,最终仍等价于单一线性变换(因矩阵乘法满足结合律)。
因此,激活函数赋予了网络拟合复杂非线性关系的能力,是深度模型有效工作的核心。
万能逼近定理(Universal Approximation Theorem)指出:只要隐层包含足够数量的神经元,一个单隐层前馈网络即可以任意精度逼近任意连续函数。
2. 常见激活函数详解
激活函数决定神经元是否响应当前输入信号。现代深度学习对不同任务采用不同的激活策略。
2.1 经典函数:Sigmoid 与 Tanh
Sigmoid 函数:
σ(x) = 1 / (1 + e-x)
输出范围为 (0, 1),常用于早期模型或二分类输出层。
缺点:
- 易造成梯度消失(最大导数仅为0.25);
- 输出非零中心,影响收敛速度;
- 涉及指数运算,计算成本较高。
Tanh 函数:
tanh(x) = (ex - e-x) / (ex + e-x)
输出区间为 (-1, 1),具备零中心特性。
优点:缓解了 Sigmoid 的部分问题。
缺点:在深层网络中依然存在梯度衰减现象。
2.2 主流选择:ReLU 及其变体
ReLU(Rectified Linear Unit):
f(x) = max(0, x)
优势:
- 计算高效;
- 正区间的梯度恒为1,有助于缓解梯度消失;
- 使部分神经元输出为0,带来天然稀疏性。
缺陷:负值区域梯度为0,可能导致“Dead ReLU”现象——某些神经元永久失效。
Leaky ReLU / PReLU:通过在负半轴赋予一个小斜率(例如0.01),避免神经元彻底“死亡”,提升鲁棒性。
2.3 新兴趋势:GELU 与 Swish
这些函数被广泛应用于当前主流大模型中,如 BERT、GPT 和 EfficientNet。
Swish:
f(x) = x · σ(βx)
由 Google 提出,具有平滑且非单调的特点,实验表现优于 ReLU。
GELU(Gaussian Error Linear Unit):
f(x) = xΦ(x),其中 Φ(x) 是标准正态分布的累积分布函数。
在 BERT 中首次大规模应用,不仅作为激活函数,还蕴含随机正则化思想(类似于 Dropout 的期望行为)。
特点:在 x=0 附近呈现平滑过渡,允许微小负值通过,增强表达能力。
| 激活函数 | 适用场景 | 备注 |
|---|---|---|
| Sigmoid | 二分类任务输出层 | 隐藏层已基本弃用 |
| ReLU | CNN、浅层MLP | 默认首选,效率高 |
| GELU | Transformer 架构(如BERT/GPT) | 大模型标配,性能更优 |
zero_grad()
3. 损失函数的设计原则
损失函数衡量预测结果与真实标签之间的差异,是优化过程的导向依据。
3.1 回归任务中的常用损失
MSE(L2 Loss):
(1/N) ∑(y - )2
均方误差,对异常值敏感,但处处可导,适合平滑优化。
MAE(L1 Loss):
(1/N) ∑|y - |
绝对误差,抗噪能力强,但在零点不可导。
Huber Loss:结合 MSE 与 MAE 的优点,在误差较小时采用平方形式,较大时转为线性,兼顾鲁棒性与可导性。
3.2 分类任务的关键指标:交叉熵损失
对于分类问题,尤其是多类别识别,交叉熵损失是最常用的优化目标。它基于概率分布的距离度量,能够有效驱动模型输出接近真实类别分布。
backward()损失函数表达式为:L = - \sum_{i} y_i \log(\hat{y}_i),该公式用于衡量真实概率分布与模型预测概率分布之间的差异,其本质来源于KL散度的数学推导。
根据任务类型的不同,交叉熵损失有以下两种常见形式:
- 二分类问题:采用二元交叉熵(Binary Cross Entropy, BCE)。
- 多分类问题:使用类别交叉熵(Categorical Cross Entropy)。
特殊场景优化:Focal Loss
在面对类别极度不平衡的问题时(例如目标检测中的前景与背景样本数量悬殊),标准交叉熵可能使模型偏向于易分类的样本。为此引入了Focal Loss,其核心思想是通过调节权重因子,降低易分类样本对梯度的贡献,从而使模型更加关注难分类样本。
Focal Loss 的数学表达式如下:
FL(p_t) = -\alpha_t (1-p_t)^\gamma \log(p_t)
其中,\alpha_t 和 \gamma 是可调超参数,分别用于平衡正负样本比例和控制难易样本的权重分配。
反向传播与计算图机制
深度神经网络能够高效训练的核心依赖于反向传播算法与计算图结构的结合。
计算图(Computational Graph)
神经网络的前向运算过程可以被表示为一个有向无环图(DAG):
- 节点:代表基本操作,如加法、乘法或激活函数等。
- 边:表示数据流动,即张量(Tensor)的传递路径。
链式法则(Chain Rule)
反向传播的本质是对复合函数求导过程中链式法则的递归应用。例如,若存在 y = f(u),且 u = g(x),则梯度可通过下式计算:
\frac{\partial y}{\partial x} = \frac{\partial y}{\partial u} \cdot \frac{\partial u}{\partial x}
自动微分(Autograd)
现代深度学习框架(如PyTorch和TensorFlow)均内置自动微分机制,无需手动推导梯度。
- 前向传播(Forward):执行计算并构建计算图,同时缓存中间结果以供后续使用。
- 反向传播(Backward):从损失值出发,沿计算图逆向遍历,逐层计算各参数的梯度。
代码实践:使用PyTorch实现简单MLP
以下是一个基于PyTorch的多层感知机(MLP)实现示例,用于拟合非线性函数关系(模拟 y = x^2)。
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
# 1. 准备数据 (模拟一个非线性关系 y = x^2)
x = torch.unsqueeze(torch.linspace(-1, 1, 200), dim=1) # shape=(200, 1)
y = x.pow(2) + 0.1 * torch.normal(torch.zeros(*x.size())) # 加入噪声
# 2. 定义 MLP 网络
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
# 隐藏层:输入1维 -> 隐藏10维
self.hidden = nn.Linear(1, 10)
# 激活函数:使用 ReLU
self.act = nn.ReLU()
# 输出层:隐藏10维 -> 输出1维
self.output = nn.Linear(10, 1)
def forward(self, x):
x = self.hidden(x)
x = self.act(x)
x = self.output(x)
return x
net = MLP()
print(net)
# 3. 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.1)
# 4. 训练循环
for t in range(2000):
prediction = net(x) # 前向传播
loss = criterion(prediction, y) # 计算 Loss
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播 (计算梯度)
optimizer.step() # 更新参数
if t % 200 == 0:
print(f'Step {t}, Loss: {loss.item():.4f}')
# 5. 简单验证
print(f"Final Loss: {loss.item():.4f}")
# Loss逐步下降,表明模型成功学习到了非线性映射关系
nn.Module
上述代码中,MLP继承自nn.Module类,这是所有神经网络模块的基类。
zero_grad():自动微分的魔法入口。
:必要的操作步骤。由于 PyTorch 默认会累积梯度(这有利于 RNN 等结构的操作),因此在每一次参数更新前,必须清空之前的梯度信息,以避免干扰当前的计算过程。
backward()
总结与下期预告
今天我们借助多层感知机(MLP)、激活函数以及反向传播机制,正式迈入了深度学习的世界。神经网络不再是一个难以理解的黑箱系统,而是由一系列线性变换和非线性激活函数组合而成的可解释模型,在微积分原理的引导下不断进行优化调整。
核心知识点回顾
- 为何需要非线性激活函数? —— 目的是使网络具备拟合复杂非线性函数的能力。
- Sigmoid 函数为何容易出现梯度消失? —— 其导数的最大值较小,且在输入过大或过小时两端趋于饱和,导致梯度极弱。
- GELU 与 ReLU 相比有何优势? —— 具备更好的平滑性,并可通过高斯随机变量的概率意义进行解释。
- 交叉熵与均方误差(MSE)的区别是什么? —— 前者适用于分类任务,强调概率分布之间的匹配;后者常用于回归问题,衡量预测值与真实值之间的距离。
下期内容抢先看
模型已经搭建完成,接下来的关键是如何高效地训练它——既快又稳。在 Day 8 中,我们将深入讲解:
- 优化器的工作原理(如 SGD、AdamW)
- 常用训练技巧的应用(包括 BatchNorm、Dropout 和学习率调度 LR Schedule)
这些内容是提升模型性能的核心手段,也是每一位深度学习实践者必须掌握的“内功心法”。


雷达卡


京公网安备 11010802022788号







