深度学习代码|feed_forward前馈层的代码实现

本文详细介绍了Transformer模型中的Encoder和Decoder层结构,特别是FeedForward模块,包括其内部的全连接层、ReLU激活、Dropout以及门控机制的实现。通过李沐的《动手学习深度学习》中的实例,阐述了如何在实践中构建和理解这一关键组件。
摘要由CSDN通过智能技术生成

系列文章目录

李沐《动手学深度学习》注意力机制



理论基础

  • Transformer结构主要分为两大部分,一是Encoder层结构,另一个则是Decoder层结构,Encoder 的输入由 Input Embedding 和 Positional Embedding 求和输入Multi-Head-Attention,然后经一个ADD&Norm,再通过Feed Forward进行输出。
  • FeedForward 是一个神经网络模块,由全连接层FC与激活ReLu组成,通常用于处理序列数据或者在深度学习模型的前馈过程中。
  • 前馈全连接层是在Transformer中前馈全连接层就是具有两层线性层的全连接网络。前馈全连接层的作用:考虑注意力机制可能对复杂过程的拟合程度不够,通过增加两层网络来增强模型的能力。

李沐《动手学习深度学习》中对于FeedForward的实现:
在这里插入图片描述
* __init__ 方法: 初始化函数,定义了神经网络的结构。它接受以下参数:
* ffn_num_input:输入特征的维度大小。
* ffn_num_hiddens:隐藏层的维度大小。
* ffn_num_outputs:输出特征的维度大小。
* forward 方法: 前向传播函数,定义了数据在神经网络中的流动。它接受输入 X,并经过线性变换ReLU 激活函数另一个线性变换后返回结果。

一、导入相关库

import torch
from torch import nn as nn

from labml_helpers.module import Module

二、实现FeedForward模块

  • __init__ 方法: 初始化函数,定义了神经网络的结构。它接受以下参数:
    • d_model: token 嵌入中的特征数量
    • d_ff:隐藏层的特征维度大小。
    • dropout:隐藏层的 dropout 概率。
    • activation:激活函数,默认为 ReLU。
    • is_gated:是否使用门控机制,默认为 False。
    • bias1:是否为第一个全连接层使用可学习的偏置。
    • bias2:是否为第二个全连接层使用可学习的偏置。
    • bias_gate:是否为门控线性层使用可学习的偏置。
  • forward 方法: 前向传播函数,定义了数据在神经网络中的流动。
    • 将输入 x 通过第一个全连接层,并应用激活函数 f f f
    • 如果使用门控机制,则将激活后的结果与输入相乘,得到门控后的结果。
    • 对结果应用 dropout。
    • 将结果通过第二个全连接层,并返回输出。
class FeedForward(Module):
    """
    ## FFN module
    """

    def __init__(self, d_model: int, d_ff: int,
                 dropout: float = 0.1,
                 activation=nn.ReLU(),
                 is_gated: bool = False,
                 bias1: bool = True,
                 bias2: bool = True,
                 bias_gate: bool = True):
        super().__init__()
        self.layer1 = nn.Linear(d_model, d_ff, bias=bias1)
        self.layer2 = nn.Linear(d_ff, d_model, bias=bias2)
        self.dropout = nn.Dropout(dropout)
        self.activation = activation
        self.is_gated = is_gated
        if is_gated:
            self.linear_v = nn.Linear(d_model, d_ff, bias=bias_gate)

    def forward(self, x: torch.Tensor):
        g = self.activation(self.layer1(x))
        if self.is_gated:
            x = g * self.linear_v(x)
        else:
            x = g
        x = self.dropout(x)
        return self.layer2(x)

参考:
对Transformer中FeedForward层的理解
https://github.com/labmlai/annotated_deep_learning_paper_implementations/blob/master/labml_nn/transformers/feed_forward.py
Transformer前馈全连接层和规范化层(3)

  • 33
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值