最近听了太多与自然语言相关的内容,觉得很神奇,但同时又是一头雾水。今天终于决定要去找一些相关资料看一下,那些常常听到名词到底是什么意思,顺便做个记录。
参考网址:https://www.zhihu.com/question/19895141
自然语言处理(简单NLP, Natural language process),是研究计算机处理人类语言的一门技术。包括:1.句法语义分析,2.信息提取,3.文本挖掘,4.机器翻译,5.信息检索,6.问答系统,7.对话系统。(我听到比较多的应用是机器翻译和问题系统)
GitHub上出现了一套NLP课程,课程为期13周,从文本嵌入分类开始,讲到Seq2Seq,再到机器翻译、对话系统、对抗学习等等,内容丰富。入门选手可以考虑。(课程网址请到参考网址中查收)
参考网址:https://zhuanlan.zhihu.com/p/96778666
1. word2vec
Firth在1957年提出一种重要的语言学思想:一个词语的意思应该由它的上下文表示。
在word2vec出现前,一种简单的对词的表示是one-hot向量,这种表示方法最大的缺点在于没办法表示出词语之间的相似性。
Tomas Mikolov在2013年发表了几篇重要的论文,首次提出了CBOW和Skip-gram模型,而word2vec只是一个工具,其背后的模型就是CBOW (Continuous Bag of Words)或Skip-gram模型。
2. Transformer
在说明transformer前,需要简述一下attention机制。
seq2seq是由一个encoder和一个decoder构成,编码器负责把源序列编码成向量,解码器是一语言模型,负责 根据编码的信息生成目标序列。这个结构的问题在于,编码器需要把整个Source sentence的信息全部编码起来,这是seq2seq的瓶颈所在。而attention机制就是解决这个瓶颈的一种方法。attention的核心想法是:在解码器的每一个时间步,都和编码器直接连接,然后只关注source sentence中的特定的一部分。(不是很明白)
但是seq2seq+attention机制,还是要按照序列顺序去encoding的,不好做分布式计算,于是有了直接抛弃RNN, LSTM的self-attention机制,以及应用了这个机制的transformer.
(个人理解:transformer的作用也是进行序列的转换,只是可以采用分布式地方式去处理encoding.)
3. Bert (Bidirectional Encoder Representations from Transformers)
整个bert分为两步,pre-training和fine-tuning。在pre-training部分,在不同的pre-training任务中在未标记的数据上进行训练,在fine-tuning部分,模型先使用pre-trained的参数初始化,然后在下游任务中用标记数据对所有参数进行微调,虽然初始化用的都是相同的pre-trained参数,但是在下游不同任务中可以有不同的fine-tuning模型。
(参考网址:https://zhuanlan.zhihu.com/p/103226488)
因为pre-training需要大量的数据和大量的计算资源,所以google开源了多国的语言预训练模型,我们可以在这个基础上进行fine-tuning。
为了使bert可以适应下游的任务,输入被改造成: [CLS]+句子A(+[SEP]+句子B+[SEP])。其中[CLS]代表的是分类任务中的特殊token,它的输出就是模型的pooler output;[SEP]为分隔符;句子A和句子B是模型的输入文本,其中句子B可以为空。
bert使用两个非监督任务来pre-training模型:
task1 masked LM: 为了训练深度双向模型,作者使用了一种随机掩盖一定百分比的输入词的方法,然后再去预测这些掩盖的词,这种方法叫做Masked LM (MLM)。其实就可以想象成是完形填空,在作者实验中使用的 15%的词,也就是随机掩盖15%的词,然后再去预测 这些掩盖的词。
task2 Next Sequence Prediction: 很多下游任务比如QA, Natural language inference都是基于对两个句子之间的关系去理解的,但是在语言模型中没有捕捉到这个信息,bert就是为了解决这个问题,加入了NSP训练任务。50%的时间选择句子A真正的下一个句子B作为一个句子对(标记为IsNext), 50%的时间选择句子A和随机句子作为句子对(标记为NotNext)训练数据就是这样,虽然简单,但是很有效。
bert使用了MLM+NSP的多任务学习模式,并利用Tansformer的self-attention机制实现双向功能,设计了更通用的输入和输出层,适配了多任务下的迁移学习。