《深度学习工程师-吴恩达》05序列模型--自然语言处理与词嵌入 学习笔记

作者:jliang

https://blog.csdn.net/jliang3

《深度学习工程师-吴恩达》05序列模型--自然语言处理与词嵌入 学习笔记

 

1.重点归纳

1)词汇表征                                                                

(1)词嵌入是语言表示的一种方式,可以让算法自动理解一些类似的词,比如男人对女人、国王对王后等。通过词嵌入的概念,即使你的模型标记的训练集相对较小,你也可以构建NLP应用。

(2)词汇表征方法一:一直以来我们都是用词汇来表示词,使用one-hot向量来表示词

  • 这种表示方法最大的缺点就是它把每个词孤立起来,这样使得算法对相关词的泛华能力不够。
  • 这是由于one-hot向量的内积都是0,所以无法知道词汇之间的关系。

(3)词汇表征方法二:特征化的表示每个词,即词嵌入

  • 假设有300个不同的特征,即每列数据有300个数字组成的一个300维的向量来表示一个词。这个向量就可以知道两个单词之间的相似度,例如苹果和橙子之间相似度很高,模型算法的泛华能力就比较好。
  • 这种方式表示比onehot向量更好的表示不同的单词,实际学习时并不是指定这300个维度的含义,不会像这里一样这么好理解,新特征表示的东西肯定会很难搞清楚。

(4)词嵌入可视化

        

  • 把这n维的词嵌入到一个二维空间里就可以可视化了,常用的可视化算法是t-SNE
  • 映射后的结果可以看出词汇之间的关系
  • 这种词嵌入算法学习到的特征对于相近的概念,学习到的特征也比较类似

2)使用词嵌入

(1)命名实体识别例子

        

  • 第一个句子被用于模型训练,Sally Johnson被识别为人名。第二个句子属于进行预测,因为orange和apple很相似,所以算法很容易就知道Robert Lin也是人名。
  • 词嵌入能到达这种效果的原因之一是学习词嵌入的算法是在一个非常大(也许1亿个单词,甚至100亿个)的文本集中进行训练。
  • 把词嵌入应用到命名实体识别任务中时,只有一个很小的训练集(如10万个单词或更少)

(2)用词嵌入做迁移学习的步骤

  • 先从一个非常大的文本集中学习词嵌入
  • 把这些词嵌入模型迁移到你的新的只有少量标注训练集的任务中
  • 在新的任务(如命名实体识别任务)上训练模型时,可以选择要不要使用新的数据集继续微调词嵌入。如果标记的数据集不是很大,通常不会在微调词嵌入上费力气。

(3)词嵌入应用

  • 它已经被应用在命名实体识别、文本摘要、文本解析、指代消解等非常标准的NLP任务中
  • 词嵌入在语言模型、机器翻译领域用得少一些,尤其是你做的语言模型或者机器翻译任务时,这些任务中你有大量的数据

(4)词嵌入的意思与人脸识别中的embedding差不多,在人脸识别领域大家喜欢喜欢用编码这个词来指代这些向量。不同的就是:

  • 在人脸识别领域我们训练一个网络,然后输入一个人的照片(即使这个人之前不认识)
  • 在学习词嵌入时则是有一个固定的词汇表(比如1万个单词),对于每个词汇表的单词我们学习一个固定的编码、固定的嵌入。

3)词嵌入的特性

(1)词嵌入能帮助实现类比推理,它能帮助人们理解词嵌入做了什么、能做什么。man对应woman,那么king对应queen,实现方法:,e代表单词对应的嵌入值

(2)类比推理实现

  • ,sim为相似度函数,找出与相似度最高的词向量对应的单词。最常用的相似度函数就是余弦相似度函数
  • 通过这种方法来做类比推理准确率大概只有30%~75%。
  • t-SNE算法把高维词嵌入向量的数据用一种非线性的方式映射到2维平面上,所以t-SNE之后的2维向量不再能做类比推理。

(3)类比例子

  • Man:Woman as Boy:Girl(性别)
  • Ottawa:Canada as Nairobi:Kenya(首都)
  • Big:Bigger as Tall:Taller(形容词比较级)
  • Yen:Japan as Ruble:Russia(货币单位)

4)学习词嵌入时,实际上是学习开一个嵌入矩阵

    

(1)假设我们的字典库有1万个单词,词嵌入是300维,那么我们学习的目标就是一个300*10000的矩阵E。

(2)假设使用o6257来表示单词orange的one-hot编码,第6257位的值为1。

(3)使用E乘以o6257(即E∙o6257)就会得到一个300维的向量e6257,它就是单词orange的词嵌入向量值。E∙oj=ej代表单词j的嵌入向量。

5)学习词嵌入模型一

(1)输入一句话,预测下一个词

        

  • 把输入句子的每个单词转换成one-hot编码o,然后用E乘以每个输入单词的one-hot编码o得到e,假设每个e为300维的向量。
  • 把句子中的所有e输入到神经网络的隐藏层中,神经网络输入参数个数为n*300,最后再接一层softmax层,属于下一个单词的概率。
  • 使用反向传播来梯度下降来计算:矩阵E、神经网络输入参数、输出层参数。

(2)训练模型的其他输入值

  • 常用的输入是目标词前后几个词作为上下文,如目标词前后各4个词作为输入
  • 其他类型输入
    • 输入目标词前后几个词作为上下文,如目标词前后各4个词作为输入
    • 目标词前1个词作为输入
    • 附近一个单词(skip-gram模型的思想)
  • 如果你想建立一个语言模型,用目标词的前后几个单词作为上下文是常见的做法。但是如果你的目标是学习词嵌入,那么你就可以用这些其他类型的上下文输入,它们也能得到很好的词嵌入。

6)学习词嵌入模型二:Word2Vec

(1)Skip-grams

  • 抽取上下文和目标词配对来构造一个监督学习问题,上下文不一定是目标单词之前离得最近的n个单词,可以随机在一定词距内选另一个词作为上下文词。
  • 例如在前后5/10个词内选取一个词作为目标词
  • 构造这个监督学习问题并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学习一个好的词嵌入模型。
  • 要解决的基本的监督学习问题是学习一种映射关系,从上下文C(比如单词orange)到某个目标词t(比如juice/glass/my)

  • 嵌入矩阵E乘以输入上下文单词的one-hot编码oc得到上下文词的嵌入向量ec,ec再输入到softmax单元,并输出预测值y(不同目标词的概率)。
  • 这是一个可以找到词嵌入的简化模型和神经网络,其实就是一个softmax函数,softmax的损失函数是交叉熵。

(2)首要问题:计算速度

        

  • 在softmax模型中,需要对词典(例如1/10/100万个词)计算所有词的概率ptc=eθtTecj=110000eθjTec,分母的求和计算速度相当慢。所以扩大词汇表就更加困难了。
  • 解决方案一:使用一个分级的softmax分类器
  • 解决方案二:负采样,对于加速softmax和解决需要在分母中对整个词汇表求和的问题会更简单一点,也很有作用

(3)采样方式

  • 对语料库均匀且随机地采样:像the、of、a、and、to这类出现相当频繁的词,导致花大部分力气来更新这些频繁出现的单词的ec。像orange、apple、durian就不会那么频繁地出现,但我们想要的是花更多时间来更新这些更少出现的词的嵌入。
  • 实际上词p(c)的分布,并不是单纯的在训练集语料库上均匀且随机的采样得到的,而是采用了不同的启发来平衡更常见的词。

(4)Word2Vec有两个不同版本的模型:skip-gram和CBOW(连续词袋模型),CBOW获取中间词两边的上下文作为上下文去预测中间的词

7)学习词嵌入模型三:负采样,它能做到与skip-gram模型相似的事情,但是用了一个更加有效的学习算法。

(1)负采样构造一个新的监督学习问题,构造一个二分类问题而不是多分类问题,输入词语对,预测目标标签1/0。

        

  • 正样本生成:skip-gram生成样本的方式一样,在n个词距内选一个词作为上下文作共同构造正样本,预测输出1。
  • 负样本生成:将用相同的上下文词在字典中随机选一个词构共同造成负样本,预测输出0。每生成一个正样本,就使用相同的上下文构造k条负样本。
  • 数据集越小,k就越大。小数据集的话,k取值[5,20]比较好。数据集很大的话,k可取值[2,5]。
  • 相当于把1万维(假设字典大小为1万)的softmax转变成k+1个二分类问题,每个都很容易计算,每次迭代只需要训练它们其中的k+1个,所以计算成本很低

(2)学习模型

  • 定义一个logistic回归模型,在给定输入单词对的条件下,y=1的概率
  • 对每一个可能的目标词都有一个参数向量θ和另一个参数向量(上下文词的嵌入向量)

(3)负样本选取,对候选的目标词进行采样

  • 一种极端:可以根据其在语料中的经验频率进行采样,就是通过词出现的频率对其进行采样。但问题是会导致在诸如like、the、of、and此类词有很高的频率。
  • 另一个极端:用1V均匀且随机地抽取负样本,V为词汇表总词数,这对英文单词的分布是非常没有代表性的。
  • 经验值效果最好的是位于两个极端的采样方法之间:,f(wi)为词频。

8)学习词嵌入模型四:GloVe词向量,是计算词嵌入的算法,这个算法并不如word2vec或者skip-gram模型用得多,但是它比较简便。

(1)目标是将他们之间的差距进行最小化处理:

(2)Xij:单词i(目标词t)在单词j(上下文词c)中出现的次数。就是一个能够获取单词i和单词j出现位置有多相近,或者彼此接近的频率的计数器。

(3)有点类似,同时对于这个来说你想知道的是告诉你这两个单词之间有多少联系,t和c之间有多紧密。就是他们同时出现的频率是多少,这是有logXij影响的。

(4)f(Xij)是一个加权项

  • 这个加权因子f(Xij)就可以是一个即使是像durion这样不常用的词也能给予大量有意义的运算的函数,而对出现十分频繁的停用词更大但不至于过分的权重。
  • 如果Xij等于0的话,则f(Xij)也等于0;同时约定0log0等于0。

(5)θ和e现在是完全对称的,所以θiej就是完全对称的,他们的功能其实很相似,你可以将它们颠倒或者排序。因此一种训练算法的方法是一致地初始化θ和e,然后使用梯度下降来最小化输出,然后取平均值

9)情绪分类:输入一段文本,输出评分(1星至5星)

    

(1)情感分类一个最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,也能构建一个不错的情感分类器。

  • 对情感分类任务来说,训练集大小从10000-100000个单词都很常见,有时甚至会小于10000。
  • 采用词嵌入能够带来更好的效果,尤其是只有很小的训练集时。

(2)分类器方案一:把句子中所有词的词嵌入向量求和/求平均,再输入到softmax分类器,并输出每种评分的概率。

        

  • 这里用的平均/求和运算单元的算法适用于任何长短的评论,这个平均/求和值运算效果不错,实际上它会把所有单词的意思给平均起来,或者把例子中所有单词的意思加起来。
  • 这个算法有一个问题就是没考虑词序,尤其是像如下这样一个负面的评价

(3)分类器方案二:把句子中所有词的词嵌入向量逐个输入到RNN中,再输入到softmax分类器,并输出每种评分的概率。

        

  • 这个算法会考虑词的顺序,效果会更好。
  • 它就能意识到“没有好的味道”是一个负面的评价,“不好”也是一个负面的评价,而不像前面算法那样只是把所有的加在一起得到一个大的向量,根本意识不到“不好”和“好”是不同的意思。

(4)由于词嵌入是在一个非常大的数据集里训练的,这样的泛化能力更强,一些没有的出现在情绪分类器训练集中的单词(如“缺乏”),但是由于词嵌入是在一个一亿或一百亿的词集里训练的,所以它仍然可以判断对,并且泛化能力很好。

2. 词汇表征

1)词嵌入是语言表示的一种方式,可以让算法自动理解一些类似的词,比如男人对女人、国王对王后等。通过词嵌入的概念,即使你的模型标记的训练集相对较小,你也可以构建NLP应用。

2)词汇表征

(1)一直以来我们都是用词汇来表示词,使用one-hot向量来表示词

  • 这种表示方法最大的缺点就是它把每个词孤立起来,这样使得算法对相关词的泛华能力不够。
  • 例子:假如已经学习一个语言模型,当你看到下面第一个句子时,空白处很可能是juice(果汁)。但是即使模型已经学到了这个句子,但是当看到第二个句子时,因为模型不知道苹果和橙子的关系比其他词的关系更近,算法很难从以学习的内容中推断空白处也可能是juice。
    • I want a glass of orange   .
    • I want a glass of apple   .
  • 这是由于one-hot向量的内积都是0,所以无法知道词汇之间的关系。

(2)特征化的表示每个词

        

  • 学习词典里的任何一个单词的特征或者数值化
  • 假设我们想知道这些词与性别(Gender)的关系,假定Man为-1,Woman为1,King为-0.95,Queen为0.97,Apple为0,Orange为0.01。… 详情如上图,表中数值代表两个词语之间的关系。
  • 假设有300个不同的特征,即每列数据有300个数字组成的一个300维的向量来表示一个词。这个向量就可以知道两个单词之间的相似度,例如苹果和橙子之间相似度很高,模型算法的泛华能力就比较好。
  • 这种方式表示比onehot向量更好的表示不同的单词,实际学习时并不是指定这300个维度的含义,不会像这里一样这么好理解,新特征表示的东西肯定会很难搞清楚。

3)词嵌入可视化

(1)把这n维的词嵌入到一个二维空间里就可以可视化了,常用的可视化算法是t-SNE

(2)映射后的结果可以看出词汇之间的关系

  • man和woman聚集在一起
  • king和queen聚集在一起
  • 人相关的特征(man、woman、king、queen)又是聚集在一起
  • 动物(dog cat fish)聚集在一起
  • 水果(apple、grape、orange)聚集在一起
  • 数值聚集在一起
  • 生物(人和动物)聚集在一起

(3)这种词嵌入算法学习到的特征对于相近的概念,学习到的特征也比较类似

4)之所以叫词嵌入,可以想象一个300维的空间,取每一个单词它对应的一个300维的特征向量被嵌在一个300维的空间的一个点上。

3. 使用词嵌入

1)命名实体识别例子

      

(1)第一个句子被用于模型训练,Sally Johnson被识别为人名。

(2)第二个句子属于进行预测,因为orange和apple很相似,所以算法很容易就知道Robert Lin也是人名。

(3)当被预测的句子改成”Robert Lin is a durian cultivator(榴莲培育家)”,durian是一种很少稀罕的水果。

  • 在实体识别中只有一个很小的标记的训练集,训练集中甚至可能没有durian和cultivator。
  • 如果有一个已经训练好的词嵌入,它会告诉你榴莲是水果,培育家的工作和农民差不多,那么你就可能从训练集里种橙子的农民归纳出榴莲培育家也是一个人。

(4)词嵌入能到达这种效果的原因之一是学习词嵌入的算法是在一个非常大(也许1亿个单词,甚至100亿个)的文本集中进行训练。

(5)把词嵌入应用到命名实体识别任务中时,只有一个很小的训练集(如10万个单词或更少)

  • 可以使用迁移学习,把从互联网上免费获得的大量的无标签文本中学习到的词嵌入模型迁移到一个任务中,如有少量标记的训练数据集的命名实体识别任务。
  • 图片中只画了单向的RNN,应用用一个双向的RNN

2)用词嵌入做迁移学习的步骤

(1)先从一个非常大的文本集中学习词嵌入,或者可以下载网上预训练好的词嵌入模型

(2)然后把这些词嵌入模型迁移到你的新的只有少量标注训练集的任务中,用低维稠密的词嵌入向量(如300维)来替代原来很大的one-hot向量。

(3)在新的任务(如命名实体识别任务)上训练模型时,只有少量标记的样本,你可以选择要不要使用新的数据集继续微调词嵌入。如果标记的数据集不是很大,通常不会在微调词嵌入上费力气。

3)当任务的训练集相对较小时,词嵌入的作用最明显,所以它广泛用于NLP领域。

  • 它已经被应用在命名实体识别、文本摘要、文本解析、指代消解等非常标准的NLP任务中
  • 词嵌入在语言模型、机器翻译领域用得少一些,尤其是你做的语言模型或者机器翻译任务时,这些任务中你有大量的数据

4)词嵌入和人脸识别之间有奇妙的关系

(1)对于人脸识别,我们训练了一个孪生网络结构,这个网络会学习不同人脸的一个n维(128维)编码(embedding),然后通过比较编码结果来判断两个图片是否是同一个人。

(2)词嵌入的意思与人脸识别中的embedding差不多,在人脸识别领域大家喜欢喜欢用编码这个词来指代这些向量。

(3)人脸识别领域和词嵌入有一个不同的就是:在人脸识别领域我们训练一个网络,然后输入一个人的照片(即使这个人之前不认识);在学习词嵌入时则是有一个固定的词汇表(比如1万个单词),对于每个词汇表的单词我们学习一个固定的编码、固定的嵌入。

4. 词嵌入的特性

1)词嵌入还有一个迷人的特性,就是它能帮助实现类比推理

(1)尽管类比推理可能不是自然语言处理应用中最重要的存在,不过它能帮助人们理解词嵌入做了什么、能做什么。

(2)man对应woman,那么king对应queen,实现方法:,e代表单词对应的嵌入值。

(3)man对woman的差异是性别,而king对queen的差异也是性别,所以上式成立。

2)类比推理实现

(1)(上面的例子),sim为相似度函数,找出与相似度最高的词向量对应的单词。

(2)如果你学习一些词嵌入,通过算法来找到使得相似度最大化的单词w,你确实可以得到完全正确的答案,不过取决于过程中的细节。通过这种方法来做类比推理准确率大概只有30%~75%。

(3)t-SNE算法把高维词嵌入向量的数据用一种非线性的方式映射到2维平面上,所以t-SNE之后的2维向量不再能做类比推理。

3)这里最常用的相似度函数就是余弦相似度函数

(1)公式:,即u的转置乘v,再除以u和v的欧氏距离

(2)如果u和v非常相似,那么它们的内积将会很大,取值[-1,1],1代表向量方向相同,-1代表向量方向相反,0代表向量夹角为90度。

4)类比例子

(1)Man:Woman as Boy:Girl(性别)

(2)Ottawa:Canada as Nairobi:Kenya(首都)

(3)Big:Bigger as Tall:Taller(形容词比较级)

(4)Yen:Japan as Ruble:Russia(货币单位)

5. 嵌入矩阵

1)当你应用算法来学习词嵌入时,实际上是学习开一个嵌入矩阵

(1)假设我们的字典库有1万个单词,词嵌入是300维,那么我们学习的目标就是一个300*10000的矩阵E。

(2)假设使用o6257来表示单词orange的one-hot编码,10000个值中只有第6257位的值为1。

(3)使用E乘以o6257(即E∙o6257)就会得到一个300维的向量e6257,它就是单词orange的词嵌入向量值。代表单词j的嵌入向量。

6. 学习词嵌入

1)在深度学习应用于学习词嵌入的历史上,一开始是使用比较复杂的算法来训练,后面使用越来越简单的算法来训练,在大数据集下简单的算法也能达到很好的效果,以下讲的模型属于比较稍微复杂的算法。

2)输入一句话,预测下一个词

      

(1)初始化E矩阵

(2)把输入句子的每个单词转换成one-hot编码o

(3)用E乘以每个输入单词的one-hot编码o得到e,假设每个e为300维的向量

(4)然后把句子中的所有e输入到神经网络的隐藏层中,神经网络输入参数个数为n*300

  • n为输入句子单词数量
  • 一般情况下会设置一个固定的历史窗口来控制输入单词数量,例如设置窗口大小为4,每次都使用被预测单词前4个单词作为输入值。

(5)最后再接一层softmax层,属于下一个单词的概率

(6)然后使用反向传播来梯度下降来计算:矩阵E、神经网络输入参数、输出层参数

(7)通过这个算法能很好地学习词嵌入,原因是:

  • 输入"a glass of orange"和"a glass of apple"都是输出juice,orange和apple会学到很相似的嵌入,这样做能够让算法更符合训练集。
  • 如果只有一个300维特征向量来表示所有这些词,算法会发现要想最好地拟合训练集,就要使苹果、橘子、葡萄、梨、榴莲等都拥有相似的特征向量。

3)训练模型的输入值

      

(1)常用的输入是目标词前后几个词作为上下文,如目标词前后各4个词作为输入

(2)其他类型输入

  • 输入目标词前后几个词作为上下文,如目标词前后各4个词作为输入
  • 目标词前1个词作为输入
  • 附近一个单词(skip-gram模型的思想)

(3)如果你想建立一个语言模型,用目标词的前后几个单词作为上下文是常见的做法。但是如果你的目标是学习词嵌入,那么你就可以用这些其他类型的上下文输入,它们也能得到很好的词嵌入。

7. Word2Vec

1)Skip-grams

(1)抽取上下文和目标词配对来构造一个监督学习问题,上下文不一定是目标单词之前离得最近的n个单词,可以随机在一定词距内选另一个词作为上下文词。

(2)例如在前后5/10个词内选取一个词作为目标词,例子:

  • 句子:I want to glass of orange juice to go along with my cereal.
    • 上下文:orange,预测目标:juice
    • 上下文:orange,预测目标:glass
    • 上下文:orange,预测目标:my

(3)构造这个监督学习问题并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学习一个好的词嵌入模型。

(4)要解决的基本的监督学习问题是学习一种映射关系,从上下文C(比如单词orange)到某个目标词t(比如juice/glass/my)

                

  • 嵌入矩阵E乘以输入上下文单词的one-hot编码oc得到上下文词的嵌入向量ec,ec再输入到softmax单元,并输出预测值y(不同目标词的概率)。
  • softmax的损失函数是交叉熵。
  • 这是一个可以找到词嵌入的简化模型和神经网络,其实就是一个softmax函数。
  • 矩阵E将会有很多参数,有对应所有嵌入向量ec的参数。

2)遇到的首要问题就是计算速度

      

(1)尤其是在softmax模型中,需要对词典(例如1/10/100万个词)计算所有词的概率,分母的求和计算速度相当慢。所以扩大词汇表就更加困难了。

(2)解决方案一:使用一个分级的softmax分类器

  • 不是一下子输出到底属于所有类别中的哪一类
  • 输出是在所有词汇表中前一半(如前5000个)中还是在词汇表中后一半(如后5000个)词中,类似CART树,结果就是这棵树的一个叶子节点
  • 计算成本与词汇表大小的对数成正比
  • softmax分类器不会使用一颗完美平衡的分类树,会被构造成常用词在顶部,而不常用的词会在树的比较深处

(3)解决方案二:负采样,对于加速softmax和解决需要在分母中对整个词汇表求和的问题会更简单一点,也很有作用。

3)如何对上下文采样

(1)可以对语料库均匀且随机地采样

  • 有一些像the、of、a、and、to这类出现相当频繁的词,上下文到目标词的映射会相当频繁地得到这类词,导致花大部分力气来更新这些频繁出现的单词的ec
  • 其他词像orange、apple、durian就不会那么频繁地出现,但我们想要的是花更多时间来更新这些更少出现的词的嵌入。

(2)实际上词p(c)的分布,并不是单纯的在训练集语料库上均匀且随机的采样得到的,而是采用了不同的启发来平衡更常见的词。

4)Word2Vec有两个不同版本的模型:skip-gram和CBOW(连续词袋模型),CBOW获取中间词两边的上下文作为上下文去预测中间的词。

8. 负采样

1)skip-gram模型的缺点是softmax计算太慢,一个改善过的学习问题叫负采样,它能做到与skip-gram模型相似的事情,但是用了一个更加有效的学习算法。

2)负采样构造一个新的监督学习问题,构造一个二分类问题而不是多分类问题

      

(1)构造一个二分类的监督学习问题,输入词语对,预测目标标签1/0。

(2)正样本生成:skip-gram生成样本的方式一样,在n个词距内选一个词作为上下文作共同构造正样本,预测输出1。

(3)负样本生成:将用相同的上下文词在字典中随机选一个词构共同造成负样本,预测输出0。每生成一个正样本,就使用相同的上下文构造k条负样本。

(4)数据集越小,k就越大

  • 小数据集的话,k取值[5,20]比较好
  • 数据集很大的话,k可取值[2,5]

3)学习模型

(1)定义一个logistic回归模型,在给定输入单词对的条件下,y=1的概率

(2)对每一个可能的目标词都有一个参数向量θ和另一个参数向量(上下文词的嵌入向量)

(3)相当于把1万维(假设字典大小为1万)的softmax转变成k+1个二分类问题,每个都很容易计算,每次迭代只需要训练它们其中的k+1个,所以计算成本很低。

4)负样本选取,对候选的目标词进行采样

(1)一种极端:可以根据其在语料中的经验频率进行采样,就是通过词出现的频率对其进行采样。但问题是会导致在诸如like、the、of、and此类词有很高的频率。

(2)另一个极端:用1V均匀且随机地抽取负样本,V为词汇表总词数,这对英文单词的分布是非常没有代表性的。

(3)既不用经验频率,也不用均匀分布,它位于两个极端的采样方法之间,这个经验值效果最好。

  • ,f(wi)为词频
  • f(wi)是在语料库中观测到的单词的词频,通过词频的3/4次方,使其处于完全独立的分布和训练集的观测分布在两个极端之间

5)和深度学习的其他领域一样,有很多开源的实现,也有预训练过的词向量,就是其他人训练过然后授权发布在网上的。所以如果你想要在NLP问题上更快取得进展,那么下载其他人的词向量是很好的方法,在此基础上改进。

9. GloVe词向量

1)GloVe是计算词嵌入的算法,这个算法并不如word2vec或者skip-gram模型用得多,但是它比较简便。

2)GloVe代表用词表示的全局变量

(1)前面讨论到的训练词嵌入的算法,通过挑选语料库中相近的两个词(c:上下文、t:目标词)作为训练输入。GloVe算法使其关系开始明确化,使用词对在文章中出现的次数作为输入。

(2)Xij:单词i(目标词t)在单词j(上下文词c)中出现的次数。就是一个能够获取单词i和单词j出现位置有多相近,或者彼此接近的频率的计数器。

(3)如果选中上下文c内容是在目标词前后一定的词距离内,则Xij=Xji;如果选中上下文c是目标词前1(或n)个词距离的单词作为上下文,则XijXji

3)GloVe模型

(1)目标是将他们之间的差距进行最小化处理

        

(2)有点类似,同时对于这个来说你想知道的是告诉你这两个单词之间有多少联系,t和c之间有多紧密。就是他们同时出现的频率是多少,这是有logXij影响的。

(3)然后要解决参数θ和e的问题,然后准备用梯度下降来最小化目标函数。只想要学习一些向量,这样他们的输出能够对这两个单词同时出现的频率进行良好的预测。

(4)f(Xij)是一个加权项

  • 有些词在英语里出现十分频繁(如this、is、of、a等),也有一些不常用词(如durion),这个加权因子f(Xij)就可以是一个即使是像durion这样不常用的词也能给予大量有意义的运算的函数,而对出现十分频繁的停用词更大但不至于过分的权重。
  • 如果Xij等于0的话,则f(Xij)也等于0;同时约定0log0等于0。

(5)θ和e现在是完全对称的,所以θiej就是完全对称的,他们的功能其实很相似,你可以将它们颠倒或者排序。因此一种训练算法的方法是一致地初始化θ和e,然后使用梯度下降来最小化输出,然后取平均值

4)GloVe目标函数很简单,但结果证明它确实有效。发明者发明这个算法的过程是他们以历史上更为复杂的算法(如newer language模型、skip-gram模型等)为基础,同时希望能够简化所有之前的算法才发明的。

10. 情绪分类

1)情绪分类任务就是看一段文本,然后分辨这个人是否喜欢他们正在讨论的这个东西。

(1)基于这样的标记的数据集,那么你就可以用来搜集大家对运营的餐馆的评价。

(2)一些人可能会把你的餐馆信息发布到互联网上,使用情绪分类器就可以看到一段文本然后分析出这个人对你的餐馆的评论的情感,是正面还是负面。

2)情感分类一个最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,也能构建一个不错的情感分类器。

(1)对情感分类任务来说,训练集大小从10000-100000个单词都很常见,有时甚至会小于10000。

(2)采用词嵌入能够带来更好的效果,尤其是只有很小的训练集时。

3)方案一

      

(1)步骤

  • 把句子中每个单词的one-hot编码输入模型
  • 使用预训练好的词嵌入模型把每个单词的one-hot编码转换成n维(如300维)的词嵌入向量
  • 把这些n维的词嵌入向量求和/求平均得到一个n维词嵌入向量
  • 把这个n维向量输入softmax分类器,并输出每种评分(1-5星)的概率

(2)这里用的平均/求和运算单元的算法适用于任何长短的评论,这个平均/求和值运算效果不错,实际上它会把所有单词的意思给平均起来,或者把例子中所有单词的意思加起来。

(3)这个算法有一个问题就是没考虑词序,尤其是像如下这样一个负面的评价

         Completely lacking in good taste, good service, and good ambience.

  • Good出现了很多次,如果仅仅把所有单词的词嵌入求平均/求和算法忽略词序, 最后的特征向量会有很多good的特征,分类器会认为这是一个好的评论。而事实上这条评论只有1星。

4)方案二:RNN情感分类器

      

(1)步骤

  • 把句子中每个单词的one-hot编码输入模型
  • 使用预训练好的词嵌入模型把每个单词的one-hot编码转换成n维(如300维)的词嵌入向量
  • 逐个把单词对应的词嵌入向量输入到一个多对一结构的RNN中,RNN在最后一步输出预测值
  • 最后再把这个RNN输出值输入到softmax分类器中,并输出每种评分的概率

(2)这个算法会考虑词的顺序,效果会更好

(3)它就能意识到“没有好的味道”是一个负面的评价,“不好”也是一个负面的评价,而不像前面算法那样只是把所有的加在一起得到一个大的向量,根本意识不到“不好”和“好”是不同的意思。

5)由于词嵌入是在一个非常大的数据集里训练的,这样的泛化能力更强,一些没有的出现在情绪分类器训练集中的单词(如“缺乏”),但是由于词嵌入是在一个一亿或一百亿的词集里训练的,所以它仍然可以判断对,并且泛化能力很好。

11. 词嵌入除偏

1)现在的机器学习和人工智能算法正渐渐地被信任用以辅助或是制定及其重要的决策,因此,我们想尽可能确保它们不受非预期形式偏见影响。比如说性别歧视、种族歧视等。

 

 

猜你喜欢

转载自blog.csdn.net/jliang3/article/details/86742166
今日推荐