为什么在将循环神经网络用于序列到序列模型时,我们需要添加 START <s> + END </s> 符号?

数据挖掘 深度学习 rnn 序列到序列 nlp
2021-10-07 09:04:29

在Sequence-to-Sequence 模型中,我们经常看到在训练模型和推理/解码看不见的数据之前,将START(例如<s>)和END(例如</s>)符号添加到输入和输出中。

例如http://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html

SOS_token = 0
EOS_token = 1


class Lang:
    def __init__(self, name):
        self.name = name
        self.word2index = {}
        self.word2count = {}
        self.index2word = {0: "SOS", 1: "EOS"}
        self.n_words = 2  # Count SOS and EOS

    def addSentence(self, sentence):
        for word in sentence.split(' '):
            self.addWord(word)

    def addWord(self, word):
        if word not in self.word2index:
            self.word2index[word] = self.n_words
            self.word2count[word] = 1
            self.index2word[self.n_words] = word
            self.n_words += 1
        else:
            self.word2count[word] += 1
  • 是否有必要的技术定义或学术解释?

  • 或者是否需要添加 END 符号仅适用于句子生成需要结束的自然语言处理任务?

  • 但是 START 符号有什么作用呢?除了采用经过训练的网络将开始推断的初始状态。

1个回答

因为编码器-解码器结构。编码器读取输入序列以构造序列的嵌入表示。在序列结束(EOS)令牌中终止输入向编码器发出信号,当它接收到该输入时,输出需要是最终的嵌入。我们(通常)不关心嵌入的中间状态,并且我们不希望编码器不得不猜测输入句子是否完整。

EOS 令牌对解码器也很重要:显式的“结束”令牌允许解码器发出任意长度的序列。解码器会告诉我们它何时完成发出令牌:如果没有“结束”令牌,我们将不知道解码器何时结束与我们的对话,继续发出令牌会产生乱码。

序列开始 (SOS) 标记对解码器更重要:解码器将通过将其发出的标记作为输入(连同嵌入和隐藏状态,或使用嵌入来初始化隐藏状态)来进步,所以在它发出任何东西之前,它需要某种令牌才能开始。因此,SOS 令牌。

此外,如果我们为编码器使用双向 RNN,我们肯定会同时使用 SOS 和 EOS 令牌,因为 SOS 令牌会在输入完成时向反向输入层发出信号(否则,如何它知道吗?)。