自然语言处理N天-AllenNLP学习(模型训练、评价和预测)

新建 Microsoft PowerPoint 演示文稿 (2).jpg

本文基于AllenNLP英文tutorial翻译,其中不少错误,仅作为个人学习记录
有一篇帖子总结了一下学习处理NLP问题中间的坑。NLP数据预处理要比CV的麻烦很多。

  • 去除停用词,建立词典,加载各种预训练词向量,Sentence -> Word ID -> Word Embedding的过程(Tobias Lee:文本预处理方法小记),其中不仅需要学习pytorch,可能还要学习spacy,NLTK,numpy,pandas,tensorboardX等常用python包。
  • 用到RNN时,还要经过pad,pack,pad的过程,像这样的很多函数在使用时需要有数学基础加上简单的实践,感觉对一个新人来说,高维数据的流动有点抽象,不容易理解。
  • 数据集的读取,tensorboardX的使用。。。。各种东西要学习。在运行别人的代码后打印出信息,不仅看着上档次,而且可以看到很多实用的信息。。。

AllenNLP是在pytorch基础上的封装,它的目标是处理NLP任务,可以减少很多额外的学习。

  • 分词,帮你用spacy,NLTK,或者简单的按空格分词处理。
  • 数据集的读取,它内置了很多数据集的读取,你可以在通过学习它的读取方式,在它的基础上对自己需要的数据集进行读取。 、
  • 在Sentence -> Word ID -> Word Embedding的过程中,Glove,ELMo,BERT等常用的都可以直接使用,需要word,char粒度的都可以。
  • log打印输出,在内置的输出项之外,你可以很方便地加入想要输出的信息。模型的各个组件中的参数都可以存在一个json/jsonnet文件中,修改参数进行实验很方便。

2. A Walk Through AllenNLP

第一部分 训练和评估模型

训练一个模型

目标:使用AllenNLP训练一个简单的词性标注器,模型源代码,包括了一个词嵌入层和LSTM。
数据集使用Brown Corpus在实现的时候我会看一下是否需要下载,我们会训练一个基于4000随机抽取句子的模型(sentences.small.train),使用不同的1000个随机抽取句子作为验证集(sentences.small.dev)。
标记实验源码
在这里需要注意的是代码中训练部分。

  "trainer": {
    "optimizer": "adam",
    "num_epochs": 40,
    "patience": 10,
    "cuda_device": -1
  }
  • 优化器为adam
  • 迭代次数为40次(教程中使用mac,用时大概40min,等下可以测一下win环境),
  • patience(忍耐?)用于控制早期停止,如果我们的验证矩阵在这些迭代中不能提高,训练就挂起,
  • cuda_device为GPU参数设置,如果使用GPU,就把cuda_device改为0

好了我们现在可以来试一下这个训练器。如果使用pycharm,可以在terminal中输入下面命令行

allennlp train tutorials/getting_started/walk_through_allennlp/simple_tagger.json --serialization-dir /tmp/tutorials/getting_started
我下午调了半天才通,其实还是因为命令行不熟……
不要盯着console看,虽然运行很爽。
注意看这行命令,其中serialization-dir参数指定将保存模型的词汇表和检查点权重的目录。

2019-03-07 18:01:18,951 - INFO - allennlp.training.trainer - Epoch 5/5
2019-03-07 18:01:18,953 - INFO - allennlp.training.trainer - Peak CPU memory usage MB: 0.0
2019-03-07 18:01:18,991 - INFO - allennlp.training.trainer - Training
accuracy: 0.8524, accuracy3: 0.9407, loss: 0.6855 ||: 100%|##########################################################################################################################| 125/125 [00:45<00:00, 2.22it/s]
2019-03-07 18:02:04,654 - INFO - allennlp.training.trainer - Validating
accuracy: 0.8300, accuracy3: 0.9268, loss: 0.7355 ||: 100%|############################################################################################################################| 31/31 [00:02<00:00, 12.91it/s]
2019-03-07 18:02:07,300 - INFO - allennlp.training.tensorboard_writer - Training | Validation
2019-03-07 18:02:07,300 - INFO - allennlp.training.tensorboard_writer - cpu_memory_MB | 0.000 | N/A
2019-03-07 18:02:07,301 - INFO - allennlp.training.tensorboard_writer - accuracy | 0.852 | 0.830
2019-03-07 18:02:07,302 - INFO - allennlp.training.tensorboard_writer - loss | 0.686 | 0.736
2019-03-07 18:02:07,302 - INFO - allennlp.training.tensorboard_writer - accuracy3 | 0.941 | 0.927
2019-03-07 18:02:07,324 - INFO - allennlp.training.checkpointer - Best validation performance so far. Copying weights to '/tmp/tutorials/getting_started/best.th'.
2019-03-07 18:02:07,339 - INFO - allennlp.training.trainer - Epoch duration: 00:00:48

在这里,accuracy 衡量我们的模型预测“正确”词性标签最常可能的频率,而accuracy3 衡量正确标签是最可能的三个标签之一的频率。
loss是交叉熵,是用于训练模型的目标。你想确保它在培训期间大多减少。
为了GKD,我就设置了5次迭代。

评价模型

训练完毕之后,就需要对模型进行评价了,这里使用的是随机1000个句子的测试集。

allennlp evaluate /tmp/tutorials/getting_started/model.tar.gz https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.test

2019-03-07 18:04:32,031 - INFO - allennlp.commands.evaluate - accuracy: 0.8252221324717286
2019-03-07 18:04:32,031 - INFO - allennlp.commands.evaluate - accuracy3: 0.9229604200323102
2019-03-07 18:04:32,031 - INFO - allennlp.commands.evaluate - loss: 0.7843235787004232

对比一下训练和测试的结果。差了0.0x个点,还好……

进行预测

最后,自然是要预测一个。predict命令采用归档模型和输入的JSON行文件,并使用模型进行预测。
这里,标记模型的“预测变量”需要一个包含句子的JSON blob:

cat <<EOF >> inputs.txt
{"sentence": "I am reading a tutorial."}
{"sentence": "Natural language processing is easy."}
EOF

教程中是这么做的,使用linux写入inputs文件,我直接生成了,然后使用以下语句进行预测。注意,inputs.txt建议使用绝对地址。

allennlp predict /tmp/tutorials/getting_started/model.tar.gz ****\inputs.txt

结果如下

"words": ["Natural", "language", "processing", "is", "easy", "."], "tags": ["jj", "nn", "np", "bez", "jj", "."]}
"words": ["we", "have", "a", "date", "tomorrow", "afternoon", ".", "When", "would", "be", "convenient", "for", "you", "."], "tags": ["ppss", "hv", "at", "nn", "vb", "nn", "in", "wrb", "md", "be", "jj", "in", "ppo", "."]}

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

推荐阅读更多精彩内容