NLP模型(二)——GloVe介绍
文章目录
- 1. GloVe模型简述
- 2. 共现矩阵
- 3. 共现概率
- 4. 共现概率比
- 4. GloVe算法
- 5. 损失函数
- 6. 得出结果
1. GloVe模型简述
获取词向量基本上有两种思路:
- 利用全局统计信息,进行矩阵分解(如LSA)来获取词向量,这样获得的词向量往往在词相似性任务上表现不好,表明这是一个次优的向量空间结构;
- 利用局部上下文窗口单独训练,比如前面的word2vec算法,但是统计信息作为有用的先验知识,没有很好的利用到。
前面我们介绍了word2vec模型,并对 Skip−gramSkip-gramSkip−gram 算法进行了实现,但是,尽管word2vec在学习词与词间的关系上有了大进步,它却有很明显的缺点:只能利用一定窗口长度的上下文环境,即利用局部信息,没法利用整个语料库的全局信息。基于此,GloVe 模型诞生了,它的全称是 globalvectorglobal \hspace{0.5em} vectorglobalvector,其目的就是改进对word2vec的这个缺点进行改进,运用到全局的语料信息。
2. 共现矩阵
想要捕捉全文的语义信息,这就不得不提共现矩阵了。共现矩阵反映了在预料库中,中心词与关联词的关联程度,这是一种基于统计的方法。首先创建一个窗口大小,与word2vec一样,使得窗口不断的滑动并得到中心词与背景词的关联程度,出现在同一个窗口关联程度+1,创建一个全局的词表矩阵来记录所有的关联程度。
这里用一个例子来说明共现矩阵的创建。
比如下面的词语:
Tobeornottobe,thatisquestion.To \hspace{0.5em} be \hspace{0.5em} or \hspace{0.5em} not \hspace{0.5em} to \hspace{0.5em} be, that \hspace{0.5em} is \hspace{0.5em} question. Tobeornottobe,thatisquestion.
假设我们已经对其标点符号及大小写进行了处理(统一小写),这里我们设置窗口长度为1,即窗口左边长为1,右边长为1,窗口如下:
以 tototo 为中心时,一同出现的有 bebebe,则矩阵中坐标为 (to,be)(to, be)(to,be) 的共现数+1,窗口不断滑动,我们设共现矩阵中一行为中心词,一列代表背景词,则最后的共现矩阵如下:
words | to | be | or | not | that | is | question |
---|---|---|---|---|---|---|---|
to | 0 | 2 | 0 | 1 | 0 | 0 | 0 |
be | 2 | 0 | 1 | 0 | 1 | 0 | 0 |
or | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
not | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
that | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
is | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
question | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
共现矩阵很明显是一个对称矩阵,为什么说共现矩阵是基于全局语料信息的矩阵呢?共现矩阵的构建需要遍历全文,存储了全文中几个词之间的关联程度,这里存储了全文中的几个词取决于窗口的大小。
3. 共现概率
有了共现矩阵,我们就可以做很多事情了,最典型的就是潜在语义分析(LSA)算法,对其进行奇异值分解以及截断奇异值分解,得到相应的矩阵,当然这里并不使用这些,这里我们要用到的是共现概率。
设共现矩阵中的元素为 xijx_{ij}xij,则定义共现概率如下:
P(xij)=P(wordj∣wordi)=xijxiP(x_{ij})=P(word_j|word_i)=\frac{x_{ij}}{x_i} P(xij)=P(wordj∣wordi)=xixij其中 xix_ixi 为共现矩阵中以 wordiword_iwordi 为中心词的所有出现频次,计算式为 xi=∑k=0Nxikx_i=\sum_{k=0}^Nx_{ik}xi=∑k=0Nxik,整个式子也很好理解,即所有以 wordiword_iwordi 为中心词的窗口中 wordjword_jwordj 出现的概率。
4. 共现概率比
词的共现次数与其语义的相关性往往不是严格成比例,所以直接用共线性来表征词之间相关性效果不好,因此,作者通过引入第三个词,通过词之间的差异来刻画相关性。词之间的差异选择用两个词与同一个词的共现概率的次数来更好的判断词之间的相关性。
设三个单词为 wi,wj,wkw_i,w_j,w_kwi,wj,wk,则共现概率比表示如下:
p(wk∣wi)p(wk∣wj)=pikpjk=xikxixjkxj\frac{p(w_k|w_i)}{p(w_k|w_j)}=\frac{p_{ik}}{p_{jk}}=\frac{\frac{x_{ik}}{x_i}}{\frac{x_{jk}}{x_j}} p(wk∣wj)p(wk∣wi)=pjkpik=xjxjkxixik下面我用论文中的例子来对共现概率比进行一个解释。
- 首先看第一行 P(k∣ice)P(k|ice)P(k∣ice),iceiceice是冰,当 k=solidk=solidk=solid 时,其概率大于第二行的 P(k∣steam)P(k|steam)P(k∣steam),这是很正常的;
- 然后看第三行 P(k∣ice)/P(k∣steam)P(k|ice)/P(k|steam)P(k∣ice)/P(k∣steam),当 k=solidk=solidk=solid 时,由于 solidsolidsolid 与 iceiceice 的相关程度更高,所以比值大于1;
- 在第三行中,当 k=gask=gask=gas 时,由于 gasgasgas 与 steamsteamsteam 的相关程度更高,所以比值小于1;
- 在第三行中,当 k=waterk=waterk=water 时,由于 waterwaterwater 与 ice,steamice,steamice,steam 都有关,所以比值在1的附近,当 k=fashionk=fashionk=fashion 时,由于 fashionfashionfashion 与 ice,steamice,steamice,steam 都无关,所以比值也在1的附近。
所以,我们想训练的目的就很明显了,我们需要做的就是让这三词的词向量去满足这个共现概率比,与分母有关的比值比1高,与分子更有关的比值比1小,与分子分母都有关或都无关的比值维持在1附近。
4. GloVe算法
结合上面的共现概率比,设中心词的词向量为 vi,vjv_i,v_jvi,vj,关联的背景向量为 uku_kuk,所以我们就是要找到一种映射关系 fff,使得
f(vi,vj,uk)=pikpjkf(v_i,v_j,u_k)=\frac{p_{ik}}{p_{jk}} f(vi,vj,uk)=pjkpik由于 vi,vj,ukv_i,v_j,u_kvi,vj,uk 为向量,右边的概率为标量,向量经过运算得到一个标量,那只能是经过内积运算了,内积肯定是 v,uv,uv,u 向量之间的内积,但是 vvv 向量有两个,这怎么处理呢?
作者使用的是两个中心词向量的差来与背景词向量进行内积,如下
f((vi−vj)Tuk)=f(viTuk−vjTuk)=pikpjkf((v_i-v_j)^Tu_k)=f(v_i^Tu_k-v_j^Tu_k)=\frac{p_{ik}}{p_{jk}} f((vi−vj)Tuk)=f(viTuk−vjTuk)=pjkpik因为中心词向量的差可以去除共线性,即取出向量中的相似关系。
再对上式进行观察,左边是差 viTuk−vjTukv_i^Tu_k-v_j^Tu_kviTuk−vjTuk,而右边是分式,差转为分式,很容易想到使用指数的形式,因为 ea−b=ea⋅e−b=ea/ebe^{a-b}=e^a \cdot e^{-b}={e^a}/{e^b}ea−b=ea⋅e−b=ea/eb,刚好是分式的形式,所以,将其设为映射 fff 可得
f(viTuk−vjTuk)=eviTuk−vjTuk=pikpjkf(v_i^Tu_k-v_j^Tu_k)=e^{v_i^Tu_k-v_j^Tu_k}=\frac{p_{ik}}{p_{jk}} f(viTuk−vjTuk)=eviTuk−vjTuk=pjkpik即
eviTuk=pike^{v_i^Tu_k}={p_{ik}} eviTuk=pik两边同时取对数消除指数得到
viTuk=logpik=logxikxi=logxik−logxi\begin{aligned} v_i^Tu_k&=\log p_{ik} \\ &=\log{\frac{x_{ik}}{x_i}} \\ &=\log x_{ik} - \log x_i \end{aligned}viTuk=logpik=logxixik=logxik−logxi这样就找到了一种映射满足右边的分式了。
但是,这还没有完成!向量的内积是可以交换顺序的,即 viTuk=ukTviv_i^Tu_k=u_k^Tv_iviTuk=ukTvi,如果使用上面的式子的话,得到的是
viTuk=ukTvilogxik−logxi=logxki−logxklogxi=logxk\begin{aligned} v_i^Tu_k&=u_k^Tv_i \\ \log x_{ik} - \log x_i&=\log x_{ki} - \log x_k \\ \log x_i&=\log x_k \end{aligned}viTuklogxik−logxilogxi=ukTvi=logxki−logxk=logxk因为共现矩阵是对称矩阵,所以 xki=xikx_{ki}=x_{ik}xki=xik,故得到 logxi=logxk\log x_i=\log x_klogxi=logxk,但是,这个式子明显不是恒等式,所以这个公式的推导并不能成立。
作者在论文中对上述公式进行了改写,改为
viTuk=logxik−bi−bkv_i^Tu_k=\log x_{ik} - b_i-b_k viTuk=logxik−bi−bk这样式子就能很好的满足交换后依然相等的性质,这里的 bi,bkb_i,b_kbi,bk 为偏置常数,是可学习的参数。
5. 损失函数
上面共现概率比是一个标量,我们也是将向量通过表达式转为标量来进行的训练,这样,相当于就是一个回归问题,那么很自然的就可以使用均方差作为损失函数,损失如下:
loss=∑i,k(viTuk+bi+bk−logxik)2loss=\sum_{i,k}(v_i^Tu_k + b_i+b_k-\log x_{ik})^2 loss=i,k∑(viTuk+bi+bk−logxik)2哈佛大学的语言学家乔治·金斯利·齐夫(GeorgeKingsleyZipfGeorge \hspace{0.5em}Kingsley\hspace{0.5em} ZipfGeorgeKingsleyZipf)于1949年发表的齐夫定律(Zipf′slawZipf's \hspace{0.5em} lawZipf′slaw)表述为:在自然语言的语料库里,一个单词出现的频率与它在频率表里的排名成反比。
根据齐夫定律,高频词往往携带的信息较少,而低频词往往携带较多的信息。若损失函数这样设置,将会使得模型趋于高频词,所以作者加了一个惩罚系数 f(xik)f(x_{ik})f(xik),使得损失如下
loss=∑i,kf(xik)(viTuk+bi+bk−logxik)2loss=\sum_{i,k}f(x_{ik})(v_i^Tu_k + b_i+b_k-\log x_{ik})^2 loss=i,k∑f(xik)(viTuk+bi+bk−logxik)2 f(xik)f(x_{ik})f(xik) 表达式如下
f(x)={(xxmax)α,x≤xmax1,otherwisef(x)=\left\{ \begin{aligned} &(\frac{x}{x_{max}})^{\alpha},&x \le x_{max}\\ &1,&otherwise \end{aligned} \right. f(x)=⎩⎨⎧(xmaxx)α,1,x≤xmaxotherwise其中 xmaxx_{max}xmax 的为一个超参数,表示一个阈值,即词出现的次数,超过 xmaxx_{max}xmax 即为高频词,其次数 α\alphaα 也是超参数,作者选取的是word2vec中的0.75。这样的表达能够对高频的惩罚多一些,而减少对低频次的惩罚。
6. 得出结果
照上面的方法训练,可以得到两个词向量矩阵,即中心词向量矩阵 VVV 和背景词向量矩阵 VVV ,word2vec模型只拿了其中一个矩阵来进行作为最终的词向量,作者的做法是将其进行相加,即
ri=ui+vir_i=u_i+v_i ri=ui+vi其中 rir_iri 为最终使用的词向量矩阵 RRR 中的元素。
NLP模型(二)——GloVe介绍相关推荐
- NLP模型(二)——GloVe实现
文章目录 1. 整体思路 2. 数据准备 3. 构造共现矩阵 4. 得到序列 5. 创建数据管道 6. 模型构建 7. 模型训练 8. 加载模型测试 1. 整体思路 在这个算法中,为了使得效果比较有对 ...
- NLP(二十五)实现ALBERT+Bi-LSTM+CRF模型
在文章NLP(二十四)利用ALBERT实现命名实体识别中,笔者介绍了ALBERT+Bi-LSTM模型在命名实体识别方面的应用. 在本文中,笔者将介绍如何实现ALBERT+Bi-LSTM+CRF ...
- NLP(二)文本生成 --VAE与GAN模型和迁移学习
NLP(二)文本生成 --VAE与GAN模型和迁移学习 VAE与GAN模型和迁移学习 1. Auto Encoder 自编码器 1.1 结构 1.2 核心思想 1.3 损失函数 1.4 Denoisi ...
- 【NLP】from glove import Glove的使用、模型保存和加载
1 引言 不要被stackflow的上的一个的回答所误导. 2 使用方法举例 # 语料 sentense = [['你', '是', '谁'], ['我', '是', '中国人']] corpus_m ...
- 神经网络并不是尚方宝剑,我们需要正视深度 NLP 模型的泛化问题
来源:AI 科技评论 前段时间的文章<顶会见闻系列:ACL 2018,在更具挑战的环境下理解数据表征及方法评价>中,我们介绍了 ACL 大会上展现出的 NLP 领域的最新研究风向和值得关注 ...
- 如何0代码、快速定制企业级NLP模型?百度技术大咖在线解析,可报名
位来 发自 凹非寺 量子位 报道 | 公众号 QbitAI 近几年以预训练为代表的NLP技术取得了爆发式发展,新技术新模型层出不穷. 在新时代背景下,如何将最先进的NLP领域科研成果,高效地应用到产业 ...
- 百分点认知智能实验室:NLP模型开发平台在舆情分析中的设计和实践(下)
编者按 NLP模型开发平台是以快速打造智能业务为核心目标,无需机器学习专业知识,模型创建-数据上传-数据标注(智能标注.数据扩充)-模型训练-模型发布-模型校验全流程可视化便捷操作,短时间内即可获得高 ...
- 本周六锁定成都!解析百度文心(ERNIE)如何助力快速定制企业级NLP模型
继去年巡回公开课后,百度AI快车道[EasyDL零门槛模型训练营]将再次锁定天府之国成都!小伙伴们,这周六莫吃火锅喽,一哈去快车道嘛! 本周六,百度NLP资深研发工程师将为成都地区的开发者们带来满满的 ...
- NLP模型开发平台在舆情分析中的设计和实践
"数据猿年度重磅活动预告:2020年度金猿策划活动(金猿榜单发布+金猿奖杯颁发)即将推出,尽情咨询期待! 大数据产业创新服务媒体 --聚焦数据 · 改变商业 编者按 NLP模型开发平台是以快 ...
- NLP模型应用之三:GPT与GPT-2
GPT模型 GPT全称Generative Pre-Training,出自2018年OpenAi发布的论文<Improving Language Understandingby Generati ...
最新文章
- JSP基本语法:文件结构、脚本元素、指令元素、动作元素
- C# 将数据写入PDF文档
- Openlayers中多图层遮挡时调整图层上下顺序
- Bitmap Font生成
- fedora27 GPaste
- Linux 命令(42)—— join 命令
- 在linux内核中操作文件的方法--使用get_fs()和set_fs(KERNEL_DS)
- 用计算机弹雅俗共赏,聊聊雅俗共赏:钢琴、饺子和面
- python画折线图-手把手教你Python yLab的绘制折线图的画法
- Java——can U do
- win10扬声器没有声音但插入耳机有声音
- 【RL系列】马尔可夫决策过程——Gambler's Problem
- android 没有指南针,Android指南针指向我的位置,而不是北部
- 元宇宙到底是什么?让我们来看看科技达人们是怎么讲的。
- 「 C++ 函数 」“WSAStartup()使用”讲解
- 接口测试—-工具篇,实现接口自动化
- rename命令批量改名字
- 1月10日前未完成《创业创新执行力》考试的补救措施
- 基于人工智能视觉芯的高速公路交通事故预警预测方案
- struct lnode是什么结构类型_练字应该练什么之:汉字基本结构的类型