主要内容:利用前n-1个词汇,预测第n个词汇
提出了基于连续空间编码 + 神经网络的NNLM模型
对于一个单词普遍采用的是one-hot编码方式,如果语料库的单词数目特别多,就会导致一个单词对应的one-hot编码维度十分庞大。同时one-hot编码并不能体现出各个单词之间的相似性,导致了语言模型的泛化能力很差。
将one-hot编码转变为连续空间的编码是一种很好的做法,在连续空间中每个单词被映射为空间上的一个点,通过计算两个连续空间编码向量的余弦相似度可以计算两个单词的相似性,在减少编码单词所需要维度的同时,又增加了特征维度。对于神经网络来说,连续空间编码能学习到局部更加平滑的函数。因此对单词进行连续空间编码相比于one-hot编码既能解决单词相似性的问题,又能减少增加上下文带来的维度开销。
整个流程计算公式:
首先输入第 t-1 到第 t-n-1 个单词的one-hot向量,通过投影层将这些单词映射为为连续空间编码的向量, ..., 。接着将得到的连续编码向量进行拼接得到构成上下文编码列向量x,输入隐藏层,在经过激活函数tanh的作用得到输出z。最后将z输入到输出层后再经过softmax激活函数得到输出列向量y,输出长度等于预测的所有词的数量,每个元素对应此位置上的词的可能性。
论文链接:Efficient Estimation of Word Representations inVector Space
词嵌入(Word Embedding):把词汇映射到数学空间的过程称为词嵌入。最简单的嵌入方式是one-hot,但是这种方式很难表示相似度。还有一种方式是通过分布式表示来表示词嵌入,word2vec是其中一种。
在自然语言处理中,我们词嵌入后的表达形式,称为词向量。显然,one-hot就是词向量的一种表达方式,但它会带来维度太大,词向量的每个维度都是离散的,词向量的表示都是局部的这一系列的问题,造成向量之间的相似度很难表达。所以,我们要采取其他嵌入方式来表示词向量——分布式表示(distributed representation),而word2vec就是一种典型的分布式表示方法。
word2vec实质分两种,一种是根据上下文预测目标值,即Continuous Bag-Of-Words Model,简称CBOW;另外一种是根据目标值生成上下文,称为Skip-Gram模型。
首先给出一张计算图:
上图中前面部分是一个词的one-hot编码,而后面部分则是权重矩阵W,将两者相乘即得到词向量的分布式表示,即我们所需要的词向量表示。因为我们是要将词转换为分布式表示的词嵌入,我们先将词进行one-hot编码,每个词的向量表示是 1 ∗ V 的,经过乘以 W 后,根据矩阵乘法的理解,假设 1 ∗ V 向量中第 n 位是1,其他是0,则矩阵乘法结果是得到了 W 矩阵中的第 n 行结果,也就是将词表示为了一个 1 ∗ N 的向量,一般 N 远小于 V ,这也就将长度为 V 的one-hot编码稀疏词向量表示转为了稠密的长度为 N 的词向量表示。
主要内容:解决文本分类的问题
论文链接:
Convolutional Neural Networks for Sentence Classification (给出了基本结构)
A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification(这篇文章专门做了各种控制变量的实验对比)
TextCNN通过一维卷积来获取句子中n-gram的特征表示。TextCNN对文本浅层特征的抽取能力很强,在短文本领域如搜索、对话领域专注于意图分类时效果很好,应用广泛,且速度快,一般是首选;对长文本领域,TextCNN主要靠filter窗口抽取特征,在长距离建模方面能力受限,且对语序不敏感。
以上图为例,
1、嵌入层(embedding layer)
textcnn使用预先训练好的词向量作embedding layer。对于数据集里的所有词,因为每个词都可以表征成一个向量,因此我们可以得到一个嵌入矩阵MM, MM里的每一行都是词向量。这个MM可以是静态(static)的,也就是固定不变。可以是非静态(non-static)的,也就是可以根据反向传播更新。
2、卷积池化层(convolution and pooling)
a. 卷积
输入一个句子,首先对这个句子进行切词,假设有s个单词。对每个词,跟句嵌入矩阵M, 可以得到词向量。假设词向量一共有d维。那么对于这个句子,便可以得到s行d列的矩阵
把矩阵A看成是一幅图像,使用卷积神经网络去提取特征。由于句子中相邻的单词关联性总是很高的,因此可以使用一维卷积,即文本卷积与图像卷积的不同之处在于只在文本序列的一个方向(垂直)做卷积,卷积核的宽度固定为词向量的维度d。高度是超参数,可以设置。
注意:图像中可以利用 (R, G, B) 作为不同channel。而文本的输入的channel通常是不同方式的embedding方式(比如 word2vec或Glove),实践中也有利用静态词向量和fine-tunning词向量作为不同channel的做法;channel也可以一个是词序列,另一个channel是对应的词性序列。接下来就可以通过加和或者拼接进行结合。
TextCNN网络包括很多不同窗口大小的卷积核,常用的filter size ∈ {3,4,5},每个filter的feature maps=100。这里的特征图就是不同的k元语法。
b. 池化(pooling)
不同尺寸的卷积核得到的特征(feature map)大小也是不一样的,因此我们对每个feature map使用池化函数,使它们的维度相同。
textRNN指的是利用RNN循环神经网络解决文本分类问题,文本分类是自然语言处理的一个基本任务,试图推断出给定文本(句子、文档等)的标签或标签集合。比如情感分析、新闻主题分类、虚假新闻检测等。
TextCNN擅长捕获更短的序列信息,但是TextRNN擅长捕获更长的序列信息。
上图中展示的是 RNN模型 的展开结构图,神经网络的模块A,正在读取某个输入,并输出一个值,循环可以使得信息可以从当前步传递到下一步。
TextRNN的结构分为:
1. embeddding layer, 2.Bi-LSTM layer, 3.concat output, 4.FC layer, 5.softmax
1、RNN:
优点:有词序信息,能获得更大范围的上下文信息(逐词输入RNN)。
缺点:RNN用于分类一般使用最后一个时间步的隐状态用于分类,是一个有偏的模型(后面的词比前面的词更有优势,容易遗忘前词,后词会有更大的影响)。
2、CNN:
优点:相较于RNN,CNN是一个无偏模型。各词会被平等对待。
缺点:CNN通常使用固定kernel size的卷积核,kernel size不好确定。换句话说就是由于kernel size的限制不能很好的捕获上下文信息。
3、RCNN:
使用循环神经网络获得词表示(感受野很大,可以获得更好的上下文信息)。在文本表示上与RNN有区别,不是直接使用最后时间步的隐状态作为文本表示。而是用max pooling层进行特征选择(是一个无偏操作)。
4、Max pooling和avg pooling的区别:
Max polling层可以看做是特征选择的作用,选择最具代表性的特征。而avg pooling可以看做是特征组合。一些分类任务上,少数特征词可以很多的区分,通常会使用max pooling。
LSTM(long short-term memory)是RNN的一种变体,RNN由于梯度消失的原因只能有短期记忆,LSTM网络通过精妙的门控制将短期记忆与长期记忆结合起来,并且一定程度上解决了梯度消失的问题。
LSTM 在主体结构上与 RNN 类似,其主要的改进是在隐藏层 h 中增加了3 个门控 (gates) 结构,分别是遗忘门 (forget gate)、输入门 (input gate)、输出门 (output gate),同时新增了一个隐藏状态 (cell state) 。LSTM 隐藏层结构原理如下图所示,f(t)、i(t)、 o(t) 分别表示 t 时刻遗忘门、输入门、输出门的值,a(t) 表示 t 时刻对 h(t–1) 和 x(t) 的初步特征提取。
双向长短期记忆网络
Bi-LSTM 神经网络结构模型分为 2 个独立的 LSTM,输入序列分别以正序和逆序输入至 2 个 LSTM 神经网络进行特征提取,将 2个输出向量(即提取后的特征向量)进行拼接后形成的词向量作为该词的最终特征表达。Bi-LSTM 的模型设计理念是使 t 时刻所获得特征数据同时拥有过去和将来之间的信息,实验证明,这种神经网络结构模型对文本特征提取效率和性能要优于单个 LSTM 结构模型。值得一提的是,Bi-LSTM 中的 2 个 LSTM 神经网络参数是相互独立的,它们只共享 word-embedding词向量列表。
Seq2Seq 解决问题的主要思路是通过深度神经网络模型(常用的是LSTM)将一个作为输入的序列映射为一个作为输出的序列,这一过程由编码输入(encoder)与解码输出(decoder)两个环节组成。
注意:Seq2Seq的实现程序设计好之后的输入序列和输出序列长度是不可变的。
应用场景:
① 机器翻译(当前最为著名的Google翻译,就是完全基于Seq2Seq+Attention机制开发出来的)。
② 聊天机器人(小爱,微软小冰等也使用了Seq2Seq的技术(不是全部))。
③ 文本摘要自动生成(今日头条等使用了该技术)。
④ 图片描述自动生成。
⑤ 机器写诗歌、代码补全、生成 commit message、故事风格改写等。
如上图所示, 最基础的Seq2Seq模型包含了三个部分,即Encoder、Decoder以及连接两者的中间状态向量C,Encoder通过学习输入,将其编码成一个固定大小的状态向量c,继而将c传给Decoder,Decoder再通过对状态向量c的学习来进行输出。
论文链接:Attention is All You Need
Transformer 由论文《Attention is All You Need》提出,trasnformer可以说是完全基于自注意力机制的一个深度学习模型,因为它适用于并行化计算,和它本身模型的复杂程度导致它在精度和性能上都要高于之前流行的RNN循环神经网络。
Transformer主要有两部分组成:Encoder 和 Decoder
当我输入一个文本的时候,该文本数据会先经过一个叫Encoders的模块,对该文本进行编码,然后将编码后的数据再传入一个叫Decoders的模块进行解码,解码后就得到了翻译后的文本,对应的我们称Encoders为编码器,Decoders为解码器。
2018年的10月11日,Google发布的论文
《Pre-training of Deep Bidirectional Transformer for Language Understanding》中首次提出了BERT 的架构,整体是一个自编码语言模型(Autoencoder LM),并且其设计了两个任务来预训练该模型。
BERT 相较于原来的 RNN、LSTM 可以做到并发执行,同时提取词在句子中的关系特征,并且能在多个不同层次提取关系特征,进而更全面反映句子语义。相较于 word2vec,其又能根据句子上下文获取词义,从而避免歧义出现。同时缺点也是显而易见的,模型参数太多,而且模型太大,少量数据训练时,容易过拟合。
BERT 只使用了 Transformer 的 Encoder 模块,原论文中,作者分别用 12 层和 24 层 的Transformer Encoder 组装了两套 BERT 模型。