即使我不会说法语,我可以用T2T听懂法国团队和客户的话。
引自Github上的tensor2tensor介绍
尽管深度学习并不总是人们在数据科学领域所期望的灵丹妙药,但它对于自然语言处理(NLP)任务来说非常有用。例如,使用词嵌入已经彻底改变了语言理解技术的有效性。
我想使用当前最先进的技术为我的团队和客户制作一个离线的法语到英语翻译器,也就是Transformer架构。T2T为快速、简单的训练和模型制作提供了一个框架,不需要从头开始编写和训练这个神经网络。
架构论文:https://arxiv.org/abs/1706.03762
T2T库旨在与shell脚本一起使用,但你可以轻松地将其打包以供Python使用。API是多模块化的,这意味着任何内置模型都可以与各种类型的数据(文本,图像,音频等)一起使用。而API的作者为特定任务(如翻译,文本摘要,语音识别等)提供了推荐的数据集和模型。
GitHub:https://github.com/tensorflow/tensor2tensor#suggested-datasets-and-models
有时,你可能想要使用Tensor2Tensor的预编码模型之一,并将其应用于你自己的数据集和超参数组合。或者,你也可能想使用他们的简单框架来试验你自己的模型架构。通过定义一些新的子类可以很容易地做到这一点(我稍后会详细说明)。
T2T库有详细的说明文档,但为了深入了解,我们将逐步介绍其API的核心部分,并使用T2T开始你的第一个项目。
想要使用Tensor2Tensor(T2T),你要做的第一件事就是确定你要用它做什么,即问题是什么。这定义了你解决的任务,你使用的数据集,以及词汇表(如果可用)。这与模型架构和训练超参数无关。
from tensor2tensor import problems
# Print all T2T problems to console
problems.available()
t2t-datagen \
--data_dir=$DATA_DIR \
--tmp_dir=$TMP_DIR \
--problem=$PROBLEM
from tensor2tensor import problems
PROBLEM = '{Tensor2Tensor_problem_name}
TMP_DIR = '{/Tmp_Dir_Path}' # Where data files from internet stored
DATA_DIR = '{/Data_Dir_Path}' # Where pre-prcessed data is stored
# Init problem T2T object the generated training data
t2t_problem = problems.problem(PROBLEM)
t2t_problem.generate_data(DATA_DIR, TMP_DIR)
from tensor2tensor.utils import registry
from tensor2tensor import models
# Print all models in T2T to console
registry.list_models()
现在,你已准备好用几行代码训练你的神经网络。
使用命令行,你需要做的就是通过设置相应的变量来执行以下脚本:
t2t-trainer \
--data_dir=$DATA_DIR \
--problem=$PROBLEM \
--model=$MODEL \
--hparams_set=$HPARAMS \
--output_dir=$TRAIN_DIR
首先,你必须设置所需的T2T变量,目录,预处理数据的位置以及模型文件存储位置。
PROBLEM = ' translate_enfr_wmt32k_rev '
MODEL = ' TRANSFORMER '
HPARAMS = ' transformer_base '
TRAIN_DIR = '〜/ translator / model_files '
DATA_DIR = '〜/ translator / fr_en_data '
from tensor2tensor.utils.trainer_lib import create_hparams
# Init Hparams object from T2T Problem
hparams = create_hparams(HPARAMS)
# Make Chngaes to Hparams
hparams.batch_size = 1024
hparams.learning_rate_warmup_steps = 45000
hparams.learning_rate = .4
# Can see all Hparams with code below
print(json.loads(hparams.to_json())
from tensor2tensor.utils.trainer_lib import create_run_config, create_experiment
# Initi Run COnfig for Model Training
RUN_CONFIG = create_run_config(
model_dir=TRAIN_DIR # Location of where model file is store
# More Params here in this fucntion for controling how noften to tave checkpoints and more.
)
# Create Tensorflow Experiment Object
tensorflow_exp_fn = create_experiment(
run_config=RUN_CONFIG,
hparams=hparams,
model_name=MODEL,
problem_name=PROBLEM,
data_dir=DATA_DIR,
train_steps=400000, # Total number of train steps for all Epochs
eval_steps=100 # Number of steps to perform for each evaluation
)
# Kick off Training
tensorflow_exp_fn.train_and_evaluate()
现在你的模型训练已经开始,你可以看到损失和准确性指标的变化:
最常用于此任务准确性的指标是BLEU分数。对于法语到英语的翻译,这个模型的BLEU得分大约为28,这是最先进水平。
要使用新训练的模型进行评分,你可以使用t2t-decoder二进制文件:
t2t-decoder \
--data_dir=$DATA_DIR \
--problem=$PROBLEM \
--model=$MODEL \
--hparams_set=$HPARAMS \
--output_dir=$TRAIN_DIR \
--decode_hparams="beam_size=$BEAM_SIZE,alpha=$ALPHA" \
--decode_from_file=$DECODE_FILE \
--decode_to_file=translation.en
from tensor2tensor.utils.trainer_lib import create_hparams, registry
from tensor2tensor import problems
INPUT_TEXT_TO_TRANSLATE = 'Translate this sentence into French'
# Set Tensor2Tensor Arguments
MODEL_DIR_PATH = ~/En_to_Fr_translator'
MODEL = 'transformer'
HPARAMS = 'transformer_big_single_gpu'
T2T_PROBLEM = 'translate_enfr_wmt32k'
hparams = create_hparams(HPARAMS, data_dir=model_dir, problem_name=T2T_PROBLEM)
# Make any changes to default Hparams for model architechture used during training
hparams.batch_size = 1024
hparams.hidden_size = 7*80
hparams.filter_size = 7*80*4
hparams.num_heads = 8
# Load model into Memory
T2T_MODEL = registry.model(MODEL)(hparams, tf.estimator.ModeKeys.PREDICT)
# Init T2T Token Encoder/ Decoders
DATA_ENCODERS = problems.problem(T2T_PROBLEM).feature_encoders(model_dir)
### START USING MODELS
encoded_inputs= encode(INPUT_TEXT_TO_TRANSLATE, DATA_ENCODERS)
model_output = T2T_MODEL.infer(encoded_inputs, beam_size=2)["outputs"]
translated_text_in_french = decode(model_output, DATA_ENCODERS)
print(translated_text_in_french)
你可能已经看到上面的代码中有两个函数,名为encode()和decode()。它们用于获取常规文本数据并将其编码为适合模型的格式。类似地,在相应的输出格式中对模型输出进行解码。
这意味着他们可以在批尺寸(1024)上输入许多输入序列,并且可以更快地翻译长段落,而不必对模型进行1024次翻译调用以翻译1024个句子。
def encode(input_txt, encoders):
"""List of Strings to features dict, ready for inference"""
encoded_inputs = [encoders["inputs"].encode(x) + [1] for x in input_txt]
# pad each input so is they are the same length
biggest_seq = len(max(encoded_inputs, key=len))
for i, text_input in enumerate(encoded_inputs):
encoded_inputs[i] = text_input + [0 for x in range(biggest_seq - len(text_input))]
# Format Input Data For Model
batched_inputs = tf.reshape(encoded_inputs, [len(encoded_inputs), -1, 1])
return {"inputs": batched_inputs}
def decode(integers, encoders):
"""Decode list of ints to list of strings"""
# Turn to list to remove EOF mark
to_decode = list(np.squeeze(integers))
if isinstance(to_decode[0], np.ndarray):
to_decode = map(lambda x: list(np.squeeze(x)), to_decode)
else:
to_decode = [to_decode]
# removeTag before decoding
to_decode = map(lambda x: x[:x.index(1)], filter(lambda x: 1 in x, to_decode))
# Decode and return Translated text
return [encoders["inputs"].decode(np.squeeze(x)) for x in to_decode]
我做法语翻译器的主要原因之一是因为我在一家法国公司工作。很多人在团队聊天中讲法语。不幸的是,我根本不知道他们在说什么。
我最终使用Dataiku创建REST API端点,以使用我制作的Tensorflow模型执行翻译。我使用名为Errbot的聊天机器人API将REST端点连接到公司的Hipchat上。
Dataiku:https://www.dataiku.com/learn/guide/tutorials/deploy-scoring.html
现在,无论同事说些什么,我都可以轻松看懂。