transformer 子层连接结构
子层连接结构
目标
- 了解什么是子层连接结构
- 掌握子层连接结构的实现过程
什么是子层连接结构?
输入到每个子层以及规范化层的过程中, 使用了残差连接(跳跃连接, 从Add&Norm -> Add&Norm), 因此我们把这一部分结构整体叫做子层连接(代表子层及其链接结构), 在每个编码器中, 都有两个子层, 这两个子层加上周围的链接结构就形成了两个子层连接结构
子层连接结构图
代码分析
import torch.nn as nnclass SubLayerConnection(nn.Module):"""A residual connection followed by a layer norm.Note for code simplicity the norm is first as opposed to last."""def __init__(self, size, dropout):"""它输入参数有两个, size及其dropout, size一半是词嵌入维度的大小,dropout本身是模型结构中的节点数进行随机抑制的比率又因为节点被抑制等效就是该节点的输出都是0, 因此也可以吧dropout看作是对输出矩阵的随机置0"""super(SubLayerConnection, self).__init__()# 实例化了规范化对象 normself.norm = nn.LayerNorm(size)# 示例话 dropout 对象self.dropout = nn.Dropout(dropout)def forward(self, x, sublayer):"""向前逻辑函数中, 接收上一层或者子层的输入维第一个参数将该子层连接中的子层函数作为第二个参数"""# 我们首先对输出进行规范化, 然后将结果传给子层处理, 之后再对子层进行dropout操作# 随机停止一些网络中神经元的作用, 防止过拟合, 最有还有add操作# 因为存在跳跃连接("x +" 实现残差连接), 所以是将输入x与dropout后的子层输出结果相加最终的子层连接输出return x + self.dropout(sublayer(self.norm(x)))