iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
AI & Data

「AI之旅:Python、Keras、PyTorch」 - 深度學習與數據入門挑戰系列 第 18

【Day18】Transformer:革命性的序列建模模型

  • 分享至 

  • xImage
  •  

昨天把自製訓練集從模型訓練到運用部分告一段落,接下來我們來以文字做接續,首先我們先來大致介紹Transformer,後面我們將以pytorch來建構Transformer並使用它來做應用。

  • Transformer 簡介
    • Transformer哪裡來?
    • Transformer 核心組件
    • Transformer 訓練過程
    • Transformer模型構造

Transformer 簡介

Transformer是一種深度學習模型,特別適用於自然語言處理(NLP)和其他序列建模任務,它在NLP領域的出現引發了巨大的關注,並在各種NLP任務中取得了優異的表現,如機器翻譯、語言建模和文本生成。

Transformer哪裡來?

Transformer是由Google於2017年首次提出的深度學習模型,用於處理序列數據特別是自然語言文本,傳統的序列建模方法,如循環神經網絡(RNN)卷積神經網絡(CNN),存在一些限制,如難以處理長距離依賴關係和並行處理,Transformer通過引入自注意力機制(Self-Attention)來解決這些問題,使得模型能夠在不同位置之間建立依賴關係,並實現高效的並行計算。

Transformer 核心組件

下面我們介紹關於Transformer模型幾個重要的部分

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

自注意力機制是Transformer的核心。它允許模型根據輸入序列中的不同位置來賦予不同的注意權重,這對於理解上下文和處理長序列非常重要,自注意力機制的計算過程可以簡單描述

  • 對於輸入序列中的每個詞,計算與其他所有詞之間的注意權重。
  • 使用這些注意權重對所有詞的表示進行加權總和,以獲得每個詞的新表示。

注意力機制就像人在看一張圖片,如下圖我們可能會注意選手慶祝的表情,與壓過終點線的輪子(或那一包)
https://ithelp.ithome.com.tw/upload/images/20231003/20163184nJzYAsGYKy.jpg
圖片來源: https://udn.com/news/story/12393/7479594

2. 多頭注意力(Multi-Head Attention)

為了更好地捕捉不同類型的關係,Transformer引入了多頭注意力機制。它允許模型在不同子空間中計算注意力,然後將它們組合在一起。多頭注意力可以增加模型的表達能力。

3. 前向神經網絡(Feed-Forward Neural Network)

Transformer中的每個注意力子層之後都接了一個前向神經網絡,用於進一步處理特徵。這個簡單的全連接網絡有助於學習特徵的非線性映射。

4. 位置編碼(Positional Encoding)

由於Transformer沒有像RNN那樣的隱藏狀態,因此需要引入位置編碼,以區分不同位置的詞。位置編碼是一個固定的向量,添加到詞的嵌入表示中,以考慮詞的相對位置。

5. 堆疊層和殘差連接

Transformer模型由多個堆疊的層組成,每個層都包括自注意力子層和前向神經網絡子層。層之間使用殘差連接,以確保梯度能夠順暢地反向傳播。

Transformer 訓練過程

Transformer通常通過監督學習(Supervised learning)進行訓練,例如機器翻譯任務中的原語言到目標語言的映射。訓練過程包括以下步驟:

  • 輸入序列的詞嵌入:將輸入序列中的詞轉換為固定維度的詞嵌入向量。
  • 位置編碼的添加:將位置編碼添加到詞嵌入中,以考慮詞的位置信息。
  • 通過多層Transformer網絡:通過多個堆疊的Transformer層來處理輸入序列。
  • 最終的線性映射和Softmax:將模型的輸出映射為輸出詞的概率分佈,並使用交叉熵損失進行訓練。

Transformer模型構造

我們來看看以Pytorch建立Transformer模型會長什麼樣子,以自注意力機制(self-attention mechanism)模型為例,大致如下方所示

導入PyTorch函式庫

import torch
import torch.nn as nn

定義Transformer模型

# 定義Transformer模型
class Transformer(nn.Module):
    def __init__(self, vocab_size, d_model, nhead, num_encoder_layers, num_decoder_layers):
        super(Transformer, self).__init__()
        self.embedding = nn.Embedding(vocab_size, d_model)
        self.transformer = nn.Transformer(d_model, nhead, num_encoder_layers, num_decoder_layers)
        self.fc = nn.Linear(d_model, vocab_size)

nn.Embedding層:用於將輸入的整數序列(詞嵌入)轉換為密集向量表示(d_model維度的向量表示)。
nn.Transformer層:這是Transformer模型的核心,它接受輸入的詞嵌入(src_embed和tgt_embed)並執行自注意力機制和位置編碼。
nn.Linear層:用於將模型的輸出映射到詞彙表大小(vocab_size)的向量,以生成模型的輸出預測。

前向傳播(forward)

forward定義了模型的前向計算過程,它接受兩個輸入序列src和tgt,將它們分別嵌入為密集向量(src_embed和tgt_embed),通過nn.Transformer層進行處理,最後經過nn.Linear層生成模型的輸出,輸出是對目標序列(tgt)的預測。

    def forward(self, src, tgt):
        src_embed = self.embedding(src)
        tgt_embed = self.embedding(tgt)
        output = self.transformer(src_embed, tgt_embed)
        output = self.fc(output)
        return output


創建模型


# 創建模型
model = Transformer(vocab_size=10000, d_model=512, nhead=8, num_encoder_layers=6, num_decoder_layers=6)

括號當中分別為:

vocab_size=10000: 詞彙表的大小,指定了模型可以處理的詞彙數量,在這個模型中,詞彙表的大小為10,000,這表示模型將考慮最常見的10,000個詞彙。

d_model=512:模型的嵌入維度或特徵維度,決定了模型中詞彙的表示方式,以及內部運算的維度。(在這個模型中,每個詞彙將被表示為一個長度為512的向量)

nhead=8: 這是注意力機制中的注意力頭數量,Transformer模型使用多頭自注意力機制,每個頭都可以學習關注序列中不同位置的信息。

num_encoder_layers=6: **編碼器(Encoder)**的層數,Transformer模型包括一個編碼器和一個解碼器,編碼器用於處理輸入序列,解碼器用於生成輸出序列。

num_decoder_layers=6: **解碼器(Decoder)**層數,與編碼器類似,解碼器也有6層,用於生成目標序列。


以上就是對Transformer的大概介紹,明天我們先介紹上面提到的監督學習,之後來訓練一個Transformer模型做結尾,我們明天見。


上一篇
【Day17】自製訓練集:總結
下一篇
【Day19】監督學習中的Transformer模型應用於IMDB情感分類
系列文
「AI之旅:Python、Keras、PyTorch」 - 深度學習與數據入門挑戰22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言