词嵌入进阶

在“Word2Vec的实现”一节中,我们在小规模数据集上训练了一个 Word2Vec 词嵌入模型,并通过词向量的余弦相似度搜索近义词。虽然 Word2Vec 已经能够成功地将离散的单词转换为连续的词向量,并能一定程度上地保存词与词之间的近似关系,但 Word2Vec 模型仍不是完美的,它还可以被进一步地改进:

  1. 子词嵌入(subword embedding):FastText 以固定大小的 n-gram 形式将单词更细致地表示为了子词的集合,而 BPE (byte pair encoding) 算法则能根据语料库的统计信息,自动且动态地生成高频子词的集合;
  2. GloVe 全局向量的词嵌入: 通过等价转换 Word2Vec 模型的条件概率公式,我们可以得到一个全局的损失函数表达,并在此基础上进一步优化模型。

实际中,我们常常在大规模的语料上训练这些词嵌入模型,并将预训练得到的词向量应用到下游的自然语言处理任务中。本节就将以 GloVe 模型为例,演示如何用预训练好的词向量来求近义词和类比词。

GloVe 全局向量的词嵌入

GloVe 模型

先简单回顾以下 Word2Vec 的损失函数(以 Skip-Gram 模型为例,不考虑负采样近似):

$$

-\sum_{t=1}^T\sum_{-m\le j\le m,j\ne 0} \log P(w^{(t+j)}\mid w^{(t)})

$$

其中

$$

P(w_j\mid w_i) = \frac{\exp(\boldsymbol{u}_j\top\boldsymbol{v}_i)}{\sum_{k\in\mathcal{V}}\exp(\boldsymbol{u}_k\top\boldsymbol{v}_i)}

$$

wiw_iwi 为中心词,wjw_jwj 为背景词时 Skip-Gram 模型所假设的条件概率计算公式,我们将其简写为 qijq_{ij}qij

注意到此时我们的损失函数中包含两个求和符号,它们分别枚举了语料库中的每个中心词和其对应的每个背景词。实际上我们还可以采用另一种计数方式,那就是直接枚举每个词分别作为中心词和背景词的情况:

$$

-\sum_{i\in\mathcal{V}}\sum_{j\in\mathcal{V}} x_{ij}\log q_{ij}

$$

其中 xijx_{ij}xij 表示整个数据集中 wjw_jwj 作为 wiw_iwi 的背景词的次数总和。

我们还可以将该式进一步地改写为交叉熵 (cross-entropy) 的形式如下:

$$

-\sum_{i\in\mathcal{V}}x_i\sum_{j\in\mathcal{V}}p_{ij} \log q_{ij}

$$

其中 xix_ixiwiw_iwi 的背景词窗大小总和,pij=xij/xip_{ij}=x_{ij}/x_ipij=xij/xiwjw_jwjwiw_iwi 的背景词窗中所占的比例。

从这里可以看出,我们的词嵌入方法实际上就是想让模型学出 wjw_jwj 有多大概率是 wiw_iwi 的背景词,而真实的标签则是语料库上的统计数据。同时,语料库中的每个词根据 xix_ixi 的不同,在损失函数中所占的比重也不同。

注意到目前为止,我们只是改写了 Skip-Gram 模型损失函数的表面形式,还没有对模型做任何实质上的改动。而在 Word2Vec 之后提出的 GloVe 模型,则是在之前的基础上做出了以下几点改动:

  1. 使用非概率分布的变量 pij′=xijp'_{ij}=x_{ij}pij=xijq′ij=exp⁡(uj⊤vi)q′_{ij}=\exp(\boldsymbol{u}^\top_j\boldsymbol{v}_i)qij=exp(ujvi),并对它们取对数;
  2. 为每个词 wiw_iwi 增加两个标量模型参数:中心词偏差项 bib_ibi 和背景词偏差项 cic_ici,松弛了概率定义中的规范性;
  3. 将每个损失项的权重 xix_ixi 替换成函数 h(xij)h(x_{ij})h(xij),权重函数 h(x)h(x)h(x) 是值域在 [0,1][0,1][0,1] 上的单调递增函数,松弛了中心词重要性与 xix_ixi 线性相关的隐含假设;
  4. 用平方损失函数替代了交叉熵损失函数。

综上,我们获得了 GloVe 模型的损失函数表达式:

$$

\sum_{i\in\mathcal{V}}\sum_{j\in\mathcal{V}} h(x_{ij}) (\boldsymbol{u}^\top_j\boldsymbol{v}i+b_i+c_j-\log x{ij})^2

$$

由于这些非零 xijx_{ij}xij 是预先基于整个数据集计算得到的,包含了数据集的全局统计信息,因此 GloVe 模型的命名取“全局向量”(Global Vectors)之意。

载入预训练的 GloVe 向量

GloVe 官方 提供了多种规格的预训练词向量,语料库分别采用了维基百科、CommonCrawl和推特等,语料库中词语总数也涵盖了从60亿到8,400亿的不同规模,同时还提供了多种词向量维度供下游模型使用。

torchtext.vocab 中已经支持了 GloVe, FastText, CharNGram 等常用的预训练词向量,我们可以通过声明 torchtext.vocab.GloVe 类的实例来加载预训练好的 GloVe 词向量。

import torch
import torchtext.vocab as vocabprint([key for key in vocab.pretrained_aliases.keys() if "glove" in key])
cache_dir = "/home/kesci/input/GloVe6B5429"
glove = vocab.GloVe(name='6B', dim=50, cache=cache_dir)
print("一共包含%d个词。" % len(glove.stoi))
print(glove.stoi['beautiful'], glove.itos[3366])
['glove.42B.300d', 'glove.840B.300d', 'glove.twitter.27B.25d', 'glove.twitter.27B.50d', 'glove.twitter.27B.100d', 'glove.twitter.27B.200d', 'glove.6B.50d', 'glove.6B.100d', 'glove.6B.200d', 'glove.6B.300d']
一共包含400000个词。
3366 beautiful

求近义词和类比词

求近义词

由于词向量空间中的余弦相似性可以衡量词语含义的相似性(为什么?),我们可以通过寻找空间中的 k 近邻,来查询单词的近义词。

def knn(W, x, k):'''@params:W: 所有向量的集合x: 给定向量k: 查询的数量@outputs:topk: 余弦相似性最大k个的下标[...]: 余弦相似度'''cos = torch.matmul(W, x.view((-1,))) / ((torch.sum(W * W, dim=1) + 1e-9).sqrt() * torch.sum(x * x).sqrt())_, topk = torch.topk(cos, k=k)topk = topk.cpu().numpy()return topk, [cos[i].item() for i in topk]def get_similar_tokens(query_token, k, embed):'''@params:query_token: 给定的单词k: 所需近义词的个数embed: 预训练词向量'''topk, cos = knn(embed.vectors,embed.vectors[embed.stoi[query_token]], k+1)for i, c in zip(topk[1:], cos[1:]):  # 除去输入词print('cosine sim=%.3f: %s' % (c, (embed.itos[i])))get_similar_tokens('chip', 3, glove)
cosine sim=0.856: chips
cosine sim=0.749: intel
cosine sim=0.749: electronics100%|█████████▉| 398393/400000 [00:30<00:00, 38997.22it/s]
get_similar_tokens('baby', 3, glove)
cosine sim=0.839: babies
cosine sim=0.800: boy
cosine sim=0.792: girl
get_similar_tokens('beautiful', 3, glove)
cosine sim=0.921: lovely
cosine sim=0.893: gorgeous
cosine sim=0.830: wonderful

求类比词

除了求近义词以外,我们还可以使用预训练词向量求词与词之间的类比关系,例如“man”之于“woman”相当于“son”之于“daughter”。求类比词问题可以定义为:对于类比关系中的4个词“aaa 之于 bbb 相当于 ccc 之于 ddd”,给定前3个词 a,b,ca,b,ca,b,cddd。求类比词的思路是,搜索与 vec(c)+vec(b)−vec(a)\text{vec}(c)+\text{vec}(b)−\text{vec}(a)vec(c)+vec(b)vec(a) 的结果向量最相似的词向量,其中 vec(w)\text{vec}(w)vec(w)www 的词向量。

def get_analogy(token_a, token_b, token_c, embed):'''@params:token_a: 词atoken_b: 词btoken_c: 词cembed: 预训练词向量@outputs:res: 类比词d'''vecs = [embed.vectors[embed.stoi[t]] for t in [token_a, token_b, token_c]]x = vecs[1] - vecs[0] + vecs[2]topk, cos = knn(embed.vectors, x, 1)res = embed.itos[topk[0]]return resget_analogy('man', 'woman', 'son', glove)
'daughter'
get_analogy('beijing', 'china', 'tokyo', glove)
'japan'
get_analogy('bad', 'worst', 'big', glove)
'biggest'
get_analogy('do', 'did', 'go', glove)
'went'

《动手学深度学习》Task06-3:词嵌入进阶相关推荐

  1. 《动手学深度学习》task7_3 词嵌入进阶

    系统学习<动手学深度学习>点击下面这个链接,有全目录哦~ https://blog.csdn.net/Shine_rise/article/details/104754764 本篇目录 词 ...

  2. 《动手学深度学习》task3_3 循环神经网络进阶

    目录 GRU GRU 重置门和更新门 候选隐藏状态 隐藏状态 GRU的实现 载入数据集 初始化参数 GRU模型 训练模型 简洁实现 LSTM 长短期记忆 输入门.遗忘门和输出门 候选记忆细胞 记忆细胞 ...

  3. 动手学深度学习之词嵌入基础及进阶

    参考伯禹学习平台<动手学深度学习>课程内容内容撰写的学习笔记 原文链接:https://www.boyuai.com/elites/course/cZu18YmweLv10OeV/less ...

  4. 动手学深度学习Pytorch Task06

    本节课内容批量归一化和残差网络.凸优化.梯度下降 一.批量归一化和残差网络 1.批量归一化 对输入的标准化(浅层模型):处理后的任意一个特征在数据集中所有样本上的均值为0.标准差为1.标准化处理输入数 ...

  5. 资源 | 李沐等人开源中文书《动手学深度学习》预览版上线

    来源:机器之心 本文约2000字,建议阅读10分钟. 本文为大家介绍了一本交互式深度学习书籍. 近日,由 Aston Zhang.李沐等人所著图书<动手学深度学习>放出了在线预览版,以供读 ...

  6. 《动手学深度学习》PyTorch版本

    Dive-Into-Deep-Learning-PyTorch-PDF 简介   本项目对中文版<动手学深度学习>中的代码进行整理,并参考一些优秀的GitHub项目给出基于PyTorch的 ...

  7. 【深度学习】李沐《动手学深度学习》的PyTorch实现已完成

    这个项目是中文版<动手学深度学习>中的代码进行整理,用Pytorch实现,是目前全网最全的Pytorch版本. 项目作者:吴振宇博士 简介   Dive-Into-Deep-Learnin ...

  8. 送10本今年最火的《动手学深度学习》

    点击我爱计算机视觉标星,更快获取CVML新技术 52CV曾经多次介绍FlyAI机器学习竞赛平台,不少粉丝也曾在FlyAI拿到现金奖励. 本次52CV & FlyAI联合送书,CV君查找了两天, ...

  9. 《动手学深度学习》TF2.0 实现

    本项目将<动手学深度学习> 原书中MXNet代码实现改为TensorFlow2.0实现.经过我的导师咨询李沐老师,这个项目的实施已得到李沐老师的同意.原书作者:阿斯顿·张.李沐.扎卡里 C ...

  10. 伯禹公益AI《动手学深度学习PyTorch版》Task 07 学习笔记

    伯禹公益AI<动手学深度学习PyTorch版>Task 07 学习笔记 Task 07:优化算法进阶:word2vec:词嵌入进阶 微信昵称:WarmIce 优化算法进阶 emmmm,讲实 ...

最新文章

  1. sql server分布式事务解决方案[新事务不能登记到指定的事务处理器中错误]
  2. Excel VBA参考文献中人名与年份格式转换
  3. Android -- 使用inBitmap要注意的地方
  4. 关于抢红包的_关于抢红包的作文500字
  5. 柯美复印机服务器操作系统,柯尼卡美能达C350复印机网传真设置
  6. Android基于mAppWidget实现手绘地图(三)--环境搭建
  7. Flash播放控件属性详解
  8. TF2 keras Tensoboard学习总结
  9. OpenCV4每日一练day5:图像读取、显示与保存
  10. Rails测试《十》不能错过的杂七杂八
  11. java excel导出 模板_Java Excel 导出 模板
  12. 赣州计算机教师招聘,江西省赣州市章贡区2019年招聘教师人员岗位表
  13. Kinect 数据录制与回放
  14. [附源码]计算机毕业设计JAVA 宠物医院管理系统
  15. TDDL分布式数据库
  16. 英语 1038个词根 后缀217个!
  17. 【资料】分享北京某培训机构全部学习课程加个人的一些学习上的建议
  18. 湖南师范大学2018年大学生程序设计竞赛新生赛小名的回答
  19. 提升思考力的8种日常训练法
  20. 用Python爬取拉钩网招聘职位信息

热门文章

  1. 过采样之SMOTE算法
  2. 可编辑ppt地图分布图怎么做?
  3. android怎么改变字体,如何修改安卓手机字体 详细安卓字体修改图文教程
  4. 【JavaScript】使用DOM修改和查询CSS内联样式
  5. Android从Assets复制文件到本地
  6. k2p 登录路由器shell失败_斐讯路由器无法进入路由器登录管理界面怎么办
  7. PowerPC技术与市场杂谈
  8. javaweb项目JSP网上书店购物电商系统毕业设计
  9. stm32f103c6t6制作音乐频谱分析仪
  10. 用于遥感图像语义分割和单视图高度估计的编码器-双解码器IGARSS2019