Encoder-Decoder框架与Attention机制

本文详细介绍了深度学习中的Encoder-Decoder框架及其在聊天机器人、机器翻译等任务中的应用。重点讨论了Attention机制,包括其计算相似度矩阵的不同方法,以及Self-Attention和Multihead Self-Attention的工作原理。Attention机制通过关注输入序列中的关键信息,提高了模型处理序列数据的效率和准确性。同时,Self-Attention作为RNN的替代,实现了并行计算,增强了模型的性能。

Attention机制 – 潘登同学的深度学习笔记

Encoder-Decode框架

要了解深度学习中的注意力模型,就不得不先谈 Encoder-Decoder 框架,因为目前大多数注意力模型附着在 Encoder-Decoder 框架下,当然,其实注意力模型可以看作一种通用的思想,本身并不依赖于特定框架,这点需要注意。

Encoder-Decoder 框架可以看作是一种深度学习领域的研究模式,应用场景异常广泛。下图是文本处理领域里常用的 Encoder-Decoder 框架最抽象的一种表示

在这里插入图片描述

文本处理领域的 Encoder-Decoder 框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对 < S o u r c e , T a r g e t > <Source,Target> <Source,Target>,我们的目标是给定输入句子 Source,期待通过Encoder-Decoder 框架来生成目标句子 Target。Source 和 Target 可以是同一种语言,也可以是两种不同的语言。而 Source 和 Target 分别由各自的单词序列构成

S o u r c e = ( x 1 , x 2 , … , x m ) T a r g e t = ( y 1 , y 2 , … , y n ) Source = (x_1,x_2,\ldots,x_m) \\ Target = (y_1,y_2,\ldots,y_n) \\ Source=(x1,x2,,xm)Target=(y1,y2,,yn)
Encoder 顾名思义就是对输入句子 Source 进行编码,将输入句子通过非线性变换转化为中间语义表示 C
C = F ( x 1 , x 2 , … , x m ) C = F(x_1,x_2,\ldots,x_m) C=F(x1,x2,,xm)
对于解码器 Decoder 来说,其任务是根据句子 Source 的中间语义表示 C 和之前已经生成的历史信息 y 1 , y 2 , … , y i − 1 y_1,y_2,\ldots,y_{i-1} y1,y2,,yi1来生成i时刻要生成的单词
y i = G ( C , y 1 , y 2 , … , y i − 1 ) y_i = G(C,y_1,y_2,\ldots,y_{i-1}) yi=G(C,y1,y2,,yi1)

  • 每个 yi 都依次这么产生,那么看起来就是整个系统根据输入句子 Source 生成了目标句子 Target。如果 Source 是中文句子,Target 是英文句子,那么这就是解决机器翻译问题的 Encoder-Decoder 框架;
  • 如果 Source 是一篇文章,Target 是概括性的几句描述语句,那么这是文本摘要的 Encoder-Decoder 框架;
  • 如果 Source 是一句问句,Target 是一句回答,那么这时问答系统或者对话机器人的 Encoder-Decoder 框架。由此可见,在文本处理领域,Encoder-Decoder 的应用领域相当广泛。
  • Encoder-Decoder 框架不仅仅在文本领域广泛使用,在语音识别、图像处理等领域也经常使用。比如对于语音识别来说,上图所示的框架完全适用,区别无非是 Encoder 部分的输入是语音流,输出是对应的文本信息;

在这里插入图片描述

Encoder-Decode应用于聊天机器人

聊天机器人是一种many to many的网络拓扑结构,核心还是用Encoder-Decoder对不同长度的序列进行处理

数据预处理

在这里插入图片描述

训练模型

在这里插入图片描述

模型应用

在这里插入图片描述

Attention机制

注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影。

觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。这是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。

在这里插入图片描述

简单的描述一下上图,Attention机制主要是在Decoder的地方加了一层Attention Layer,以往Decoder从Encoder中获取的信息只有Encoder最后的隐状态,包含的信息量不够,或者说在做翻译任务的时候,我们拿笼统的一句话去做翻译是效率比较低的,要关注不同语言相同语义的词语的位置信息,如中文: 你好吗? 英文: How are you? 的位置不同,的位置也不同,Attention机制就是解决这种问题的;

所以在每个Dncoder隐状态 S i S_i Si向下一时刻传递的时候,会将 S i S_i Si与Encoder的每一时刻的隐状态 h 1 , … , h n h_1, \ldots, h_n h1,,hn计算相似度, 再将相似度进行softmax归一化操作,得到权重(使得权重之和为1), 再用权重与各个隐状态相乘相加得到 C i C_i Ci, 这个 C i C_i Ci就是Attention Layer的产物,最后将 S i , C i , O u t p u t i − 1 S_i,C_i,Output_{i-1} Si,Ci,Outputi1(上一时刻的输出,这一时刻的输入)进行拼接,再计算得到结果(Encoder的隐状态不会受 C i C_i Ci的影响,只是最终经过FC的时候,拼接了一个 C i C_i Ci)

注意 这里说的下标,与上图标注的有一些偏差,以上图来说,就是 S i , C i − 1 , S i − 1 S_i,C_{i-1},S_{i-1} Si,Ci1,Si1进行拼接;(具体要看S与C从几开始数,如果都是从0开始数的话,上图就是正确的,如果S从0开始数,C从1开始说,那么上文就是正确的,理解即可)

计算相似度矩阵的方式

论文提出的方法

S 0 S_0 S0去计算权重为例

在这里插入图片描述

其中 V T , W V^T,W VT,W都是要计算的矩阵,然后对每个计算出的 α i ~ \tilde{\alpha_i} αi~进行softmax变换,得到 α i \alpha_i αi

更常用的方法

在这里插入图片描述

其中 W K , W Q W_K,W_Q WK,WQ都是要计算的矩阵

Self-Attention机制

前面说的Attention机制是在Encoder与Decoder之间计算相似性的一种方式,关注的点在于两种不同序列的相关关系,而Self-Attention则是在Encoder或Decoder中,取代RNN或者LSTM层的一种机制,因为RNN不能很好的做到并行计算,总是会有序列依赖,导致计算只能串行

在这里插入图片描述

上图就是Self-Attention计算第一个时刻的上下文向量的过程,计算的 b i b_i bi都不依赖于序列信息,可以并行计算

Multi head

Self-Attention的作者认为一组 W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv矩阵还不够爽,于是拿了 j j j W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv,计算 b i , j b_{i,j} bi,j,最后将 j j j组b拼接起来,再乘上矩阵 W O W^O WO得到一个时刻的上下文向量 b i b_i bi

在这里插入图片描述

在这里插入图片描述

Attention与Self-Attention的区别

如下图所示,线越深表示两者关系越紧密,在英语中的area与在法语中的zone的意思是相同的,只是两种语言之间的语法有区别(我猜的…),所以Attention是用于解决Decoder应该侧重学习Encoder的哪些方面的问题

在这里插入图片描述

如下图所示,线越深表示两者关系越紧密,Self-attention的作用可以总结为指代消歧,能得出某一个序列内部词语的相关性,将一些指代不明的词转换成有意义的词语,或者能记住一些固定搭配…

在这里插入图片描述

在这里插入图片描述

在self-Attention下的一个Encoder

在这里插入图片描述

<think> 首先,用户的问题是:“我想查找encoder - decoder框架的训练数据格式 请问encoder - decoder框架训练数据的格式”。用户想知道Encoder-Decoder框架的训练数据格式。 从系统指令中,我需要: - 使用中文回答。 - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$格式并单独成段。 - LaTeX语法正确。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 参考站内引用,但用户提供了引用内容: - 引用[1]: Encoder-Decoder框架的结构。 - 引用[2]: 使用PyTorch实现。 - 引用[3]: Encoder-Decoder架构的核心思想。 - 引用[4]: Encoder-Decoder框架Attention机制。 用户说“上述引用仅供参考”,但我应该尽可能参考用户上一次的问题和我的回答。用户上一次的问题是关于Encoder-Decoder训练数据格式,所以我需要专注于这个问题。 用户没有指定上一次的问题,所以我只能基于当前上下文。系统指令说“参考用户上一次的问题和你的回答”,但既然这是新对话的开始,我应该基于当前问题回答。 现在,回答结构: - 结构清晰,逐步解决问题。 - 保证回答真实可靠。 内容要点: - Encoder-Decoder框架常用于序列到序列的任务,如机器翻译、文本摘要等。 - 训练数据格式取决于任务类型,但因为框架处理序列,数据通常是一对输入序列和输出序列。 - 例如,在机器翻译中,输入是源语言句子,输出是目标语言句子。 - 数据格式通常是: - 输入序列: [token1, token2, ..., token_n] - 输出序列: [token1, token2, ..., token_m] - 在实际实现中,如PyTorch,数据可能需要tokenized和padded。 从引用: - 引用[1]提到文本处理领域。 - 引用[2]说使用PyTorch实现序列到序列任务。 - 引用[3]讨论Encoder-Decoder架构。 - 引用[4]提到注意力机制,但数据格式没有直接说明。 所以,我需要基于一般知识回答: - 训练数据格式: - 输入:一个序列,如单词序列或字符序列。 - 输出:另一个序列。 - 通常存储为文本文件或数据集对象,每行或每个样本包含输入序列和输出序列。 - 具体格式: - 在PyTorch中,可以使用Dataset类,定义输入和输出。 - 例如,源序列和目标序列,可能需要vocabulary mapping。 在回答中,自然地添加引用标识: - 当提到Encoder-Decoder框架的一般概念时,引用[1]或[3]。 - 当提到PyTorch实现时,引用[2]。 - 当提到注意力机制时,引用[4]。 生成相关问题: - 在末尾,生成相关问题,如示例所示。 回答结构: 1. 介绍Encoder-Decoder框架。 2. 解释训练数据格式。 3. 举例说明。 4. 提供代码片段(如果需要,但用户问的是格式)。 5. 生成相关问题。 确保使用中文。 最终输出: - 回答部分。 - §§相关问题§§部分。 </think> ### Encoder-Decoder 框架的训练数据格式 Encoder-Decoder 框架是一种深度学习架构,广泛应用于序列到序列的任务,如机器翻译、文本摘要和语音识别等[^1]。训练数据格式是框架实现的基础,其核心是为模型提供输入序列和对应的输出序列对。下面我将逐步解释训练数据的格式要求和常见实践。 #### 1. **训练数据的基本格式** - Encoder-Decoder 框架的训练数据通常包含成对的输入序列和输出序列: - **输入序列(Encoder 输入)**:表示源数据,如一个句子的单词序列。 - **输出序列(Decoder 输入和输出)**:表示目标数据,如翻译后的句子序列。 - 在训练时,输出序列通常分为两部分:Decoder 的输入(起始标记如`<sos>`加上目标序列)和预期输出(目标序列加上结束标记如`<eos>`)。 - 数据格式要求: - **序列表示**:序列中的每个元素通常是 token(如单词、字符或子词)。例如,在文本任务中,序列被 tokenized 为整数索引(基于词汇表)。 - **对齐长度**:输入和输出序列长度可以不同(如机器翻译中源句和目标句长度不一致),因此数据需要处理 padding(填充)以对齐序列批次(batch)。 - 例如,输入序列长度 $n$ 和输出序列长度 $m$,满足 $n \neq m$ 是常见的。 - **文件格式**:数据通常存储为文本文件(如 CSV、TSV 或 JSON 格式),每行包含一个样本: ``` source_sequence target_sequence ``` 或者更结构化格式: ```json {"input": "source sequence text", "output": "target sequence text"} ``` #### 2. **具体格式示例(以机器翻译为例)** - 假设任务是英语到法语翻译: - **原始文本数据**:输入序列(英文句子)和输出序列(法语句子)。 ``` English: "Hello world" French: "Bonjour le monde" ``` - **Tokenized 格式**:使用词汇表映射为整数序列(例如,词汇表文件 `vocab.txt`): - 输入序列 tokenized: `[2, 3]`(假设 "Hello"=2, "world"=3) - 输出序列 tokenized: `[5, 6, 7]`("Bonjour"=5, "le"=6, "monde"=7) - **添加特殊标记**:为了训练,序列需要添加起始标记(`<sos>`, start of sequence)和结束标记(`<eos>`, end of sequence): - Decoder 输入: `[<sos>, 5, 6, 7]`(例如索引=0) - Decoder 输出: `[5, 6, 7, <eos>]`(预期输出) - **批次处理**:在 PyTorch 等框架中,数据被组织为批次,使用 padding 对齐: - 输入批次(Encoder 输入):形状为 `(batch_size, max_seq_len)`,例如: $$ \begin{bmatrix} 2 & 3 & \texttt{<pad>} \\ ... & ... & ... \end{bmatrix} $$ - 输出批次(Decoder 输入和输出):类似处理。 - 引用[^2]中提到的 PyTorch 实现,常常使用 `Dataset` 和 `DataLoader` 类来管理这种格式的数据。 #### 3. **实现中的数据处理流程** - **步骤概述**: 1. **数据加载**:从原始文本文件读取输入-输出对。 2. **Tokenization**:使用分词器(如 spaCy 或 BPE)将文本转为 token 序列。 3. **词汇表映射**:构建词汇表,将 token 映射为整数索引。 4. **序列填充(Padding)**:添加 padding tokens(如 `<pad>`) 使所有序列长度一致,便于批处理。 5. **批次生成**:在训练循环中,使用 `DataLoader` 生成批次。 - **代码片段示例(基于 PyTorch)**: 以下是简化的数据准备代码,展示格式处理: ```python import torch from torch.utils.data import Dataset, DataLoader from torch.nn.utils.rnn import pad_sequence # 自定义数据集类 class Seq2SeqDataset(Dataset): def __init__(self, inputs, outputs, sos_token, eos_token, pad_token): self.inputs = inputs # 输入序列列表,如 [[2, 3], ...] self.outputs = outputs # 输出序列列表,如 [[5, 6, 7], ...] self.sos_token = sos_token # 起始标记索引 self.eos_token = eos_token # 结束标记索引 self.pad_token = pad_token # 填充标记索引 def __len__(self): return len(self.inputs) def __getitem__(self, idx): input_seq = torch.tensor(self.inputs[idx]) output_seq = torch.tensor([self.sos_token] + self.outputs[idx]) target_seq = torch.tensor(self.outputs[idx] + [self.eos_token]) return input_seq, output_seq, target_seq # 创建数据加载器,处理 padding def collate_fn(batch): inputs, outputs, targets = zip(*batch) inputs_padded = pad_sequence(inputs, batch_first=True, padding_value=pad_token) outputs_padded = pad_sequence(outputs, batch_first=True, padding_value=pad_token) targets_padded = pad_sequence(targets, batch_first=True, padding_value=pad_token) return inputs_padded, outputs_padded, targets_padded # 示例数据 inputs_list = [[2, 3], [1, 4]] # tokenized 输入序列 outputs_list = [[5, 6, 7], [8, 9]] # tokenized 输出序列 sos_token = 0 # 假设起始标记索引 eos_token = 1 # 结束标记索引 pad_token = -1 # 填充标记索引 dataset = Seq2SeqDataset(inputs_list, outputs_list, sos_token, eos_token, pad_token) dataloader = DataLoader(dataset, batch_size=2, collate_fn=collate_fn) ``` 这段代码展示了如何将原始序列数据转换为训练可用的批次格式,其中 padding 确保序列长度一致[^2]。 #### 4. **注意事项** - **任务依赖性**:数据格式因任务而异: -机器翻译中,输入和输出都是文本序列。 - 在语音识别中,输入可能是音频特征序列(如 MFCC),输出是文本序列。 - 在图像描述生成中,输入是图像特征(例如 CNN 提取的向量序列),输出是文本序列。 - **处理变长序列**:使用 masking(掩码)忽略 padding 位置,以避免模型学习无效数据。 - **数据集规范**:常用公共数据集(如 WMT 用于机器翻译或 CNN/DailyMail 用于摘要)遵循类似格式,可从 Hugging Face Datasets 等库加载[^3]。 - 结合注意力机制(如引用[^4]提到的)时,数据格式不变,但训练增加了注意力权重计算。 总之,Encoder-Decoder 框架的训练数据格式核心是输入-输出序列对,需经过 tokenization 和 padding 处理以适应批训练。实际格式取决于具体任务和框架实现[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PD我是你的真爱粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值