四个经典的深度学习与 Transformer 基础问题

  1. Cross entropy loss 计算公式
  2. softmax 计算公式
  3. 2017 年的transformer (attention is all you need)中位置编码怎么加的
  4. 多头self-attention 的维度变化是怎样的?比如【1,10,768】的变量输入,怎么得到输出的?

1. Cross Entropy Loss (交叉熵损失) 计算公式

交叉熵用于衡量两个概率分布之间的差异。在分类任务中,通常用来衡量真实标签分布 ppp 与模型预测分布 qqq 之间的差异。

多分类问题公式:
L=−∑i=1Cyilog⁡(y^i)L = -\sum_{i=1}^{C} y_i \log(\hat{y}_i)L=i=1Cyilog(y^i)

  • CCC:类别总数。
  • yiy_iyi:真实标签的 One-hot 编码(如果属于第 iii 类则为 111,否则为 000)。
  • y^i\hat{y}_iy^i:模型预测样本属于第 iii 类的概率(通常经过 Softmax 输出)。

二分类问题公式(Binary Cross Entropy, BCE):
L=−[ylog⁡(y^)+(1−y)log⁡(1−y^)]L = -\left[ y \log(\hat{y}) + (1 - y) \log(1 - \hat{y}) \right]L=[ylog(y^)+(1y)log(1y^)]

  • yyy:真实标签(000111)。
  • y^\hat{y}y^:预测为正类(111)的概率。

2. Softmax 计算公式

Softmax 函数的作用是将一个包含任意实数的向量(通常是模型最后一层的原始输出 Logits)映射为一个概率分布。向量中每个元素的值都被压缩到 (0,1)(0, 1)(0,1) 之间,并且所有元素的和为 111

公式:
Softmax(zi)=ezi∑j=1KezjSoftmax(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}Softmax(zi)=j=1Kezjezi

  • ziz_izi:输入向量 zzz 中的第 iii 个元素。
  • KKK:向量的长度(即类别总数)。
  • eee:自然对数的底数。

(注:在实际工程实现中,为了防止指数爆炸引发数值溢出,通常会在分子分母中同时减去输入向量的最大值:zi=zi−max⁡(z)z_i = z_i - \max(z)zi=zimax(z))


3. Transformer 中的位置编码 (Positional Encoding) 是怎么加的?

在 2017 年的原始论文《Attention Is All You Need》中,位置编码是通过按元素相加 (Element-wise Addition) 的方式融入模型的,而不是拼接 (Concatenation)。

具体过程:
输入 Token 经过 Embedding 层后,会得到一个维度为 [seq_len, d_model] 的词向量矩阵 XXX。接着,模型会生成一个维度完全相同的绝对位置编码矩阵 PEPEPE。两者直接相加:
Input=Xembedding+PEInput = X_{embedding} + PEInput=Xembedding+PE

PE 矩阵的生成公式(正余弦交替):
PE(pos,2i)=sin⁡(pos100002i/dmodel)PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right)PE(pos,2i)=sin(100002i/dmodelpos)
PE(pos,2i+1)=cos⁡(pos100002i/dmodel)PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)PE(pos,2i+1)=cos(100002i/dmodelpos)

  • pospospos:当前 Token 在序列中的绝对位置(例如 0,1,2...0, 1, 2...0,1,2...)。
  • iii:特征维度索引(对应 dmodeld_{model}dmodel 中的第 2i2i2i2i+12i+12i+1 个位置)。
  • dmodeld_{model}dmodel:模型的隐藏层维度(如 512 或 768)。

这种设计的巧妙之处在于,它通过不同频率的三角函数,让模型不仅能感知绝对位置,还能通过线性组合推导出相对位置关系,同时保持了维度不变。


4. 多头自注意力 (Multi-Head Self-Attention) 的维度变化

假设输入变量 XXX 的维度为 [1, 10, 768],即 [batch_size, seq_len, d_model]
为了便于说明,我们假设注意力头数 h=12h = 12h=12(这是 768 维模型的标准配置,如 BERT-base 或 GPT-2),那么每个头的维度 dk=768/12=64d_k = 768 / 12 = 64dk=768/12=64

以下是张量在计算过程中的完整维度变换轨迹:

Step 1: 线性映射生成 Q, K, V
输入 XXX [1, 10, 768] 分别乘以三个权重矩阵 WQ,WK,WVW^Q, W^K, W^VWQ,WK,WV (形状均为 [768, 768])。

  • Q,K,VQ, K, VQ,K,V 形状均变为:[1, 10, 768]

Step 2: 拆分为多头 (Split Heads)
将最后一个维度 d_model 拆分为 num_headshead_dim,并进行张量转置,以便后续按头进行并行矩阵乘法。

  • Reshape: [1, 10, 768] →\rightarrow [1, 10, 12, 64]
  • Transpose: [1, 10, 12, 64] →\rightarrow [1, 12, 10, 64] [batch_size, num_heads, seq_len, head_dim]

Step 3: Scaled Dot-Product Attention
在每个头上独立计算注意力。

  • 计算注意力分数 (Q⋅KTQ \cdot K^TQKT):
    QQQ [1, 12, 10, 64] 乘以 KTK^TKT [1, 12, 64, 10]
    得到 Score 矩阵:[1, 12, 10, 10]
  • 缩放与 Softmax:
    除以 dk\sqrt{d_k}dk (即 64=8\sqrt{64}=864 =8),并在最后一个维度(长度为 10)上应用 Softmax。维度保持 [1, 12, 10, 10]
  • 加权求和 (Score⋅VScore \cdot VScoreV):
    Score 矩阵 [1, 12, 10, 10] 乘以 VVV [1, 12, 10, 64]
    得到多头注意力输出:[1, 12, 10, 64]

Step 4: 拼接多头 (Concatenate)
将所有头的结果拼回原始序列维度。

  • Transpose (把头数移回去): [1, 12, 10, 64] →\rightarrow [1, 10, 12, 64]
  • Reshape (展平): [1, 10, 12, 64] →\rightarrow [1, 10, 768]

Step 5: 最终线性映射 (Output Projection)
将拼接后的张量乘以输出权重矩阵 WOW^OWO (形状 [768, 768]),进行特征融合。

  • 最终输出维度[1, 10, 768]

总结来说,输入是 [1, 10, 768],经过 MHA 内部复杂的张量切分、转置乘法和拼接后,输出依然保持严格的 [1, 10, 768],这保证了 Transformer 堆叠层数的稳定。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐