最大熵模型的优点在于可以添加任意自定义特征,且不需要保持维度一致性(通俗而言,就是每个样本满足哪些特征,就放哪些特征;特征函数的取值均为 0 或 1;放进来的特征即表示该样本在该特征维度上取值为 1,否则默认为 0),因此适用于特征维度极大的分类任务;例如 NLP 工作中的词性标注,依据上文出现的词语判断词性,出现的词语即表示为 1,语料库中词汇的数量通常高达数十万,在通常模型中构造维度高达数十万的训练样本显然是不现实的,而通过最大熵模型,每个样本只需要提供个位数的特征信息。相对于隐马尔科夫模型,最大熵模型破除了齐次性的假设,同时引入特征函数,使模型预测得以考虑更多复杂特征,而非只有上一时间步长的状态。
模型训练时计算经验分布下的特征权重和当前训练样本下的特征权重,通过算法收敛使得训练样本下的模型特征权重逐渐接近经验分布下的特征权重。当测试样本中出现超出训练样本特征集的特征,模型在计算其针对各个分类的条件概率 p ( y ∣ x i ; x 1 , x 2 , . . . x n ) p(y|x_i;x_1,x_2,...x_n) p(y∣xi;x1,x2,...xn) 时默认其为均匀分布,即最大熵最核心的思想——最大熵。由于该模型的数学原理较为复杂,笔者暂时只呈现相关代码 (今后有空闲时间再补充),对相关原理感兴趣可先参考这一篇文章:最大熵模型 。
以下代码来自郑捷所著《NLP汉语自然语言处理,原理与实践》,使用如下函数进行梯度更新: Δ W = 1 M l o g E p ∗ E p \Delta W = \frac{1}{M}log\frac{E_{p^*}}{E_p} ΔW=M1logEpEp∗