【文本到上下文 #7】探索 NLP 中的 Seq2Seq、编码器-解码器和注意力机制

一、说明

        今天,我们将探讨序列到序列 (seq2seq) 模型的复杂工作原理,特别关注编码器-解码器架构和注意力机制。这些概念是各种 NLP 应用的基础,从机器翻译到问答系统。

        这是可以期待的:

  1. Seq2Seq模型中的编码器-解码器框架:深入研究 Seq2Seq 模型的核心结构,其中我们解开了编码器和解码器的角色和功能。本节将阐明这两个组件如何相互作用以有效地处理和翻译各种 NLP 任务中的序列。
  2. 注意力机制:增强 Seq2Seq 模型:了解注意力机制在完善 Seq2Seq 模型中的关键作用。我们将探讨它如何解决编码器-解码器框架的局限性,特别是在处理长序列方面,以及它对输出的准确性和连贯性的影响。
  3. 何时使用这些模型:深入了解具有注意力机制的 Seq2Seq 模型的实际应用。本节将指导您完成各种场景和用例,帮助您了解这些模型在 NLP 领域中的位置和原因特别有效。
  4. 实际实施: 语言翻译示例:通过动手语言翻译示例逐步实现实际应用。从数据预处理到模型构建和训练,本综合指南将为您提供在实际场景中应用Seq2Seq模型的具体知识。

        请继续关注这些先进的 NLP 概念,将理论见解与实际应用相结合,丰富多彩的旅程。无论您是初学者还是经验丰富的从业者,这篇博文都旨在增强您在 NLP 动态领域的理解和技能。

二、Seq2Seq模型中的编码器-解码器框架

        序列到序列模型彻底改变了我们在 NLP 中处理语言任务的方式。核心思想是将输入序列(如句子中的单词)映射到输出序列(如另一种语言的翻译单词)。这种映射是通过两个主要组件实现的:编码器和解码器,通常使用长短期记忆 (LSTM) 网络或门控循环单元 (GRU) 实现。

2.1 编码器:

        编码器的工作是读取和处理输入序列。在 LSTM 的背景下,这涉及:

  1. Xi:这表示时间步长 i 的输入序列。
  2. hi and ci在每个时间步长中,LSTM 保持两种状态——隐藏状态 (h) 和单元状态 (c),它们在时间步长 i 处共同形成 LSTM 的内部状态。
  3. Yi:尽管编码器确实在每个时间步生成一个输出序列 Yi,其特征是词汇表上的概率分布(使用 softmax),但这些输出通常被丢弃。我们保留的是内部状态(隐藏状态和单元状态)。

        编码器的最终内部状态(我们称之为上下文向量)被认为封装了整个输入序列的信息,为解码器生成有意义的输出奠定了基础。

2.2 译码器:

        解码器是另一个 LSTM 网络,它接管编码器中断的地方。它使用编码器的最终状态作为其初始状态:

  1. 初始化: 解码器的初始状态是编码器的最终状态(上下文向量)。
  2. 操作:解码器在每个时间步长中,使用前一个单元的隐藏状态生成输出以及它自己的隐藏状态。
  3. 输出生成:每个时间步长的输出y_t是使用 softmax 函数计算的。此函数在输出词汇上生成概率分布,帮助确定最终输出(如翻译中的单词)

        解码器通过对上下文向量及其先前的输出进行条件反射,有效地学习生成目标序列。

三、注意力机制:增强 Seq2Seq 模型

        虽然编码器-解码器架构为序列映射提供了强大的框架,但它并非没有局限性。一个关键问题是依赖于固定长度的上下文向量来编码整个输入序列,这对于长序列来说可能是个问题。这就是注意力机制发挥作用的地方。

3.1 注意力如何工作:

        注意力机制允许解码器将注意力集中在编码器输出的不同部分,用于解码器自身输出的每一步。从本质上讲,它计算权重分布(或注意力分数),以确定每个输入元素对每个输出的重要性。

  1. 注意力分数: 这些是根据解码器的当前状态和每个编码器的输出计算得出的。
  2. 上下文向量:这是编码器输出的加权总和,权重由注意力分数给出。
  3. 解码器的输入:上下文向量与解码器的输入(在许多情况下,是前一个输出)组合在一起以生成当前输出。

注意力机制提供了更动态的编码过程,使模型能够为更长的序列生成更准确和连贯的输出。

3.2 何时使用这些模型

3.2.1 带编码器-解码器的 Seq2Seq

  • 适用于输入和输出序列具有不同长度和结构的任务。
  • 常用于机器翻译、文本摘要和语音识别。

3.2.2 注意力机制

  • 对于上下文对于固定大小的向量来说可能过于宽泛的较长序列至关重要。
  • 增强了处理复杂输入(如对话上下文或详细文本)的模型。

四、实际实施:语言翻译示例

4.1 第 1 步:数据预处理

为简单起见,我们将使用一种非常基本的预处理形式。

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as npdef data_preprocessor(source_sentences, target_sentences):source_tokenizer = Tokenizer()source_tokenizer.fit_on_texts(source_sentences)source_sequences = source_tokenizer.texts_to_sequences(source_sentences)source_padded = pad_sequences(source_sequences, padding='post')target_tokenizer = Tokenizer()target_tokenizer.fit_on_texts(target_sentences)target_sequences = target_tokenizer.texts_to_sequences(target_sentences)target_padded = pad_sequences(target_sequences, padding='post')return source_padded, target_padded, source_tokenizer, target_tokenizerenglish_sentences = ['hello', 'world', 'how are you', 'I am fine', 'have a good day']
spanish_sentences = ['hola', 'mundo', 'cómo estás', 'estoy bien', 'ten un buen día']
input_texts, target_texts, source_tokenizer, target_tokenizer = data_preprocessor(english_sentences, spanish_sentences)

4.2 第 2 步:构建模型

接下来,我们用注意力层构建 seq2seq 模型。

from tensorflow.keras.layers import Input, LSTM, Dense, Embedding, Concatenate
from tensorflow.keras.layers import AdditiveAttention as Attention
from tensorflow.keras.models import Model# Model parameters
embedding_dim = 256
latent_dim = 512
num_encoder_tokens = len(source_tokenizer.word_index) + 1
num_decoder_tokens = len(target_tokenizer.word_index) + 1# Encoder
encoder_inputs = Input(shape=(None,))
encoder_embedding = Embedding(num_encoder_tokens, embedding_dim)(encoder_inputs)
encoder_lstm = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder_lstm(encoder_embedding)
encoder_states = [state_h, state_c]# Decoder
decoder_inputs = Input(shape=(None,))
decoder_embedding = Embedding(num_decoder_tokens, embedding_dim)(decoder_inputs)
decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_embedding, initial_state=encoder_states)# Attention Layer
attention = Attention()
attention_output = attention([decoder_outputs, encoder_outputs])# Concatenating attention output and decoder LSTM output 
decoder_concat_input = Concatenate(axis=-1)([decoder_outputs, attention_output])# Dense layer
decoder_dense = Dense(num_decoder_tokens, activation='softmax')
decoder_outputs = decoder_dense(decoder_concat_input)# Define the model
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

4.3 步骤 3:训练模型

        我们将目标文本转换为分类数据进行训练。请注意,在实际场景中,您应该使用更多数据并执行训练-测试拆分。

from tensorflow.keras.utils import to_categorical
decoder_target_data = to_categorical(target_texts, num_decoder_tokens)
model.fit([input_texts, target_texts], decoder_target_data, batch_size=64, epochs=50, validation_split=0.2)

4.4 第 4 步:推理模型

        为编码器和解码器设置推理模型。

# Encoder Inference Model
encoder_model = Model(encoder_inputs, encoder_states)# Decoder Inference Model
decoder_state_input_h = Input(shape=(latent_dim,))
decoder_state_input_c = Input(shape=(latent_dim,))
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
decoder_outputs, state_h, state_c = decoder_lstm(decoder_embedding, initial_state=decoder_states_inputs)
decoder_states = [state_h, state_c]
decoder_outputs = decoder_dense(decoder_outputs)
decoder_model = Model([decoder_inputs] + decoder_states_inputs, [decoder_outputs] + decoder_states)

4.5 第 5 步:翻译功能

        最后,让我们为翻译过程创建一个函数。

def translate(input_text):# Tokenize and pad the input sequenceinput_seq = source_tokenizer.texts_to_sequences([input_text])input_seq = pad_sequences(input_seq, maxlen=input_texts.shape[1], padding='post')# Get the encoder statesstates_value = encoder_model.predict(input_seq)# Generate an empty target sequence of length 1target_seq = np.zeros((1, 1))# Populate the first character of the target sequence with the start charactertarget_seq[0, 0] = target_tokenizer.word_index['start']  # Assuming 'start' is the start tokenstop_condition = Falsedecoded_sentence = ''while not stop_condition:output_tokens, h, c = decoder_model.predict([target_seq] + states_value)# Sample a tokensampled_token_index = np.argmax(output_tokens[0, -1, :])sampled_char = target_tokenizer.index_word[sampled_token_index]decoded_sentence += ' ' + sampled_char# Exit condition: either hit max length or find stop token.if (sampled_char == 'end' or len(decoded_sentence) > 50):  # Assuming 'end' is the end tokenstop_condition = True# Update the target sequence (of length 1).target_seq = np.zeros((1, 1))target_seq[0, 0] = sampled_token_index# Update statesstates_value = [h, c]return decoded_sentence# Example usage
translated_sentence = translate("hello")
print(translated_sentence)

        此代码提供了一个基本框架来理解具有注意力的 seq2seq 模型的工作原理。请记住,这是一个简化的示例。对于实际应用,您需要更复杂的预处理、更大的数据集和模型参数的微调。

五、结论

        在 NLP 系列的中,我们深入研究了序列到序列模型的复杂性,特别关注编码器-解码器架构和注意力机制。这种探索提供了对它们在各种 NLP 应用(如机器翻译和文本摘要)中的重要作用的见解。我们通过一个实际的例子来说明这些概念,强调它们在复杂的语言处理任务中的有效性。

        正如我们总结的那样,很明显,NLP领域的旅程是持续和动态的。展望未来,我们的下一章“NLP 中的变形金刚:解码游戏规则改变者”将深入探讨变形金刚模型。我们将探索开创性的“注意力就是你所需要的一切”论文,并了解 transformer 架构的具体细节,这标志着 NLP 领域的重大转变。

      

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

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

相关文章

数据结构之单链表详解

前言 之前大摆了5天多,没怎么学编程,自昨日起,觉不可如此,痛定思痛,开始继续学习,昨天刷了20多道简单级别的力扣,今天想把链表好好巩固一下,于是乎,把单链表的增删查改搞…

基础算法之Huffman编码

// Type your code here, or load an example. #include<iostream> #include<string> #include<queue> #include <unordered_map> #include <vector>using namespace std;//树节点结构 struct Node {char ch;int freq;Node *left;Node *right;No…

数据结构3、基于栈的后缀算术表达式求值

1 题目描述 图1 中缀表达式转化为后缀表达式题目描述 图2 基于栈的后缀算术表达式求值题目描述 2 题目解读 借助一个运算符栈&#xff0c;可将中缀表达式转化为后缀表达式&#xff1b;借助一个运算数栈&#xff0c;可对后缀表达式求值。借助一个运算符栈和一个运算数栈&#xf…

Java基础数据结构之哈希表

概念 顺序结构以及平衡树 中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在 查找一个元素时&#xff0c;必须要经过关键 码的多次比较 。 顺序查找时间复杂度为 O(N) &#xff0c;平衡树中为树的高度&#xff0c;即 O( log2N ) &#xff0c;搜索的效…

防火墙用户认证、NAT、策略路由、DNS透明代理以及双机热备笔记

用户认证 防火墙管理员登录认证 --- 检验身份的合法性&#xff0c;划分身份权限 用户认证 --- 上网行为管理的一部分 用户&#xff0c;行为&#xff0c;流量 --- 上网行为管理三要素 用户认证的分类 上网用户认证 --- 三层认证 --- 所有的跨网段的通信都可以属于上网行为。…

【Web前端实操19】商城官网_分析与顶部广告

本次实操主要是借用小米之前的网站来进行参考&#xff0c;达成网站静态页面开发的目的&#xff0c;而新学者想要一次性直接开发整个网站&#xff0c;肯定会很懵圈&#xff0c;因此&#xff0c;这个商城官网我会一部分一部分地进行拆分来写&#xff0c;最后合成整个界面。 本次…

国企重组整合后,如何严把“选人用人”关?

三年国企改革之后&#xff0c;新一轮国企改革明确重组方向&#xff0c;强调将“战略性重组和专业化整合”作为深化供给侧结构性改革从而建设世界一流企业的重要抓手&#xff0c;推动了国有资源的高效运转流动。在很多企业兼并、重组后&#xff0c;成立了新的集团性公司&#xf…

Mysql查询数据

1 基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。SELECT语句的基本格式是&#xff1a; 2 单表查询 2.1 查询所有字段 SELECT * FROM 表名; 2.2 在SELECT语句中指定所有字段 SELECT f_id, s_id ,f_name, f_price FROM fruits; 2.3 查询单个字段 SELECT 列名FR…

nginx部署前端(vue)项目及配置修改

目录 一、前端应用打包 二、部署前端应用 1、上传前端文件夹 2、修改nginx配置文件 3、重启nginx 三、查看效果 nginx安装参考&#xff1a;linux安装nginx-CSDN博客 一、前端应用打包 打包命令 npm run build 打包成功如下&#xff0c;会在项目路径下生成dist文件夹 二…

Windows Server 2003 Web服务器搭建

系列文章目录 目录 系列文章目录 前言 一、Web服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 2.服务器搭建 1)控制面板中找到增加或删除程序打开 2)点击增加程序 3)安装Web服务器 4)查看安装是否成功 5)打开Internet信息服务(IIS)管理器,进行配置 6)找…

【开源之美】:cppcheck

一、项目链接 https://github.com/danmar/cppcheck/tree/main 二、效果示例

图像复原的天花板在哪里?SUPIR:开创性结合文本引导先验和模型规模扩大

SUPIR&#xff08;Scaling-UP Image Restoration&#xff09;&#xff0c;这是一种开创性的图像复原方法&#xff0c;利用生成先验和模型扩大规模的力量。通过利用多模态技术和先进的生成先验&#xff0c;SUPIR在智能和逼真的图像复原方面取得了重大进展。作为SUPIR中的关键催化…

如何配置MacLinuxWindows环境变量

这里写目录标题 什么是环境变量什么是PATH为什么要配置环境变量 如何配置环境变量环境变量有哪些环境变量加载顺序环境变量加载详解 配置参考方法一&#xff1a; export PATHLinux环境变量配置方法二&#xff1a;vim ~/.bashrcLinux环境变量配置方法三&#xff1a;vim ~/.bash_…

go语言基础之泛型

1.泛型 泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。 1.1 为什么需要泛型 func reverse(s []int) []int {l : len(s)r : make([]int, l)for i, e : range s {r[l-i-1] e}return r }fmt.Println(reverse…

红外热成像仪定制_热成像仪/红外夜视仪开发方案

红外热成像技术是一种利用红外热成像仪将物体发出的不可见红外辐射能量转换成可见的温度场图像的技术&#xff0c;通过不同颜色来表示不同温度。这项技术的应用领域非常广泛&#xff0c;从电路维修到暖通检测再到汽车故障排查等各个领域都有着重要的作用。 红外热成像仪的解决方…

SpringBoot项目实现热部署的配置方法

SpringBoot项目实现热部署的配置方法 1、什么是热部署&#xff1f; 热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。 2、什么是SpringBoot热部署&#xff1f; SpringBoot热部署就是在项目正在运行的时候修改代码, 却不需要重新启动…

PCB的通孔,盲孔,埋孔

通孔&#xff1a;双层板从顶层到底层的打通&#xff0c;这样电流就能够从顶层到底层 盲孔&#xff1a;因为看不到底&#xff0c;像一口井一样&#xff0c;只能打到中间&#xff0c;里面灌上铜&#xff0c;我们可以从第一层切换到第二层&#xff0c;第三层等等&#xff0c;盲孔…

在Windows上安装与配置Apache服务并结合内网穿透工具实现公网远程访问本地内网服务

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

[React源码解析] Fiber

在React15及以前, Reconciler采用递归的方式创建虚拟Dom, 但是递归过程不可以中断, 如果组件的层级比较深的话, 递归会占用线程很多时间, 那么会造成卡顿。 为了解决这个问题, React16将递归的无法中断的更新重构为异步的可中断更新, Fiber架构诞生。 文章目录 1.Fiber的结构2…

【blender烘焙】法线烘焙出现大面积结构丢失怎么办?blender烘焙vs八猴烘焙

用dcc烘焙法线是很常用的减面优化手段&#xff0c;很多建模的dcc自己也内置的烘焙的功能&#xff0c;像我自己在工作流中也偶尔用blender的烘焙做一下材质的整合优化&#xff0c;在质量要求不高的时候还算凑合可用。 问题描述 在前期的文章中飞燕2号建模&#xff0c;我就遇到…