GIZA++實現了IBM模型1~5 IBM Model 1詳解


IBM model是統計機器翻譯中的經典翻譯模型,也是基於詞的統計機器翻譯系統的基礎。IBM翻譯模型共有5個復雜度依次遞增的統計翻譯模型,IBM model1是其中最簡單的模型,也是其他模型進行計算的基礎。IBM模型1僅僅考慮詞對詞的互譯概率,模型2引入了詞的位置變化概率,而模型3加入一個詞翻譯成多個詞的概率。

為翻譯模型建模

    假設任意一個英語句子e和法語句子f,定義f翻譯成e的概率為P(e|f),於是將f翻譯成e的問題則變成求解

                                    IBM翻譯模型1總結理論篇(原創)                                      1

根據噪聲信道模型,統計機器翻譯要尋找e使得滿足公式(1)。

IBM模型注意到翻譯模型中的一個隱含變量信息,及即句子中詞語的對位信息:對齊A。於是有:

                               IBM翻譯模型1總結理論篇(原創)                                   2

假設英文串e的長度為l,記做。法語串f的長度為m,記做IBM翻譯模型1總結理論篇(原創)。則對齊a可以由一串包含有個值的位置信息記錄,表示法語句子中單詞對應英語句子單詞的位置。IBM翻譯模型1總結理論篇(原創),每個值的取值范圍為IBM翻譯模型1總結理論篇(原創)。因此,

                 IBM翻譯模型1總結理論篇(原創)            3

具體的證明參考http://luowei828.blog.163.com/blog/static/31031204201123010316963/

該公式可以理解為:根據英文句子生成一個法語句子以及對齊過程。首先根據英文句子選擇法語句子長度,其次選擇第一個法語詞串的鏈接位置,然后根據英語句子、法語句子長度、法語句子第一個詞對應英語句子的位置選擇法語句子的第一個詞(比較拗口-_-!)。由此類推,則可以生成整個法語句子。

 

引出IBM模型1

    IBM模型1對公式(3)進行化簡,並做出如下假設:

1)假設P(m|e)與目標語言e和源語言長度m無關。

2)假設IBM翻譯模型1總結理論篇(原創)僅僅依賴於目標語言e的長度l,則

                               IBM翻譯模型1總結理論篇(原創) 

3)假設IBM翻譯模型1總結理論篇(原創)僅僅依賴於IBM翻譯模型1總結理論篇(原創)IBM翻譯模型1總結理論篇(原創)

IBM翻譯模型1總結理論篇(原創)IBM翻譯模型1總結理論篇(原創)。其中IBM翻譯模型1總結理論篇(原創)叫做給定IBM翻譯模型1總結理論篇(原創)IBM翻譯模型1總結理論篇(原創)的翻譯概率。

帶入(3)中可得

                         IBM翻譯模型1總結理論篇(原創)                           4

由於每個對齊變量的取值范圍均為 ,則(2)可改寫為

                      IBM翻譯模型1總結理論篇(原創)                         5

在引入拉格朗日因子IBM翻譯模型1總結理論篇(原創)后,求解翻譯概率極大值問題轉換為求輔助函數在無限定條件下的極大值問題。輔助函數的形式為

                 IBM翻譯模型1總結理論篇(原創)              6

    上式對t(f|e)求偏導,得

                IBM翻譯模型1總結理論篇(原創)        7

令(7)為0,則有

                IBM翻譯模型1總結理論篇(原創)              8

    借助(4)式,則(8)式可改寫為

                           IBM翻譯模型1總結理論篇(原創)                       (9

    其中IBM翻譯模型1總結理論篇(原創)表示在對位中e鏈接到f的次數。

    定義IBM翻譯模型1總結理論篇(原創)為在給定e的前提下,e鏈接到f次數的期望為

                           IBM翻譯模型1總結理論篇(原創)                    10

    同時由IBM翻譯模型1總結理論篇(原創)替代IBM翻譯模型1總結理論篇(原創),則(10)可以表示為

                                    IBM翻譯模型1總結理論篇(原創)                                11

    實際訓練數據往往由一系列的翻譯對組成,如IBM翻譯模型1總結理論篇(原創)。因此等式(11)變為

                                  IBM翻譯模型1總結理論篇(原創)                          12

    式中,IBM翻譯模型1總結理論篇(原創)僅僅作為歸一化系數。

    公式(5)的右側部分可以進行化簡,具體方法解釋參見[Brown, 2003]。根據模型1的特點,可得

                                 IBM翻譯模型1總結理論篇(原創)                     13

    於是,公式(5)則改寫為

                                   IBM翻譯模型1總結理論篇(原創)                          14

    將上式帶入(8)求偏導,得到

                         IBM翻譯模型1總結理論篇(原創)            15

    其中,IBM翻譯模型1總結理論篇(原創)表示翻譯對f在句子f中的count數。同理,IBM翻譯模型1總結理論篇(原創)表示翻譯對e在句子e中的count數。

 

IBM模型的EM算法

    利用公式(12)和(15)即可完成對參數t(f|e)的估計。具體方法如下:

1)  選擇的t(f|e)的初始概率。

2)  對每一個句對IBM翻譯模型1總結理論篇(原創),使用公式(15)計算IBM翻譯模型1總結理論篇(原創)count數。

3)  為每個在句子IBM翻譯模型1總結理論篇(原創)中的單詞e

a)  根據等式IBM翻譯模型1總結理論篇(原創)計算IBM翻譯模型1總結理論篇(原創)的取值;

b)  為每個在句子IBM翻譯模型1總結理論篇(原創)中的單詞f,利用公式(12)計算得到新的t(f|e)

    4)重復2)、3)步驟,直到t(f|e)趨於期望值。


GIZA++實現了IBM模型1~5的所有代碼,在生成源語言與目標語言之間翻譯概率的同時,也產生相應的副產品——“詞對齊”。這個副產品成為各種統計機器翻譯系統的基石,直到今天,大部分系統仍然首先使用GIZA++對大量平行語料進行詞對齊。在阿拉伯語、中文等語言與印歐語系語言的對齊中錯誤率仍然很高。特別是中文,錯誤率常常達到30%以上。


這里主要對GIZA++開源代碼中的IBM model1實現部分進行總結,同時對詞對齊技術進行簡單的介紹。

 

GIZA++中的IBM model1源代碼解析

    通過對GIZA++開源代碼進行剝離,僅僅保留IBM model1相關部分的代碼。則訓練部分的核心代碼為

double StartTraining(int& result) { //開始訓練對齊……

    讀取中英文詞匯表 //eTrainVcbList.readVocabList();

    讀取中英文平行語料信息

    新建辭典

    構造IBM model1

    EM算法迭代

    生成詞對齊信息

    輸出計算結果

}

    其中,EM算法迭代是整個訓練過程的核心代碼。在介紹算法迭代源碼之前,首先對IBM模型1的數據結構進行簡單的介紹。

 

IBM model1主要數據結構

   class model1 : public report_info{

public:

string efFilename;

vcbList&  Elist ;

vcbList&  Flist ;

float eTotalWCount ; // size of source copus in number of words

float fTotalWCount ; // size of target corpus in number of words

int noEnglishWords;

int noFrenchWords;

tmodel<COUNT, PROB>&tTable;

Vector<WordEntry>& evlist ;

Vector<WordEntry>& fvlist ;

public:

    void initialize_table_uniformly();

int em_with_tricks();

private:

        void em_loop();

};

    模型1最重要(應該是唯一)的參數就是詞匯的翻譯概率,其數據保存在tmodel類中。tmodel類的核心數據為hash_map ef。

hash_map的每個單元可以簡單表示為

struct{

WordIndex;

WordIndex;

Prob;

Count;

}

即源語言、目標語言詞匯ID,二者的翻譯概率以及同現count數目。

其它諸如vcbList表示詞匯列表信息,而Vector<WordEntry>& evlist則表示該詞匯列表中對應的概率信息。

 

IBM model1核心算法

    int em_with_tricks(int noIterations, bool seedModel1, Dictionary& dictionary, bool useDict)

    em_with_tricks()是整個迭代算法的核心部分。輸入變量noIterations表示循環迭代次數,默認值為5;seedModel1還不是很清楚;useDict表示是否加入詞典。該函數的代碼部分主要包括

    int em_with_tricks(){

        for(int it = 1; it <= noIterations; it++){

            初始化對齊信息    //initAL();

            em迭代            //em_loop();

            歸一化條件概率 // tTable.normalizeTable(Elist, Flist);

        }

    }

    在每次循環過程中,均會調用em_loop()函數,對讀入的每一個句子對,根據tTable中的prob值,計算在這個句子對中,互為翻譯對出現的count數目,進而改變tTable中的count值。當所有句子對讀完后,根據count改變prob信息,從而完成一次循環。

    void em_loop(int it, Perplexity& perp, sentenceHandler& sHandler1, bool seedModel1,

bool dump_alignment, const char* alignfile, Dictionary& dict, bool useDict, Perplexity& viterbi_perp, bool test)

    em_loop()在每次循環的過程中均會被調用,一次迭代過程在em_loop()中實現。it表示迭代次數id,perp表示概率信息,viterbi_perp表示viterbi概率。函數的主要實現部分包括

void em_loop(){

        while(sHandler1.getNextSentence(sent)){  //獲得句子對信息

            for(j=1; j <= m; j++){

                //entries that map fs to all possible ei in this sentence.

                if (it == 1 && !seedModel1){

                    第一次迭代則獲得默認的初始概率

                }

                else{

                    for((i=0),(sPtrCachePtr=&sPtrCache[0]); i <= l; i++,sPtrCachePtr++){

                        修改對應的翻譯概率,並記錄最優概率對應的位置

                    }

                }

記錄最優概率位置並計算交叉熵

                cross_entropy += log(denom);  //這里的log是以e為底

                for(i=0, (sPtrCachePtr=&sPtrCache[0]); i <= l; i++,sPtrCachePtr++){

                    統計翻譯對增加的count數目

                }

           }

           增加prep以及viterbi_perp困惑度因子

           計算句子的詞對齊

        }

}

以上是


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com