深度学习基础回顾:神经网络核心概念、反向传播与梯度下降、常见激活函数与损失函数、过拟合与正则化
说实话,每次带新人入门深度学习转Agent这条路,我都会先让他们把这块基础夯扎实。为什么?因为后面所有的Agent决策、记忆模块、工具调用,底层都是这些老伙计在撑腰。我自己踩过的坑太多了——模型训不出来,十有八九是反向传播没搞明白;Agent乱说话,八成是损失函数选错了。好,咱们开始。
神经网络核心概念:从感知机到多层结构
神经网络说白了就是一个函数逼近器。你给它一堆输入,它试着学出一个映射关系,输出你想要的东西。
最基本的单元叫神经元。它干的事很简单:
- 接收多个输入信号
- 每个信号乘以一个权重
- 求和后加上偏置
- 扔进激活函数,输出结果
数学上就一行:output = activation(w·x + b)
多个神经元堆叠起来,就成了层。输入层、隐藏层、输出层,这就是经典的三层结构。我刚开始做项目时,总觉得层数越多越牛,结果模型过拟合得一塌糊涂。后来才明白——深度不是目的,表达能力才是。
核心要点:神经网络的本质是层级特征提取。浅层学边缘、纹理,深层学语义、概念。这个思想在Agent里同样适用——低层处理原始感知,高层做推理决策。
反向传播与梯度下降:训练的核心引擎
模型怎么学?靠两个东西:反向传播算梯度,梯度下降更新参数。
我习惯把反向传播理解成「责任追溯」。前向传播算出一个预测值,跟真实值一比,有误差。这个误差怎么分摊到每个权重头上?链式法则一路往回传,每个参数都拿到自己的「责任分数」——也就是梯度。
梯度下降就更直白了:沿着梯度的反方向走一小步,损失就能降一点。
# 伪代码,我当年手写BP时就这么干
for epoch in range(num_epochs):
# 前向传播
hidden = relu(X @ W1 + b1)
output = hidden @ W2 + b2
loss = mse_loss(output, y_true)
# 反向传播(链式法则)
grad_output = 2 * (output - y_true) / len(y_true)
grad_W2 = hidden.T @ grad_output
grad_hidden = grad_output @ W2.T * relu_derivative(hidden)
grad_W1 = X.T @ grad_hidden
# 梯度下降更新
W1 -= lr * grad_W1
W2 -= lr * grad_W2
这里有个坑——学习率。设大了震荡不收敛,设小了半天不动。我曾经在一个项目里调了三天学习率,最后发现用个学习率衰减或者Adam优化器就完事了。别死磕手动调参。
我的经验:新手可以先从Adam起步,lr设0.001,基本够用。等模型跑通了,再回头试试SGD+momentum,有时候泛化效果更好。
常见激活函数与损失函数
激活函数决定了一个神经元「要不要激活」。选错了,梯度消失、梯度爆炸就找上门了。
| 激活函数 | 公式 | 优点 | 缺点 |
|---|---|---|---|
| Sigmoid | 1/(1+e⁻ˣ) | 输出在0~1,适合二分类 | 梯度饱和,容易消失 |
| Tanh | (eˣ-e⁻ˣ)/(eˣ+e⁻ˣ) | 零中心,比Sigmoid好 | 仍有梯度饱和 |
| ReLU | max(0, x) | 计算快,缓解梯度消失 | 神经元死亡(负半轴梯度为0) |
| Leaky ReLU | max(αx, x) | 解决神经元死亡 | α需要调参 |
我个人习惯:隐藏层无脑用ReLU,输出层根据任务选。分类用Softmax,回归用线性激活。
损失函数呢?它定义了「模型错得有多离谱」。
- 均方误差(MSE):回归任务标配。注意它对异常值敏感。
- 交叉熵损失:分类任务首选。配合Softmax,梯度更稳。
- Huber损失:MSE和MAE的折中。我在处理带噪声的数据时常用。
避坑指南:我曾经在分类任务里用了MSE,结果模型死活不收敛。为什么?MSE对概率输出的梯度太弱了,交叉熵才是正解。记住——分类用交叉熵,回归用MSE,别混。
过拟合与正则化
过拟合,说白了就是模型把训练数据背下来了,但没学会规律。测试集上一跑就露馅。
怎么判断?训练损失一直降,验证损失开始反弹——这就是过拟合的典型信号。
我常用的正则化手段有这几个:
- L1/L2正则化:在损失函数里加一个惩罚项。L1让权重稀疏,L2让权重变小。我一般优先用L2。
- Dropout:训练时随机「掐掉」一部分神经元。相当于每次训练一个子网络,最后集成。我习惯设0.5,效果不错。
- 早停(Early Stopping):验证损失连续N轮不降就停。简单粗暴,但很有效。
- 数据增强:图片翻转、裁剪、加噪声。数据多了,过拟合自然就少了。
# 我常用的早停实现
best_loss = float('inf')
patience = 10
counter = 0
for epoch in range(epochs):
train_loss = train_one_epoch(model, train_loader)
val_loss = validate(model, val_loader)
if val_loss < best_loss:
best_loss = val_loss
counter = 0
torch.save(model.state_dict(), 'best_model.pth')
else:
counter += 1
if counter >= patience:
print(f'早停!第{epoch}轮验证损失不再下降')
break
一个小技巧:如果你发现模型在训练集上准确率99%,测试集上只有70%,先别急着加正则化。检查一下数据有没有泄露,或者标签是不是错了。我遇到过好几次,根本不是过拟合,是数据有问题。
本章知识体系总览
下面这张图,是我自己梳理的深度学习基础核心逻辑。你把它刻在脑子里,后面学Agent会顺很多。
嗯,这一章的内容就到这。你把这些概念吃透了,后面学Agent的规划、记忆、工具调用,会发现很多地方都在用同样的思路——前向推理、反向优化、防止过拟合。说白了,深度学习就是Agent的「底层操作系统」。