Transformer(4)

本文详细介绍了Transformer模型中子层连接结构的原理与实现,包括残差链接和规范化层的作用。每个编码器层由两个子层连接结构组成,分别是多头自注意力子层和前馈全连接子层。通过这些结构,模型能够有效地进行特征提取和信息传递。此外,还展示了编码器层和整个编码器的实现方式,它们是Transformer模型的核心组成部分。
摘要由CSDN通过智能技术生成

1.什么是子层连接结构:
如图所示,输入到每个子层以及规范化层的过程中,还使用了残差链接(跳跃连接),因此我们把这一部分结构整体叫做子层连接(代表子层及其链接结构),在每个编码器层中,都有两个子层,这两个子层加上周围的链接结构就形成了两个子层连接结构.

class SublayerConnection(nn.Module):
    def __init__(self,size,dropout=0.1):
     #size一般是都是词嵌入维度的大小,dropout本身是对模型结构中的节点数进行随机抑制的比率,

        super(SublayerConnection,self).__init__()
        #实例化规范化函数
        self.norm = LayerNorm(size)
        self.dropout = nn.Dropout(p=dropout)
    
    def forward(self, x, sublayer):
        #我们首先对输出进行规范化,然后将结果传给子层处理,之后再对子层进行dropout操作,
        #随机停止一些网络中神经元的作用,来防止过拟合.最后还有一个add操作,
        #因为存在跳跃连接,所以是将输入x与dropout后的子层输战结果相加作为最终的子层连接输出.

        return x + self.dropout(sublayer(self.norm(x)))
        
    
size=512
dropout=0.2
head=8
d_model=512
x=pe_result
mask = Variable(torch.zeros(2,4,4))
#假设子层中装的是多头注意力层,实例化这个类
self_attn=MultiHeadAttention(head,d_model)
#使用lambda获得一个函数类型的子层
sublayer = lambda x :self_attn(x,x,x,mask)
sc = SublayerConnection(size,dropout)
sc_result = sc(x,sublayer)
print(sc_result)
print(sc_result.shape)

2.编码器层的作用:
·作为编码器的组成单元,每个编码器层完成一次对输入的特征提取过程,即编码过程.


 

class Encoderlayer(nn.Module):
    def __init__(self, size, self_attn, feed_forward, dropout):
        super(Encoderlayer,self).__init__()
        self.self_attn = self_attn
        self.feed_forward = feed_forward
        
        #编码器层中有两个子层连接结构,所以使用clones函数进行克隆
        self.sublayer = clones(SublayerConnection(size, dropout),2)
        self.size=size
        
    def forward(self,x,mask):
        #里面就是按照结构图左侧的流程.首先通过第一个子层连接结构,其中包含多头自注意力子层,
        #然后通过第二个子层连接结构,其中包含前馈全连接子层.最后返回结果.
        x = self.sublayer[0](x,lambda x: self.self_attn(x,x,x,mask))
        return self.sublayer[1](x,self.feed_forward)
        
size = d_model = 512
head = 8
d_ff = 64
x=pe_result
dropout=0.2
self_attn=MultiHeadAttention(head, d_model)
ff = PositionwiseFeedForward(d_model, d_ff, dropout)
mask = Variable(torch.zeros(2,4,4))
el = Encoderlayer(size, self_attn, ff, dropout)
el_result = el(x,mask)
print(sc_result)
print(sc_result.shape)

 

 3.编码器的实现

class Encoder(nn.Module):
    def __init__(self, layer, N):   #参数分别代表编码器层和编码器层的个数"
        super(Encoder,self).__init__()
        self.layers = clones(layer,N)      #首先使用clones函数克隆N个编码器层放在self.layers中
        
        #再初始化一个规范化层,它将用在编码器的最后面
        self.norm = LayerNorm(layer.size)
        
    def forward(self,x,mask):
        for layer in self.layers:
            x = layer(x,mask)
        return self.norm(x)

 

size = d_model = 512
head = 8
d_ff = 64
c=copy.deepcopy
attn = MultiHeadAttention(head, d_model)
ff = PositionwiseFeedForward(d_model, d_ff, dropout)
dropout=0.2
layer=Encoderlayer(size, c(attn), c(ff), dropout)
N=8
mask = Variable(torch.zeros(2,4,4))
x=pe_result
en = Encoder(layer, N)
en_result = en(x, mask)
print(en_result.shape)

>>>torch.Size([2,4,512])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值