目录
介绍
导入库
构建模型组件
添加注意力机制
将模型放在一起
下一步
谷歌翻译工作得如此之好,它通常看起来很神奇。但这不是魔法——这是深度学习!
在本系列文章中,我们将向您展示如何使用深度学习来创建自动翻译系统。本系列可被视为分步教程,可帮助您理解和构建神经元机器翻译。
本系列假设您熟悉机器学习的概念:模型训练、监督学习、神经网络以及人工神经元、层和反向传播。
在上一篇文章中,我们安装了开发自动翻译系统所需的所有工具,并定义了开发工作流程。在本文中,我们将继续构建我们的AI语言翻译系统。
我们将需要编写很少的代码行,因为对于大多数逻辑,我们将使用基于Keras的预格式化模板。
如果您想查看我们最终得到的最终代码,可在此Python笔记本中找到。
首先,我们需要加载所需的库:
import warnings
warnings.filterwarnings("ignore")
import tensorflow as tf
import numpy as np
import string
from numpy import array, argmax, random, take
#for processing imported data
import pandas as pd
#the RNN routines
from keras.models import Sequential
from keras.layers import Dense, LSTM, Embedding, RepeatVector
#we will need the tokenizer for BERT
from keras.preprocessing.text import Tokenizer
from keras.callbacks import ModelCheckpoint
from keras.preprocessing.sequence import pad_sequences
from keras.models import load_model
from keras import optimizers
使用Keras构建我们的模型非常简单。我们将首先使用Keras提供的Sequential模型创建我们的模型。
model = Sequential()
接下来,我们添加一个长短期记忆(LSTM)层。在Keras的LSTM类中,LSTM单元的大多数参数都有默认值,因此我们唯一需要明确定义的是输出的维度:将为我们的序列到序列循环神经网络创建的LSTM单元的数量网络(RNN)。
输入向量的大小是原始句子中单词的总和。因为我们使用了嵌入,所以我们会得到标记化的词。这意味着可以将单词拆分为子标记,从而增加输入句子中的单词数量。
为了让我们的模型大小易于管理(从而确保我们可以在合理的时间内训练它),我们将长度设置为512。我们添加了两个LSTM层:第一个是编码器,第二个是解码器。
model.add(LSTM(512))
model.add(RepeatVector(LEN_EN))
model.add(LSTM(512))
请注意,我们在中间添加了一个RepeatVector。这将是我们注意力机制的一部分,我们将很快添加。
接下来,我们将一个Dense层添加到我们的模型中。该层采用前一层的所有输出神经元。我们需要密集层,因为我们正在做预测。我们想要得到与输入的英语句子对应的最高分的俄语句子。本质上,密集层在每个LSTM单元的输出上计算softmax。
model.add(Dense(LEN_RU, activation='softmax'))
LEN_RU是输出向量的大小(稍后我们将计算这些参数)。变量也是如此LEN_EN。
到目前为止,我们的模型应该是这样的:
model = Sequential()
model.add(LSTM(512))
model.add(LSTM(512))
model.add(Dense(LEN_RU, activation='softmax'))
rms = optimizers.RMSprop(lr=0.001)
model.compile(optimizer=rms, loss='sparse_categorical_crossentropy')
我们正在使用名为RMSprop的Keras优化器。它优化了用于反向传播的梯度下降技术。
我们仍然需要添加嵌入层,并在编码器和解码器之间包含一个注意力层。
嵌入层是用Word2Vec创建的。这实际上是一个预训练的嵌入层。现在我们需要生成Word2Vec权重矩阵(该层神经元的权重)并用该矩阵填充标准Keras嵌入层。
我们可以使用gensim包自动获取嵌入层:
from gensim.models import Word2Vec
然后,我们创建Word2Vec嵌入层:
model_w2v = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)
然后可以按如下方式检索嵌入层:
model_w2v.wv.get_keras_embedding(train_embeddings=False)
我们可以调用该model.summary()函数来概览我们的模型:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, None, 100) 1200
_________________________________________________________________
lstm_1 (LSTM) (None, 512) 1255424
_________________________________________________________________
repeat_vector_1 (RepeatVecto (None, 8, 512) 0
_________________________________________________________________
lstm_2 (LSTM) (None, 512) 2099200
_________________________________________________________________
dense_1 (Dense) (None, 512) 262656
=================================================================
Total params: 3,618,480
Trainable params: 3,617,280
Non-trainable params: 1,200
_________________________________________________________________
现在我们要添加一个注意力机制。我们可以从头开始编写它,但更简单的解决方案是使用现有的Keras模块,例如Keras self-attention。
让我们导入这个模块:
from keras_self_attention import SeqSelfAttention
现在我们将在两个LSTM块之间添加导入的模块:
model.add(SeqSelfAttention(attention_activation='sigmoid'))
我们的模型现在已经完成。
这是我们的神经网络的最终代码,用Keras编码:
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import string
from numpy import array, argmax, random, take
#for processing imported data
import tensorflow as tf
import pandas as pd
#the RNN routines
from keras.models import Sequential
from keras.layers import Dense, LSTM, Embedding, RepeatVector
from keras.preprocessing.text import Tokenizer
from keras.callbacks import ModelCheckpoint
from keras.preprocessing.sequence import pad_sequences
from keras.models import load_model
from keras import optimizers
#optional if you want to generate statistical graphs of the DMT
#import matplotlib.pyplot as plt
#from keras.utils import plot_model
#import pydot
from gensim.models import Word2Vec
from gensim.test.utils import common_texts
from keras_self_attention import SeqSelfAttention
model = Sequential()
model_w2v = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)
model.add(model_w2v.wv.get_keras_embedding(train_embeddings=False))
model.add(LSTM(512))
model.add(RepeatVector(8))
model.add(SeqSelfAttention(attention_activation='sigmoid'))
model.add(LSTM(512))
model.add(Dense(LEN_RU, activation='softmax'))
rms = optimizers.RMSprop(lr=0.001)
model.compile(optimizer=rms, loss='sparse_categorical_crossentropy')
#plot_model(model, to_file='model_plot4a.png', show_shapes=True, show_layer_names=True)
model.summary()
运行代码后,我们得到以下输出:
[root@ids ~]# python3 NMT.py
Using TensorFlow backend.
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, None, 100) 1200
_________________________________________________________________
lstm_1 (LSTM) (None, 512) 1255424
_________________________________________________________________
repeat_vector_1 (RepeatVecto (None, 8, 512) 0
_________________________________________________________________
seq_self_attention_1 (SeqSel (None, 8, 512) 32833
_________________________________________________________________
lstm_2 (LSTM) (None, 512) 2099200
_________________________________________________________________
dense_1 (Dense) (None, 512) 262656
=================================================================
Total params: 3,651,313
Trainable params: 3,650,113
Non-trainable params: 1,200
尽管我们的模型代码按原样运行良好,但请考虑将模型创建代码包含在函数中将使其更易于重用。你不必有这样做-但得到的可能怎么看,看在最后的翻译器代码的想法notebook我们前面提到的。
现在我们的模型已经准备好了。在接下来的文章中,我们将训练和测试这种模式。
https://www.codeproject.com/Articles/5299748/Building-AI-Language-Translation-with-TensorFlow-a