成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

終于把 Transformer 算法搞懂了!!!

人工智能
我們將首先導入 PyTorch 庫以實現核心功能、導入神經網絡模塊以創建神經網絡、導入優化模塊以訓練網絡。

大家好,我是小寒

上次,我們從理論的角度給大家詳細介紹了什么是 Transformer 算法,并對 Transformer 的核心組件進行了完整的解讀。

今天將帶領大家使用 PyTorch 來從頭構建一個 Transformer 模型

使用 PyTorch 構建 Transformer 模型

1.導入必要的庫和模塊

我們將首先導入 PyTorch 庫以實現核心功能、導入神經網絡模塊以創建神經網絡、導入優化模塊以訓練網絡。

import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import math
import copy

2. 定義基本構建塊

多頭注意力機制

多頭注意力機制計算序列中每對位置之間的注意力。

它由多個“注意力頭”組成,用于捕捉輸入序列的不同方面。

圖片圖片

class MultiHeadAttention(nn.Module):
    # d_model:輸入的維數
    # num_heads:注意力頭的數量
    def __init__(self, d_model, num_heads):
        super(MultiHeadAttention, self).__init__()
        # Ensure that the model dimension (d_model) is divisible by the number of heads
        assert d_model % num_heads == 0, "d_model must be divisible by num_heads"
        
        # Initialize dimensions
        self.d_model = d_model # Model's dimension
        self.num_heads = num_heads # Number of attention heads
        self.d_k = d_model // num_heads # Dimension of each head's key, query, and value
        
        # Linear layers for transforming inputs
        self.W_q = nn.Linear(d_model, d_model) # Query transformation
        self.W_k = nn.Linear(d_model, d_model) # Key transformation
        self.W_v = nn.Linear(d_model, d_model) # Value transformation
        self.W_o = nn.Linear(d_model, d_model) # Output transformation
    
    # 縮放點積注意力機制
    def scaled_dot_product_attention(self, Q, K, V, mask=None):
        # Calculate attention scores
        attn_scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k)
        
        # Apply mask if provided (useful for preventing attention to certain parts like padding)
        if mask is not None:
            attn_scores = attn_scores.masked_fill(mask == 0, -1e9)
        
        # Softmax is applied to obtain attention probabilities
        attn_probs = torch.softmax(attn_scores, dim=-1)
        
        # Multiply by values to obtain the final output
        output = torch.matmul(attn_probs, V)
        return output
        
    def split_heads(self, x):
        # Reshape the input to have num_heads for multi-head attention
        batch_size, seq_length, d_model = x.size()
        return x.view(batch_size, seq_length, self.num_heads, self.d_k).transpose(1, 2)
        
    def combine_heads(self, x):
        # Combine the multiple heads back to original shape
        batch_size, _, seq_length, d_k = x.size()
        return x.transpose(1, 2).contiguous().view(batch_size, seq_length, self.d_model)
        
    def forward(self, Q, K, V, mask=None):
        # Apply linear transformations and split heads
        Q = self.split_heads(self.W_q(Q))
        K = self.split_heads(self.W_k(K))
        V = self.split_heads(self.W_v(V))
        
        # Perform scaled dot-product attention
        attn_output = self.scaled_dot_product_attention(Q, K, V, mask)
        
        # Combine heads and apply output transformation
        output = self.W_o(self.combine_heads(attn_output))
        return output

MultiHeadAttention 類封裝了 Transformer 模型中常用的多頭注意力機制,負責將輸入拆分成多個注意力頭,對每個注意力頭施加注意力,然后將結果組合起來,這樣模型就可以在不同尺度上捕捉輸入數據中的各種關系,提高模型的表達能力。

前饋網絡

class PositionWiseFeedForward(nn.Module):
    def __init__(self, d_model, d_ff):
        super(PositionWiseFeedForward, self).__init__()
        self.fc1 = nn.Linear(d_model, d_ff)
        self.fc2 = nn.Linear(d_ff, d_model)
        self.relu = nn.ReLU()
    def forward(self, x):
        return self.fc2(self.relu(self.fc1(x)))

PositionWiseFeedForward 類定義了一個前饋神經網絡,它由兩個線性層組成,中間有一個 ReLU 激活函數。

位置編碼

位置編碼用于注入輸入序列中每個 token 的位置信息。它使用不同頻率的正弦和余弦函數來生成位置編碼。

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_seq_length):
        super(PositionalEncoding, self).__init__()
        
        pe = torch.zeros(max_seq_length, d_model)
        position = torch.arange(0, max_seq_length, dtype=torch.float).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model))
        
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        
        self.register_buffer('pe', pe.unsqueeze(0))
        
    def forward(self, x):
        return x + self.pe[:, :x.size(1)]

3.構建編碼器模塊

圖片圖片

EncoderLayer 類定義 Transformer 編碼器的單層。

它封裝了一個多頭自注意力機制,隨后是前饋神經網絡,并根據需要應用殘差連接、層規范化。

這些組件一起允許編碼器捕獲輸入數據中的復雜關系,并將其轉換為下游任務的有用表示。

通常,多個這樣的編碼器層堆疊在一起以形成 Transformer 模型的完整編碼器部分。

class EncoderLayer(nn.Module):
    def __init__(self, d_model, num_heads, d_ff, dropout):
        super(EncoderLayer, self).__init__()
        self.self_attn = MultiHeadAttention(d_model, num_heads)
        self.feed_forward = PositionWiseFeedForward(d_model, d_ff)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.dropout = nn.Dropout(dropout)
        
    def forward(self, x, mask):
        attn_output = self.self_attn(x, x, x, mask)
        x = self.norm1(x + self.dropout(attn_output))
        ff_output = self.feed_forward(x)
        x = self.norm2(x + self.dropout(ff_output))
        return x

4.構建解碼器模塊

圖片圖片

DecoderLayer 類定義 Transformer 解碼器的單層。

它由多頭自注意力機制、多頭交叉注意力機制(關注編碼器的輸出)、前饋神經網絡以及相應的殘差連接、層規范化組成。

這種組合使解碼器能夠根據編碼器的表示生成有意義的輸出,同時考慮目標序列和源序列。

與編碼器一樣,多個解碼器層通常堆疊在一起以形成 Transformer 模型的完整解碼器部分。

class DecoderLayer(nn.Module):
    def __init__(self, d_model, num_heads, d_ff, dropout):
        super(DecoderLayer, self).__init__()
        self.self_attn = MultiHeadAttention(d_model, num_heads)
        self.cross_attn = MultiHeadAttention(d_model, num_heads)
        self.feed_forward = PositionWiseFeedForward(d_model, d_ff)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.norm3 = nn.LayerNorm(d_model)
        self.dropout = nn.Dropout(dropout)
        
    def forward(self, x, enc_output, src_mask, tgt_mask):
        attn_output = self.self_attn(x, x, x, tgt_mask)
        x = self.norm1(x + self.dropout(attn_output))
        attn_output = self.cross_attn(x, enc_output, enc_output, src_mask)
        x = self.norm2(x + self.dropout(attn_output))
        ff_output = self.feed_forward(x)
        x = self.norm3(x + self.dropout(ff_output))
        return x

5.結合編碼器和解碼器層來創建完整的 Transformer 網絡

圖片圖片

class Transformer(nn.Module):
    def __init__(self, src_vocab_size, tgt_vocab_size, d_model, num_heads, num_layers, d_ff, max_seq_length, dropout):
        super(Transformer, self).__init__()
        self.encoder_embedding = nn.Embedding(src_vocab_size, d_model)
        self.decoder_embedding = nn.Embedding(tgt_vocab_size, d_model)
        self.positional_encoding = PositionalEncoding(d_model, max_seq_length)
        self.encoder_layers = nn.ModuleList([EncoderLayer(d_model, num_heads, d_ff, dropout) for _ in range(num_layers)])
        self.decoder_layers = nn.ModuleList([DecoderLayer(d_model, num_heads, d_ff, dropout) for _ in range(num_layers)])
        self.fc = nn.Linear(d_model, tgt_vocab_size)
        self.dropout = nn.Dropout(dropout)
    def generate_mask(self, src, tgt):
        src_mask = (src != 0).unsqueeze(1).unsqueeze(2)
        tgt_mask = (tgt != 0).unsqueeze(1).unsqueeze(3)
        seq_length = tgt.size(1)
        nopeak_mask = (1 - torch.triu(torch.ones(1, seq_length, seq_length), diagnotallow=1)).bool()
        tgt_mask = tgt_mask & nopeak_mask
        return src_mask, tgt_mask
    def forward(self, src, tgt):
        src_mask, tgt_mask = self.generate_mask(src, tgt)
        src_embedded = self.dropout(self.positional_encoding(self.encoder_embedding(src)))
        tgt_embedded = self.dropout(self.positional_encoding(self.decoder_embedding(tgt)))
        enc_output = src_embedded
        for enc_layer in self.encoder_layers:
            enc_output = enc_layer(enc_output, src_mask)
        dec_output = tgt_embedded
        for dec_layer in self.decoder_layers:
            dec_output = dec_layer(dec_output, enc_output, src_mask, tgt_mask)
        output = self.fc(dec_output)
        return output

Transformer 類將 Transformer 模型的各個組件整合在一起,包括嵌入、位置編碼、編碼器層和解碼器層。

它提供了一個方便的訓練和推理接口,封裝了多頭注意力、前饋網絡和層規范化的復雜性。

訓練 PyTorch Transformer 模型

1.樣本數據準備

為了便于說明,本例中將制作一個虛擬數據集。

但在實際情況下,將使用更大規模的數據集,并且該過程將涉及文本預處理以及為源語言和目標語言創建詞匯表映射。

src_vocab_size = 5000
tgt_vocab_size = 5000
d_model = 512
num_heads = 8
num_layers = 6
d_ff = 2048
max_seq_length = 100
dropout = 0.1

transformer = Transformer(src_vocab_size, tgt_vocab_size, d_model, num_heads, num_layers, d_ff, max_seq_length, dropout)
# Generate random sample data
src_data = torch.randint(1, src_vocab_size, (64, max_seq_length))  # (batch_size, seq_length)
tgt_data = torch.randint(1, tgt_vocab_size, (64, max_seq_length))  # (batch_size, seq_length)

2.訓練模型

接下來,將利用上述樣本數據訓練模型。

transformer = Transformer(src_vocab_size, tgt_vocab_size, d_model, num_heads, num_layers, d_ff, max_seq_length, dropout)
criterion = nn.CrossEntropyLoss(ignore_index=0)
optimizer = optim.Adam(transformer.parameters(), lr=0.0001, betas=(0.9, 0.98), eps=1e-9)

transformer.train()
for epoch in range(10):
    optimizer.zero_grad()
    output = transformer(src_data, tgt_data[:, :-1])
    loss = criterion(output.contiguous().view(-1, tgt_vocab_size), tgt_data[:, 1:].contiguous().view(-1))
    loss.backward()
    optimizer.step()
    print(f"Epoch: {epoch+1}, Loss: {loss.item()}")

圖片圖片

圖片圖片

責任編輯:武曉燕 來源: 程序員學長
相關推薦

2024-12-03 08:16:57

2024-09-23 09:12:20

2024-09-12 08:28:32

2024-10-17 13:05:35

神經網絡算法機器學習深度學習

2024-10-31 10:00:39

注意力機制核心組件

2024-10-05 23:00:35

2024-11-14 00:16:46

Seq2Seq算法RNN

2024-10-28 00:38:10

2024-11-15 13:20:02

2025-02-21 08:29:07

2024-12-12 00:29:03

2024-09-20 07:36:12

2024-07-17 09:32:19

2024-08-01 08:41:08

2025-02-17 13:09:59

深度學習模型壓縮量化

2024-08-23 09:06:35

機器學習混淆矩陣預測

2024-09-18 16:42:58

機器學習評估指標模型

2024-10-14 14:02:17

機器學習評估指標人工智能

2024-11-05 12:56:06

機器學習函數MSE

2024-10-08 15:09:17

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美激情国产综合久久久 | 日韩精品一区在线观看 | 亚洲欧美一区二区三区国产精品 | 91精品国产综合久久久久久丝袜 | 91av在线免费看 | 国产成人短视频在线观看 | 久久国产精品99久久久久 | 亚洲精品字幕 | 日韩在线一区二区三区 | 中文在线一区二区 | 国产探花在线观看视频 | 国产美女福利在线观看 | 欧美激情视频一区二区三区在线播放 | 日本黄色不卡视频 | 久久综合影院 | 亚洲日韩视频 | 亚洲欧洲精品一区 | 在线播放日韩 | 精品一区二区三区在线视频 | 亚洲精品视频在线播放 | 色婷婷av久久久久久久 | 黄色国产| 欧美亚洲一区二区三区 | 精品国产不卡一区二区三区 | 精品国偷自产在线 | 亚洲一区二区三区四区五区中文 | 成人精品一区二区 | 亚州春色 | 中文字幕二区 | 国产伦精品一区二区三区精品视频 | 干出白浆视频 | 亚洲天天干| 日本不卡一区 | 在线播放国产一区二区三区 | 亚洲一区二区三区在线免费观看 | 亚洲高清成人 | av在线三级 | 一区二区三区四区在线视频 | 免费看一级毛片 | 色www精品视频在线观看 | 手机在线观看av |