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