前向 & 反向传播篇
神经网络能"学习",靠的是两个动作反复交替:前向传播算出答案,反向传播算清责任。前者像考试,后者像批卷;一次考试 + 一次批卷,就叫做"训练一步"。上万亿次这种交替,就是 GPT 的训练全过程。
你第一次做红烧肉,凭感觉放糖、放酱油、放黄酒——端上桌,一家人各自打分:爸说"甜了",妈说"色浅了",你尝完自己也觉得"酒味太冲"。
第二次,你根据大家的反馈微调:少一勺糖、多半勺老抽、少倒点黄酒——再上桌,评价就好一些。
第三次、第十次……每一次你都是"先做菜 → 尝一尝 → 挨骂 → 改方子"。做菜的动作就是前向传播,"根据挨骂调方子"就是反向传播。神经网络学东西的方式,跟你练红烧肉一模一样。
前向传播:数据像水一样从左向右流
前向传播(Forward Propagation)是神经网络的"正向计算"过程:你把输入(比如一张图、一句话)从最左边灌进去,它一层一层往右传——每一层的所有神经元都做一遍"加权求和 + 激活函数",把这一层的输出扔给下一层。就像水流经一串水磨,一层磨一层磨,最后从右侧流出一个结果——比如"这张图片有 87% 的概率是猫"。
前向的每一步都清晰、单向、不回头。这个过程不会改变任何权重——它只是"用当前的参数算一遍答案"。
前向传播就像工厂流水线:原材料(输入)从这头进,经过冲压、焊接、喷漆、组装……每道工序(每一层神经元)都在半成品上加工一次,从那头出来的就是成品(模型的预测)。每道工序的机器(权重)是固定的——流水线开动时不许调机器。要改机器,得等下一步"反向"环节。
损失函数:一把量差距的尺子
前向传出结果之后,我们要问一句:"这答案跟标准答案差多少?" 这就是损失函数(Loss Function)要干的事。它把"模型说的"和"真实标签"做对比,输出一个数字——数字越小说明越准,越大说明越离谱。
比如分类任务里常用"交叉熵损失",回归任务里常用"均方误差"。你可以把它想成菜端上桌之后一家人打的总分——0 分是完美复刻大厨,100 分是被扔了。整个训练的唯一目标,就是想尽办法让这个损失数字降下来。
反向传播:把责任按贡献分摊回去
反向传播(Backpropagation,简称 BP)是深度学习的"灵魂算法"。它做的事情听起来很难,但道理很朴素:既然结果错了,就得沿着来时路,一层一层往回追问——"这一层的每个权重,各自对最终错误负多少责任?" 谁责任大,就多调它一点;谁基本没参与,就少动或不动。
数学上,这靠的是"链式法则"——把最终的损失,对每个权重求"偏导数"。导数就是"这个权重变一点点,损失会跟着变多少"的斜率。斜率大的权重就是"祸首",斜率小的就是"路人"。
反向传播就是一场逆向复盘会:项目失败了(损失很高),项目经理不能只骂最后一个交付的人——他得从终点回溯:这次交付出错,是因为上一环节没接好;上一环节没接好,是因为再上一环节的输入就是错的……一层层追责,直到找到源头。每个环节该承担多少改进量,都算得清清楚楚。神经网络就靠这套自动复盘机制,让百亿参数各自认领自己那一份责任。
梯度下降:顺着斜坡走下山
反向传播算出了"每个权重的责任"(也叫梯度),接下来就要用它去修正权重。修正规则叫梯度下降(Gradient Descent):权重 = 原权重 − 学习率 × 梯度。
你可以把损失函数想象成一片山地:模型现在站在山上某个位置,梯度就是"最陡下坡方向的箭头"。你顺着箭头走一小步("一小步"的大小由"学习率"决定),就离山谷(损失最小值)更近一点。走几百万步之后,模型基本就落到山谷里了——这时候各种权重的组合,就是训练出来的"聪明模型"。
前向 + 反向 = 一次完整训练迭代
- Step 1 · 前向拿一批样本,从输入层算到输出层,得到预测。
- Step 2 · 算损失用损失函数比较预测和真实标签,得到一个数字。
- Step 3 · 反向用链式法则,把损失对每个权重的梯度都算出来。
- Step 4 · 更新用梯度下降规则,把每个权重减去"学习率 × 梯度"。
- Step 5 · 回到 Step 1下一批样本进来,再走一遍——直到损失不再下降。
学习率:走多大一步是门艺术
学习率(learning rate)这个数字看着不起眼,其实是训练里最难调的超参数之一。步子太大——每次跨过山谷两侧,永远不落底,甚至越训越糟("发散");步子太小——训练龟速,几天几夜都下不了山。
实践中人们会用"学习率衰减"、"Adam / AdamW 优化器"之类的技巧,让开头步子大、后面步子小——粗调加精调结合。你写代码调不好,往往就是这个数字设得离谱。
为什么反向传播是"神来一笔"
1986 年之前的神经网络训练极其低效——人们不知道怎么高效地把误差摊回去。Rumelhart、Hinton 等人把链式法则用到神经网络上,让一次反向计算就能同时算出所有权重的梯度,算力复杂度和一次前向相当。这一下把"训练百亿参数"从纸面变成工程可行。可以说,没有反向传播,就没有今天的深度学习——就像没有蒸汽机就没有工业革命一样重要。
批量、随机、小批量——三种下山姿势
梯度下降真正在工程里落地时,有三种玩法:批量梯度下降(Batch GD)——每一步都用整个数据集算梯度,稳但极慢,几百万条数据算一次就要跑半天;随机梯度下降(SGD)——每次只用一条样本算梯度,快但抖,像在山坡上边喝酒边走路;小批量梯度下降(Mini-batch GD)——每次用几十上百条,兼顾稳定和速度,是今天的标配。
再往上走,就是 Adam、AdamW、Adagrad 这些"聪明版优化器"——它们不但看当前梯度,还看历史梯度的动量、每个参数的自适应学习率,让下山过程更聪明。同一个模型,只换一个优化器,训练结果可能天差地别——这是深度学习工程里非常见的"魔法"。
梯度消失与梯度爆炸:反向传播的黑历史
反向传播的思想虽然简单,但工程上曾经栽过大跟头。当神经网络堆到几十层时,反向传播的梯度沿着链式法则一层层相乘——每一层都乘一个小于 1 的数,几十层乘完,梯度几乎变成 0,前面几层的权重根本更新不动,这叫梯度消失;反之,如果每层都乘一个大于 1 的数,梯度就会指数级放大,训练直接飞了,这叫梯度爆炸。
这个问题让 1990 年代到 2006 年间的深度网络训练几乎是"不可能任务"。后来靠着 ReLU 激活函数、Batch Normalization、残差连接(ResNet)、更好的初始化方案(Xavier / He),才把这两个魔咒基本解掉。今天你能训练 175B 参数的 GPT-3,背后是几十年间无数工程师和研究员在跟这两个魔咒搏斗积累下的经验。
训练完之后,权重就"冻结"了
很多人以为模型上线之后还会继续学习——其实不然。训练和推理是深度学习里两个截然分开的阶段:训练时,前向 + 反向 + 更新三步循环几百万次,把权重调到位;训练完成后,模型被"打包"存起来,所有权重固定不变;推理时,只做前向传播——你输一个问题,它算一遍答案,权重丝毫不动。
这就是为什么 ChatGPT 不会因为你今天骂了它就"记仇"——它每次对话都是从冻结的权重开始跑的。它有的只是"上下文窗口"内的短期对话记忆,一旦对话结束、窗口关闭,什么都不会留下。想要模型真的"学新东西",就得单独走一遍"微调"(fine-tune)——本质上是让训练循环再跑一次,用新数据把权重再微调一下。前向 = 使用;反向 = 学习——两个阶段泾渭分明。
过拟合:反向传播太"卷"的后遗症
反向传播这么高效,反而带来一个副作用——模型可能会把训练数据"背下来",包括数据里的噪声和偶然性——这就叫过拟合(overfitting)。表现是训练集上准确率 99%,一到测试集就掉到 60%。
工程上的对抗招式很多:早停(early stopping)——一发现验证集损失开始上升就停训;Dropout——训练时随机让一部分神经元罢工,防止过度依赖某几个;权重衰减(weight decay)——给损失函数加个惩罚项,逼权重别长太大;数据增强——让训练数据更多样。这些技巧本质都是在"给反向传播打拳击手套"——让它别把训练数据咬得太死。
前向 = 用当前参数算答案;反向 = 用误差回溯,给每个参数分摊责任并修正。训练一个神经网络,就是让它做上亿次"考试 → 批卷 → 改题"的循环。理解了这两个动作,你就理解了 GPT、Sora、AlphaGo 是怎么"从随机瞎猜"训练成"世界高手"的——它们没有什么魔法,就是循环得比你多、算得比你快而已。