返回文章列表

TAPAS模型解析表格問答系統

本文解析了 TAPAS 模型如何將問答系統擴充套件至表格資料查詢。TAPAS 根據 Transformer 架構,結合表格與查詢陳述式進行處理,實作類別似文字查詢的功能。文章以目錄表格為例,演示了資料準備、DataFrame

自然語言處理 機器學習

表格問答系統近年來發展迅速,從傳統的根據規則的方法到根據深度學習的模型,技術不斷革新。TAPAS 模型的出現,標誌著問答系統在處理結構化資料方面取得了重大突破。它根據 Transformer 架構,能夠有效地理解表格資料和自然語言查詢,並準確地提取答案。與傳統的表格查詢方法相比,TAPAS 模型更具靈活性,能夠處理更複雜的查詢陳述式,例如聚合、比較和排序等操作。這使得 TAPAS 模型在資料分析、商業智慧和知識圖譜構建等領域具有廣泛的應用前景。隨著深度學習技術的發展,我們可以預見,表格問答系統將在更多場景中發揮重要作用。

表格問答系統:TAPAS模型解析

問答系統的擴充套件:從文字到表格

在前面的章節中,我們探討瞭如何使用問答模型來查詢文字中的資訊。現在,我們進一步討論如何將這種能力擴充套件到結構化資料,如表格。TAPAS(Table Parser)模型的出現,使得我們能夠像查詢文字一樣查詢表格中的資料,如圖11-10所示。

TAPAS模型架構

TAPAS模型根據Transformer架構,能夠結合表格資訊和查詢陳述式進行處理,如圖11-11所示。這種架構使得TAPAS能夠有效地理解和處理表格資料。

TAPAS模型例項演示

讓我們透過一個實際的例子來瞭解TAPAS的工作原理。假設我們有一個虛構的目錄表格,包含章節編號、章節名稱、起始頁碼和結束頁碼等資訊。我們首先將這些資料轉換為Pandas DataFrame,並新增一個新的欄位來表示每個章節的頁數。

book_data = [
    {"chapter": 0, "name": "Introduction", "start_page": 1, "end_page": 11},
    {"chapter": 1, "name": "Text classification", "start_page": 12, "end_page": 48},
    {"chapter": 2, "name": "Named Entity Recognition", "start_page": 49, "end_page": 73},
    {"chapter": 3, "name": "Question Answering", "start_page": 74, "end_page": 120},
    {"chapter": 4, "name": "Summarization", "start_page": 121, "end_page": 140},
    {"chapter": 5, "name": "Conclusion", "start_page": 141, "end_page": 144}
]

table = pd.DataFrame(book_data)
table['number_of_pages'] = table['end_page'] - table['start_page']
table = table.astype(str)

內容解密:

  1. 資料準備:首先,我們定義了一個名為book_data的列表,包含了目錄的相關資訊。
  2. DataFrame建立:使用Pandas將book_data轉換為DataFrame,以便於資料處理。
  3. 新增欄位:計算每個章節的頁數,並將結果儲存在新的欄位number_of_pages中。
  4. 資料型別轉換:將DataFrame中的所有欄位轉換為字串型別,以符合TAPAS模型的輸入要求。

接下來,我們載入表格問答管道(table-question-answering pipeline),並向模型提出一系列查詢,以驗證其效能。

table_qa = pipeline("table-question-answering")
queries = ["What's the topic in chapter 4?", "What is the total number of pages?", 
           "On which page does the chapter about question-answering start?", 
           "How many chapters have more than 20 pages?"]
preds = table_qa(table, queries)

內容解密:

  1. 載入模型:使用pipeline函式載入預訓練的表格問答模型。
  2. 定義查詢:準備了一系列查詢陳述式,以測試模型對不同型別問題的理解能力。
  3. 執行查詢:將表格和查詢陳述式傳遞給模型,取得預測結果。

最後,我們遍歷查詢結果,並輸出模型的預測答案。

for query, pred in zip(queries, preds):
    print(query)
    if pred["aggregator"] == "NONE":
        print("Predicted answer: " + pred["answer"])
    else:
        print("Predicted answer: " + pred["answer"])
    print('='*50)

內容解密:

  1. 遍歷結果:使用zip函式同時遍歷查詢陳述式和預測結果。
  2. 輸出答案:根據預測結果中的聚合器型別,輸出相應的答案。
  3. 格式化輸出:使用分隔線來區分不同的查詢結果。

多模態Transformer模型

TAPAS模型展示瞭如何將Transformer架構擴充套件到表格資料。進一步地,我們可以探索多模態Transformer模型,它能夠同時處理多種模態的資料,如音訊、文字和視覺資訊。這種能力使得多模態Transformer在諸如自動語音識別(ASR)和視覺問答等任務中具有廣泛的應用前景。

自動語音辨識與多模態轉換器的未來發展

自動語音辨識的進展

自動語音辨識(ASR)技術近年來取得了顯著的進步,尤其是在自我監督學習框架的推動下。其中,wav2vec 2.0 系列模型是目前最先進的 ASR 模型之一。這些模型結合了 Transformer 層和 CNN,能夠在僅使用少量標記資料的情況下實作競爭性的結果。

wav2vec 2.0 架構與應用

wav2vec 2.0 模型在 Transformers 中已整合,使用者可以輕鬆地載入和使用這些模型。以下是一個簡單的範例,展示如何使用預訓練的 wav2vec 2.0 模型進行語音辨識:

asr = pipeline("automatic-speech-recognition")
from datasets import load_dataset
ds = load_dataset("superb", "asr", split="validation[:1]")

內容解密:

  1. pipeline("automatic-speech-recognition"):載入預訓練的 ASR 模型,用於將語音轉換為文字。
  2. load_dataset("superb", "asr", split="validation[:1]"):載入 SUPERB 資料集中的 ASR 子集,並選擇第一個驗證樣本。
  3. ds:包含語音檔案和對應的文字標籤。

處理語音資料

為了將語音資料轉換為浮點數陣列,可以使用 SoundFile 函式庫讀取資料集中的每個檔案:

import soundfile as sf
def map_to_array(batch):
    speech, _ = sf.read(batch["file"])
    batch["speech"] = speech
    return batch
ds = ds.map(map_to_array)

內容解密:

  1. sf.read(batch["file"]):讀取語音檔案並傳回語音資料和取樣率。
  2. batch["speech"] = speech:將語音資料儲存在資料集中的 “speech” 欄位。
  3. ds.map(map_to_array):將 map_to_array 函式應用於資料集中的每個樣本。

使用 ASR 模型進行語音辨識

pred = asr(ds[0]["speech"])
print(pred)
{'text': 'MISTER QUILTER IS THE APOSTLE OF THE MIDDLE CLASSES AND WE ARE GLAD TO WELCOME HIS GOSPEL'}

內容解密:

  1. asr(ds[0]["speech"]):將第一個樣本的語音資料輸入到 ASR 模型中進行辨識。
  2. print(pred):輸出模型的預測結果,即語音對應的文字。

多模態轉換器的發展

除了語音辨識外,轉換器還可以結合視覺和文字資訊,形成多模態模型。以下是一些結合視覺和文字的多模態模型範例:

VisualQA

VisualQA 是一項結合視覺和文字的任務,旨在根據影像內容回答問題。模型如 LXMERT 和 VisualBERT 使用視覺模型提取影像特徵,並結合自然語言問題進行答案預測。

LayoutLM

LayoutLM 是一系列用於分析掃描檔案(如收據、發票或報告)的模型。這些模型結合了文字、影像和佈局資訊,使用增強的 Transformer 架構進行多模態融合。

DALL·E

DALL·E 是一個結合視覺和文字的生成模型,使用 GPT 架構和自迴歸建模從文字提示生成影像。該模型將文字和畫素視為一序列 Token,能夠根據文字描述生成對應的影像。

多模態轉換器模型(Multimodal Transformers)

多模態轉換器模型結合了文字和視覺等不同型別的資料,為自然語言處理(NLP)和電腦視覺等領域帶來了新的可能性。其中,DALL·E 和 CLIP 是兩個值得注意的模型。

DALL·E:結合文字和影像生成的模型

DALL·E 是一種能夠根據文字描述生成影像的模型。它使用了一個龐大的影像和文字配對資料集進行訓練,能夠生成多樣化和創意的影像。

CLIP:結合文字和視覺的監督學習模型

CLIP(Contrastive Language-Image Pre-training)是一種結合了文字和視覺的監督學習模型。它的建立者構建了一個包含 4 億個影像/標題配對的資料集,並使用對比學習(contrastive learning)對模型進行預訓練。CLIP 的架構由一個文字編碼器和一個影像編碼器組成,兩者都是根據 Transformer 的模型。

CLIP 的工作原理

  1. 資料準備:準備一個包含影像和對應標題的資料集。
  2. 模型架構:使用一個文字編碼器和一個影像編碼器將標題和影像轉換為嵌入向量(embeddings)。
  3. 對比學習:透過最大化相關配對的嵌入向量之間的相似度,同時最小化其他配對的相似度,來訓練模型。
  4. 零樣本影像分類別:使用預訓練的模型進行零樣本影像分類別,將可能的類別使用文字編碼器進行嵌入,然後比較這些嵌入向量與待分類別影像的嵌入向量之間的相似度。

使用 CLIP 進行影像分類別

from transformers import CLIPProcessor, CLIPModel
from PIL import Image
import torch
import matplotlib.pyplot as plt

# 載入預訓練的 CLIP 模型和處理器
clip_ckpt = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(clip_ckpt)
processor = CLIPProcessor.from_pretrained(clip_ckpt)

# 載入影像
image = Image.open("images/optimusprime.jpg")
plt.imshow(image)
plt.axis("off")
plt.show()

# 設定要比較的文字
texts = ["a photo of a transformer", "a photo of a robot", "a photo of agi"]
inputs = processor(text=texts, images=image, return_tensors="pt", padding=True)

# 進行預測
with torch.no_grad():
    outputs = model(**inputs)
    logits_per_image = outputs.logits_per_image
    probs = logits_per_image.softmax(dim=1)
    print(probs)

CLIP 的優勢

CLIP 的零樣本影像分類別效能非常出色,與完全監督訓練的視覺模型競爭。同時,CLIP 提供了更大的靈活性,可以透過文字定義類別,而不需要將類別硬編碼在模型架構中。

未來方向

本章節探討了多模態轉換器模型的最新進展,包括 DALL·E 和 CLIP 等模型。這些模型展示了轉換器在不同領域和模態中的潛力。未來,我們可以期待更多的研究和應用在多模態學習領域。

後續步驟

  1. 加入 Hugging Face 社群活動:參與 Hugging Face 主辦的短期的衝刺活動(sprints),提高函式庫的功能,並與社群成員交流。
  2. 建立自己的專案:透過建立專案來測試自己的知識,可以重新實作轉換器論文,或將轉換器應用於新的領域。
  3. 向 Transformers 函式庫貢獻模型:貢獻新的架構到 Transformers 函式庫,深入瞭解函式庫的內部機制。
  4. 寫部落格分享所學:透過寫部落格來測試自己的知識,並與他人分享經驗。

內容解密:

此段落主要闡述了多模態轉換器模型,包括參與開源社群、建立自己的專案、向Transformers函式庫貢獻新的模型架構以及寫部落格分享所學知識。這四個步驟旨在幫助讀者進一步提升自己的技能並為開源社群做出貢獻。這些步驟不僅能夠強化讀者的知識和技能,也能夠促進開源社群的發展和繁榮。

圖表說明

此圖示展示了 CLIP 模型的架構,包括文字編碼器和影像編碼器,以及如何使用對比學習進行預訓練。

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表說明

rectangle "嵌入向量" as node1
rectangle "相似度" as node2

node1 --> node2

@enduml

內容解密:

此 Plantuml 圖表描述了 CLIP 模型的架構,包括文字編碼器和影像編碼器如何透過對比學習生成嵌入向量,並最終進行類別預測。文字編碼器和影像編碼器分別將輸入的文字和影像轉換為嵌入向量,然後透過對比學習最大化相關配對的相似度並最小化不相關配對的相似度,從而實作零樣本影像分類別。

索引

  • 絕對位置表示(absolute positional representations)
  • 抽象問答(abstractive QA)
  • 抽象摘要(abstractive summaries)
  • 加速函式庫(Accelerate library)

內容解密:

本索引列出了本章節中提到的關鍵術語,包括絕對位置表示、抽象問答、抽象摘要和加速函式庫等。這些術語與轉換器模型的實作和應用密切相關。瞭解這些術語有助於更好地理解轉換器模型的工作原理和應用場景。

Transformer 技術深度解析與應用

前言

Transformer 架構自問世以來,已成為自然語言處理(NLP)領域的根本。本文將探討 Transformer 的核心技術、應用場景以及其在實際案例中的表現。

Transformer 架構解析

編碼器(Encoder)與解碼器(Decoder)

Transformer 架構主要由編碼器和解碼器組成。編碼器負責將輸入文字轉換為隱藏表示,而解碼器則根據這些表示生成輸出文字。

自注意力機制(Self-Attention)

自注意力機制是 Transformer 的核心創新之一。它允許模型在處理輸入序列時,能夠動態地關注不同位置的資訊,從而捕捉長距離依賴關係。

import torch
import torch.nn as nn
import torch.nn.functional as F

class SelfAttention(nn.Module):
    def __init__(self, embed_dim, num_heads):
        super(SelfAttention, self).__init__()
        self.embed_dim = embed_dim
        self.num_heads = num_heads
        self.head_dim = embed_dim // num_heads
        
        self.query_linear = nn.Linear(embed_dim, embed_dim)
        self.key_linear = nn.Linear(embed_dim, embed_dim)
        self.value_linear = nn.Linear(embed_dim, embed_dim)
        
        self.dropout = nn.Dropout(0.1)
    
    def forward(self, x):
        # x: [batch_size, sequence_length, embed_dim]
        batch_size = x.size(0)
        sequence_length = x.size(1)
        
        query = self.query_linear(x).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2)
        key = self.key_linear(x).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2)
        value = self.value_linear(x).view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2)
        
        # 計算注意力分數
        attention_scores = torch.matmul(query, key.transpose(-1, -2)) / math.sqrt(self.head_dim)
        attention_weights = F.softmax(attention_scores, dim=-1)
        attention_weights = self.dropout(attention_weights)
        
        # 計算輸出
        output = torch.matmul(attention_weights, value).transpose(1, 2).contiguous().view(batch_size, sequence_length, self.embed_dim)
        
        return output

#### 內容解密:
1. **多頭注意力機制**透過 `num_heads` 引數實作多頭注意力每個頭獨立計算注意力分數最後合併結果
2. **查詢** 線性變換使用 `query_linear`、`key_linear``value_linear` 將輸入 `x` 轉換為查詢鍵和值向量
3. **注意力分數計算**透過點積計算查詢和鍵之間的相似度並使用縮放因子 `math.sqrt(self.head_dim)` 進行標準化
4. **Softmax 與 Dropout**對注意力分數應用 Softmax 取得權重並使用 Dropout 防止過擬合
5. **輸出計算**將注意力權重應用於值向量得到最終輸出

### Transformer 變體與應用

#### BERT 模型
BERTBidirectional Encoder Representations from Transformers是根據 Transformer 編碼器的預訓練語言模型它在多項 NLP 任務上取得了顯著的成果

#### T5 模型
T5Text-to-Text Transfer Transformer將所有 NLP 任務統一為文字到文字的格式進一步擴充套件了 Transformer 的應用範圍

### Transformer 在實際案例中的表現

#### 文字分類別
Transformer 在文字分類別任務中表現出色能夠捕捉文字中的關鍵資訊和上下文關係

#### 問答系統
透過微調預訓練的 Transformer 模型可以構建高效的問答系統能夠準確地從文字中提取答案

##### 此圖示說明瞭 Transformer 的整體架構,包括編碼器和解碼器的處理流程,以及自注意力機制和前饋神經網路的作用。