Transformer实战-系列教程2:Transformer算法解读2

🚩🚩🚩Transformer实战-系列教程总目录

有任何问题欢迎在下面留言

Transformer实战-系列教程1:Transformer算法解读1
Transformer实战-系列教程2:Transformer算法解读2

5、Multi-head机制

在4中我们的输入是X( x 1 x_1 x1 x 2 x_2 x2、…、 x n x_{n} xn)经过一次self-Attention计算后得到Z( z 1 z_1 z1 z 2 z_2 z2、…、 z n z_{n} zn),这可以当成是单头注意力机制。

而多头注意力机制,假如是8头,输入X,同时生成8个Z,即有 Z 0 Z_0 Z0 Z 1 Z_1 Z1、…、 Z 7 Z_7 Z7,而每一个Z的计算都是同时计算和生成的,每一个Z对应的 W Q W^Q WQ W K W^K WK W V W^V WV 可学习参数与生成Q、K、V还有经过softmax计算相关性的权重都是不一样的,而这8个Z拼接在一起再经过一层全连接生成新的Z,这个新的Z的维度和原来的Z的维度可以相同也可以不相同

不同的注意力结果,得到的特征向量表达也不相同

所以Multi-head机制实际上就是将self-Attention堆叠多层

6、位置信息表达

RNN之所以能够和CNN并立很久的原因,就是因为RNN相对于CNN能够比较好的提取出时序信息,即时间特征、前后序列特征。
在前面的self-Attention和Multi-head机制都没有计算时序信息,如果不计算时序信息,下面的这句话是不是一样的意思呢?

我打你
你打我

这两句话之所以意思完全不同,是因为它们的时序信息不同所以才有完全不同的意义。

以这句话为例:

The animal didn’t cross the street because it was too tired.
不考虑标点和缩写
上面的单词对应了这个位置索引:
[0,1,2,3,4,5,6,7,8,9,10]
每一个单词都对应了768个维度索引:
[0,1,2,3,4,5,6,7,…,765,766,767]

那么根据位置索引和维度索引可以计算出11x768个角度值,再将这个角度值通过正余弦的计算,就可以得到11个768维的向量

Transformer 中的位置编码使用正弦和余弦函数的组合来生成每个位置的编码,公式如下:
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) 、 P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE(pos, 2i) =sin(pos / 10000^{2i/d_{model}}) 、 PE(pos, 2i+1) =cos(pos / 10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)

  • P E ( p o s , 2 i ) PE(pos, 2i) PE(pos,2i) P E ( p o s , 2 i + 1 ) PE(pos, 2i+1) PE(pos,2i+1) 分别表示位置 pos 的编码在维度2i和(2i+1) 上的值
  • i 是维度索引
  • d m o d e l d_{model} dmodel,是模型中嵌入向量的维度

原始输入的 x 1 x_1 x1,它对应的位置编码信息的数据维度和 x 1 x_1 x1是完全一样的

import numpy as np# 定义位置编码函数
def positional_encoding(position, d_model):angle_rads = np.arange(position)[:, np.newaxis] / np.power(10000, (2 * (np.arange(d_model)[np.newaxis, :] // 2)) / d_model)# 将 sin 应用于数组的偶数索引(indices);2iangle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])# 将 cos 应用于数组的奇数索引(indices);2i+1angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])pos_encoding = angle_rads[np.newaxis, ...]return pos_encoding# 生成位置编码
position = 10  # 为前10个位置生成编码
d_model = 512  # 嵌入向量的维度
pos_encoding = positional_encoding(position, d_model)# 打印位置编码的形状和部分值
pos_encoding.shape, pos_encoding[0, :4, :4]  # 查看前4个位置的前4维度的编码[[ 0.        ,  1.        ,  0.        ,  1.        ],[ 0.84147098,  0.54030231,  0.82185619,  0.56969501],[ 0.90929743, -0.41614684,  0.93641474, -0.35089519],[ 0.14112001, -0.9899925 ,  0.24508542, -0.96950149]]

这是一个位置编码的小例子

7、Decoder

在前面介绍了self-Attention、Multi-head、位置信息计算等内容,这些都是Encoder编码器的部分,就是将原始的文本编码成特征,与编码器对应的还有Decoder解码器

解码器与编码器有所不同:

  1. Attention计算不同
  2. 加入了MASK机制

在这里插入图片描述

如图所示,这是一个使用Transformer架构将法语翻译成英语的任务,法语输入3个单词,英语输出4个单词,左边为编码器,右边为解码器

  1. Je suis étudiant经过编码器变成了Z={ z 1 z_1 z1 z 2 z_2 z2 z 3 z_3 z3 } 3个向量
  2. Z直接对应生成K={ k 1 k_1 k1 k 2 k_2 k2 k 3 k_3 k3 } 和V={ v 1 v_1 v1 v 2 v_2 v2 v 3 v_3 v3 } ,其中 k i k_i ki= v i v_i vi= z i z_i zi
  3. 解码器的Q从上一个解码器的输出得到,比如上一个解码器的输出为I,那么I经过embbeding后在全连接层维度变换成和K、V一样的维度得到Q
  4. 但是第一个没有上一个解码器的输出怎么办呢?将“开始符号”进行embbeding
  5. 现在Q、K、V都有了,同样进行自注意力的计算,生成解码器自己的Z向量
  6. Z向量首先会经过包含激活函数ReLU、层归一化Layer Normalization、全连接层,然后依次经过残差连接、全连接层、softmax得到一个两万分类(假设语料表为两万词)的概率,选取概率最高的那个单词,假设就是I
  7. I经过embbeding后,再经过一层全连接层进行维度变换生成新的Q向量
  8. 如此循环直到生成“停止符号

在这里插入图片描述

8、输出层

解码器是不断的生成一个向量,这个向量在解析成一个单词,也就是说会一个一个单词的生成。
这个单词如何生成呢?主要是最后的线性层和Softmax层
线性层是一个简单的全连接神经网络,它将解码器产生的向量投影到一个更大的向量中,称为 logits 向量。

假设我们的模型从训练数据中可以统计到10000个不同的单词(那这一万个单词就是我们的语料表)。这使得
logits 向量有 10,000 个单元格——每个单元格对应一个唯一单词的分数。这就是我们解释线性层模型输出的方式。

然后,softmax 层将这些分数转换为概率(全部为正,全部加起来为 1.0)。选择概率最高的单元格,并生成与其关联的单词作为该时间步的输出。

在这里插入图片描述

Transformer实战-系列教程1:Transformer算法解读1
Transformer实战-系列教程2:Transformer算法解读2

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

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

相关文章

【保姆级教程|YOLOv8改进】【5】精度与速度双提升,使用FasterNet替换主干网络

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

重写Sylar基于协程的服务器(6、HOOK模块的设计)

重写Sylar基于协程的服务器(6、HOOK模块的设计) 重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务器(1、日志模…

大数据Zookeeper--案例

文章目录 服务器动态上下线监听案例需求需求分析具体实现测试 Zookeeper分布式锁案例原生Zookeeper实现分布式锁Curator框架实现分布式锁 Zookeeper面试重点选举机制生产集群安装多少zk合适zk常用命令 服务器动态上下线监听案例 需求 某分布式系统中,主节点可以有…

CentOS 8 安装配置 Hadoop3.3.6 伪分布式安装方式(适用于开发和调试)

1.配置服务器ssh免密登录,否则后面启动会报错:尝试通过SSH连接到主机出现认证错误的提示 配置服务器ssh免密登录: 1.生成SSH密钥对(如果尚未生成): 执行下面的命令生成密钥对,一直回车即可 ssh…

为后端做准备

这里写目录标题 flask 文件上传与接收flask应答(接收请求(文件、数据)flask请求(上传文件)传递参数和文件 argparse 不从命令行调用参数1、设置default值2、"从命令行传入的参数".split()3、[--input,内容] …

代码随想录day18--二叉树的应用6

LeetCode530.二叉搜索树的最小绝对差值 题目描述: 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。 示例 1: 输入:root [4,2,6,1,3] …

CSDN2024年我的创作纪念日1024天|不忘初心|努力上进|积极向前

CSDN2024年我的创作纪念日1024天| 学习成长机遇:学习成长收获:2023年度总结数据:2024新领域的探索:日常和自己的感慨:2024憧憬和规划:创作纪念日总结: 学习成长机遇: 大家好&#x…

SpringBoot-基础篇03

之前搭建了整个开发环境实现了登录注册,springBoot整合mybatis完成增删改查,今天完成分页查询,使用阿里云oss存储照片等资源,后期会尝试自己搭建分布式文件系统来实现。 一,SpringBootMybatis完成分页查询 1&#xff…

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来,汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

零基础学编程从入门到精通,系统化的编程视频教程上线,中文编程开发语言工具构件之缩放控制面板构件用法

一、前言 零基础学编程从入门到精通,系统化的编程视频教程上线,中文编程开发语言工具构件之缩放控制面板构件用法 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载—…

mysql事务锁

Lock - 事务锁 与 latch 的区别 lock对象是事务,用来锁定的是数据库中的对象,如表、行、页。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。此外,lock,正…

3.0 Zookeeper linux 服务端集群搭建步骤

本章节将示范三台 zookeeper 服务端集群搭建步骤。 所需准备工作,创建三台虚拟机环境并安装好 java 开发工具包 JDK,可以使用 VM 或者 vagrantvirtualbox 搭建 centos/ubuntu 环境,本案例基于宿主机 windows10 系统同时使用 vagrantvirtualb…

发送get请求并且发送请求头(header),java实现

发送get请求时,发送请求头(Header)中的内容 方便第二次调用其他url时传递参数,例如userCode或者租户编码 调用方式 Autowired private HttpServletRequest request;先注入HttpServletRequestpublic xxx xxx(){String url &quo…

docker程序镜像的制作

目录 一、每种资源的预安装(基础) 安装 nginx安装 redis 二、dockerfile文件制作(基础) 打包 redis 镜像 创建镜像制作空间制作dockerfile 打包 nginx 镜像 三、创建组合镜像(方式一) 生成centos容器并…

vue3+echarts:Vue中使用echarts从后端获取数据并赋值显示

//由于前后端交互,所以使用axios发送请求 const Count ref(null); //设备种类数值 const Name ref(null); //设备种类名称 //设备种类 饼图 const pieChart () > {const getpieChart echarts.init(document.getElementById("deviceKind"));// 创建图标getpieC…

位置内插 PI:基于Positional Interpolation扩大模型的上下文窗口

位置内插 PI:基于Positional Interpolation扩大模型的上下文窗口 如何在不牺牲性能或从头训练的情况下,扩展大型语言模型的上下文窗口以处理长文档或长对话? 论文:https://arxiv.org/pdf/2306.15595.pdf 这篇论文介绍了一种名为位…

C++ JSON解析

JSON解析 JSONCPPC实现JSON解析器 JSONCPP JSONCPP源码链接:https://github.com/open-source-parsers/jsoncpp JSOCPP源码下载以后,首先复制一份include文件夹下的json文件夹,头文件留着后续备用。 使用Cmake生成项目。在IDE中编译jsoncpp_…

【Nicn的刷题日常】之打印整数二进制的奇数位和偶数位

目录 1.题目描述 2.解题思路 3.解题 1.题目描述 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 2.解题思路 1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0 2. 以同样的方式提取偶数位置检测n…

CGAL-3D 凸包算法

3D 凸包算法 一、概述二、静态凸包构造1. Traits 特征类2. 极端点3. 半空间相交4. 凸性检验 三、动态凸包构造四、性能 一、概述 一个点集 S∈R3 是凸的,如果对于任意两点 p 和 q 在集合中,具有端点的线段 p 和 q 包含在 S。集合的凸包 P 包含点集 S 的最…

GADM 4.1 全球国家行政区划下载

扫描文末二维码,关注微信公众号:ThsPool 后台回复g004,领取最新 GADM 4.1 全球国家行政区划 GADM概述 GADM,全称 Database of Global Administrative Areas,是一个开放获取的全球行政区划数据库,包含各国、…