areal's profileiamcrfBlogLists Tools Help

Blog


    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。

    PC用户呢?比尔.盖茨朝左的时候,他们说他王八蛋,比尔盖茨朝右的时候,他们说他龟儿子,比尔.盖茨把他几乎所有的财产都捐出来做慈善事业的时候,他们翘起了大拇指。

    水洗

    ipod 最为人诟病的是它光洁的镜面外壳很容易弄上手印或是划花,消费者对此做出负面评价的时候,凶悍忠诚型的苹果粉丝的反应是“你爱买不买!谁逼你买了?”温顺忠贞型的苹果粉丝的反应则是垂头丧气。洗脑派的乔布斯老师看到这种情况就端着一盆水走过来说,“划花了有什么关系?这样更酷,因为每个人划花的都不一样,等用了一段时间之后,你们每个人就都能有一个独一无二,与众不同的ipod了。”于是两种粉丝都湿漉漉地笑着说,“液!”

    “其实,你只要点击鼠标的同时按住control键就….”

    2005 年,迟钝的苹果公司终于推出双键式鼠标的时候,很多一直硬着头皮坚持用苹果独有的弱智单键鼠标,嘴里还念叨着“复杂的社会,简单的苹果”和 “think different”的傻X苹果粉丝们终于装不下去了,纷纷冲出来购买,还在网上互相通知难兄难弟们,“苹果鼠标有右键了!苹果鼠标有右键了!”是啊,苹果只用了短短的二十多年就在鼠标上加上了右键,这是多么了不起的发展速度啊,要知道自行车可是诞生了近百年的时候,才有人给它加上了车闸的呀。

    我第一次在一个朋友(他是个超级苹果粉丝)的办公室里试用苹果电脑的时候,很惊讶的发现苹果鼠标没有右键,更惊讶的是我发现苹果的操作系统是支持PC双键鼠标的,但我这个宝贝哥儿们说他一直都用单键的苹果原装鼠标,还告诉我,“其实,没必要用双键鼠标,在苹果上,你只要点击鼠标的同时按住control键就能调出右键菜单…”我看了看他,很心疼地对他说,“傻X,别这样,对自己好一点儿。”

    “你要是把内存升级到两G,mac的优势就显示出来了”

    我自己买的第一台苹果电脑是玩具一样的mac mini G4,原配的是256M内存(那时候很多PC笔记本也只有这点儿内存。另外,国产的低端笔记本价钱也跟mac mini差不多),我按照苹果论坛上一些网友的建议把它升级到512M之后,发现还是慢得不像话,这时候在我常去的论坛上一些人开始怀疑同档次的mac比 pc慢,于是有苹果粉丝出来说,“你把内存升级到一个G,mac的优势就显示出来了”。我就找了卖电脑的朋友换上了1G的内存,可觉得还是很慢,于是到论坛里汇报了一下。结果好几个资深苹果粉丝又表示,“你要是把内存升级到两G,mac的优势就显示出来了”。X,我要是把同档次的pc升级到两G内存,它会快得让我不好意思。

    愤怒、委屈和伤心

    苹果公司起初是卖电脑的,还卖得很好,后来电脑卖不出去,它就开始贩卖“苹果文化” 了,最终培养了一大批忠诚的、“有个性”、“有品位”的苹果势利眼。很多苹果粉丝愿意花更多的钱买甚至可能更差的东西的一个深层心理是,得以跻身这个“有个性”、“有品位”的群体,并且获得一种(以优越的姿态俯视那些平庸的 pc用户带来的)美好感觉,使得那点额外的支出变得微不足道。本质上,一切激起感性消费欲望的奢侈品或多或少走的都是这条路子。这一定程度上解释了为什么当史蒂夫.乔布斯决定让苹果电脑转用比PoworPC G5更有优势的Intel芯片时,很多最忠诚的苹果粉丝和乔布斯粉丝都感到愤怒、委屈和伤心:在他们看来,苹果用什么芯片并不重要,PowerPC芯片是不是有缺陷也不重要,重要的是他们心中高贵的苹果不能跟阿猫阿狗都在使用的*芯片Intel搞在一起,听听Intel芯片的名字吧,“扣肉”!对这些 apple snob来说,苹果本来是LV,是prada,现在好像一夜之间要变成班尼路、真维斯,甚至是红旗牌晴纶三角裤衩了。我到现在都很清楚地记得乔布斯宣布改用Intel芯片时,苹果粉丝们的论坛上一片哭爹叫娘的声音,“以后我们怎么办?”“那苹果跟pc还有什么区别了?”“史蒂夫背叛了我们!”

    重症患者甚至对苹果公司发布Boot Camp来允许苹果用户在mac上安装windows都感到愤怒,认为这是“让肮脏的血液流在高贵的血管里”。

    比一个傻X更让人受不了的,是一个咄咄逼人的傻X

    下面的问答摘自一个在许多苹果论坛上流传的帖子,一个典型的apple snob的嘴脸。

    苹果能****吗?

    苹果首先不是银行,不是万能博士。

    苹果不能当手枪,防弹性能有限,不会游泳。简单的说,苹果不是万能的。但是现在好像pc是。

    所以,强烈建议想验证苹果是不是万能的用户,就此打住。苹果也就一台机器。很多这类的问题是不能的。如果你强烈需要苹果能怎样怎样。别问了。直接购买pc。

    苹果的速度为什么这么慢?

    给你一台超级电脑,你的应用也不会快到哪里。

    随着pc能力的加强,你要找最快的机器,首先找银行安排大额提现,然后去攒pc。

    再次郑重说明,苹果不是最快的,即使是所谓传统的ps,也不是最快的。

    但是再次郑重说明,有一些老鸟,用PowerG3也比你用至强快。很大因素上,决定工作的是人,不是机器。
    对,我用386打字也比你用p4打字快,因为你从来没打过字。

    苹果为什么这么贵?

    这是苹果公司的策略。这个定价有他的合理性。苹果公司也要盈利。

    当然,这世界上大部分人巴不得苹果机器都白送。

    苹果的售后服务相关问题

    郑重告诉新人,苹果的售后服务不是最好的。老鸟们都在忍受。你看重售后的话,请选择一些pc。

    我花了这么多钱,得到这么一台烂机器......

    郑重告诉你。钱是你花的。机器是你买的。通过上面的问题,你已经知道苹果不是最快,不便宜,售后不好,你还要买。坛子没有办法负责。因为这里不是消费者协会,不是法院。

    如果你打算状告苹果公司诈骗的话,我支持你。但是律师费用自己承担。

    苹果和pc比哪个更好??

    这是最无聊的问题。

    你这样10个字,可能引起无数人忍不住争论。是一种不负责任的行为。

    我仅代表个人,觉得你无聊。

    你有选择的权利,你可以不选择苹果。你也可以骂我,但是本人有限程度保留回骂的权利……

    “Mac users have lower IQ”

    Mac用户的IQ比较低

    注:此文首发于煎蛋,原作者为徐 杰 (专栏)。

    John Hein博士的一项研究表明:Mac用户平均IQ要比PC用户低15%。

    超过6000多的参加者接受了测试,结果清晰的显示IQ比较低的人会倾向于使用Mac。

    通常人们都认为Mac用户所受的教育更高,所以IQ也更高。但是结果却正好相反。Mac用户只答对了基础问题的75%,而PC用户却高达83%。

    John Heinz博士给出了如下两个理由:

    1) Mac用户买电脑注重的只是外观和样式。他们不清楚电脑的真正性能。

    2) Mac用户已经被洗脑了,他们考虑的是艺术化而不是理性。

    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训练来说是一个灾难。额外的,我们还证明,辅助的命名实体识别输出也是对分词性能改进有帮助的。

    分词开放测试所追求的高性能的实质是什么?我理解为,我们需要更多的异质的切分语料。本质上来说,机器学习工具在记忆所训练的语料,它只能在和训练语料中出现过的相似度很高的句子上完成正确切分。由于机器学习技术的进步实在有限,其推广能力并不出众。所以,只要能集成进去如果多的额外语料,不管用什么方法。能够让机器学习工具记住曾有这样的句子,曾经有这样的切分,那么我们就能获得足够高的性能。

    关于词典,我要说,额外的词典或许是起正面作用的。我一直认为,不在于是否使用词典,而在于使用什么样的词典。或者说,我们要用那些“好”的词典。词典并非越大越好,也不是所有的词典能够改进分词性能。有很多这样的负面的例子,很遗憾,我们不能发表这些结果,因为所有的出版出来的学术文章都只能是正面的,积极的结果(或许也是作者选择或投审稿人所好的结果)。关于陷阱,误区的文章实在太难发了。
    (完)