背景
在构建自然语言理解深度学习模型过程中,研究人员或者工程师们经常需要在编程细节和代码调试上花费大量精力,而不是专注于模型架构设计与参数调整。为了提升构建深度模型的效率,微软亚洲互联网工程院自然语言理解团队 (STCA NLP Group, Microsoft) 推出了开源项目 NeuronBlocks - 自然语言处理任务的模块化深度学习建模工具包,目前支持英文和中文。
PS:微软亚太研发集团由微软亚洲研究院、微软亚洲工程院、微软中国云计算与人工智能事业部、微软(亚洲)互联网工程院、微软亚洲硬件技术中心、微软商业产品开发组、微软亚太研发集团战略合作事业部等机构组成。参考:信息来源
NeuronBlocks 将常用的神经网络层封装为标准模块,通过配置简单的配置文件,就可以轻松构建复杂的深度神经网络模型。与此同时,工具包还提供了一系列针对常见 NLP 任务的经典模型。
NeuronBlocks 能使工程师们在几秒钟内快速构建和训练各种自然语言处理模型。工具包的可扩展性很强,支持快速加入新的神经元模块用于新的网络模型的构建,最大程度地避免重复的代码工作。
目前工具包支持的任务包括:句子(文本)分类(二/多分类、情感分析、问答匹配、文本蕴含、序列标注、阅读理解,基于知识蒸馏的模型压缩,等等。
PS:知识蒸馏是一种模型压缩常见方法。深度学习下为了能够获得更好的准确率,训练出的网络往往结构比价复杂,而对于一些在线预测任务来说,复杂的模型结构不利于线上预测任务的快速响应需求,因此模型压缩的需求应运而生。模型压缩指的是将复杂、学习能力强的网络学到的特征表示“知识”蒸馏出来,传递给参数量小、学习能力弱的网络。比较流行的架构是teacher-student模式。在该模型框架下,teacher结构相当于原始的复杂的深度神经网络结构,student则是一种轻量级的网络结构;因此teacher会有更高的预测准确率,它会指导student到达在简化参数之后最好的模型效果。
蒸馏可以提供student在one-shot label上学不到的soft label信息,这些里面包含了类别间信息,以及student小网络学不到而teacher网络可以学到的特征表示‘知识’,所以一般可以提高student网络的精度。
NeuronBlocks设计
NeuronBlocks 是基于 PyTorch 的 NLP 深度学习建模工具包,可以帮助研究员或者工程师们快速构建自然语言理解任务的深度神经网络模型。该工具包的主要目标是将 NLP 深度神经网络模型构建的开发成本降到最低,包括模型训练阶段和推断阶段。
NeuronBlocks 整体框架如下图所示,包括 Block Zoo 和 Model Zoo 两个重要组件。
Block Zoo
将常用的神经网络层抽象并封装为可重用的标准模块。这些模块将被用于构建各种针对不同自然语言理解任务的深度学习模型。工具包目前支持的标准神经网络模块包括:词嵌入、CNN、LSTM/GPU、Transformer 和各种 Attention 等。
Model Zoo
提供大量预构建好的深度神经网络模型,涵盖了常见的 NLP 任务。这些模型以 JSON 配置文件的形式呈现,用户可以通过简单修改 Model Zoo 中的示例模型配置,即可将其应用于自己的任务中。此外,工具包支持 Linux 和 Windows 操作系统、CPU 与 GPU 处理器、以及 PAI 等 GPU 调度平台。
安装
git clone https://github.com/Microsoft/NeuronBlocks
安装所需要的packages:
pip install -r requirements.txt
安装PyTorch (NeuronBlocks目前(2019年4月26日) 仅仅支持PyTorch version 0.4.1).
pip install torch==0.4.1
Quick Start
下面以问答匹配任务(question answer matching task,找出这篇文章是否可以作为相应问题的答案)为例。
进入NeuronBlocks
的root path,即下文中的PROJECT_ROOT
。
# get GloVe pre-trained word vectors,通过该脚本下载glove词向量
cd PROJECT_ROOT/dataset
bash get_glove.sh
# train,采用demo中的配置文件开始训练
cd PROJECT_ROOT
python train.py --conf_path=model_zoo/demo/conf.json
报错:ModuleNotFoundError: No module named '_sqlite3'
需要事先安装sudo apt-get install libsqlite-dev
,再编译安装Python3.6。所以安装完lib之后,需要重新make和make install Python3.6的源码。
报错:缺少nltk数据
LookupError:
**********************************************************************
Resource punkt not found.
Please use the NLTK Downloader to obtain the resource:
>>> import nltk
>>> nltk.download('punkt')
需要按照上述指导方式下载nltk的数据集。
训练结果:
# test,采用demo中的配置文件进行test
python test.py --conf_path=model_zoo/demo/conf.json
# predict,采用demo中的配置文件进行预测
python predict.py --conf_path=model_zoo/demo/conf.json
预测结果:
NeuronBlocks工作流程
用户可以选择 Model Zoo 中的示例模型(JSON 配置文件)开启模型训练,或者利用 Block Zoo 中的标准神经网络模块自由构建新的模型架构,就像玩乐高积木一样。
自定义NLP model
定义Model的配置文件
要训练神经网络,只需要在JSON配置文件中定义模型体系结构和一些其他的设置。
可以在PROJECTROOT/model_zoo/
中创建自己的模型文件(比如名为YOURFOLDER
),再将自定义的模型配置文件放入其中,即PROJECTROOT/model_zoo/YOURFOLDER/
。此外,还需要将数据集存放于PROJECTROOT/dataset/
中。
配置文件详解
配置文件主要的字段有6个:inputs,outputs,training_params,architecture,loss和metrics
下面以上述运行demo所用到的配置文件为例,进一步说明各个字段的含义。
inputs
- use_cache : 当
use_cache
值为true,会在第一次做cache,这样下次就可以加快训练的进程 - dataset_type : 指明任务类型,目前支持分类、回归等
- data_paths :
- train_data_path. [necessary for training] Data for training.
- valid_data_path. [optional for training] Data for validation. 训练期间会将在校验集上性能最好的模型进行保存。这个参数不是必须的,如果不需要直接去掉该字段即可。
- test_data_path. [necessary for training, test] Data for test. 如果
valid_data_path
没有定义,该框架则会选择在testdata上表现性能最优的模型进行保存,即testdata充当校验集的角色。 - predict_data_path. [conditionally necessary for prediction] Data for prediction. 当进行预测的时候,如果
predict_data_path
没有指定, 本文的toolkit则会在test_data_path
对应的数据集上进行预测。 - pre_trained_emb. [optional for training] Pre-trained embeddings
- pretrained_emb_type. [optional, default: glove]目前本框架支持glove, word2vec, fasttext这3种预训练的词嵌入。
- pretrained_emb_binary_or_text. [optional, default: text] 目前支持text和二进制类型。
- involve_all_words_in_pretrained_emb. [optional, default: false] 如果值为真,则将预训练嵌入中的所有词添加到嵌入矩阵中。
- add_start_end_for_seq. [optional, default: true]对于数据或者目标中的序列化,是否自动添加
start
和end
标识符。 - file_header. [necesssary for training and test] 定义train/valid/test数据的文件格式。例如,以下的配置信息意味着在数据中存在着3列,其各列的含义分别为:
question_text, answer_text and label
。
"file_header": {
"question_text": 0,
"answer_text": 1,
"label": 2
}
- predict_file_header. [conditionally necessary for prediction] 定义prediction data的文件格式。如果prediction data的
file_header
与train/valid/test data的file_header
不一致 , 则需要定义为prediction data定义"predict_file_header"。否则配置文件下的[inputs][file_header]是默认用于 prediction data的。如果两个file_headers
的数据列索引一致则二者也是一致的。
"predict_file_header": {
"question_text": 0,
"answer_text": 1
},
- file_with_col_header. [optional, default: false] 如果数据集有列名,则需要设置
file_with_col_header
为真,否则程序运行可能报错。 - model_inputs.定义模型的输入。如下示例,有2个输入:question和answer。
"model_inputs": {
"question": [
"question_text"
],
"answer": [
"answer_text"
]
}
- target. [necessary for training and test] 定义train/valid/test data中的目标列。由于本tookit支持multi-target tasks,所以
target
值可以为一个矩阵。
outputs
该节点主要定义模型的保存路径,logs路径等。
- save_base_dir。保存模型和日志的路径。
- model_name。模型将以
save_base_dir/model_name
进行保存。 - train_log_name/test_log_name/predict_log_name。training/test/prediction期间的日志文件名。
- predict_fields。用于设置要预测的字段列表,如预测和置信度。
- cache_dir。保存cache的目录。
training_params
设置训练过程的参数。
- optimizer.
- name. 支持定义在
torch.optim
里面的所有优化器。 - params. 优化器参数与
torch.optim
中优化器初始化函数的参数完全相同。
- name. 支持定义在
- use_gpu. [default: true] 默认下是使用全部GPU。也可以通过设置
CUDA_VISIBLE_DEVICES
来指定使用具体的GPU。 - batch_size. 当有多个GPU时,batch_size是指每个GPU上的batch size。
- batch_num_to_show_results. [necessary for training] 指定训练过程多少个
batch_num_to_show_results
batches显示一次结果。 - max_epoch. [necessary for training] 训练过程最大的epoch数量。
- valid_times_per_epoch. [optional for training, default: 1] 指定每个epoch,多少次进行一次校验。一般情况下,是每个epoch训练结束后,利用validation data进行一次校验,但是对于非常庞大的语料,在一个epoch中最好多次验证,以免错过模型的最佳状态。该字段默认值是1。
architecture
用以定义模型的框架,主要包括block_zoo中的一些网络层(blocks),用以构建模型。该toolkit目前包含的blocks可以参考block_zoo overview
- Embedding layer。下文例子中的第一层定义了一个embedding layer,其嵌入类型是词嵌入,维度是300。需要保持词向量的维度与预训练的词向量维度一致(其预训练词向量通过inputs/data_paths/pre_trained_emb中预先指定)
{
"layer": "Embedding",
"conf": {
"word": {
"cols": ["question_text", "answer_text"],
"dim": 300
}
}
}
- 利用各种网络层来设计模型。通过block_zoo中的各种网络层构建模型,所采用的格式如下:
- layer_id。为模型层自定义一个名称。
- layer。该层在block_zoo中的名字。
- conf。每层都有其自己的配置信息 (可以在block_zoo overview中找到网络层名和相应的参数).
- inputs。连接到这个层的layer_id输入的类型必须是array,因为一个层可以有多层输入。这是一个BiLSTM层的例子:
{
"layer_id": "question_1",
"layer": "BiLSTM",
"conf": {
"hidden_dim": 64,
"dropout": 0
},
"inputs": ["question"]
}
更多支持的网络层及其配置可以访问block_zoo overview。例如,如果想要知道BiLSTM的参数,可以去BiLSTM类和BiLSTMConf类看详情。BiLSTM的参数会通过BiLSTMConf传入。
loss
- loss. [necessary for training and test] Currently, 目前支持PyTorch中所有的loss functions。参数的定义与 PyTorch loss functions是一致的。此外,还提供更多选择,如Focal Loss,可以参考loss function overview。特别是对于分类任务,常常添加一个线性层以将输出映射为分类的类别数。如果不清楚分类的类别数,可以将值设置为’-1’,本文的toolkit会自动从语料统计分类的类别数。
metrics
- metrics。不同任务对应不同的衡量标准。下表展示不同任务所对应的不同衡量标准:
Task | Supported Metrics |
---|---|
classification | auc, accuracy, f1, macro_f1, macro_precision, macro_recall, micro_f1, micro_precision, micro_recall, weighted_f1, weighted_precision, weighted_recall |
sequence_tagging | seq_tag_f1, accuracy |
regression | MSE, RMSE |
mrc | F1, EM |
在校验过程,本toolkit是基于第一个指标(衡量标准)选出最佳模型。
Tips: 上文中的 [optional] 和 [necessary] 对应配置字段可选或者必要(对于training/test/prediction。如果没有上述两种指示,默认是必要的。一般将training, test和prediction的配置统一写于一个配置文件中。
demo例子的配置文件
inputs字段:
outputs字段:
training_params字段:
architecture字段:
[
{
"layer": "Embedding",
"conf": {
"word": {
"cols": [
"question_text",
"answer_text"
],
"dim": 300
}
}
},
{
"layer_id": "question_1",
"layer": "BiLSTM",
"conf": {
"hidden_dim": 64,
"dropout": 0.2,
"num_layers": 2
},
"inputs": [
"question"
]
},
{
"layer_id": "answer_1",
"layer": "BiLSTM",
"conf": {
"hidden_dim": 64,
"dropout": 0.2,
"num_layers": 2
},
"inputs": [
"answer"
]
},
{
"layer_id": "question_2",
"layer": "Pooling",
"conf": {
"pool_axis": 1,
"pool_type": "max"
},
"inputs": [
"question_1"
]
},
{
"layer_id": "answer_2",
"layer": "question_2",
"inputs": [
"answer_1"
]
},
{
"layer_id": "comb",
"layer": "Combination",
"conf": {
"operations": [
"origin",
"difference",
"dot_multiply"
]
},
"inputs": [
"question_2",
"answer_2"
]
},
{
"output_layer_flag": true,
"layer_id": "output",
"layer": "Linear",
"conf": {
"hidden_dim": [
128,
2
],
"activation": "PReLU",
"batch_norm": true,
"last_hidden_activation": false,
"last_hidden_softmax": false
},
"inputs": [
"comb"
]
}
]
模型可视化
模型的可视化可以参见 Model Visualizer README
安装依赖:
pip install graphviz
pip install web.py==0.40.dev0
使用:
Model Visualizer有2种模式:
- 命令行模式
- 浏览器模式
命令行模式的可视化:
python get_model_graph.py --conf_path ../model_zoo/demo/conf.json --graph_path ./graph
其中参数:
--conf_path: [necessary] Path of the input JSON config file.
--graph_path: [optional, default: './graph'] Path of the ouput model graph file.
结果生成2个文件: graph.gv
和graph.gv.svg
。打开graph.gv.svg
即可展示模型的框架图。
进入model_visualizer
,运行上述命令行。报错:
报错内容:graphviz.backend.ExecutableNotFound: failed to execute ['dot', '-Tsvg', '-O', './graph.gv'], make sure the Graphviz executables are on your systems' PATH
通过下面方案解决:
sudo apt-get install graphviz
安装完后,再执行上述命令行,可以正常运行:
打开graph.gv.svg
结果如下:
浏览器模式:
打开Model Visualizer server:
cd server/
python main.py 8081
通过浏览器打开http://<your_machine_ip>:8081
加载JSON配置文件,再点击提交。提交结果:
这与命令行可视化的结果是一致的。
应对不同NLP任务的Model Zoo
Task1:文本分类
文本分类是垃圾邮件过滤、电子邮件路由、图书分类等应用中的核心问题。本任务的目的是使用包含文本文档及其标签的标记数据集来训练分类器。
-
dataset
20 Newsgroups data set数据集是大约20,000个新闻组文档的集合,在20个不同的新闻组中(几乎)平均地进行了分组。 -
Usage
运行数据下载和预处理脚本:
cd PROJECT_ROOT/dataset
python get_20_newsgroups.py
训练文本分类模型:
cd PROJECT_ROOT
python train.py --conf_path=model_zoo/nlp_tasks/text_classification/conf_text_classification_cnn.json
Tips:可以通过运行不同的JSON配置文件来尝试不同的模型
- Result:
Model | Accuracy
— | —
TextCNN (NeuronBlocks) | 0.961
BiLSTM+Attention (NeuronBlocks) | 0.970
Tips:完成训练后,可以在JOSN配置文件的output /save_base_dir
中找到模型文件和训练日志文件。
Task2:问答匹配
问答匹配是问答问题的一项重要子任务,其目的是确定问答对是否匹配。
-
Dataset:
Microsoft Research WikiQA Corpus是一组可公开使用的问题和句子对,可用于研究开放域问题答案匹配。WikiQA包括3047个问题和29258个句子,其中1473个句子被标记为对应问题的回答。更多细节可以查看WikiQA: A Challenge Dataset for Open-Domain Question Answering -
Usage:
数据下载脚本:
cd PROJECT_ROOT/dataset
python get_WikiQACorpus.py
训练问答匹配模型:
cd PROJECT_ROOT
python train.py --conf_path=model_zoo/nlp_tasks/question_answer_matching/conf_question_answer_matching_bilstm.json
Tips: 可以通过运行不同的JSON配置文件来尝试不同的模型。
- Result:
Model | AUC
— | —
CNN (WikiQA paper) | 0.735
CNN-Cnt (WikiQA paper) | 0.753
CNN (NeuronBlocks) | 0.747
BiLSTM (NeuronBlocks) | 0.767
BiLSTM+Attn (NeuronBlocks) | 0.754
Tips:完成训练后,可以在JOSN配置文件的output /save_base_dir
中找到模型文件和训练日志文件。
Task3:自然语言推断
自然语言推理(NLI)是一项包含理解语言所必需的多项内容的综合任务,比如利用世界知识或执行词汇句法推理的能力。给定两个句子,一个前提和一个假设,NLI系统必须确定假设是否隐含在前提中。
-
Dataset:
The Stanford Question Answering Dataset是由问题-段落对组成的问答数据集,其中段落中的一个句子(来自Wikipedia)包含相应问题的答案(由人工编写)。QNLI通过在相应上下文中的每个问题和每个句子之间形成一对,将该任务转换为句子对分类,过滤掉问题和上下文句子之间词汇重叠程度较低的配对。该任务是确定上下文句子是否包含问题的答案。 -
Usage:
数据下载脚本:
cd PROJECT_ROOT/dataset
python get_QNLI.py
模型训练:
cd PROJECT_ROOT
python train.py --conf_path=model_zoo/nlp_tasks/question_nli/conf_qnli_bilstm.json
- Result:
Model | Accuracy |
---|---|
BiLSTM(GLUE paper) | 0.770 |
BiLSTM+Attn(GLUE paper) | 0.772 |
BiLSTM(NeuronBlocks) | 0.798 |
BiLSTM+Attn(NeuronBlocks) | 0.810 |
Task4:回归
回归是预测给定输入的连续数的问题,广泛应用于NLP任务中。
-
Dataset:
在PROJECT_ROOT/dataset/regression
中有一个样本数据集,可以用自己的回归数据集替换它,用于回归任务训练。 -
Usage:
训练回归模型:
cd PROJECT_ROOT
python train.py --conf_path=model_zoo/nlp_tasks/regression/conf_regression_bilstm_attn.json
Task5:情感分析
情绪分析的目的是预测一个句子/文件的情绪(积极、消极等),它被广泛应用于许多领域。
-
Dataset:
The Stanford Sentiment Treebank由电影评论中的句子和人类对他们情感的标注组成。我们使用双向(正/负)两类情感,并且只使用句子级标签。 -
Usage:
数据集下载脚本:
cd PROJECT_ROOT/dataset
python get_SST-2.py
模型训练:
cd PROJECT_ROOT
python train.py --conf_path=model_zoo/nlp_tasks/sentiment_analysis/conf_sentiment_analysis_bilstm.json
- Result:
Model | Accuracy
— | —
BiLSTM (GLUE paper) | 0.875
BiLSTM+Attn (GLUE paper) | 0.875
BiLSTM (NeuronBlocks) | 0.876
BiLSTM+Attn (NeuronBlocks) | 0.883
Task6:问题解析
这个任务是确定一对问句在语义上是否等价。
- Dataset:
The Quora Question Pairs是来自社区问答网站Quora的问题对集合。 - Usage:
数据下载脚本:
cd PROJECT_ROOT/dataset
python get_QQP.py
模型训练:
cd PROJECT_ROOT
python train.py --conf_path=model_zoo/nlp_tasks/question_pairs/conf_question_pairs_bilstm.json
- Result:
QQP中数据集的类分布是不平衡的(63%是负的),因此下面主要报告准确性和F1评分:
Model | Accuracy | F1
— | ----| —
BiLSTM (GLUE paper) | 0.853 | 0.820
BiLSTM+Attn (GLUE paper) | 0.877 | 0.839
BiLSTM (NeuronBlocks) | 0.864 | 0.831
BiLSTM+Attn (NeuronBlocks) | 0.878 | 0.839
高阶用法
在创建模型之后,本toolkit也提供训练模型的一些trick。以PROJECTROOT/model_zoo/advanced/conf.json
为例,该配置用于问答匹配任务。其对应的数据位于PROJECTROOT/dataset/advanced_demo
。
额外的功能
本toolkit还提供更多的特征(词性标注、NER、char-level feature等)用以模型训练。同时支持多特征输入和嵌入。
1:在配置文件的inputs/file_header
指定相应的列名(这里没有必要指定char-level feature):
"file_header": {
"question_text": 0,
"answer_text": 1,
"label": 2,
"question_postag": 3,
"answer_postag": 4
}
对应的数据如下:
可以看出,红色方框中的数据即为新增的特征数据。
2:在配置文件的inputs/model_inputs
中指定对应的特征名称:
"model_inputs": {
"question": ["question_text","question_postag","question_char"],
"answer": ["answer_text","answer_postag","answer_char"]
}
3:在配置文件的architecture Embedding layer
设置相应的特征嵌入:
{
"layer": "Embedding",
"conf": {
"word": {
"cols": ["question_text", "answer_text"],
"dim": 300,
"fix_weight": true
},
"postag": {
"cols": ["question_postag","answer_postag"],
"dim": 20
},
"char": {
"cols": ["question_char", "answer_char"],
"type": "CNNCharEmbedding",
"dropout": 0.2,
"dim": 30,
"embedding_matrix_dim": 8,
"stride":1,
"window_size": 5,
"activation": null
}
}
}
学习率衰减
学习速度是训练中最重要的超参数之一。选择合适的学习率是一个挑战。太小的值可能导致长时间的训练过程,而太大的值可能导致学习一组次优的权重过快或训练过程不稳定。
训练一个模型时,通常建议随着训练的进展而降低学习率。NeuronBlocks通过在配置文件中设置几个参数来支持学习速度衰减。
training_params/lr_decay. [float, optional for training, default: 1.0] lr_decay 为0-1期间的浮点数, 在epoch_start_lr_decay之后的每个epoch,learning rate会与该系数先相乘,进行衰减。
training_params/minimum_lr. [float, optional for training, default: 0.0] 训练期间最小的学习率。一旦低于该值,学习率即会被minimum_lr替代。
training_params/epoch_start_lr_decay. [int, optional for training, default: 1] 开始进行学习率衰减的epoch number。
举例如下:
"optimizer": {
"name": "Adam",
"params": {
"lr": 0.001
}
},
"lr_decay": 0.95,
"minimum_lr": 0.0001,
"epoch_start_lr_decay": 1
Fix Embedding Weight & Limit Vocabulary Size
当语料库很大时,词汇量也会相应变大。此外,如果词汇嵌入向量在训练过程中不断更新,训练过程会比较慢。为解决该问题,NeuronBlocks支持固定的embedding weight (embedding vectors在训练期间不更新)和受制的词汇量。
- Fix embedding weight:fix_weight. [bool, optional for training, default: false]设置architecture/Embedding layer中的 fix_weight参数的值,以控制embeding vectors是否在训练期间被更新。
设置word embedding不被更新的一个例子:
{
"layer": "Embedding",
"conf": {
"word": {
"cols": ["question_text", "answer_text"],
"dim": 300,
"fix_weight": true
}
}
}
- Limit vocabulary size
training_params/vocabulary/min_word_frequency:[int, optional for training, default: 3] 如果统计频率小于min_word_frequency,则该单词将从语料库词汇表中删除。
training_params/vocabulary/max_vocabulary:[int, optional for training, default: 800,000] 最大语料库词汇量。如果语料库词汇量大于max_vocabulary,则根据词频进行裁剪。
NeuronBlocks总结
适用人群
- 很多框架可以选择,且框架学习成本高;
- 繁重的编程工作,大量细节使其难以调试;
- 快速迭代的模型架构,使工程师们很难完全理解其背后的数学原理;
- 模型代码优化需要深厚的专业知识;
- 平台兼容性要求,需要额外的编程工作才能使模型运行在不同的平台上,如Linux/Windows, GPU/CPU。
优势
-
模型构建:用户只需要配置简单的 JSON 文件,就能够构建模型和调整参数,大大减少了模型实现的工作量;
-
模型分享:可以通过分享 JSON 配置文件来分享模型,使模型共享变得非常容易。对于不同的任务或模型,用户只需维护一个通用的源码库;
-
代码重用:可以在各任务与模型间共享神经网络模块,减少重复的编程工作;
-
平台灵活性:可以在 Linux 和 Windows 机器上运行,支持 CPU 和 GPU,也支持像 Open PAI 这样的 GPU 管理平台;
-
模型可视化:提供了一个模型可视化工具,用于观察模型结构及检查 JSON 配置的正确性;
-
可扩展性:支持用户贡献新的神经网络模块或者新的模型。
该团队目前在进行的工作
- 模型压缩,对诸如BERT, OpenAI Transformer之类的复杂模型进行知识蒸馏。基于Teacher-Student的知识蒸馏是模型压缩的一个常用方法。
- 多语言支持
- 命名实体识别模型支持
- 多任务训练支持