基于spaCy和Prodigy的NLP迁移学习实践

3 阅读2分钟

Practical transfer learning for NLP with spaCy and Prodigy

迁移学习被称为“NLP领域的ImageNet时刻”。近期研究表明,模型可以利用从海量数据样本中提取的详细、具备上下文感知的语言知识进行初始化。本演讲将解释spaCy对高效易用迁移学习的新支持,并展示如何利用标注工具Prodigy快速启动新的NLP项目。

语言不只是词汇

NLP一直难以超越“词袋”模型的局限。Word2Vec(以及GloVe、FastText等)让我们能够预训练词义。如何学习词汇在上下文中的含义?或者整个句子的含义?

语言模型预训练

  • ULMFiT、ELMo:基于前文预测下一个词
  • BERT:基于上下文预测某个词

将语言模型引入生产环境

采纳研究中已验证有效的方法,提供快速、生产就绪的实现。性能目标:每秒处理10,000词。生产模型需要运行成本低廉(且无需强大的GPU)。

基于近似输出的语言建模

训练CNN基于上下文预测每个词的向量。不预测确切的词,而是预测其大致含义——这要简单得多!含义表示通过Word2Vec、GloVe或FastText学习。

使用spaCy进行预训练

$ pip install spacy-nightly
$ spacy download en_vectors_web_lg
$ spacy pretrain ./reddit-100k.jsonl en_vectors_web_lg ./output_dir
$ spacy train en ./model_out ./data/train ./data/dev --pipeline tagger,parser --init-tok2vec ./output_dir/model-best.t2v
✓ Saved best model to ./model_out/model-best
import spacy
nlp = spacy.load("./model_out/model-best")
doc = nlp("This is a sentence.")
for token in doc:
    print(token.text, token.pos_, token.dep_)

预训练效果对比(依存句法分析的有标签附着分数)

使用GloVe使用LMAOLAS分数
79.1
81.0
81.0
82.4

对比参考:某机构'17论文为82.3,某机构'18论文为83.9,模型大小仅3MB。

快速迭代训练流程

  1. 使用原始文本预训练具备通用语言知识的模型
  2. 标注少量特定于应用的数据
  3. 训练模型并在应用中试用
  4. 对代码和数据进行迭代

Prodigy标注工具

  • 可脚本化的标注工具
  • 完全的数据隐私:运行在自有硬件上
  • 主动学习以优化样本选择
  • 针对高效和快速迭代优化
$ prodigy ner.teach product_ner en_core_web_sm /data.jsonl --label PRODUCT
$ prodigy db-out product_ner > annotations.jsonl

迭代代码与数据

更快速地尝试更多想法。大多数想法不会成功——但少数会大获成功。在尝试规模化之前先找出有效的方法。构建完全自定义的解决方案,避免被某机构锁定。FINISHED