-
编码器部分
-
注意力机制: [重点复习]
- 注意力: 快速聚焦, 进行事务的判别的过程
- 注意力机制: 就是将注意力计算规则融入到网络中,然进行使用的过程, 就是注意力机制, 如果QKV都是相等的, 则是自注意力机制
-
多头注意力机制:[重点复习]
-
多头: 其实就是将最后一个维度[词嵌入维度]进行分割, , 每个维度进入注意力机制进行特征提取/语义提取的过程
-
作用: 为了使咱们的语句或是词汇有更多元 化的表示/表达
-
contiguous()函数的使用: 一般是在transpose使用之后进行使用, 为的是在后面可以直接使用view函数,contiguous()的作用是将transpse转置之后不连续的存储形式变成连续的存储形式, 方便view函数的使用.
-
输入和输出的形状一样(2,4,512)-> (2,4,512)
-
前馈全连接层
- 实质: 两 个全连接线性层
- 作用: 增加模型的拟合能力
- 实现:
- 数据—> 第一个全连接线性层—> RELU函数—>dropout层—> 第二个全连接线性层
-
规范化层
-
作用: 在深度网络中, 训练的过程可能会出现数值过大或是过小的情况, 这样会造成数据异常的行为, 为了是模型可以更好的训练, 需要将数据规范到一定的范围之后, 在进行后续的计算
-
keepdim参数的演示
import numpy as np import torch x=[ [[1,2,3,4],[5,6,7,8],[9,10,11,12]], [[13,14,15,16],[17,18,19,20],[21,22,23,24]] ] x=torch.tensor(x).float() # print("shape of x:") #[2,3,4] print(x.shape) # print("shape of x.mean(axis=0,keepdim=True):") #[1, 3, 4] print(x.mean(axis=0,keepdim=True).shape) # print("shape of x.mean(axis=0,keepdim=False):") #[3, 4] print(x.mean(axis=0,keepdim=False).shape) # print("shape of x.mean(axis=1,keepdim=True):") #[2, 1, 4] print(x.mean(axis=1,keepdim=True).shape) # print("shape of x.mean(axis=1,keepdim=False):") #[2, 4] print(x.mean(axis=1,keepdim=False).shape)
-
-
子层连接结构
- 定义: 每个子层特定的层(多头注意力层/前馈全连接层)+规范化层+残差连接==> 子层连接结构
- 实现:
- 和图解不同的地方: 代码是先经过规范化层然后在经过特定的子层, 这样的书写是因为构造出来的模型, 训练的效果比较好.
-
编码器层的构造
-
- 先去构造多头自注意力子层的子层连接结构
- 在去构造前馈全连接子层的子层连接结构
-
-
编码器部分:
- 作用: 提取输入的特征的过程
- 实现: 将编码器层进行循环迭代, 然后在输出的部分加一个规范化层, 为了是数据规范到一个合理的范围之内, 方便后续的数据处理过程.
-
解码器层:
- 作用: 向给定的目标语言进行特征解码的操作, 即解码过程
- 实现:
- 第一个层: 自注意力机制层(Q=K=V)/ 规范化层和残差连接
- target_mask主要是为了掩盖后面的信息, 为了防止未来信息被提前利用
- 第二个层: 注意力机制层(Q!=K=V)/规范化层和残差连接
- Source_mask:为了遮掩掉之前字符中没有用的注意力值;
- 第三个层: 前馈全连接层/规范化层和残差连接
- 第一个层: 自注意力机制层(Q=K=V)/ 规范化层和残差连接
-
解码器部分:
- 循环的时候有两点注意:
- x的循环是每次不一样的, 上一次的输出是模型下一次的输入, 所以x每次的输入过程是不一样的
- en_result(memery) : 表示的是编码器最后的输出, 作为解码器中间第二层的输入, 这个在循环的过程中, 每次输入是一致的.
- 循环的时候有两点注意:
-
输出部分:
-
结构: softmax层+linear层
-
模型的构建
-
实例化了对应的Embedding层和对应的位置编码器层
-
实例化对应的多头注意力层和前馈全连接层
-
实例化对应的编码器部分和解码器部分
-
实例化了输出部分的对象
-
将上面实例化的对象进行堆叠即可.
-
-
-