目录
[2、自注意力机制(self attention)](#2、自注意力机制(self attention))
一、传统的自然语言处理框架存在的问题
1、RNN网络计算时存在的问题
(1)、串联,导致数据必须从h1-h2-...hm。数据训练时间变长,因为需要要等h1的结果出来才能计算h2;
(2)、并行计算效果不好,也就是不能多台服务器同时训练一个网络。

2、传统word2vec存在的问题
(1)、词向量一旦训练好了,就不会改变;
(2)、不同语境中的词含义不同,例如 【a、你真不是东西。 b、东西】 因此根据上下文不同的语境,应该有多个不同的词向量。

Bert模型的编码-解码框架就能解决上述问题
二、Bert模型机制
Encoder-Decoder:也就是编码-解码框架,目前大部分attention模型都是依附于Encoder-Decoder框架进行实现。 在NLP中Encoder-Decoder框架主要被用来处理序列-序列问题。也就是输入一个序列,生成一个序列的问题。这两个序列可以分别是任意长度。
比如:
文本摘要:输入一篇文章(序列数据),生成文章的摘要(序列数据)
文本翻译:输入一句或一篇英文(序列数据),生成翻译后的中文(序列数据)
问答系统:输入一个question(序列数据),生成一个answer(序列数据)

1、编码-解码框架(Encoder-Decoder)
(1)、编码器(Encoder)
Encoder:编码器,对于输入的序列<x1,x2,x3...xn>进行编码,使其转化为一个语义编码C,这个C中就储存了序列<x1,x2,x3...xn>的信息。
编码方法:主要RNN/LSTM/GRU/BiRNN/BiLSTM/BiGRU,例如RNN中用h4直接作为语义编码C的值。
(2)、解码器(Decoder)
Decoder:解码器,根据输入的语义编码C,然后将其解码成序列数据,解码方式也可以采用RNN/LSTM/GRU/BiRNN/BiLSTM/BiGRU。 Decoder和Encoder的编码解码方式可以任意组合。
语义编码:例如当我们翻译法语中的"abandon"时,我们大脑是先将abandon所表达的概念意识提取出来,这也就是一个编码的过程。 然后提取出来的这个意识概念也就是我们的Feature Vector. 接下来我们的大脑就会基于这个意识概念,去我们大脑中的英语语言库中把与这个意识概念匹配的英文单词提取出来, 这也就是解码的过程。
2、自注意力机制(self attention)
(1)、注意力机制
注意力机制其实是源自于人对于外部信息的处理能力。人在处理信息的时候,会将注意力放在需要关注的信息上,对于其他无关的外部信息进行过滤,这种处理方式被称为注意力机制。
一句话中,哪些是重点?如何让计算机关注到话语中的重点?

(2)、自注意力机制
自注意力机制是注意力机制的变体,是输入语句内部元素之间或者输出语句内部元素之间发生的注意力机制。

如何实现slef attention呢?
<1>、首先输入经过编码后得到的词向量
<2>、构建三个矩阵,相当于cnn的卷积核, 分别为wQ、wK、wv矩阵。
<3>、将每一个词向量与矩阵相乘。得到QKV矩阵。
其中
Q:为需要查询的
K:为等着被查的
V:实际的特征信息

slef attention如何计算?
<1>、计算一段话中每个词之间的匹配程度

<2>、通过匹配程度得到每个词的特征重要性。

每个词的Q会跟整个序列中的每一个K计算得分,然后基于得分再分配特征。

因此当和不同的词组合成序列,就会得到不同的特征值。因为不同的组合序列语句,注意力不同。

以上步骤,可通过并行计算,大大提高了计算速度。
3、多头机制(multi-headed)
multi-header(多头)机制:
(1)、通过不同的head得到多个特征表达,一般8个head
(2)、将所有特征拼接在一起
(3)、降维,将Z0~Z7连接一个FC全连接实现降维

将此类结构多层堆叠,就形成了多层网络

4、三角函数位置编码
前面的模型,并没有考虑词的顺序,只是单纯考虑一段话有哪些词。因此模型中需要加入位置编码bert模型运用了一种三角函数位置编码。

word embedding:是词向量,由每个词根据查表得到
pos embedding:就是位置编码。
composition:word embedding和pos embedding逐点相加得到,既包含语义信息又包含位置编码信息的最终矩阵。
pos:指当前字符在句子中的位置(如:"你好啊",这句话里面"你"的pos=0)

dmodel:指的是word embedding的长度(例"民主"的word embedding为[1,2,3,4,5],则dmodel=5), 2i表示偶数,2i+1表示奇数。取值范围:i=0,1,...,dmodel−1。偶数使用公式(1),奇数时使用公式(2)。 当pos=3,dmodel=128时Positional Encoding(或者说是pos embedding)的计算结果为:优点:
1、可以使PE分布在[-1,1]区间。
2、不同语句相同位置的字符PE值一样(如:当pos=0时,PE=0)。