首页 > 其他分享 >NLP(四十六):GLOVE

NLP(四十六):GLOVE

时间:2023-07-16 17:45:12浏览次数:27  
标签:NLP 函数 GLOVE 模型 矩阵 Glove 单词 四十六 向量

转载自https://zhuanlan.zhihu.com/p/58916233

在上节,我们学习了词向量的两种训练方式:Skip-Gram和CBOW,都是通过句子中的某个单词去预测另一个单词。而本节,我们将学习第三种词向量的训练模型:GLOVE[1]。

GLOVE模型是由斯坦福教授Manning、Socher等人于2014年提出的一种词向量训练模型,该模型的提出正是在Skip-Gram和CBOW模型出来一年之后。

Manning教授是斯坦福自然语言处理热门课程CS224n的主讲导师,同时其在2018年末接替李飞飞教授成为了斯坦福人工智能实验室的主任。

区别于Skip-Gram和CBOW,GLOVE模型的训练并没有使用神经网络,而是计算共线矩阵通过统计的方法获得。

GLOVE模型获得词向量的步骤可以简单分为两步:

  1. 构造共现矩阵。
  2. 构造损失函数并训练模型。

1. 构造共现矩阵

GLOVE模型训练词向量的第一步骤是根据语料库构建共现矩阵X。假设语料库的大小为N(即有N个单词),则共现矩阵是一个形状为(N, N)的二维向量,其中每个元素 ��� 当窗口滑动遍历完整个语料库之后,即可更新得到共线矩阵X,比如代表单词i和单词j共同出现在一个窗口(window)中的频数。

我们假设语料库中有如下句子,共包含8个单词:

I would like a glass of orange juice.

设置window_size=2,即中心词左右2个单词记为上下文词,其包括中心词构成窗口里面的词。如果我们从左到右滑动窗口,每滑动一次记录一个新的窗口,则会生成以下窗口内容:

当窗口滑动到编号3时,中心词为like,窗口内的词为I、would、like、a、glass,因此对共现矩阵内的元素进行更新:

�����,�=�����,�+1�����,�����=�����,�����+1�����,�=�����,�+1�����,�����=�����,�����+1

当窗口滑动遍历完整个语料库之后,即可更新得到共线矩阵X,比如:

 I would like a glass of orange juice.
 I like orange juice.

理解了Glove中的共现矩阵之后,我们将依此构造Glove模型的目标损失函数。

 

2 构造损失函数

 

在写Glove的损失函数前,我们先看看最简单的线性回归的损失函数,即平方误差损失函数。

平方误差损失函数: �=∑��[(���+�)−�(�)]2

我们希望预测值 ���+� 和实际值 �� 的差距越小越好,反应在函数中即损失函数J的值越小越好(上图中各灰色线段越短越好), 加上平方则是避免值为负数且方便求导。可见,在平方误差损失函数的训练过程中,预测值和实际值的差距将越来越小。

从平方误差损失函数出发,我们只需要找到两个值,其中一个代表词向量,另外一个代表它的真实标签,我们就可以借助平方误差损失函数让它们越来越接近,最后得到词向量。

然而我们并不能找到一个真实标签来直接代表词向量,所以在论文中采用了一种迂回的方法,即以单词i和单词j共同出现在一个窗口(window)中的频数作为真实标签,以词向量的点乘作为预测值。

由此我们先写下一个Glove模型的简化版损失函数。

�=∑�,��(�����−���(��,�))2

其中, �� 和 �� 是在初始阶段单词i和单词j的词向量(在后续的训练中会逼近真实的词向量), ��,� 为根据共现矩阵得到的单词i和单词j共同出现在一个窗口(window)中的频数。

有线性代数基础的同学应该知道向量的点乘结果类似余弦相似度可以在一定程度上反映两个向量的相近程度,此处就是使用两个词向量的点乘来反映预测相似度,以两个单词共同出现的频数来反映实际相似度。通过对平方误差损失函数的不断训练,可以让预测相似度不断地逼近实际相似度,当预测相似度和实际相似度非常的接近时,我们也就得到了我们想要的词向量。

理解了简化版Glove损失函数之后对Glove的理解就差不多了,剩下的细枝末节只是为了让模型更鲁棒。

由于 ��,� 有可能为0,即两个单词从来都没有一起出现过。则 ���(���) 变为 ���0 是未定义的,所以我们需要加上一个加权项 �(���) ,即:

�=∑�,���(���)(�����−���(��,�))2

使得当 ��� 为0时, �(���) ,即跳过这一项。同时 �(���) 还有一个作用是使得常出现的词如(this, is, he I)等不会有太大的权重值,而一些很少出现的词比如(incessant、retention)等不会有太小的权重。通俗来说,就是告诫模型不要一直盯着那些一直出现的词,也要照顾一下那些很少出现的词。

最后,为了增强模型的鲁棒性,作者像在线性回归中加入偏置项一样在Glove模型中也加入了偏置项,得到了最终的损失函数模型:

�=∑�,���(���)[(�����+��+��)−���(��,�)]2

通过训练这个损失函数使得J最小,我们也就得到了训练好的词向量。

3. Glove和Skip-Gram、CBOW的区别

Glove相对于Skip-Gram和CBOW利用了词共现的信息,即不仅仅关注word2vector窗口大小的上下文,而是利用共现矩阵用到了全局的信息。

同时,Glove的优点是训练快,可以拓展到大规模语料,也适用于小规模语料和小向量,且最终效果通常更好。

4. 词向量测评

到目前为止,我们已经学习了词向量及其应用,以及训练获得词向量的三种模型。基于不同的语料库和不同的模型训练出来的词向量都有差别,所以摆在眼前的问题是:如何评价词向量的好坏?

目前常用的评价方法主要有两种:

  • 内部对比分析

内部对比分析即借助我们在以前提到的余弦相似度。该任务是给定三个词,比如"king"、"queen"、"man",然后遍历语料计算余弦相似度进行查找,即"queen"对于"king"相当于什么词对于"man"?若是通过词向量能准确定位到"woman"这个词,代表这个样本定位成功。在实际中是借助人工标记,进行多个类比对比,比如"Chinese"对于"China"和"Japanese"对于"Japan"等。

  • 外部任务测评

外部任务评价则更好理解,即借助不同的词向量进行同样的文本处理任务,比如情感分类等,通过情感分类任务的预测准确度来评价不同词向量的好坏。

 

你需要带走的知识点:)

1. 什么是共线矩阵?其维度是多少?每个元素代表什么含义?

2. 如何理解Glove的损失函数?

3. Glove和Skip-Gram、CBOW的区别?

4. 如何评价词向量的好坏?

 

[1]: Pennington J, Socher R, Manning C. Glove: Global vectors for word representation[C]//Proceedings of the 2014 conference on empirical methods in natural language processing (EMNLP). 2014: 1532-1543.

标签:NLP,函数,GLOVE,模型,矩阵,Glove,单词,四十六,向量
From: https://www.cnblogs.com/zhangxianrong/p/17558235.html

相关文章

  • 机器翻译|EMNLP 2019大规模利用单语数据提升神经机器翻译
    目前,目标语言端的无标注单语数据已被广泛应用于在机器翻译任务中。然而,目标语言端的无标注数据一旦使用不当,反而会给模型结果带来负面影响。为了有效利用大规模源语言端和目标语言端的单语数据,微软亚洲研究院在EMNLP2019上发表的论文中,提出一种简单的语料数据使用流程,只需要四......
  • NLP | 数据增强总览
    深度学习视觉领域的增强方法可以很大程度上提高模型的表现,并减少数据的依赖,而NLP上做数据增强不像在图像上那么方便,但还是有一些方法的。与计算机视觉中使用图像进行数据增强不同,NLP中文本数据增强是非常罕见的。这是因为图像的一些简单操作,如将图像旋转或将其转换为灰度,并不会改......
  • 论文日记四:Transformer(论文解读+NLP、CV项目实战)
    导读重磅模型transformer,在2017年发布,但就今天来说产生的影响在各个领域包括NLP、CV这些都是巨大的!Paper《AttentionIsAllYouNeed》,作者是在机器翻译这个领域进行的实验,当然我们今天知道它被应用到了很多地方,作者也在结论部分说它将被应用到图像、音频、视频等任务中,本文......
  • NLP | mC4数据集
    MC4是C4的子集,MC4是从公共CommonCrawl存储库中提取的约750GB英语文本的集合。CommonCrawl包含数十亿个从Internet抓取的网页。尽管C4数据集被明确设计为仅英语,但MC4覆盖了CommonCrawl迄今为止发布的108种语言,具有10000多个网页。有证据表明,语言模型会放大......
  • NLP应用 | thumt的bleu评估讲解
    传入参数:model:#defparse_args中,命令行输入模型名称,默认是"transformer"。parser.add_argument("--model",type=str,required=True,help="Nameofthemodel.")#defmain中#model_cls=models.get_model(args.model)返回thu......
  • python - jionlp地址解析库
    1.jionlp安装pip3install-ijionlpgithub地址https://github.com/dongrixinyu/JioNLP2.简单使用importjionlpasjio#地址address='武侯区红牌楼街19号红星大厦9楼2号'#指定参数town_village(bool),可获取乡镇、村、社区两级详细地名#指定参数change2new(bool)......
  • NLP | 文本分词的工具包
    文本分词(Tokenization)是将一个文本序列分割成一个个单独的“词”或“标记”的过程。在自然语言处理(NLP)中,文本分词是一个必要的预处理步骤,几乎所有的自然语言处理任务都需要对文本进行分词。文本分词的目的是根据某种规则或算法,将文本序列分割成较小的单元,例如单词、词组、标点符......
  • NLP | 词嵌入:原理与应用简要概述
    词嵌入技术主要是为了解决自然语言处理中的词表示问题,将词转化成机器容易理解的形式。在早期的自然语言处理任务中,词通常被表示为离散的符号,例如"猫"就是一个符号,"狗"是另一个符号,这种表示方法无法捕捉词与词之间的语义关系。作用原理词嵌入技术将词映射到连续的向量空间中,使得......
  • 如何实现华东师范大学NLP实验室的具体操作步骤
    实现“华东师范大学NLP实验室”流程为了实现“华东师范大学NLP实验室”,我们需要完成以下步骤:步骤操作1.创建一个新的Python项目在你的开发环境中创建一个新的Python项目2.导入所需的库在项目中导入所需的库,例如NLTK(自然语言处理工具包)3.收集数据收集与华东......
  • NLP应用 | 保存checkpoint模型
    需求描述:当我们训练模型的时候,我们要训练很多训练步数,我们想要保存训练到一定阶段的checkpoint模型参数,并把这些checkpoint模型保存到一个指定的文件夹下。在文件夹下我们最多保存keep_checkpoint_max个checkpoint模型的文件。保存到output文件夹下。每save_checkpoint_steps步去......