| areal's profileiamcrfBlogLists | Help |
|
October 30 三种crf实现的比较:crf++,flexcrf,and pocket crf我使用了crf++两年了,从0.3之前的版本开始用起来的,一直到现在的版本0.49,基本上经历了这个实现的主要变化.最近,我想看看在crf++实现之外的一些功能,主要是两个,一个是高阶crf,一个是semi-crf,看能不能带来进一步的分词或者ner的性能提升.对此,我基本上不看好,但是即使如此,我想还是用实际结果说话会好些. 为此,我尝试了另外两个crf实现.flexcrf和pocket crf.他们都是stl c++写的. 网址 http://sourceforge.net/project/showfiles.php?group_id=184307 http://sourceforge.net/project/showfiles.php?group_id=201943 最新版本flexcrf 0.3, pocket crf 0.4(作者声称发布了2.0,但是找不到) 这两个版本都深受crf++影响,实际上lbfgs优化算法实现都来自crf++,flexcrf实现了二阶crf,pocketcrf则声称实现了任意阶的crf. 但是高阶crf实在太耗费训练时间了,如果一阶crf需要训练时间是T,则n阶crf需要时间T*p^(2*n-2),其中p是标记个数.所以,就目前的计算条件来说,高阶crf基本上是不实用的,因为1阶crf已经够耗时间和内存了.但是,如果高阶crf真的能带来哪怕一点点的性能增长,我还是宁愿试验一下的.实际上,peng fuchun最开始的那篇关于分词的论文用的就是2阶crf.所给出的性能就他当时来说的确是不错的. 试用这两个crf实现的实际情况如下: 界面:flexcrf的界面比较独特,虽然都是命令行,但是flexcrf几乎所有的训练参数需要一个独立的option.txt来指定,命令行参数的主要目的是指定这个option文件.另外一个重要的命令行参数是指定一个缺省目录,我读了下flexcrf源代码,发现它要求所有的文件,训练,测试,生成的model文件都必须在这个缺省目录下.真是一个奇怪的想法.我已经习惯把训练/测试数据以及model文件,测试输出文件放在不同的目录中.而且,option文件很不方便编制批处理文件进行连续的多项处理. flexcrf宣称的一个优势是,它可以在每个训练迭代后进行即时的测试评估.但是,但是,我不认为这是一个优势.因为不同的标注任务的评估标准是不同的.不可能写出那么多不同的评估函数.flexcrf的缺省评估工作似乎专门为chunking来优化的. flexcrf没有使用crf++那样用梯度+特征劝值之和的稳定性作为迭代结束的标志,而只能直接的指定最大迭代次数.这使它更加不方便. 然而,flexcrf最不方便的地方是,虽然作者在手册中已经有了feature template的概念,但他们显然没有想到为用户实现这一点,flexcrf 要求输入的训练或者测试文件必须是一个包含所有激活特征的文件.这些激活特征根据用户定义的特征模版生成编码.作者部分地在chunking上实现了这样的一个特征编码输入文件,但是,作者没有定义一种特征模版文件格式,自然也没有提供这样的一般的工具. 不得已,我自己根据crf++的特征模版文件的格式要求,写了一个一般的转化程序,将crf++输入训练文件依据任意的特征模版文件,转成flexcrf所要求的输入训练文件格式.不幸的是,这个输入的训练文件通常非常大.很占磁盘空间. pocket crf的界面,至少目前0.3版本的界面,只能用简陋来形容.实际上,pocket crf没有提供命令行,仅有一个例子说明如何完成训练和测试.我只好自己给它临时加上了最简单的几个命令行参数选项.好在pocket crf输入输出和crf++非常类似.改变主要有两点,一个是特征模版文件,pocket crf要求每个特征模版加上%y[0]这样明确的表达状态的选项.我认为这个是很科学的. 另外一个是pocket crf的输出model文件格式,非常类似于crf++文本格式的model文件.但是又不完全是,有些细微差别.有一个不方便的地方是,pocket crf严格要求输入文件各列必须用0x09隔开,无法识别空格.相比之下,crf++可以忽略各列之间的所有空格和0x09. 实验结果,我使用bakeoff-4的ctb切分语料作测试,根据我的sighan-5的论文,实用6-tag+6-ngram特征模版.均使用单线程.flexcrf有一个是用mpi的并行版本,pcrf,但我没有试用.pocket crf 0.3目前仅支持单线程训练.flexcrf 在ubuntu linux的gcc下面编译通过. 不幸的是,flexcrf无法完成训练,报告lbfgs迭代遇到错误.而且在1个多小时中仅完成了不到30个迭代. 另外,使用报错后留下的model文件无法完成解码.但是,flexcrf训练所用到的内存大约仅是crf++的1/3到一半. pocket crf的解码程序有一个不方便的地方,或者说是一个bug,那就是,如果测试文件的结尾有多个空行,那么会导致出错. 除此之外,pocket crf运行的不错.其内存使用大约仅是crf++的1/3到一半.然而pocketcrf试验结果远远差于crf++.尽管我已经用了一样的训练参数.稍后给出数据比较. October 27 从一根鱼刺看香港的医疗保障为了一根不知道在哪卡住的鱼刺我已经困挠了1个多星期。吃饭喝水没有问题,但是总是觉得隐隐约约有个东西在那里喊,我在这,我在这。前天痛下决心,2年来第一次去医院,看能不能解决问题,这也是我第一次到香港的医院看病。进去总共拥有4个医生的城大医院,里面有几排位置,坐着三两个人在候诊。座位前面有个两个并排的窗口,分别是登记(挂号)和药房。我出示了员工卡,然后因为是第一次来,填了个单子,以便建立病历。在座位上没有坐会,就让我去三号医生那里。我推开门进去,房间里面空荡荡的,角落坐着一个坐在计算机前的戴口罩的医生。我说了下情况,感觉医生的普通话不是很好,连笔带画地才明白了我的意思。然后他找了根长长的宽木板,看了看我的口腔,然后,就宣布看不清楚我描述的鱼刺在哪里,所以,我只能去外边的医院看病了。他在计算机上噼里啪啦的打了半天,打了一封英文介绍信到深水步的一家医院。我问他费用如何,他说,作为香港居民,第一次挂号要100港币。原来我这根鱼刺价值至少100港币。我出来后,药方负责发放诊断结果的一位女士很热情友好的帮我找到了这家医院的中文名字和地址以及如何到达那里。我逃出来,感觉鱼刺的感觉更加无法容忍了,决定明天去深圳的医院解决这个问题(如果明天还受不了的话)。 October 21 新东方的罗老师骂苹果公司产品的粉丝以下是转载,我有一个ipod, 但是我一直拿它作移动硬盘,所以我转了这篇文章出出气。
史蒂夫.乔布斯早年把苹果的系统设计成封闭式的时候,苹果粉丝们说他有性格,酷,后来他为了迁就市场开始有所妥协的时候,他们说他成熟稳健,牛X。 October 20 对于bakeoff-3的简单综述-3(完)原因在于,我们引入了复杂的标注集来标注字在词中的位置。说来话长,理论上来说,切分问题是一个二值分类问题,切还是不切(哈姆雷特:To be, or not to be: that is the question,:))。但是第一个关于字标注的工作, \bibitem{Xue:2003a} Nianwen Xue. 2003. Chinese Word Segmentation as Character Tagging. {\em Computational Linguistics and Chinese Language Processing}, Vol. 8(1): 29-48. 并不是将其作为二值标注问题来处理的,而是作为4值标注问题。具体来说,就是将字在一个词中间的位置分为4类:词首B,词尾E,词中M,单字词S。作为二值标注问题,可能最开始由Peng Fuchun在coling-04引入。为什么会出现这样一种“退步”?原因在于计算负载上,Xue用的是最大熵(MaxEnt),而Peng用的CRFs。显然的,CRF的计算负载一般要比MaxEnt高一个数量级,而且,CRF上用4个标注的学习代价比2个要高一倍不止。实际上,后续的CRF模型,只要是用于分词的,能够不用2个词位标注的学习非常非常罕见。 但是,但是,我们工作的要点就是要引入更多的词位标注来进行更为精确的词位学习。具体来说,我们进一步引入了2个额外的词位,B2,B3,分别代表多字词中第二个和第三个字的非词尾的位置。这样子,我们在CRFs中相当于前所未有的用到了6个词位标注。与此同时,我们大大降低了特征模版的数量。 下面对比三个特征模版集的不同,分别针对2,4,6标注集。我们分别用T, X, Z表示Tsai et al. 2006,Xue:2003/Low:2005, Zhao:2006用到的针对这三个标注集的特征模版: --------------------------------------------------------------------------------- C-2, C-1, C0, C1, C2, C-2C-1, C-1C0, C0C1, C1C2, C-1C1, C-2C0, C-3C-1 T: x x x x x x x x x x X: x x x x x x x x x x Z: x x x x x x --------------------------------------------------------------------------------- 可以看到,Tsai, Xue/Low都要用到10个特征模版,而Zhao只需要6个。从特征模版来看,Tsai的模版涉及到5个字的上下文窗口:C-3到C1, Xue/Low涉及到5个字的上下文窗口:C-2到C2,Zhao涉及到三个字的上下文窗口:C-1到C1。这似乎显示Zhao的模版学习的上下文窗口宽度不足。但是,如果我们观察,不重复的使用词位标注集标注一个尽可能长的词 2-tag, 两字词,BE 4-tag,三字词,BME 6-tag,五字词,BB2B3ME 也就是说,6-tag通过标注集而不是模版集足以保证学习5字上下文窗口。 如果把我们的目标归结为寻求一种性能最好的n-gram特征和标注集搭配。我们将会发现6-tag+6-ngram会是最佳的。为此,我在同样的CRF模型上用Tsai的2-tag标注和他们的n-gram特征模版(实际上,我发现在所有用于2标注集的特征模版中,他们的这组是性能最好的),Xue/Low的4-tag标注和他们的n-gram特征模版,进行了性能评估。下面是在Bakeoff-3数据上的F-score结果比较 AS CityU CTB MSRA 2-tag+Tsai .946 .962 .924 .946 4-tag+Xue .952 .967 .930 .955 6-tag+Zhao .954 .969 .932 .961 那么是什么阻止我们使用更多的标注集呢,可能是训练计算的时间太长。 下面是训练时间(单位是分)的比价,所有的数据都在一致的计算环境中获得 AS CityU CTB MSRA 2-tag+Tsai 112 52 16 35 4-tag+Xue 206 79 28 73 6-tag+Zhao 402 146 47 117 可以看到,6-tag比4-tag基本上要多花一倍的训练时间,比2-tag要多花2-3倍的训练时间。 再看训练内存使用(单位Giga bytes) AS CityU CTB MSRA 2-tag+Tsai 5.4 2.4 0.9 1.8 4-tag+Xue 6.6 2.8 1.1 2.2 6-tag+Zhao 6.4 2.7 1.0 2.1 注意到,6-tag用的内存甚至比4-tag系统还要少! 所以,去买一台快点的计算机跑分词吧,因为我们不需要一个复杂的系统来做分词。简单的6-tag+6-ngram就够了。 最后,我说一下字符类型特征和开放测试的问题。 所谓字符类型特征,就是标记字符是正常的汉字,还是拉丁字母,阿拉伯数字,还是标点符号的特征。Bakeoff-3明确禁止在封闭测试中使用这一特征。不幸的是,很多人,包括我,没有注意到网页上的这一条款。 下面是bakeoff-3在分词封闭测试中至少获得前三名的参赛者及其成绩(F-score)列表,总共有6个参赛者。 ------------------------------------------ Participant AS CityU CTB MSRA (Site ID) ------------------------------------------ Zhu(1) 0.944 0.968 0.927 0.956 Carpenter(9) 0.943 0.961 0.907 0.957 Tsai(15) 0.957 0.972 / 0.955 Zhao(20) 0.958 0.971 0.933 / Zhang(26) 0.949 0.965 0.926 0.957 Wang(32) 0.953 0.970 0.930 0.963 ------------------------------------------ Best closed 0.958 0.972 0.933 0.963 ------------------------------------------ 其中,Zhu, Tsai, Zhao用了字符类型特征,Zhu和Zhao是直接从预先指定的字符类型列表中构造这一特征。Tsai用了一个别出心裁的方法,通过几条预定义的目标函数进行聚类来获得字符类型列表。当然,他们重新“发现”了其实事先就知道的不同的字符类型。也许,他们的这种做法才是最没有犯规的。但是,这种做法的实用价值是值得商榷的,是否有为了评估而评估之嫌? 关于字符类型特征的作用,我做过事后的经验性评估。我的结论是:字符类型特征在某型情形的确是发挥作用的,也就是对于性能的提升的确有帮助,但是,这种性能增进强烈的依赖于两个方面,第一个是所学习的文本的全半角是否统一,如果某些字母,数字,标点是半角,某些是全角。那么,字符类型特征会有较大的改进作用。反之,如果训练和测试语料中的全半角是基本一致的,也就是基本都是半角或者都是全角,那么,该特征将不起什么作用。第二个因素是训练语料的规模,不管全半角是否一致,该特征在大规模训练语料下对于性能改进微乎其微,相反,对于小规模的训练语料的性能改进较为可观。简而言之,字符类型特征不会导致性能的实质性增长。从这个角度来说,规定在封闭测试中禁止或者使用这一特征都讲得通。 这里顺便说一下,Wang(32)在MSRA上封闭测试的结果,他们使用了语言模型概率和MaxEnt输出联合解码的方法。他们的方法依赖于一个分配这两种输出的权重参数。不幸的是,根据他们的报告,在微软语料上的这一参数调整来自Bakeoff-2005的微软语料。而Bakeoff-2006微软训练语料只是2005的相应语料的一个子集(正是我建议黄老师取一半的2005语料提交为2006语料的),这样算不算引入了外部语言资源的信息?也许这个可以解释他们的这个成绩为什么比第二名高那么多吧 关于开放测试 目前为止,我只谈了封闭测试。为什么我不愿意将开放测试作为另外一个重点。原因就是在开放测试中的方法论其实相当的贫乏和单调,尽管Bakeoff的开放测试允许一切额外的语言资料和外部知识。 两种显而易见的资源已经被往届的Bakeoff参赛者集成到分词学习中了。一个是词典,一个是额外的切分语料。这一工作依然由Low and Ng在Bakeoff-2005完成。Bakeoff-3(2006)有两个值得一提的工作,一个是引入了第三种开放资源,词性标注(POS tagging)结果。这一工作在, \bibitem{Wang and Shi:2006} Mengqiu Wang and Yanxin Shi, Using Part-of-Speech Reranking to Improve Chinese Word Segmentation, SIGHAN-5. 另外一个试集成方法的改进。这个依然是我们的工作,我们建议直接引入其他的切分器的输出作为特征。我们称之为辅助切分器方法。这样,词典,附加语料都可以统一为辅助切分器,前者可以用最大匹配辅助切分器,后者可以用在附加语料上训练出来的切分器。这样做的优势,除了方法统一外,还有助于应用到CRF学习上,因为额外语料方法会大大增加训练时间。这对CRF训练来说是一个灾难。额外的,我们还证明,辅助的命名实体识别输出也是对分词性能改进有帮助的。 分词开放测试所追求的高性能的实质是什么?我理解为,我们需要更多的异质的切分语料。本质上来说,机器学习工具在记忆所训练的语料,它只能在和训练语料中出现过的相似度很高的句子上完成正确切分。由于机器学习技术的进步实在有限,其推广能力并不出众。所以,只要能集成进去如果多的额外语料,不管用什么方法。能够让机器学习工具记住曾有这样的句子,曾经有这样的切分,那么我们就能获得足够高的性能。 关于词典,我要说,额外的词典或许是起正面作用的。我一直认为,不在于是否使用词典,而在于使用什么样的词典。或者说,我们要用那些“好”的词典。词典并非越大越好,也不是所有的词典能够改进分词性能。有很多这样的负面的例子,很遗憾,我们不能发表这些结果,因为所有的出版出来的学术文章都只能是正面的,积极的结果(或许也是作者选择或投审稿人所好的结果)。关于陷阱,误区的文章实在太难发了。 (完) |
|
|