003 FeedForward前馈层

本文详细解释了Transformer模型中前馈层的原理,包括其基本概念、结构(线性变换和激活函数)、作用,以及如何通过Pytorch实现一个带ReLU激活的两层全连接网络。着重强调了前馈层在模型性能提升中的重要性。
摘要由CSDN通过智能技术生成

一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • torch 1.13.1+cu117
  • torchvision 0.14.1+cu117

二、前馈层原理

Transformer模型中的前馈层(Feed Forward Layer)是其关键组件之一,对于模型的性能起着重要作用。下面将用900字对Transformer的前馈层进行详细讲解。前馈层在网络中位置,如下图:

2.1 前馈层的基本概念

前馈层,又称为全连接层(Fully Connected Layer)或密集层(Dense Layer),是神经网络中最基础的组件之一。在Transformer模型中,前馈层通常出现在每一个Transformer编码器(Encoder)和解码器(Decoder)中的每一个自注意力(Self-Attention)层之后。

2.2 前馈层的结构

  1. 线性变换:前馈层的输入首先经过一个线性变换,将输入映射到一个高维空间。这个线性变换通常由一个权重矩阵和一个偏置向量实现。
  2. 激活函数:经过线性变换后,输入会通过一个激活函数,增加模型的非线性表达能力。常用的激活函数包括ReLU、Sigmoid、Tanh等。
  3. 线性变换与输出:经过激活函数后,再进行一次线性变换,将高维空间的特征映射回原始空间,得到前馈层的输出。

2.3 前馈层的作用

  1. 特征提取:前馈层通过线性变换和激活函数,可以提取输入数据的复杂特征,有助于模型更好地理解数据。
  2. 增加模型复杂度:通过增加前馈层的隐藏单元数量,可以增加模型的复杂度,提高模型的表达能力。
  3. 缓解梯度消失问题:在深度神经网络中,梯度消失是一个常见的问题。前馈层中的激活函数可以缓解这个问题,使得模型能够更好地训练。

三、完整代码

前馈层接受自注意力子层的输出作为输入,并通过一个带有 Relu 激活函数的两层全连接网络对输入进行更加复杂的非线性变换。实验证明,这一非线性变换会对模型最终的性能产生十分重要的影响。

其中 W1, b1,W2, b2 表示前馈子层的参数。实验结果表明,增大前馈子层隐状态的维度有利于提
升最终翻译结果的质量,因此,前馈子层隐状态的维度一般比自注意力子层要大。使用 Pytorch 实现的前馈层参考代码如下:

import torch.nn as nn
import torch.nn.functional as F
import torch

class FeedForward(nn.Module):
    def __init__(self, d_model, d_ff=2048, dropout = 0.1):
        super().__init__()
        # d_ff 默认设置为 2048
        self.linear_1 = nn.Linear(d_model, d_ff)
        self.dropout = nn.Dropout(dropout)
        self.linear_2 = nn.Linear(d_ff, d_model)
    def forward(self, x):
        x = self.dropout(F.relu(self.linear_1(x)))
        x = self.linear_2(x)
        return x



batch_size = 32
seq_len = 64
d_model = 512
ff = FeedForward(d_model=d_model)
x = torch.randn(batch_size, seq_len, d_model) # 32 x 64 x 512
ff.eval()
print(ff(x).shape) # torch.Size([32, 64, 512])

Transformer前馈是指在Transformer模型中用于处理每个位置的全连接前馈神经网络。它是Transformer模型中的一个重要组成部分,用于对输入进行非线性变换和特征提取。 前馈由两个线性变换和一个激活函数组成。具体而言,它接收来自自注意力的输入,并将其通过一个线性变换映射到一个更高维度的空间,然后再通过另一个线性变换将其映射回原始维度。最后,通过一个激活函数(通常是ReLU)对结果进行非线性变换。 下面是一个示例代码,演示了如何在Transformer中实现前馈: ```python import torch import torch.nn as nn class FeedForward(nn.Module): def __init__(self, d_model, d_ff): super(FeedForward, self).__init__() self.linear1 = nn.Linear(d_model, d_ff) self.relu = nn.ReLU() self.linear2 = nn.Linear(d_ff, d_model) def forward(self, x): x = self.linear1(x) x = self.relu(x) x = self.linear2(x) return x # 示例使用 d_model = 512 # 输入维度 d_ff = 2048 # 前馈隐藏维度 x = torch.randn(10, d_model) # 输入数据 feed_forward = FeedForward(d_model, d_ff) output = feed_forward(x) print(output.shape) # 输出:torch.Size([10, 512]) ``` 在上面的示例中,我们定义了一个名为`FeedForward`的类,它继承自`nn.Module`。在类的构造函数中,我们定义了两个线性变换和一个ReLU激活函数。在`forward`方法中,我们按照前馈的顺序对输入进行处理,并返回结果。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黄家驹beyond

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

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

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

打赏作者

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

抵扣说明:

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

余额充值