transformer原理
Transformer注意力架构原理
输入层
embedding词嵌入向量
将文本中词汇的数字表示转变为向量表示,在这样的高维空间捕捉词汇间的关系
语义相近的词语对应的向量位置也更相近
每个词先通过词典转换成tokenId,在把tokenId转化为一个512纬的向量
位置编码
将每个词的位置向量(通过位置编码矩阵算出)增加到文本嵌入层输出向量中,这样输入层的向量就有了位置的信息
编码层
注意力层
注意力流程
Q通过K,V挖掘到KV中更重要的权重,把Q生成一个新的V
通过Q通过K在张量层面获取注意力(占比),在把占比乘以V就获得了新的张量作为获得注意力的张量
Q和K主要是为了获得占比
注意力机制公式
QKt是矩阵Q乘矩阵K的转置
处以√dk解决梯度消失的问题
softmax是计算出通过矩阵运算后的Q对于K的占比
最后乘以V是通过比例和值的乘运算获得最终的结果
自注意力
自注意机制的Q=K=V,通过转置计算,每个词都和其他所有词进行了计算
他的优点还在于,可以直接跨越一句话中不同距离的词,远距离学习到序列的只是依赖和语序结构
多头注意力机制
将句子词向量切分成多个部分每个部分分别进行注意力处理,最后再拼接到一起
多头可以在更细致的层面上提取不同的head的特征,提取特征的效果更好
规范化层norm
它是所有深层网络模型都需要的标准网络层
随着网络层数的增加,通过多层的计算后参数可能开始出现过大或过小的情况,这样可能会导致学习过程出现异常,模型可能收敛非常的慢. 因此都会在一定层数后接规范化层进行数值的规范化,使其特征数值在合理范围内
子层连接结构(残差连接)add
残差连接是2015年提出的论文解决神经网络深度过大导致的问题
神经网络模型在深度到达一定程度后,会造成梯度消失、梯度爆炸等问题
将浅层的输出和深层的输出求和,作为下一阶段的输入
通过残差连接这样一个简单的处理,成功将上百层的模型得以收敛,从而在分类任务中达到了更高的精度,在2016年resnet的改进中,模型的深度达到了1000层
Add & Norm
Add表示残差连接,Norm表示规范化层
对于每一个EncoderBlock,两个子层后面都有Add & Norm
对于每一个DecoderBlock,三个子层后后面都有Add & Norm
残差连接可以让信息传递的更深,增强了模型的拟合能力
规范化层,可以让模型减少参数过大过小的问题,防止模型收敛慢的问题
前馈全连接层Feed Forward
在Transformer中前馈全连接层就是具有两层线性层的全连接网络
考虑注意力机制可能对复杂过程的拟合程度不够, 通过增加两层网络来增强模型的能力
前馈全连接层由两个线性变化组成,中间有一个Relu激活函数
原始论文中的前馈全链接层输入和输出的纬度都是512,层内连接纬度是2048,均采用4倍的关系
前馈全链接层作用:单纯的多头注意力机制不足以提取到理想的特征,因此增加全链接层来提升网络的能力
编码器
Encoder部分是6个一模一样的Encoder Block层层堆叠在一起(网络串行)
解码层
第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
多头自注意力层:需要做掩码,来遮掩未来的信息,提升模型的能力
对于生成类模型就是一个字一个字的崩出来,不能提前给模型透露未来的信息,如果透露了,他预测的能力会下降
第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接
多头注意力层:Q来自于Decoder端,KV来源于Encoder端
为什么要让原始文本(编码器输入)作为K V,翻译文本作为Q呢
训练过程中,要让目标文本在原始文本中提取到更重要的信息
预测过程中,更是要让生成文本在原始文本中提取到更重要的信息
谁更重要,谁信息量更大,谁就要在K V(通常K V是一样的)
这样设计的目的是为了让Decoder端的token能够给予Encoder端对应的token更多的关注
第三个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接
输出层
全连接线性层+softmax激活函数获得最终的结果
Transformer相比于传统RNN的优势
Transformer能够利用分布式GPU进行并行训练,提升模型训练效率
Encoder并行化
Embedding层(输入)、前馈全链接层、规范化残差连接层,都可以进行并行化
从Embedding层到注意力层之间因为存在依赖关系,这两个阶段无法并行
在注意力层因为采用了矩阵运算,可以一次性计算所有主力张量的计算,数学上也是一种并行化的体现
Encoder在训练和预测阶段都可以实现并行化
Decoder并行化
Embedding层(输入)、前馈全链接层、规范化残差连接层,都可以进行并行化
在注意力层因为采用了矩阵运算,可以一次性计算所有主力张量的计算,数学上也是一种并行化的体现
Decoder在训练阶段可以并行化阶段
Decoder在预测阶段不可并行化阶段
在分析预测更长的文本时, 捕捉间隔较长的语义关联效果更好
基于注意力的机制设计本身就能跨越较长文本,提取长文本特征,并通过注意力权重提现到embedding中
transformer原理的更多相关文章
- 【手搓模型】亲手实现 Vision Transformer
前言 博客主页:睡晚不猿序程 首发时间:2023.3.17,首发于博客园 最近更新时间:2023.3.17 本文由 睡晚不猿序程 原创 作者是蒻蒟本蒟,如果文章里有任何错误或者表述不清,请 tt 我, ...
- Task10.Bert
Transformer原理 论文地址:Attention Is All You Need:https://arxiv.org/abs/1706.03762 Transformer是一种完全基于Atte ...
- 13.深度学习(词嵌入)与自然语言处理--HanLP实现
笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 13. 深度学习与自然语言处理 13.1 传统方法的局限 前面已经讲过了隐马尔可夫 ...
- 2. Attention Is All You Need(Transformer)算法原理解析
1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...
- 一文看懂Transformer内部原理(含PyTorch实现)
Transformer注解及PyTorch实现 原文:http://nlp.seas.harvard.edu/2018/04/03/attention.html 作者:Alexander Rush 转 ...
- Spatial Transformer Networks(空间变换神经网络)
Reference:Spatial Transformer Networks [Google.DeepMind]Reference:[Theano源码,基于Lasagne] 闲扯:大数据不如小数据 这 ...
- LDO稳压器工作原理
LDO稳压器工作原理 随着便携式设备(电池供电)在过去十年间的快速增长,像原来的业界标准 LM340 和LM317 这样的稳压器件已经无法满足新的需要.这些稳压器使用NPN 达林顿管,在本文中称其为N ...
- RxJava(10-操作符原理&自定义操作符)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51791120 本文出自:[openXu的博客] 目录: 自定义创建操作符 数据序列操作符li ...
- 【译】图解Transformer
目录 从宏观上看Transformer 把张量画出来 开始编码! 从宏观上看自注意力 自注意力的细节 自注意力的矩阵计算 "多头"自注意力 用位置编码表示序列的顺序 残差 解码器 ...
- 深入理解BERT Transformer ,不仅仅是注意力机制
来源商业新知网,原标题:深入理解BERT Transformer ,不仅仅是注意力机制 BERT是google最近提出的一个自然语言处理模型,它在许多任务 检测上表现非常好. 如:问答.自然语言推断和 ...
随机推荐
- dotnet 警惕 C# 的 is var 写法
本文将和大家介绍 C# 语言设计里面,我认为比较坑的一个语法.通过 is var 的写法,会让开发者误以为 null 是不被包含的,然而事实是在这里的 var 是被赋予含义的,将被允许 null 通过 ...
- dotnet 谨慎在静态构造函数里使用锁
在 dotnet 的最佳实践里面,不推荐在静态构造函数里面包含复杂的逻辑,其中也就包含了本文聊的和多线程相关的锁的使用.最佳做法是尽量不要在静态构造函数里面碰到任何和锁以及多线程安全相关的逻辑.本文来 ...
- dotnet 6 使用 HttpWebRequest 进行 POST 文件将占用大量内存
我有用户给我报告一个内存不足的问题,经过了调查,找到了依然是使用已经被标记过时的 HttpWebRequest 进行文件推送,推送过程中,由于 System.Net.RequestStream 将会完 ...
- 鸿蒙HarmonyOS实战-ArkUI事件(触屏事件)
前言 触屏事件是指通过触摸屏幕来进行操作和交互的事件.常见的触屏事件包括点击(tap).双击(double tap).长按(long press).滑动(swipe).拖动(drag)等.触屏事件通常 ...
- C语言程序设计-笔记6-数组
C语言程序设计-笔记6-数组 例7-1 输出所有大于平均值的数.输入n个整数(1 ),计算这些数的平均值,再输出所有大于平均值的数. #include<stdio.h> int main ...
- vue+vant+js实现购物车原理小demo(中级版有选择)
增加只计算已选的的购物车商品功能.效果图: main.js: Vue.use(Stepper); Vue.use(Checkbox); Vue.use(CheckboxGroup); 上代码: < ...
- vue-苟曰的老板不发工资230行原创js代码写个扫雷小游戏
上gif: 1.开局提示动画 2.游戏中状态提示 3.开挂模式提示 4.计时器 5.游戏模式扫雷成功,蓝色进度条表示当次扫雷的完成度 6.若当次时间小于最佳记录,则更新最佳记录,如果最佳记录小于设置的 ...
- Windows下绑定线程到指定的CPU核心
在某些场景下,需要把程序绑定到指定CPU核心提高执行效率.通过微软官方文档查询到Windows提供了两个Win32函数:SetThreadAffinityMask和SetProcessAffinity ...
- Solution Set - 矩阵加速
A[HDU2604]求不含子串010和000的,长为\(n\)的01序列数. B[HDU6470]数列\(\{a_n\}:a_1=1,a_2=2,a_n=a_{n-1}+2a_{n-2}+n^3\), ...
- rails byebug
Gemfile里添加 gem 'byebug' bundle install 在要打断点的地方写 byebug byebug -h #帮助 c 放行,入下走 n 单行调适 q 退出进行 启动异步任务推 ...