条件随机场之CRF++源码详解-训练

  上篇的CRF++源码阅读中, 我们看到CRF++如何处理样本以及如何构造特征。本篇文章将继续探讨CRF++的源码,并且本篇文章将是整个系列的重点,会介绍条件随机场中如何构造无向图、前向后向算法、如何计算条件概率、如何计算特征函数的期望以及如何求似然函数的梯度。本篇将结合条件随机场公式推导和CRF++源码实现来讲解以上问题。原文链接

开启多线程

  我们接着上一篇encoder.cpp文件中的learn函数继续看,该函数的下半部分将会调用具体的学习算法做训练。目前CRF++支持两种训练算法,一种是拟牛顿算法中的LBFGS算法,另一种是MIRA算法, 本篇文章主要探讨LBFGS算法的实现过程。在learn函数中,训练算法的入口代码如下:

switch (algorithm) { case MIRA:                    //MIRA算法的入口 if (!runMIRA(x, &feature_index, &alpha[0], maxitr, C, eta, shrinking_size, thread_num)) { WHAT_ERROR("MIRA execute error"); } break; case CRF_L2:                  //LBFGS-L2正则化的入口函数 if (!runCRF(x, &feature_index, &alpha[0], maxitr, C, eta, shrinking_size, thread_num, false)) { WHAT_ERROR("CRF_L2 execute error"); } break; case CRF_L1:                  //LBFGS-L1正则化的入口函数 if (!runCRF(x, &feature_index, &alpha[0], maxitr, C, eta, shrinking_size, thread_num, true)) { WHAT_ERROR("CRF_L1 execute error"); } break; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzdfp.html