详解注意力机制上篇【RNN,Seq2Seq(Encoder-Decoder,编码器-解码器)等基础知识】

NLP-大语言模型学习系列目录

一、注意力机制基础——RNN,Seq2Seq等基础知识
二、注意力机制【Self-Attention,自注意力模型】


🔥 在自然语言处理(NLP)领域,理解和生成自然语言的能力对于构建智能系统至关重要。从文本分类、机器翻译到对话系统,底层技术的不断进步推动了NLP的发展。在这些技术中,循环神经网络(RNN)及其变种如长短期记忆网络(LSTM)、Seq2Seq模型和注意力机制(Attention Mechanism)扮演了重要角色。

📚 本系列博客将从基础知识开始,逐步深入探讨大语言模型在NLP中的应用。我们将从RNN的经典结构出发,介绍其工作原理和局限性,接着探讨Seq2Seq模型及其在机器翻译中的应用,最后深入解读注意力机制及其在现代深度学习模型中的重要性。


文章目录

  • NLP-大语言模型学习系列目录
  • 一、RNN经典结构
  • 二、vector-to-sequence结构
  • 三、sequence-to-vector结构
  • 四、Seq2Seq模型
    • 1 Encoder
    • 2 Decoder
  • 五、Embedding
    • 1 什么是 Embedding?
    • 2 为什么需要 Embedding?
    • 3 Embedding 的实现
    • 4 例子
    • 5 实例:机器翻译
    • 6 总结
  • 参考资料


循环神经网络(Recurrent Neural Network, RNN)是一类以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。对循环神经网络的研究始于二十世纪 80-90 年代,并在二十一世纪初发展为深度学习算法之一,其中双向循环神经网络和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的循环神经网络。

一、RNN经典结构

经典循环神经网络的单个神经元如下图所示,它由输入层、一个隐藏层和一个输出层组成:

截屏2024-05-26 19.18.11
  1. x t x_t xt 是一个向量,它表示t时刻输入层的值;
  2. h t − 1 , h t h_{t-1},h_t ht1,ht 分别表示t-1时刻和t时刻隐藏层的值.

其中 h t h_t ht的计算如下:
h t = f ( U h t − 1 + W x t + b ) , h_t=f(Uh_{t-1}+Wx_t+b), ht=f(Uht1+Wxt+b),
其中 x t ∈ R M \mathbf{x}_t\in\mathbb{R}^M xtRM t t t时刻网络的输入, U ∈ R D × D \mathbf{U}\in\mathbb{R}^{D\times D} URD×D 为状态-状态权重矩阵, W ∈ R D × M \mathbf{W}\in\mathbb{R}^{D\times M} WRD×M为状态-输入权重矩阵, b ∈ R D \mathbf{b}\in\mathbb{R}^D bRD 为偏置向量, f f f激活函数.上面是RNN网络中的单个结点,下面给出长度为 T T T的RNN网络,我们可以更清晰的看到前一时刻对后一时刻的影响.

截屏2024-05-26 19.29.15

现在看上去就比较清楚了, 这个网络在 t \mathrm{t} t 时刻接收到输入 x t \mathrm{x}_{t} xt 之后, 隐藏层的值是 h t h_t ht, 输出值是 y t \mathrm{y}_{t} yt 。关键一点是, h t h_t ht 的值不仅仅取决于 x t \mathrm{x}_{t} xt, 还取决于 h t − 1 \mathrm{h}_{t-1} ht1 。可以用下面的公式来表示循环神经网络的计算方法:
y t = V h t ( 1 ) \mathrm{y}_{t}=V \mathrm{h}_{t}\quad (1) yt=Vht(1)
h t = f ( W x t + U h t − 1 ) ( 2 ) \mathrm{h}_{t}=f\left(W \mathrm{x}_{t}+U \mathrm{h}_{t-1}\right)\quad(2) ht=f(Wxt+Uht1)(2)

  1. 式 1 是输出层的计算公式, 输出层是一个全连接层, 也就是它的每个节点都和隐藏层的每个节点相连, V \mathrm{V} V 是输出层的权重矩阵.
  2. 式 2 是隐藏层的计算公式, 它是循环层。 U \mathrm{U} U 是输入 x x x 的权重矩阵, W \mathrm{W} W 是上一次的值 h t − 1 \mathrm{h}_{t-1} ht1 作为这一次的输入的权重矩阵, f f f 是激活函数.(这里我们省略 b b b

从上面的公式可以看出, 循环层和全连接层的区别就是循环层多了一个权重矩阵 W \mathrm{W} W 。如果反复把式 2 带入到式 1 , 将得到:
y t = V h t = V f ( W x t + U h t − 1 ) = V f ( W x t + U f ( W x t − 1 + U h t − 2 ) ) = V f ( W x t + U f ( W x t − 1 + U f ( W x t − 2 + U h t − 3 ) ) ) = V f ( W x t + U f ( W x t − 1 + U f ( W x t − 2 + U f ( W x t − 3 + … ) ) ) ) \begin{aligned} \mathrm{y}_{t} &=V \mathrm{h}_{t} \\ &=V f\left(W \mathrm{x}_{t}+U \mathrm{h}_{t-1}\right) \\ &=V f\left(W \mathrm{x}_{t}+U f\left(W \mathrm{x}_{t-1}+U \mathrm{h}_{t-2}\right) \right)\\ &=V f\left(W \mathrm{x}_{t}+U f\left(W \mathrm{x}_{t-1}+U f\left(W \mathrm{x}_{t-2}+U \mathrm{h}_{t-3}\right)\right)\right) \\ &=V f\left(W \mathrm{x}_{t}+U f\left(W \mathrm{x}_{t-1}+U f\left(W \mathrm{x}_{t-2}+U f\left(W \mathrm{x}_{t-3}+\ldots\right)\right)\right)\right) \end{aligned} yt=Vht=Vf(Wxt+Uht1)=Vf(Wxt+Uf(Wxt1+Uht2))=Vf(Wxt+Uf(Wxt1+Uf(Wxt2+Uht3)))=Vf(Wxt+Uf(Wxt1+Uf(Wxt2+Uf(Wxt3+))))
从上面可以看出, 循环神经网络的输出值 y t \mathrm{y}_t yt, 是受前面历次输入值 $ x_{t}, x_{t-1}, \cdots,x_1$影响的, 这就是为什么循环神经网络可以往前看任意多个输入值的原因。

Note:

  • 从以上结构可看出,传统的RNN结构的输⼊和输出等⻓.
  • 我们可以看到每个节点会共用参数 W , U , V W,U,V W,U,V.

二、vector-to-sequence结构

有时我们要处理的问题输⼊是⼀个单独的值,输出是⼀个序列。

此时,有两种主要建模⽅式:

  1. ⽅式⼀:可只在其中的某⼀个序列进⾏计算,⽐如序列第⼀个进⾏输⼊计算,其建模⽅式如下:
    截屏2022-06-02 下午8.13.43
  2. 把输⼊信息X作为每个阶段的输⼊,其建模⽅式如下:
    截屏2022-06-02 下午8.14.19

三、sequence-to-vector结构

有时我们要处理的问题输⼊是⼀个序列,输出是⼀个单独的值,此时通常在最后的⼀个序列上进⾏输出变换,其建模如下所⽰:

截屏2024-05-26 16.56.09

四、Seq2Seq模型

RNN最重要的一个变种:Seq2Seq,这种结构又叫Encoder-Decoder模型。

原始的sequence-to-sequence结构的RNN要求序列等长,然⽽我们遇到的⼤部分问题序列都是不等长的,如机器翻译中,源语⾔和⽬标语⾔的句⼦往往并没有相同的长度。

1 Encoder

将输⼊数据编码成⼀个上下⽂向量 c,这部分称为Encoder,其⽰意如下所⽰:

截屏2022-06-02 下午8.19.38

得到c有多种⽅式:

  1. 最简单的⽅法就是把Encoder的最后⼀个隐状态赋值给c : c = h 4 c=h_4 c=h4
  2. 还可以对最后的隐状态做⼀个变换得到 : c = q ( h 4 ) c=q(h_4) c=q(h4)
  3. 也可以对所有的隐状态做变换: c = q ( h 1 + h 2 + h 3 + h 4 ) c=q(h_1+h_2+h_3+h_4) c=q(h1+h2+h3+h4)

2 Decoder

拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。具体做法就是将c当做初始状态输入到Decoder中:

截屏2022-06-02 下午8.24.57

还可以将c作为Decoder的每⼀步输⼊,⽰意图如下所⽰:

截屏2022-06-02 下午8.26.20

由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:

  • 机器翻译,Encoder-Decoder的最经典应用,事实上这一结构就是在机器翻译领域最先提出的;
  • 文本摘要,输入是一段文本序列,输出是这段文本序列的摘要序列;
  • 阅读理解,将输入的文章和问题分别编码,再对其进行解码得到问题的答案;
  • 语音识别,输入是语音信号序列,输出是文字序列。

五、Embedding

1 什么是 Embedding?

Embedding 是一种将离散的、高维的输入数据(如单词或符号)转换为连续的、低维的向量表示的方法。其目的是捕捉输入数据中的语义和结构信息,使其在向量空间中具有有意义的分布。

2 为什么需要 Embedding?

在 NLP 中,原始的文本数据通常由单词、子词或字符组成,这些元素本质上是离散的符号。传统的处理方法(如 one-hot 编码)会将每个单词表示为一个高维的稀疏向量,缺点如下:

  1. 维度过高:词汇表中的每个单词都需要一个独立的维度,对于大型词汇表,这会导致向量的维度非常高。
  2. 稀疏性:大多数维度都是 0,只有一个维度是 1,这导致向量非常稀疏。
  3. 缺乏语义信息:one-hot 向量无法捕捉单词之间的语义关系,如“国王”与“王后”之间的关系。

Embedding 方法通过学习一个低维的、连续的向量表示来解决这些问题。每个单词或符号都被表示为一个实数向量,这些向量在训练过程中被优化,以捕捉单词之间的语义和语法关系。

3 Embedding 的实现

在深度学习模型(如 Transformer)中,embedding 通常通过一个可训练的查找表实现。查找表的每一行对应一个词汇表中的单词,行中的值是该单词的嵌入向量。这些嵌入向量在模型训练过程中不断调整,以优化模型的性能。

具体步骤如下:

  1. 初始化:将每个单词初始化为一个随机的或预训练的向量。
  2. 训练:在训练过程中,模型根据任务目标不断调整这些向量,使得它们能够更好地表示单词的语义和语法信息。
  3. 使用:训练完成后,这些向量就可以用于各种 NLP 任务,如文本分类、情感分析、机器翻译等。

4 例子

假设我们有一个简单的词汇表:[“猫”, “狗”, “鱼”]。通过 embedding 层,这些单词会被转换为低维的向量,如:

  • “猫” -> [0.2, -1.3, 0.5]
  • “狗” -> [0.3, -1.2, 0.4]
  • “鱼” -> [-0.5, 0.8, -0.1]

这些向量的维度通常比原始 one-hot 向量的维度小得多(如 300 维,而不是数万维),并且这些向量可以捕捉到单词之间的语义相似性。例如,“猫”与“狗”的向量可能比较接近,而“鱼”的向量则相对远一些。

5 实例:机器翻译

神经机器翻译(Neural Machine Translation, NMT)是一种基于深度学习技术的机器翻译方法。与传统的统计机器翻译(Statistical Machine Translation, SMT)不同,NMT 使用神经网络模型来直接建模源语言到目标语言之间的翻译过程。下图是Encoder编码的过程:

截屏2024-07-09 10.30.50

Note:

  1. 在翻译的时候,我们需要对词进行Embedding,将其变成一个连续的向量表达.
  2. v i v_i vi表示每个输入的词,通过embedding变成向量 s i s_i si,方便后续的处理, W W W是embedding过程中可学习的参数矩阵.
  3. 得到 s i s_i si后,我们就可以按照前面介绍的方法进行Encoding.

Decoder的过程如下图所示:

截屏2024-07-09 10.33.31

Note:

  1. z i − 1 \mathbf{z}_{i-1} zi1为上一个节点的隐藏值, u i u_i ui为上一个节点的输出;
  2. 用Softmax来得到预测的每个词的概率,概率最大的作为当前预测词.

6 总结

Embedding 是一种将离散的输入数据转换为连续的、低维向量表示的方法,广泛应用于自然语言处理任务中。它能够有效地捕捉单词之间的语义和语法关系,提高模型的处理能力和表现。在 Transformer 等深度学习模型中,embedding 层是关键组成部分,负责将输入序列转换为模型可以处理的向量形式。

参考资料

  1. 深度学习500问
  2. 邱锡鹏,神经网络与深度学习,机械工业出版社,https://nndl.github.io/, 2020.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第22天|基于MindSpore的红酒分类实验

基于MindSpore的红酒分类实验 K近邻算法实现红酒聚类 1、实验目的 了解KNN的基本概念;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法(K-Nearest-Neighbor, KNN)是一种用于分类和回归的非参数统计方法,…

WSL-Ubuntu20.04环境使用YOLOv8 TensorRT推理加速

在阅读本章内容之前,需要把部署环境以及训练环境都安装好。 1.TensorRTX下载 这里使用Wang-xinyu大佬维护的TensorRTX库来对YOLOv8进行推理加速的演示,顺便也验证一下前面环境配置的成果。 github地址:GitHub - wang-xinyu/tensorrtx&#x…

SourceTree rebase(变基)的使用

参考资料 【Sourcetree】コミットを一つにまとめる【Sourcetree】リベースする 目录 前提0.1 merge与rebase0.2 merge合并分支0.3 rebase合并分支0.4 💥超级注意事项💥 一. 代码已提交,未推送,交互式变基1.1 通过SourceTree操作1…

Richtek立锜科技可用于智能门铃的电源管理解决方案

新型的智能门铃不仅能满足呼叫、提醒的需要,还能在线监控、远程操作、闯入通知、记录过程,系统构成相对复杂,与传统门铃相比有了很大的改变。 从电源管理的角度来观察,满足这样需求的系统构成也相对复杂: 处于外置状态…

ElementUIV12相关使用方法

今日内容 零、 复习昨日 零、 复习昨日 一、Element UI Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 官网: https://element.eleme.cn/#/zh-CN Element Plus,基于 Vue 3,面向设计师和开发者的组件库 官网: htt…

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据,我们生成了多种图表,包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

从产品手册用户心理学分析到程序可用性与易用性的重要区别

注:机翻,未校对。 Designing for People Who Have Better Things To Do With Their Lives 为那些生活中有更重要事情要做的人设计 When you design user interfaces, it’s a good idea to keep two principles in mind: 在设计用户界面时,…

微软Office PLUS办公插件下载安装指南

微软OfficePLUS插件下载安装指南 简介: OfficePLUS微软官方出品的Office插件 ,OfficePLUS拥有30万高质量模板素材,能帮助Word、Excel、Powerpoint、PDF等多种办公软件提升效率,具有智能化、模板质量高、运行快、稳定性强等优点。…

探索Facebook:数字社交的魔力源泉

在当今信息爆炸和全球互联的时代,社交媒体平台成为了人们生活中不可或缺的一部分。而在这些平台中,Facebook无疑是最具影响力和创新性的代表之一。自2004年成立以来,Facebook不仅改变了人们的沟通方式,更通过不断的技术创新和用户…

Pycharm与Gitlab交互

环境准备 1、下载配置好本地Git 2、配置Pycharm上的Git 3、gitlab账号 Gitlab配置 Gitlab配置中文 账号》设置》偏好设置》简体中文 创建项目 命令行操作 打开项目会展示以下步骤 在pycharm克隆gitlab的项目 通过菜单栏 1、在PyCharm的顶部菜单栏中,选择“V…

探索智能合约在金融科技中的前沿应用与挑战

随着区块链技术的发展和普及,智能合约作为其核心应用之一,在金融科技(FinTech)领域中展现出了巨大的潜力和挑战。本文将深入探讨智能合约的基本概念、前沿应用案例,以及面临的技术挑战和发展趋势,旨在帮助读…

R语言进行集成学习算法:随机森林

# 10.4 集成学习及随机森林 # 导入car数据集 car <- read.table("data/car.data",sep ",") # 对变量重命名 colnames(car) <- c("buy","main","doors","capacity","lug_boot","safety"…

昇思25天学习打卡营第11天|RNN实现情感分类

概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This film is great 正确标…

SpringBoot之健康监控(Actuator)

1&#xff0c;基本介绍 Spring Actuator 是 Spring Boot 提供的一个扩展模块&#xff0c;用于监控和管理应用程序的生产环境。它通过 HTTP 端点暴露了大量的监控和管理功能&#xff0c;使得开发者可以在运行时查看应用程序的运行状况、配置信息、性能指标等。 主要功能&#…

【Qt】探索Qt框架:开发经典贪吃蛇游戏的全过程与实践

文章目录 引言项目链接&#xff1a;1. Qt框架的使用简介2. 贪吃蛇游戏设计2.1 游戏规则和玩法介绍2.2 游戏界面设计概述 3. 核心代码解析3.1 主界面&#xff08;GameHall&#xff09;3.1.1 布局和功能介绍3.1.2 代码实现分析 3.2 游戏选择界面&#xff08;GameSelect&#xff0…

WPF+MvvmLight 项目入门完整教程(一)

WPF+MvvmLight入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架…

redis原理之底层数据结构(二)-压缩列表

1.绪论 压缩列表是redis最底层的结构之一&#xff0c;比如redis中的hash&#xff0c;list在某些场景下使用的都是压缩列表。接下来就让我们看看压缩列表结构究竟是怎样的。 2.ziplist 2.1 ziplist的组成 在低版本中压缩列表是由ziplist实现的&#xff0c;我们来看看他的结构…

uniapp 微信小程序根据后端返回的文件链接打开并保存到手机文件夹中【支持doc、docx、txt、xlsx等类型的文件】

项目场景&#xff1a; 我们在使用uniapp官方提供的uni.downloadFile以及uni.saveFile时&#xff0c;会发现这个文件下载的默认保存位置和我们预想的不太一样&#xff0c;容易找不到&#xff0c;而且没有提示&#xff0c;那么我们就需要把文件打开自己保存并且有提示保存到哪个…

fastadmin导入vue

前台 require-frontend.js或frontend-init.js 后台 require-backend.js或backend-init.js 后台 方法一 require-backend.js 在 paths 中加入’vue’:‘…/libs/vue/vue.min’, 在shim 中加入 paths: {............vue:../libs/vue/vue.min, } shim: {............vue: {ex…

acrobat 中 PDF 复制时不能精确选中所选内容所在行的一种解决方法

现象&#xff1a;划取行的时候&#xff0c;自动扩展为多行 如果整段选中复制&#xff0c;粘贴后是乱码 解决步骤 识别完&#xff0c;保存 验证 可以按行复制了。 如果遇到仅使用 acrobat OCR 不能彻底解决的&#xff0c;更换其他自己熟悉的进行 OCR。