详解Transformer中的Encoder

news/2024/7/19 10:43:11 标签: transformer, 深度学习, 人工智能

一.Transformer架构

在这里插入图片描述
左半边是Encoder,右半边是Decoder。

二.Vision Transformer

Vision Transformer取了Transformer的左半边。包含

  1. Input Embedding
  2. Positional Encoding
  3. 多头注意力机制 + Add & Norm
  4. (前馈网络)Feed Forward + Add & Norm
    在这里插入图片描述

2.1 Input Embedding

在这里插入图片描述

2.2 Positional Encoding

  1. 为什么需要位置编码?

Transformer替代的是RNN(循环神经网络),RNN本身是一种训练网络,天然包含句子之间的位置信息,Tranformer用attention替代了RNN,所以就缺乏位置信息。模型没有办法知道每个单词在句子中的相对位置和绝对位置。

  1. 具体实现方法是:

每个奇数时间步,使用余弦函数创建一个向量。

在这里插入图片描述

  1. 偶数时间步,使用正弦函数创建向量
    在这里插入图片描述
    然后将这些向量添加到相应的嵌入向量中。

这样就成功了为网络提供了每个向量的信息。选用正弦和余弦函数,是因为他们有线性特性。

2.3 多头注意力机制

在这里插入图片描述

它的内部如下:
在这里插入图片描述
多头注意力机制是多个自注意力。
多头注意力模块运用了自注意力,自注意力机制可将输入的每个单词和其它单词关联起来。
比如:模型将You与How 和 are联系起来。
在这里插入图片描述

1. 自注意力机制中的Q,K,V

在这里插入图片描述

在这里插入图片描述
为了实现自注意力,将输入分别输入到三个不同的全连接层,来创建查询向量、键向量、值向量

查询向量、键向量、值向量来自检索系统,
Q:例如当在youtube上输入一个查询词Q,搜索某个视频。
K:搜索引擎将你的查询值映射到一组键K中(如视频标题,视频描述)。
V:与数据库的候选视频相关联。

2. 自注意力机制中的第一个MatMul

查询和键经过点积矩阵乘法产生一个分数矩阵。分数矩阵确定了一个单词应该如何关注其它单词。
在这里插入图片描述

(MatMul)点乘获得分数矩阵:

在这里插入图片描述
分数矩阵确定一个单词应该如何关注其它单词。
在这里插入图片描述
每个单词都会有一个与时间步长中的其他单词相对应的分数。分数越高,关注度越高。这就是查询如何映射到键的。

3.缩放

在这里插入图片描述

在这里插入图片描述
将查询和键的维度开平方将得分缩放,因为这样可以让梯度更稳定,因为乘法可能会产生爆炸效果。

4. softmax

在这里插入图片描述

对缩放后的得分进行softmax计算,得到注意力权重,进行softmax计算后,较高的得分会得到增强,较低的得分得到抑制。
在这里插入图片描述
得到的是注意力权重。

5. 第二个MatMul操作

在这里插入图片描述

在这里插入图片描述

将注意力权重 和 值向量相乘。得到输出向量。

6. concat层

为了使这个计算成为多头注意力计算,在应用自注意力之前将查询、键、值分成N个向量。分割后的向量分别经过相同的自注意力,每个自注意力过程称为一个头,每个头产生一个输出向量。这些向量经过最后的线性层之前被拼接成一个向量。
在这里插入图片描述

理论上,每个头都会学到不同的东西。从而为编码器模型提供更多的表达能力。

7.多头注意力机制总结

多头注意力是一个模块,用于计算输入的注意力权重,并生成一个带有编码信息的输出向量,指示序列中每个词应该如何关注其它所有词。

8.多头注意力机制后的Add & Norm

在这里插入图片描述
接下来,使用残差连接,将多头注意力机制输出向量,加到原始输入上。

2.4 前馈网络 + Add & Norm

在这里插入图片描述

在这里插入图片描述

残差连接的输出经过层归一化(LayerNorm)。归一化后的残差输出被送入点对点前馈网络进行进一步处理。点对点前馈网络是几个线性层,中间有ReLu激活函数。

残差连接有助于网络训练,因为它允许梯度直接流过网络。

使用层归一化来稳定网络,显著减少所需训练时间。

最后:

可将编码器堆叠n次,以进一步编码信息。其中每一层都有机会学习不同的注意力表示。从而有可能提高transformer网络的预测能力。

在这里插入图片描述

参考

超强动画,一步一步深入浅出解释Transformer原理!
https://www.bilibili.com/video/BV1ih4y1J7rx/?spm_id_from=333.999.top_right_bar_window_history.content.click&vd_source=ebc47f36e62b223817b8e0edff181613


http://www.niftyadmin.cn/n/5007918.html

相关文章

软件系统功能测试的依据

验收测试 一、软件系统功能测试的依据: 采用GB/T 25000.51-2016系统与软件工程系统与软件质量要求和评价(SQuaRE)第51部分:就绪可用软件产品(RUSP)作为测试依据 二、常用功能测试方法: 界面测试 是指对使用界面的软件进行的软件测试&…

Linux/Windows中根据端口号关闭进程及关闭Java进程

目录 Linux 根据端口号关闭进程 关闭Java服务进程 Windows 根据端口号关闭进程 Linux 根据端口号关闭进程 第一步:根据端口号查询进程PID,可使用如下命令 netstat -anp | grep 8088(以8088端口号为例) 第二步:…

【C++精华铺】10.STL string模拟实现

1. 序言 STL(标准模板库)是一个C标准库,其中包括一些通用的算法、容器和函数对象。STL的容器是C STL库的重要组成部分,它们提供了一种方便的方式来管理同类型的对象。其中,STLstring是一种常用的字符串类型。 STLstrin…

QT 初识多线程

1.QThread线程基础 QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。 void run()函数是线程体函数,用于定义线程的功能…

Linux系统编程--I/O

文章目录 一、系统调用1.open()1.1 所需基础知识1.2. open() 详解1.3 示例代码 二、标准IO 一、系统调用 1.open() 1.1 所需基础知识 Linux遵循一切皆是文件的理念,因此,很多的交互工作都是通过读取和写入文件来完成。 文件必须被打开才能被访问。文件…

LeetCode——贪心篇(一)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 目录 455. 分发饼干 376. 摆动序列 53. 最大子数组和 122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II 1005. K 次取反后最大化的数组和 455. 分发饼干 假设你是…

自主研发5G基带?苹果计划在2025年开始使用,新款iPhone有福啦

苹果计划在2025年开始,在iPhone中使用自主研发的5G基带。这一消息来自著名的天风证券分析师郭明錤于9月7日发布的简报。 据了解,苹果公司早在2018年就开始规划自己的调制解调器,并于2019年收购了英特尔的大部分智能手机调制解调器业务&#x…

java - lua - redis 完成商品库存的删减

java调用lua脚本完成对商品库存的管理 主页链接 微风轻吟挽歌的主页 如若有帮助请帮忙点赞 //lua脚本 获取到内存不够的商品StringBuilder sb new StringBuilder();//定义一个数组存储可能缺少库存的值sb.append(" local table {} ");//获取值sb.append(" …