使用TensorFlow和Keras构建AI语言翻译
在本系列文章中,我们将向您展示如何使用深度学习来创建自动翻译系统。本系列可以视为分步教程,可以帮助您了解和构建神经元机器翻译。
本系列假定您熟悉机器学习的概念:模型训练,监督学习,神经网络以及人工神经元,层和反向传播。
在上一篇文章中,我们安装了开发自动翻译系统所需的所有工具,并定义了开发工作流程。在本文中,我们将继续构建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 optimizers1234567891011121314151617复制代码类型:[html]
建筑模型组件
使用Keras建立模型非常简单。我们将从使用Keras提供的Sequential模型创建模型开始。
model = Sequential()1复制代码类型:[html]
接下来,我们添加一个长短期记忆(LSTM)层。在Keras的LSTM类中,LSTM单元的大多数参数都具有默认值,因此我们唯一需要明确定义的是输出的维数:将为序列到序列的递归神经创建的LSTM单元的数量网络(RNN)。
输入向量的大小是原始句子中单词的总数。因为我们使用的是嵌入,所以我们会得到标记化的单词。这意味着可以将单词拆分为子单词,从而增加输入句子中单词的数量。
为了使模型的大小易于管理(从而确保可以在合理的时间内训练模型),我们将长度设置为512。我们添加了两个LSTM层:第一层是编码器,第二层是解码器。
model.add(LSTM(512)) model.add(RepeatVector(LEN_EN)) model.add(LSTM(512))123复制代码类型:[html]
请注意,我们在中间添加了RepeatVector。这将是我们注意机制的一部分,我们将在不久后添加。
接下来,我们在模型中添加一个Dense层。该层从上一层获取所有输出神经元。我们需要密集的层,因为我们要进行预测。我们想要获得俄语句子,该句子具有与输入的英语句子相对应的最高分数。本质上,密集层在每个LSTM单元的输出上计算softmax。
model.add(Dense(LEN_RU, activation='softmax'))1复制代码类型:[html]
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')123456复制代码类型:[html]
我们正在使用称为RMSprop的Keras优化器。它优化了用于反向传播的梯度下降技术。
我们仍然需要添加嵌入层,并在编码器和解码器之间包括关注层。
嵌入层是使用Word2Vec创建的,实际上是一个预训练的嵌入层。现在,我们需要生成Word2Vec权重矩阵(该层神经元的权重),并用该矩阵填充标准的Keras嵌入层。
我们可以使用该gensim包自动获取嵌入层:
from gensim.models import Word2Vec1复制代码类型:[html]
然后,我们创建我们的Word2Vec嵌入层
model_w2v = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)1复制代码类型:[html]
然后可以按以下方式检索嵌入层:
model_w2v.wv.get_keras_embedding(train_embeddings=False)1复制代码类型:[html]
我们可以调用该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 _________________________________________________________________1234567891011121314151617复制代码类型:[html]
增加注意力机制
现在我们要添加一个注意力机制。我们可以从头开始编写它,但是更简单的解决方案是使用现有的Keras模块,例如Kerasself-attention。
让我们导入这个模块:
from keras_self_attention import SeqSelfAttention1复制代码类型:[html]
现在,我们将在两个LSTM模块之间添加导入的模块:
model.add(SeqSelfAttention(attention_activation='sigmoid'))1复制代码类型:[html]
我们的模型现已完成。
将模型放在一起
这是用Keras编码的我们的NN的最终代码:
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()12345678910111213141516171819202122232425262728293031323334353637383940414243复制代码类型:[html]
运行代码后,将获得以下输出:
[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,2001234567891011121314151617181920复制代码类型:[html]
尽管我们的模型代码按原样运行良好,但是考虑将模型创建代码包含在函数中将使其更易于重用。你不必有这样做-但得到的可能怎么看,看在最后的翻译器代码的想法笔记本我们前面提到的。