【HuggingFace Transformers】BertSelfOutput 和 BertOutput源码解析

本文主要是介绍【HuggingFace Transformers】BertSelfOutput 和 BertOutput源码解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BertSelfOutput 和 BertOutput源码解析

  • 1. 介绍
    • 1.1 共同点
      • (1) 残差连接 (Residual Connection)
      • (2) 层归一化 (Layer Normalization)
      • (3) Dropout
      • (4) 线性变换 (Linear Transformation)
    • 1.2 不同点
      • (1) 处理的输入类型
      • (2) 线性变换的作用
      • (3) 输入的特征大小
  • 2. 源码解析
    • 2.1 BertSelfOutput 源码解析
    • 2.2 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:27import torch
from torch import nnclass 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:41import torch
from torch import nnclass BertOutput(nn.Module):def __init__(self, config):super().__init__()self.dense = nn.Linear(config.intermediate_size, config.hidden_size)  # 定义线性变换层,将前馈神经网络输出从 intermediate_size 映射到 hidden_sizeself.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】BertSelfOutput 和 BertOutput源码解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111922

相关文章

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提