深度学习篇---前馈神经网络

📅 发布时间:2026/7/9 21:57:17 👁️ 浏览次数:
深度学习篇---前馈神经网络
一、什么是前馈神经网络从一个生活故事讲起1.1 先讲个故事一个公司的三层架构想象你开了一家信息处理公司公司有三层架构第一层前台接待输入层收到各种原始信息电话、邮件、文件不做处理只负责传递给下一层第二层中层经理隐藏层分析、整理、加工信息提取重点过滤噪音做出初步判断第三层老板决策输出层接收中层处理后的信息做出最终决策输出结果信息流动只有一种方向从前到后绝不回头这就是前馈神经网络的基本思想信息只能向前流动不能向后回流就像公司里的汇报流程下级只能向上级汇报不能反向指挥。1.2 为什么叫前馈前信息从输入层流向输出层一路向前馈传递、馈送信息神经网络模仿人脑神经元的结构通俗理解就像一条单向行驶的高速公路信息从入口进入经过多个服务区隐藏层处理最后从出口离开。1.3 在Transformer中的角色Transformer中的前馈网络不是独立的模型而是镶嵌在编码器和解码器中的信息加工厂注意力层输出 → 前馈网络 → 进一步加工 → 输出给下一层如果说注意力机制是让词与词之间交流信息那么前馈网络就是让每个词对自己收到的信息进行深度思考。二、前馈网络的结构乐高积木的搭建2.1 最简单的结构三层乐高Transformer中的前馈网络是一个两层全连接网络输入 (512维) ↓ [第一层线性变换] ↓ [激活函数 ReLU] ↓ [第二层线性变换] ↓ 输出 (512维)就像搭乐高第一块积木把512个点变成2048个点升维第二块积木做非线性变换ReLU激活第三块积木把2048个点变回512个点降维2.2 数学公式FFN(x) max(0, xW₁ b₁)W₂ b₂拆解公式第一层线性变换xW₁ b₁x输入向量512维W₁权重矩阵512×2048b₁偏置2048维结果2048维向量ReLU激活函数max(0, ...)把负数变成0正数保留引入非线性第二层线性变换(...)W₂ b₂W₂权重矩阵2048×512b₂偏置512维结果512维向量2.3 维度变化的直观理解打个比方信息压缩与扩展想象你要整理一份报告升维512 → 2048就像把一份简短的摘要扩展成详细的论述每个要点都展开加入更多细节信息更丰富但更占空间非线性变换ReLU就像筛选有用的信息扔掉废话负数可能是不重要信息被清除正数重要信息保留并放大降维2048 → 512就像把详细的论述重新提炼成精华保留最重要的信息回到原来的格式方便后续处理三、一个具体的数值例子3.1 简化版计算为了便于理解我们用极小维度演示假设输入维度 3实际是512隐藏层维度 5实际是2048输出维度 3输入向量x [1.0, -2.0, 3.0]第一层线性变换随机初始化W₁和b₁W₁ [ [0.1, 0.2, 0.3, 0.4, 0.5], [0.6, 0.7, 0.8, 0.9, 1.0], [1.1, 1.2, 1.3, 1.4, 1.5] ] # 3×5矩阵 b₁ [0.1, 0.1, 0.1, 0.1, 0.1] 计算 h xW₁ b₁ h₁ 1.0×0.1 (-2.0)×0.6 3.0×1.1 0.1 0.1 -1.2 3.3 0.1 2.3 h₂ 1.0×0.2 (-2.0)×0.7 3.0×1.2 0.1 0.2 -1.4 3.6 0.1 2.5 h₃ 1.0×0.3 (-2.0)×0.8 3.0×1.3 0.1 0.3 -1.6 3.9 0.1 2.7 h₄ 1.0×0.4 (-2.0)×0.9 3.0×1.4 0.1 0.4 -1.8 4.2 0.1 2.9 h₅ 1.0×0.5 (-2.0)×1.0 3.0×1.5 0.1 0.5 -2.0 4.5 0.1 3.1 h [2.3, 2.5, 2.7, 2.9, 3.1] # 全是正数ReLU激活ReLU(h) [2.3, 2.5, 2.7, 2.9, 3.1] # 全是正数不变如果h中有负数比如 [-1, 2, -3, 4]ReLU后会变成 [0, 2, 0, 4]。第二层线性变换W₂ [ [0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [1.0, 1.1, 1.2], [1.3, 1.4, 1.5] ] # 5×3矩阵 b₂ [0.1, 0.1, 0.1] 计算 y ReLU(h)W₂ b₂ y₁ 2.3×0.1 2.5×0.4 2.7×0.7 2.9×1.0 3.1×1.3 0.1 0.23 1.0 1.89 2.9 4.03 0.1 10.15 y₂ 2.3×0.2 2.5×0.5 2.7×0.8 2.9×1.1 3.1×1.4 0.1 0.46 1.25 2.16 3.19 4.34 0.1 11.5 y₃ 2.3×0.3 2.5×0.6 2.7×0.9 2.9×1.2 3.1×1.5 0.1 0.69 1.5 2.43 3.48 4.65 0.1 12.85 输出 y [10.15, 11.5, 12.85]最终输入 [1, -2, 3] 变成了 [10.15, 11.5, 12.85]完成了信息的加工。3.2 实际Transformer中的规模在真实的Transformer中输入维度512隐藏层维度2048是输入的4倍参数量512×2048 2048×512 ≈ 200万个参数为什么这么大因为前馈网络要足够强大才能对注意力层输出的丰富信息进行充分加工。四、为什么需要前馈网络它做什么4.1 作用1引入非线性问题如果没有非线性激活函数两层线性变换可以合并成一层y (xW₁ b₁)W₂ b₂ x(W₁W₂) (b₁W₂ b₂)这就失去了深度的意义解决方案ReLU激活函数引入非线性y max(0, xW₁ b₁)W₂ b₂打个比方线性变换只能做加减乘除像算盘非线性能做判断、分类像人脑4.2 作用2增加模型容量问题注意力机制虽然强大但主要是做信息聚合表达能力有限。解决方案前馈网络提供额外的处理能力打个比方注意力层像开会讨论大家交流信息前馈网络像会后每个人独立思考形成自己的见解4.3 作用3特征变换问题注意力层输出的信息还需要进一步加工才能被下一层使用。解决方案前馈网络对每个位置独立进行特征变换打个比方原始信息一堆原材料前馈网络加工厂把原材料变成半成品输出更方便下一层使用的格式4.4 作用4维度扩展提供工作空间为什么要把维度扩大4倍想象你在整理一个复杂问题原始维度512就像一张A4纸空间有限扩展2048就像给你一张A0大纸可以尽情展开思路再降回512就像把思路重新整理提炼精华这就是拓宽再压缩的设计思想五、ReLU激活函数的秘密5.1 什么是ReLUReLURectified Linear Unit修正线性单元是最简单的激活函数ReLU(x) max(0, x)图像理解x 0输出 x直线yxx ≤ 0输出 0贴在x轴上5.2 为什么用ReLU而不是其他函数优点1计算简单只需要比较和取最大值没有复杂的指数运算如sigmoid、tanh速度快适合大规模计算优点2缓解梯度消失x 0时梯度为1不会像sigmoid那样梯度越来越小深层网络也能有效训练优点3产生稀疏性负值全变成0相当于关闭一些神经元网络更稀疏效率更高类似人脑不是所有神经元都激活打个比方sigmoid/tanh像温水煮青蛙慢慢变化ReLU像开关要么开正数要么关05.3 ReLU的缺点缺点死亡ReLU问题如果梯度太大权重更新后某个神经元永远输出负数一旦变成负数ReLU输出0梯度也是0这个神经元就死了再也不会激活解决方案用Leaky ReLUmax(0.01x, x)让负数也有小梯度用GELUGPT用更平滑的ReLU变体六、前馈网络在Transformer中的位置6.1 整体位置编码器层 输入 → [多头注意力] → [残差连接] → [层归一化] → [前馈网络] → [残差连接] → [层归一化] → 输出 解码器层 输入 → [掩码多头注意力] → [残差连接] → [层归一化] → [交叉注意力] → [残差连接] → [层归一化] → [前馈网络] → [残差连接] → [层归一化] → 输出6.2 Position-wise的含义前馈网络的一个关键特性Position-wise逐位置意思是对序列中的每个位置应用同一个前馈网络句子我 爱 你 位置1我 → FFN → 我的新表示 位置2爱 → FFN → 爱的新表示 位置3你 → FFN → 你的新表示 同一个FFN分别处理三个位置打个比方就像三个学生三个位置做同一套练习题同一个FFN每个学生独立完成互不干扰做完后每个人都得到了提升6.3 为什么是Position-wise原因1参数共享所有位置用同一组参数参数量固定不随序列长度变化模型更高效原因2保持位置独立性每个位置独立处理位置间的交互已经由注意力完成分工明确注意力负责交流FFN负责思考原因3可处理任意长度因为参数共享可以处理任意长的序列训练时见过512测试时1000也能处理七、前馈网络的变体7.1 不同激活函数GELUGPT用GELU(x) x × Φ(x) # Φ是标准正态分布的累积分布函数更平滑效果更好但计算稍复杂。Swish / SiLUSwish(x) x × sigmoid(x)同样平滑在某些任务上表现更好。7.2 不同维度比例原始Transformer4倍512→2048平衡了表达能力和计算量一些变体小模型可能用2倍或3倍大模型可能用4倍或更大GPT-312288维4倍到491527.3 GLU变体GLUGated Linear UnitFFN_GLU(x) (xW₁ b₁) ⊗ σ(xV c) W₂ b₂引入门控机制类似LSTM效果更好但参数量翻倍。八、前馈网络的总结框图框图解读上部分内部结构输入512维 → 升维到2048 → ReLU激活 → 降维回512 → 输出两层线性变换加一层激活函数中部分Position-wise处理同一个FFN处理所有位置每个位置独立计算输出每个位置的新表示下部分维度变化512维信息浓缩2048维信息展开工作空间ReLU筛选有用信息512维重新提炼精华九、常见问题解答9.1 为什么是两层不是一层或三层一层不够一层线性变换只能做线性变换表达能力有限没有非线性深度无意义三层可能多余实践证明两层非线性已经足够强大更多层会增加计算量收益不大9.2 为什么隐藏层比输入层大4倍经验值4倍是经过实验验证的黄金比例太小表达能力不足太大计算量太大收益递减理论解释需要足够的工作空间来处理信息类似于SVM的核技巧在高维空间更容易找到分类面9.3 前馈网络和注意力机制的区别维度注意力机制前馈网络作用信息交流信息加工范围跨位置单位置输入所有位置单个位置输出融合上下文的信息独立处理后的信息类比开会讨论会后思考9.4 前馈网络可以去掉吗理论上可以但效果会大幅下降模型容量变小非线性表达能力减弱Transformer变成瘦高个能力受限十、总结前馈网络是什么前馈网络是Transformer中的信息加工厂对每个位置独立进行非线性变换增强模型的表达能力。核心结构升维512 → 2048提供工作空间激活ReLU引入非线性降维2048 → 512提炼精华为什么重要引入非线性让模型能做复杂判断增加容量提供额外的处理能力特征变换把信息加工成更好用的形式独立思考让每个位置有自己的见解在Transformer中的角色位置每个编码器/解码器层都有方式Position-wise独立处理每个位置配合与注意力机制分工合作生活中的类比前馈网络就像是一个个人思考时间注意力机制团队开会交流信息前馈网络散会后每个人独立思考消化吸收两者结合既有集体智慧又有个人见解一句话总结前馈网络是Transformer的思考器官让每个词在听完别人的观点后注意力都能静下心来独立思考形成自己的见解