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模型更新