AutoGrader研读总结

  假期时间我研读了kaggle冠军代码,12年举行的nlp比赛。才疏学浅,如果有所需要改正的地方,望各位多多指正。

概要

Autograder是来自美国的 Luis Tandalla在比赛(Automated Student Assessment Prize, Phase Two – Short Answer Scoring)中实现的程序。Autograder选择了解决short-answer responses这个题目。选手使用了relevant,words,bigrams,probabilities作为数据模型,把score1和score2拆分成了两个record,使用随机森林来进行训练,分数是:0.77166,排名第一。

问题背景

在教育实践中,为了培养学生的批判性思维,测验往往会出一些开放性的题目让学生补充。但是不得不需要大量的人工和精力去批改这些题目。为了解决这个难题,需要编写一个软件可以自动评估学生的答案来降低成本。

算法分析

Github地址:https://github.com/luistp001/LT-Autograder

在机器学习中,有两个关键,一个是模型的确立。一个是算法的选择。我根据这两个重点对LT-Autograder进行分析。

一、模型的确立

在模型确立之前,需要把短文的特征提取出来。但是短文存在非字母和数字的字符,大小写,还有一些拼写错误的问题。选手编写了一个修改拼写错误的类correct2(基于http://norvig.com/big.txt)。为了方便后面的特征选择,选择使用了PorterStemmer去掉后缀,获取单词的核心。

1. 数据预处理

由于短文中有单词,组合和三元组这几类的分别,选手编写一个a_essay函数用于把短文划分为这几类。(边幅问题,就不展开了)

2. 使用正则表达式来寻找可能的答案

划分了单词,词组和三元词组之后,选手有一个优化点可以很好地提高performance的。就是使用正则表达式来匹配答案来寻找可能的答案。因为short problem中,其实往往答案只需要关注几个关键字(我们人工批改的时候其实往往也如此,针对关键字改分)。举个例子, 在第一个问题中:
可能的答案有这么几个。

• You need to know how much vinegar was used in each container.
• You need to know what type of vinegar was used in each container.
• You need to know what materials to test.
• You need to know what size/surface area of materials should be used.
• You need to know how long each sample was rinsed in distilled water.
• You need to know what drying method to use.
• You need to know what size/type of container to use.

关键字其实就是type of vinegarkind of vinegar等等,截取其中一段代码来表示如何匹配。


pats.append( re.compile(r"(\w+ ){0,4}\w*(how )?((much)|(mani)) (\w+ ){0,4}((vinegar)|(finger)|(liquid))\w*( \w+){0,4}") )
pats.append( re.compile(r"(\w+ ){0,4}\w*how much (\w+ ){1,2}((put)|(fill))\w*( \w+){0,4}") )
pats.append( re.compile(r"(\w+ ){0,4}\w*((vinegar)|(finger)) (\w+ ){0,4}measur\w*( \w+){0,4}") )
pats.append( re.compile(r"(\w+ ){0,4}\w*((aunt)|(man)|(a?mount)|(measur)|(volum)|(quantiti)) (\w+ ){0,3}((vinegar)|(finger)|(liquid))\w*( \w+){0,4}") )


然后选手就会根据这些正规表达式陪寻找短文中是否匹配的回答。如果匹配则用1表示,否则用0表示。得出来的匹配向量将作为特征向量使用随机森林训练。

3. 计算tf-idf

tf-idf(英语:term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术。tf-idf是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

然而,令我很无语的是,final代码里面使用的确实是使用tf-idf,在Luis Tandalla的论文里面却说,with raw counts确实是比tf-idf性能要好。截图为证。

image
4. 计算probabilities

我们通过上一步已经计算了每一个单词的tf-idf,所以我们得到标准答案和回答的tf-idf向量来分别表示标准答案和回答答案。

我们可以通过计算两个向量的余弦相似性,来得到这个回答跟标准答案的相似程度。(https://nlp.stanford.edu/IR-book/html/htmledition/document-and-query-weighting-schemes-1.html

5. 模型确立

最终使用的模型特征有:

Name significance
relevant 是一个跟标准答案有关的相关性向量
words 切分后的单词
bigrams 切分后的短语
probabilities 标准答案跟回答答案的余弦相似性

二、算法训练

在算法训练中,Luis Tandalla使用了随机森林和决策树进行训练。

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。而"Random Forests"是他们的商标。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans的"Bootstrap aggregating"想法和Ho的"random subspace method" 以建造决策树的集合。

训练代码


Rscript modelingRf.R
Rscript modelingGbm.R

就像简介所说,Luis Tandalla使用了第二个成绩(第二个成绩我一开始看题目的时候十分蒙蔽),把第二个成绩独立拆分成一个独立的record进行训练。

# 随机森林
tr2 <- correct(tr, double_data) # It doubles the training data

#It trains rf
rf <- randomForest( form, data = tr2, ntree = ntrees, do.trace = FALSE, importance = TRUE)

save( models, file = paste( '../newTrainedModelFiles/models_', actual, '.RData', sep="" ) )

# Gradient Boosting Machine
tr2 <- correct(tr, double_data) # It doubles the training data

#It trains gbm
gbm1 <- gbm( form, data = tr2, n.trees = ntrees, distribution = 'gaussian' , interaction.depth = ide, shrinkage = sh, bag.fraction = tf,    train.fraction = 1.0, cv.folds=ncvt , keep.data = TRUE, verbose = FALSE)
best.iter <- gbm.perf(gbm1,method="cv", plot.it = FALSE)

save( models, file = paste( '../newTrainedModelFiles/models_', actual, '.RData', sep="" ) )

随机森林:
https://zh.wikipedia.org/wiki/%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97

研究心得

在机器学习中,写好了baseline程序,其实大部分时间都在做对数据的预处理和不断优化模型。在Autograder的程序中,我们可以看到,对数据的预处理和一些模型的优化,选手用了大量的时间进行处理。而在nlp中,这些处理方式也是值得我们学习的(我对nlp不熟悉,或许有更多更好的处理方法)。

关于使用神经网络算法的问题。虽然我只是接触和使用过简单的bp神经网络,
个人觉得,如果不改动模型的话,一般的神经网络(输入层,隐藏层,输出层)训练时间过长,效果也不见得很好。后面翻阅Luis Tandalla的论文,其实当年他是试过神经网络和支持向量机来预测的,但是效果其实一般。原文如下:

I also trained Support Vector Machines and Neural Networks to predict the scores and to blend models.
They constantly produced higher cross validations kappas but lower public leaderboard kappas

但是经过翻阅资料,发现挺多在NLP的应用优化的。首先要讨论一下,冠军选手的代码的弊端。我们在得到probabilities时,其实是需要一个高纬度的向量计算,并且为了有一个好的结果,冠军选手是需要手动编写正则表达的。这样是很不利于代码的拓展性。通过了解,我们可以使用RNN来进行优化。

我这边对深度学习没有怎么了解,个人认为还是要构造词向量,如果要使算法具有一般性,可以不需要正则表达式来进行匹配答案,不过我们依然需要提取出关键的特征,可以参考Autograder提取特征的方法。

因为我们需要训练出一个可以评估语义并且进行给分的模型,因为暂时能力有限,我会选择LSTM模型吧。(不太了解)

image

结语(待续)

由于对R不熟悉,一开始看R代码的时候有点小蒙蔽。python的那段代码,我每一行进行断点研究,所以对预处理的那几端代码应该说是掌握到精髓了(个人认为,其实数据预处理十分重要,有时候比模型,算法更重要)。至于改进和优化,我能力有限,之前只是做个一个简单的神经网络评价模型,跟nlp相比,难度差距太大。不过如有有机会,我觉得深入下去也不会花太多的时间,我会继续深入。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容