子层连接结构
目标
- 了解什么是子层连接结构
- 掌握子层连接结构的实现过程
什么是子层连接结构?
输入到每个子层以及规范化层的过程中, 使用了残差连接(跳跃连接, 从Add&Norm -> Add&Norm), 因此我们把这一部分结构整体叫做子层连接(代表子层及其链接结构), 在每个编码器中, 都有两个子层, 这两个子层加上周围的链接结构就形成了两个子层连接结构
子层连接结构图
代码分析
import torch.nn as nn
class 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__()
# 实例化了规范化对象 norm
self.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)))