赞
踩
说到自然语言处理,语言模型,命名实体识别,机器翻译,可能很多人想到的LSTM等循环神经网络,但目前其实LSTM起码在自然语言处理领域已经过时了,在Stanford阅读理解数据集(SQuAD2.0)榜单里,机器的成绩已经超人类表现,这很大程度要归功于transformer的BERT预训练模型。
transformer是谷歌大脑在2017年底发表的论文中所提出的seq2seq模型(从序列到序列的模型).现在已经取得了大范围的应用和扩展,而BERT就是从transformer中衍生出来的预训练语言模型。
这里介绍一下在目前的自然语言处理领域,transformer模型已经得到广泛认可和应用,而应用的方式主要是先进行预训练语言模型(上游任务),然后把预训练的模型适配给下游任务(在自然语言处理中要完成的实际的任务,如情感分析,分类,机器翻译等),以完成各种不同的任务,如分类,生成,标记等等,预训练模型非常重要,预训练的模型的性能直接影响下游任务的性能。就好比要培养一个孩子成为作家,不可能上来就直接让他开始写作,在写作之前肯定会让他识字,看很多的大作家的作品汲取精华,最后才可以进行写作。
首先来说一下transformer和LSTM/RNN的最大区别,就是LSTM/RNN的训练是迭代的,是一个接一个字的来,当前这个字过完LSTM单元/RNN层,才可以进下一个字,而transformer的训练是并行的,一般以字为单位训练的,transformer模型就是所有字是全部同时训练的,这样就大大加快了计算效率, transformer使用了位置嵌入(positional encoding)来理解语言的顺序(获取时间序列关系),使用自注意力机制和全连接层来进行计算。
transformer模型主要分为两大部分,分别是编码器和解码器,编码器负责把自然语言序列映射成为隐藏层(下图中第2步用九宫格比喻的部分),含有自然语言序列的数学表达.然后解码器把隐藏层再映射为自然语言序列,从而使我们可以解决各种问题,如情感分类,命名实体识别,语义关系抽取,摘要生成,机器翻译等等,下面我们简单说一下下图的每一步都做了什么:
Inputs
是经过padding
的输入数据,大小(shape)是[batch_size, max_sequence]
(batch_size个max_sequence长度的句子,同时输入)embedding matrix
,通过embedding lookup
(到字向量表中去查找对应的字向量)将Inputs
映射成token embedding
,大小是[batch_size, max_sequence, embedding_size]
sin
和cos
函数创建positional encoding
,表示一个token
(这里的token就是目标词(字)的意思)的绝对位置信息,并且加入到token embedding
中,然后dropout
multi-head attention
(多头注意力机制)token embedding
,通过Dense生成Q,K,V,大小是[batch size, max seq length, embedding size]
,然后按第2维split成num heads份并按第0维concat,生成新的Q,K,V,大小是[num heads*batch size, max seq length, embedding size/num heads]
,完成multi-head的操作。[num heads*batch size, max seq length, max seq length]
。hidden size
的开方(在transformer中,hidden size=embedding size
),完成scale
的操作。softmax
对padding
的结果就可以忽略不计了。mask
的结果进行softmax
操作。softmax
的结果和V
进行点积,得到attention
的结果,大小是[num heads*batch size, max seq length, hidden size/num heads]
。attention
的结果按第0维split
成num heads
份并按第2维concat
,生成multi-head attention
的结果,大小是[batch size, max seq length, hidden size]
。Figure 2上concat
之后还有一个linear
的操作,但是代码里并没有。token embedding
和multi-head attention
的结果相加,并进行Layer Normalization
。activation=relu
,第2层activation=None
。这里主要分析编码器的结构,主要是Bert预训练语言模型只用到了编码器部分。
Transformer Block结构图:
注意,为了方便查看,下边的内容分别对应着图中第1,2,3,4个方框的序号
图表分析:
- 这里输入一个 X X X(多个句子)得到一个 X h i d d e n X_{hidden} Xhidden, X h i d d e n X_{hidden} Xhidden就是通过编码器输出得到的隐藏层。先看一下第一步
Input Embedding
,先从字向量表里边查到对应的字向量,它的维度就变成了[batch_size , Sequence_length , embedding_dimmension]
,这里的input Embedding
就是从这个表中找到每一个字的数学表达。
字向量表的结构:
这里是一个字的向量查询表(哪里来的?),本文第一幅图中的第二步中初始化embedding matrix,就是通过embedding lookup
(到字向量表中去查找对应的字向量)将Inputs
映射成token embedding
,大小(shape)是[batch_size, max_sequence, embedding_size]
接下来引入position encoding的概念,即给每一个字设定一个位置
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。