【AI-NLP】Transformer浅记

news2024/7/6 18:56:10

文章目录

  • 提出背景
  • 总体结构
    • Encoder
    • Decoder
  • 细节再探
  • 源码阅读
    • 主函数部分
    • 主模型定义
  • 参考资料

提出背景

改进了RNN的训练慢的缺点,利用self-attention机制实现并行计算。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。同时使用注意力机制更容易关注序列的全局特征,解决了RNN不善处理长距离依赖的问题
本质上是一个seq2seq的模型,因此可用于机器翻译,语音辨识,语音合成等问题

总体结构

整体结构由编码器与解码器组成,一个编码器中可有若干个编码层

注意,Encoder中的参数各不相同

Encoder

编码器的作用在于,输入一个向量,输出一个等长的向量

要点:

  1. 使用多头注意力机制,关注全局输入向量的资讯
  2. 使用了残差及layer normalization,避免出现梯度消失问题
  3. 使用前向神经网络,每个位置的单词对应的前馈神经网络都完全一样

Self Attention

query,key,value全由输入向量自身计算得到的一种注意力机制。每一个输入向量分别对应了查询、键、值权重矩阵,用于生成查询、键、值向量,权重矩阵为训练参数

Decoder

输入有两部分

  • 编码器最后一层的输出作为key和value
  • 同时解码器自己的输入经过多头自注意力的计算作为query

输出为对应的结果序列

结构与编码器类似,唯一的不同在于Masked Multi-Head Attention使用了掩码机制,不再关注全局的资讯,而是只考虑了当前位置以及当前位置之前的信息,存在时序性

细节再探

  1. Teacher forcing:将真实标签作为decoder的输入,依次预测结果,相当于把正确答案给解码器

  2. 掩码作用:考虑到Teacher forcing已经将正确答案输入到模型,因此在每次预测一个token时,需要将其及其之后的token先掩盖,保证训练任务和预测任务在执行自回归时,是同样的形式

  1. dk是query和key向量的维度
    在计算注意力权重时除以dk,避免了随着dk的增大,即维度增大时,计算出的权重出现过大(softmax后的值非0即1)的情况,从而保留了数据原始的分布,可以使得梯度回传时更加平稳
  1. 使用layer normalize而非batch normalize:ln是针对一个样本内部做归一化;bn针对的是各个样本的特征做归一化,在文本长度变化较大时,这种归一化方式会造成均值方差抖动明显
  1. 多头self attention意在让根据词向量得出的query, key, value向量,进入不同的线性层,分别进行自注意力计算,捕捉全局信息,再将所有结果concat,最后再进入一个线性层得到结果
  1. 在decoder中计算自注意力时,query来自带有掩码的自注意力计算得出,而key和value来自encoder最后的输出,目的是让Decoder端的单词(token)给予Encoder端对应的单词(token)“更多的关注(attention weight)”
  1. 自注意力是基于全局信息进行计算,而忽略了时序信息,位置编码PE解决了这一问题。PE的长度与embedding相同,使二者可以直接相加。
    计算方式是根据token的文本中的位置,PE向量中偶数位使用sin计算,奇数位使用cos计算。由于三角函数公式不受序列长度的限制,也就是可以对比所遇到序列的更长的序列进行表示

源码阅读

主函数部分

确定了模型的输入部分,由两部分组成encoder的输入,decoder的输入
将token转换成id后以tensor形式传入模型

P代表填充码,S代表起始,E代表结束。对文本进行了id映射
模型参数初始化,选用交叉熵损失函数,Adam自适应学习率优化器

主模型定义

class Transformer(nn.Module):
    def __init__(self):
        super(Transformer, self).__init__()
        self.encoder = Encoder()
        self.decoder = Decoder()
        self.projection = nn.Linear(d_model, tgt_vocab_size, bias=False)

    def forward(self, enc_inputs, dec_inputs):
        enc_outputs, enc_self_attns = self.encoder(enc_inputs)
        dec_outputs, dec_self_attns, dec_enc_attns = self.decoder(dec_inputs, enc_inputs, enc_outputs)
        dec_logits = self.projection(dec_outputs) # dec_logits : [batch_size x src_vocab_size x tgt_vocab_size]
        return dec_logits.view(-1, dec_logits.size(-1)), enc_self_attns, dec_self_attns, dec_enc_attns

由编码器,解码器及全连接层组成
编码器输入1*5的张量,输出为1*5*512的张量(批量大小为1,文本长度为5,embedding向量维度为512),及注意力权重参数6*8*5*5
(6代表编码器中编码层的数量;8代表8头注意力,计算了8次,有8个子空间;5*5代表文本内部的相关性计算的结果)
解码器输入为编码器的输出及解码层输入文本
输出为注意力计算得出的结果(1*5*512),及解码器掩码自注意力权重参数及交互注意力权重参数
将解码器的输出作为全连接层的输入,通过全连接层将512维向量压缩成7维,对应翻译文本的长度(5*7)

参考资料

  1. 李沐Transformer论文逐段精读【论文精读】
  2. 李宏毅Transformer
  3. Transformer从零详细解读(可能是你见过最通俗易懂的讲解)

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

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

相关文章

2022 IoTDB Summit:中冶赛迪工业互联网平台与CISDigital-TimeS(基于IoTDB)在钢铁行业的实践...

12 月 3 日、4日,2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本,并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例,深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

即时通讯开发之详解TCP/IP中的DNS 域名系统

前面已经提到了访问一台机器要靠 IP 地址和 MAC 地址,其中,MAC 地址可以通过 ARP 协议得到,所以这对用户是透明的,但是 IP 地址就不行,无论如何用户都需要用一个指定的 IP 来访问一台计算机,而 IP 地址又非常不好记,于是就出现了 DNS 系统。DNS 系统介绍DNS 的全称是 Domain Na…

MYSQL作业

MySQL 作业一、填空题 1、交叉连接查询返回的结果是被连接的两张数据表中所有数据行的_笛卡尔积___ 。2、左连接查询的结果包括 LEFT JOIN 子句中左表的_所有记录___,以及右表中满足连接条件的记录。3、内连接查询的语法中,ON 用于指定查询的__匹配条件_…

从0开始学python -16

Python3 列表-1 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。 Python 有 6 个序列的内置类型,但最常见的是列表和元组。 列表都可以…

六西格玛,为质量人的职业发展保驾护航

常常会有做质量的人来问优思学院:在质量界混,应学什么好? 大部分时候,我都会提议他們:有空就要学六西格玛吧! 他会回应:六西格玛感觉太难懂了,学了也没什么用啊,哪有那…

tensorflow框架之会话、张量、变量OP

2.3 会话、张量、变量OP 学习目标 目标 应用sess.run或者eval运行图程序并获取张量值应用feed_dict机制实现运行时填充数据应用placeholder实现创建占位符知道常见的TensorFlow创建张量知道常见的张量数学运算操作说明numpy的数组和张量相同性说明张量的两种形状改变特点应用…

前言技术之OAuth2.0

1、什么是OAuth2.0 OAuth2.0是目前使用非常广泛的授权机制,用于授权第三方应用获取用户的数据。 举例说明: 用户可以通过选择其他登录方式来使用gitee,这里就使用到了第三方认证。 OAuth 引入了一个授权层,用来分离两种不同的角…

记录--手把手教学,实现一个优雅的图片预览

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在我们开发项目中,经常会遇到预览图片的需求。也就是点击图片,会全屏显示该图片。需求很简单,但是如何让实现更优雅就需要花点心思了。 最终效果图 基础版本 实现方…

从 Issue 看 El-Table 源码,给 Element+ 提 Pr 的背后竟如此坎坷

Element Plus大家应该都不陌生,用过 el-table 的伙伴更是多数,毕竟搞ToB业务 table 必不可少,但是真正翻看过源码的应该还是少数,有没有对其内部实现怀揣着一点点好奇呢?笔者就是因为怀揣着好奇,所以才走上…

什么是Intel Elkhart Lake?专用于物联网的处理器系列

随着世界向工业4.0过渡,边缘计算应用程序对实时推理、连接和数据遥测的更高性能和更低功耗处理的需求激增,并加强了加固。物联网和边缘计算的爆炸性增长造成了上一代处理器无法维持的性能瓶颈和限制。英特尔最新推出的Atom x6000 E系列、奔腾和赛扬N&…

IDEA无法使用Git Pull的问题

一、问题描述 我们开发项目时,经常会和第三方接口打交道,有些第三方项目为了安全起见,会把项目部署在"内网"环境,不对外暴露,通常会提供VPN代理才能访问到资源。 而在项目中我就因为这个而遇到了一个问题&am…

RK3568平台开发系列讲解(Linux系统篇)什么是Linux文件

🚀返回专栏总目录 文章目录 一、文件描述符二、常用文件 I/O 操作和函数2.1、open2.2、close2.3、read2.4、write沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 把大部分系统资源当作文件呈现给用户,用户只需按照文件 I/O 的方式,就能完成数据的输入输出。…

Diffusion 扩散模型(DDPM)详解及torch复现

文章目录torch复现第1步:正向过程噪声调度器Step 2: 反向传播 U-NetStep 3: 损失函数采样Training我公众号文章目录综述:https://wangguisen.blog.csdn.net/article/details/127065903 保姆级讲解 Diffusion 扩散模型(DDPM) ht…

python面向对象:入门

python面向对象:入门 文章目录python面向对象:入门一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.创建类和对象2.构造方法3.类中的实例方法一、实验目的 掌握类的基本使用 二、实验原理 面向过程:根据业务逻辑从上到下写…

Win10 BCD文件损坏怎么修复?

在Windows 10操作系统中,BCD代表引导配置数据(Boot Configuration Data),Windows运行时BCD将告诉Windows引导加载程序在哪里查找引导信息, 因此,它对成功地加载和运行操作系统是非常重要的。哪些情况下会导…

二叉树的前序遍历

题目144. 二叉树的前序遍历 - 力扣(LeetCode)本章我们来探讨运用二叉树中所学的知识解决本题。对二叉树仍有疑问的小伙伴可以点击下方链接哦。参考文献:(1条消息) 二叉树(三)_染柒_GRQ的博客-CSDN博客原理首先我们来回…

CyberBattleSim-(内网自动化渗透)研究分析

**01 **背景知识介绍 CyberBattleSim介绍 CyberBattleSim是一款微软365 Defender团队开源的人工智能攻防对抗模拟工具,来源于微软的一个实验性研究项目。该项目专注于对网络攻击入侵后横向移动阶段进行威胁建模,用于研究在模拟抽象企业网络环境中运行的…

基于蜣螂算法优化的核极限学习机(KELM)分类算法-附代码

基于蜣螂算法优化的核极限学习机(KELM)分类算法 文章目录基于蜣螂算法优化的核极限学习机(KELM)分类算法1.KELM理论基础2.分类问题3.基于蜣螂算法优化的KELM4.测试结果5.Matlab代码摘要:本文利用蜣螂算法对核极限学习机(KELM)进行优化,并用于分类1.KELM理…

R语言贝叶斯方法在生态环境领域中的应用

贝叶斯统计已经被广泛应用到物理学、生态学、心理学、计算机、哲学等各个学术领域,其火爆程度已经跨越了学术圈,如促使其自成统计江湖一派的贝叶斯定理在热播美剧《The Big Bang Theory》中都要秀一把。贝叶斯统计学即贝叶斯学派是一门基本思想与传统基于…

STM32CubeMx使用FreeRTOS搭建printf输出串口打印-----基于正点原子开发板阿波罗

文章目录STM32CubeMx使用FreeRTOS搭建printf输出串口打印-----基于正点原子开发板阿波罗1.输入目标芯片2.选择RCC时钟3.配置调试模式4.USART的配置5.配置中断6.printf的重定向功能7.代码添加8.修改中断函数9.添加全局变量10.增加FreeRTOS支持11.在FreeRTOS中添加源码STM32CubeM…