对Transformer中FeedForward层的理解

对FeedForward的理解


上一篇我们介绍了 对Add&Norm层的理解,有不大熟悉的可以看一下上篇文章。

今天来说一下Transformer中FeedForward层,首先还是先来回顾一下Transformer的基本结构:首先我们还是先来回顾一下Transformer的结构:Transformer结构主要分为两大部分,一是Encoder层结构,另一个则是Decoder层结构,Encoder 的输入由 Input Embedding 和 Positional Embedding 求和输入Multi-Head-Attention,然后又做了一个ADD&Norm,再通过Feed Forward进行输出。
在这里插入图片描述
FeedForward的输入是什么呢?是Multi-Head Attention的输出做了残差连接和Norm之后得数据,然后FeedForward做了两次线性线性变换,为的是更加深入的提取特征。
在这里插入图片描述
可以看出在每次线性变换都引入了非线性激活函数Relu,在Multi-Head Attention中,主要是进行矩阵乘法,即都是线性变换,而线性变换的学习能力不如非线性变换的学习能力强,FeedForward的计算公式如下:max相当于Relu
在这里插入图片描述

所以FeedForward的作用是:通过线性变换,先将数据映射到高纬度的空间再映射到低纬度的空间,提取了更深层次的特征

  • 31
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 要将二维Transformer添加到模型,需要使用PyTorch等深度学习框架提供的二维卷积,例如nn.Conv2d。以下是一个简单的例子,展示如何在PyTorch实现一个基本的二维Transformer: ```python import torch.nn as nn class TwoDTransformer(nn.Module): def __init__(self, input_channels, output_channels, num_heads, hidden_dim, dropout): super(TwoDTransformer, self).__init__() self.conv_q = nn.Conv2d(input_channels, hidden_dim, kernel_size=1) self.conv_k = nn.Conv2d(input_channels, hidden_dim, kernel_size=1) self.conv_v = nn.Conv2d(input_channels, hidden_dim, kernel_size=1) self.conv_out = nn.Conv2d(hidden_dim, output_channels, kernel_size=1) self.num_heads = num_heads self.head_dim = hidden_dim // num_heads self.attention = nn.MultiheadAttention(hidden_dim, num_heads, dropout=dropout) self.norm1 = nn.LayerNorm(hidden_dim) self.norm2 = nn.LayerNorm(hidden_dim) self.dropout = nn.Dropout(dropout) def forward(self, x): q = self.conv_q(x) # query k = self.conv_k(x) # key v = self.conv_v(x) # value # reshape the tensors to have shape (batch_size*num_heads, head_dim, height, width) batch_size, _, height, width = q.size() q = q.view(batch_size*self.num_heads, self.head_dim, height, width) k = k.view(batch_size*self.num_heads, self.head_dim, height, width) v = v.view(batch_size*self.num_heads, self.head_dim, height, width) # calculate the attention attn_output, _ = self.attention(q, k, v) attn_output = attn_output.view(batch_size, self.num_heads*self.head_dim, height, width) # skip connection and layer normalization x = x + self.dropout(attn_output) x = self.norm1(x) # feedforward network x = self.conv_out(x) x = self.dropout(x) x = self.norm2(x) return x ``` 在这个例子,我们使用了nn.MultiheadAttention来实现注意力机制。我们首先将输入张量x通过三个卷积分别变换为query、key和value张量,然后将它们reshape成(batch_size*num_heads, head_dim, height, width)的形状,以便在注意力计算使用。然后,我们将query、key和value张量输入到nn.MultiheadAttention,并将处理后的输出reshape回(batch_size, num_heads*head_dim, height, width)的形状。接下来,我们将原始输入和注意力输出进行相加,并通过归一化和Feedforward网络来产生最终输出。 在实践,您可能需要根据您的具体任务和数据集来修改这个例子的参数和模型结构。 ### 回答2: 要加入二维Transformer,首先需要理解Transformer的工作原理。Transformer是一种基于自注意力机制的序列到序列模型,用于处理序列数据,如自然语言处理任务。 在加入二维Transformer之前,我们需要将输入数据由一维序列转换为二维矩阵形式。假设输入是一个二维图片,可以将图片的每个像素位置看作是一个位置编码。然后,将每个像素位置的特征向量作为输入的序列,以及其位置编码,构成Transformer的输入。 在构建二维Transformer时,需要考虑以下几个关键步骤: 1. 多头自注意力机制:将输入序列和位置编码输入到多个注意力头,利用自注意力机制计算每个位置的注意力得分。然后,将得到的注意力加权的特征向量进行合并。 2. 前馈神经网络:将特征向量经过一简单的前馈神经网络进行非线性变换。 3. 残差连接和归一化:为了避免梯度消失和加速训练过程,可以在每个的输入和输出之间添加残差连接,并进行归一化。 4. 正则化和损失函数:可以采用Dropout来随机丢弃一部分特征向量,以防止过拟合。同时,需要确定适当的损失函数,如交叉熵损失函数,来评估模型的性能。 最后,在训练过程,可以使用反向传播算法来更新模型参数,以最小化损失函数。可以使用优化器(如Adam)来自动调整学习率。 需要注意的是,二维Transformer通常与其他(如卷积)结合使用,以捕捉图像的局部和全局特征。因此,在构建模型架构时,需要根据具体任务和数据的特点来设计。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值