【HuggingFace Transformers】BertSelfOutput 和 BertOutput源码解析

1. 介绍

BertSelfOutputBertOutputBERT 模型中两个相关但不同的模块。它们在功能上有许多共同点,但也有一些关键的不同点。以下通过共同点和不同点来介绍它们。

1.1 共同点

BertSelfOutputBertOutput 都包含残差连接、层归一化、Dropout 和线性变换,并且这些操作的顺序相似。

(1) 残差连接 (Residual Connection)

两个模块都应用了残差连接,即将模块的输入直接与经过线性变换后的输出相加。这种结构可以帮助缓解深层神经网络中的梯度消失问题,使信息更直接地传递,保持梯度流动顺畅。

(2) 层归一化 (Layer Normalization)

在应用残差连接后,两个模块都使用层归一化 (LayerNorm) 来规范化输出。这有助于加速训练,稳定网络性能,并减少内部分布变化的问题。

(3) Dropout

两个模块都包含一个 Dropout 层,用于随机屏蔽一部分神经元的输出,增强模型的泛化能力,防止过拟合。

(4) 线性变换 (Linear Transformation)

两个模块都包含一个线性变换 (dense 层)。这个线性变换用于调整数据的维度,并为后续的残差连接和层归一化做准备。

1.2 不同点

BertSelfOutput 专注于处理自注意力机制的输出,而 BertOutput 则处理前馈神经网络的输出。它们的输入特征维度也有所不同,线性变换的作用在两个模块中也略有差异。

(1) 处理的输入类型

  • BertSelfOutput:处理自注意力机制 (BertSelfAttention) 的输出。它关注的是如何将注意力机制生成的特征向量与原始输入结合起来。
  • BertOutput:处理的是前馈神经网络的输出。它将经过注意力机制处理后的特征进一步加工,并整合到当前层的最终输出中。

(2) 线性变换的作用

  • BertSelfOutput:线性变换的作用是对自注意力机制的输出进行进一步的变换和投影,使其适应后续的处理流程。
  • BertOutput:线性变换的作用是对前馈神经网络的输出进行变换,使其与前一层的输出相结合,并准备传递到下一层。

(3) 输入的特征大小

  • BertSelfOutput:输入和输出的特征维度保持一致,都是 BERT 模型的隐藏层大小 (hidden_size)。
  • BertOutput:输入的特征维度是中间层大小 (intermediate_size),输出则是 BERT 模型的隐藏层大小 (hidden_size)。这意味着 BertOutput 的线性变换需要将中间层的维度转换回隐藏层的维度。

2. 源码解析

源码地址:transformers/src/transformers/models/bert/modeling_bert.py

2.1 BertSelfOutput 源码解析

# -*- coding: utf-8 -*-
# @time: 2024/7/15 14:27

import torch
from torch import nn


class BertSelfOutput(nn.Module):

    def __init__(self, config):
        super().__init__()
        self.dense = nn.Linear(config.hidden_size, config.hidden_size)  # 定义线性变换层,将自注意力输出映射到 hidden_size 维度
        self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)  # 层归一化
        self.dropout = nn.Dropout(config.hidden_dropout_prob)  # Dropout层

    def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor:
        hidden_states = self.dense(hidden_states)  # 对自注意力机制的输出进行线性变换
        hidden_states = self.dropout(hidden_states)  # Dropout操作
        hidden_states = self.LayerNorm(hidden_states + input_tensor)  # 残差连接后进行层归一化
        return hidden_states

2.2 BertOutput 源码解析

# -*- coding: utf-8 -*-
# @time: 2024/8/22 15:41

import torch
from torch import nn


class BertOutput(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.dense = nn.Linear(config.intermediate_size, config.hidden_size)  # 定义线性变换层,将前馈神经网络输出从 intermediate_size 映射到 hidden_size
        self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)  # 层归一化
        self.dropout = nn.Dropout(config.hidden_dropout_prob)  # Dropout层

    def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor:
        hidden_states = self.dense(hidden_states)  # 对前馈神经网络的输出进行线性变换
        hidden_states = self.dropout(hidden_states)  # Dropout操作
        hidden_states = self.LayerNorm(hidden_states + input_tensor)  # 残差连接后进行层归一化
        return hidden_states
### HuggingFace Transformers 库的使用方法 HuggingFace 的 `transformers` 是一个强大的自然语言处理 (NLP) 工具包,支持多种预训练模型框架集成。以下是关于如何安装、配置以及使用该库的一些基本指导。 #### 安装 要开始使用 HuggingFace 的 `transformers` 库,可以通过 pip 进行安装: ```bash pip install transformers ``` 如果需要 GPU 支持,则建议同时安装 PyTorch 或 TensorFlow 的相应版本[^1]。 #### 配置 TrainingArguments 在训练过程中,`TrainingArguments` 类用于设置训练参数。例如,在 `/src/transformers/training_args.py` 文件中定义的一个变量 `framework="pt"` 表明当前使用的深度学习框架为 PyTorch。此变量的选择会影响后续模型加载与优化器初始化的方式[^1]。 下面是一个简单的例子展示如何创建 `TrainingArguments` 实例: ```python from transformers import TrainingArguments training_args = TrainingArguments( output_dir="./results", num_train_epochs=3, per_device_train_batch_size=8, save_steps=10_000, save_total_limit=2, logging_dir='./logs', ) ``` #### 加载预训练模型 通过 `AutoModelForSequenceClassification` 其他类似的类可以从官方存储库轻松加载预训练模型及其对应的分词器(Tokenizer)。以下是一段示例代码说明这一过程: ```python from transformers import AutoTokenizer, AutoModelForSequenceClassification model_name = "bert-base-cased" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2) ``` #### 数据集管理 除了提供丰富的模型外,HuggingFace 还维护了大量的公开可用的数据集集合。这些数据集可以直接从其 API 中访问并导入到项目当中[^2]。比如利用 `datasets` 模块来加载 GLUE benchmark 数据集之一 SST-2 如下所示: ```python from datasets import load_dataset dataset = load_dataset('glue', 'sst2') print(dataset['train'][0]) ``` 以上就是有关于 HuggingFace Transformers 库的基础介绍及部分功能演示。更多高级特性可查阅官方文档获得进一步帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CS_木成河

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

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

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

打赏作者

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

抵扣说明:

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

余额充值