目录
https://github.com/thunlp/PLMpapers
paddle的LARK里包含了一些nlp模型
BERT_BASE_PATH=./pretrained_model/chinese_L-12_H-768_A-12/
TASK_NAME="XNLI"
#DATA_PATH=./data/XNLI-1.0-demo/
DATA_PATH=./data/XNLI-MT-1.0-dwk/
INIT_CKPT_PATH=./output/step_50
SAVE_INFERENCE_PATH=./output/infer_step_50 ## 这个目录下会有个__model__文件,给在线infer用的,注意paddle的版本要用1.3.1以上的,1.3.0生成的这个目录有bug
python=../../python-2.7.14-paddle-1.3.1/bin/python
export FLAGS_enable_parallel_graph=1
export FLAGS_sync_nccl_allreduce=1
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export CPU_NUM=3 ## 设置跑的cpu核数
TASK_NAME='XNLI'
CKPT_PATH=./output/
function finetune_xnli()
{
### 如果有56核的cpu,会占114g。。;而如果是12核的cpu,只会占25g内存
DATA_PATH=./data/XNLI-MT-1.0-dwk/
$python -u run_classifier.py --task_name ${TASK_NAME} \
--use_cuda false \
--do_train true \
--do_val true \
--do_test true \
--batch_size 1 \
--in_tokens false \
--init_pretraining_params ${BERT_BASE_PATH}/params \
--data_dir ${DATA_PATH} \
--vocab_path ${BERT_BASE_PATH}/vocab.txt \
--checkpoints ${CKPT_PATH} \
--save_steps 50 \
--weight_decay 0.01 \
--warmup_proportion 0.0 \
--validation_steps 2500 \
--epoch 1 \
--max_seq_len 8 \
--bert_config_path ${BERT_BASE_PATH}/bert_config.json \
--learning_rate 1e-4 \
--skip_steps 1 \
--random_seed 1
}
function save_inference_model()
{
### 如果是56核cpu,会占22g内存..
DATA_PATH=./data/XNLI-1.0-demo/
$python -u predict_classifier.py --task_name ${TASK_NAME} \
--use_cuda false \
--batch_size 1 \
--data_dir ${DATA_PATH} \
--vocab_path ${BERT_BASE_PATH}/vocab.txt \
--do_lower_case true \
--init_checkpoint ${INIT_CKPT_PATH} \
--max_seq_len 8 \
--bert_config_path ${BERT_BASE_PATH}/bert_config.json \
--do_predict true \
--save_inference_model_path ${SAVE_INFERENCE_PATH}
}
function main()
{
finetune_xnli
[[ $? -ne 0 ]] && exit 1
save_inference_model
[[ $? -ne 0 ]] && exit 1
return 0
}
main 2>&1
参考这个readme:
生成demo文件可以参考
TASK_NAME="xnli"
DATA_PATH=../data/XNLI-1.0/
BERT_BASE_PATH=../pretrained_model/chinese_L-12_H-768_A-12/
python=../../../python-2.7.14-paddle-1.3.1/bin/python
$python gen_demo_data.py \
--task_name ${TASK_NAME} \
--data_path ${DATA_PATH} \
--vocab_path "${BERT_BASE_PATH}/vocab.txt" \
--batch_size 1 \
> bert_data.demo
# --in_tokens \
运行示例:
INFERENCE_MODEL_PATH=./output/infer_step_50
DATA_PATH=./bert_data.demo
REPEAT_TIMES=1
./bin/bert_demo --logtostderr \
--model_dir $INFERENCE_MODEL_PATH \
--data $DATA_PATH \
--repeat $REPEAT_TIMES \
--output_prediction
小细节:
参考中文任务全面超越BERT:百度正式发布NLP预训练模型ERNIE
ERNIE: Enhanced Representation through Knowledge Integration
使用entity-level masking和phrase-level masking两种mask方法
输入的每个样本由5个 ‘;’ 分隔的字段组成,数据格式:
例如:
1 1048 492 1333 1361 1051 326 2508 5 1803 1827 98 164 133 2777 2696 983 121 4 19 9 634 551 844 85 14 2476 1895 33 13 983 121 23 7 1093 24 46 660 12043 2 1263 6 328 33 121 126 398 276 315 5 63 44 35 25 12043 2;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55;-1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 -1;0
和bert在mask上的区别:
一个句子的不同level的mask方式:
ERNIE 2.0: A CONTINUAL PRE-TRAINING FRAMEWORK FOR LANGUAGE UNDERSTANDING
另一张图:
参考ACL 2019 | 清华等提出ERNIE:知识图谱结合BERT才是「有文化」的语言模型
ppt:https://pan.baidu.com/s/1TjGOB2myXT-bln3OpFcbgA 提取码:35fv
ERNIE: Enhanced Language Representation with Informative Entities
代码:https://github.com/thunlp/ERNIE
研究者并不直接使用 KG 中基于图的事实,相反他们通过知识嵌入算法(例如,TransE,参考Translating Embeddings for Modeling Multi-relational Data,简单说就是(head,relation,tail)这个三元组,每个元素都是一个向量,期望head+relation尽可能=tail)编码KG的图结构,并将多信息实体嵌入作为ERNIE的输入。基于文本和知识图谱的对齐,ERNIE 将知识模块的实体表征整合到语义模块的隐藏层中。
现存的预训练语言表征模型只利用局部上下文预测 Token,但 ERNIE 的新目标要求模型同时聚合上下文和知识事实的信息,并同时预测Token和实体,从而构建一种知识化的语言表征模型。
研究者针对两种知识驱动型 NLP 任务进行了实验,即实体分型(entity typing)和关系分类。实验结果表明,ERNIE在知识驱动型任务中效果显著超过当前最佳的 BERT,因此 ERNIE 能完整利用词汇、句法和知识信息的优势。研究者同时在其它一般 NLP 任务中测试 ERNIE,并发现它能获得与 BERT 相媲美的性能。
由两个堆叠的模块构成:
N表示T-Encoder的层数,M表示K-Encoder的层数。
[HD]
表示head entity,[TL]
表示tail entity,然后[CLS]
表示这个pair对的关系分类的label[ENT]
这个就行了,然后这个实体是哪一类的,用[CLS]
来表示,每条样本只预测一个[ENT]
的分类。另一个实体用占位符替代。[TL]
、[HD]
和[ENT]
用占位符来替代就行。参考站在BERT肩膀上的NLP新秀们:XLMs、MASS和UNILM
facebook提出Cross-lingual Language Model Pretraining
Massively Multilingual Sentence Embeddings for Zero-Shot Cross-Lingual Transfer and Beyond
XLM的主要思想还是来自于这片文章,借用了BERT的框架最后成了XLM。本文提出了LASER(Language-Agnostic SEntence Representations)
bert只使用了Transformer的encoder部分,其下游任务也主要是适用于自然语言理解(NLU),对于类似文本摘要、机器翻译、对话应答生成等自然语言生成(NLG)任务显然是不太合适的。
MASS: Masked Sequence to Sequence Pre-training for Language Generation
受到bert的启发,作者们提出联合训练encoder和decoder的模型
训练步骤主要分为两步:
Unified Language Model Pre-training for Natural Language Understanding and Generation
使用的核心框架还是 Transformer,不同的是预训练的目标函数结合了以下三个:
这里的 Transformer 是同一个,即三个 LM 目标参数共享,有点 multi-task learning 的感觉,可以学习到更 genneral 的文本表示。
以上四篇的小结:
Universal Encoder Representations
代码:https://github.com/dbiir/UER-py
知乎中记录问题:https://zhuanlan.zhihu.com/p/70389596
哈工大讯飞联合实验室发布基于全词覆盖的中文BERT预训练模型
https://github.com/ymcui/Chinese-BERT-wwm
论文:Pre-Training with Whole Word Masking for Chinese BERT
https://daiwk.github.io/posts/nlp-xlnet.html
来自Facebook
参考重回榜首的BERT改进版开源了,千块V100、160GB纯文本的大模型
RoBERTa: A Robustly Optimized BERT Pretraining Approach
https://daiwk.github.io/posts/nlp-albert.html
1.4w个stars。。
https://huggingface.co/transformers
DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter
HuggingFace 在 GitHub 上表示,他们有意将这些模型放到移动设备上,并提供了一个 repo 的代码,将 GPT-2 模型转换为 CoreML 模型放在移动端。
未来,他们会进一步推进开发工作,用户可以无缝地将大模型转换成 CoreML 模型,无需使用额外的程序脚本。
https://github.com/huggingface/swift-coreml-transformers
RoBERTa中文预训练模型,你离中文任务的「SOTA」只差个它
https://github.com/brightmart/roberta_zh
超小型BERT中文版横空出世!模型只有16M,训练速度提升10倍
https://github.com/brightmart/albert_zh
https://github.com/brightmart/xlnet_zh
TinyBERT:模型小7倍,速度快8倍,华中科大、华为出品
TinyBERT: Distilling BERT for Natural Language Understanding
提出了一个two-stage learning framework,在pre-training阶段和task-specific阶段都进行distill。
相比baseline,只有28% parameters和31%的inference时间
在glue上,7.5x小,infer上有9.4x快。
解决自然语言歧义问题,斯坦福教授、IJCAI 卓越研究奖得主提出 SenseBERT 模型
SenseBERT: Driving Some Sense into BERT
解读《SenseBERT: Driving Some Sense into BERT》
SenseBERT不仅能够预测遮蔽词汇(masked word),还能预测它们在给定语境下的实际含义。
AI21 Labs的研究人员使用英语词汇数据库WordNet作为标注参照系统,设计了一个网络来预测单词在语境中的实际含义。然后将该预训练网络嵌入 BERT。
What does BERT learn about the structure of language?
探索BERT深层次的表征学习是一个非常有必要的事情,一是这可以帮助我们更加清晰地认识BERT的局限性,从而改进BERT或者搞清楚它的应用范围;二是这有助于探索BERT的可解释性
近期 BERT 相关模型一览
A Fair Comparison Study of XLNet and BERT
Multi-Task Deep Neural Networks for Natural Language Understanding
对 BERT 在部分 NLP 任务中表现的深入分析
从语言模型到Seq2Seq:Transformer如戏,全靠Mask
BERT or XLNet,围观NLP巅峰烧钱大战。技术发展太快,如何才能跟得上节奏?
英伟达Faster Transformer:作者带你揭秘BERT优化
https://daiwk.github.io/posts/platform-bert-speedup.html
ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasks
研究人员提出了一种名为 ViLBERT(图文 BERT)模型。这是一个可以学习任务未知的、图像内容和自然语言联合表征的模型。研究人员将流行的 BERT 架构扩展成一个 multi-modal two-stream 模型上。在这个模型上,模型用两个分开的流处理图像和文本输入,但他们彼此用联合注意力层交互。研究人员在两个代理任务上,使用 Conceptual Captions 数据集(数据集很大,而且是自动收集的数据)预训练这个模型,然后将模型秦阿姨到多个建立好的图像-文本任务上。这些任务包括图像问答、图像常识推理、引述表达、指称成分,以及基于捕捉的图像提取。这些只需要在基本架构上进行微小的补充。研究人员观察到,相比现有的针对任务的特定模型,新模型在这些任务上都有了相助的性能提升——在每个任务上都取得了 SOTA。
Visual-Linguistic BERT,简称 VL-BERT
此预训练过程可以显著提高下游的视觉-语言任务的效果,包含视觉常识推理、视觉问答与引用表达式理解等。值得一提的是,在视觉常识推理排行榜中,VL-BERT 取得了当前单模型的最好效果。
VL-BERT: Pre-training of Generic Visual-Linguistic Representations
之前的视觉-语言模型分别使用计算机视觉或自然语言处理领域中的预训练模型进行初始化,但如果目标任务数据量不足,模型容易过拟合从而损失性能。并且对于不同的视觉-语言任务,其网络架构一般是经过特殊设计的,由此很难通过视觉-语言联合预训练的过程帮助下游任务。
VL-BERT 的主干网络使用 TransformerAttention 模块,并将视觉与语言嵌入特征作为输入,其中输入的每个元素是来自句子中的单词、或图像中的感兴趣区域(Region of Interests,简称 RoIs)。在模型训练的过程中,每个元素均可以根据其内容、位置、类别等信息自适应地聚合来自所有其他元素的信息。在堆叠多层 TransformerAttention 模块后,其特征表示即具有更为丰富的聚合与对齐视觉和语言线索的能力。
为了更好地建模通用的视觉-语言表示,作者在大规模视觉-语言语料库中对 VL-BERT 进行了预训练。采用的预训练数据集为图像标题生成数据集,Conceptual Captions,其中包含了大约 330 万个图像标题对。
VL-BERT 的预训练主要采用三个任务:a) 屏蔽语言模型(Masked Language Modeling),即随机屏蔽掉语句中的一些词,并预测当前位置的词是什么;b) 屏蔽 RoI 分类(MaskedRoIClassification),即随机屏蔽掉视觉输入中的一些 RoIs,并预测此空间位置对应 RoI 的所属类别;c) 图像标题关联预测(Sentence-Image Relationship Prediction),即预测图像与标题是否属于同一对。
在预训练结束后,使用微调来进行下游任务的训练。本文中主要在三个视觉-语言下游任务中进行微调,即视觉常识推理(VisualCommonsenseReasoning)、视觉问答(VisualQuestionAnswering)与引用表达式理解(ReferringExpressionComprehension),下面将分别介绍。
视觉常识推理任务即给定图片与相关问题,机器不仅需要回答问题,还需要提供理由来证明答案的正确性。此任务(Q->AR)被分解为两个子任务,即视觉问答(Q->A,给定图片与问题,输出正确答案),以及视觉推理(QA->R,给定图片、问题与答案,输出正确的理由)。
Transformer 结构中最后一层 softmax 为什么不再使用 层次化softmax了呢?
主要还是计算资源的问题。
Mikolov发明word2vec的几个版本大概在13-14年前后。那个时候GPU非常少见,印象里面CMU的NLP组没有GPU,Stanford NLP lab只有6块K40。
大规模直接算 softmax 是在google的14年那篇seq2seq做MT的文章。为了快,把一个softmax 并行在4️块GPU上,每个GPU负责四分之一。那个年代,大多数NLP组全组都不会有4块GPU。
hierarchical softmax是softmax的近似,suboptimal的。当如今计算资源足够大的时候,当然包括时间和显存 (BERT 和 Elmo 都没有用hierarchical),hierarchical softmax就逐渐退出了历史舞台。
Do NLP Models Know Numbers? Probing Numeracy in Embeddings
7 Papers | 微信团队等NumNet论文;神经算术逻辑单元评价方法;将量子电路转为机器学习模型
Stabilizing Transformers for Reinforcement Learning
得益于预训练语言模型强大的能力,这些模型近来在 NLP 任务上取得了一系列的成功。这需要归功于使用了 transformer 架构。但是在强化学习领域,transformer 并没有表现出同样的能力。本文说明了为什么标准的 transformer 架构很难在强化学习中优化。研究者同时提出了一种架构,可以很好地提升 transformer 架构和变体的稳定性,并加速学习。研究者将提出的架构命名为 Gated Transformer-XL (GTrXL),该架构可以超过 LSTM,在多任务学习 DMLab-30 基准上达到 SOTA 的水平。