注:《Recent Trends in Deep Learning Based Natural Language Processing》的阅读笔记,供内部同事和有需要的朋友参考,首次阅读NLP相关论文,如有不足欢迎指正。
1. 简介
近几年应用DL方法解决NLP问题的热度大增,主要得益于词嵌入以及深度学习方法的成功。
比较常见的NLP典型任务:
NER:命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。
例子:Harry Potter meets Hermione Granger in Hogwarts.
SRL:语义角色标注 (Semantic Role Labeling, SRL) 是一种浅层的语义分析技术,标注句子中某些短语为给定谓词的论元 (语义角色) ,如施事、受事、时间和地点等。其能够对问答系统、信息抽取和机器翻译等应用产生推动作用。
例子:Voldemort(施事) kills(谓词) Cedric(受事) in graveyard(地点) last night(时间)
POS tagging:词性标注(Part-of-Speech tagging 或POS tagging),又称词类标注或者简称标注,是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或其他词性的过程。在汉语中,词性标注比较简单,因为汉语词汇词性多变的情况比较少见,大多词语只有一个词性,或者出现频次最高的词性远远高于第二位的词性。
- 文章结构
部分2介绍深度学习的基础:分布式表示的概念;部分3,4,5介绍各种深度学习算法以及其应用于NLP任务的方式;部分6介绍强化学习和无监督学习在NLP和语句表达学习的进展;部分7介绍了记忆模块和深度学习的结合;部分8总结了深度学习模型在NLP任务标准数据集上的表现。
2. 分布式表示
在分布式表示被提出之前,最常用的表征方法为one-hot编码,即每个单词会被转换成一个独特的二元向量,且只有一个非零项。这种方法严重地受到了稀疏性的影响,不能用来表示任何带有特定含义的词语。而N元模型(n-grams)在模拟广义情境时严重受到了“维度灾难(curse of dimensionality)”问题的影响。
对于这种情况,科学家们想出来一个办法,这个办法是根据一个著名的假设——共现假设,即一个词可以用它周围的词来表示它。
基于这样一种假设,出现了共现矩阵来解决问题。
例如,对于三句话:“i like u”,“u like dog”,“i like cat”
他们的共现矩阵就是:
共现矩阵也存在着很大的缺点,首先矩阵很稀疏,可以看到图中很多地方为0,而对于不相似的句子,矩阵则更为稀疏。
如果想要降维,一般就会用到SVD矩阵分解。
SVD的缺点就是运算量太大了,这对于数以(没法以数计)的文本内容来说,不具备可操作性。
2003年,Bengio提出了一个思路:词可以通过矩阵来表示,而svd就是把这个维度降低,也就是说我们可以通过低维度的矩阵来表示整篇文章,每个词用一个向量来表示,基于以下几点假设,构建Neural Network Language Model模型。
- 假定每一个词我们都可以用一个向量来表示
- 我们有个模型,可以把一个词向量的输入,通过加权计算得出这段序列新的词向量输出
- 将词的权重与概率模型中的参数结合,一起学习
如上,就是一个完整的输入到输出的NNLM过程,我们希望得到的矩阵是C,通过不断优化(优化方式可以有很多选择,比如梯度下降等)。
这个模型中间的tanh就是隐层,通过结合下边的输入矩阵来不断计算,不断优化参数。这个模型主要成就就是将词向量的表达和概率模型相结合,并首次提出了word embedding的概念(虽然没有明确地叫这个名字)
2.1. 词嵌入
直观理解,词嵌入就是将单词映射到实数向量空间的过程,我们希望相似含义的词在目标向量空间中的距离比不相关词的距离更近。通常用于深度学习模型的数据处理首层,目前比较一般的做法是根据上下文类型选择的预训练好的“领域/任务参数”作为embedding层的初始参数(训练时不更新或微调后锁定参数),可以更快更高效地完成数据处理的第一步任务。
如果按照NNLM的架构实现词嵌入的概念,最大的问题就是,运算量太大了。于是Google的Mikolov做了个优化实现,模型总称为Word2Vector。
word2vector 包含了两种类型,Continuous Bag-of-Words Model 和 skip-gram model。
skip-gram资料传送门
cbow资料传送门
Pennington传送门
2.2. 词向量
2.1所说的词嵌入是一种区别于‘单热向量’的概念--仅仅是概念,而词向量(word2vec)可以理解为一套实现word embedding的具体方法。作为典型的word2vec方法,CBOW由上下文词计算目标词的条件概率,而skip-gram完全相反,由目标词计算上下文词的条件概率。通常,上下文在目标词的前后两个方向上取相同长度。一般在无监督学习中,上下文的长度由任务的预测准确率决定:当准确率随上下文长度的增加而趋于收敛时,停止增大其长度。
CBOW模型:
cbow,连续的词袋模型,就是将文本看成是一个一个单独的词,然后通过一个位置附近的词来推出这个位置可能的值。
在NNLM的基础上将tanh的隐层去掉,而输入的矩阵也不是one-hot稀疏向量,而是直接输入经过处理的低维绸密矩阵,之后再做一层求和运算,将得到的结果与最后的softmax矩阵相乘。
至于为什么要用加法,似乎是谷歌发现加法好用,所以就用了。。。
Skip-gram模型:
可以理解为CBOW的倒叙。
通过得到一个词,预测它周围词的概率。
单word词嵌入方法存在明显缺陷:
- 难以对词组做分布式表达,最近的解决方式--从无标签数据学习n-gram嵌入
- 受限于上下文window的尺寸,有些词(例如好或坏)的上下文可能没什么不同甚至完全一样,这对情感分析任务的影响非常大,解决尝试:SSWE
尽管Word2Vec模型的效果超过了许多经典算法,但是仍需要一种能捕获文本长短期顺序依赖关系的解决方法。对于这个问题,第一种解决方法为经典的循环神经网络(Recurrent Neural Networks),它利用数据的时间性质,使用存储在隐含状态中的先前单词信息,有序地将每个单词传输到训练网络中。
事实证明,这种网络能很好地处理局部依赖关系,但是由于“梯度消失”问题,很难训练出理想效果。
为了解决这个问题,Schmidhuber等人提出了一种新型网络拓扑结构,即长短期记忆模型(Long Short Term Memory)。它通过在网络中引入一种叫做记忆单元的特殊结构来解决该问题。这种复杂机制能有效获取单元间更长期的依赖关系,且不会显著增加参数量。
现有的很多常用结构也是LSTM模型的变体,例如mLSTM模型或GRU模型。这得益于提出了基于自适应简化的记忆单元更新机制,显着减少了所需的参数量。
特别说明,词嵌入高度依赖于任务类型。
一般的词嵌入算法难以区分多义词,Upadhyay的工作利用不同语言的同步训练解决此问题
2.3. 字符嵌入
在特定的NLP任务中,字符嵌入方法可以处理富词形态语言:结合词嵌入用于NER任务;或独立应用
字符嵌入用于OOV处理:中文字符嵌入模型,极大提升语义分类准确率。
OOV handling:非规范用语处理(解决单词或字不在词表集中的问题)
3. 卷积神经网络
词向量将单个词映射到向量空间中,更高一阶的工作则是基于词向量将连续词(句子,文章)提取特征。典型任务包括情感分析,文章概述,机器翻译,自动问答系统等。
典型的CNN做法是,将单词通过查表的方式转化为向量序列,输入CNN网络中,提取特征向量,CNN特别适合提取n-gram的突出特征。
3.1 基础CNN
3.1.1 语句建模
一般都是运用上述方法,逐句生成向量,每句话生成的向量序列应用max pooling取最大值。
非常适用于获取包含丰富语义信息的抽象表达。
3.1.2 窗口方法
语句建模不适合用于基于词的预测任务,如NER,SRL,POS tagging等,因此有些工作运用CNN的kernel机制实现词预测任务:假设词标签主要取决于其相邻词的标签,则可以根据上文的kernel与数据的乘积,预测下文的词。
词分类的终极目标:为整句生成标签序列。相关方法:CRF。
CRF算法,即条件随机场算法(conditional random field algorithm),Lafferty于2001年,在最大熵模型和隐马尔科夫模型的基础上,提出的一种判别式概率无向图学习模型,是一种用于标注和切分有序数据的条件概率模型。
TDNN: Time delayed neural network,用于获取更大的上下文范围,进而提升窗口方法的准确度。
3.2 典型应用
CNN based,可以将随机初始化的卷积核训练成特定任务的n-gram特征感知算子,缺陷是无法解决词之间的长距离依赖。
DCNN在语句语义模型上解决上述缺陷。
涉及情绪分析的NLP任务同样需要有效的情绪极性的抽象。研究51将词嵌入的结果拼接再以CNN处理。另外,短句的情绪分析难度通常都要高于长句的情绪分析,研究52的工作在短句情绪分析上做了改进,利用语义聚类为短句提供额外信息,CNN用于连接语义聚类单元。
DCNN用于自动摘要:利用不同层次的filter学习到语句、全文级别的关键信息。
CNN用于语义匹配:利用CNN提取文件的主要信息向量,与匹配请求对比,给出最符合请求本意的文件。
自动问答领域,利用CNN提取语义计算语义相似度,进而选择最适合的知识库。随后MCCNN引入立体匹配,从多角度分析和理解问题。
DMCNN:dynamic-multi-pooling代替最大池化,用于克服max-pooling带来的信息丢失问题
CNN-HMM用于在语音识别中发现不同讲话个体声音频率的不变性。
虽然不擅长与机器翻译,但也有人用CNN做语义相似性和上下文相似性评估。
对于挖掘上下文语义线索,CNN很得力。但是,CNN依赖大量数据训练,需要保持大量参数;另外,CNN本身不善对远距离关联建模。
4. 循环神经网络
RNN本身的‘循环’特性决定了其本身适合处理序列型数据。
应用--语言建模,机器翻译,语音识别,图像字幕
4.1 RNN基础属性分析
虽然从模型构成角度上,RNN似乎更适合处理语音类的序列数据,但也有些研究论证了RNN不一定比CNN优胜。
4.2 常用于NLP任务的RNN
simple-rnn,lstm,gru
4.3 应用
4.3.1 词级别分类
双向LSTM + CRF -- NER
4.3.2 语句分类
研究25用LSTM为推文生成向量以支持情感分析。
和CNN的kernel相似,LSTM的隐藏状态也可以用来做语义匹配。
4.3.3 语言生成
机器翻译,图像字幕等任务中,RNN扮演生成模型,此时RNN通常作为decoder出现在模型中
seq2seq:通常输出是另一种形式的序列(另一种语言for机器翻译,答案for自动问答)
DMN:dynamic memory network,问答领域很通用的框架,深入研究的话值得了解一下。
4.4 注意力机制
对于文本很长或者富信息文本,encoder不一定能编码最相关的部分。受此启发,注意力机制应运而生,注意力机制允许decoder查阅输入序列以关注最相关的部分。
机器翻译、自动摘要、图像字幕均有应用。
基于方面(aspect)的情感分析,研究104应用此机制让模型集中于语句中选定的区域。
另有MemNet应用“多跳注意力”,让模型关注多个重点信息区域以提升模型表现。
5. 递归神经网络
5.1 基础模型
语言本身的结构是递归的:字构成词,词构成句,句构成章。递归神经网络就是用递归树的形状特点,对语言建模。
值得了解:[RNTN]
5.2 应用
分词
基于分词树和递归神经网络,研究4实现了短语级的情感分析框架
6. 深度强化模型和深度无监督模型
6.1 基于深度强化学习的序列生成
RNN被当做RL中的agent,每个时刻与对应的上下文交互;RNN的参数定义了agent的policy,agent根据policy决定下一步的action,即预测下一个单词。每一个action后,agent会更新内部状态,即rnn的隐藏单元。预测到序列结束后,agent会获得reward。
6.2 无监督语句表达学习
和词嵌入的skip-gram一样,句子的分布式表达也可以用无监督学习模式:skip-thought model
另外,研究123的结果表明,预训练句子编码初始化LSTM参数,会提升预测效果。
6.3 深度生成模型
VAE:
RNN-based VAE:用于合并整句的分布式潜在表征
研究128提出通过用指定的语义学习解开的潜在表示来生成其属性受控的句子
GAN:
研究127提出了一个基于LSTM和CNN的应用框架进行对抗训练以产生逼真的文本。
7. 记忆增强网络
注意力机制贮存的编码器隐藏向量,可以认为是模型的内部记忆。
很多NLP任务(QA,POS tagging,和情感分析)都可以抽象为(记忆,问题,答案)三元组,
具体案例可参见上文已经提到的DMN和MemNet