【深度学习】Transformer梳理
零、前言
对于transformer,网上的教程使用记号、术语不一 。
最关键的一点,网上各种图的简化程度不一 (画个图怎么能这么偷懒) ,所以我打算自己手画一次图。
看到的最和善(但是不是那么靠谱,我怀疑图有误)的transformer教程:一文了解Transformer全貌(图解Transformer)
注意: 全连接层在概念上输入必须是一维向量,但是实际实现的时候我们会采用批处理将多个样本的向量组拼成矩阵,用矩阵乘法加速运算。如果用单一样本的向量来标注全文可能更清晰,但是为了更贴近实用,约定全文的输入长这个样子而不是向量:
其实,输入也不是矩阵。。。输入是3维张量,三个维度分别是batch_size, number(当前用到的词数), dimension(特征维度)
其中,number没有画出来,你可以按number=1来想,当成矩阵方便一些
一、前置基础中的前置基础
- RNN
- 残差连接(无论什么书,通常会在CNN的ResNet这一节中讲)
- 归一化
- 注意力机制
二、前置基础
- Encoder-Decoder模型
- 自注意力
- 多头注意力
简单介绍一下,
-
Encoder-Decoder模型是为了解决RNN容易忘记前文的问题(即使是LSTM也可能存在这个问题)
-
自注意力

(其中Q、K、V是什么属于“注意力机制”的内容,假设你已经了解了这一块内容并能看懂上面的图)
可以发现,自注意力的作用是把X转换为固定形状的M,便于处理 -
多头注意力
多头注意力本身并不限制使用的是什么注意力来连接起来,Transformer中用的是自注意力。
多头注意力将多个自注意力Concat,是因为这样“并列”的结构能优化最长最短路,而且这样能表达的注意力机制更丰富
三、Transformer
Transformer相比起Seq2Seq模型,区别在于,Seq2Seq中RNN承担了Encoder、Decoder的角色,事实上,Encoder、Decoder可以由多种途径实现,Transformer中RNN不复存在,用的是多头注意力。因此Transformer是一种纯注意力机制的模型。
接下来在一个具体场景中学习Transformer。
目标:做文本翻译
数据集:包含翻译前后的文本,分别为Source和Target
1. 输入原文本Source
Source是单词,所以不能直接扔进神经网络去,需要先编码成向量,既不要损失词本身的信息,也不要损失词所在语句的位置的信息,那就干脆都编码,然后加起来。

2. Encoder

首先先经过多头注意力机制,然后Add&norm
- Add指的是残差连接,使梯度流动更平稳,防止梯度消失/爆炸
- norm本身归一化的目的是为了防止协变量偏移,提高泛化能力,归一化分为两种(层归一化对batch_size归一化,批归一化对dimension进行归一化),这里用的是层归一化
- 关键:多头注意力机制对于注意力的表达更丰富,且本身“注意力”的含义就是对哪个词(所编码的向量)更有偏向(注意力分数,即权重矩阵),也就是说中英文语序这种问题不存在,是靠注意力机制来不定顺序翻译的
矩阵M是原本是三维张量,漏掉的n并不是随意漏的,而是因为翻译不应当和n相关(后面还会具体解释的),所以这一部分是为了丢掉n这个维度。

3. 输入目标文本Target

和Source是一样的,但是Target需要有**“Mask”**,为了避免模型过早“偷窥”到Target后面的内容
4.Decoder
上图也展示了Decoder的第一个多头注意力,还有第二个,第二个与之前的Encoder相连
回忆注意力机制,现在把Encoder想成环境条件Key和Value,Decoder中已经出现的Target(没有被Mask的部分)词,你可能会对其中感兴趣也就是Query,那么你就懂上图为什么这么连了。
接着是熟悉的Dense,和Encoder一样。
用一个Softmax决定生成哪个词,这里再次体现了Dense类似于1×1卷积层的功能。

5. 反向传播进行训练
图中打勾的部分是有参数能学的部分,由于输出是Softmax所以用交叉熵损失函数,链式法则反向传播更新参数。
注意一点,反向传播是等到所有词都依次通过一遍transformer后,再反向传播,以确保模型学习到了整个序列的上下文信息。
由于是翻译任务(有别于gpt那种生成式),还可以发现一个特点:翻译只能提前终止,不能延后终止(如果一次只能生成一个词,那么生成序列长度小于等于原序列)。
相关文章:
【深度学习】Transformer梳理
零、前言 对于transformer,网上的教程使用记号、术语不一 。 最关键的一点,网上各种图的简化程度不一 (画个图怎么能这么偷懒) ,所以我打算自己手画一次图。 看到的最和善(但是不是那么靠谱,我…...
C语言 | Leetcode C语言题解之第118题杨辉三角
题目: 题解: int** generate(int numRows, int* returnSize, int** returnColumnSizes) {int** ret malloc(sizeof(int*) * numRows);*returnSize numRows;*returnColumnSizes malloc(sizeof(int) * numRows);for (int i 0; i < numRows; i) {re…...
以太坊钱包
以太坊钱包是你通往以太坊系统的门户。它拥有你的密钥,并且可以代表你创建和广播交易。选择一个以太坊钱包可能很困难,因为有很多不同功能和设计选择。有些更适合初学者,有些更适合专家。即使你现在选择一个你喜欢的,你可能会决定…...
Vue 怎么定义插件以及使用这个插件
Vue.js插件是一种增强Vue功能的方式,它允许你向Vue中添加全局功能,比如全局方法、指令、过滤器、混入等 创建Vue插件 export default {install(Vue, options) {// 添加全局方法或属性Vue.myGlobalMethod function() {console.log(全局方法调用, optio…...
SQL2017附加从其他电脑复制过来的mdf数据后出现【只读】无法写入数据
1. 尝试给它所在的文件夹的属性中的“只读”去勾,无果。 2. 其他文章提示是文件的问题。 该错误为文件权限错误,找到该数据库的 数据库文件 和 日志文件,在安全中添加 Authenticated Users 用户的权限,并设置 “完全控制”...
Python轴承故障诊断 (21)基于VMD-CNN-BiTCN的创新诊断模型
往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…...
如何运行大模型
简介 要想了解一个模型的效果,对模型进行一些评测,或去评估是否能解决业务问题时,首要任务是如何将模型跑起来。目前有较多方式运行模型,提供client或者http能力。 名词解释 浮点数表示法 一个浮点数通常由三部分组成…...
基于FPGA实现LED的闪烁——HLS
基于FPGA实现LED的闪烁——HLS 引言: 随着电子技术的飞速发展,硬件设计和开发的速度与效率成为了衡量一个项目成功与否的关键因素。在传统的硬件开发流程中,工程师通常需要使用VHDL或Verilog等硬件描述语言来编写底层的硬件逻辑࿰…...
平常心看待已发生的事
本篇主要记录自己在阅读此篇文章(文章链接: 这才是扼杀员工积极性的真正原因(管理者必读) )和这两天京东的东哥“凡是长期业绩不好,从来不拼搏的人,不是我的兄弟”观点后的一些想法。 自己在微…...
docker image分析利器之dive
dive是一个用于研究 Docker 镜像、层内容以及发现缩小 Docker/OCI 镜像大小方法的开源工具. 开源地址: dive github 为了有个直观的印象, 可以先看一下repo文档中的gif图: 安装 在Ubuntu/Debian系统下,可以使用deb包安装: DIVE_VERSION$(curl -sL "https:/…...
java组合设计模式Composite Pattern
组合设计模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。 // Component - 图形接口 interface Graphic {void draw()…...
每天五分钟深度学习:如何使用计算图来反向计算参数的导数?
本文重点 在上一个课程中,我们使用一个例子来计算函数J,也就相当于前向传播的过程,本节课程我们将学习如何使用计算图计算函数J的导数。相当于反向传播的过程。 计算J对v的导数,dJ/dv3 计算J对a的导数,dJ/da…...
常见排序算法之选择排序
目录 一、选择排序 1.1 什么是选择排序? 1.2 思路 1.2.1 思路一 1.2.2 优化思路 1.3 C语言源码 1.3.1 思路一 1.3.2 优化思路 二、堆排序 2.1 调整算法 2.1.2 向上调整算法 2.1.3 向下调整算法 2.2 建堆排序 一、选择排序 1.1 什么是选择排序…...
Redis 事件机制 - AE 抽象层
Redis 服务器是一个事件驱动程序,它主要处理如下两种事件: 文件事件:利用 I/O 复用机制,监听 Socket 等文件描述符上发生的事件。这类事件主要由客户端(或其他Redis 服务器)发送网络请求触发。时间事件&am…...
Java | Leetcode Java题解之第118题杨辉三角
题目: 题解: class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> ret new ArrayList<List<Integer>>();for (int i 0; i < numRows; i) {List<Integer> row new…...
DNS 解析过程
文章目录 简介特点查询方式⚡️1. 浏览器缓存2. 系统缓存(hosts文件)3. 路由器缓存4. 本地域名服务器5. 根域名服务器6. 顶级域名服务器7. 权限域名服务器8. 本地域名服务器缓存并返回9. 操作系统缓存并返回10. 浏览器缓存并访问流程图 总结 简介 DNS&a…...
Golang | Leetcode Golang题解之第118题杨辉三角
题目: 题解: func generate(numRows int) [][]int {ans : make([][]int, numRows)for i : range ans {ans[i] make([]int, i1)ans[i][0] 1ans[i][i] 1for j : 1; j < i; j {ans[i][j] ans[i-1][j] ans[i-1][j-1]}}return ans }...
操作系统实验——线程与进程
如果代码或文章中,有什么错误或疑惑,欢迎交流沟通哦~ ## 进程与线程的区别 1. **各自定义**: 进程是操作系统进行资源分配和调度的一个独立单位,具有一定独立功能的程序关于某个数据集合的依次运行活动。 线程被称为轻量级的进程…...
最强端侧多模态模型MiniCPM-V 2.5,8B 参数,性能超越 GPT-4V 和 Gemini Pro
前言 近年来,人工智能领域掀起了一股大模型热潮,然而大模型的巨大参数量级和高昂的算力需求,限制了其在端侧设备上的应用。为了打破这一局限,面壁智能推出了 MiniCPM 模型家族,致力于打造高性能、低参数量的端侧模型。…...
Spring Boot中如何查询PGSQL分表后的数据
数据库用的pgsql,在表数据超过100w条的时候执行定时任务进行了分表,分表后表名命名为原的表名后面拼接时间,如原表名是card_device_trajectory_info,分表后拼接时间后得到card_device_trajectory_info_20240503,然后分…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
