Transformer 通关秘籍10:词向量运算:queen=king-man+wowem

经过前面的介绍,相信你搞懂了词嵌入向量所代表的是单词在高维空间的特征表示了。
在学习词嵌入向量的过程中,一个最著名的理解词嵌入向量在高维数学空间的例子,莫过于实现 queen = king - Man + Woman 的数学运算了。
本节将从这个例子出发,揭示词向量背后的隐藏含义,并在最后附上通过GoogleVec的预训练模型来实现上述词向量运算的Python代码。
本文在撰写时参考了很多国外的优秀博客,参考链接在文章最后。

这里有一个全程一站式的 Transformer 讲解和实战辅导,带你从零手写一个可对话的大模型,点击链接查看详情从零手写大模型实战

queen = king - Man + Woman 示例

下面展示的单词“ king ”的词嵌入向量(该向量是在 Wikipedia 数据集上使用 GolVe训练得到的)。
[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 , -0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 , 0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344 , -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]
该向量共 50 个数字,单从数字来看,我们并不能看到太多的东西,但是我们用另一种方法来把这些数字进行可视化展示。
方法如下:每个数字如果接近 2,则为红色,如果接近0则为白色,如果接近-2则为绿色。
有很多方法可以实现类似的可视化,这里略过,直接看将词向量可视化之后的结果。

接下来,我们忽略上图中的数字,仅关注颜色,并且将一些我们认为含义相近的单词(这里选择了 Man 和 Woman )的可视化结果一起展示:

从上图,你是不是能发现一些端倪:Woman 和 Man 在颜色分布上,比 Woman 和 king 更加接近。
我们继续分析,继续放一些更加有关联的单词的可视化结果。

上面放了: queen , king , Man , Woman , boy , girl , water (无关)的可视化结果。我们逐个分析一下:

  1. 在中间有一条非常明显的红线,从上到下一直贯穿,这条线代表的数字可能代表了一些信息(但是我们不知道是什么信息。)
  2. 你可以看到, Woman 和 girl 在很多地方颜色很相似,这一点在 Man 和 boy 的对比上也可以看出来。
  3. boy 和 girl 也有一些相似的地方,但是和 Woman 以及 Man 相比,又有一些不一致的地方,这些不一致或许说明代表的是“成人”信息。
  4. 在最下面增加了 water 单词的可视化,可以看到在上面有一条蓝色的线从上到下贯穿,一直到 water 则停止消失了,这条蓝色的线或许代表的是“人类”这种信息。
  5. queen 和 king 的对比中,有一些相似但与其他不一致的地方,这些有可能代表了“皇室”的信息。
    总之,经过上面的分析,我们可以看出,有相似特征的单词在某些数字(可视化后的颜色)上也会存在相似之处,但并非完全一致。
    这代表了 token 与 token 之间仅仅在某些维度上是相似的,在其他维度上并不一致,比如“性别”、“皇室”等维度。
    Python 实现这个公式
    为了更好的理解这个现象,我们使用 Python 来进行更加深入的探索。
    我们使用 Gensim 库以及一个预训练好的模型(包含了 token 以及词嵌入向量)来完成。
    Gensim 库是一个可以用于主题建模和文档相似性检索的开源 Python 库,特别适用于处理大规模文本数据。
    可以通过以下命令安装:
    pip3 install --upgrade gensim -i https://pypi.tuna.tsinghua.edu.cn/simple
    安装完之后,前往这个网站下载预训练好的GoogleNews模型。
    GoogleNews 模型包含了 token 及其关联的词向量的文件,是在 Google 的新闻数据集(约 1000 亿词)上进行训练的;它包含了 300 万个单词和短语,每个词向量的维度是 300 维(300个数字)。
    该模型大概 1.5G 大小,比较大,下载会花费较长时间。
    下载完成后,解压该模型文件,解压后大概 3.7G,为一个 bin 文件。
    使用如下代码进行测试:
from gensim.models import KeyedVectors
# load the google word2vec model
filename = 'GoogleNews-vectors-negative300.bin'
model = KeyedVectors.load_word2vec_format(filename, binary=True)

# calculate: ( king - Man ) + Woman  = ?
result = model.most_similar(positive=[' Woman ', ' king '], negative=[' Man '], topn=1)
print(result)

上述代码的打印结果为:

[(' queen ', 0.7118193507194519)]

说明在词向量的高维数学空间中,通过计算 king - Man + Woman ,得到的结果是 queen 。
注意: 上述 queen 结果是通过 model.most_similar 函数得到的,也即是词嵌入空间中与 king - Man + Woman 的结果最接近的 token 是 queen ,并非严格的相等,而是近似。
上述代码中展示的近似度为0.7,是通过两个词向量的余弦相似度计算得到的,余弦相似度在之前几节介绍过,如果不记得了可以返回去再复习一下。
当然,你也可以尝试计算 father - Man + Woman = mother 等逻辑。
本文代码可以在这里获得。
参考:

  1. gensim库:https://github.com/piskvorky/gensim/tree/develop
  2. 词向量实现:https://machinelearningmastery.com/develop-word-embeddings-python-gensim/
  3. GoogleNews预训练模型下载:https://drive.usercontent.google.com/download?id=0B7XkCwpI5KDYNlNUTTlSS21pQmM&export=download&authuser=0
  4. 数学上解释 queen = king - Man + Woman 的原理:https://p.migdal.pl/blog/2017/01/ king - Man - Woman - queen -why
非常好的问题!你提到的这些是**不同注意力机制中 Query(Q)和 Key(K)之间的相似度计算方式**。它们在不同的模型中被使用,用来生成注意力权重。 下面我将 **详细解释每种方式的含义、公式、作用、优缺点,并提供代码示例**。 --- ## ✅ 1. 点乘(Dot-Product Attention) > **公式:** $$ f(Q, K_i) = Q^T K_i $$ ### 🔍 解释: - 这是 **Transformer 中使用的注意力机制**。 - 直接计算 Query 向量和 Key 向量的点积,表示它们之间的相似度。 - 通常会配合一个缩放因子 $ \frac{1}{\sqrt{d_k}} $ 使用。 ### ✅ 优点: - 计算高效,适合大规模并行。 - 在维度不高时效果很好。 ### ❌ 缺点: - 当维度 $ d_k $ 很大时,点积结果会变得很大,导致 softmax 饱和(梯度消失)。 - 所以需要缩放(即除以 $ \sqrt{d_k} $)。 ### 🧠 示例代码(PyTorch): ```python import torch import torch.nn.functional as F Q = torch.randn(1, 64) # Query 向量 K = torch.randn(10, 64) # Key 向量(10个) # 点积注意力 scores = torch.matmul(Q, K.t()) # (1, 10) scores = scores / torch.sqrt(torch.tensor(64.0)) # 缩放 weights = F.softmax(scores, dim=-1) print("Attention weights:", weights) ``` --- ## ✅ 2. 权重点乘(Multiplicative Attention) > **公式:** $$ f(Q, K_i) = Q^T W K_i $$ 其中 $ W $ 是一个可学习的权重矩阵。 ### 🔍 解释: - 在原始点乘的基础上引入一个权重矩阵 $ W $,可以学习不同维度之间的关系。 - 可以看作是带参数的点乘注意力。 ### ✅ 优点: - 比纯点乘更灵活,能学习不同维度的重要性。 - 不需要缩放因子(因为 W 可以调节值的大小)。 ### ❌ 缺点: - 多了一个可学习矩阵 $ W $,参数量增加。 - 不如 Transformer 的点乘注意力常见。 ### 🧠 示例代码(PyTorch): ```python import torch import torch.nn as nn Q = torch.randn(1, 64) K = torch.randn(10, 64) # 可学习的权重矩阵 W = nn.Parameter(torch.randn(64, 64)) # 权重点乘注意力 scores = torch.matmul(Q @ W, K.t()) # QW * K^T weights = F.softmax(scores, dim=-1) print("Attention weights:", weights) ``` --- ## ✅ 3. 拼接权重(Concat Attention) > **公式:** $$ f(Q, K_i) = W [Q^T; K_i] $$ 其中 `;` 表示拼接操作,$ W $ 是一个可学习的权重向量。 ### 🔍 解释: - 将 Query 和 Key 向量拼接起来,然后通过一个可学习的权重向量进行线性变换。 - 常用于早期注意力模型,比如 Bahdanau Attention。 ### ✅ 优点: - 能捕捉 Query 和 Key 的联合特征。 - 比较灵活,适用于 RNN-based 模型。 ### ❌ 缺点: - 拼接操作不便于并行计算。 - 比点乘慢,不适合大规模 Transformer。 ### 🧠 示例代码(PyTorch): ```python import torch import torch.nn as nn Q = torch.randn(1, 64) K = torch.randn(10, 64) # 拼接 Query 和每个 Key concat = torch.cat((Q.repeat(10, 1), K), dim=1) # (10, 128) # 可学习的权重向量 W = nn.Parameter(torch.randn(128)) # 计算得分 scores = torch.matmul(concat, W) # (10,) weights = F.softmax(scores, dim=0) print("Attention weights:", weights) ``` --- ## ✅ 4. 感知器注意力(Additive Attention / MLP-based Attention) > **公式:** $$ f(Q, K_i) = v^T \tanh(W Q + b + U K_i) $$ 其中 $ v, W, U $ 是可学习参数。 ### 🔍 解释: - 使用一个小型的神经网络(感知器)来计算注意力得分。 - 也被称为加性注意力(Additive Attention),是最早提出的注意力机制之一。 ### ✅ 优点: - 表达能力强,能学习复杂的非线性关系。 - 适用于 RNN-based 模型。 ### ❌ 缺点: - 计算复杂,不适合大规模并行。 - 参数较多,训练时间长。 ### 🧠 示例代码(PyTorch): ```python import torch import torch.nn as nn Q = torch.randn(1, 64) K = torch.randn(10, 64) # 可学习参数 W = nn.Parameter(torch.randn(64, 64)) U = nn.Parameter(torch.randn(64, 64)) b = nn.Parameter(torch.randn(64)) v = nn.Parameter(torch.randn(64)) # 计算得分 scores = [] for ki in K: score = torch.tanh(Q @ W + ki @ U + b) score = torch.dot(score.squeeze(), v) scores.append(score) scores = torch.stack(scores) weights = F.softmax(scores, dim=0) print("Attention weights:", weights) ``` --- ## 📊 对比总结表: | 方法 | 公式 | 是否可学习 | 并行化 | 适用模型 | 是否常用 | |------|------|-------------|--------|----------|----------| | 点乘注意力 | $ Q^T K_i $ | 否 | ✅ 强 | Transformer | ✅ 极常用 | | 权重点乘 | $ Q^T W K_i $ | ✅ 是 | ✅ 强 | Transformer变体 | ⚠️ 少见 | | 拼接注意力 | $ W [Q^T; K_i] $ | ✅ 是 | ❌ 弱 | RNN-based | ⚠️ 早期用 | | 感知器注意力 | $ v^T \tanh(W Q + U K_i + b) $ | ✅ 是 | ❌ 弱 | RNN-based | ⚠️ 早期用 | --- ## ✅ 总结一句话: > 这些注意力机制的核心目标都是**计算 Query 和 Key 之间的相似度**,只是实现方式不同。Transformer 使用的点乘注意力因其高效并行性成为主流,而其他方式则各有优劣,适用于不同任务和模型架构。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值