當前位置: 華文世界 > 科技

我用kimi學習Transformer ,沒有想到不到一個小時就會了

2024-07-26科技

Transformer 是一種深度學習模型,由 Ashish Vaswani 等人在 2017 年的論文【Attention Is All You Need】中首次提出。它主要用於處理序列數據,特別是在自然語言處理(NLP)領域取得了巨大成功,例如在機器轉譯、文本摘要、問題回答等任務中表現出色。以下是對 Transformer 模型的關鍵點解釋:

1. 自註意力機制(Self-Attention)

  • 核心思想 :自註意力機制允許輸入序列的每個元素都與序列中的其他元素進行互動,從而捕捉序列內部的依賴關系。
  • 計算過程 :對於序列中的每個元素,自註意力機制計算它與序列中所有其他元素的關系得分,並生成一個加權和,這個加權和代表了該元素的「註意力」表示。
  • 2. 多頭註意力(Multi-Head Attention)

  • 目的 :透過並列處理多個自註意力層,模型可以同時學習到輸入數據的不同子空間表示。
  • 操作 :每個頭學習到序列的不同方面,最後將所有頭的輸出合並,以獲得全面的序列表示。
  • 3. 前饋網絡(Feed-Forward Networks)

  • 在自註意力層之後,Transformer 使用前饋神經網絡對數據進行進一步的處理。這通常包括線性變換和非線性啟用函數。
  • 4. 位置編碼(Positional Encoding)

  • 由於 Transformer 模型本身不具備捕捉序列順序的能力,因此需要位置編碼來提供序列中單詞的位置資訊。
  • 位置編碼通常是透過正弦和余弦函數的線性組合來實作,並將這個編碼添加到輸入嵌入中。
  • 5. 層歸一化(Layer Normalization)

  • 為了穩定訓練過程,Transformer 在每個子層(自註意力層和前饋網絡)之後使用層歸一化。
  • 6. 殘留誤差連線(Residual Connections)

  • 殘留誤差連線允許模型在深層網絡中更有效地傳播資訊。在每個子層的輸出上添加輸入,然後進行層歸一化。
  • 7. 訓練和套用

  • Transformer 模型通常使用大量的數據進行訓練,並采用如交叉熵損失函數進行最佳化。
  • 在套用中,Transformer 模型可以用於各種 NLP 任務,如機器轉譯、文本分類、命名實體辨識等。
  • 8. 變體和發展

  • 自原始 Transformer 提出以來,出現了許多變體,如 BERT(Bidirectional Encoder Representations from Transformers)、GPT(Generative Pre-trained Transformer)等,它們在不同的任務和領域中取得了顯著的成果。
  • 範例程式碼(使用 PyTorch 和 Hugging Face 的 Transformers 庫):

    python

    import torch from transformers import TransformerModel , BertTokenizer

    # 載入預訓練的 Transformer 模型和分詞器

    model = TransformerModel . from_pretrained ( 'bert-base-uncased' )

    tokenizer = BertTokenizer . from_pretrained ( 'bert-base-uncased' )

    # 準備輸入數據

    text = "The quick brown fox jumps over the lazy dog" encoded_input = tokenizer ( text , return_tensors = 'pt' )

    # 獲取模型的輸出

    output = model ( ** encoded_input )

    # 輸出的 'last_hidden_state' 包含了序列的最終隱藏狀態

    hidden_states = output . last_hidden_state

    在這個範例中,我們使用了 Hugging Face 的 Transformers 庫來載入預訓練的 BERT 模型,並對其進行了簡單的文本輸入處理和前向傳播。

    Transformer 模型的提出標誌著 NLP 領域的一個重要進展,其自註意力機制和多頭註意力的設計使得模型能夠更好地處理序列數據中的長距離依賴問題。

    在 Transformer 模型中,"query"(查詢)、"key"(鍵)和 "value"(值)是在自註意力機制中使用的術語,它們是透過以下方式獲得的:

    1. 輸入嵌入
    2. 首先,模型接收輸入序列(例如,文本句子中的單詞或字元),這些輸入首先被轉換為嵌入表示。這通常涉及到一個可訓練的嵌入矩陣,它將輸入的離散符號(如單詞ID)對映到連續的向量空間。
    3. 權重矩陣
    4. 輸入嵌入隨後被分別乘以三個不同的權重矩陣,生成查詢(Q)、鍵(K)和值(V)。
    5. 這些權重矩陣是模型在訓練過程中需要學習的參數。
    6. 計算註意力得分
    7. 對於序列中的每個元素,模型計算其查詢(Q)與所有鍵(K)的點積,得到一個註意力得分矩陣。這個點積反映了不同元素之間的相似性或相關性。
    8. 通常,這個得分會透過一個縮放因子(通常是鍵向量維度的平方根)進行縮放,以防止梯度消失或爆炸。
    9. Softmax 歸一化
    10. 然後,使用 softmax 函數對註意力得分進行歸一化,使得每一行的和為1。這樣,每個元素的輸出都是其對應值(V)的加權和,權重由歸一化的註意力得分決定。
    11. 多頭註意力
    12. 在多頭註意力中,上述過程被重復多次,但是每個「頭」都有自己的權重矩陣。這樣,每個頭學習到的是輸入數據的不同方面或表示。
    13. 拼接和線性層
    14. 各個頭的輸出被拼接在一起,並透過另一個線性層進行處理,以產生最終的輸出。

    範例程式碼(使用 PyTorch):

    python

    import torch import torch . nn as nn

    # 假設輸入嵌入的大小為 embedding_size

    embedding_size = 256

    # 定義權重矩陣

    W_q = nn . Parameter ( torch . randn ( embedding_size , embedding_size ))

    W_k = nn . Parameter ( torch . randn ( embedding_size , embedding_size ))

    W_v = nn . Parameter ( torch . randn ( embedding_size , embedding_size ))

    # 假設輸入序列的嵌入表示為 embedded_input

    embedded_input = torch . randn ( 10 , 32 , embedding_size )

    # (序列長度, 批次大小, 嵌入大小) # 計算查詢、鍵和值

    Q = torch . matmul ( embedded_input , W_q )

    K = torch . matmul ( embedded_input , W_k )

    V = torch . matmul ( embedded_input , W_v )

    # 計算註意力得分並套用 softmax

    attention_scores = torch . matmul ( Q , K . transpose ( - 2 , - 1 )) /

    sqrt ( embedding_size )

    attention_probs = torch . softmax ( attention_scores , dim =- 1 )

    # 計算加權的值

    output = torch . matmul ( attention_probs , V )

    在這個範例中,我們首先定義了生成查詢、鍵和值的權重矩陣。然後,我們透過矩陣乘法計算了它們,並使用 softmax 函數對註意力得分進行了歸一化。最後,我們計算了加權的值,這代表了自註意力層的輸出。

    在實際的 Transformer 模型實作中,這個過程會更加復雜,包括多頭註意力的處理、層歸一化、殘留誤差連線等。但是,上述範例提供了自註意力機制的基本框架。