NLP基础06

02 seq2seq

注意力机制由来,机器翻译

seq2seq架构,1encoder,2decoder,3中间语义张量c

翻译:欢迎来北京,welcome to Beijing

任务:1.编码,结果得到中间语义张量c

中文==通过GRU获得每个时间步的输出张量,最后将他们拼接成一个中间语义张量c(output就是拼接后的c,因为如果是hn的话,那么只包含有最后一个语义)既然如果讲义这么解释,最好还是解释为output。

解码:(GO/BOS,begin of sentence)和中间语义张量c,一起输入到解码器,

中间语义张量c和s0输入得到一个输出(h1和s1,welcome,两个相等)

但是与此同时s1+中间语义张量c+a1(这里a1可以理解包含有h1信息)

03 注意力机制的介绍

问题1,如果句子长/复杂,计算量大,并且模型准确率下降严重。

问题2,翻译时候,可能在不同语境下,同一个词具有不同的含义,但是网络读这些词没有区分度,没有考虑词与词之间的相关性,导致翻译效果差。

注意力机制实际上就是将人的感知方式,注意力行为应用在机器上,让机器学会感知数据中重要和不重要的方式。

③注意力机制的分类以及如何实现

对于模型的每一个输入项,可能是图片中的不同部分,or语句中的某个单词,分配一个权重,这个权重大小代表我们希望模型对该部分一个关注的程度。

这样一来,通过权重大小模拟人在处理信息的注意力侧重,有效提高模型的性能,并且在一定程度上降低计算量

分类:软注意(全局注意);硬注意(局部注意);自注意(内注意)

1.软注意soft/global attention,每个输入分配0-1权重,也即是某些部分关注多一点,某些部分关注少一点。

因为对所有信息都有考虑,但是考虑程度不一而已,所以相对来讲计算量大。

2.硬注意力hard/local attention,分配权重非0即1,要么关注,要么不关注。舍弃一些相关的项可以减少一些计算成本,但也可能丢失一些本应该注意的信息。【了解即可】

3.自注意力self attention,对每个输入分配的权重取决于输入项之间的相互作用,即通过内部表决应该关注哪些输入项,

和前两种相比,处理很长的输入时,具有并行计算的优势。

04 不带att的Encoder2Decoder

注意:注意力机制是一个通用的思想技术,不依赖于模型。接下来以E2D架构做解析。

抽象结构:输入x1-x4,encoder,得到语义编码c,输入到decoder,得到y1-y4

解释:输入句子对Source=<X1,⋯ ,Xm>Source=<X_1, \cdots, X_m>Source=<X1,⋯,Xm>

生成目标句子Target=<y1,⋯ ,yn>Target=<y_1, \cdots, y_n>Target=<y1,⋯,yn>

encoder就是对输入句子进行编码,将输入句子非线性变化转化为中间语义C=F(X1,⋯ ,Xm)C=F(X_1, \cdots, X_m)C=F(X1,⋯,Xm)

decoder根据中间语义C和之前生成的历史信息y1,⋯ ,yi−1y_1,\cdots, y_{i-1}y1,⋯,yi−1,生成yiy_iyi信息。yi=G(C,y1,⋯ ,yi−1)y_i=G(C, y_1, \cdots, y_{i-1})yi=G(C,y1,⋯,yi−1)

05 带att的Encoder2Decoder

举例说明为何加att,

比如source="Tom chase Jerry.",输出的target为"汤姆追逐杰瑞"。

-在普通E2D结构中,source里每个单词对翻译目标单词的"杰瑞"贡献相同,很明显这里不合适,显然Jerry对于翻译成"杰瑞"更重要。

-如果引入att,在生成"杰瑞"的时候,应该体现出英文单词对于翻译当前中文单词不同的影响程度。比如给出一个例子概率分布值,(Tom 0.3)(chase 0.2)(Jerry 0.5)每个单词对翻译成杰瑞时,注意力分配给出不同英文单词的注意力大小

结构:

输入(x1--x4),但是经过encoder后,会产生中间语义张量(c1-c3),最后经过decoder得到(y1-y3)

大致y1=f1(C1);y2=f1(C2,y1);y3=f1(C3,y1,y2)y_1=f1(C_1);y_2=f1(C_2,y_1);y_3=f1(C_3,y_1,y_2)y1=f1(C1);y2=f1(C2,y1);y3=f1(C3,y1,y2)

对应每个C可能对应着不同的语句单词注意力分配权重,可能为
CTom=g(0.6∗f2(Tom),0.2∗f2(chase),0.2∗f2(Jerry))C_{Tom}=g( 0.6*f2(Tom), 0.2*f2(chase), 0.2*f2(Jerry) )CTom=g(0.6∗f2(Tom),0.2∗f2(chase),0.2∗f2(Jerry))
Cchase=g(0.2∗f2(Tom),0.7∗f2(chase),0.1∗f2(Jerry))C_{chase}=g( 0.2*f2(Tom), 0.7*f2(chase), 0.1*f2(Jerry) )Cchase=g(0.2∗f2(Tom),0.7∗f2(chase),0.1∗f2(Jerry))
CJerry=g(0.3∗f2(Tom),0.2∗f2(chase),0.5∗f2(Jerry))C_{Jerry}=g( 0.3*f2(Tom), 0.2*f2(chase), 0.5*f2(Jerry) )CJerry=g(0.3∗f2(Tom),0.2∗f2(chase),0.5∗f2(Jerry))

C最简单就是加权和而已。

06 注意力概率分布的计算方式

如何得到注意力概率分布

07 soft-att的讲解

att机制可以看作,target每个单词是对source每个单词的加权求和,而权重是source中每个单词对target中每个单词的重要程度。

att计算3步

1.Q和K进行相似度计算,得到att-score

2.对att-score进行softmax归一化,得到权重矩阵

3.权重矩阵与V进行加权求和

V可以理解为看到的原始信息,实际的tom

K就是单词经过encoder之后的key(如tom,经过encoder后有一个key)

Q,就是我要进行翻译了,然后找对应哪个词和我的相似度最高。

没问题,那咱们就顺着刚才"找书"的思路,把这个"匹配"和"拿书"的过程用数学公式具体算一下。

为了让你看得更清楚,我们假设向量简化为 1个数字(实际中可能是512个数字),并且只做一次计算。


🧮 场景:正在翻译"杰瑞"

当前状态

  • Decoder 正在生成"杰瑞",发出的 Query (QQQ) 是数字 2.0(代表"寻找人名"的特征)。
  • Encoder 已经处理好了输入句子,提供了以下数据:
1. 准备数据 (Key 和 Value)

Encoder 为每个单词生成了 Key (KKK) 和 Value (VVV):

单词 Key (KKK) (特征标签) Value (VVV) (实际内容) 含义
Tom 1.0 10 标签像人名,内容是Tom
chase 0.1 20 标签像动词,内容是chase
Jerry 2.0 30 标签像人名,内容是Jerry

注意:你会发现 Jerry 的 Key (2.0) 和我们的 Query (2.0) 很像,这意味着它们很匹配。


📝 第一步:计算相似度得分

公式 :Score=Q×K \text{Score} = Q \times K Score=Q×K
(拿着你的需求 Q,去和每个单词的标签 K 做乘法)

  • 对 Tom :2.0×1.0=2.02.0 \times 1.0 = \mathbf{2.0}2.0×1.0=2.0
  • 对 chase :2.0×0.1=0.22.0 \times 0.1 = \mathbf{0.2}2.0×0.1=0.2
  • 对 Jerry :2.0×2.0=4.02.0 \times 2.0 = \mathbf{4.0}2.0×2.0=4.0

结果:Jerry 的得分 (4.0) 最高,说明它最相关。


📊 第二步:计算概率分布

公式 :α=Softmax(Score) \alpha = \text{Softmax}(\text{Score}) α=Softmax(Score)
(把得分变成百分比,让模型知道该"看"谁)

  1. 计算指数 (简单理解):得分越高,指数越大。
    • Tom: e2.0≈7.4e^{2.0} \approx 7.4e2.0≈7.4
    • chase: e0.2≈1.2e^{0.2} \approx 1.2e0.2≈1.2
    • Jerry: e4.0≈54.6e^{4.0} \approx 54.6e4.0≈54.6
  2. 归一化 (算占比):
    • 总和 ≈7.4+1.2+54.6=63.2\approx 7.4 + 1.2 + 54.6 = 63.2≈7.4+1.2+54.6=63.2
    • Tom 的权重 :7.4÷63.2≈0.127.4 \div 63.2 \approx \mathbf{0.12}7.4÷63.2≈0.12 (12%)
    • chase 的权重 :1.2÷63.2≈0.021.2 \div 63.2 \approx \mathbf{0.02}1.2÷63.2≈0.02 (2%)
    • Jerry 的权重 :54.6÷63.2≈0.8654.6 \div 63.2 \approx \mathbf{0.86}54.6÷63.2≈0.86 (86%)

结果 :模型决定 86% 的注意力给 Jerry,12% 给 Tom,忽略 chase。


🎁 第三步:加权求和

公式 :C=∑(权重×Value) C = \sum (\text{权重} \times \text{Value}) C=∑(权重×Value)
(根据注意力的多少,提取对应的内容 Value)

我们要把每个单词的 Value 乘以它的 权重,然后加起来:

C=(0.12×10)+(0.02×20)+(0.86×30) C = (0.12 \times 10) + (0.02 \times 20) + (0.86 \times 30) C=(0.12×10)+(0.02×20)+(0.86×30)

计算一下:

  • Tom 贡献:1.21.21.2
  • chase 贡献:0.40.40.4
  • Jerry 贡献:25.825.825.8

C=1.2+0.4+25.8=27.4 C = 1.2 + 0.4 + 25.8 = \mathbf{27.4} C=1.2+0.4+25.8=27.4


🏁 最终结果

  • 上下文向量 CCC27.4
  • 这个数字非常接近 Jerry 的原始内容 (30),但也混合了一点点 Tom 的信息。
  • Decoder 拿到这个 27.4 ,就会非常有把握地输出中文单词:"杰瑞"

08 hard-att和self-att的讲解

硬注意力,直接删除不相关的。强化学习用,《白话强化学习》

self-att,谷歌2017transformer,上述att是发生于source和target之间的,而self-att发生于source内部之间,target内部之间的。

the law will never be prefer, but its application should be just, this is what we are missing, in my opinion.

第二分句的its就是指law,law和每个单词之间计算,its和law

其他计算得到的是语法信息。

🎯 硬注意力 (Hard Attention)

你的理解"直接删除不相关的"非常形象,这在学术上被称为**"离散化选择"**。

  • 核心思想 :它是一种**"非此即彼"**的机制。
    • 软注意力(之前学的) :是给所有词分配权重,比如 (Tom: 0.12, chase: 0.02, Jerry: 0.86),虽然 Jerry 最高,但 Tom 的信息也没完全丢。
    • 硬注意力 :是直接**"拍板"。模型决定只看 Jerry,那么 Tom 和 chase 的信息就被彻底切断**(权重为0)。
  • 为什么要用强化学习?
    • 不可导的问题 :普通的神经网络靠"反向传播"来修正误差(比如:预测偏了一点点,往回改一点点)。但是"做选择"这个动作(比如:从三个词里 一个)是不可导的。你不能说"我往'选Tom'这个方向偏一点点",因为要么选,要么不选。
    • 解决方案 :因为没法直接通过梯度下降来训练,所以我们需要用强化学习。把模型看作一个"智能体",它做出的"选择"是"动作",最后翻译得准不准是"奖励"。通过不断的试错(猜错了受惩罚,猜对了得奖励),让模型学会如何"硬"选择。

🤝 自注意力 (Self-Attention)

你抓住了自注意力的精髓------"内部关联"。它是 Google 在 2017 年 Transformer 论文中提出的核心概念。

  • 核心区别

    • 普通注意力 (Cross-Attention) :发生在 Source 和 Target 之间(比如:拿着中文"杰瑞"去英文里找"Jerry")。
    • 自注意力 (Self-Attention) :发生在 序列内部
      • Encoder 自注意力:让英文句子里的每个词,都去看看句子里的其他词,以此搞懂句意。
      • Decoder 自注意力:让中文句子里的每个词,看看前面生成的词,保证语法通顺。
  • 深度解析你的例子

    "The law will never be perfect, but its application should be just..."

    当模型读到 its 这个词时,它本身是模糊的(它指谁?)。

    通过 Self-Attention 机制:

    1. its 变成 Query(提问者):发出信号"我是代词,我在找我的主人"。
    2. 句子里的 The, law, will, never... 变成 Key(回答者)。
    3. 计算匹配度its 的 Query 和 law 的 Key 匹配度最高(因为词性、单复数、语境都吻合)。
    4. 获取信息 :模型把 law 的 Value(实际含义)提取出来,融合到 its 身上。

    结果 :模型瞬间明白了,这里的 its 不是指 application,也不是指 perfect,而是指 law。这就是你提到的"计算得到语法/指代信息"的过程。

===

下午课程

===

09 seq2seq架构加入att计算过程解释

①.注意力机制规则

欢迎来北京==》"Welcome to Beijing"

1.分词:"欢迎","来","北京",假设编码每个词用3维向量表示。那么每个词就是13矩阵
2.q(也是1
3矩阵),比如我现在要对"欢迎"进行翻译,k组合起来就是3*3

q k=13,归一化不改变结构13,

最后翻译得到的和上一个翻译的词进行拼接(13)(13)

🧩 1. 初始状态:输入矩阵

假设句子是"欢迎 来 北京",分词后得到 3 个词。

每个词用 3维向量 表示。

那么,整个句子的输入矩阵 XXX 就是一个 3行3列 的矩阵(3个词,每个词3维):

X=[x欢迎x来x北京]=[0.10.20.30.40.50.60.70.80.9] X = \begin{bmatrix} x_{欢迎} \\ x_{来} \\ x_{北京} \end{bmatrix} = \begin{bmatrix} 0.1 & 0.2 & 0.3 \\ 0.4 & 0.5 & 0.6 \\ 0.7 & 0.8 & 0.9 \end{bmatrix} X= x欢迎x来x北京 = 0.10.40.70.20.50.80.30.60.9
(注:这里只是假设的数值)

⚙️ 2. 生成 Q 和 K:维度的秘密变换

这里是关键点。如果 QQQ 和 KKK 保持是 1×31 \times 31×3,它们是无法算出有意义的"注意力分数"的。我们需要通过**线性变换(乘以权重矩阵 WWW)**来改变它们的维度。

通常在 Transformer 中,我们会把维度映射到一个新的空间(假设我们也设为 3 维,方便计算)。

  • Query (QQQ)

    假设我们现在是 Decoder,正在尝试翻译第一个词"Welcome"。

    Decoder 会生成一个 Query 向量 qqq(代表"我想找表示'欢迎'含义的词")。

    这个 qqq 是通过输入乘以权重矩阵 WQW^QWQ 得到的。

    • 维度变化 :(1×3)×(3×3)→1×3(1 \times 3) \times (3 \times 3) \rightarrow \mathbf{1 \times 3}(1×3)×(3×3)→1×3。
    • 所以,qqq 是一个 行向量
  • Key (KKK)

    Encoder 会把输入句子 XXX 转换成 Keys。

    • 维度变化 :(3×3)×(3×3)→3×3(3 \times 3) \times (3 \times 3) \rightarrow \mathbf{3 \times 3}(3×3)×(3×3)→3×3。
    • 这里 KKK 矩阵的每一行,代表"欢迎"、"来"、"北京"各自的 Key。

🧮 3. 计算注意力分数:矩阵乘法

现在我们要计算 QQQ 和 KKK 的相似度。

  • 你的公式 :Q×KQ \times KQ×K
  • 维度检查 :(1×3)×(3×3)(1 \times 3) \times (3 \times 3)(1×3)×(3×3)
  • 结果维度1×31 \times 31×3

这就对了!

计算结果是一个 1×31 \times 31×3 的向量 (我们叫它 Scores)。

这个向量里的 3 个数字,分别代表:

  1. "Welcome" 和 "欢迎" 的匹配度
  2. "Welcome" 和 "来" 的匹配度
  3. "Welcome" 和 "北京" 的匹配度

📊 4. 归一化与加权求和

  1. Softmax

    对这个 1×31 \times 31×3 的 Scores 向量做 Softmax。

    结构不变,还是 1×31 \times 31×3,但数值变成了概率(比如 [0.8, 0.1, 0.1])。这意味着模型觉得 80% 应该关注"欢迎"。

  2. 乘以 Value (VVV)

    我们需要把概率乘到 Value 上。VVV 的维度和 KKK 一样,也是 3×33 \times 33×3(3个词,每个词3维)。
    Attention Output=Weights(1×3)×V(3×3) \text{Attention Output} = \text{Weights}{(1 \times 3)} \times V{(3 \times 3)} Attention Output=Weights(1×3)×V(3×3)
    结果维度1×31 \times 31×3

    这个结果就是一个上下文向量 ccc。它融合了"欢迎"、"来"、"北京"的信息,但重点突出了"欢迎"。

🔗 5. 关于"拼接"

你最后提到:"和上一个翻译的词进行拼接"。

这里要注意,Transformer 和 RNN 的处理方式不同:

  • 如果是 RNN :确实是把生成的词向量(1×31 \times 31×3)作为下一个时间步的输入。
  • 如果是 Transformer
    它通常不是 简单地把词向量拼起来。
    而是把刚才算出来的 Attention Output (1×31 \times 31×3) 传入前馈神经网络(Feed Forward Network),经过变换和激活,最后通过 Linear + Softmax 预测出下一个单词(比如 "Welcome")。

总结一下你的计算流:

  1. 输入 :1×31 \times 31×3 (q) 和 3×33 \times 33×3 (K, V)
  2. 乘法 :q×KT→1×3q \times K^T \rightarrow 1 \times 3q×KT→1×3 (分数)
  3. 归一化 :Softmax →1×3\rightarrow 1 \times 3→1×3 (权重)
  4. 输出 :权重 ×V→1×3\times V \rightarrow 1 \times 3×V→1×3 (上下文向量)

10 pytorch版本att计算过程

没问题!其实你的逻辑完全没问题,咱们只需要把最后那个"拼接"的环节调整一下,换成 PyTorch 里标准的处理流程就行。

在 PyTorch 的 Transformer 架构里,算出上下文向量后,通常不是直接拿去拼接,而是经过一个前馈网络处理,最后通过线性层输出。

下面我直接把你的例子"翻译"成 PyTorch 的代码逻辑:

📐 1. 准备数据与维度定义

首先,我们要把"欢迎 来 北京"变成 PyTorch 能认出的张量。

python 复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F

# 假设参数
batch_size = 1       # 一次处理一句话
seq_len = 3          # 3个词:欢迎,来,北京
d_model = 3          # 每个词向量维度是3

# 1. 模拟输入数据 (Encoder的输出)
# 形状: [3, 3] -> PyTorch通常习惯 [Seq_Len, Batch, Dim] 或者 [Batch, Seq_Len, Dim]
# 这里为了方便理解矩阵乘法,我们使用 [Batch, Seq_Len, Dim]
x = torch.tensor([
    [[0.1, 0.2, 0.3],   # "欢迎"
     [0.4, 0.5, 0.6],   # "来"
     [0.7, 0.8, 0.9]]   # "北京"
], dtype=torch.float32) # 形状: [1, 3, 3]

⚙️ 2. 线性变换 (生成 Q, K, V)

在 PyTorch 中,我们通常使用 nn.Linear 来完成你提到的"乘以权重矩阵"这一步。

python 复制代码
# 定义线性层 (模拟权重矩阵 Wq, Wk, Wv)
# 输入维度3,输出维度3 (为了演示方便,实际中可能会变)
linear_q = nn.Linear(3, 3)
linear_k = nn.Linear(3, 3)
linear_v = nn.Linear(3, 3)

# 假设 Decoder 当前的状态 (Query)
# 比如我们刚开始翻译,输入了一个 <BOS> 标记,或者是一个全零向量作为初始查询
q_input = torch.randn(1, 1, 3) 

# 计算 Q, K, V
q = linear_q(q_input)  # 形状: [1, 1, 3] (Batch, Query_Len, Dim)
k = linear_k(x)        # 形状: [1, 3, 3] (Batch, Source_Len, Dim)
v = linear_v(x)        # 形状: [1, 3, 3]

🧮 3. 计算注意力分数 (矩阵乘法)

这里对应你提到的 q k = 1*3。在 PyTorch 中,我们需要转置 K 才能进行矩阵乘法。

python 复制代码
# 矩阵乘法: Q * K^T
# q: [1, 1, 3]
# k.transpose(-2, -1): [1, 3, 3] -> 转置后变成 [1, 3, 3] (最后两维互换)
# 结果 scores: [1, 1, 3] -> 代表 Q 对 Source 中 3 个词的打分
scores = torch.matmul(q, k.transpose(-2, -1))

# 缩放 (Scaling) - PyTorch 标准操作,防止数值过大
# 除以根号下维度 (sqrt(3))
scores = scores / torch.sqrt(torch.tensor(3.0))

📊 4. 归一化与加权求和

对应你提到的"归一化不改变结构"和"最后翻译得到的..."。

python 复制代码
# 1. Softmax 归一化 (得到概率分布)
# dim=-1 表示在最后一个维度上进行归一化 (即对那3个分数求和变1)
attention_weights = F.softmax(scores, dim=-1) 
# 形状: [1, 1, 3] -> 比如 [0.8, 0.1, 0.1]

# 2. 加权求和 (Context Vector)
# 权重 * V
# [1, 1, 3] * [1, 3, 3] -> 结果形状 [1, 1, 3]
context_vector = torch.matmul(attention_weights, v)

🔗 5. PyTorch 的后续处理 (替代"拼接")

你提到的"和上一个翻译的词拼接",在 Transformer 的 PyTorch 实现中,通常是把这个 context_vector 送入一个前馈网络,然后输出预测结果。

python 复制代码
# 1. 前馈网络 (Feed Forward) - 这是一个简单的全连接层
# 这里模拟一下,实际 Transformer 里会有两层线性变换加激活函数
ffn = nn.Linear(3, 3) 

# 2. 输出处理
output = ffn(context_vector) # 形状: [1, 1, 3]

# 3. 预测下一个词
# 最后通常会接一个 Linear(d_model, vocab_size) 然后做 Softmax 来预测单词
# 比如输出 [0.1, 0.9, 0.0],对应词表里的 "Welcome"

在写论文的"注意力机制"这一小节时,核心原则是:用数学语言描述逻辑,而不是用代码描述逻辑

审稿人想看到的是清晰的公式推导和直观的机制解释,而不是你代码里的 LinearMatMul 函数调用。

结合你之前对 Q、K、V 的理解,我为你整理了一个标准的论文写作模板(适用于大多数深度学习论文),你可以直接参考这个结构来填充内容。


📝 论文写作模板:注意力机制小节

通常这一节会放在"方法"章节的子节,比如 3.2 多头自注意力机制

1. 文字描述:定性与直觉

首先用一两句话概括你为什么要用这个机制,以及它的作用。

写作示例:

"为了捕捉输入序列中的长距离依赖关系并动态提取关键特征,我们采用了缩放点积注意力机制。该机制允许模型在处理序列中的每个位置时,能够根据内容的相关性,自适应地关注输入的不同部分。"

2. 数学公式:核心定义

这是最关键的部分。你需要把 Q、K、V 的计算过程形式化。不要写代码逻辑,要写矩阵运算。

第一步:定义输入与变换

假设输入序列为 X∈Rn×dmodelX \in \mathbb{R}^{n \times d_{model}}X∈Rn×dmodel(这里 nnn 是序列长度,dmodeld_{model}dmodel 是维度,对应你例子中的 3)。

公式表达:

我们首先通过三个可学习的线性变换矩阵 WQ,WK,WVW^Q, W^K, W^VWQ,WK,WV,将输入 XXX 映射为查询 QQQ、键 KKK 和值 VVV:
Q=XWQ,K=XWK,V=XWV Q = XW^Q, \quad K = XW^K, \quad V = XW^V Q=XWQ,K=XWK,V=XWV

其中 WQ,WK∈Rdmodel×dkW^Q, W^K \in \mathbb{R}^{d_{model} \times d_k}WQ,WK∈Rdmodel×dk,WV∈Rdmodel×dvW^V \in \mathbb{R}^{d_{model} \times d_v}WV∈Rdmodel×dv。

第二步:定义注意力函数

直接给出那个著名的公式。

公式表达:

注意力分数的计算通过查询 QQQ 与键 KKK 的点积实现,随后通过 Softmax 函数归一化得到权重,最后对值 VVV 进行加权求和。具体计算公式如下:
Attention(Q,K,V)=softmax(QKTdk)V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V

其中,除以 dk\sqrt{d_k}dk 是为了防止点积结果过大导致 Softmax 函数进入梯度极小的饱和区,从而阻碍反向传播。

3. 机制解释:结合你的例子

在公式之后,最好用一段文字解释这个公式在你的任务(比如机器翻译)中具体意味着什么。这里就可以把你理解的"Tom chase Jerry"融合进去。

写作示例:

"具体而言,在翻译任务中,解码器生成的查询向量 QQQ 代表当前目标词(如'杰瑞')的语义需求。该向量与源句子中每个词的键向量 KKK(如'Tom', 'chase', 'Jerry')进行相似度计算。

计算得到的注意力权重矩阵反映了源词对当前目标词的重要性分布。例如,当模型预测'杰瑞'时,对应'Jerry'的键向量将获得最高的注意力权重,从而使模型能够从对应的值向量 VVV 中精准提取相关信息,忽略无关词汇的干扰。"

4. 进阶:如果是多头注意力

如果你的模型用了 Multi-Head,需要简单补充一句:

写作示例:

"为了从不同的表示子空间中捕捉多样化的语义信息,我们采用了多头注意力机制。我们将 Q,K,VQ, K, VQ,K,V 投影到 hhh 个不同的子空间并行计算注意力,最后将结果拼接并通过线性层输出:
MultiHead(Q,K,V)=Concat(head1,...,headh)WO \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO

其中 headi=Attention(QWiQ,KWiK,VWiV)\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)headi=Attention(QWiQ,KWiK,VWiV)。"


相关推荐
monsion2 小时前
Code Agent 不是编程工具:它是今天最接近通用 Agent 的现成形态
人工智能·vscode·个人开发
努力的小白o(^▽^)o2 小时前
食品分类任务
人工智能·深度学习·计算机视觉
智链RFID2 小时前
当企业运营遇到瓶颈:RFID 为什么越来越被采用?
大数据·网络·人工智能·科技·rfid
剑穗挂着新流苏3122 小时前
205_深度学习的非线性魔法:多层感知机(MLP)与激活函数全解析
人工智能·pytorch·python·深度学习
落落落sss2 小时前
大规模语言模型预训练全链路深度解析:从语料工程到自回归推断
人工智能·语言模型·回归
会飞的大可2 小时前
零成本搭建企业级本地私有化 AI 知识库:Dify + DeepSeek 实战指南
人工智能
F_D_Z2 小时前
图像领域的预训练
人工智能
ctrigger2 小时前
关于印发《施工总承包企业特级资质标准》的通知
人工智能
nancy_princess2 小时前
基础概念2
人工智能·python·机器学习