Python----循环神经网络(Transformer ----Encoder-Decoder)
一、自然语言任务分类
1.1、N对1
在N对1的任务中,系统接收多个输入元素(N个),但只产生一个输出。这种类型的任务通常涉及整合或总结多个输入点的信息。
典型的例子包括:
文本摘要:从多个句子或段落中提取关键信息,生成一个摘要。
情感分析:分析一段文本(可能包含多个句子),确定其整体情感倾向,如正面、负面或中立(或者商品的评分评价)。
语言模型:在给定一系列词(如一个句子)的情况下,预测下一个最可能的词。
1.2、N对N
在1对N的任务中,单个输入会产生多个输出。这类任务通常涉及从一个输入生成或推断出多个相关的信息点。
例如:
机器翻译:将一个语言的文本翻译成多种其他语言。
关键词生成:从一段文本中生成一系列关键词或标签。
图像描述:根据一张图片生成多个描述性句子(虽然这也涉及到计算机视觉)。
1.3、N对M
N对M的任务涉及多个输入和多个输出,通常每个输入都对应一个输出。这类任务常见于序列到序列的模型中,如:
序列标注:例如,在自然语言处理中,对每个词进行词性标注。
机器翻译(序列级):将一种语言的文本序列翻译成另一种语言的等价文本序列,其中每个输入单元(如词或短语)对应一个输出单元。
对话系统:在一个对话中,每个输入句子(如用户的问题)对应一个输出句子(如系统的回答)。
二、Encoder-Decoder的结构
2.1、RNN
RNN在处理序列数据时,每个时间步都生成一个输出并更新隐藏状态,然而,对于N对M的任务(例如,机器翻译,其中输入和输出句子的长度可能不同),RNN可能会遇到困难。例如,当RNN处理英语句子时,它在每个时间步都会产生一个输出和更新隐藏状态,但当转换到中文句子时,由于长度不同,RNN可能会在某个时间步处于"失步",如图中的‘们’,导致无法有效对齐英语和中文之间的对应关系。
因此传统的RNN结构可能会在处理不同长度的序列时失去对应关系,使得模型难以正确学习源语言和目标语言之间的映射关系。
2.2、RNN Encoder -Decoder
考虑到实际中大量存在输入输出长度不相等的情况,如机器翻译、语音识别、问答系统等。此时就需要一种结构实现设计一种映射可变长序列至另一个可变长序列的网络结构。要注意的是Encoder-Decoder编码器-解码器是一种特殊的结构并不是RNN的变体。Encoder-Decoder编码器-解码器的工作过程就可以类比为‘压缩’和‘解压’的过程,我们首先将一段序列放入编码器Encoder编码器进行‘压缩’得到能表示这段序列的上下文表示context上下文,然后将context上下文放入解码器Decoder译码器进行‘解压’而得到另一个序列。
2.2.1、编码器(Encoder编码器)
编码器通常由循环神经网络(RNN)或者其变体(如长短时记忆网络LSTM)构成。编码器的输入是原始序列,编码器的主要任务是将输入序列映射为一个固定维度的表示c(context)捕捉输入序列的语义信息。
在RNN Encoder-Decoder中,编码器在每个时间步处理输入序列的一个元素,并在整个序列处理过程中逐步更新其隐藏状态。
2.2.2、解码器(Decoder译码器)
解码器同样可以使用RNN结构,解码器的输入有两个,一个是来自编码器编码后的固定维度的表示c(context),另一个来自上一时间步的输出。
注意:这里要了解到两个新概念:<sos>(Start ofSequence)和<eos>(End ofSequence),它俩是特殊的标记,用于表示序列的开始和结束。
1.<sos>(start ofsequence): 这个标记表示序列的开始。在训练阶段,模型可以看到<sos>标记,并知道开始生成序列的内容。在预测阶段,一旦生成了<sos>标记,模型就开始生成实际的序列内容。
2.<eos>(End ofsequence): 这个标记表示序列的结束。在训练和预测阶段,当模型生成<eos>标记时,它知道当前序列已经完成,不再需要继续生成。
以下是一个简单的例子,说明如何在序列中使用<sos>和 <eos>:
原始序列:He11o,how are you?
处理后的序列:<sos>He11o,how are you?<e0s>
解码器的任务是根据编码器生成的表示,逐步生成输出序列。在RNN Encoder-Decoder中,解码器在每个时间步生成一个元素,并根据先前的生成元素和编码器的表示来决定下一个元素。
2.3、Teacher-forcing
在序列生成任务中,尤其是在训练过程中,Teacher-forcing是一种训练技术,它有助于加速模型的收敛并提高生成质量。让我们详细了解 Teacher-forcing。
2.3.1、Free-running mode
在 Free-running mode 中,模型在生成序列时完全依赖于先前生成的标记,而不考虑真实的目标序列,换句话说,模型在生成每个时刻的标记时,将前一个时刻生成的标记作为输入,而不是使用真实的目标标记作为输入。
这种方式可能会导致错误在生成序列中逐渐累积,因为模型在生成每个标记时都是基于其之前生成的标记。但是这种模式更接近于实际应用中模型自主生成序列的情况。
2.3.2、Teacher-forcing mode
相对于 Free-running mode,Teacher-forcing mode 使用真实的目标标记(ground truth)作为每个时刻的输入,而不是使用模型自身生成的标记。在训练过程中,这样的做法通常更容易使模型收敛,因为它提供了更准确的上下文信息。Teacher-forcing 提供了以下优势:
更稳定的训练:由于每个时刻都使用真实的目标标记,模型更容易学到正确的生成模式,减少了误差在训练中累积的可能性。
加速收敛:使用真实的目标标记可以使模型更快地学到正确的生成策略,从而加速训练过程。更好的序列生成质量:在训练时使用真实的目标标记可以帮助模型更好地理解序列之间的关系,提高生成的序列质量。
但也存在这一些缺点,因为依赖标签数据,在训练过程中,模型会有较好的效果,但是在测试的时候因为不能得到ground truth的支持,所以如果目前生成的序列在训练过程中有很大不同,模型就会变得脆弱。
实际上,会使用一种称为“Scheduled Sampling”的方法,该方法在训练过程中逐渐减少对真实目标序列的依赖,即最初阶段,模型更多地依赖于真实目标,而后来逐渐增加自己生成的标记的使用比例。
以平衡教师强迫模式和自由运行模式的优势。这有助于在训练过程中更好地平衡两种模式的影响。