本文简要介绍一些深度学习在自然语言应用的基本任务,词表示,文本翻译和机器翻译。
一、典型任务
- 词性标注和句法分析
- 问答和对话系统
- 文本/文档分类
- 情感分析和观点挖掘
- 机器翻译
- 文本生成
- ......
1.1 词性标注和句法分析
词性(POS)标注即对句子里的每个词给出它的词性如名词、动词等:
句法分析即分析其主、谓、宾等结构:
1.2 问答和对话系统
用户问出一个问题,对话系统能够做出回答,这便是该系统主要关注的任务。
左边是简单的一问一答的形式,而后面则是有前后呼应的对话。
1.3 文本/文档分类
比如情感分类,积极、消极、中性的:
文档分类处理的对象会长一些,不是简单的几句话,而是一整片文章或是几页:
1.4 机器翻译
机器翻译顾名思义就是把一种语言翻译成另外一种语言。
1.5 其它
NLP的应用还有很多,比如对联、古诗生成~
couplet.msra.cn
九歌——人工智能诗歌写作系统 (thunlp.org)
二、词表示
2.1 词表示
自然语言处理的最基本的对象就是词,词构成句子,句子构成段落,段落构成文章。
那么我们如何来表示一个词呢?大家最先能想到的就是以one-hot的形式,如:
但是这样,维度、词汇表的大小|V| 可能是数百万。且如词与词之间意思相近或者意思没什么关系又无法表述:dist(“kid”, “child”) 、dist(“flower”, “car”)
- 维度太高
- 没有表达词之间的关系
动机:用一个词的邻居来表示这个词 “You shall know a word by the company it keeps”
我们可以看到上面两句话都和词“banking”有关,我们就可以用它周围的这些词,即这段话里的词来表示“banking”的含义。
如何去表示呢?
在深度学习兴起之前,人们的一个典型的想法是用共现矩阵去表示。
2.1.1 基于窗口的共现矩阵
以下面示例语料集为例
- 我们选定一个窗口,为方便起见我们选定窗口长度为1(通常是5-10)。
- 这个窗口的作用是来选的某个词左边1个词和右边1个词出现的频率。
上面语料集一共出现7个词,所以矩阵是7*7的。
以like这行为例,可以看到它左右距离为1的窗口出现单词I有两次,deep一次,NLP一次,其它都为0次。
但是,这种共现矩阵的表示法,依然是有多少个词,向量的长度就是多少,依然不那么"经济实惠",但是相比于独热编码,它没有那么稀疏了(但还是比较稀疏)。
- 维度太高
- 表示稀疏使模型不够鲁棒
- 在词汇表中添加一个单词时需要重新计算所有单词的表示形式
2.1.2 用低维向量表示单词
目标: 以固定的、低维度的向量存储“大多数”重要信息(密集向量):
- 通常约25-1000维
- 基于这种表示,很容易来执行任务(分类,生成等)
方法:
- 神经概率语言模型 - Bengio et al., A neural probabilistic language model. Journal of Machine Learning Research, 2003.
- 最近更简单更快的模型: **word2vec **(继承自神经概率语言模型) - Mikolov et al., Distributed representations of words and phrases and their compositionality, NeurIPS 2013
神经概率语言模型的影响
2.2 word2vec的主要思想
2.2.1 思想介绍
核心思想:不统计词的共现数,而是预测每个词周围的词。
如图,输入一个词(one-hot编码),中间做一个神经网络的隐层,这个隐层很简单,没有非线性(没有激活函数,即线性映射)。最后做出输出(每个输出也是one-hot),预测t-2, t-1, t+1, t+2时刻的词(和窗口大小有关)。
- |V|大概上万维-百万维
- d大有50~1000,即先高维映射到低维,然后再映射回高维。
第一步:词wt乘以权重C得到vwt ,其实就是得到了C的那一列。
第二步,vwt 与 K 相乘,又得到回一个V维的向量,这个一列向量的每一行都表示和K这一行(这个词)在这个时刻(举例)的相似性(得分)。再经过一个softmax把结果压在0-1之间,根据结果大小如,投影为 t-2 位置的词。
- C的每一列对应一个词:“输入向量”
- K的每一行对应一个词:“输出向量”
注意:
- 需要预定义C的列与语料库中词之间的对应关系
- 必须再K中使用同顺序的行。
经过学习后,C的第i列与K的第i行可以平均来表示第i个词。
图示如下:
以当前词为France为例:
经过投影后,我们得到France这个词的**输入向量"France"**,与K相乘得到一个高维的实数向量,经过softmax得到0-1之间某时刻的输出向量。
在t-2时刻,我们还有一个标准答案"captial"对应的独热编码,这也说明K的最后一行表示captial。
同样,其它词如of应该是t-1时刻的,那么K的对应of的那一行(对应的输出向量)在该时刻也应该与输入向量France相似,才能得到of**.**
2.3 训练方式
目标: 给定一个输入词,最大化周围词的概率
2.3.1 skip-gram模型
skip-gram模型:用当前词预测周围词的概率
以t-1时刻的词为例,来最大化这个词的概率。
处于位置 t+j ( j = -2,-1,1,2 )的词, 的概率为:
训练过程中,作为希望输出的词 的交叉熵损失为:
2.3.2 目标函数
- 我们在窗口的其他位置有同样的要求。对所有位置的损失求和
其中c是窗口大小,![\theta](https://latex.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20%5Ctheta) 表示所有参数
- 在所有给定输入 上求平均
- 相当于最大化平均对数概率
- 用反向传播算法和SGD训练模型
2.3.3 softmax的替代方法
在窗口的每一个位置,softmax的输出为
其中
这种方法的问题在于:归一化项的计算耗时长。
替代方法:
- 层次化softmax
- 负采样
2.4 结果
可以看到下面一些有意思的现象:
国家都在左边,首都都在右边,且举例相似,也都基本平行。
向量German和向量airlines相加,得到的结果和他们的航空公交公司很像...
如何表示一个句子或一个段落?
三、神经网络进行文本分类
在我们获得每个词的词向量后,如何表示一个句子或一个段落?
3.1 CNN进行文本分类
答:我们把这些词向量按照一定的顺序拼接起来,得到一个二维矩阵,这个二维矩阵就可以是一个句子/段落新的表示。之后对句子/段落进行分类,其实就是对二维矩阵进行分类。我们此时就可以用以前那些处理图像的方法来处理这些二维矩阵了。
卷积核kernel的宽度和词向量的宽度都是K,所以卷积后得到一个向量而不是一个矩阵。
再对每个句子上进行MaxPooling,每次MaxPooling都会得到一个数,有几个kernel就会有几个元素。
最后就可以做一个全连接网络进行句子分类。
3.1.1 这个模型有什么问题?
深度不够
- 一层卷积和一层池化
特征不够多样化
- 每个卷积核会产生一个1维的特征图,即一个特征向量
- 在一个特征向量上应用全局最大池化,即对所有时间做最大池化,这会产生一个标量。
3.1.2 一个更深的模型
- 确定到底要多长的句子,选择使用动态的K-Maxpooling,使得得到的结果等长。
3.2 RNN进行文本分类
我们上面说到CNN进行文本分类,RNN一般用来处理持续性信息,其实我们用RNN去进行文本分类会更加的自然,也是现在主流的选择。
以Elman网络为例,其中x是每个时刻的输入(每个时刻的词), r最后时刻出现,我们把隐层进行展开...
RNN文章: AI遮天传 DL-反馈神经网络RNN_老师我作业忘带了的博客-CSDN博客
- 可以使用 LSTM 或者 GRU
- 可以使用双向 RNN
四、神经网络进行机器翻译
介绍一种很典型的模型,序列到序列的学习模型。
通常会涉及两个RNN: 编码器(encoder)和解码器(decoder)
许多NLP任务可以表述为序列到序列:
- 机器翻译 (法语 → 英语)
- 总结 (长文本 → 短文本)
- 对话 (先前的话语 → 接下来的话语)
- 代码生成 (自然语言 → Python 代码)
- 旋律产生 (一个乐句 → 下一个乐句)
- 语音识别 (声音 → 文本)
4.1 机器翻译 (NMT)
如下:法语-英语
- 左侧,编码器RNN 产生一个源语句的编码
- 右侧,解码器RNN生成以编码为条件的目标句子
对于编码器和解码器
- 对于编码器,可以使用预训练词向量,例如word2vec ,或者one-hot形式词向量
- 对于解码器,使用one-hot形式表示输出
编码器和解码器的字典
- 对于一些任务,例如,机器翻译,它们是不同的
- 对于其他任务,例如,总结和对话任务,它们是相同的
编码RNN和解码RNN通常是不同的,也可以使用深度RNN。
4.2 训练 NMT 系统
首先我们要有很多的语料集,法语->英语,法语->英语,法语->英语,...,法语->英语
把法语输入给Encoder RNN,英语输入给Decoder RNN
每个时间都会输出一个单词,使用交叉熵函数计算,把所时刻的交叉熵计算结果加起来,取个平均得到J,最小化这个J,反向传播(多个单词 就有多个loss),调整Encoder RNN 和 Decoder RNN里面的参数。
模型问题
上图画圈处的地方,是Decoder的唯一输入,我们期望Encoder在这个时候的状态包含了之前的原语句的所有信息。但是只用这一个向量来表示这个句子的所有信息,对它的要求是不是有点高了?
解决办法:注意力机制
注意力机制提供了一个解决瓶颈问题的方法
4.3 注意力机制(Attention)
核心思想: 解码器的每一步中,关注于源序列的特定部分。
即当前我要输出某个词的时候, 我们就去原序列集中注意去找哪些词和它的关系最强。
注意力机制有很多形式 ,下面将展示一个例子:
4.3.1 带有Attention的Seq2seq
我们从第一个时刻出发,要预测第一个时刻的输出,把Decoder里隐层的向量与Encoder隐层的向量进行点积,每个地方得到一个标量,标量有大有小,有的可能超过1,有的可能是负数:
此时做一个softmax转换到0-1之间,表示Encoder里每一个向量与Decoder当前向量的距离/相似度。
可见Decoder里第一个词与Encoder里第一个词很相似。
我们把softmax后的这些结果(相当于权重)与Encoder里的向量相乘,进行加权求和:
在加权求和结果里,第一个向量的成分/比例是最大的。
将加权求和之后的结果Attention与当前时刻的Decoder时刻的隐层状态把他俩拼起来,经过一个softmax去预测当前时刻应该输出什么:
同样,下一时刻也是如此:
对应公式:
五、主要参考文献及延伸阅读
Kim (2014) Convolutional neural networks for sentence classification arXiv preprint arXiv:1408.5882
Bengio, Ducharme, Vincent, Jauvin (2003) A neural probabilistic language model Journal of Machine Learning Research
Mikolov, et al. (2013) Distributed representations of words and phrases and their compositionality NeurIPS
Sutskever, Vinyals, Le (2014) Sequence to Sequence Learning with Neural Networks NeurIPS
Vaswani, Shazeer, Parmar, et al. (2017) Attention Is All You Need NeurIPS
Devlin, Chang, Lee, Toutanova (2019) BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding NAACL
版权归原作者 老师我作业忘带了 所有, 如有侵权,请联系我们删除。