从代码层面理解Transformer

news2024/11/26 12:43:07

跑通

代码使用的是 https://github.com/jadore801120/attention-is-all-you-need-pytorch,

commit-id 为: 132907d

各模块粗览

Transformer

主要包括一堆参数,
以及encoder和decoder

在这里插入图片描述

forward的时候主要做了如下操作.

  1. 先 pad_mask
  2. 过encoder
  3. 过decoder
  4. 输出logit

在这里插入图片描述

从train.py 我们可以看出, 模型的输出直接去做了loss

在这里插入图片描述
这里的Loss就是cross_entropy.

然后每个encoder其实是一堆EncoderLayer的,每个decoder其实也是一堆DecoderLayer的, 所以先大致看一下.

Encoder

在这里插入图片描述
整体流程如下

  1. 输入 原始的src_seq, 得到word embeding, 叫做 enc_output
  2. 做position_encoder, 即位置编码.
  3. 做LayerNorm
  4. 过各个堆叠的encoder-layer, 每一个encoder-layer的输入都是上一层的输出.
  5. 返回最后一个encoder-layer的输出

什么是PositionEncoding

这个模块其实没有可以学习的参数. 这里的这个buffer的用法可以学习一下.
在这里插入图片描述
在这里插入图片描述
这里的这个实现还是挺简洁的. 一行就解决了.
在这里插入图片描述

Decocer

Decoder的结构和encoder的结构几乎一样,
在这里插入图片描述

但是要注意的是, Decnoder的输入.
在这里插入图片描述
在这里插入图片描述
也就是说, Decoder中的positionEncoding是对groundtruth做的.

这里我有一个疑问, 推理的时候, 没有trg_seq 的时候具体是怎么做的呢?

推理时细节

在这里插入图片描述
在这里插入图片描述

  1. 输入一个句子, 会先用encoder得到encoder_output.
  2. 同时会有 init_seq 传进decoder里面
    这里的init_seq 是

在这里插入图片描述

在这里插入图片描述
而 trg_box_idx 是一个常数. 即
在这里插入图片描述

  1. 然后从第2个词开始, 循环作为decoder模块的输入传进去.

在这里插入图片描述

各模块细节

EncoderLayer


如图每个EncoderLayer包括了, self-attention, 以及 positionFFN.

这里的self-attention是MultiHeadAttention.

MultiHeadAttention

看MultiHeadAttention的操作的话,主要是经历了以下主要的几个操作

在这里插入图片描述
把这个图画成下面这个样子来理解:

在这里插入图片描述

Attention

这里的Attention其实就是这个公式

在这里插入图片描述
代码里面叫做 ScaledDotProductionAttention

在这里插入图片描述

这里的temperature 是MultiHeadAttention的一个参数,
在这里插入图片描述

这里面需要注意的是, n_head这个参数,
在看知乎(https://zhuanlan.zhihu.com/p/48508221)上面的讲解时, 是这样的流程图
在这里插入图片描述
我理解其实是一样的, 一个是流程图解释,而一个是具体的实现方式.

PositionwiseFeedForward

在这里插入图片描述
也就是经过了两个全连接层, 然后过一个droupout, 过残差, 然后再过layer_norm

至此,整个encoder 其实就是两个模块, 一个是self-attention, 一个是FFN.
在这里插入图片描述
然后这里的self-attention,其实是Multi-Head-Attention.

DecoderLayer

decoder layer的模块其实和encoder的模块差不多,但是多了一个MultiHeadAttention, 这个叫encoder-decoder-attention.

在这里插入图片描述

forward的时候, 会把dec_input 分三份输入 self_attion模块中,

在这里插入图片描述

然后 encoder的output和上面的dec_output 作为encoder-decoder-attention的输入

在这里插入图片描述
最终返回 三个东西. 分别是

dec_output, dec_slf_attn, dec_enc_attn.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言-【指针一】-【什么是指针/指针类型】

对于初学者来说,是不是一提到指针,大家就头疼啊,哈哈哈,当然,它都这么“吓人”了,那么在C语言中扮演的角色也很重要,当然,它也是C语言中的一个特色,如果我们把它拿下的话…

ESP32CAM,点亮一个LED(Arduino平台)

前言 (1)在此,吐槽一下乐鑫的函数介绍,真的难找。恶心的一批。气死我了。 (2)接下来我将会介绍我是如何找到ESP32的Arduino平台的函数库的。你将会知道为啥我这么大的戾气。 (3)同时…

linux系统中输入与输出重定向

什么是输入输出重定向 我们在日常工作中最常用的是输出重定向,输出重定向就是将原本要打印到屏幕中的信息重定向到一个文件中。而输入重定向呢就是指把文件导入到命令中去,听起来是不是有点抽象啊,后面看博主举例说明就很好理由啦。 输出重定…

通讯录信息管理系统

系列文章 任务50 通讯录信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试插入按编号查找按姓名查找按城市查找更新排序浏览删除统计…

超好玩C++控制台打飞机小游戏,附源码

我终于决定还是把这个放出来。 视频在这:https://v.youku.com/v_show/id_XNDQxMTQwNDA3Mg.html 具体信息主界面上都有写。 按空格暂停,建议暂停后再升级属性。 记录最高分的文件进行了加密。 有boss(上面视频2分47秒)。 挺好…

轻松转换CAJ文件为PDF格式:免费工具和技巧

在处理中国知网(CNKI)数据库中的CAJ文件时,将其转换为更常用的PDF格式可以提供更广泛的共享和便捷的阅读体验。本文将介绍一种免费的工具和一些技巧,帮助您轻松地将CAJ文件转换为PDF格式。我们将使用记灵在线工具进行操作。 记灵…

推荐几本提高程序员职业素养的书

如果你是一名程序员,想要提长自己,那么这几本书推荐给你。 1、好代码 ,坏代码 为了写出优良的代码,我们必须对手上的方案有合理的判断,并彻底想清楚特定方法的结果(好的和坏的)。为此&#xff…

F检验.医学统计实例详解

F检验是一种重要的医学统计方法,常用于检验两个或多个样本的方差是否相等,也被称为方差齐性检验。方差齐性检验是医学研究中的基本方法,因为许多重要的统计分析都要求样本方差相等,如方差分析、t检验等。以下将介绍F检验的基本原理…

简单上手Scrapy框架

创建一个Scrapy框架的爬虫程序 安装Scrapy库,直接通过pycharm搜索Scrapy进行安装即可 在终端执行 scrapy startproject 项目名 scrapy startproject Learn 示例 即可创建名为Learn的Scrapy程序,成功创建项目后,会已项目名称创建一个文件夹&…

FTP和SSH连接远程终端Ubuntu

安装好ubuntu后是默认没有ssh服务和ftp服务的,我们需要自己解决一下这个问题 SSH 更新软件列表和软件 sudo apt-get update sudo apt-get upgrade安装ssh sudo apt-get install ssh启动ssh服务 sudo /etc/init.d/ssh start修改ssh服务配置文件 sudo vim /etc/…

前端工程化:发布一个属于自己的规范 npm 包

初始化项目 首先在github创建一个仓库,协议选择MIT,gitignore选择Node,添加README.md描述文件。使用git clone将项目克隆到本地。cd 进入目录,使用vscode打开(终端输入code . 命令即可)。 然后创建一个合理…

CentOS-7 安装 MariaDB-10.8

一、安装之前删除已存在的 Mysql/MariaDB 1 查找存在的 MariaDB # 注意大小写 rpm -qa | grep MariaDB # rpm -qa 列出所有被安装的rpm package (-qa:query all) rpm -qa | grep mariadb # grep (缩写来自Globally search a Regular Expre…

C++ 折叠参数包:悄然增强编程效率

前言 欢迎来到💖小K💖的💞C专栏💞,本节将为大家带来折叠参数包的详细讲解,折叠参数包为C模板编程提供了更加灵活和强大的工具,可以提高代码的简洁性和可读性,看完后希望对你有收获 文…

室内外融合定位UWB信标定位方案

大家好,我是北京华星智控公司小智,今天我给大家介绍室内外融合定位系统方案,该方案室外采用北斗卫星定位技术室内采用UWB定位技术从而实现室内外精确定位无缝切换,实现室内外的融合定位。 室内外融合定位系统, 该方案…

Binder相关问题

Binder相关问题 1、Binder是什么?2、Binder有什么优势?3、Binder如何做到一次拷贝的?4、MMAP的原理是什么?5、Binder机制是如何跨进程的?6、为什么Intent不能传递大数据7、AIDL生成Java类细节8、四大组件底层的通信机制…

波奇学Linux:yum和vim

Linux三种安装方式 源代码安装 用户下载->软件源码->源码编译->可执行程序 rpm安装:相当于去官网下载Linux安装包 可能存在依赖项不匹配问题。 yum安装包 用户yum下载->软件安装包->可执行程序 yum是软件包管理器,解决安装源&…

玩客云刷Armbian带docker详细教程(附所有软件)

文章目录 介绍一.准备工作1.硬件准备2.软件准备 二.开始折腾1.烧录系统固件2.刷入系统1.准备镜像2.刷入镜像3.刷入镜像到系统 三.功能介绍1.网页终端2.设备状态3.AriaNg4.qBittorrent5.微力同步6.filebrowser7.Portainer 四.拓展1.添加Alist1.介绍2.安装3.配置3.1查看密码3.2修…

chatgpt赋能Python-pythoncidere

PythonCider:提供最优质的 Python 编程知识 Python 是目前最受欢迎的编程语言之一,特别在数据科学和人工智能方面应用广泛。如果你是一名 Python 开发者或者正在学习 Python 编程,PythonCider 是一个你绝对不能错过的网站。 什么是 PythonC…

JavaScript实战训练小项目 WebAPI

JavaScript实战训练小项目 文章目录 JavaScript实战训练小项目 & WebAPI1. JS操作DOM树1.1 获得HTML控件/元素标签1.2 操纵控件1.2.1 获取属性值1.2.1 修改属性值 1.3 实现一个猜数字的功能 2. JQuery3. 简单计算器4. 聚合搜索5. 表白墙 JavaScript实战训练小项目 & We…

OpenLayers入门教程汇总目录

前言 本篇作为OpenLayers入门教程的目录,用于整理汇总专栏所有文章,方便查找。 入门 Gis开发入门,OpenLayers、Leaflet、Maplibre-gl和Cesiumjs地图引擎介绍以及几种地图服务vms、vmts介绍vue项目集成并使用OpenLayers地图的两种方式 加…