带有神经网络的句子语言翻译,具有简单的层结构(如果可能是顺序的)

数据挖掘 神经网络 喀拉斯 lstm 序列到序列 机器翻译
2021-09-22 16:08:35

背景:许多带有神经网络的语言句子翻译系统(例如法语到英语)使用以下seq2seq结构:

“猫坐在垫子上” -> [Seq2Seq 模型] -> “le chat etait assis sur le tapis”

示例:十分钟介绍 Keras 中的序列到序列学习Python for NLP:使用 Keras 中的 Seq2Seq 进行神经机器翻译

我注意到,在所有这些示例中,神经网络的结构不是通过使用具有连续层的Sequential结构来完成的,而是通过像这样的更复杂的结构来完成的:

在此处输入图像描述


问:有没有成功尝试用经典Sequential层做句子语言翻译?

IE:

  • 输入层:单词标记的英文句子,零填充:“the cat sat on the mat”
    =>x = [2, 112, 198, 22, 2, 302, 0, 0, 0, 0, 0, 0, 0, 0, ...]

  • 输出层:法语单词标记句子,零填充:“le chat etait assis sur le tapis” =>y = [2, 182, 17, 166, 21, 2, 302, 0, 0, 0, 0, 0, 0, 0, 0, ...]

你会用什么作为图层?我想我们可以从:

model = Sequential()                                   # in  shape: (None, 200)
model.add(Embedding(max_words, 32, input_length=200))  # out shape: (None, 200, 32)
model.add(LSTM(100))                                   # out shape: (None, 100)
.... what here? ...

但是如何Embedding为输出语言提供第二个并反转它呢?从 200x32 嵌入(浮点数)到这样的整数列表[2, 182, 17, 166, 21, 2, 302, 0, 0, 0, 0, 0, 0, 0, 0, ...]

另外,如何衡量这种情况下的损失,mean squared error


更一般地说,你能想到的最简单的结构是什么(即使它没有给出最好的结果),用于语言翻译?(即使不是顺序也可以)

2个回答

使用传统神经架构(seq2seq 模型)的机器翻译由于词少、准确率低和翻译速度慢而存在各种问题 [ 1 ]。即使在使用了注意力和残差连接等各种机制之后,性能也只能与基于统计短语的机器翻译相当(不优于)[ 1 ]。

我只能认为这篇论文是成功尝试在编码器、解码器设置(8 个编码器和 8 个解码器层)中使用 LSTM 以获得可比较的结果(可能还有其他尝试)。AWD-LSTM [ 2 ] 的性能明显优于其他模型。

在机器翻译任务中,模型应该理解翻译词与被翻译词之间的适当关系及其定位。这只能通过使用两种语言的知识表示(词嵌入/编码)来实现。

这就是为什么我们需要同时使用编码器和解码器层。

如果你问我,我会说以下代码(取自链接)是使用简单 LSTM/seq2seq 模型的最简单的模型结构。

from keras.models import Model
from keras.layers import Input, LSTM, Dense

# Define an input sequence and process it.
encoder_inputs = Input(shape=(None, num_encoder_tokens))
encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
# We discard `encoder_outputs` and only keep the states.
encoder_states = [state_h, state_c]

# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = Input(shape=(None, num_decoder_tokens))
# We set up our decoder to return full output sequences,
# and to return internal states as well. We don't use the 
# return states in the training model, but we will use them in inference.
decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs,
                                     initial_state=encoder_states)
decoder_dense = Dense(num_decoder_tokens, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)

# Define the model that will turn
# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

从您的问题来看,您似乎只想使用 Keras 的顺序层来定义模型。如果是这种情况,那么您必须知道变量encoder_states在上述模型的定义中起着重要作用。

LSTM 是顺序模型,这意味着它一次只处理一个单词,并在一次迭代中计算下一个单词的隐藏状态。输入序列(源语言)中的所有单词都遵循该过程。然后在解码器层中使用最终的隐藏状态来计算输出序列(目标语言)的上下文。这就是为什么initial_state=encoder_states在解码器 LSTM 层定义中存在的原因。如果没有encoder_states解码器,LSTM 将不知道上下文,您的模型只会给出乱码输出。

有没有成功的尝试用经典Sequential层做句子语言翻译?

可悲的是,答案是否定的。

您只能尝试了解机器翻译的工作原理并熟悉机器翻译模型定义的复杂性。因为这是最简单的模型。

有关更多信息,您可以浏览这些文件。1 2 3

我希望它有所帮助。

seq2seq 模型不仅仅是层堆栈的原因是解码器无法提前知道输出将持续多长时间(在推理时),并且解码器的下一步动作取决于其先前的动作。解码器的这一特性称为自回归性。解码器需要跟踪两件事:输入上的内容(图表的左分支)和在前面的步骤中所做的(图表的右分支)。

将 MT 表述为一堆层是一个活跃的研究领域,主要是因为它提供了显着的加速,但通常以牺牲翻译质量为代价。这种方法也不适用于 LSTM,而仅适用于 Transformer,因为 Transformer 中的自注意力层直接允许对输入状态进行任意重新排序,这是 MT 的一个关键特征,因为不同的语言具有不同的词序。