Transformer的前世今生 day06(Self-Attention和RNN、LSTM的区别)
Self-Attention和RNN、LSTM的区别
- RNN的缺点:无法做长序列,当输入很长时,最后面的输出很难参考前面的输入,即长序列会缺失上文信息,如下:
- 可能一段话超过50个字,输出效果就会很差了
- 可能一段话超过50个字,输出效果就会很差了
- LSTM通过忘记门、输入门、输出门、记忆单元,来有选择性的记忆之前的信息,如下:
- 可能一段话超过200个字,输出效果才会很差
- 可能一段话超过200个字,输出效果才会很差
- 总结:RNN和LSTM无法解决长序列依赖问题,而且它们都是序列模型,必须上一个做完了才能做下一个,无法做并行
- Self-Attention针对以上的两个问题,有以下解决
- 1、由于集合中的每一个词都会和其他的词做相似度计算,所以即使序列再长,两个词之间的联系都能通过相似度存储到它们的词向量上,保留下来。
- 1、由于集合中的每一个词都会和其他的词做相似度计算,所以即使序列再长,两个词之间的联系都能通过相似度存储到它们的词向量上,保留下来。
- 2、由于我们将集合中的每一个词都要得到它的Q、K、V,并要做相似度计算以及乘和操作,所以不需要等前一个词做完了才能做下一个词,而是可以很多个词一起做,可以做并行,如下:
- 而且,通过Self-Attention得到的新的词向量具有句法特征和语义特征(词向量的表征更完善)
- 但是,Self-Attention的计算量特别大(集合中的每一个单词和其他所有单词都要计算相似度),所以在文本量为50个单词左右,模型的效果最好。而LSTM虽然没有解决长序列依赖,但是它在处理长文本任务时,文本量在200个单词左右,模型的效果最好
RNN(循环神经网络)
- RNN,当前的输出 o t o_t ot取决于上一个的输出 o t − 1 o_{t-1} ot−1(作为当前的输入 x t − 1 x_{t-1} xt−1)和当前状态下前一时间的隐变量 h t h_t ht,隐变量和隐变量的权重 W h h W_hh Whh存储当前状态下前一段时间的历史信息,如果我们去掉 W h h ∗ h t − 1 W_{hh} * h_{t-1} Whh∗ht−1,RNN就退化为MLP
- 在RNN中,我们根据前一个的输出和当前的隐变量,就可以预测当前的输出。当前的隐变量也是由上一个隐变量和前一个输出
(即当前的输入)所决定的
- 所以RNN其实就是MLP多了一个时间轴,能存储前一段时间的历史信息,并根据这个历史信息来更新层的参数
- 同时由于RNN会不加选择的存储前一段时间的历史信息,所以如果序列太长,即句子太长,隐变量会存储太多信息,那么RNN就不容易提取很早之前的信。
- 同时由于RNN会不加选择的存储前一段时间的历史信息,所以如果序列太长,即句子太长,隐变量会存储太多信息,那么RNN就不容易提取很早之前的信。
GRU(门控神经网络)
- 为了解决RNN处理不了很长的序列,我们可以有选择的存储历史信息,通过更新门和重置门,来只关注有变化的重点信息
- GRU引入了 R t R_t Rt、 Z t Z_t Zt、 H ~ t \widetilde{H}_t H t
- 其中 R t R_t Rt、 Z t Z_t Zt为控制单元,是可以学习的参数,由于最后用了sigmoid函数,所以范围在(0,1),表示要不要进行Reset和Update操作
- 其中 H ~ t \widetilde{H}_t H t为候选隐变量,跟 R t R_t Rt有关, R t ∗ H t − 1 R_t * H_{t-1} Rt∗Ht−1表示:候选隐变量要使用多少过去隐变量的信息
- 而 H t H_t Ht为真正的新的隐变量,跟 Z t Z_t Zt有关, ( 1 − Z t ) ⊙ H ~ t (1 - Z_t)\odot\widetilde{H}_t (1−Zt)⊙H t表示:新的隐变量要使用多少当前输入的信息
- 通常情况下:GRU会在以下极端情况中,进行可学习的调整,来决定是多去看当前的输入信息,还是多去看前一次的隐变量
- 极端情况如下:
- 其中 R t R_t Rt、 Z t Z_t Zt为控制单元,是可以学习的参数,由于最后用了sigmoid函数,所以范围在(0,1),表示要不要进行Reset和Update操作
- 当 Z t Z_t Zt为0, R t R_t Rt为1时: H t H_t Ht = H ~ t \widetilde{H}_t H t,不遗忘前一次的隐变量,GRU就退化为RNN
- 当 Z t Z_t Zt为1时:不考虑候选隐变量, H t H_t Ht = H t − 1 H_{t-1} Ht−1,即不使用 X t X_t Xt更新隐变量,当前隐变量和上一次的隐变量相同
- 当 R t R_t Rt为0, Z t Z_t Zt为0时: H t H_t Ht = H ~ t \widetilde{H}_t H t,不使用前一次的隐变量,只用 X t X_t Xt来更新隐变量
LSTM(长短期记忆网络)
- LSTM和GRU都是实现这个效果:是要多去看现在的输入信息,还是要多去看前一次的隐变量,即过去的信息
- 但是LSTM可以多实现一个效果:什么都不看,直接重置清零
- LSTM中的状态有两个: C t C_t Ct记忆单元、 H t H_t Ht隐变量
- 注意:LSTM额外引入的 C t C_t Ct记忆单元, C t C_t Ct的范围无法保证,可以用来增加模型复杂度,多存储信息。但是最终仍然需要让 H t H_t Ht的范围仍在(-1,1)之间,防止梯度爆炸。
- 注意:LSTM中的忘记门、输入门、输出门的具体公式和GRU的更新门、重置门一样
- C ~ t \widetilde{C}_t C t候选记忆单元:LSTM中的候选记忆单元和RNN中的 H t H_t Ht的计算公式一样,没有用到任何门,但是由于最后用了tanh(),所以范围在(-1,1)之间
- C t C_t Ct记忆单元:LSTM中的记忆单元和GRU中的 H t H_t Ht不一样,记忆单元可以既多看上一个的记忆单元,又多看当前的候选记忆单元(当前的输入信息 X t X_t Xt)。记忆单元也可以即不要上一个的记忆单元,又不要当前的候选记忆单元。但是GRU中的 H t H_t Ht为 Z T Z_T ZT和 1 − Z t 1-Z_t 1−Zt,所以要么多看上一个的隐变量,要么多看当前的候选隐变量
- H t H_t Ht隐变量:由于 F t F_t Ft和 I t I_t It都是(0,1),而 C ~ t \widetilde{C}_t C t在(-1,1),但是 C t − 1 C_{t-1} Ct−1可以特别大(跟 C C C的初始值有关),所以上一步的 C t C_t Ct的范围无法保证,那么为了防止梯度爆炸,我们需要再做一次tanh()变换。
- 注意:此时的 O t O_t Ot来控制要不要输出当前的输入信息和前一次的隐变量,当 O t O_t Ot为0时,表示重置清零
- 注意:此时的 O t O_t Ot来控制要不要输出当前的输入信息和前一次的隐变量,当 O t O_t Ot为0时,表示重置清零
- 总结:通过引入记忆单元,LSTM比GRU更灵活,即可以既多看当前的候补记忆单元(当前的输入信息 X t X_t Xt),又可以多看前一个的记忆单元,也可以两者都不看都忘掉。通过引入记忆单元还可以多存储信息。同时保留 H t H_t Ht,防止梯度爆炸,还能重置清零隐变量
参考文献
- 11 Self-Attention相比较 RNN和LSTM的优缺点
相关文章:

Transformer的前世今生 day06(Self-Attention和RNN、LSTM的区别)
Self-Attention和RNN、LSTM的区别 RNN的缺点:无法做长序列,当输入很长时,最后面的输出很难参考前面的输入,即长序列会缺失上文信息,如下: 可能一段话超过50个字,输出效果就会很差了 LSTM通过忘…...

UDP send 出现大量“Resource temporarily unavailable”
背景 最近排查用户现场环境,查看日志出现大量的“send: Resource temporarily unavailable”错误,UDP设置NO_BLOCK模式,send又发生在进程上下文,并且还设置了SO_SNDBUF 为8M,在此情况下为什么还会出现发送队列满的情况…...

怎么拆解台式电脑风扇CPU风扇的拆卸步骤-怎么挑
今天我就跟大家分享一下如何选购电脑风扇的知识。 我也会解释一下机箱散热风扇一般用多少转。 如果它恰好解决了您现在面临的问题,请不要忘记关注本站并立即开始! 文章目录列表:大家一般机箱散热风扇都用多少转? 机箱散热风扇选择…...

Windows安装Odoo结合内网穿透实现公网访问本地企业管理系统
文章目录 前言1. 下载安装Odoo:2. 实现公网访问Odoo本地系统:3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件,是一个一站式全功能ERP及电商平台。 开源性质:Odoo是一个开源的ERP软件,这意味着企…...

Portainer的替代Dockge?又一个Docker Compose管理器?
Dockge:让Docker Compose管理触手可及,一图胜千言,轻松构建与管控您的容器服务栈!- 精选真开源,释放新价值。 概览 Docker,这一开放源代码的创新平台,旨在实现应用程序部署、扩展与运维的自动化…...

Midjourney AI绘图工具介绍及使用
介绍 Midjourney是一款目前被誉为最强的AI绘图工具。只要输入想到的文字,就能通过人工智能产出相对应的图片。 官网只是宣传和登录入口,提供个人主页、订阅管理等功能,Midjourney实际的绘画功能,是在另外一个叫discord的产品中实…...

clang-query 的编译安装与使用示例
1,clang query 概述 作用: 检查一个程序源码的抽象语法树,测试 AST 匹配器; 帮助检查哪些 AST 节点与指定的 AST 匹配器相匹配; 2,clang-query 安装 准备: git clone --recursive https://git…...
echarts数据下钻如何配置
官方范例:https://echarts.apache.org/examples/zh/editor.html?cbar-multi-drilldown 看了一眼范例直接晕了,你这,一堆数据直接写死,这怎么用啊! 一般来说,实现步骤是: 1)后台&a…...
git 提交空目录
git 提交空目录 1. git 无法感应空目录2. git 提交空目录References 1. git 无法感应空目录 Git FAQ https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/GitFaq.html Currently the design of the Git index (staging area) only permits files to be liste…...
【优化方案】Java 将字符串中的星号替换为0-9中的数字,并返回所有可能的替换结果
需求 将输入的字符串中的星号替换为0-9中的数字,并返回所有可能的替换结果,允许存在多个*号。 分析: 在每个星号位置,我们需要进行 0-9 的循环遍历,因此每个星号位置都有 10 种可能性。如果字符数组中有k个星号&#x…...
C语言复习-链表
链表: 特点: 通过 next 指针 把内存上不连续 的几段数据 联系起来 set nu -- 打印行号 概念: 一种数据结构 -- 数据存放的思想 比如 -- 数组 -- 内存连续的一段空间,存放相同类型的一堆数据 缺点 -- 增删元素很 难 -- 不灵活 --> 引入链表 next指针的初步认识…...

Redis面试题-缓存雪崩、缓存穿透、缓存击穿问题
1 穿透: 两边都不存在(皇帝的新装) (黑名单) (布隆过滤器) 2 击穿:一个热点的key失效了,这时大量的并发请求直接到达数据库. (提前预热) 3 雪崩:…...

【Node.js】npx
概述 npx 可以使用户在不安装全局包的情况下,运行已安装在本地项目中的包或者远程仓库中的包。 高版本npm会自带npx命令。 它可以直接运行 node_modules/.bin 下的 exe 可执行文件。而不像之前,我们需要在 scripts 里面配置,然后 npm run …...
hive授予指定用户特定权限及beeline使用
背景:因业务需要,需要使用beeline对hive数据进行查询,但是又不希望该用户可以查询所有的数据,希望有一个新用户bb给他指定的库表权限。 解决方案: 1.赋权语句,使用hive管理员用户在终端输入hive进入命令控…...

Vmware虚拟机无法用root直连说明
Vmware虚拟机无法用root直连说明 背景目的SSH服务介绍无法连接检查配置 背景 今天在VM上新装了一套Centos-stream-9系统,网络适配器的连接方式采用的是桥接,安装好虚拟机后,在本地用ssh工具进行远程连接,ip、用户、密码均是成功的…...

Visio中存在问题的解决方法
公式缩放 mathtype公式在visio缩放之后,出现了变形。 解决方法:每次输入公式都通过 插入->对象->mathType Equation 新建一个公式。可以避免 注:网上有的说在word中使用mathtype编写公式,之后复制到visio中。 插入波形 选择…...

taro之Swiper的使用
图样: 往往我们需要轮播图去显示我们想要的图片之类的 这是工作的代码 <View classNametop-title><SwiperclassNamebanner-swiperinterval{3000}circularautoplay>{homeBannerList.map((item) > {return (<SwiperItem key{item.id}><View…...

正大国际:金融行业发展趋势
2024金融科技趋势研究报告 大模型生态揭秘!金融行业迎来变革,中控成生态核心,大模型在金融行业的应用 随着大模型的不断发展,越来越多的金融机构开始尝试在一些业务场景中引入大模型和生成式A能力,预计2024年,领先的金…...
vue中实现超出一行 展开和收起的功能
html中: <divclass="txttype"ref="txttype"style="margin-bottom: 6px":class="hidetext == true ? hidetext : "><div style="width: 96%"><el-tagtype="info"style="margin-right: 10px&…...

记录一次使用cert-manager-颁发CA证书
一、官网 SelfSigned - cert-manager Documentation 二、例子 apiVersion: v1 kind: Namespace metadata:name: sandbox --- apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata:name: selfsigned-issuer spec:selfSigned: {} --- apiVersion: cert-manager.io/v…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...