news 2026/2/3 6:46:31

深度解析:词向量与自注意力机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度解析:词向量与自注意力机制

1.词的表示方式

词的表示即为将输入的语句转换为计算机可以处理的数字形式。

1.1 独热编码(One-hot Encoding)

独热编码是一种最简单、最基础的将离散型数据(特别是分类数据)转换为数值形式的方法。

  • 假设词汇表含有w个不同的词,则会产生w维的向量;
  • 每个词都会被表示成长度为w的向量;
  • 对于特定的某个词,只有其索引位置为1,其余位置均为0;

无法表示语义之间的关系,完全丢失了词语之间的语义信息。

1.2 词向量(Word Embedding)

为解决独热编码的缺陷,词向量采用相对低纬、稠密、连续的向量来表示一个词,并且让这个向量能够捕捉词语的语义和语法信息。

  • 稠密低纬:维度通常在50-300之间;
  • 蕴含语义:语义相似的词,其向量在空间中的距离也相近(余弦相似度等度量);

静态词向量表示中一个词只有一个向量,无法处理一词多义(多义词)问题。

2.自注意力

自注意力的关键在于key,query,value同源,来自于同一个x。计算过程:

①通过三个矩阵生成Q,K,V,其余步骤与注意力机制做法相同。

②计算注意力分数

③缩放与归一化

自注意力(Self-Attention)的核心目标:让模型在处理一个词时,能够有选择地关注输入序列中的其他部分,从而获得该词在当前上下文中最准确的表示。

自注意力

在自注意力机制中,每个词元都通过注意力直接连接到任何其他词元,具有并行计算的优势,并且自注意力的最大路径长度最短,在长序列中计算缓慢。

3.位置编码

自注意力机制有一个关键特性就是排列不变性,他没有记录位置信息,因此在纯自注意力中“我爱你”和“你爱我”的词对关系是一致的。但是我们又明白“我爱你” ≠ “你爱我”,因此需要引入位置。

(1)基本思想:给每个位置的词向量添加一个位置信号,表明:

  • 该词在序列中的绝对位置;
  • 词与词之间的相对位置关系。

(2)假设长度为n的序列是,使用位置编码矩阵 P 来输出 X+P 作为自编码输入

对于位置 pos 和维度 i :

以我爱你中的“爱”为例:

位置编码

自编码输入:

(3)位置编码数学性质

  • 唯一性:每一个位置编码都不同;
  • 有界性:值在 [-1,1] 之间,与词的嵌入匹配;
  • 距离敏感:相近位置编码相似,远离位置编码差异大。

(4)为什么不直接按照位置进行编码 [1,2,3,4....]

直接使用位置索引:数据差异范围太大,比如100比1大百倍;

归一化位置:长序列中相邻位置差异太小,0.99与1.00;

二进制编码:离散变化,无法平滑表示相似位置;

(5)基于正弦函数与余弦函数的固定位置编码借助三角函数性质可以实现相对位置信息。

因此在计算 pos + k 个词的位置编码时,可以得到:

可以看出,对于 pos + k 位置的位置向量某一维 2i 或 2i + 1 而言,可以表示为 pos 位置与 k 位置的位置向量的 2i 与 2i + 1 维的线性组合,在线性组合中蕴含着相对位置信息。

4.代码示例

位置编码类的实现:

class PositionalEncoding(nn.Module): # """位置编码""" def __init__(self, num_hiddens, dropout, max_len=1000): # 最大序列长度 super(PositionalEncoding, self).__init__() self.dropout = nn.Dropout(dropout) # dropout层,用于防止过拟合 # 创建一个足够长的P self.P = torch.zeros((1, max_len, num_hiddens)) X = torch.arange(max_len, dtype=torch.float32).reshape( -1, 1) / torch.pow(10000, torch.arange( 0, num_hiddens, 2, dtype=torch.float32) / num_hiddens) self.P[:, :, 0::2] = torch.sin(X) self.P[:, :, 1::2] = torch.cos(X) def forward(self, X): X = X + self.P[:, :X.shape[1], :].to(X.device) return self.dropout(X)

位置嵌入矩阵P中,行代表词元在序列中的位置,列代表位置编码的不同维度

encoding_dim, num_steps = 32, 60 pos_encoding = PositionalEncoding(encoding_dim, 0) pos_encoding.eval() X = pos_encoding(torch.zeros((1, num_steps, encoding_dim))) P = pos_encoding.P[:, :X.shape[1], :] d2l.plot(torch.arange(num_steps), P[0, :, 6:10].T, xlabel='Row (position)', figsize=(6, 2.5), legend=["Col %d" % d for d in torch.arange(6, 10)])

可以看到位置嵌入矩阵第6列与第7列的频率高于第8列和第9列;第6列与第7列之间的偏移,第8列和第9列之间的偏移是因为正弦函数和余弦函数的交替。

5.小结

  1. 在自注意力池化层中,查询、键和值都来自于同一组输入
  2. 卷积神经网络(CNN)和自注意力都具有并行计算的优势,而且自注意力的最大路径长度最短。但是其计算复杂度是关于序列长度的平方,因此在很长的序列中计算十分慢;
  3. 为了使用序列的顺序信息,可以通过在输入表示中添加位置编码,来注入绝对的或相对的位置信息。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/29 18:00:05

如何永久解决IDM激活问题:2025年最新方案

如何永久解决IDM激活问题:2025年最新方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager的激活弹窗而烦恼&#xf…

作者头像 李华
网站建设 2026/1/30 4:11:32

BongoCat终极指南:打造你的专属桌面互动伴侣

BongoCat终极指南:打造你的专属桌面互动伴侣 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 还在为单调的电脑…

作者头像 李华
网站建设 2026/2/3 6:01:40

MinerU降本部署案例:GPU按需使用,成本节省60%实操手册

MinerU降本部署案例:GPU按需使用,成本节省60%实操手册 1. 背景与痛点:PDF提取为何这么难? 你有没有遇到过这种情况:手头有一堆科研论文、技术文档或财务报表,全是PDF格式,想把内容转成Markdow…

作者头像 李华
网站建设 2026/2/3 6:24:21

BERT模型适合哪些场景?智能填空多行业落地案例

BERT模型适合哪些场景?智能填空多行业落地案例 1. BERT 智能语义填空服务 你有没有遇到过一句话写到一半,突然卡壳,不知道该用哪个词最贴切?或者在编辑文档时,发现某个关键词被误删,上下文都对但就是缺了…

作者头像 李华
网站建设 2026/1/29 22:28:21

Glyph部署优化指南:单卡4090D提速3倍

Glyph部署优化指南:单卡4090D提速3倍 在当前大模型推理场景中,长文本处理已成为一个普遍需求。然而,传统基于Token的上下文扩展方式面临显存占用高、计算开销大的瓶颈。智谱推出的 Glyph 视觉推理大模型另辟蹊径——它将长文本渲染为图像&am…

作者头像 李华
网站建设 2026/2/1 3:27:43

LibreCAD完全指南:从零掌握开源2D CAD设计精髓

LibreCAD完全指南:从零掌握开源2D CAD设计精髓 【免费下载链接】LibreCAD LibreCAD is a cross-platform 2D CAD program written in C14 using the Qt framework. It can read DXF and DWG files and can write DXF, PDF and SVG files. The user interface is hig…

作者头像 李华