关于词嵌入(Word Embedding)的一些总结

看了课程半天没搞懂词嵌入是啥,梳理一下相关知识。参考:

一、关于文本与向量

文本是一种非结构化的数据信息,是不可以直接被计算的。

文本表示的作用就是将这些非结构化的信息转化为结构化的信息,这样就可以针对文本信息做计算,来完成我们日常所能见到的文本分类,情感判断等任务。
在这里插入图片描述
文本表示的方法有很多种,但主要有3 类方式:

在这里插入图片描述

在这里插入图片描述

二、One-hot编码

在这里插入图片描述
但是在实际情况中,文本中很可能出现成千上万个不同的词,这时候向量就会非常长。其中99%以上都是 0。

one-hot 的缺点如下:

  • 无法表达词语之间的关系
  • 这种过于稀疏的向量,导致计算和存储的效率都不高

三、信息检索(IR)技术

为了克服One-hot编码的局限性,NLP领域借用了信息检索 (IR)技术,使用文档作为上下文来对文本进行矢量化。比如TF-IDF,LSA和主题建模

·Bag of words

词袋模型假设我们不考虑文本中词与词之间的上下文关系,仅仅只考虑所有词的权重。而权重与词在文本中出现的频率有关。

词袋模型首先会进行分词,在分词之后,通过统计每个词在文本中出现的次数,我们就可以得到该文本基于词的特征,如果将各个文本样本的这些词与对应的词频放在一起,就是我们常说的向量化。向量化完毕后一般也会使用 TF-IDF 进行特征的权重修正,再将特征进行标准化。 再进行一些其他的操作后,就可以将数据带入机器学习模型中计算。

词袋模型的三部曲:分词(tokenizing),统计修订词特征值(counting)与标准化(normalizing)。

词袋模型有很大的局限性,因为它仅仅考虑了词频,没有考虑上下文的关系,因此会丢失一部分文本的语义。

词袋模型的缺点:

词袋模型最重要的是构造词表,然后通过文本为词表中的词赋值,但词袋模型严重缺乏相似词之间的表达。

比如“我喜欢北京”“我不喜欢北京”其实这两个文本是严重不相似的。但词袋模型会判为高度相似。

“我喜欢北京”与“我爱北京”其实表达的意思是非常非常的接近的,但词袋模型不能表示“喜欢”和“爱”之间严重的相似关系。(当然词袋模型也能给这两句话很高的相似度,但是注意我想表达的含义)

在较低的文本语料库中,一些词非常常见(例如,英文中的“the”,“a”,“is”),因此很少带有文档实际内容的有用信息。如果我们将单纯的计数数据直接喂给分类器,那些频繁出现的词会掩盖那些很少出现但是更有意义的词的频率。

为了重新计算特征的计数权重,以便转化为适合分类器使用的浮点值,通常都会进行tf-idf转换。

TF-IDF

是一种用于资讯检索与文本挖掘的常用加权技术。

TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。

主要思想:

如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
在这里插入图片描述
在这里插入图片描述
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

在IDF中可以发现,当某个词在语料库中各个文档出现的次数越多,它的IDF值越低,当它在所有文档中都出现时,其IDF计算结果为0,而通常这些出现次数非常多的词或字为“的”、“我”、“吗”等,它对文章的权重计算起不到一定的作用。

例如:在一篇文章中“环保”一次出现的频率非常高,我们可以认为“环保”一词很重要;而当“环保”一词在很多文章都出现时,反而就显得不那么重要了。

应用:词袋模型多用于图像处理。

关于词袋模型这篇文章讲的比较详细
词袋模型:https://www.jianshu.com/p/0587bc01e414

·Bi-gram 和N-Gram

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。

每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。
在这里插入图片描述
在这里插入图片描述
N-gram模型的一个常见应用
搜索引擎(Google或者Baidu)、或者输入法的猜想或者提示。你在用谷歌时,输入一个或几个词,搜索框通常会以下拉菜单的形式给出几个像下图一样的备选,这些备选其实是在猜想你想要搜索的那个词串。

四、分布式表示(Distributed representation)

Distributed representation在One hot representation的基础上考虑到词与词之间的联系,例如词义、词性等信息。每一个维度元素不再是0或1,而是连续的实数,表示不同的程度。Distributed representation 又包含了以下三种处理方式:

  • 基于矩阵的分布表示。矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。
  • 基于聚类的分布表示。
  • 基于神经网络的分布表示。
    他们的核心思想由两部分组成:1.选择一种方法描述该词的下上文;2.选择一种模式刻画某个词(“目标词”)与其上下文的关系。
    而我们现在常说的Distributed representation主要是基于神经网络的分布式表示的。例如‘杭州’、‘上海’的Distributed representation分别为[0.3 1.2 0.8 0.7] 和 [0.5 1.2 0.6 0.8 ] 。

所以对于词嵌入,我们可以理解为是对词的一种分布式表达方式,并且是从高维稀疏向量映射到了相对低维的实数向量上。

分布式表示的目的是找到一个变换函数,以便将每个词转换为其相关的向量。换句话说,分布是表示就是将词转化成向量,其中向量之间的相似性与词之间的语义相似性相关。

分布式假说。上下文中相似的词其语义也相似,这样一来,我们可以把信息分布式存储在向量的各个维度中,这种分布式表示方法具有紧密低维、句法和语义信息容易获取的特点。

Ps: 简而言之就是,可以用上文的词来表示下文的词,而不用增加维度。

在这里插入图片描述

1、基于矩阵的分布表示

基于矩阵的分布表示主要是构建**“词-上下文”矩阵**,通过某种技术从该矩阵中获取词的分布表示,矩阵的行表示词,列表示上下文,每个元素表示某个词和上下文共现的次数。这样矩阵的一行就描述了该词的上下文分布情况。

常见的上下文有:1.文档:即“词-文档“矩阵;2.上下文的每个词:即“词-词”矩阵;3.n-元词组,即“词-n-元组”矩阵。矩阵中每个元素为词和上下文共现次数,通常会采用TF-IDF、取对数等方法进行加权平滑。另外,矩阵的维度教高并且非常稀疏的话,可以通过SVD等手段进行降维,变为较低稠密矩阵。

共现矩阵

在这里插入图片描述

上面的例子中,给出了三句话,假设这就是我们全部的语料。我们使用一个size=1的窗口,对每句话依次进行滑动,相当于只统计紧邻的词。这样就可以得到一个共现矩阵。

共现矩阵的每一列,自然可以当做这个词的一个向量表示。这样的表示明显优于one-hot表示,因为它的每一维都有含义——共现次数,因此这样的向量表示可以求词语之间的相似度。
在这里插入图片描述
缺点:在一定程度上缓解了one-hot向量相似度为0的问题,但依旧没有解决数据系数和维度灾难的问题。面临稀疏性问题、向量维数随着词典大小线性增长的问题。
解决:SVD、PCA降维,但是计算量大

SVD(奇异值分解)

首先,统计一个词语的共生矩阵X。X是一个|V|×|V| 大小的矩阵,Xij表示在所有语料中,词汇表V中第i个词和第j个词同时出现的词数,|V|为词汇表的大小。对X做矩阵分解(如奇异值分解)得到矩阵正交矩阵U,对U进行归一化得到矩阵,即视为所有词的词向量:
在这里插入图片描述
SVD得到了word的稠密(dense)矩阵,该矩阵具有很多良好的性质:语义相近的词在向量空间相近,甚至可以一定程度反映word间的线性关系。
在这里插入图片描述

但这样的传统做法有很多问题:

由于很多词没有出现,导致矩阵极其稀疏,因此需要对词频做额外处理来达到好的矩阵分解效果;
矩阵非常大,维度太高
需要手动去掉停用词(如although, a,…),不然这些频繁出现的词也会影响矩阵分解的效果。

2、基于聚类的分布表示(没有了解)

通过聚类手段构建词语上下文之间的关系,代表模型为布朗聚类(Brown Clustering)

3、基于神经网络的分布表示

  • 基于神经网络语言模型(NNLM)
    NNLM由Bengio等人提出,他的主要想法就是:
  1. 把字典里的每一个单词对应一个词特征向量

  2. 把单词序列表示成联合概率函数

  3. 自动学习词特征向量和概率函数的参数

在NNLM中,每一个单词为向量空间中的一个点,而且特征的数目要比字典的大小要小,它的概率函数表示为在给定前一个词下,后一个词的条件概率的乘积。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Ps: 以上几张图我并没有看懂

  • 循环神经网络语言模型(未了解)
  • C&W模型(未了解)
  • Word2Vec
    • skip-gram
    • CBOW(continuous Bags-of-Words)

Ps: 写到这里我有些混乱,语料库、词向量、词嵌入、语言模型之间的关系是什么?看这里☞:语料库、词向量、词嵌入、语言模型之间的关系是什么?

自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。

  • 最直接的就是one-hot。但是问题是词与词之间没有关系
  • 另一种就是分布式表示Distributed representation
    • 基于矩阵的分布表示(n-gram、Glove)
    • 基于聚类的分布表示(根据两个词的聚类类别判断相似度,布朗聚类(Brown clustering))
    • 基于神经网络的分布表示,分布式表示、词向量、词嵌入(word embedding)
      核心依然是上下文的表示以及上下文与目标词之间的关系的建模。
      到目前为止所有词向量训练方法都是在训练语言模型的同时,顺便得到词向量的,这样就引入了语言模型概念。

语言模型包括文法语言模型和统计语言模型。一般我们指的是统计语言模型。其实就是看一句话是不是正常人说出来的。比如机器翻译、语音识别得到若干候选之后,可以利用语言模型挑一个尽量靠谱的结果。在 NLP 的其它任务里也都能用到。

OK,现在回到最开始的问题,语料库、词向量、词嵌入、语言模型之间的关系是什么?

语料库训练了语言模型,顺带生成了词向量,而词向量是包含有词嵌入这样的表示方式。
使用自己的语料库,配合Finetuning可以生成自己的语言模型?

五、词嵌入与Word2Vec

词嵌入(Word Embedding)是一种将文本中的词转换成数字向量的方法,为了使用标准机器学习算法来对它们进行分析,就需要把这些被转换成数字的向量以数字形式作为输入。词嵌入过程就是把一个维数为所有词数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量,词嵌入的结果就生成了词向量

词向量是各种NLP任务中文本向量化的首选技术,如词性标注、命名实体识别、文本分类、文档聚类、情感分析、文档生成、问答系统等。
在这里插入图片描述

关于Word2Vec

Word2vec 是 Word Embedding 的方法之一。他是 2013 年由谷歌的 Mikolov 提出了一套新的词嵌入方法。

这种算法有2种训练模式:

  • 通过上下文来预测当前词
  • 通过当前词来预测上下文

Word2Vec模型实际上分为了两个部分,第一部分为训练数据集的构造,第二部分是通过模型获取词嵌入向量,即word embedding。

Word2Vec的整个建模过程实际上与自编码器(auto-encoder)的思想很相似,即先基于训练数据构建一个神经网络,当这个模型训练好以后,并不会用这个训练好的模型处理新任务,而真正需要的是这个模型通过训练数据所更新到的参数。

关于word embedding的发展,由于考虑上下文关系,所以模型的输入和输出分别是词汇表中的词组成,进而产生出了两种词模型方法:Skip-Gram和CBOW。同时,在隐藏层-输出层,也从softmax()方法演化到了分层softmax和negative sample方法。

1、Skip-gram算法

在这里插入图片描述
Skip-Gram是给定input word来预测上下文。我们可以用小学英语课上的造句来帮助理解,例如:“The __________”。

关于Skip-Gram的模型结构,主要分为几下几步:

  • 从句子中定义一个中心词,即Skip-Gram的模型input word
  • 定义skip_window参数,用于表示从当前input word的一侧(左边及右边)选取词的数量。
  • 根据中心词和skip_window,构建窗口列表。
  • 定义num_skips参数,用于表示从当前窗口列表中选择多少个不同的词作为output word。

假设有一句子"The quick brown fox jumps over the lazy dog" ,设定的窗口大小为2(window_size=2),也就是说仅选中心词(input word)前后各两个词和中心词(input word)进行组合。如下图所示,以步长为1对中心词进行滑动,其中蓝色代表input word,方框代表位于窗口列表的词。
在这里插入图片描述
所以,我们可以使用Skip-Gram构建出神经网络的训练数据。

我们需要明白,不能把一个词作为文本字符串输入到神经网络中,所以我们需要一种方法把词进行编码进而输入到网络。为了做到这一点,首先从需要训练的文档中构建出一个词汇表,假设有10,000个各不相同的词组成的词汇表。那么需要做的就是把每一个词做One hot representation。此外神经网络的输出是一个单一的向量(也有10000个分量),它包含了词汇表中每一个词随机选择附近的一个词的概率。

假设从我们的训练文档中抽取出10000个唯一不重复的单词组成词汇表。我们对这10000个单词进行one-hot编码,得到的每个单词都是一个10000维的向量,向量每个维度的值只有0或者1,假如单词ants在词汇表中的出现位置为第3个,那么brown的向量就是一个第三维度取值为1,其他维都为0的10000维的向量(brown = [0,0,1,0,…,0]

下图是需要训练的神经网络结构。左侧的神经元Input Vector是词汇表中进行One hot representation后的一个词,右侧的每一个神经元则代表着词汇表的每一个词。实际上,在对该神经网络feed训练数据进行训练时,不仅输入词input word(中心词)是用One hot representation表示,输出词output word也是用One hot representation进行表示。但当对此网络进行评估预测时,输出向量实际上是通过softmax()函数计算得到的一个词汇表所有词的概率分布(即一堆浮点值,而不是一个One hot representation)。
在这里插入图片描述
隐层

说完单词的编码和训练样本的选取,我们来看下我们的隐层。如果我们现在想用300个特征来表示一个单词(即每个词可以被表示为300维的向量)。那么隐层的权重矩阵应该为10000行,300列(隐层有300个结点)。
Google在最新发布的基于Google news数据集训练的模型中使用的就是300个特征的词向量。词向量的维度是一个可以调节的超参数(在Python的gensim包中封装的Word2Vec接口默认的词向量大小为100, window_size为5)。

看下面的图片,左右两张图分别从不同角度代表了输入层-隐层的权重矩阵。左图中每一列代表一个10000维的词向量和隐层单个神经元连接的权重向量。从右边的图来看,每一行实际上代表了每个单词的词向量。

在这里插入图片描述
所以我们最终的目标就是学习这个隐层的权重矩阵。
我们现在回来接着通过模型的定义来训练我们的这个模型。

上面我们提到,input word和output word都会被我们进行one-hot编码。仔细想一下,我们的输入被one-hot编码以后大多数维度上都是0(实际上仅有一个位置为1),所以这个向量相当稀疏,那么会造成什么结果呢。如果我们将一个1 x 10000的向量和10000 x 300的矩阵相乘,它会消耗相当大的计算资源,为了高效计算,它仅仅会选择矩阵中对应的向量中维度值为1的索引行(这句话很绕),看图就明白。

在这里插入图片描述
我们来看一下上图中的矩阵运算,左边分别是1 x 5和5 x 3的矩阵,结果应该是1 x 3的矩阵,按照矩阵乘法的规则,结果的第一行第一列元素为[公式],同理可得其余两个元素为12,19。如果10000个维度的矩阵采用这样的计算方式是十分低效的

为了有效地进行计算,这种稀疏状态下不会进行矩阵乘法计算,可以看到矩阵的计算的结果实际上是矩阵对应的向量中值为1的索引,上面的例子中,左边向量中取值为1的对应维度为3(下标从0开始),那么计算结果就是矩阵的第3行(下标从0开始)—— [10, 12, 19],这样模型中的隐层权重矩阵便成了一个”查找表“(lookup table),进行矩阵计算时,直接去查输入向量中取值为1的维度下对应的那些权重值。隐层的输出就是每个输入单词的“嵌入词向量”。

输出层

经过神经网络隐层的计算,ants这个词会从一个1 x 10000的向量变成1 x 300的向量,再被输入到输出层。输出层是一个softmax回归分类器,它的每个结点将会输出一个0-1之间的值(概率),这些所有输出层神经元结点的概率之和为1。

下面是一个例子,训练样本为 (input word: “ants”, output word: “car”) 的计算示意图。

在这里插入图片描述
关于skip-gram先写到这里吧,觉得太多了。。。

2、连续词袋算法(CBOW)

在这里插入图片描述
在这里插入图片描述

看☞https://www.cnblogs.com/Luv-GEM/p/10593103.html

还是不太懂。。。。哭了。。。

猜你喜欢

转载自blog.csdn.net/Mason_Chen/article/details/109528753