GitHub超3萬星:Transformer 3發(fā)布,BERT被一分為二
來了來了,它來了!它帶著全新的tokenizer API、TensorFlow改進以及增強的文檔和教程來了!
G站上最受歡迎的NLP項目,AI界無人不知的最先進NLP模型Transformer剛剛推出了第三代。
這次更新力度可謂誠意滿滿,不僅帶來了2代的升級,同時還增加了一些新的功能和特性。下面我們就來看看都更新了哪些項目吧。
對比前一代的重大改動
首先我們來看看和Transformer v2相比,v3做出了哪些比較令人矚目的更新。
BERT被一分為二
BERT被分割為BertForMaskedLM和BertLMHeadModel,因此,以后就不能再拿BertForMaskedLM做因果語言建模,也不能接受lm_labels參數(shù)。
Trainer從類轉(zhuǎn)為方法
v3還對Trainer數(shù)據(jù)整理器做了一個改動,將其從一個類改成了一個方法。
直接設置tokenizer的特殊標記屬性
在v3中,你可以直接設置tokenizer的特殊標記屬性,例如tokenizer.mask_token = '<mask>'。目前v2中,只是將標記關(guān)聯(lián)到tokenizer的屬性,但如果該標記不在詞匯表中,則不會將其添加到詞匯表中,必須使用 tokenizer.add_special_tokens() 和 tokenizer.add_tokens() 方法才能添加標記。
prepare_for_model被移除
作為新的 tokenizer API 的一部分,prepare_for_model 方法被移除。
新的 Tokenizer API
隨著rust tokenizers的加入,tokenizers在第2版中發(fā)展迅速?,F(xiàn)在,它有了一個更簡單、更靈活的 API,在 Python(slow)和 Rust(fast)tokenizers 之間進行了調(diào)整。新的 API 讓你可以更深入地控制截斷和填充,允許動態(tài)填充或填充到 8 的倍數(shù)。
重新設計的 API 詳細解釋:
https://huggingface.co/transformers/master/preprocessing.html。
下面我們來看看這些顯著的變化:
- 現(xiàn)在可以截斷一個模型的最大輸入長度,同時填充一個批次中最長的序列。
- 填充和截斷被解耦,更容易控制。
- 它可以pad到預定義長度的倍數(shù)例如8,可以為最新的NVIDIA GPU(V100)帶來顯著的速度提升。
- 一個使用 tokenizer.__call__ 的通用包裝器,可用于所有情況(例如單個序列、一對序列到組、批次等)。
- tokenizer 現(xiàn)在可以接受預標記化的輸入。
- 現(xiàn)在,所有的Rust tokenizers都像slow tokenizers一樣被全面測試了。
- 一個新類 AddedToken ,用來對添加的標記,在標記化過程中的行為,進行更精細的控制。特別是用戶可以控制(1)在標記化過程中,標記周圍的左右空格是否會被移除(2)標記是否會在另一個詞中被識別,以及(3)標記是否會以標準化的形式被識別(例如,如果標記化器使用小寫字母)。
- 序列化問題得到解決
- 在 tokenizers 上使用 return_tensors 參數(shù)時,可以創(chuàng)建 NumPy tensors。
- 引入了一個新的枚舉 TensorType 來映射我們支持的所有可能的張量后端:TensorType.TENSORFLOW, TensorType.PYTORCH, TensorType.NUMPY。
- Tokenizers 現(xiàn)在接受 encode(...)、encode_plus(...)、batch_encode_plus(...) tokenizer 方法的 return_tensors 參數(shù)的 TensorType enum。
- BatchEncoding 新增的屬性 is_fast 表示 BatchEncoding 是來自 Python(slow)tokenizer 還是 Rust(fast)tokenizer。
- slow和fast tokenizer 現(xiàn)在是可挑選的。它們的輸出也是如此,即 dict 子類 BatchEncoding。
其他激動人心的改進
針對TensorFlow的改進
全新版本中,針對TensorFlow進行了非常大的升級:
- TensorFlow模型現(xiàn)在可以自己計算損失,使用TFPretrainedModel.compute_loss方法。
- 現(xiàn)在可以在TensorFlow中調(diào)整token嵌入的大小
- Cleaning TensorFlow model
新增MobileBERT
《MobileBERT: a Compact Task-Agnostic BERT for Resource-Limited Devices 》中的MobileBERT被添加到PyTorch和TensorFlow的庫中。
論文地址:
https://arxiv.org/abs/2004.02984
增加了一個單一的檢查點:mobilebert-uncased,也就是按照我們的 API 轉(zhuǎn)換的 uncased_L-24_H-128_B-512_A-4_F-4_OPT 檢查點。
增強examples/seq2seq內(nèi)容
全新版本中,將舊的 examples/summarization和 examples/translation文件夾整合到了一個新的examples/seq2seq文件夾中。
- Finetuning在summarization時效果不錯,不過翻譯時需要更多的實驗。Finetuning可以在多gpu上工作,在驗證過程中保存rouge分數(shù),并提供--freeze_encoder和--freeze_embeds選項。這些選項使得BART在cnn/dailymail數(shù)據(jù)集上的精調(diào)速度提高了5倍。
- 在distillation.py中添加了Distillbart代碼。目前,它只支持匯總。
- 評估對于summarization和翻譯都很好用。
- 新增權(quán)重和偏差共享任務,用于XSUM總結(jié)任務的協(xié)作。
Distilbart
- Distilbart模型是bart-large-cnn和bart-large-xsum的較小版本,它們可以使用BartForConditionalGeneration.from_pretrained('sshleifer/distilbart-xsum-12-6')來加載
- 重現(xiàn)的命令可以在examples/seq2seq文件夾中找到。
新增BERT Loses Patience
基準
對基準腳本進行了整合,并增加了一些功能。
針對Tensorflow增加推理:CPU、GPU、GPU+XLA、GPU+急切模式、CPU+急切模式、TPU。
針對PyTorch增加了推理和訓練:
- 推理:CPU, CPU + torchscript, GPU, GPU + torchscript, GPU + 混合精度, Torch/XLA TPU
- 訓練:CPU、GPU、GPU+混合精度、Torch/XLA TPU。