model
log2feats
-
seqs *= self.item_emb.embedding_dim**0.5嵌入尺度缩放
X=X×DX = X \times \sqrt{D}X=X×D-
维持词表权重与位置编码 的"量级平衡":如果直接把两者相加,模型在训练初期会严重跑偏,误以为"位置"决定了一切。在 attention is all u need中

-
防止后续计算中的点积注意力(Attention)饱和:Attention(Q,K,V)=Softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=Softmax(dk QKT)V乘以 D\sqrt{D}D 之后:输入的词向量方差达到标准的 1。进入注意力机制计算点积时,其方差会扩大为 DDD,然后通过公式里的除以 dk\sqrt{d_k}dk 完美对冲,重新让注意力的方差回到 1。这样,Softmax 就能输出高低分明、松紧度恰到好处的平滑概率分布,既不会梯度消失(Softmax 饱和),也不会由于信息太平均而失去聚焦能力。
-
-
attention_mask = attention_mask_tril.unsqueeze(0) & attention_mask_pad.unsqueeze(1)
在工业级推荐系统的长序列建模中,面临着"时间线标签泄露"与"短序列填充信息污染"的双重挑战。attention_mask_tril 将全true矩阵右上三角区域强行抹除为 False,建立严格的时间单向可见性约束,确保模型在提取任何时刻的用户兴趣表征时,只能聚合当前及过去的行为。attention_mask_pad则可以识别出序列中哪些地方是真正的用户行为数据,避免填充信息污染。 -
Pre-LN(层归一化在前):GPT-4,LLaMa,HSTU
彻底解决梯度消失 问题
求导Si+1=Si+MHA(LN(Si))+FFN(LN(Si+MHA(LN(Si))))S_{i+1} = S_i + \text{MHA}(\text{LN}(S_i)) + \text{FFN}(\text{LN}(S_i + \text{MHA}(\text{LN}(S_i))))Si+1=Si+MHA(LN(Si))+FFN(LN(Si+MHA(LN(Si))))
下一层的 seqs 就是前一层的 seqs 直接加上一堆残差增量,直接求导。
∂Si+1∂Si=∂Si∂Si+∂MHA(... )∂Si+∂FFN(... )∂Si\frac{\partial S_{i+1}}{\partial S_i} = \frac{\partial S_i}{\partial S_i} + \frac{\partial \text{MHA}(\dots)}{\partial S_i} + \frac{\partial \text{FFN}(\dots)}{\partial S_i}∂Si∂Si+1=∂Si∂Si+∂Si∂MHA(...)+∂Si∂FFN(...)
由于第一项 ∂Si∂Si\frac{\partial S_i}{\partial S_i}∂Si∂Si 恒等于 111,两层之间的导数结果为:∂Si+1∂Si=1+(包含 MHA 和 FFN 的那一堆复杂导数)\frac{\partial S_{i+1}}{\partial S_i} = 1 + \text{(包含 MHA 和 FFN 的那一堆复杂导数)}∂Si∂Si+1=1+(包含 MHA 和 FFN 的那一堆复杂导数)
网络n层,链式法则连乘
∂S最后一层∂S第一层=∂Sn∂Sn−1×⋯×∂Si+1∂Si×⋯×∂S2∂S1\frac{\partial S_{\text{最后一层}}}{\partial S_{\text{第一层}}} = \frac{\partial S_n}{\partial S_{n-1}} \times \dots \times \frac{\partial S_{i+1}}{\partial S_i} \times \dots \times \frac{\partial S_2}{\partial S_1}∂S第一层∂S最后一层=∂Sn−1∂Sn×⋯×∂Si∂Si+1×⋯×∂S1∂S2=(1+Δn)×⋯×(1+Δi+1)×⋯×(1+Δ2)\quad = (1 + \Delta_n) \times \dots \times (1 + \Delta_{i+1}) \times \dots \times (1 + \Delta_2)=(1+Δn)×⋯×(1+Δi+1)×⋯×(1+Δ2)把这一大串括号全部乘开(展开)之后,数学上必定会剥离出一项孤零零的:1×1×⋯×1=11 \times 1 \times \dots \times 1 = 11×1×⋯×1=1。也就是说:∂S最后一层∂S第一层=1+(其他所有复杂的交叉项)\frac{\partial S_{\text{最后一层}}}{\partial S_{\text{第一层}}} = 1 + \text{(其他所有复杂的交叉项)}∂S第一层∂S最后一层=1+(其他所有复杂的交叉项)
解决梯度消失 :所有的 MHA 和 FFN 都是以增量(残差)的形式横向加在主干上,且它们内部的 LN 绝不拦截主干本身。哪怕后面那堆复杂的交叉项因为网络太深、激活函数饱和而全部衰减变成了 000,总梯度依然能通过这个保底的 111,把最后一层的信号稳稳当当地送回第一层。
讲一讲残差设计和 Pre-LN 的优势
每一层的更新语句都是 seqs = seqs + mha_outputs。在反向传播时,根据多元微积分的链式法则,由于 seqs 是直接与外部进行元素级相加,它对上一层 seqs 的偏导数恒等于 111。并且由于 LayerNorm(attention_layernorms)是被包裹在子层内部(Pre-LN 架构),这就导致整个深层网络存在一条由加号拓扑出的**'全等映射主干道(Identity Path)'**。最后一层的初始梯度可以不受任何 LayerNorm 函数的稀释和惩罚,无损地通过这条全等通路直达最底层的 Embedding 层。这使得我们即使面对大促期间极其复杂的长行为序列、堆叠很深的注意力层时,网络也能展现出惊人的训练稳定性,收敛速度极快。" -
Post-LN 层归一化在后:最初版Transformer
Si+1=LN(LN(Si+MHA(Si))+FFN(LN(Si+MHA(Si))))S_{i+1} = \text{LN}\bigg( \text{LN}\big(S_i + \text{MHA}(S_i)\big) + \text{FFN}\Big(\text{LN}\big(S_i + \text{MHA}(S_i)\big)\Big) \bigg)Si+1=LN(LN(Si+MHA(Si))+FFN(LN(Si+MHA(Si))))LN 在残差捷径的外侧(把主干给截断了),梯度回传必须层层穿越 LN 滤网(求导结果全是连乘,没有 +1+1+1),层数稍深就会引发严重的梯度消失。
先对最外层的 LN\text{LN}LN 求导: f(g(x))′=f′(g(x))⋅g′(x)f(g(x))' = f'(g(x)) \cdot g'(x)f(g(x))′=f′(g(x))⋅g′(x)∂Si+1∂Si=γi⋅∂LN(... )∂内部⏟💥 致命的衰减因子⋅[∂LN(Si+MHA(Si))∂Si+... ]\frac{\partial S_{i+1}}{\partial S_i} = \mathbf{\gamma_i} \cdot \underbrace{\frac{\partial \text{LN}(\dots)}{\partial \text{内部}}}{\text{💥 致命的衰减因子}} \cdot \left[ \frac{\partial \text{LN}(S_i + \text{MHA}(S_i))}{\partial S_i} + \dots \right]∂Si∂Si+1=γi⋅💥 致命的衰减因子 ∂内部∂LN(...)⋅[∂Si∂LN(Si+MHA(Si))+...]LayerNorm 在求导时,其导数项与当前向量的方差 σ\sigmaσ 成反比(约等于小于 1 的分数 1σ\frac{1}{\sigma}σ1)。
(随着网络层数加深,后面几层残差不断往里叠加,特征向量里的数字会像滚雪球一样越来越大,导致方差和标准差 σ\sigmaσ 变得巨高无比(远远大于 1)。)
当网络有 NNN 层时,我们使用链式法则连乘:∂S最后一层∂S第一层=(γn⋅1σn⋅Δn)×⋯×(γ1⋅1σ1⋅Δ1)\frac{\partial S{\text{最后一层}}}{\partial S_{\text{第一层}}} = \left(\gamma_n \cdot \frac{1}{\sigma_n} \cdot \Delta_n \right) \times \dots \times \left(\gamma_1 \cdot \frac{1}{\sigma_1} \cdot \Delta_1 \right)∂S第一层∂S最后一层=(γn⋅σn1⋅Δn)×⋯×(γ1⋅σ11⋅Δ1)
LayerNorm:
y=x−μσ2+ϵ⋅γ+βy = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \betay=σ2+ϵ x−μ⋅γ+β