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

news2024/11/18 13:32:30

一、说明

        今天,我们将探讨序列到序列 (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 np

def 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_tokenizer

english_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 sequence
    input_seq = source_tokenizer.texts_to_sequences([input_text])
    input_seq = pad_sequences(input_seq, maxlen=input_texts.shape[1], padding='post')

    # Get the encoder states
    states_value = encoder_model.predict(input_seq)

    # Generate an empty target sequence of length 1
    target_seq = np.zeros((1, 1))

    # Populate the first character of the target sequence with the start character
    target_seq[0, 0] = target_tokenizer.word_index['start']  # Assuming 'start' is the start token

    stop_condition = False
    decoded_sentence = ''
    while not stop_condition:
        output_tokens, h, c = decoder_model.predict([target_seq] + states_value)

        # Sample a token
        sampled_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 token
            stop_condition = True

        # Update the target sequence (of length 1).
        target_seq = np.zeros((1, 1))
        target_seq[0, 0] = sampled_token_index

        # Update states
        states_value = [h, c]

    return decoded_sentence

# Example usage
translated_sentence = translate("hello")
print(translated_sentence)

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

五、结论

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

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

      

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

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

相关文章

小程序开发平台微同城本地生活服务小程序功能 带完整的安装以及部署教程

移动互联网的普及,小程序已经成为一种新的应用形态,为本地生活服务提供了更多的可能性。微同城作为一款本地生活服务小程序,致力于为当地居民提供便捷、高效的生活服务体验。罗峰给大家分享微同城本地生活服务小程序的源码开发背景以及系统的…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之CheckboxGroup组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之CheckboxGroup组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、CheckboxGroup组件 提供多选框组件,通常用于某选项的打开或关…

【数据分析】numpy基础第三天

前言 本文只会讲解最常用的加、减、乘、除,点乘(或叫矩阵乘法)、还有广播机制。 本文代码 链接提取码:1024 第1部分:基础数学计算 使用NumPy进行基本的数学运算是十分直观和简单的。下面我们将展示一些基本的加、…

机器学习第二十七周周报 PINNs

文章目录 week27 PINNs摘要Abstract一、监督学习二、文献阅读1. 题目2. abstract3. 偏微分方程的数据驱动解3.1连续时间模型example(Schrodinger equation): 3.2离散时间模型Example (Allen–Cahn equation): 4. 文献解读4.1 Introduction4.2 创新点 三、…

1.28寒假集训

A: 解题思路&#xff1a; 移项就好v mv / (M - m) 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {int t;double M,m,v;cin >> t;while(t ! 0){cin >> M >> m >> v;printf("%.2lf\n",(m * v) / (M…

【动态规划】【字符串】【行程码】1531. 压缩字符串

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode 1531. 压缩字符串 II 行程长度编码 是一种常用的字符串压缩方法&#xff0c;它将连续的相同字符&#xff08;重复 2 次或更多次&#xff09;替换为字符和表示字符计数的数字&#xff08;行程长度&#xff09;…

WordPress如何自定义日期和时间格式?附PHP日期和时间格式字符串

WordPress网站在很多地方都需要用到日期和时间&#xff0c;那么我们应该在哪里设置日期和时间呢&#xff1f;又如何自定义日期和时间格式呢&#xff1f;下面boke112百科就跟大家一起来学习一下PHP标准化的日期和时间格式字符串。 特别说明&#xff1a;格式字符是标准化的&#…

Material Components for Android助你打造精美App

Material Components for Android助你打造精美App 简介 Material Components for Android (MDC-Android) 是帮助开发者执行 Material Design 的工具。由谷歌的核心工程师和用户体验设计师团队开发&#xff0c;这些组件使得开发者可以可靠地开发工作流来构建美观且功能齐全的 …

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

💡 RT-DETR改进有效系列目录 💡 前言 Hello,各位读者们好 Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,…

sqli.labs靶场(8-17关)

8、第八关&#xff08;布尔盲注&#xff09; id1显示You are in...........&#xff0c;id1单引号不显示&#xff0c;id1 --显示正常 这个应该是单引号闭合&#xff0c;接下来就和第七关差不多上脚本 爆库名长度&#xff1a;id1%27%20and%20length(database()){i}%20-- 爆库…

如何在 VM 虚拟机中安装 Red Hat Enterprise Linux 9.3 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 先得安装 VM 虚拟机&#xff0c;没有的可以参考这篇文章安装 VM 虚拟机 如何在 VM 虚拟机中安装 Win10 操作系统保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135713915 二、Red Hat Linux 镜…

软考 系统分析师系列知识点之知识管理(2)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之知识管理&#xff08;1&#xff09; 所属章节&#xff1a; 第7章. 企业信息化战略与实施 第7节. 企业信息系统 7.7.5 知识管理 相关试题 1. 知识管理是企业信息化过程中的重要环节&#xff0c;知识可以分为显性知识和隐性…

计算机网络——IP协议

前言 网络层的主要负责地址分配和路由选择,ip负责在网络中进行数据包的路由和传输。 IPv4报文组成&#xff08;了解&#xff09; IPv4首部&#xff1a;IPv4首部包含了用于路由和传输数据的控制信息&#xff0c;其长度为20个字节&#xff08;固定长度&#xff09;。 版本&#…

leetcode26. 删除有序数组中的重复项

题目 题目 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &…

前端——JavaScript

目录 文章目录 前言 一. JavaScript基础 1.JavaScript基本结构 2. JavaScript 执行过程 3. JavaScript 引入方式 二. JavaScript 语法 1.数据类型 2.变量 2.1 var 关键字定义变量 2.2 let 关键字定义变量 2.3 var 与 let 的区别 3.字符串 3.1定义字符串 3.2 字…

Python爬虫解析库安装

解析库的安装 抓取网页代码之后&#xff0c;下一步就是从网页中提取信息。提取信息的方式有多种多样&#xff0c;可以使用正则来提取&#xff0c;但是写起来相对比较烦琐。这里还有许多强大的解析库&#xff0c;如 lxml、Beautiful Soup、pyquery 等。此外&#xff0c;还提供了…

除了Adobe之外,还有什么方法可以将Excel转为PDF?

前言 Java是一种广泛使用的编程语言&#xff0c;它在企业级应用开发中发挥着重要作用。而在实际的开发过程中&#xff0c;我们常常需要处理各种数据格式转换的需求。今天小编为大家介绍下如何使用葡萄城公司的的Java API 组件GrapeCity Documents for Excel&#xff08;以下简…

数据结构(一)------顺序表

文章目录 前言一、什么是顺序表二、实现顺序表1.静态顺序表2.动态顺序表总结 前言 制作不易&#xff01;三连支持一下呗&#xff01;&#xff01;&#xff01; 从今天起我们将会进入数据结构的学习&#xff01; 我们先来了解 什么是数据结构 数据结构是计算机存储、组织数…

2023年算法OOA-CNN-BiLSTM-ATTENTION回归预测(matlab)

OOA-CNN-BiLSTM-Attention鲸鱼算法优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 鱼鹰优化算法&#xff08;Osprey optimization algorithm&#xff0c;OOA&#xff09;由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出&#xff0c;其模拟鱼鹰的捕…

go语言函数进阶

1.变量作用域 全局变量 全局变量是定义在函数外部的变量&#xff0c;它在程序整个运行周期内都有效。 在函数中可以访问到全局变量。 package mainimport "fmt"//定义全局变量num var num int64 10func testGlobalVar() {fmt.Printf("num%d\n", num) /…