この記事では、Transformer とその派生モデルについて包括的に説明し、セルフ アテンション メカニズム、エンコーダーとデコーダーの構造を深く分析し、理解を深めるためにそのエンコード実装をリストし、最後に BERT や GPT などの Transformer に基づくさまざまなモデルをリストします。この記事は、Transformer がどのように機能するかを詳しく説明し、人工知能の分野におけるその幅広い影響を実証することを目的としています。
著者の TechLead は、インターネット サービス アーキテクチャ、AI 製品開発、チーム管理で 10 年以上の経験があり、同済大学復丹修士、復丹ロボット知能研究所のメンバー、Alibaba Cloud 認定の上級アーキテクト、プロジェクト管理のプロフェッショナルであり、AI による収益は 10 億ドルに達します。製品開発責任者
1. トランスの背景
Transformer の登場は、自然言語処理の分野における画期的な出来事です。以下では、その背景を技術的課題、セルフアテンション機構の台頭、Transformer が分野全体に与える影響の 3 つの側面から包括的に説明します。
1.1 以前のソリューションの技術的な課題と限界
RNN と LSTM
RNN や LSTM などの初期のシーケンス モデルは、一部のシナリオではうまく機能しましたが、実際には多くの課題に直面しました。
- 計算効率: RNN の再帰的な構造により、シーケンス内の要素を 1 つずつ処理する必要があるため、計算を並列化できません。
- 長距離依存性の問題: RNN はシーケンス内の長距離依存性を捕捉するのが難しく、LSTM は改善されていますが、まだ完全ではありません。
シーケンス処理における畳み込みニューラルネットワーク (CNN) の試み
畳み込みニューラル ネットワーク (CNN) は、ローカルの依存関係をキャプチャでき、また、多層畳み込みを使用することで、ある方法で長距離の依存関係のキャプチャを改善できます。ただし、CNN の固定畳み込みウィンドウ サイズでは、キャプチャできる依存関係の範囲が制限されており、グローバルな依存関係の処理は十分に柔軟ではありません。
1.2 自己注意メカニズムの台頭
セルフ アテンション メカニズムは、上記の課題に対処します。
- 並列計算: セルフアテンション メカニズムにより、シーケンス内のすべての要素を同時に観察することで、モデルがシーケンス全体を並列処理できるようになります。
- 長距離依存関係のキャプチャ: セルフ アテンション メカニズムは、どんなに離れていても、シーケンス内の長距離依存関係を効果的にキャプチャできます。
このメカニズムの導入により、Transformer モデルは技術的なブレークスルーとなります。
1.3 Transformer の革命的影響
Transformer の出現は、この分野全体に大きな影響を与えました。
- 新しい基準の設定: Transformer は、複数の NLP タスクにわたって新しいパフォーマンス ベンチマークを設定します。
- 新しい研究と応用の促進: Transformer の構造は、BERT や GPT などの先進的なモデルの誕生など、多くの新しい研究の方向性と実用化を促進します。
- 分野を越えた影響: Transformer は、自然言語処理に加えて、バイオインフォマティクスや画像処理などの他の分野にも影響を与えています。
2. 自己注意のメカニズム
2.1 コンセプトと動作原理
セルフ アテンション メカニズムは、シーケンス内の要素間の関係を捉えることができる手法です。シーケンス内の各要素と他の要素との類似性を計算し、グローバルな依存関係を取得できるようにします。
- 重み計算: シーケンス内の各要素間の類似性を計算することにより、各要素に異なる重みを割り当てます。
- グローバル依存関係キャプチャ: 以前のモデルの制限を打ち破り、シーケンス内の任意の距離にある依存関係をキャプチャできます。
要素の重みの計算
- クエリ、キー、値の構造: シーケンス内の各要素は、クエリ、キー、および値の 3 つの部分として表現されます。
- 類似性測定: クエリとキーのドット積を使用して、要素間の類似性を計算します。
- 重み付け:ソフトマックス関数により類似度を重みに変換します。
たとえば、要素の重みの計算を考えてみましょう。
import torch
import torch.nn.functional as F
# Query, Key
query = torch.tensor([1, 0.5])
key = torch.tensor([[1, 0], [0, 1]])
# 相似度计算
similarity = query.matmul(key)
# 权重分配
weights = F.softmax(similarity, dim=-1)
# 输出:tensor([0.7311, 0.2689])
加重和
セルフ アテンション メカニズムは、計算された重みを使用して Value に重みを付けて合計し、各要素の新しい表現を取得します。
value = torch.tensor([[1, 2], [3, 4]])
output = weights.matmul(value)
# 输出:tensor([1.7311, 2.7311])
自己注意と従来の注意の違い
自己注意メカニズムと従来の注意の主な違いは次のとおりです。
- 自己参照: 自己注意メカニズムは、外部シーケンスではなく、シーケンス自体が自分自身に注意を向けることです。
- グローバル依存関係キャプチャ: ローカル ウィンドウによって制限されず、シーケンス内の任意の距離にある依存関係をキャプチャできます。
計算効率
セルフ アテンション メカニズムはシーケンス全体を並列処理でき、シーケンスの長さに制限されないため、大幅な計算効率を実現します。
- 並列化の利点: 自己注意の計算を同時に実行できるため、トレーニングと推論の速度が向上します。
変圧器への応用
Transformer では、セルフ アテンション メカニズムが重要なコンポーネントです。
- マルチヘッド アテンション: マルチヘッド アテンションを通じて、モデルはさまざまな依存関係を同時に学習できるため、モデルの表現力が向上します。
- 重みの視覚化: セルフアテンションの重みを使用してモデルがどのように機能するかを説明し、解釈可能性を高めることができます。
クロスドメインアプリケーション
自己注意メカニズムの影響は、自然言語処理をはるかに超えています。
- 画像処理: 画像のセグメンテーションや認識などのタスクへのアプリケーション。
- 音声認識: 音声信号の時間依存性を捕捉するのに役立ちます。
今後の動向と課題
自己注意の目覚ましい成功にもかかわらず、まだ研究の余地があります。
- 計算とストレージの要件: 複雑性が高いため、メモリと計算の課題が生じます。
- 解釈可能性と理論的理解: 注意のメカニズムについての深い理解は、さらに研究される必要があります。
2.2 計算プロセス
入力表現
自己注意メカニズムへの入力はシーケンスであり、通常は一連の単語ベクトルまたはその他の要素で構成されます。これらの要素は、それぞれクエリ、キー、値の 3 つの部分に変換されます。
import torch.nn as nn
embedding_dim = 64
query_layer = nn.Linear(embedding_dim, embedding_dim)
key_layer = nn.Linear(embedding_dim, embedding_dim)
value_layer = nn.Linear(embedding_dim, embedding_dim)
類似度の計算
Query と Key の内積計算により、各要素間の類似度行列が得られます。
import torch
embedding_dim = 64
# 假设一个序列包含三个元素
sequence = torch.rand(3, embedding_dim)
query = query_layer(sequence)
key = key_layer(sequence)
value = value_layer(sequence)
def similarity(query, key):
return torch.matmul(query, key.transpose(-2, -1)) / (embedding_dim ** 0.5)
重量配分
類似度行列を重みに正規化します。
def compute_weights(similarity_matrix):
return torch.nn.functional.softmax(similarity_matrix, dim=-1)
加重和
重み行列を使用して値に重みを付けて合計し、出力を取得します。
def weighted_sum(weights, value):
return torch.matmul(weights, value)
多頭の自己注意
実際のアプリケーションでは、通常、シーケンス内の多面的な情報をキャプチャするためにマルチヘッド アテンションが使用されます。
class MultiHeadAttention(nn.Module):
def __init__(self, embedding_dim, num_heads):
super(MultiHeadAttention, self).__init__()
self.num_heads = num_heads
self.head_dim = embedding_dim // num_heads
self.query_layer = nn.Linear(embedding_dim, embedding_dim)
self.key_layer = nn.Linear(embedding_dim, embedding_dim)
self.value_layer = nn.Linear(embedding_dim, embedding_dim)
self.fc_out = nn.Linear(embedding_dim, embedding_dim)
def forward(self, query, key, value):
N = query.shape[0]
query_len, key_len, value_len = query.shape[1], key.shape[1], value.shape[1]
# 拆分多个头
queries = self.query_layer(query).view(N, query_len, self.num_heads, self.head_dim)
keys = self.key_layer(key).view(N, key_len, self.num_heads, self.head_dim)
values = self.value_layer(value).view(N, value_len, self.num_heads, self.head_dim)
# 相似度计算
similarity_matrix = torch.einsum("nqhd,nkhd->nhqk", [queries, keys]) / (self.head_dim ** 0.5)
# 权重分配
weights = torch.nn.functional.softmax(similarity_matrix, dim=-1)
# 加权求和
attention = torch.einsum("nhql,nlhd->nqhd", [weights, values])
# 串联多个头的输出
attention = attention.permute(0, 2, 1, 3).contiguous().view(N, query_len, embedding_dim)
# 通过线性层整合输出
output = self.fc_out(attention)
return output
3. トランスの構造
3.1 エンコーダ(エンコーダ)
エンコーダは Transformer の中核コンポーネントの 1 つであり、その主なタスクは入力データを理解して処理することです。エンコーダは、セルフ アテンション メカニズム、フィードフォワード ニューラル ネットワーク、正規化層、残差接続を組み合わせて、強力なシーケンス間マッピング ツールを構築します。セルフ アテンション メカニズムにより、モデルはシーケンス内の複雑な関係を捉えることができ、フィードフォワード ネットワークは非線形コンピューティング機能を提供します。正規化層と残留接続は、トレーニング プロセスの安定化に役立ちます。
以下に、エンコーダの個々のコンポーネントとその詳細な説明を示します。
3.1.1 自注目層
エンコーダの最初の部分はセルフアテンション層です。前述したように、自己注意により、モデルは入力シーケンス内のすべての位置に注目し、この情報に基づいて各位置をエンコードできます。
class SelfAttentionLayer(nn.Module):
def __init__(self, embedding_dim, num_heads):
super(SelfAttentionLayer, self).__init__()
self.multi_head_attention = MultiHeadAttention(embedding_dim, num_heads)
def forward(self, x):
return self.multi_head_attention(x, x, x)
3.1.2 フィードフォワード ニューラル ネットワーク
セルフ アテンション層の後に、エンコーダーにはフィードフォワード ニューラル ネットワーク (FFNN) が含まれています。このネットワークは 2 つの線形層と 1 つの活性化関数で構成されます。
class FeedForwardLayer(nn.Module):
def __init__(self, embedding_dim, ff_dim):
super(FeedForwardLayer, self).__init__()
self.fc1 = nn.Linear(embedding_dim, ff_dim)
self.fc2 = nn.Linear(ff_dim, embedding_dim)
self.relu = nn.ReLU()
def forward(self, x):
return self.fc2(self.relu(self.fc1(x)))
3.1.3 正規化層
トレーニングを安定させ、収束を高速化するために、各自己注意層とフィードフォワード層の後に正規化層 (層正規化) が続きます。
layer_norm = nn.LayerNorm(embedding_dim)
3.1.4 残留接続
Transformer は、各レイヤーの出力が入力に追加されるように、残差接続も使用します。これは、グラデーションの消失や爆発を防ぐのに役立ちます。
output = layer_norm(self_attention(x) + x)
output = layer_norm(feed_forward(output) + output)
3.1.5 エンコーダの全体構成
最終的なエンコーダは、このような層を N 個積み重ねることによって形成されます。
class Encoder(nn.Module):
def __init__(self, num_layers, embedding_dim, num_heads, ff_dim):
super(Encoder, self).__init__()
self.layers = nn.ModuleList([
nn.Sequential(
SelfAttentionLayer(embedding_dim, num_heads),
nn.LayerNorm(embedding_dim),
FeedForwardLayer(embedding_dim, ff_dim),
nn.LayerNorm(embedding_dim)
)
for _ in range(num_layers)
])
def forward(self, x):
for layer in self.layers:
x = layer(x)
return x
3.2 デコーダ(デコーダ)
デコーダは、エンコーダの出力と以前に生成された部分出力シーケンスに基づいてターゲット シーケンスを生成する責任を負います。デコーダはエンコーダと同様の構造を採用しますが、ターゲット シーケンスを生成するためにマスクされたセルフ アテンション層とエンコーダ デコーダ アテンション層が追加されます。マスクにより、デコーダが前の位置のみを使用して各位置で出力を生成することが保証されます。エンコーダ-デコーダ アテンション層により、デコーダがエンコーダの出力を使用できるようになります。この構造により、デコーダはコンテキストおよびソース シーケンス情報に準拠したターゲット シーケンスを生成することができ、多くの複雑なシーケンス生成タスクに対する強力なソリューションを提供します。
以下に、デコーダの主なコンポーネントとその動作方法を示します。
3.2.1 自注目層
デコーダの最初の部分は、マスクされたセルフ アテンション レイヤーです。このレイヤーはエンコーダーのセルフ アテンション レイヤーに似ていますが、位置がその後の位置に注意を払わないようにするマスクを追加します。
def mask_future_positions(size):
mask = (torch.triu(torch.ones(size, size)) == 1).transpose(0, 1)
return mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0))
mask = mask_future_positions(sequence_length)
3.2.2 エンコーダ/デコーダ アテンション層
デコーダには、デコーダがエンコーダの出力に注意を向けることを可能にするエンコーダ-デコーダ アテンション レイヤーも含まれています。
class EncoderDecoderAttention(nn.Module):
def __init__(self, embedding_dim, num_heads):
super(EncoderDecoderAttention, self).__init__()
self.multi_head_attention = MultiHeadAttention(embedding_dim, num_heads)
def forward(self, queries, keys, values):
return self.multi_head_attention(queries, keys, values)
3.2.3 フィードフォワード ニューラル ネットワーク
デコーダにも、エンコーダのフィードフォワード ニューラル ネットワークと同じ構造のフィードフォワード ニューラル ネットワークがあります。
3.2.4 正規化層と残留接続
これらのコンポーネントもエンコーダー内と同じであり、各サブレイヤーの後に使用されます。
3.2.5 デコーダの完全な構造
デコーダは、セルフ アテンション層、エンコーダ/デコーダ アテンション層、フィードフォワード ニューラル ネットワーク、正規化層、および残差接続で構成され、通常はこのような層が N 層含まれています。
class Decoder(nn.Module):
def __init__(self, num_layers, embedding_dim, num_heads, ff_dim):
super(Decoder, self).__init__()
self.layers = nn.ModuleList([
nn.Sequential(
SelfAttentionLayer(embedding_dim, num_heads, mask=mask),
nn.LayerNorm(embedding_dim),
EncoderDecoderAttention(embedding_dim, num_heads),
nn.LayerNorm(embedding_dim),
FeedForwardLayer(embedding_dim, ff_dim),
nn.LayerNorm(embedding_dim)
)
for _ in range(num_layers)
])
def forward(self, x, encoder_output):
for layer in self.layers:
x = layer(x, encoder_output)
return x
4. Transformerをベースにした各種モデル
Transformer ベースのモデルは引き続き登場し、さまざまな NLP やその他のシーケンス処理タスクに強力なツールを提供します。テキストの生成からコンテキストの理解に至るまで、これらのモデルにはさまざまな利点と特徴があり、共に自然言語処理分野の急速な発展を促進します。これらのモデルに共通するのは、オリジナルのトランスフォーマーのコアコンセプトを採用し、それに基づいてさまざまな革新と改良を加えていることです。将来的には、Transformer ベースのモデルがさらに登場し続け、その適用範囲と影響力がさらに拡大すると予想されます。
4.1 BERT(トランスフォーマーからの双方向エンコーダー表現)
BERT は、コンテキスト依存の単語埋め込みを生成するための Transformer エンコーダ ベースのモデルです。従来の単語埋め込み手法とは異なり、BERT は文内の単語の特定の意味を理解できます。
主な特徴
- 双方向トレーニング、コンテキスト情報の取得
- さまざまな下流タスクのための広範な事前トレーニング
4.2 GPT(Generative Pretrained Transformer)
BERT とは異なり、GPT は Transformer デコーダを使用してテキストを生成することに重点を置いています。GPT は言語モデルとして事前トレーニングされており、さまざまな生成タスクに合わせて微調整されています。
主な特徴
- テキストを左から右に生成する
- さまざまな生成タスクにおける高い柔軟性
4.3 Transformer-XL(Transformer-XL: 固定長コンテキストを超えた丁寧な言語モデル)
Transformer-XL は、再利用可能なメモリ メカニズムを導入することで、元の Transformer モデルのコンテキスト長の制限に対処します。
主な特徴
- より長いコンテキスト依存
- メモリー機構により効率が向上
4.4 T5(テキスト間転送トランスフォーマー)
T5 モデルは、すべての NLP タスクをテキストからテキストへの翻訳問題として扱います。この統合されたフレームワークにより、異なるタスク間の切り替えが非常に簡単になります。
主な特徴
- さまざまな NLP タスクに適した汎用性
- タスク固有のアーキテクチャの必要性を簡素化します
4.5 XLネット
XLNet は、BERT の双方向機能と GPT の自己回帰の利点を組み合わせた、汎用の自己回帰事前トレーニング モデルです。
主な特徴
- 双方向と自己回帰の組み合わせ
- 効果的な事前トレーニング方法を提供します
4.6 BERT の抽出
DistilBERT は、BERT モデルのパフォーマンスのほとんどを維持しながら、モデル サイズが大幅に縮小された軽量バージョンです。
主な特徴
- パラメータと計算が少ない
- リソースが限られているシナリオに適しています
4.7 アルバート(ライトバート)
ALBERT は BERT のもう 1 つの最適化であり、パラメーターの数を減らしながらトレーニング速度とモデルのパフォーマンスを向上させます。
主な特徴
- パラメータの共有
- より速いトレーニング
V. まとめ
Transformer は、その導入以来、自然言語処理やその他の多くのシーケンス処理タスクの様相を大きく変えてきました。Transformer は、その独自のセルフアテンション メカニズムを通じて、以前のモデルの多くの制限を克服し、より高度な並列化とより柔軟な依存関係のキャプチャを可能にします。
このペーパーでは、Transformer の次の側面について詳しく説明します。
- 登場の背景: RNN と CNN の制限から Transformer がどのように誕生し、セルフ アテンション メカニズムを通じてシーケンスをどのように処理するかを理解します。
- セルフ アテンション メカニズム: セルフ アテンション メカニズムの計算プロセスと、モデルが異なる位置間の依存関係をどのように確立できるかを詳細に説明します。
- Transformer の構造: Transformer のエンコーダとデコーダの構造と、さまざまなコンポーネントがどのように連携するかを詳しく説明します。
- Transformer に基づくさまざまなモデル: BERT、GPT、T5 など、Transformer に基づく一連のモデルについて説明し、その特性と用途を理解します。
Transformer は、自然言語処理分野の研究と応用を促進するだけでなく、バイオインフォマティクス、画像分析などの他の分野でもその可能性を実証します。多くの最新の最先端モデルは Transformer に基づいており、その柔軟で効率的な構造を利用して、以前は解決できなかった問題を解決します。
今後も、Transformer とその派生モデルは、より幅広い分野で重要な役割を果たし、人工知能分野の発展を継続的に革新し、促進することが期待されます。