Transformers 文件
TAPEX
並獲得增強的文件體驗
開始使用
TAPEX
該模型僅處於維護模式,我們不接受任何更改其程式碼的新 PR。
如果在執行此模型時遇到任何問題,請重新安裝支援此模型的最後一個版本:v4.30.0。您可以透過執行以下命令進行安裝:`pip install -U transformers==4.30.0`。
概述
TAPEX模型由Qian Liu、Bei Chen、Jiaqi Guo、Morteza Ziyadi、Zeqi Lin、Weizhu Chen、Jian-Guang Lou在論文《TAPEX: Table Pre-training via Learning a Neural SQL Executor》中提出。TAPEX預訓練一個BART模型來解決合成的SQL查詢,之後可以微調該模型以回答與表格資料相關的自然語言問題,以及執行表格事實核查。
TAPEX已經在多個數據集上進行了微調:
論文摘要如下:
最近在語言模型預訓練方面的進展,透過利用大規模非結構化文字資料取得了巨大成功。然而,由於缺乏大規模高質量的表格資料,將預訓練應用於結構化表格資料仍然是一個挑戰。在本文中,我們提出了TAPEX,表明可以透過在一個合成語料庫上學習一個神經SQL執行器來實現表格預訓練,該語料庫是透過自動合成可執行的SQL查詢及其執行輸出來獲得的。TAPEX透過引導語言模型在多樣化、大規模和高質量的合成語料庫上模仿SQL執行器,解決了資料稀缺的挑戰。我們在四個基準資料集上評估了TAPEX。實驗結果表明,TAPEX的表現遠超之前的表格預訓練方法,並在所有資料集上取得了新的最先進結果。這包括將弱監督的WikiSQL指稱準確率提高到89.5%(+2.3%),WikiTableQuestions指稱準確率提高到57.5%(+4.8%),SQA指稱準確率提高到74.5%(+3.5%),以及TabFact準確率提高到84.2%(+3.2%)。據我們所知,這是首個透過合成可執行程式來利用表格預訓練,並在各種下游任務上取得新的最先進結果的工作。
使用技巧
- TAPEX是一個生成式(seq2seq)模型。可以直接將TAPEX的權重載入到一個BART模型中。
- TAPEX在模型中心(hub)上有多個檢查點,有些是僅經過預訓練的,有些則是在WTQ、SQA、WikiSQL和TabFact上進行了微調。
- 句子和表格以`句子 + " " + 線性化表格`的形式提供給模型。線性化表格的格式如下:`col: col1 | col2 | col 3 row 1 : val1 | val2 | val3 row 2 : ...`。
- TAPEX有其自己的分詞器,可以輕鬆地為模型準備所有資料。可以向分詞器傳遞Pandas DataFrame和字串,它會自動建立`input_ids`和`attention_mask`(如下面的使用示例所示)。
使用方法:推理
下面,我們演示如何使用TAPEX進行表格問答。正如你所看到的,可以直接將TAPEX的權重載入到一個BART模型中。我們使用Auto API,它會根據模型中心上檢查點的配置檔案,自動為我們例項化適當的分詞器(TapexTokenizer)和模型(BartForConditionalGeneration)。
>>> from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
>>> import pandas as pd
>>> tokenizer = AutoTokenizer.from_pretrained("microsoft/tapex-large-finetuned-wtq")
>>> model = AutoModelForSeq2SeqLM.from_pretrained("microsoft/tapex-large-finetuned-wtq")
>>> # prepare table + question
>>> data = {"Actors": ["Brad Pitt", "Leonardo Di Caprio", "George Clooney"], "Number of movies": ["87", "53", "69"]}
>>> table = pd.DataFrame.from_dict(data)
>>> question = "how many movies does Leonardo Di Caprio have?"
>>> encoding = tokenizer(table, question, return_tensors="pt")
>>> # let the model generate an answer autoregressively
>>> outputs = model.generate(**encoding)
>>> # decode back to text
>>> predicted_answer = tokenizer.batch_decode(outputs, skip_special_tokens=True)[0]
>>> print(predicted_answer)
53
請注意,TapexTokenizer也支援批次推理。因此,可以提供一批不同的表格/問題,或者一批單個表格和多個問題,或者一批單個查詢和多個表格。讓我們來演示一下:
>>> # prepare table + question
>>> data = {"Actors": ["Brad Pitt", "Leonardo Di Caprio", "George Clooney"], "Number of movies": ["87", "53", "69"]}
>>> table = pd.DataFrame.from_dict(data)
>>> questions = [
... "how many movies does Leonardo Di Caprio have?",
... "which actor has 69 movies?",
... "what's the first name of the actor who has 87 movies?",
... ]
>>> encoding = tokenizer(table, questions, padding=True, return_tensors="pt")
>>> # let the model generate an answer autoregressively
>>> outputs = model.generate(**encoding)
>>> # decode back to text
>>> tokenizer.batch_decode(outputs, skip_special_tokens=True)
[' 53', ' george clooney', ' brad pitt']
如果想要進行表格驗證(即判斷一個給定句子是否被表格內容支援或反駁的任務),可以例項化一個BartForSequenceClassification模型。TAPEX在模型中心上有在TabFact上微調的檢查點,這是表格事實核查的一個重要基準(準確率達到84%)。下面的程式碼示例再次利用了Auto API。
>>> from transformers import AutoTokenizer, AutoModelForSequenceClassification
>>> tokenizer = AutoTokenizer.from_pretrained("microsoft/tapex-large-finetuned-tabfact")
>>> model = AutoModelForSequenceClassification.from_pretrained("microsoft/tapex-large-finetuned-tabfact")
>>> # prepare table + sentence
>>> data = {"Actors": ["Brad Pitt", "Leonardo Di Caprio", "George Clooney"], "Number of movies": ["87", "53", "69"]}
>>> table = pd.DataFrame.from_dict(data)
>>> sentence = "George Clooney has 30 movies"
>>> encoding = tokenizer(table, sentence, return_tensors="pt")
>>> # forward pass
>>> outputs = model(**encoding)
>>> # print prediction
>>> predicted_class_idx = outputs.logits[0].argmax(dim=0).item()
>>> print(model.config.id2label[predicted_class_idx])
Refused
TAPEX的架構與BART相同,除了分詞部分。有關配置類及其引數的資訊,請參考BART文件。TAPEX特定的分詞器在下面有詳細說明。
TapexTokenizer
class transformers.TapexTokenizer
< 原始碼 >( vocab_file merges_file do_lower_case = True errors = 'replace' bos_token = '<s>' eos_token = '</s>' sep_token = '</s>' cls_token = '<s>' unk_token = '<unk>' pad_token = '<pad>' mask_token = '<mask>' add_prefix_space = False max_cell_length = 15 **kwargs )
引數
- vocab_file (
str
) — 詞彙表文件的路徑。 - merges_file (
str
) — 合併檔案的路徑。 - do_lower_case (
bool
, *可選*, 預設為True
) — 是否在分詞時將輸入轉換為小寫。 - errors (
str
, *可選*, 預設為"replace"
) — 將位元組解碼為UTF-8時遵循的正規化。更多資訊請參見bytes.decode。 - bos_token (
str
, *可選*, 預設為"<s>"
) — 在預訓練期間使用的序列開始標記。可用作序列分類器標記。當使用特殊標記構建序列時,這不是用於序列開始的標記。使用的標記是`cls_token`。
- eos_token (
str
, *可選*, 預設為"</s>"
) — 序列結束標記。當使用特殊標記構建序列時,這不是用於序列結束的標記。使用的標記是`sep_token`。
- sep_token (
str
, *可選*, 預設為"</s>"
) — 分隔符標記,用於從多個序列構建一個序列時使用,例如用於序列分類的兩個序列,或用於問答的文字和問題。它也用作使用特殊標記構建的序列的最後一個標記。 - cls_token (
str
, *可選*, 預設為"<s>"
) — 分類器標記,用於進行序列分類(對整個序列進行分類,而不是逐個標記分類)。當使用特殊標記構建序列時,它是序列的第一個標記。 - unk_token (
str
, *可選*, 預設為"<unk>"
) — 未知標記。不在詞彙表中的標記無法轉換為ID,將被設定為該標記。 - pad_token (
str
, *可選*, 預設為"<pad>"
) — 用於填充的標記,例如在批處理不同長度的序列時使用。 - mask_token (
str
, *可選*, 預設為"<mask>"
) — 用於掩蓋值的標記。這是在使用掩碼語言建模訓練此模型時使用的標記。這是模型將嘗試預測的標記。 - add_prefix_space (
bool
, *可選*, 預設為False
) — 是否在輸入前新增一個初始空格。這允許將開頭的單詞像其他任何單詞一樣對待。(BART分詞器透過前面的空格來檢測單詞的開頭)。 - max_cell_length (
int
, *可選*, 預設為 15) — 線性化表格時每個單元格的最大字元數。如果超過此數目,將進行截斷。
構建一個TAPEX分詞器。基於位元組級位元組對編碼(BPE)。
這個分詞器可以用來將一個或多個表格扁平化,並與一個或多個相關的句子連線起來,供TAPEX模型使用。TAPEX分詞器建立的格式如下:
句子 col: col1 | col2 | col 3 row 1 : val1 | val2 | val3 row 2 : …
該分詞器支援單個表格+單個查詢、單個表格和多個查詢(此時表格將為每個查詢複製一份)、單個查詢和多個表格(此時查詢將為每個表格複製一份),以及多個表格和多個查詢。換句話說,你可以向分詞器提供一批表格和問題,以便為模型準備它們。
分詞本身基於BPE演算法。它與BART、RoBERTa和GPT-2使用的分詞器相同。
該分詞器繼承自PreTrainedTokenizer,其中包含了大部分主要方法。使用者應參考該超類以獲取有關這些方法的更多資訊。
__call__
< 原始碼 >( table: typing.Union[ForwardRef('pd.DataFrame'), list['pd.DataFrame']] = None query: typing.Union[str, list[str], NoneType] = None answer: typing.Union[str, list[str], NoneType] = None add_special_tokens: bool = True padding: typing.Union[bool, str, transformers.utils.generic.PaddingStrategy] = False truncation: typing.Union[bool, str, transformers.tokenization_utils_base.TruncationStrategy] = None max_length: typing.Optional[int] = None stride: int = 0 pad_to_multiple_of: typing.Optional[int] = None return_tensors: typing.Union[str, transformers.utils.generic.TensorType, NoneType] = None return_token_type_ids: typing.Optional[bool] = None return_attention_mask: typing.Optional[bool] = None return_overflowing_tokens: bool = False return_special_tokens_mask: bool = False return_offsets_mapping: bool = False return_length: bool = False verbose: bool = True **kwargs )
引數
- table (
pd.DataFrame
,list[pd.DataFrame]
) — 包含表格資料的表格。 - query (
str
orlist[str]
, *可選*) — 與一個或多個待編碼表格相關的句子或句子批次。請注意,句子的數量必須與表格的數量相匹配。 - answer (
str
orlist[str]
, *可選*) — 可選,對應問題的答案作為監督。 - add_special_tokens (
bool
, *可選*, 預設為True
) — 是否在編碼序列時新增特殊標記。這將使用底層的`PretrainedTokenizerBase.build_inputs_with_special_tokens`函式,該函式定義了哪些標記會自動新增到輸入ID中。如果你想自動新增`bos`或`eos`標記,這會很有用。 - padding (
bool
,str
or PaddingStrategy, *可選*, 預設為False
) — 啟用和控制填充。接受以下值:- `True` 或 `'longest'`:填充到批次中最長的序列(如果只提供單個序列則不填充)。
- `'max_length'`:填充到由 `max_length` 引數指定的最大長度,或者如果未提供該引數,則填充到模型的最大可接受輸入長度。
- `False` 或 `'do_not_pad'`(預設):不填充(即可以輸出具有不同長度序列的批次)。
- truncation (
bool
,str
or TruncationStrategy, *可選*, 預設為False
) — 啟用和控制截斷。接受以下值:- `True` 或 `'longest_first'`:截斷到由 `max_length` 引數指定的最大長度,或者如果未提供該引數,則截斷到模型的最大可接受輸入長度。這將逐個標記進行截斷,如果提供了一對序列(或一批序列對),則從最長的序列中移除一個標記。
- `'only_first'`:截斷到由 `max_length` 引數指定的最大長度,或者如果未提供該引數,則截斷到模型的最大可接受輸入長度。如果提供了一對序列(或一批序列對),這隻會截斷第一個序列。
- `'only_second'`:截斷到由 `max_length` 引數指定的最大長度,或者如果未提供該引數,則截斷到模型的最大可接受輸入長度。如果提供了一對序列(或一批序列對),這隻會截斷第二個序列。
- `False` 或 `'do_not_truncate'`(預設):不截斷(即可以輸出序列長度大於模型最大可接受輸入大小的批次)。
- max_length (
int
, *可選*) — 控制由截斷/填充引數之一使用的最大長度。如果未設定或設定為 `None`,並且截斷/填充引數之一需要最大長度,則將使用預定義的模型最大長度。如果模型沒有特定的最大輸入長度(如XLNet),則將停用截斷/填充到最大長度。
- stride (
int
, optional, defaults to 0) — 如果與max_length
一起設定為一個數字,當return_overflowing_tokens=True
時,返回的溢位詞元將包含一些來自被截斷序列末尾的詞元,以便在被截斷和溢位的序列之間提供一些重疊。此引數的值定義了重疊詞元的數量。 - is_split_into_words (
bool
, optional, defaults toFalse
) — 輸入是否已經預分詞(例如,拆分為單詞)。如果設定為True
,分詞器會假定輸入已經被拆分為單詞(例如,透過在空白處分割),然後對其進行分詞。這對於 NER 或詞元分類任務很有用。 - pad_to_multiple_of (
int
, optional) — 如果設定,將序列填充到所提供值的倍數。需要啟用padding
。這對於在計算能力>= 7.5
(Volta) 的 NVIDIA 硬體上使用 Tensor Cores 特別有用。 - padding_side (
str
, optional) — 模型應在其上應用填充的一側。應在 [‘right’, ‘left’] 之間選擇。預設值從同名的類屬性中選取。 - return_tensors (
str
or TensorType, optional) — 如果設定,將返回張量而不是 Python 整數列表。可接受的值是:'tf'
:返回 TensorFlowtf.constant
物件。'pt'
:返回 PyTorchtorch.Tensor
物件。'np'
:返回 Numpynp.ndarray
物件。
- add_special_tokens (
bool
, optional, defaults toTrue
) — 是否使用與模型相關的特殊詞元對序列進行編碼。 - padding (
bool
,str
or PaddingStrategy, optional, defaults toFalse
) — 啟用和控制填充。接受以下值:True
或'longest'
:填充到批次中最長的序列(如果只提供單個序列則不填充)。'max_length'
:填充到由引數max_length
指定的最大長度,如果未提供該引數,則填充到模型可接受的最大輸入長度。False
或'do_not_pad'
(預設值):不填充(即,可以輸出具有不同長度序列的批次)。
- truncation (
bool
,str
,TapexTruncationStrategy
or TruncationStrategy, — optional, defaults toFalse
):啟用和控制截斷。接受以下值:
'drop_rows_to_fit'
:截斷到由引數max_length
指定的最大長度,如果未提供該引數,則截斷到模型可接受的最大輸入長度。這將逐行截斷,從表格中刪除行。True
或'longest_first'
:截斷到由引數max_length
指定的最大長度,如果未提供該引數,則截斷到模型可接受的最大輸入長度。如果提供了一對序列(或一批序列對),這將逐個詞元地截斷,從最長的序列中移除一個詞元。'only_first'
:截斷到由引數max_length
指定的最大長度,如果未提供該引數,則截斷到模型可接受的最大輸入長度。如果提供了一對序列(或一批序列對),這將只截斷第一個序列。'only_second'
:截斷到由引數max_length
指定的最大長度,如果未提供該引數,則截斷到模型可接受的最大輸入長度。如果提供了一對序列(或一批序列對),這將只截斷第二個序列。False
或'do_not_truncate'
(預設值):不截斷(即,可以輸出序列長度大於模型最大可接受輸入大小的批次)。
- max_length (
int
, optional) — 控制由截斷/填充引數之一使用的最大長度。如果未設定或設定為None
,當截斷/填充引數之一需要最大長度時,將使用預定義的模型最大長度。如果模型沒有特定的最大輸入長度(如 XLNet),則截斷/填充到最大長度的功能將被停用。 - stride (
int
, optional, defaults to 0) — 如果與max_length
一起設定為一個數字,當return_overflowing_tokens=True
時,返回的溢位詞元將包含一些來自被截斷序列末尾的詞元,以便在被截斷和溢位的序列之間提供一些重疊。此引數的值定義了重疊詞元的數量。 - pad_to_multiple_of (
int
, optional) — 如果設定,將序列填充到所提供值的倍數。這對於在計算能力>= 7.5
(Volta) 的 NVIDIA 硬體上使用 Tensor Cores 特別有用。 - return_tensors (
str
or TensorType, optional) — 如果設定,將返回張量而不是 Python 整數列表。可接受的值是:'tf'
:返回 TensorFlowtf.constant
物件。'pt'
:返回 PyTorchtorch.Tensor
物件。'np'
:返回 Numpynp.ndarray
物件。
用於對一個或多個表格-序列對進行分詞併為模型做準備的主要方法。