zoukankan      html  css  js  c++  java
  • google nmt 实验踩坑记录

       最近因为要做一个title压缩的任务,所以调研了一些text summary的方法。

       text summary 一般分为抽取式和生成式两种。前者一般是从原始的文本中抽取出重要的word or sentence,然后按照一定的语法或者句法进行组合,从而对原始的文本进行压缩。再文本摘要的早期,基本都是这个思路,代表性的方法是textrank。所谓生成式的方法,就是试图让机器理解原始的文本,从而自己归纳出原始文本的摘要,给出的结果(词语或者句子)可能是原始文本中没有出现过的,这也是其与抽取式的方法最大的不同之处。

       随着最近几年深度学习的大行其道,生成式的方法的研究也逐渐多了起来。其实最主流的思路就是使用基于深度学习的seq2seq框架。说起seq2seq就不得不提著名的nmt(nerual machine translation,神经机器翻译),其基本也是基于seq2seq框架的,一般分为encoder和decoder,最近几年流行在基本的seq2seq框架上加上attention机制(注意力机制),一般可以显著提高translation的质量。

        废话了这么多,本文是对于google nmt 官方github repo 实验的一个踩坑记录。基本不做理论方面的讨论,主要讨论记录一些实验结果。

    1. google nmt 官方 github 地址:nmt

    2. clone repo to local,这个按照教程做就可以了,不表。

    3. first experiment

    • 教程中给出的第一个实例是越南语到英语的翻译(Vietnamese to English),
      具体如何下载数据,训练(train)以及在测试集上推断(infer)的脚本github上面都说的很清楚了,不表。

    • 注意第一个实验只是作为一个demo,其训练数据只有13w+,这个对于大规模的机器翻译真的可以说是very small
      了。

    • 数据的准备一般有以下部分:

      1. source language & target language,格式是每行一句话,source & target两个文件每行是一一对应的,
      2. 还有就是需要source & target 的vocabulary(词汇表),其中包括了该种语言尽可能多的词汇,每行一个word(还
        包括特殊的开始,结束token,unknow token)
      3. 数据集分为三个部分,训练集,验证集,测试集,特别地,.vi结尾的是越南语文件,.en结尾的是英语文件
    • 作者进行了普通的nmt 以及加入了attention 机制的nmt两组实验

    • 我使用了公司四核(4*24G) RAM 的 Tesla M40 显卡 进行train & infer(使用 nvidia-smi 查看nvidia 显卡信息)

    • 实验结果表明在训练数据较少的情况下,使用attention 的nmt 的翻译质量还是比不加attention的翻译强不少的,这个结果是
      通过将二者的翻译结果分别于参考翻译进行粗略得到的,当然使用定量的bleu指标也可以得到一样的结论,加入attention的nmt bleu
      score 要比普通的nmt 高不少。具体结果见下图1,2:

    图1:普通nmt翻译结果(右)与参考翻译(左)


    图2:nmt with attention 翻译结果(右)与参考翻译(左)

    直观看上去,确实是attention nmt 的翻译质量更胜一筹。

    2. second experiment

    • 教程中给出的第二个实验是德语到英语的翻译(WMT German-English)

    • 这个部分的训练数据就比较大了,400w+行,教程中提供了train 和 infer 两个脚本,
      在下载完数据之后,我又下载了几个pretrained de-en(德语到英语) model,但是发现
      infer总是会报错如下:

    FailedPreconditionError (see above for traceback): 
    Attempting to use uninitialized value dynamic_seq2seq/decoder/multi_rnn_cell/cell_1/basic_lstm_cell/kernel
    	 [[Node: dynamic_seq2seq/decoder/multi_rnn_cell/cell_1/basic_lstm_cell/kernel/read = Identity[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"]
    	 (dynamic_seq2seq/decoder/multi_rnn_cell/cell_1/basic_lstm_cell/kernel)]]
    
    • de-en infer fail 这个问题暂时没有找到原因。

    • de-en train from stratch 没有问题,但是因为训练数据巨大,所以应该需要训练很久(几天吧)

    3. 使用nmt 做 text summary

    • text summary 在nmt的框架下,可以看做是单语言的简化(一般的翻译是两个语言之间),原文是source,
      summary 是target

    • 需要准备的训练数据有:

      1. text.ori:原始的文本,每行一个文本,越多越好,需要去除一些无关词汇
      2. text.sum:原始文本对应的summary文本,每行一个summary
      3. vocab.txt:全部的word组成的文本,包括token_start,token_end,以及unknow_token等
    • train & infer 的脚本仿照 vi-en 或者de-en来写就行,需要显示指定source 以及target,可以这样写:

    --src=ori --tgt=sum
    

    其余的参数类似指定

    • 这部分的实验,TODO

    4. OTHERS

    • google nmt github repo 讲的非常清楚,除了代码部分,关于nmt,attention等基础知识也讲的很清楚,值得一看,
      而且它也给出了一些有价值的参考资料,可以好好阅读一下。
  • 相关阅读:
    SQLLoader7(只导入数据文件的其中几行记录)
    SQLLoader6(一个或多个数据文件按条件导入不同的表)
    SQLLoader5(从多个数据文件导入到同一张表)
    SQLLoader4(数据文件中的列与表中列不一致情况-filler)
    SQLLoader3(数据文件没有分隔符时的导入)
    SQLLoader2(导入EXCEL或csv格式的文件)
    SQLLoader1(简单测试,以控制文件方式导入数据)
    可编程内存
    JSONP
    SSL协议
  • 原文地址:https://www.cnblogs.com/lyrichu/p/10325218.html
Copyright © 2011-2022 走看看