对于使用过Java库Mallet的SimpleTagger类进行条件随机场(CRF)的人有一个问题。假设我已经使用了多线程选项以最大限度地利用我可用的CPU数量(这是我的情况):我应该从哪里开始,如果我需要它运行得更快,我应该尝试哪些方法?
一个相关的问题是,是否有类似于随机梯度下降的方法,可以加速训练过程?
我想进行的训练类型很简单:
输入:特征1 ... 特征N 序列标签...测试数据:特征1 ... 特征N...输出:特征1 ... 特征N 序列标签...
(其中特征是我在自己的代码中对数据进行处理后的输出。)
除了Mallet之外,我在使用其他CRF分类器时遇到了问题,但我可能需要重新考虑并重新审视其他实现,或者尝试一个新的。
回答:
是的,随机梯度下降通常比Mallet中使用的L-BFGS优化器快得多。我建议你尝试CRFSuite,你可以使用SGD或L-BFGS进行训练。你也可以尝试Léon Bottou的基于SGD的实现,但这设置起来更困难。
否则,我认为CRF++是使用最广泛的CRF软件。它基于L-BFGS,所以可能对你来说不够快。
CRFSuite和CRF++都应该很容易上手。
请注意,如果你有大量的标签,所有这些都会很慢。至少CRFSuite可以配置为仅考虑观察到的标签n元组 – 在(n-1)阶模型中 – 这通常会使训练和预测快得多。