编码器(encoder)
-
输入为 ( batch_size,sequence_length ),batch_size 表示句子数量而sequence_length 则表示每句长度。
-
首先输入矩阵经过 Input Embedding 变为一个维度为(batch_size,sequence_length,embedding_dim) 的矩阵,这里我们通过 embedding 矩阵将表示每一个词 id 转换为一个向量(word2vec)
-
接下来通过 Posional Encoding 添加位置信息
image
位置嵌入是(sequence_length,embedding_dim) 的矩阵,可以和词嵌入相加得到(batch_size,sequence_length,embedding_dim)的矩阵,我们用表示来表示一下这个步骤
-
然后就进入可以多次重复块(block)
image
然后我们对 和 三个矩阵按 header 数量进行切分出多头注意力机制。按 h 数量将矩阵进行切分为维度 (batch_size,sequence_length,h,(embedding_dim/h)) 这里 h 为多头注意力机制数量超参数 h。为了方便计算我们会把 image维度 sequence_length 和 h 进行转置,得到 (batch_size,h,sequence_length,(embedding_dim/h))
这里 和 相乘会得到输入序列长度方阵,类似协方差矩阵。作为sofatmax 表示某一个时刻输入与各个输入间关系一行的概率分布,和为 1。
image
经过一系列运算维度还是保持(batch_size,h,sequence_length,(embedding_dim/h))
-
Batch Norm 我们是对同一个 batch 不同数据同一个维度进行归一化(标准化),也就是希望一个 batch 同一个维度(特征)均值为 0 方差为 1
-
Layer Norm 是无需考虑 batch 给一个数据,我们希望其在各个不同维度上均值为 0 方差为 1
-
Add & Norm 层,这里做的事情是,字面上意思是做加法,在从图中箭头走向,我们发现就是 多头注意力层(Multi-Head Attention) 的输入 a 和其输出 b 相加得到 然后就是单词 Norm ,这里 Norm 就是 layer Norm 值得注意的是这里是 Layer 而不是我们之前熟悉的 Batch。
- image
-
Feed Forward 这里没有什么好将的,就是将输入序列处理后向前传递到下一个 Add & Norm 层
-
Multi-head Attention 就是我们介绍过多头注意力层(Multi-Head Attention),也就是输入一个序列后通过此层会得到另外一个序列。也就是经过词嵌入和位置嵌入后得到 (sequence_length,embedding_dim) 经过
image 和 变换后得到三个矩阵 image - image
解码器(decoder)
-
输入是前一个时刻所产出的输出
-
同样经过 nput Embedding 变为一个向量
-
添加位置信息 Pisitonal Encoding
-
然后就进入可以多次重复块(block)
-
Masked Multi-head Attention 这里和之前 Multi-head Attention 多了个 Masked。Masked 表示只会关注到已生成出来的序列。
在上面 self attention 的计算过程中, 通常会使用 mini_batch 来进行计算, 也就是一次计算多句话, 也就是 X 的维度是(batch_size, sequence_length]sequence_length) 是句长, 而一个 mini_batch 是由多个不等长的句子组成的, 我们就需要按照这个 (mini_batch) 中最大的句长对剩余的句子进行补齐长度, 我们一般用 0 来进行填充, 这个过程叫做 padding。
但这时在进行 softmax 的时候就会产生问题, 回顾 softmax 函数
- Add & Norm 层
- Multi-head Attention 这一个层会接收从解码器过来的(隐藏层)输入(解码器的输出)
- Add & Norm 层
- Feed Forward 层
- Add & Norm 层
-
Linear 层
-
Softmax 层
这里过于基础或者已经介绍过我们就不做过多解释了。
网友评论