弄懂Transformer Layer 和Transformer Block的关系后,豁然开朗

一篇论文引发的讨论:
Q:Transformer Layer 和Transformer Block是什么意思?
A: Transformer Layer表示Transformer层,Transformer Block表示Transformer块。
Q:我不是来学英语的,Transformer Layer 和Transformer Block是什么,有什么区别,这张网络图里的哪个部分是Transformer Layer 和Transformer Block?
A: 每个Encoder Block就是一个Transformer block,4个Encoder block 组成一个Transformer Layer。(按照block和layer一样的说法,这里没毛病吧,一百个人一百个哈姆雷特?)
GLPDepth
Q:你确定吗?嗯?
A: 没问题啊。
Q:再给你一次机会,Transformer Layer 和Transformer Block是什么,有什么区别?
A: 静默-我搜一下。
Q:别搜了,你看群里我发的图,再解释一下,到底什么是Trans

### TransformerBlock 实现与应用 #### 3.1 TransformerBlock 结构概述 TransformerBlock 是构成 Transformer 模型的核心组件之一。每个 TransformerBlock 主要由两个子层组成:多头自注意力机制(Multi-head Self-Attention, MSA)前馈神经网络(Feed Forward Neural Network, FFNN)。这两个子层之间通过残差连接(Residual Connection)层归一化(Layer Normalization)来增强模型性能[^2]。 #### 3.2 多头自注意力机制 (MSA) 多头自注意力机制允许模型在同一序列的不同位置关注不同部分的信息,从而捕捉到更丰富的语义关系。具体来说,输入张量会被线性变换为查询矩阵 \(Q\)、键矩阵 \(K\) 值矩阵 \(V\)。接着计算这些矩阵之间的相似度得分并加权求得到最终输出: \[ \text{Attention}(Q,K,V)=\text{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}+M\right)V \] 其中 \(d_k\) 表示键向量的维度大小;\(M\) 则是一个可选的位置掩码用于处理变长序列的情况。为了进一步提升表达能力,在实际操作中通常会采用多个平行运行的单头注意力建模不同的表示空间——即所谓的“多头”。 ```python import torch.nn as nn class MultiHeadSelfAttention(nn.Module): def __init__(self, embed_dim, num_heads): super().__init__() self.embed_dim = embed_dim self.num_heads = num_heads # 定义 QKV 线性映射参数 self.qkv_proj = nn.Linear(embed_dim, 3 * embed_dim) # 初始化权重 nn.init.xavier_uniform_(self.qkv_proj.weight) def forward(self, x): batch_size, seq_len, _ = x.size() qkv = self.qkv_proj(x).reshape(batch_size, seq_len, self.num_heads, 3*self.embed_dim//self.num_heads) qkv = qkv.permute(0, 2, 1, 3) # [BatchSize, NumHeads, SeqLen, EmbedDim/NumHeads*3] q, k, v = qkv.chunk(3, dim=-1) # Split into Query, Key and Value tensors scores = torch.matmul(q, k.transpose(-2,-1)) / np.sqrt(k.size(-1)) attn_weights = F.softmax(scores,dim=-1) context = torch.matmul(attn_weights,v) output = context.reshape(batch_size,seq_len,self.embed_dim) return output ``` #### 3.3 前馈神经网络 (FFNN) 在完成自注意力运算之后,数据流经全连接层组成的简单MLP模块作为后续特征转换环节。该过程可以视为一种局部感知域内的非线性映射函数,有助于增加模型复杂度而不破坏全局依赖特性。一般情况下,此阶段包含两层线性投影以及中间激活单元ReLU: \[ \text {FFN }(\mathrm{x})=\max (\mathrm{W}_{2} \sigma\left(W_1x+b_1)+b_2,\quad W_i,b_i\in R^m,i=1,2 \right.\right)\] 这里选用GELU代替原始论文中的ReLU能够获得更好的收敛效果。 ```python class FeedForwardNetwork(nn.Module): def __init__(self, input_dim, hidden_dim, dropout_rate=0.1): super().__init__() self.fc1 = nn.Linear(input_dim,hidden_dim) self.dropout = nn.Dropout(dropout_rate) self.gelu = nn.GELU() self.fc2 = nn.Linear(hidden_dim,input_dim) def forward(self,x): out=self.fc2(self.dropout(self.gelu(self.fc1(x)))) return out ``` #### 3.4 组合形成完整的 Transformer Block 最后一步就是把上述构建好的各个部件按照一定顺序组装起来,并加入必要的正则项如DropOut防止过拟合现象发生。值得注意的是,在每一个子层后面都附加了一个Add & Norm操作用来稳定训练过程并加速梯度传播效率。 ```python class TransformerBlock(nn.Module): def __init__(self,embed_dim,num_heads,ff_hidden_mult=4,dropout_rate=0.1): super().__init__() d_ff=int(ff_hidden_mult*embed_dim) self.attn_layer_norm=nn.LayerNorm(embed_dim) self.ffn_layer_norm=nn.LayerNorm(embed_dim) self.self_attn=MultiHeadSelfAttention(embed_dim,num_heads) self.ffn=FeedForwardNetwork(embed_dim,d_ff,dropout_rate) self.dropout=nn.Dropout(dropout_rate) def forward(self,x,pad_mask=None): residual=x.clone() # 自注意力机制 + Add&Norm x=self.attn_layer_norm(residual+self.dropout( self.self_attn(x))) # 前馈神经网络 + Add&Norm residual=x.clone() x=self.ffn_layer_norm(residual+self.dropout( self.ffn(x))) return x ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MengYa_DreamZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值