transformer 总结(超详细-初版)

相关知识链接

  • attention1
  • attention2

引言

  • 本文主要详解 transformer 的算法结构以及理论解释,代码实现以及具体实现时候的细节放在下一篇来详述。
  • 下面就通过上图中 transformer 的结构来依次解析

输入部分(Encode 侧)

  • input 输出主要包含 两个部分:embedding 的输入数据, 数据位置的 embedding
    • 关于输入数据的 embedding 有很多种方式,比如word2vec,GloVe,FastText 等(注意embedding 和热编码,向量化不一回事)
    • 关于位置的 embedding,因为 transformer使用的全局信息而不是单纯的利用单词的之间的顺序信息,所以位置信息十分重要,transformer 使用位置 embedding 来保存单词在序列中的相对或者绝对位置
      • 位置 embedding 用 PE 表示,PE 可以通过训练得到(比如 bert 的位置信息),也可以使用自定义公式得到,transformer 使用的是公式
        P E ( p o s , 2 i ) = S i n ( p o s / 10000 0 ( 2 i / d ) ) PE_(pos, 2i) = Sin(pos/100000^(2i/d)) PE(pos,2i)=Sin(pos/100000(2i/d))
        P E ( p o s , 2 i + 1 ) = C o s ( p o s / 10000 0 ( 2 i / d ) ) PE_(pos, 2i+1) = Cos(pos/100000^(2i/d)) PE(pos,2i+1)=Cos(pos/100000(2i/d))
      • pos 表示 0 - N; i 表示 嵌入维度比如是 512 维,i 就表示 0 - 511
      • 看上图,首先位置和词的 embedding维度要一致因为后面要相加;其次就是 N表示位置的个数,上述公式将向量的维度划分为奇数行和偶数行,偶数使用 sin 函数编码,奇数采用 cos 函数编码并按照原始行号拼接
  • 为什么要用这个编码方式呢?
    • 可以让模型更容易计算出相对位置,比如 PE(pos+k,2i)可以通过计算 PE(pos,2i)得到,类比 sin(A+B)展开
    • 使用这样的方式可以让模型能适应比训练集更长的句子,比如训练集中最长的句子是 20,现在来了一个 长度 21 的也能够根据公式计算出第 21 位的 embeding(注:当单词 embeding 后无论原始数据多长嵌入后的长度是一定的,但是未出现过的位置信息不确定但是不影响 embeding 的维度这样才能保证单词和位置embeding 可以相加)
      P E ( p o s + k , 2 i ) = P E ( p o s , 2 i ) ∗ P E ( k , 2 i + 1 ) + P E ( p o s , 2 i + 1 ) ∗ P E ( k , 2 i ) PE(pos+k,2i) = PE(pos,2i) * PE(k,2i+1) + PE(pos,2i+1) * PE(k,2i) PE(pos+k,2i)=PE(pos,2i)PE(k,2i+1)+PE(pos,2i+1)PE(k,2i)
      P E ( p o s + k , 2 i + 1 ) = P E ( p o s , 2 i + ! ) ∗ P E ( k , 2 i + 1 ) − P E ( p o s , 2 i ) ∗ P E ( k , 2 i ) PE(pos+k,2i+1) = PE(pos,2i+!) * PE(k,2i+1) - PE(pos,2i) * PE(k,2i) PE(pos+k,2i+1)=PE(pos,2i+!)PE(k,2i+1)PE(pos,2i)PE(k,2i)
  • 这就是encode 侧的 input 输入了

self-attention&multi-head attention

  • 此部分文章开头链接attention2有详细讲解,本文不做细讲,也可以参考下面两个参考资料也是剖析的比较通俗易懂。
  • 参考 1
  • 参考 2

Add & Norm

  • Add 和 Norm 层是由Add 和 Norm 两部分构成的计算公式如下:
    L a y e r N o r m ( X + M u l t i H e a d A t t e n t i o n ( X ) ) LayerNorm(X + MultiHeadAttention(X)) LayerNorm(X+MultiHeadAttention(X))
    L a y e r N o r m ( X + F e e d F o r w a r d ( X ) ) LayerNorm(X + FeedForward(X)) LayerNorm(X+FeedForward(X))
    • X表示多头或者前馈神经网络的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。
    • X + MultiHeadAttention(X)是一种残差连接,通常用于解决多层网络梯度消失和梯度爆炸的问题,可以让网格只关注当前差异的部分,在 ResNet 中经常用到,公式简单表达就是
      输出 = 输入 + F ( 输入 ) 输出 = 输入 + F(输入) 输出=输入+F(输入)
    • 输入就是当前层的输入,输出就是表示当前层的输出,F(输入)是当前层的变换函数,这样相加来让网络学习输入与输出的差异,可以更方便的学习残差部分
    • 梯度消失:反向传播中梯度逐渐变小并趋近于零,这样梯度信息变得非常微弱从而让浅层网络难以有效的学习和更新(通常发生在激活函数为 sigmoid 或者 tanh 的网络中因为这些函数再输入较小或者较大的时候梯度接近于零)
    • 梯度爆炸:与梯度爆炸相反,梯度逐渐增大并变得非常大导致参数更新过大,网络不稳定甚至无法收敛(通常在网络层之间连接的时候,可能是犹豫网络权重初始化不当,学习率过大,激活函数选择等原因)

Feed Forward 前馈神经网络

  • 前馈神经网络层结构相对比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,公式如下
    m a x ( 0 , X W 1 + b 1 ) W 2 + b 2 max(0, XW1 + b1)W2 +b2 max(0,XW1+b1)W2+b2
  • 作用主要是对输入的词向量映射到输出的词向量,这其中会对多头提取的信息输入进一步处理,以提取更丰富的语意信息
  • encode 侧的流程图就如下图所示

Decode 侧

  • decode部分和 encode 部分相似,但是也存在一些区别
    • decode 侧有两个 multi-head attention 层
    • decode 的第一个多头采用了 mask 操作,而第二个多头的 k,v 矩阵使用的是 encode 侧编码信息矩阵c(encode 的输出)计算,而 q 则是第一个 decode 侧的多头的输出计算
    • 最后包含一个softmax 层计算下一个翻译单词的概率(假设是翻译任务)

decode 侧第一个多头(下图来自不同来源,仅供参考)

  • 这里要捋一捋思路哈,比如:在 encode 侧是对中文"我有一只猫"进行位置+特征 embedding 后进过一系列提取信息后,传入了 decode 侧来翻译成英文,那么英文预测也是一个序列需要一个一个预测,所以就要用到 mask操作来防止第 i 个单词知道第 i+1 个单词之后的意思,具体详解如下:

    • 流程就是:首先输入< Begin >作为 decode 侧的开始标志预测第一个单词,得到 I 后,然后将"< Begin > I"作为下一次预测的输入,以此类推
    • 具体操作其实是加了一个 与输入矩阵形状相同的mask 矩阵,这样就可以把每一次计算当前时间后的信息盖住;
    • 然后的操作就是和之前的自注意力一样,通过输入矩阵 x 计算得到 q,k,v 矩阵然后计算 q 和 k转置的乘积,但是再softmax 之前需要乘以mask 矩阵,如下图所示
    • 得到的 mask QK^T进行 softmax 就会发现单词 0 那一行 1234 的位置都是 0,因为我们设置的是负无穷映射后就成 0 了,再去与矩阵 v 得到矩阵 z
  • 此处我有一个一直没看懂的疑问,为啥要加 mask,我查阅了很多文章都是说为了让模型预测第 i+1 的时候只能使用 i+1 前的信息,但是场景类似于完型填空,因为self attention 是使用的上下文信息是全文的,所以它是提前知道信息的,所以需要加 mask,但是比如这个翻译,是怎么提前看到的呢?搞了半天才明白一个重点,就是上面讲述的 decode 侧的输入,train 的时候decode 侧输入的是正确答案,所以要 mask

    • 补:train 的时候使用的 teacher forcing,啥意思呢就是mask 后让预测,不管预测是对是错都会在预测下一个的时候使用前一个预测的正确答案防止错误一个把模型预测方向带偏,但是 test 模型下就没有正确答案了,这时使用的就是走完所有 decode 流程的预测词来进行下一个预测了,而不是走一层(看下图,其实就是多头铺平了),也就是走过完整多头的预测结果
    • 关于transforer 的并行问题,可以并行参考

mask参考 1

mask参考 2

decode 侧第二个多头

  • 这个多头的区别就是输入,自注意力的 k,v 矩阵使用的 encode 侧输出的编码信息矩阵 c,第一个多头提供的输出计算 q,(train 的时候)此处的 q 就是加了掩码的正确信息,而 kv 是原始信息,好处就是 q 这边的每一个信息都可以利用上 encode 侧的所有信息,这些信息是不需要 mask 的

softmax 预测输出

  • 此部分图片 softmax参考
  • 还可以看此篇 有动图更生动形象,因为 gif 我这个编辑器不支持插入。。。

结尾

  • 上述基本就是个人对 transformer 原理的一个理论梳理,还有很多细节没有展开,也不太理解,可能在后面的代码篇会对细节增加一些补充,仅供参考
  • 最后再次祝自己金九银十能找到一个理想的工作!!!冲鸭~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第5篇 vue的通信框架axios和ui框架-element-ui以及node.js

一 axios的使用 1.1 介绍以及作用 axios是独立于vue的一个项目&#xff0c;基于promise用于浏览器和node.js的http客户端。 在浏览器中可以帮助我们完成 ajax请求的发送在node.js中可以向远程接口发送请求 1.2 案例使用axios实现前后端数据交互 1.后端代码 2.前端代码 &…

微信最新更新隐私策略(2023-08-15)

1、manifest.json 配置修改 在mp-weixin: 参数修改&#xff08;没有就添加&#xff09; "__usePrivacyCheck__": true, ***2、注意 微信开发者工具调整 不然一直报错 找不到 getPrivacySetting 废话不多说 上代码 3、 编辑首页 或者用户授权界面 <uni-popup…

【云原生】Kubeadmin部署Kubernetes集群

目录 ​编辑 一、环境准备 1.2调整内核参数 二、所有节点部署docker 三、所有节点安装kubeadm&#xff0c;kubelet和kubectl 3.1定义kubernetes源 3.2开机自启kubelet 四、部署K8S集群 4.1查看初始化需要的镜像 4.2在 master 节点上传 v1.20.11.zip 压缩包至 /opt 目录…

【Linux】文件系统

磁盘及文件系统 文件的增删查改 重新认识目录 目录是文件嘛&#xff1f; 是的。 目录有iNode嘛&#xff1f; 有 目录有内容嘛&#xff1f; 有 任何一个文件&#xff0c;一定在一个目录内部&#xff0c;所以一个目录的内容是什么&#xff1f; 需要数据块&#xff0c;目录的数据…

【技术支持案例】S32K146的hard fault问题处理

文章目录 1. 案例背景2. 方案准备2.1 HardFault&#xff08;硬件错误异常&#xff09;2.2 UsageFault&#xff08;用法错误异常&#xff09;2.3 BusFault&#xff08;总线错误异常&#xff09;2.4 MemManage Fault&#xff08;存储器管理错误异常&#xff09; 3. 现场支持3.1 现…

Java基础之static关键字

目录 静态的特点第一章、静态代码块第二章、静态属性第三章、静态方法调用静态方法时静态方法中调用非静态方法时 第四章、static关键字与其他关键字 友情提醒 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 静态的特点…

JVM学习(一)--程序计数器

作用&#xff1a;记住下一个jvm指令的执行地址 每一行java源代码&#xff0c;会被编译为多行jvm指令&#xff0c;上文所说的执行地址就是这里的0,3,4等 &#xff0c;由于执行访问特别频繁&#xff0c;程序计数器的底层是有寄存器来实现的 特点&#xff1a; 线程私有&#xff…

kafka学习-生产者

目录 1、消息生产流程 2、生产者常见参数配置 3、序列化器 基本概念 自定义序列化器 4、分区器 默认分区规则 自定义分区器 5、生产者拦截器 作用 自定义拦截器 6、生产者原理解析 1、消息生产流程 2、生产者常见参数配置 3、序列化器 基本概念 在Kafka中保存的数…

一文速学-让神经网络不再神秘,一天速学神经网络基础(七)-基于误差的反向传播

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…

Linux安装kibana

相关链接 https://www.elastic.co/cn/downloads/kibana https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-linux-x86_64.tar.gz 官网下载可能比较慢&#xff0c;下面提供下载地址 百度云链接&#xff1a;https://pan.baidu.com/s/1d9Cqr9EwHF94op90F57bww 提取码…

Elasticsearch实战(五):Springboot实现Elasticsearch电商平台日志埋点与搜索热词

文章目录 系列文章索引一、提取热度搜索1、热搜词分析流程图2、日志埋点&#xff08;1&#xff09;排除logback的默认集成。&#xff08;2&#xff09;引入log4j2起步依赖&#xff08;3&#xff09;设置配置文件&#xff08;4&#xff09;配置文件模板&#xff08;5&#xff09…

计算机竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

使用 【jacoco】对基于 SpringBoot 和 Dubbo RPC 的项目生成测试覆盖率报告:实践+原理

基于 Dubbo RPC 的项目中有一个提供者项目backend、一个消费者项目gateway、以及注册中心nacos。本篇文章记录在windows本地对该框架的测试过程&#xff0c;以及介绍jacoco的基本原理 测试过程 官网下载安装包解压到本地&#xff0c;https://www.jacoco.org/jacoco/ 只需要用…

vue.js+nodejs家庭个人理财收支管理系统5x6nf

本收支管理系统以vue.js作为框架&#xff0c;nodejs语言&#xff0c;B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块&#xff1a;用户管理、收入分类、支出分类、每日收入、每日支出等模块。 本文的组织结构如下&#xff1a; 1、绪论。综述了本文的研究背景…

Redis快速入门

文章目录 0. Redis介绍1. Centos下Redis安装2. redis.conf配置文件介绍3. redis相关命令4. 启动3.2 **命令行操作**3.3 Redis压测命令 4.redis中发布订阅和事务4.1 发布订阅&#xff08;Pub/Sub&#xff09;4.2 事务 5. redis封装系统服务6. 问题与解决6.1 启动Redis报错&#…

荣耀崛起阵容推荐,荣耀崛起最强阵容

今天给大家带来的荣耀崛起阵容推荐是新手阵容推荐&#xff0c;以核心输出为点&#xff0c;由点及面&#xff0c;来展开叙述阵容&#xff01; 关注【娱乐天梯】&#xff0c;获取荣耀崛起0.1折内部福利号 荣耀崛起最强阵容兽族战神流&#xff1a; 此阵容是以战士为核心&#xff0…

机器学习_特征工程_特征数据的评价标准

本文主要从 单特征分析&#xff0c;多特征筛选&#xff0c;特征监控&#xff0c;外部特征评估的几个方面对特征数据进行阐述。 来源 &#xff1a; 特征筛选_特征覆盖度怎么算_adamyoungjack的博客-CSDN博客 1. 单特征分析 1.1 简介 好特征可以从几个角度衡量&#xff1a;覆…

geopandas 笔记: datasets 数据集

geopandas 自带的几个数据集 1 世界各个国家 import geopandas as gpd import pandas as pdpd.set_option(display.max_rows,None) gpd.read_file(gpd.datasets.get_path(naturalearth_lowres)) pop_est人口数量continent国家所在的大陆name国家的名称iso_a3国家的三个字母的…

初识集合框架 -Java

目录 一、集合框架的概念 二、集合框架的重要性 三、涉及的数据结构和算法 3.1 什么是数据结构 3.2 集合框架&#xff08;容器&#xff09;背后对应的数据结构 3.3 相关的Java知识 3.4 什么是算法 3.5 如何学好数据结构和算法 一、集合框架的概念 Java 集合框架&#xff0c;…

山寨能走多远?盗版还是盗火?KCC@深圳活动圆满举办

2023.8.19 &#xff0c;我们组织了一场大家期待已久的线下活动&#xff1a; KCC深圳&#xff1a;Kickoff & 读书会Meetup 来了深圳都是深圳人&#xff0c;没有哪座城市能够像深圳代表中国改革开放的发展历程&#xff0c;年轻、上进、有活力、拥抱新事物&#xff0c;同样&am…