HTK嵌入式訓練

HERest介紹

HTK嵌入式訓練主要由HERest來完成,它實現的功能有ML、MAP、Semi-Tied、HLDA、MLLR、CMLLR等,考慮到訓練數據量的問題,HERest還支持並行訓練,這裏介紹最基本的也是最重要的ML訓練過程(基於最大似然準則),並且假設HMM是連續的。

 

一. 數據結構

 

     ** HMM Definition相關的數據結構

   HMMSet            //HMM Sets信息
   MLink             //Macro信息
   HLink             //HMMDef信息,包含transition matrix
   StateElem         //多個狀態信息
   StateInfo         //單個狀態信息,包含多流信息
   StreamElem        //單流信息
   MixtureVector     //共同體,多個混合分量信息
   MixtureElem       //單個混合分量信息,包含mixture weight
   MixPDF            //單個高斯模型參數信息,包含mean vector和covariance matrix or vector

 

     ** Accumulators相關的數據結構 

   TrAcc             //transP的累積量,存放在transP的hook中
   WtAcc             //weight的累積量,存放在StreamElem的hook中
   MuAcc             //mean的累積量,存放在mean vector的hook中
   VaAcc             //var的累積量,存放在covariance matrix or vector的hook中

   SVector的sv[0]前有兩個(void *)大小的內存hook、use,hook是一個指針,use表明這個vector的使用情況,SMatrix類似於SVector,也有use和hook

 

     ** Forward-Backward相關的數據結構

   FBInfo            //存儲up和al兩種hset並有一個指向AlphaBeta的指針
   AlphaBeta         //存儲當前句子的Q個子詞模型以及alpha-beta、occ值
   PruneInfo         //存儲beam、taper相關信息

 

     ** MLF相關的數據結構

   MLFEntry          //存儲entry的信息,如果非general,則使用hash
   MLFDef            //the actual def
   ImmDef            //存儲entry在MLF中的偏移量

 

     ** Transcription相關的數據結構

   UttInfo           //structure for the utterance information
   Transcription     //當前句子的標註信息
   LLink             //Information for each label
   ParmBuf           //當前句子的特徵

 

 

 

二. 初始化

 

     ** 模型初始化

     模型初始化包括讀取MMF文件、分配累積量所需空間並初始化、FBInfo初始化以及計算每個模型的最小時長。

 

   1. Initialise()
   //模型初始化函數

   2. MakeHMMSet(HMMSet *hset, char *fname)
   //從mlist中讀取phnset來分配hset中mtab[hashval]的內存,如果邏輯模型和物理模型名稱相同則mtab[hashval]鏈表長度是二,第一個Macro類型爲'l',第二個Macro類型爲'h',並且兩個Macro同時指向一個HLink。如果邏輯模型和物理模型名稱不相同則mtab[hashval]的鏈表長度是1,Macro類型爲'l'

   2. LoadHMMSet(HMMSet *hset, char *hmmDir, char *hmmExt)
   //從MMF中按Macro類型取模型參數存入mtab[hashval]中,對於一些共享的Macro比如共享狀態、transP也讀入按hashval存入mtab中,如果某個phnset包含共享狀態,則其mtab[hashval]會指向這個共享的Macro,這些共享的Macro在MMF文件的最前面因此會最先被讀入

   2. AttachAccs(HMMSet *hset, MemHeap *x, UPDSet uFlags)
   //分配uFlags對應的所有累積量的內存

   2. ZeroAccs(HMMSet *hset, UPDSet uFlags)
   //累積量置零

   2. InitialiseForBack()
   //Initialise the forward backward memory stacks and make initialisations

   3. SetMinDurs(HMMSet *hset)
   //根據transP計算每個模型的最小時長,並將其值(單位爲幀)存在transP的hook中的minDur中

 

 

     ** 標註、特徵初始化及讀取

   1. LoadMasterFile(char *fname)
   //讀取MLF文件中的entry信息到全局的mlfHead和mlfTail中,信息還包括entry在整個文件中的偏移量,方便讀取標註內容

   1. InitUttInfo( UttInfo *utt, Boolean twoFiles )
   //Initialise the utterance memory requirements

   1. LoadLabs(UttInfo *utt, FileFormat lff, char * datafn, char *labDir, char *labExt)
   //裝入標註信息,根據datafn從mlfHead中讀取其對應的標註內容在MLF文件中的偏移量,再調用LoadHTKLabels()

   1. LoadData(HMMSet *hset, UttInfo *utt, FileFormat dff, char * datafn, char * datafn2)
   //裝入觀察序列,存入utt->pbuf->data.main中,變換成targetkind的特徵按float字節順序存儲

 

 

 

三. 前後向算法

 

代碼中先進行後向算法StepBack()再進行前向算法StepForward()並進行累計器的更新。

 

StepBack()的主要過程如下

   1. 設置剪枝信息
   2. 初始化AlphaBeta數據結構CreateInsts()
   3. 設置後向錐SetBeamTaper()
   4. 計算後向概率lbeta=SetBeta()

 

四. ML模型更新

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章