关于Moses训练的那些事
前面已经将moses从编译到训练测试的整体流程过了一遍,想必大家对这个工具有了一个大致的理解。这里再详细说一些东西,可能能帮助大家对moses有更深的认识。
也许你在训练过程中会遇到一定的问题,事实上,训练总共分为7个steps(步骤),有些情况下(尤其是语料非常大的时候,这个本人非常有体会,昨天训练了700万句平行语料数据,结果...)执行到某些步骤的时候会停下来,这样后续步骤无法从该步骤获得数据,整个过程就停止了。也就是说:你训练到了一半!!!这是很蛋疼的一个问题,因为从头训练意味着要大量的时间,而且你还是不能保证整个步骤是流畅的,所以本节的内容可能对你帮助很大。你可以通过它了解到如何分步进行训练,也可以在训练中断时判断目前训练进度以及下一步改进型训练的哪一个小步骤了。
1训练过程中产生的文件和内容
言归正传,首先给大家介绍一下使用moses训练后的目录以及目录下的文件,在调用moses训练命令之后,如果训练全程都很顺利,那么在你的train文件夹下,会有四个文件夹Corpus、giza.zh-en、giza.en-zh、model,其目录下文件如下所示,在后续第2节会介绍每个文件夹中哪些文件分别是训练那个阶段获得的:
上述各目录结构内容截图如下所示:
lTrain文件夹下:
lTrain/corpus文件夹下:
lTrain/giza.en-zh文件夹下:
lTrain/giza.zh-en文件夹下:
lTrain/model文件夹下:
下面我们看看以上后4个文件夹下的东西的内部结构是什么样的:
Ø首先我们看看corpus下的内容:
Ø 上面是corpus下的英文部分,中文部分的文件也是类似的:
Ø下面我们看看giza.en-zh下的文件:
相应的giza.zh-en文件夹下是反过来相对应的对齐信息,这里就不一一截图列举了。
下面我们看看非常重要的部分,train/model文件夹下内容的内部结构(这里不一一详细说明,后续章节会提到这里文件内容中每个变量具体指代的含义):
aligned.grow-diag-final-and文件记录的是词和短语的对齐信息,如下
extract.inv.sorted.gz如下
extract.o.sorted.gz
extract.sorted.gz
lex.e2f
lex.f2e
moses.ini
phrase-table.gz
reordering-table.wbe-msd-bidirectional-fe.gz
2训练过程及中间步骤
整个训练的命令如之前所述,总结下来,最基本的格式是
train-model.perl--root-dir.--fzh--een--corpuscorpus/data>&LOG
其中有一些可配置参数,这个在之后会提到。这是一条总体的训练命令,也就是说敲下这条命令之后,如果中途不出问题,训练完成之后我们就可以完整的得到上述所说的四个文件夹及全部文件。事实上,moses的训练是可以分作9个步骤的,你可以通过--first-step和--last-step任意选择你需要的训练步骤,9个步骤分别如下所示(右侧为某次训练时所花费时间):
1)Preparedata(45分钟)
2)RunGIZA++(16小时)
3)Alignwords(2.5小时)
4)Getlexicaltranslationtable(30分钟)
5)Extractphrases(10分钟)
6)Scorephrases(1.25小时)
7)Buildreorderingmodel(1小时)
8)Buildgenerationmodels
9)Createconfigurationfile(1秒)
如果我们需要从第4步开始,则使用train-model.perl[...]--first-step4即可以满足我们的需求。
如果你的电脑是多核的,你可以试着加上--parallel参数,这将加快你的训练过程。
上述9个步骤中,起始步骤必须是7之前。下面我将详述以上9个步骤。
2.1第一步:preparedata
在进行第二步之前,我们的平行语料库需要先被转换成一种适用于GIZA++工具包的格式。这一步之后会有两个词汇文件被生成,这两个文件中定量地记录了我们的平行语料库中标点和词汇词组的个数。如下所示:
==>corpus/en.vcb<==
1UNK0
2the1085527
3.714984
4,659491
5of488315
6to481484
7and352900
8in330156
9is278405
10that262619
==>corpus/zh.vcb<==
1UNK0
2我1578046
3他的614454
4你们631793
GIZA++在处理的时候还需要我们将词划分到词类里(wordstobeplacedintowordclasses)。这是通过调用mkcls程序来自动完成的。词类只在GIZA++IBM重新排序模型中用到。词类文件格式如下所示:
>headcorpus/en.vcb.classes
!14
"14
#30
%31
&10
'14
(10
)14
+31
,11
2.2第二步:运行GIZA++
GIZA++是IBM模型的一个免费实现工具。他的输入需要如第一步建立的词对齐样式。
运行GIZA++这一步是整个训练过程中最耗时的一步。它同时也需要大量的内存(如果你要训练大的平行语料,我建议你在64位系统上进行,否则3.5G的内存限制很有可能让你这一步失败,我个人训练的服务器内存是12GB的)。
GIZA++能处理获得IBM模型4的转换表,但我们只对词对齐文件感兴趣,如下所示(这是moses官网训练的德语和英语对齐的一个示例,中文和英文的对齐方式可以看我上一节列举的对应文件的截图):
>zcatgiza.de-en/de-en.A3.final.gz|head-9
#Sentencepair(1)sourcelength4targetlength3alignmentscore:0.00643931
wiederaufnahmedersitzungsperiode
NULL({})resumption({1})of({})the({2})session({3})
#Sentencepair(2)sourcelength17targetlength18alignmentscore:1.74092e-26
icherklaeredieamdonnerstag,den28.maerz1996unterbrochenesitzungsperiode
deseuropaeischenparlamentsfuerwiederaufgenommen.
NULL({7})i({1})declare({2})resumed({})the({3})session({12})
of({13})the({})european({14})parliament({15})
adjourned({111617})on({})thursday({45}),({6})28({8})
march({9})1996({10}).({18})
#Sentencepair(3)sourcelength1targetlength1alignmentscore:0.012128
begruessung
NULL({})welcome({1})
这里的例子来源于moses官网,德语和英语平行语料训练的结果,在这个文件中,一些统计信息和德语句子后,对应的英语句子是词对词与德语词对齐的,例如:第一个词resumption({1})与德国第一个字wiederaufnahme对齐。
注意每个英语单词可能是对齐的多个德语词,但每个德语词只能和一个英语单词对齐。在逆GIZA++训练过程中这个限制是相反的,即一个英语词对应多个德语词,如下:
>zcatgiza.en-de/en-de.A3.final.gz|head-9
#Sentencepair(1)sourcelength3targetlength4alignmentscore:0.000985823
resumptionofthesession
NULL({})wiederaufnahme({12})der({3})sitzungsperiode({4})
#Sentencepair(2)sourcelength18targetlength17alignmentscore:6.04498e-19
ideclareresumedthesessionoftheeuropeanparliamentadjournedonthursday,
28march1996.
NULL({})ich({1})erklaere({210})die({4})am({11})
donnerstag({12}),({13})den({})28.({14})maerz({15})
1996({16})unterbrochene({3})sitzungsperiode({5})des({67})
europaeischen({8})parlaments({9})fuer({})wiederaufgenommen({})
.({17})
#Sentencepair(3)sourcelength1targetlength1alignmentscore:0.706027
welcome
NULL({})begruessung({1})
2.3第三步:AlignWords
词对齐的过程建立基于两个GIZA++对齐步骤,可以使用一系列的探索法。其中默认的探索法是grow-diag-final(生长-诊断-结束),该过程由两个对齐的词开始,逐步添加新的对齐词直至完成句子的对齐。
其余的对齐探索方法如下所示:
Øintersection
Øgrow(onlyaddblock-neighboringpoints)
Øgrow-diag(withoutfinalstep)
Øunion
Øsrctotgt(onlyconsiderword-to-wordalignmentsfromthesource-targetGIZA++alignmentfile)
Øtgttosrc(onlyconsiderword-to-wordalignmentsfromthetarget-sourceGIZA++alignmentfile)
这些方法之间可以通过--alignment参数进行选择和切换.
默认的grow-diag-final探索法的对齐过程伪代码如下所示:
GROW-DIAG-FINAL(e2f,f2e):
neighboring=((-1,0),(0,-1),(1,0),(0,1),(-1,-1),(-1,1),(1,-1),(1,1))
alignment=intersect(e2f,f2e);
GROW-DIAG();FINAL(e2f);FINAL(f2e);
GROW-DIAG():
iterateuntilnonewpointsadded
forenglishworde=0...en
forforeignwordf=0...fn
if(ealignedwithf)
foreachneighboringpoint(e-new,f-new):
if((e-newnotalignedorf-newnotaligned)and
(e-new,f-new)inunion(e2f,f2e))
addalignmentpoint(e-new,f-new)
FINAL(a):
forenglishworde-new=0...en
forforeignwordf-new=0...fn
if((e-newnotalignedorf-newnotaligned)and
(e-new,f-new)inalignmenta)
addalignmentpoint(e-new,f-new)
下面的图是对齐的例子:
在上图的对齐基础上,加上了一些新的对齐词组并调整,如下图:
但是上图中两个动词的对齐方式混淆了,resumed和unterbrochene对齐,adjourned和wiederaufgenommen对齐,但事实上,实际的对齐结果是相反的。
我们来看一看,词语对齐之后的结果文件,也许对本节的认识会深一些:
==>model/aligned.de<==
wiederaufnahmedersitzungsperiode
icherklaeredieamdonnerstag,den28.maerz1996unterbrochenesitzungsperiode
deseuropaeischenparlamentsfuerwiederaufgenommen.
begruessung
==>model/aligned.en<==
resumptionofthesession
ideclareresumedthesessionoftheeuropeanparliamentadjournedon
thursday,28march1996.
welcome
==>model/aligned.grow-diag-final<==
0-00-11-22-3
0-01-12-33-103-114-115-127-138-149-1510-211-412-512-613-7
14-815-916-917-16
0-0
2.4第四步:GetLexicalTranslationTable(获得词汇翻译概率表)
基于上一步得到的对齐词汇表,很容易估计得到一个最大似然词汇翻译表。我们估计的W(E|F)以及逆W(F|E)字翻译表。下面为europa这个德语单词翻译成英文的最佳翻译结果:
>grep'europa'model/lex.f2n|sort-nrk3|head
europeeuropa0.8874152
europeaneuropa0.0542998
unioneuropa0.0047325
iteuropa0.0039230
weeuropa0.0021795
eueuropa0.0019304
europeanseuropa0.0016190
euro-mediterraneaneuropa0.0011209
europaeuropa0.0010586
continenteuropa0.0008718
2.5第五步:ExtractPhrases(抽取短语)
在这一步中,所有的短语被扔进了一个大的文件中,文件从前那往后读的部分内容如下所示:
>headmodel/extract
wiederaufnahme|||resumption|||0-0
wiederaufnahmeder|||resumptionofthe|||0-01-11-2
wiederaufnahmedersitzungsperiode|||resumptionofthesession|||0-01-11-22-3
der|||ofthe|||0-00-1
dersitzungsperiode|||ofthesession|||0-00-11-2
sitzungsperiode|||session|||0-0
ich|||i|||0-0
icherklaere|||ideclare|||0-01-1
erklaere|||declare|||0-0
sitzungsperiode|||session|||0-0
可以从上面看到,每一行的格式都是固定的:德语,英语,词对齐时候的点标记。点标记是一对一对的。哦,对了,还有一个逆的extract.inv也产生了,里面的内容和上述文件刚好是相反的。
2.6第六步:ScorePhrases(短语概率打分)
随后,从存储的短语翻译对中我们可以得到一张翻译表。需要有这个步骤而不是直接用翻译表替代短语翻译表,是因为较大的翻译模型中,短语翻译表在内存中存不下。幸运的是,我们不必在内存中存储整个短语翻译表,我们可以将其构建在磁盘上。
估计的短语翻译概率φ(E|F)我们的步骤如下:首先,提取文件排序。这将确保一个外国短语的所有英语短语翻译文件是在彼此旁边的。因此,我们可以处理文件中某一个词的时候,对其翻译做收集和计数,并计算φ(E|F),其中F为外国短语(源语言短语).估计φ(F|E)时,倒排文件要进行排序,φ(F|E)计算时,一个英语短语估测一次。
在得到短语翻译概率分布φ(F|E)和φ(E|F)之后,有一些其他的短语翻译打分结果可以计算,例如词汇权重,单词惩罚,短语惩罚等。目前我们在计算的时候,词汇权重是正向反向翻译概率的叠加,再加上五分之一分的短语惩罚。下面是其中文件的示例:
>grep'|ineurope|'model/phrase-table|sort-nrk7-t\||head
ineuropa|||ineurope|||0.8290070.2079550.8014930.4924022.718
europas|||ineurope|||0.02510190.0662110.03425060.00795632.718
indereuropaeischenunion|||ineurope|||0.0184510.001001260.03195840.01968692.718
ineuropa,|||ineurope|||0.0113710.2079550.2078430.4924022.718
europaeischen|||ineurope|||0.006865480.07543380.0008637910.0461282.718
imeuropaeischen|||ineurope|||0.005792750.009146010.02412870.01624822.718
fuereuropa|||ineurope|||0.004934560.01323690.03721680.05114732.718
ineuropazu|||ineurope|||0.004290920.2079550.7142860.4924022.718
aneuropa|||ineurope|||0.003861830.01144160.3529410.1184412.718
dereuropaeischen|||ineurope|||0.003432740.001415320.000995830.0005121592.718
在现在的moses翻译系统中,我们计算了五种不同的翻译概率,分别是:
1.inversephrasetranslationprobability反向短语概率φ(f|e)
2.inverselexicalweighting反向词汇权重lex(f|e)
3.directphrasetranslationprobability正向短语翻译概率φ(e|f)
4.directlexicalweighting正向词汇权重lex(e|f)
5.phrasepenalty短语惩罚度(alwaysexp(1)=2.718)
默认的情况下我们会使用到上述5中概率,但是也许你只想使用上述概率中的一部分,这样的话,可以通过以下的参数来作调整:
·NoLex--donotuselexicalscores(removesscore2and4)
·OnlyDirect--donotusetheinversescores(removesscore1and2)
·NoPhraseCount--donotusethephrasecountfeature(removesscore5)
这在训练的时候,在调用train-model.perl后添加-score-options调用上述参数可以做到:
train-model.perl[...othersettings...]-score-options'--NoLex'
分享到:
相关推荐
从Moses前期工作,Moses统计机器翻译系统的环境搭建到准备语料库,标注,训练语言模型,训练翻译模型,调优,测试等整个步骤特别详细。“只要看懂中文,剩下的本文帮你解决”!
MOSES
MOSES算法MOSES算法.pdf
moses文档 指导更好的使用机器翻译系统moses
全面介绍moses机器翻译系统的文档,既是使用手册,也是机器翻译教程。
MOSES已用于多种商业应用中,包括对医疗患者和医师临床数据的分析,以及多种不同的金融系统。 OpenCog还使用它来学习自动行为,动作和动作,以响应人工生命虚拟代理(例如,宠物狗游戏的化身)的感知刺激。 未来的...
This document serves as user manual and code guide for the Moses machine translation decoder. The decoder was mainly developed by Hieu Hoang and Philipp Koehn at the University of Edinburgh and ...
Spectral Analysis of Signals Petre Stoica, Uppsala University Randolph L. Moses, Ohio State University Prentice Hall, 2005 ISBN: 0-13-113956-8
Spectral Analysis of Signals Petre Stoica, Uppsala University Randolph L. Moses, Ohio State University Prentice Hall, 2005 ISBN: 0-13-113956-8
Moses This book presents an introduction to spectral analysis that is designed for either course use or self-study. Clear and concise in approach, it develops a firm understanding of tools and ...
该系统具有附加参数、在线特征的权重和在线算法的学习率。 这些参数可以作为 1. "weight-ol <weight>" : is the initial weight of the online feature function2. "f_learningrate <rate>" : is the learning rate...
Altium_Designer使用指南V2(Moses)
MOSES已用于多种商业应用中,包括对医疗患者和医师临床数据的分析,以及多种不同的金融系统。 OpenCog还使用它来学习自动行为,动作和动作,以响应人工生命虚拟代理(例如,宠物狗游戏的化身)的感知刺激。 未来的...
Moses存储库已移动:https://github.com/moses-smt/mosesdecoder用于统计机器翻译的基于短语的分解式,分层和语法解码器
摩西塔格 用于以MOSES格式准备语料库的标记器。
上传一份英文清晰版的,是djvu格式的,大家喜欢可以下载看下
1000)时,MOSES在合成和真实数据集的数值实验中均显示了最先进的性能,但比竞争对手快了几个数量级。 要求 该代码通常是自包含的,并且包含或生成了所有数据集,因此,从理论上讲,仅安装Matlab就足够了。 但必须...
该模型不需要hBOA算法那样对变量集合进行建模,也不需要像MRTS算法那样遍历小规模的种群来发现潜在的有指导意义的子树。通过解决人工蚂蚁问题对算法进行了测试,结果表明改进后的MOSES算法更加高效。