Transformer

目录

Encoder

 Add&Norm:(LayerNorm)Transformer中的归一化(五):Layer Norm的原理和实现 & 为什么Transformer要用LayerNorm - 知乎 (zhihu.com)

LayerNorm怎么做的?

Feed Forward:

FeedForward代码:

公式:

FeedForward的作用是什么?

Decoder:

output:

它的output 是什么?

为什么output要进行shifted right操作?

Mask Muti-Head Attention---Mask:

什么是masked的操作?

masked代码:

为什么需要进行mask?

Muti-Head Attention:

相较于Encoder的不同点:

小结:


学习资料:7-位置编码与多层堆叠1.mp4_哔哩哔哩_bilibili

Transformer代码及解析(Pytorch) - 知乎 (zhihu.com)

Encoder

如图所示:

 Add&Norm:(LayerNorm)Transformer中的归一化(五):Layer Norm的原理和实现 & 为什么Transformer要用LayerNorm - 知乎 (zhihu.com)

将多头注意力的输入和多头注意力的输出进行拼接,再进行LayerNorm。

拼接需要维度相同:

输入X(mxn m表示词数量,n表示词维度),Q,K,V的权重为W_q,W_k,W_v,其维度均为(nxn),

X与三个权重分别相乘得到Q,K,V,其维度均为(mxn),通过Attention公式计算可以得到Attention输出为mxn,和输出的X的维度相同。

拼接操作就是多头注意力的输入和多头注意力的输出两个矩阵的对应元素相加,得到的结果维度仍然是mxn.

LayerNorm怎么做的?

batch表示样本的数量,在上图中每一列表示一个词向量,对每个词向量的所有特征进行归一化。(d_model表示词向量的维度)

原输入为 batchxd_model  输出为batchx1:

​
self.layer_norm1 = nn.LayerNorm(d_model)​

Feed Forward:

对Transformer中FeedForward层的理解_transformer feed forward_江 东的博客-CSDN博客

FeedForward代码:

class FeedForward(nn.Module):def __init__(self, input_size, hidden_size, num_classes):super(FeedForward, self).__init__()self.input_size = input_sizeself.l1 = nn.Linear(input_size, hidden_size)self.relu = nn.ReLU()self.l2 = nn.Linear(hidden_size, num_classes)def forward(self, x):out = self.l1(x)out = self.relu(out)out = self.l2(out)return out

公式:

FFN(x)=relu(W_{1}x+b_{1})W_{2}+b2

FeedForward的作用是什么?

FeedForward中增加了ReLU函数,它可以保留正数部分,对负数部分映射为0,将输入映射到了正数区间。这种做法使FFN并不是仅仅由线性模型y=wx+b构成,更符合实际问题的需求。比如进行房价预测时,可能X只包括收入和地段,y=wx+b只能研究收入和地段对房价的影响,但在实际情况还存在许多不确定因素,并不是简单的线性关系能描述的。

Decoder:

学习资料:机器学习-31-Transformer详解以及我的三个疑惑和解答_transformer不收敛-CSDN博客

output:

它的output 是什么?

如果该Transformer的任务是中英文转换,那么Encoder的输入是我是中国人,

Decoder的输入是分词进行的,一次输入一个词,逐词翻译。(假设当只有一个注意力头时)

输入s 预测出I的Attention值

输入s和I,预测出am的Attention值

输入s,I,am,预测出Chinese的Attention值

Decoder的输出是I am Chinese 终止符<f>

为什么output要进行shifted right操作?

shifted right就是右移的意思,I am Chinese右移,在最左端添加s,表示模型开始预测。

Decoder中的embedding,Add&Norm以及FeedForward和Encoder一样。

Mask Muti-Head Attention---Mask:

什么是masked的操作?

希望在翻译的时候,Decoder不能看到未来的翻译数据;即在翻译I时,不能知道 am和Chinese,要翻译出I,只能依靠起始符<s>

masked代码:

https://github.com/jadore801120/attention-is-all-you-need-pytorch ​ github.com/jadore801120/attention-is-all-you-need-pytorch

def get_subsequent_mask(seq):''' For masking out the subsequent info. '''sz_b, len_s = seq.size()# torch.triu(diagonal=1)保留矩阵上三角部分,其余部分(包括对角线)定义为0。subsequent_mask = (1 - torch.triu(torch.ones((1, len_s, len_s), device=seq.device), diagonal=1)).bool()return subsequent_mask

 

 输入X(4x4)输入四个四维词向量,masked操作将X的上三角部分舍弃。

[True,False,False,False]表示输入<s>

[True,True,False,False]表示输入<s>+I

为什么需要进行mask?

s表示起始,E表示结束

下一行表示输入,上一行表示输出;j

像前面说的,我们是逐词进行翻译的,哪怕不使用masked,在翻译you时,我们也不能得到后续信息,完全不需要对后续信息进行mask操作:

但是Transformer实际上存在多头注意力,<s> I am Chinese可以在多个头里面并行求Attention,这时候掩码的存在就很有必要了。

Muti-Head Attention:

相较于Encoder的不同点:

输入有三个(1.masked muti-head Attention 的输出,2.l另外两个都是Encoder的muti-head Attention的Attention)

Attention(Q,K,V) = Softmax(\frac{QK^{\Gamma }}{d_{k}^{1/2}})V

masked muti-head Attention 的输出和权重W_Q相乘 产生新的Q

Attention分别和W_K,W_V相乘,产生新的K和V。

小结:

1.LayerNorm表示对输入样本的所有特征进行归一化;

2.激活函数例如ReLu可以增加非线性信息,可以拟合更加复杂的情况,更贴合实际需要;

3.在并行化处理词向量时,mask的操作是必要的。

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

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

相关文章

Android 12 及以上授权精确位置和模糊位置

请求位置信息权限 为了保护用户隐私&#xff0c;使用位置信息服务的应用必须请求位置权限。 请求位置权限时&#xff0c;请遵循与请求任何其他运行时权限相同的最佳做法。请求位置权限时的一个重要区别在于&#xff0c;系统中包含与位置相关的多项权限。具体请求哪项权限以及…

栈和队列的OJ题——14.用栈实现队列

14.用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 此题可以用两个栈实现&#xff0c;一个栈进行入队操作&#xff0c;另一个栈进行出队操作 出队操作&#xff1a; 当出队的栈不为空是&#xff0c;直接进行出栈操作&#xff…

算法通关村第七关—迭代实现二叉树的遍历(黄金)

迭代实现二叉树的遍历 迭代法实现前序遍历 前序遍历是中左右&#xff0c;如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出如下代码&#xff1a;&#xff08;注意代码中&#xff0c;空节点不入栈&#xff09; public List<Integer>preorde…

VSCode 中将头文件和头文件函数分离,编译主函数跳出 undefined reference to 的问题解决

VSCode 编写 C &#xff08;.h&#xff0c;.cpp 文件分离&#xff09;代码&#xff0c;编写完成后&#xff0c;编译遇到了编译错误 undefined reference to xxx。 开始还以为使用了 -stdc20 而不能使用 #include “xxx.h" 方式头文件&#xff0c;但仔细一想虽然引入了 im…

基于YOLOv7算法的的高精度实时通用目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时检测识别系统可用于日常生活中检测与定位多种目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训练数据集…

OpenHarmony 应用(HarmonyOS 原生应用)- 写一个 Hello World 并在华为手机上跑起来

OpenHarmony 简介 ArkUI 开发框架 OpenHarmony 提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI 框架&#xff09;。 两种开发范式 支持两种开发范式&#xff0c;分别是基于ArkTS的声明式开发范式&#xff08;简称“声明式开发范式”&#xff09;和兼容J…

【Leetcode题单】(01 数组篇)刷题关键点总结03【数组的改变、移动】

【Leetcode题单】&#xff08;01 数组篇&#xff09;刷题关键点总结03【数组的改变、移动】&#xff08;3题&#xff09; 数组的改变、移动453. 最小操作次数使数组元素相等 Medium665. 非递减数列 Medium283. 移动零 Easy 大家好&#xff0c;这里是新开的LeetCode刷题系列&…

弦理论的技术探索

弦理论的技术探索 一、引言 弦理论,作为现代物理学中的一个重要分支,旨在揭示宇宙的终极规律。它认为,宇宙中的一切物质和能量都是由微小的弦振动产生的。本文将深入探讨弦理论的技术层面,包括其数学基础、物理应用以及计算机模拟等方面。 二、弦理论的数学基础 弦理论的…

Go连接mysql数据库

package main import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" ) //go连接数据库示例 func main() {// 数据库信息dsn : "root:roottcp(192.168.169.11:3306)/sql_test"//连接数据库 数据库类型mysql,以及数据库信息d…

【Tkinter 入门教程】

【Tkinter 入门教程】 1. Tkinter库的简介&#xff1a;1.1 GUI编程1.2 Tkinter的定位 2. Hello word! 程序起飞2.1 第⼀个程序2.2 字体颜色主题 3. 组件讲解3.1 tkinter 的核⼼组件3.2 组件的使⽤3.3 标签Label3.3.1 标签显示内容3.3.2 多标签的应⽤程序3.3.3 总结 3.4 按钮but…

Wireshark 协议插件Lua开发 -数据包内嵌协议的解释

概述 因为公司项目涉及的协议打包&#xff0c;协议包内又嵌了一层IP包的奇葩套娃结构&#xff0c;为了方便抓包调试&#xff0c;利用Wireshark的协议插件开发功能&#xff0c;写了一个插件&#xff0c;博文记录以备忘。 环境信息 Wireshark 4.0.3 协议结构体套娃图 插件安装…

【系统运维】Centos部署Haproxy+Keepalived+RabbitMQ高可用集群

1.RabbitMQ高可用集群方案 &#xff08;1&#xff09;RabbitMQ搭建集群的作用&#xff1a;提高可用性、可靠性和处理能力&#xff0c;确保系统提供高效的消息传递服务 高可用性&#xff1a;通过集群&#xff0c;即使其中一个节点发生故障&#xff0c;其他节点仍然可以继续提供…

粉丝提问:岗位与描述不一致,小公司感觉学不到东西,工作内容就是调试,想辞职

0、粉丝问题&#xff1a; 大哥&#xff0c;我毕业已经工作两个月了&#xff0c;在一家小公司&#xff0c;岗位和描述的不一致&#xff0c;感觉就像调试一样&#xff0c;写代码的机会很少也没人带&#xff0c; 我想转嵌入式&#xff0c;您有什么建议的方向吗&#xff0c;或者是…

【异常】捕获线程池执行任务时产生的异常

前言&#xff1a; 在编写程序时&#xff0c;我们为了充分利用多核CPU、加快接口响应速度&#xff0c;通常会使用线程池来处理请求&#xff0c;但线程池执行任务过程中难免会出现异常&#xff0c;导致请求失败。那如果我们想在任务发生异常后捕获异常&#xff0c;并做一些”善后…

12.03 二叉树简单题2

257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5",&q…

Matlab数学建模详解之发电机的最佳调度实现

&#x1f517; 运行环境&#xff1a;Matlab、Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&am…

智能优化算法应用:基于原子搜索算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子搜索算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子搜索算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子搜索算法4.实验参数设定5.算法结果6.参考…

主键虽两个字,但含义丰富;创建新表,Access会自动创建主键,但也可以手动设置

主键是一种特殊类型的索引字段&#xff0c;用于唯一标识表中的每个记录或行。每个主键值必须是表中唯一一个此类主键值。创建新表时&#xff0c;Access会自动创建具有字段名ID和自动编号数据类型的主键。 你需要了解的有关主键的一些信息 一个表只能有一个主键。 主键字段中…

DevEco Studio设置背景图片

我们打开编辑器 左上角菜单 选择 File 下的 Settings 我们选择首选项 Appearance 8 Behavior 下的 Appearance 右侧界面 点击下面的 Background lmage… 新弹出的这个窗口 我们可以鼠标 拖拽它的边 把他拉大一点 当前 我们代码中是没有背景图片的 我们点击入下图指向的三个…

Sun Apr 16 00:00:00 CST 2023格式转换

Date date new Date(); log.info("当前时间为:{}",date); //yyyy-MM-dd HH:mm:ss SimpleDateFormat sdf new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS); String dateTime s…