通过一张PPT快速了解positional embedding:
【论文复现代码数据集见评论区】Transformer(Attention is all you need)自然语音处理必读论文,为你提供论文复现+代码精讲_哔哩哔哩_bilibili
12分55秒
初步印象:
- 目的: 使用q在k中找到v的值
- 总体形式: 里面: 矩阵相乘+归一化+外面: 和向量相乘(解释: 向量的行数应该就是要用注意力分配权重的id数)
注意力机制的计算:
方式一: 以句子翻译+q,k,v理解:
- 最初的embedding: 文本向量+位置向量
- 矩阵的行数: 字数
- batch_size: 句子个数
- 三个需要通过参数学习的矩阵: q,k,v. 大小: 行和列都是embedding的大小
- 初始的embedding通过 三个权重矩阵 之后 得到三个 attention中最为重要的要素: q,k,v
- 将q,k,v分割, 得到multi-head: 将embedding的那个方向给切了
- multi-head到底有什么作用? : 相当于CNN中的卷积核, 提取多重语义
- Q*K: 让每个词 和 其它各个词相乘: 得到 : 一个词对应其它词的权重表(当然,肯定是自己和自己关系最密切)
- 因为它是矩阵, 所以实现了并行, 寻找一个词和其它的词的关系, 不用像RNN那样先处理一个词, 再处理一个词
- 按行归一化
- 和v 相乘(每一行代表一个字, 即给每一个字赋权重)\
- 每个字向量都含有当前句子中所有字向量的信息
- 处理多头attention: 将每个头的输出直接 拼接起来 经全连接层(线性变换, 改变矩阵形状), 得到最终输出
- attention mask: 有些部分为0, 但是在归一化的时候, 直接弄成0分子会成1, 所以会设置成负无穷, 分子就会是0???
方式二: 以q, a, c, s理解:
-
要计算s_j就要先计算c_j, 要计算c_j就要先计算a_j:
-
将decoder当前状态s_j与m个h_i做运算得到权重向量(权重的具体计算见下)
-
h_i,s_j 各自乘以权重矩阵W_K,W_Q
-
k,q进行内积
-
经softmax
-
一共有三个“权重矩阵”:
-
在seq2seq版本注意力机制中,c的更新依靠: a和h(encoder状态)
-
在transformer版本的注意力机制中,c的更新依靠:a和v
-
去掉RNN层,只保留attention层:
-
transformer的组成:attention层 + self attention层 + 全连接层
-
目标是得到去掉RNN只留有attention的模型
-
encoder输入:x_i
-
decoder输入:通过所有x_i + x'_i得到下一个x'_i
-
-
对于encoder输入向量X:分别乘以权重矩阵W_K和W_V:得到k,v
-
对于decoder输入值x':乘以权重矩阵W_Q : 得到q
-
用一个q和每个k可以得到:a
-
a和v做向量内积可以得到c
-
对接下来的decoder输入都是同理
-
所以,就会得到每一个decoder输入的c,作为attention层的输出
-
整体看来:就是用k,q,v得到了c
-
即,c是x和x'的函数
-
可以在输出的基础上加softmax,加分类器
-
将上一个输出作为下一个输入
-
可以将attention网络看成一个C=Attn(X,X‘)函数
-
接下来说明self-attention
-
attention和self-attention的区别就是:
-
attention用于seq2seq模型,是encoder-decoder的结构,有两方面输入
-
self-attention用于单个模型,只有一方面输入
-
-
self-attention网络,对于输入x有分别乘以三个权重矩阵之后,得到三个输出
-
所以,对于每一个x都有三个输出
-
a1:一个q+所有k
-
同理,算出所有的a
-
a,v点成得到c
-
同理,算出其它c
-
self-attention的输出就是c
-
同样地,可以将self-attention网络看成是一个C=Attn(X,X)函数
-
15:attention
-
16: self-attention
-
17:transformer