自然语言处理2-NLP

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

自然语言处理2-NLP

如何把词转换为向量

如何让向量具有语义信息

在CBOW中

在Skip-gram中

skip-gram比CBOW效果更好

CBOW和Skip-gram的算法实现

Skip-gram的理想实现

Skip-gram的实际实现


自然语言处理2-NLP

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

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

图1词向量计算示意图


 

因此大部分词向量模型都需要回答两个问题

  1. 如何把词转换为向量?

自然语言单词是离散信号比如“香蕉”“橘子”“水果”在我们看来就是3个离散的词。

如何把每个离散的单词转换为一个向量

  1. 如何让向量具有语义信息?

比如我们知道在很多情况下“香蕉”和“橘子”更加相似而“香蕉”和“句子”就没有那么相似同时“香蕉”和“食物”、“水果”的相似程度可能介于“橘子”和“句子”之间。

那么我们该如何让词向量具备这样的语义信息

如何把词转换为向量

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


图2词向量查询表


 

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


图3张量计算示意图


 

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

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

  2. 得到ID后再把每个ID转换成一个固定长度的向量。假设字典的词表中有5000个词那么对于单词“我”就可以用一个5000维的向量来表示。由于“我”的ID是1因此这个向量的第一个元素是1其他元素都是0[100…0]

  3. 同样对于单词“人工”第二个元素是1其他元素都是0。

  4. 用这种方式就实现了用一个向量表示一个单词。由于每个单词的向量表示都只有一个元素为1而其他元素为0因此我们称上述过程为One-Hot Encoding。

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

如何让向量具有语义信息

得到每个单词的向量表示后我们需要思考下一个问题比如在多数情况下“香蕉”和“橘子”更加相似而“香蕉”和“句子”就没有那么相似同时“香蕉”和“食物”、“水果”的相似程度可能介于“橘子”和“句子”之间。那么如何让存储的词向量具备这样的语义信息呢

我们先学习自然语言处理领域的一个小技巧。在自然语言处理研究中科研人员通常有一个共识使用一个单词的上下文来了解这个单词的语义比如

“苹果手机质量不错就是价格有点贵。”

“这个苹果很好吃非常脆。”

“菠萝质量也还行但是不如苹果支持的APP多。”

在上面的句子中我们通过上下文可以推断出第一个“苹果”指的是苹果手机第二个“苹果”指的是水果苹果而第三个“菠萝”指的应该也是一个手机。事实上

在自然语言处理领域使用上下文描述一个词语或者元素的语义是一个常见且有效的做法。

我们可以使用同样的方式训练词向量让这些词向量具备表示语义信息的能力。

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

  • CBOW通过上下文的词向量推理中心词。
  • Skip-gram根据中心词推理上下文。


图4CBOW和Skip-gram语义学习示意图

假设有一个句子“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”作为中心词的上下文。不同的是在学习过程中使用中心词的词向量去推理上下文这样上下文定义的语义被传入中心词的表示中如“pineapple → Spiked” 从而达到学习语义信息的目的。


说明

一般来说CBOW比Skip-gram训练速度快训练过程更加稳定原因是CBOW使用上下文average的方式进行训练每个训练step会见到更多样本。

而在生僻字出现频率低的字

skip-gram比CBOW效果更好

原因是skip-gram不会刻意回避生僻字(CBOW结构中输入中存在生僻字时生僻字会被其它非生僻字的权重冲淡)。


CBOW和Skip-gram的算法实现

我们以这句话“Pineapples are spiked and yellow”为例分别介绍CBOW和Skip-gram的算法实现。

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


图5CBOW的算法实现

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

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


图6Skip-gram算法实现

 

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

Skip-gram的理想实现

 

Skip-gram的实际实现

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6