點擊上方藍色字體,關注AI小白入門喲
跟着博主的腳步,每天進步一點點
本文介紹了最大熵馬爾可夫模型,在隱馬爾可夫模型(隱狀態序列)的基礎上應用最大熵模型思想,將一個概率生成模型轉化爲概率判別模型,同樣最大熵馬爾可夫模型帶解決的三個問題:1)概率計算,2)參數學習,3)序列預測,其中概率計算與參數學習類比於最大熵模型,序列標註採用維特比解碼。
作者 | 文傑
編輯 | yuquanle
最大熵馬爾科夫模型
有最大熵模型和隱馬爾可夫模型的基礎,再看最大熵馬爾科夫模型就直觀多了。在隱馬爾可夫模型中:
即與之間獨立作用。在最大熵馬爾科夫模型中則沒有這一假設,而直接採用條件概率的形式輸出模型。
結合最大熵模型,不考慮整個序列時,第時刻的狀態可以看作是一個分類問題,採用最大熵模型,由和,構成分類模型,有最大熵模型的結論,我們知道分類模型是一個關於的函數,表達式如下:
其中是聯合標籤特徵模板,是特徵模板的權重,是聯合所有可能的標籤特徵模板求和,表示歸一化因子。對於參數的求解,可以採用最大熵模型的使用的優化算法,但是值得注意的是,在優化求解過程中,每個時刻單獨歸一化,不考慮序列性。
這裏,由於筆者之前的誤解,對於最大熵模型的特徵模板的概率求解採用最大似然估計的方式直接對特徵模板進行統計,以其頻率作爲概率,結果發現還是有效。其中原因可能是我的這種統計方式是基於期望最大化的思想,運用最大似然估計得到模型參數正好是統計頻率。
在狀態預測中,考慮最大化整個序列的概率,意味着目標函數如下:
目標函數也就是求解一條最優的狀態轉移路徑,同樣可以採用Viterbi算法。
代碼實戰
A、最大熵模型維特比算法
int Viterbi_M(const DataStr &testdata)
{
int t,i,j,k;
int pos;
double deta[VEC_LEN][STATE];
int fai[VEC_LEN][STATE];
double max_deta;
double max_fai;
int max_i;
for(i=0; i<STATE; i++)
{
pos=getPos(testdata[0][0]);
deta[0][i]=dicos_m.ps0[i]*dicos_m.pos[pos][i];
fai[0][i]=0;
}
for(k=0; k<testdata.size(); k++)
{
for(t=1; t<testdata[k].size(); t++)
{
for(i=0; i<STATE; i++)
{
max_deta=double_min;
max_fai=double_min;
for(j=0; j<STATE; j++)
{
pos=getPos(testdata[k][t]);
if(deta[t-1][j]*dicos_m.pss[j][i]*dicos_m.pos[pos][i]>max_deta)
{
max_deta=deta[t-1][j]*dicos_m.pss[j][i]*dicos_m.pos[pos][i];
}
if(deta[t-1][j]*dicos_m.pss[j][i]>max_fai)
{
max_fai=deta[t-1][j]*dicos_m.pss[j][i];
max_i=j;
}
}
deta[t][i]=max_deta;
fai[t][i]=max_i;
}
}
max_deta=double_min;
for(i=0; i<STATE; i++)
{
if(deta[testdata[k].size()-1][i]>max_deta)
{
max_deta=deta[testdata[k].size()-1][i];
max_i=i;
}
}
cout<<max_i;
for(t=testdata[k].size()-2; t>=0; t--)
{
max_deta=double_min;
cout<<fai[t+1][max_i];
for(i=0; i<STATE; i++)
{
if(deta[t][i]>max_deta)
{
max_deta=deta[t][i];
max_i=i;
}
}
}
cout<<endl;
}
}
完整代碼見閱讀原文。
The End
方便交流學習,備註:暱稱-學校or公司-方向,進入DL&NLP交流羣。
記得備註呦
【推薦閱讀】
長按二維碼關注
AI小白入門
ID:StudyForAI
學習AI學習ai(愛)
期待與您的相遇~
你點的每個在看,我都認真當成了喜歡