动手学pytorch-文本嵌入预训练模型Glove
文本嵌入预训练模型Glove
1.文本嵌入预训练模型
虽然 Word2Vec 已经能够成功地将离散的单词转换为连续的词向量,并能一定程度上地保存词与词之间的近似关系,但 Word2Vec 模型仍不是完美的,它还可以被进一步地改进:
- 子词嵌入(subword embedding):FastText 以固定大小的 n-gram 形式将单词更细致地表示为了子词的集合,而 BPE (byte pair encoding) 算法则能根据语料库的统计信息,自动且动态地生成高频子词的集合;
- GloVe 全局向量的词嵌入: 通过等价转换 Word2Vec 模型的条件概率公式,可以得到一个全局的损失函数表达,并在此基础上进一步优化模型。
实际中,常常在大规模的语料上训练这些词嵌入模型,并将预训练得到的词向量应用到下游的自然语言处理任务中。本文以 GloVe 模型为例,用预训练好的词向量来求近义词和类比词。
2.GloVe
先简单回顾以下 Word2Vec 的损失函数(以 Skip-Gram 模型为例,不考虑负采样近似):
其中
是 \(w_i\) 为中心词,\(w_j\) 为背景词时 Skip-Gram 模型所假设的条件概率计算公式,将其简写为 \(q_{ij}\)。
注意到此时的损失函数中包含两个求和符号,它们分别枚举了语料库中的每个中心词和其对应的每个背景词。实际上还可以采用另一种计数方式,那就是直接枚举每个词分别作为中心词和背景词的情况:
其中 \(x_{ij}\) 表示整个数据集中 \(w_j\) 作为 \(w_i\) 的背景词的次数总和。
还可以将该式进一步地改写为交叉熵 (cross-entropy) 的形式如下:
其中 \(x_i\) 是 \(w_i\) 的背景词窗大小总和,\(p_{ij}=x_{ij}/x_i\) 是 \(w_j\) 在 \(w_i\) 的背景词窗中所占的比例。
从这里可以看出,的词嵌入方法实际上就是想让模型学出 \(w_j\) 有多大概率是 \(w_i\) 的背景词,而真实的标签则是语料库上的统计数据。同时,语料库中的每个词根据 \(x_i\) 的不同,在损失函数中所占的比重也不同。
注意到目前为止,只是改写了 Skip-Gram 模型损失函数的表面形式,还没有对模型做任何实质上的改动。而在 Word2Vec 之后提出的 GloVe 模型,则是在之前的基础上做出了以下几点改动:
- 使用非概率分布的变量 \(p'_{ij}=x_{ij}\) 和 \(q′_{ij}=\exp(\boldsymbol{u}^\top_j\boldsymbol{v}_i)\),并对它们取对数;
- 为每个词 \(w_i\) 增加两个标量模型参数:中心词偏差项 \(b_i\) 和背景词偏差项 \(c_i\),松弛了概率定义中的规范性;
- 将每个损失项的权重 \(x_i\) 替换成函数 \(h(x_{ij})\),权重函数 \(h(x)\) 是值域在 \([0,1]\) 上的单调递增函数,松弛了中心词重要性与 \(x_i\) 线性相关的隐含假设;
- 用平方损失函数替代了交叉熵损失函数。
综上,获得了 GloVe 模型的损失函数表达式:
由于这些非零 \(x_{ij}\) 是预先基于整个数据集计算得到的,包含了数据集的全局统计信息,因此 GloVe 模型的命名取“全局向量”(Global Vectors)之意。
载入预训练的 GloVe 向量
GloVe 官方 提供了多种规格的预训练词向量,语料库分别采用了维基百科、CommonCrawl和推特等,语料库中词语总数也涵盖了从60亿到8,400亿的不同规模,同时还提供了多种词向量维度供下游模型使用。
torchtext.vocab
中已经支持了 GloVe, FastText, CharNGram 等常用的预训练词向量,可以通过声明 torchtext.vocab.GloVe
类的实例来加载预训练好的 GloVe 词向量。
3.求近义词和类比词
求近义词
由于词向量空间中的余弦相似性可以衡量词语含义的相似性,可以通过寻找空间中的 k 近邻,来查询单词的近义词。
求类比词
除了求近义词以外,还可以使用预训练词向量求词与词之间的类比关系,例如“man”之于“woman”相当于“son”之于“daughter”。求类比词问题可以定义为:对于类比关系中的4个词“\(a\) 之于 \(b\) 相当于 \(c\) 之于 \(d\)”,给定前3个词 \(a,b,c\) 求 \(d\)。求类比词的思路是,搜索与 \(\text{vec}(c)+\text{vec}(b)−\text{vec}(a)\) 的结果向量最相似的词向量,其中 \(\text{vec}(w)\) 为 \(w\) 的词向量。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 趁着过年的时候手搓了一个低代码框架
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现