内容都是百度AIstudio的内容,我只是在这里做个笔记,不是原创。

使用飞桨探索自然语言处理

接下来,让我们一起探索几个经典的自然语言处理任务,包括:

  • 计算词语之间的关系(如同义词):word2vec
  • 理解一个自然语言句子:文本分类和相似度计算

一般来说,使用飞桨完成自然语言处理任务时,都可以遵守一个相似的套路,如 图10 所示。

自然语言处理词向量word2vec

 

在自然语言处理任务中,词向量(word2vec)是表示自然语言里单词的一种方法,即把每个词都表示为一个N维空间内的点,即一个高维空间内的向量。通过这种方法,实现把自然语言计算转换为向量计算。

如 图1 所示的词向量计算任务中,先把每个(如queen,king等)转换成一个高维空间的向量,这些向量在一定意义上可以代表这个词的语义信息。再通过计算这些向量之间的距离,就可以计算出词语之间的关联关系,从而达到让计算机像计算数值一样去计算自然语言的目的。

 自然语言处理词向量word2vec

如何把词转换为向量

自然语言单词是离散信号,比如“我”、“ 爱”、“人工智能”。如何把每个离散的单词转换为一个向量?通常情况下,我们可以维护一个如 图2 所示的查询表。表中每一行都存储了一个特定词语的向量值,每一列的第一个元素都代表着这个词本身,以便于我们进行词和向量的映射(如“我”对应的向量值为 [0.3,0.5,0.7,0.9,-0.2,0.03] )。给定任何一个或者一组单词,我们都可以通过查询这个excel,实现把单词转换为向量的目的,这个查询替换过程称之为Embedding Lookup

自然语言处理词向量word2vec

 

 上述过程也可以使用一个字典数据结构实现。事实上如果不考虑计算效率,使用字典实现上述功能是个不错的选择。然而在进行神经网络计算的过程中,需要大量的算力,常常要借助特定硬件(如GPU)满足训练速度的需求。GPU上所支持的计算都是以张量(Tensor)为单位展开的,因此在实际场景中,我们需要把Embedding Lookup的过程转换为张量计算,如 图3 所示。

自然语言处理词向量word2vec

假设对于句子"我,爱,人工,智能",把Embedding Lookup的过程转换为张量计算的流程如下:

  1. 通过查询字典,先把句子中的单词转换成一个ID(通常是一个大于等于0的整数),这个单词到ID的映射关系可以根据需求自定义(如图3中,我=>1, 人工=>2,智能=>3,...)。

  2. 得到ID后,再把每个ID转换成一个固定长度的向量。假设字典的词表中有50000个词,那么,对于单词“我”,就可以用一个50000维的向量来表示。由于“我”的ID是1,因此这个向量的第一个元素是1,其他元素都是0([1,0,0,…,0]);同样对于单词“人工”,第二个元素是1,其他元素都是0。用这种方式就实现了用一个张量表示一个单词。由于每个单词的向量表示都只有一个元素为1,而其他元素为0,因此我们称上述过程为One-Hot Encoding。

  3. 经过One-Hot Encoding后,句子“我,爱,人工,智能”就被转换成为了一个形状为 4 * 50000 的张量,记为V。在这个张量里共有4行、50000列,从上到下,每一行分别代表了“我”、“爱”、“人工”、“智能”四个单词的One-Hot Encoding。最后,我们把这个张量VVV和另外一个稠密张量W相乘,其中W张量的形状为50000 * 128(50000表示词表大小,128表示每个词的向量大小)。经过张量乘法,我们就得到了一个4*128的张量,从而完成了把单词表示成向量的目的。

2013年,Mikolov提出的经典word2vec算法就是通过上下文来学习语义信息。word2vec包含两个经典模型,CBOW(Continuous Bag-of-Words)和Skip-gram,如 图4 所示。

  • CBOW:通过上下文的词向量预测中心词。
  • Skip-gram:根据中心词预测上下文。

 自然语言处理词向量word2vec

 

假设有一个句子“Pineapples are spiked and yellow”,两个模型的预测方式如下:

  • CBOW中,先在句子中选定一个中心词,并把其他词作为这个中心词的上下文。如 图4 CBOW所示,把“spiked”作为中心词,把“Pineapples are and yellow”作为中心词的上下文。在学习过程中,使用上下文的词向量预测中心词,这样中心词的语义就被传递到上下文的词向量中,如“spiked”=>“pineapple”,从而达到学习语义信息的目的。

  • Skip-gram中,同样先选定一个中心词,并把其他词作为这个中心词的上下文。如 图4 Skip-gram所示,把“spiked”作为中心词,把“Pineapples are and yellow”作为中心词的上下文。不同的是,在学习过程中,使用中心词的词向量去预测上下文,从而达到学习语义信息的目的。


说明:

一般来说,CBOW比Skip-gram训练速度,训练过程更加稳定,原因是CBOW使用上下文average的方式进行训练,每个训练step会见到更多样本。而在生僻字(出现频率低的字)处理上,skip-gram比CBOW效果,原因是skip-gram不会刻意回避生僻字。

CBOW和Skip-gram的算法实现

假设指定一句话:“Pineapples are spiked and yellow,C=4,V=5000,N=128”,分别介绍CBOW和Skip-gram的算法实现。

如 图5 所示,CBOW是一个具有3层结构的神经网络,分别是:

自然语言处理词向量word2vec

  • 输入层: 一个形状为C×V的one-hot张量,其中C代表上线文中词的个数,通常是一个偶数,V表示词表大小,该张量的每一行都是一个上下文词的one-hot向量表示,比如“Pineapples, are, and, yellow”。
  • 隐藏层: 一个形状为V×N的参数张量W1,一般称为word-embedding,N表示每个词的词向量长度。输入张量和word embedding W1进行矩阵乘法,就会得到一个形状为C×N的张量。综合考虑上下文中所有词的信息去预测中心词,因此将上下文中C个词相加得一个1×N的向量,是整个上下文的一个隐含表示
  • 输出层: 创建另一个形状为N×V的参数张量,将隐藏层得到的1×N的向量乘以该N×V的参数张量,得到了一个形状为1×V的向量。最终,1×V的向量代表了使用上下文预测中心词,每个候选词的打分,再经过softmax函数的归一化,即得到了对中心词的预测概率:

 自然语言处理词向量word2vec

 

 如 图6 所示,Skip-gram是一个具有3层结构的神经网络,分别是:

自然语言处理词向量word2vec

 

  • Input Layer(输入层):接收一个one-hot张量 V∈自然语言处理词向量word2vec作为网络的输入,里面存储着当前句子中心词的one-hot表示。
  • Hidden Layer(隐藏层):将张量V乘以一个word embedding张量W1∈自然语言处理词向量word2vec,并把结果作为隐藏层的输出,得到一个形状为自然语言处理词向量word2vec的张量,里面存储着当前句子中心词的词向量。
  • Output Layer(输出层):将隐藏层的结果乘以另一个word embedding张量自然语言处理词向量word2vec,得到一个形状为自然语言处理词向量word2vec的张量。这个张量经过softmax变换后,就得到了使用当前中心词对上下文的预测结果。根据这个softmax的结果,我们就可以去训练词向量模型。

在实际操作中,使用一个滑动窗口(一般情况下,长度是奇数),从左到右开始扫描当前句子。每个扫描出来的片段被当成一个小句子,每个小句子中间的词被认为是中心词,其余的词被认为是这个中心词的上下文。

相关文章: