このチュートリアルの目的は、Pytorchを使用してトランスモデルを構築する方法を包括的に理解することです。トランスは、現代の機械学習で最も強力なモデルの1つです。彼らは、特に言語翻訳やテキストの要約などの自然言語処理(NLP)タスクにおいて、分野に革命をもたらしました。長期的な依存関係と並列計算を処理する能力により、これらのタスクの長期的なメモリ(LSTM)ネットワークは、これらのタスクの変圧器に置き換えられています。 このガイドに使用されているツールは、変圧器を構築するために使用されているツールは、そのシンプルさ、汎用性、効率で知られる人気のオープンソース機械学習ライブラリであるPytorchです。動的な計算グラフと広範なライブラリにより、Pytorchは機械学習と人工知能の領域の研究者と開発者にとって頼りになりました。
Pytorchに不慣れな人のために、Datacampのコースへの訪問であるPytorchでの深い学習の紹介は、しっかりとした接地に推奨されます。
紙で最初に導入された注意は、Vaswaniらによって必要なすべてです、トランスはそれ以来、それらのユニークな設計と効果のために多くのNLPタスクの基礎になりました。 トランスの中心にあるのは、注意メカニズム、特に「自己関節」の概念であり、モデルが入力データのさまざまな部分を比較検討し、優先順位を付けることができます。このメカニズムは、トランスがデータの長距離依存関係を管理できるようにするものです。これは、モデルが出力を生成するときに入力のさまざまな部分に焦点を合わせることを可能にする重み付けスキームです。このメカニズムにより、モデルは入力シーケンス内の異なる単語または機能を考慮し、それぞれが特定の出力を生成するための重要性を意味する「重み」を割り当てることができます。 たとえば、文の翻訳タスクでは、特定の単語を翻訳しながら、モデルは、ターゲットワードに文法的または意味的に関連する単語に、より高い注意の重みを割り当てる場合があります。このプロセスにより、変圧器は、シーケンス内の互いからの距離に関係なく、単語または機能の間の依存関係をキャプチャできます。 NLPの分野におけるトランスの影響を誇張することはできません。彼らは多くのタスクで従来のモデルよりも優れており、より微妙な方法で人間の言語を理解し生成するための優れた能力を示しています。
NLPをより深く理解するために、Pythonコースでの自然言語処理のDatacampの紹介が推奨されるリソースです。Pytorch
のセットアップ
condaの場合、コマンドを使用してください:
pip3 install torch torchvision torchaudio
Pytorch
でトランスモデルを構築しますトランスモデルを構築するには、次の手順が必要です。
基本的なビルディングブロックの定義 - マルチヘッドの注意、位置ごとのフィードフォワードネットワーク、位置エンコーディング
エンコーダーブロックの構築マルチヘッド注意メカニズムは、シーケンス内の各位置のペア間の注意を計算します。入力シーケンスのさまざまな側面をキャプチャする複数の「注意ヘッド」で構成されています。
マルチヘッドの注意について詳しく知るには、この注意メカニズムセクションの大規模な言語モデル(LLMS)概念コースをご覧ください。
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
図1。マルチヘッドの注意(出典:著者によって作成された画像)
クラスの定義と初期化:
クラスは、Pytorchのnn.moduleのサブクラスとして定義されています。
d_model:入力の次元。 num_heads:入力を分割するための注意の数。
import torch import torch.nn as nn import torch.optim as optim import torch.utils.data as data import math import copy
スケーリングされたDOT-Product Atterness: このメソッドは、入力xを形状(batch_size、num_heads、seq_length、d_k)に再形成します。これにより、モデルは複数の注意ヘッドを同時に処理し、並列計算を可能にします。
ヘッドの組み合わせ:
フォワードメソッド:
線形変換の適用:クエリ(q)、キー(k)、および値(v)は、初期化で定義された重みを使用して、最初に線形変換を通過します。
ヘッドの組み合わせ:各ヘッドの結果は、combine_headsメソッドを使用して単一のテンソルに戻します。
初期化:
クラスの定義: クラスは、Pytorchのnn.moduleのサブクラスとして定義されており、標準のPytorch層として使用できるようにします。
PE:ゼロで満たされたテンソル。位置エンコーディングが入力されます。
位置:シーケンス内の各位置の位置インデックスを含むテンソル。
ポジショニングクラスは、シーケンス内のトークンの位置に関する情報を追加します。変圧器モデルにはトークンの順序に関する固有の知識が欠けているため(その自己関節メカニズムのため)、このクラスはモデルがシーケンス内のトークンの位置を考慮するのに役立ちます。使用される正弦波関数は、モデルがシーケンス内の各位置に対してユニークでスムーズなエンコードを生成するため、相対的な位置に簡単に対応できるようにするために選択されます。
図2。トランスネットワークのエンコーダー部分(出典:元の論文からの画像)
クラスの定義:
self.self_attn:マルチヘッドの注意メカニズム。
入力:
マスク:入力の特定の部分を無視するオプションマスク。
add&normalize(注意後):注意出力が元の入力(残留接続)に追加され、その後、norm1を使用したドロップアウトと正規化が続きます。
フィードフォワードネットワーク:前のステップからの出力は、ポジションごとのフィードフォワードネットワークに渡されます。
追加&正規化(フィードフォワード後):ステップ2と同様に、フィードフォワード出力がこの段階の入力(残差接続)に追加され、その後、ノルム2を使用したドロップアウトと正規化が続きます。
encoderLayerクラスは、変圧器のエンコーダーの単一層を定義します。マルチヘッドの自己関節メカニズムをカプセル化し、その後に位置的にフィードフォワードニューラルネットワークが続き、残留接続、層の正規化、ドロップアウトが適用されます。これらのコンポーネントは、エンコーダが入力データ内の複雑な関係をキャプチャし、それらをダウンストリームタスクの有用な表現に変換することができます。通常、複数のそのようなエンコーダーレイヤーが積み重ねられて、トランスモデルの完全なエンコーダー部分を形成します。
クラスの定義:
初期化:
パラメーター:
:
メソッド:
x:デコーダーレイヤーへの入力
pip3 install torch torchvision torchaudio
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import math
import copy
class MultiHeadAttention(nn.Module):
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
pip3 install torch torchvision torchaudio
フォワードメソッド:conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import math
import copy
class MultiHeadAttention(nn.Module):
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
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
正弦関数は、均一なインデックスに適用され、コサイン関数はPEの奇妙なインデックスに適用されます。
pip3 install torch torchvision torchaudio
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import math
import copy
class MultiHeadAttention(nn.Module):
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
自己告発:入力xは、マルチヘッドの自己触たちメカニズムを介して渡されます。
pip3 install torch torchvision torchaudio
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import math
import copy
d_model:入力の次元。
コンポーネント
class MultiHeadAttention(nn.Module):
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
enc_output:対応するエンコーダーからの出力(クロスアテンションステップで使用)。
5。エンコーダーレイヤーとデコーダーレイヤーを組み合わせて完全なトランスネットワークを作成
初期化:
pip3 install torch torchvision torchaudio
src_vocab_size:ソース語彙サイズ。
tgt_vocab_size:ターゲットの語彙サイズ。conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
d_model:モデルの埋め込みの次元。 num_heads:マルチヘッドの注意メカニズムの注意ヘッドの数。
import torch import torch.nn as nn import torch.optim as optim import torch.utils.data as data import math import copy
d_ff:フィードフォワードネットワーク内の内側のレイヤーの次元。
MASKメソッドを生成:
この方法は、ソースとターゲットシーケンスのマスクを作成するために使用され、パディングトークンが無視され、ターゲットシーケンスのトレーニング中に将来のトークンが表示されないことを保証します。pip3 install torch torchvision torchaudio
フォワードメソッド:
このメソッドは、変圧器のフォワードパスを定義し、ソースとターゲットシーケンスを取得し、出力予測を作成します。
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
エンコーダーレイヤー:ソースシーケンスはエンコーダーレイヤーに渡され、最終エンコーダ出力は処理されたソースシーケンスを表します。
デコーダーレイヤー:ターゲットシーケンスとエンコーダーの出力はデコーダーレイヤーを通過し、デコーダーの出力が生じます。トランスクラスは、埋め込み、位置エンコーディング、エンコーダー層、デコーダーレイヤーなど、トランスモデルのさまざまなコンポーネントをまとめます。トレーニングと推論のための便利なインターフェイス、マルチヘッドの注意の複雑さ、フィードフォワードネットワーク、およびレイヤー正規化を提供します。 この実装は、標準の変圧器アーキテクチャに従って、機械翻訳、テキストの要約などのシーケンスからシーケンスへのタスクに適しています。マスキングを含めることで、モデルがシーケンス内の因果依存関係を順守し、トークンのパディングを無視し、将来のトークンからの情報漏れを防ぐことができます。 これらの連続したステップは、トランスモデルに入力シーケンスを効率的に処理し、対応する出力シーケンスを生成できるようにします。
Pytorch Transformerモデルのトレーニングサンプルデータの準備
説明のために、この例ではダミーデータセットが作成されます。ただし、実際のシナリオでは、より実質的なデータセットが採用され、プロセスには、ソース言語とターゲット言語の両方の語彙マッピングの作成とともにテキストの前処理が含まれます。 ハイパーパラメーター: これらの値は、変圧器モデルのアーキテクチャと動作を定義しています:
src_data:1とsrc_vocab_sizeの間のランダムな整数、形状(64、max_seq_length)のソースシーケンスのバッチを表します。
TGT_DATA:1からTGT_VOCAB_SIZEの間のランダムな整数。形状のターゲットシーケンスのバッチ(64、max_seq_length)を表します。
これらのランダムシーケンスは、トランスモデルへの入力として使用でき、64の例と長さ100のシーケンスを持つデータのバッチをシミュレートすることができます。
損失関数とオプティマイザー:
Criterion = nn.Crossentropyloss(Ingrore_index = 0):損失関数をクロスエントロピー損失として定義します。 Ingrore_index引数は0に設定されています。つまり、損失は0のインデックスを持つターゲットを考慮しません(通常、トークンのパディング用に予約されています)。
モデルトレーニングモード: トレーニングループ:
評価モード:
val_src_data:1とsrc_vocab_sizeの間のランダムな整数。形状(64、max_seq_length)を持つ検証ソースシーケンスのバッチを表します。
トランスとハグの顔の詳細については、私たちのチュートリアル、変圧器の使用と抱きしめの顔を紹介するのが便利です。
結論とさらなるリソース
pip3 install torch torchvision torchaudio
この行は、変圧器クラスのインスタンスを作成し、指定されたハイパーパラメーターで初期化します。インスタンスには、これらのハイパーパラメーターで定義されたアーキテクチャと動作があります。
ランダムなサンプルデータの生成conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import math
import copy
optimizer.zero_grad():前の繰り返しから勾配をクリアします。
transformer.eval():変圧器モデルを評価モードに配置します。トレーニング中にのみ使用されるドロップアウトのような特定の動作をオフにするため、これは重要です。
ランダム検証データを生成します:pip3 install torch torchvision torchaudio
Torch.no_grad()を使用して
このコードスニペットは、ランダムに生成された検証データセットのトランスモデルを評価し、検証損失を計算し、印刷します。実際のシナリオでは、ランダム検証データを、取り組んでいるタスクの実際の検証データに置き換える必要があります。検証損失は、モデルが目に見えないデータでどれだけうまく実行されているかを示すことができます。これは、モデルの一般化能力の重要な尺度です。
以上がPytorchで変圧器モデルを構築するための包括的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。