AI & GPU
ベイズ最適化ハイパーパラメータチューニング: 包括的なガイド

ベイズ最適化ハイパーパラメータチューニング: 包括的なガイド

Misskey AI

ハイパーパラメータチューニングの基礎を理解する

ディープラーニングにおけるハイパーパラメータチューニングの重要性

ディープラーニングモデルは強力ですが、その性能はハイパーパラメータの選択に大きく依存します。ハイパーパラメータとは、データから学習されるのではなく、トレーニングプロセスの開始前に設定される機械学習アルゴリズムの設定です。ディープラーニングでよくある一般的なハイパーパラメータには、学習率、バッチサイズ、レイヤー数、正則化の強さなどがあります。

これらのハイパーパラメータを調整することは、モデルのパフォーマンスに大きな影響を与えます。適切にチューニングされていないモデルは収束に失敗したり、テストセットで良好な結果を得られない可能性がありますが、適切にチューニングされたモデルは最先端の結果を達成できます。したがって、ハイパーパラメータチューニングはディープラーニングワークフローの重要な一部であり、成功するモデルと失敗するモデルの違いを生み出す可能性があります。

ディープラーニングモデルの一般的なハイパーパラメータ

ディープラーニングモデルの一般的なハイパーパラメータには以下のようなものがあります:

  • 学習率: モデルパラメータの更新ステップサイズを制御します。
  • バッチサイズ: 重みが更新される前に、モデルに入力される学習サンプルの数を決定します。
  • レイヤー数: ニューラルネットワークの深さを指定します。
  • 正則化の強さ: オーバーフィッティングを防ぐためにモデルの重みに適用される正則化の量を決定します。
  • 最適化アルゴリズム: モデルの重みを更新するために使用される最適化アルゴリズム(SGD、Adam、RMSPropなど)を指定します。
  • 活性化関数: モデルの非線形性を決定する活性化関数を指定します。-モデルの出力に適用される線形変換。
  • ドロップアウト率: 過学習を防ぐために、トレーニング中にランダムに単位を削除する割合を制御します。

これらのハイパーパラメータの最適な値は、使用する特定の問題、データセット、およびモデルアーキテクチャによって異なる可能性があります。

手動によるハイパーパラメータチューニングの課題

ハイパーパラメータを手動でチューニングするのは、時間がかかり面倒な作業です。これは通常、試行錯誤のアプローチを伴い、実践者が異なるハイパーパラメータ値の組み合わせを系統的に試し、モデルのパフォーマンスを評価するプロセスです。特に深層学習モデルの場合、チューニングする必要のあるハイパーパラメータが多数あるため、この作業は特に困難です。

さらに、ハイパーパラメータ空間は非常に複雑で、異なるハイパーパラメータ間に相互作用や依存関係があります。これにより、直感や経験だけでは最適な値を決定するのが難しくなります。ハイパーパラメータの数が増えるにつれ、検索空間のサイズが指数関数的に増大するため、すべての組み合わせを網羅的に検索するのは現実的ではありません。

ベイズ最適化などの自動ハイパーパラメータチューニング手法は、ハイパーパラメータ空間を効率的に探索し、最も有望な構成を特定することで、これらの課題に対処することができます。

ベイズ最適化の概要

ベイズ最適化とは?

ベイズ最適化は、深層学習モデルの検証セットやテストセットのパフォーマンスのような、評価が高コストな黒箱関数を最適化するための強力な手法です。特に、ハイパーパラメータ空間が複雑で高次元である場合のハイパーパラメータチューニングに適しています。

ベイズ最適化は、目的関数(モデルのパフォーマンス)の確率モデル(代替モデル)を構築し、この代替モデルを使ってオプティマルなハイパーパラメータを探索します。代替モデルは、以下は、提供されたマークダウンファイルの日本語翻訳です。コードについては、コメントのみ翻訳しています。ファイルの先頭に追加のコメントは付けていません。

ベイズ最適化の基本原理

ベイズ最適化の主な原理は以下の通りです:

  1. 代理モデル: ベイズ最適化は、目的関数の基となる確率モデル(代理モデル)を構築し、観測されていないハイパーパラメータ設定の性能を予測します。

  2. 獲得関数: ベイズ最適化は、獲得関数を使用して、次に評価するハイパーパラメータ設定を決定します。獲得関数は、探索(不確実性の高い領域のハイパーパラメータ設定を評価する)と活用(高性能が予測されるハイパーパラメータ設定を評価する)のバランスを取ります。

  3. 逐次最適化: ベイズ最適化は反復プロセスであり、目的関数の各評価後に代理モデルが更新され、獲得関数を使用して次に評価するハイパーパラメータ設定が選択されます。

これらの原理を組み合わせることで、ベイズ最適化は効率的にハイパーパラメータ空間を探索し、グリッド探索やランダム探索などの他のチューニング手法と比べて、はるかに少ない目的関数の評価で最適または準最適なハイパーパラメータ設定を見つけることができます。

グリッド探索とランダム探索に対するベイズ最適化の利点

ベイズ最適化には、従来のハイパーパラメータチューニング手法であるグリッド探索やランダム探索に比べて以下のような利点があります:

  1. サンプル効率: ベイズ最適化は、過去の評価情報に基づいて賢明にハイパーパラメータ空間を探索するため、目的関数の評価を大幅に少なくで最適なパラメータを見つけることができます。2. ノイズの多い目的関数の処理: ベイズ最適化は、確率的深層学習モデルで見られるようなノイズの多い目的関数を処理することができます。これは、目的関数の評価における不確実性をモデル化することで実現されます。

  2. 問題への適応性: ベイズ最適化は目的関数の構造に適応することができますが、グリッド探索やランダム探索は目的関数を黒箱として扱います。

  3. 事前知識の組み込み: ベイズ最適化は、滑らかさや単調性といった目的関数に関する事前知識をサロゲートモデルに組み込むことができ、最適化プロセスをさらに改善することができます。

  4. 並列化: ベイズ最適化は、獲得関数を異なるハイパーパラメータ構成で独立に評価できるため、容易に並列化することができます。

これらの利点により、ベイズ最適化は深層学習のハイパーパラメータチューニングに強力で効率的なツールとなります。特に、目的関数の評価が高コストであったり、ハイパーパラメータ空間が高次元の場合に有効です。

ベイズ最適化フレームワークの構築

目的関数の定義

ベイズ最適化の最初のステップは、最適化したい性能指標である目的関数を定義することです。これは通常、モデルの検証セットまたはテストセットのパフォーマンス、例えば精度、F1スコア、または平均二乗誤差などです。

例えば、畳み込みニューラルネットワークの画像分類のハイパーパラメータをチューニングする場合、目的関数はモデルの検証精度になります:

def objective_function(hyperparams):
    """
    ベイズ最適化のための目的関数。
    
    Args:
        hyperparams (dict): ハイパーパラメータ値の辞書。
    
    Returns:
        float: モデルの検証精度。
    """
    # ハイパーパラメータを展開する
    learning_rate = hyperparams['learning_rate']
    batch_si.ここは日本語訳です。コードの部分はコメントのみ翻訳しています。ファイルの先頭に追加のコメントは付けていません。
 
ze = hyperparams['batch_size']
    num_layers = hyperparams['num_layers']
    
    # モデルを構築し、与えられたハイパーパラメータでトレーニングする
    model = build_cnn_model(learning_rate, batch_size, num_layers)
    train_model(model)
    
    # バリデーションセットでモデルを評価し、精度を返す
    return evaluate_model(model, validation_data)

代替モデルの選択

ベイズ最適化の次のステップは、目的関数を近似する代替モデルを選択することです。最も一般的な選択はガウシアンプロセス(GP)で、目的関数をモデル化する柔軟で強力な方法を提供します。

ガウシアンプロセスにはベイズ最適化に対する以下のような利点があります:

  • ハイパーパラメータと目的関数の複雑な非線形関係をキャプチャできる
  • 予測の不確実性を提供し、獲得関数に役立つ
  • 滑らかさや周期性など、目的関数に関する事前知識を組み込むことができる

GPyOptライブラリを使ってガウシアンプロセスの代替モデルを設定する例は以下の通りです:

import GPyOpt
 
# ハイパーパラメータの探索空間を定義する
space = [
    {'name': 'learning_rate', 'type': 'continuous', 'domain': (1e-5, 1e-1)},
    {'name': 'batch_size', 'type': 'integer', 'domain': (32, 256)},
    {'name': 'num_layers', 'type': 'integer', 'domain': (2, 10)}
]
 
# ガウシアンプロセスの代替モデルを作成する
model = GPyOpt.models.GPModel(kernel=None, noise_var=None)

この例では、ハイパーパラメータの探索空間を定義し、連続値と離散値の両方を含めています。その後、GPyOptライブラリを使ってガウシアンプロセスの代替モデルを作成しています。

獲得関数の選択

獲得関数は、代替モデルの予測に基づいて、次に評価するハイパーパラメータ構成を決定するために使用されます。獲得関数は探索と活用のバランスを取ります。以下は、提供されたマークダウンファイルの日本語翻訳です。コードについては、コメントのみ翻訳しています。ファイルの先頭に追加のコメントは付けていません。

(高い不確実性のある領域でのハイパーパラメータ構成の評価)と活用(高いパフォーマンスが予測されるハイパーパラメータ構成の評価)。

ベイズ最適化で一般的に使用される獲得関数には以下のようなものがあります:

  • 期待改善 (EI): 目的関数を最も改善すると期待されるハイパーパラメータ構成を選択します。
  • 上限信頼区間 (UCB): サロゲートモデルの予測の上限信頼区間を最大化するハイパーパラメータ構成を選択します。
  • 改善確率 (PI): 現在の最良の目的関数値を改善する確率が最も高いハイパーパラメータ構成を選択します。

GPyOptライブラリを使用して期待改善獲得関数を設定する例は以下のとおりです:

import GPyOpt
 
# 獲得関数を作成する
acquisition_function = GPyOpt.acquisitions.ExpectedImprovement(model)

獲得関数の選択は、ベイズ最適化の性能に大きな影響を及ぼすため、問題に最適な獲得関数を見つけるために、さまざまな獲得関数を試すことが有益です。

ハイパーパラメータチューニングのためのベイズ最適化の実装

最適化プロセスの設定

目的関数、サロゲートモデル、および獲得関数が定義されたら、ベイズ最適化プロセスを設定することができます。これには通常、ベイズ最適化オブジェクトの作成と、反復回数、初期設計、最適化手法などの最適化パラメータの設定が含まれます。

GPyOptライブラリを使用してベイズ最適化プロセスを設定する例は以下のとおりです:

import GPyOpt
 
# ベイズ最適化オブジェクトを作成する
bayesian_opt = GPyOpt.methods.BayesianOptimization(
    f=objective_function,
    domain=space,
    model_type='GP',
    acquisition_type='EI',
    maximize=True,
    num_cores=4
)
 
# 最適化を実行する
```最適化
bayesian_opt.run_optimization(max_iter=50)

この例では、BayesianOptimizationオブジェクトを作成し、目的関数、探索空間、サロゲートモデルの種類、獲得関数を設定しています。また、目的関数を最大化し、4つのコアを並列評価に使用することも指定しています。

ハイパーパラメータ空間の探索

ベイズ最適化プロセス中、アルゴリズムは反復的にハイパーパラメータ空間を探索し、獲得関数に基づいて次のハイパーパラメータ構成を選択して評価します。サロゲートモデルは各評価後に更新され、獲得関数は最適なハイパーパラメータを見つけるための探索を導きます。

ベイズ最適化プロセスの進捗を可視化するために、最適化トラジェクトリをプロットすることができます。これは、反復数に対する現在までの最良の目的関数値を示します。これにより、アルゴリズムがハイパーパラメータ空間をどのように探索しているか、および収束が遅い、または最適でない解に早期に収束するような潜在的な問題を特定することができます。

GPyOptライブラリを使用して最適化トラジェクトリをプロットする例は以下のとおりです:

import matplotlib.pyplot as plt
 
# 最適化トラジェクトリをプロット
plt.figure(figsize=(12, 6))
plt.plot(bayesian_opt.Y)
plt.xlabel('反復回数')
plt.ylabel('目的関数値')
plt.title('ベイズ最適化トラジェクトリ')
plt.show()

このプロットは、ベイズ最適化プロセスの各反復における現在までの最良の目的関数値を示します。

サロゲートモデルの評価と更新

各目的関数の評価後、ベイズ最適化アルゴリズムはサロゲートモデルを更新して、基礎となる目的関数をより良く近似します。これは重要なステップです。サロゲートモデルの品質が、全体的な最適化プロセスのパフォーマンスに直接影響するためです。以下は、提供されたマークダウンファイルの日本語翻訳です。コードの部分は翻訳せず、コメントのみ翻訳しています。ファイルの先頭に追加のコメントは付けていません。

畳み込みニューラルネットワーク (CNN)

畳み込みニューラルネットワーク (CNN) は、特に画像やビデオなどの視覚データの処理と分析に適した特殊なタイプのニューラルネットワークです。 CNNは、視覚野の構造に着想を得ており、ニューロンが視覚野の重複する領域に反応するように配置されています。

CNNの主要な構成要素は以下の通りです:

  1. 畳み込み層: これらの層は、入力画像に対して一連の学習可能なフィルター (カーネルとも呼ばれる) を適用し、入力ピクセル間の空間的関係を捉えた特徴マップを生成します。フィルターは、エッジや形状などの低レベルの特徴から、特定のパターンや物体などの高レベルの特徴を検出するように学習されます。

  2. プーリング層: これらの層は、特徴マップの空間的な次元を縮小しつつ、最も重要な情報を保持します。これにより、モデルのパラメーター数を減らし、入力の小さな変換や歪みに対してより頑健になります。

  3. 全結合層: これらの層は、従来のニューラルネットワークの層と似ており、各ニューロンが前の層のすべてのニューロンに接続されています。これらの層は、畳み込み層とプーリング層によって抽出された高レベルな特徴を分類するために使用されます。

以下は、画像分類のための簡単なCNN アーキテクチャの例です:

import torch.nn as nn
 
class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()
        # 畳み込み層1
        self.conv1 = nn.Conv2d(3, 6, 5)
        # プーリング層
        self.pool = nn.MaxPool2d(2, 2)
        # 畳み込み層2
        self.conv2 = nn.Conv2d(6, 16, 5)
        # 全結合層1
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        # 全結合層2
        self.fc2 = nn.Linear(120, 84)
        # 全結合層3
        self.fc3 = nn.Linear(84, 10)
 
    def forward(self, x):
        x = self.pool(nn.functional.relu(se.
```以下は、提供されたマークダウンファイルの日本語překlad です。コードについては、コメントのみ翻訳しています。ファイルの先頭に追加のコメントは付けていません。
 
```python
        x = self.lf.conv1(x)))
        x = self.pool(nn.functional.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        return x

この例では、CNNモデルは2つの畳み込み層、2つのプーリング層、3つの全結合層で構成されています。畳み込み層は入力画像から特徴を抽出し、プーリング層は特徴マップの空間次元を削減し、全結合層は高次の特徴を分類します。

再帰型ニューラルネットワーク (RNN)

再帰型ニューラルネットワーク (RNN) は、テキスト、音声、時系列データなどの順序性のあるデータを処理するのに適したニューラルネットワークの一種です。順方向ニューラルネットワークとは異なり、RNNは過去の情報を保持する隠れ状態を維持しており、シーケンス内の要素間の依存関係を捉えることができます。

RNNの主な構成要素は以下の通りです:

  1. 入力シーケンス: 文章や時系列データなどの入力シーケンスが、1つずつRNNに入力されます。

  2. 隠れ状態: 隠れ状態はベクトルで、過去の時刻の情報を表します。各時刻において、RNNは現在の入力と前の隠れ状態に基づいて隠れ状態を更新します。

  3. 出力シーケンス: RNNは現在の入力と現在の隠れ状態に基づいて、1つずつ出力シーケンスを生成します。

以下は、テキスト生成のための簡単なRNNの例です:

import torch.nn as nn
 
class RNNModel(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, num_layers):
        super(RNNModel, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.rnn = nn.RNN(embedding_dim, hidden_dim, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_dim, vocab_size)
 
    def forward(self, x, h0):
        # 入力xをembeddingに通す
        embedded = self.embedding(x)
        # RNNに入力し、隠れ状態を更新する
        output, hn = self.rnn(embedded, h0)
        # 最終的な隠れ状態から出力を生成する
        output = self.fc(output[:, -1, :])
        return output, hn
```= self.embedding(x)
        output, hn = self.rnn(embedded, h0)
        output = self.fc(output[:, -1, :])
        return output, hn

このサンプルでは、RNNモデルは埋め込み層、RNN層、全結合層で構成されています。埋め込み層は入力テキストをデンスベクトルの系列に変換し、RNN層はその系列を処理してhidden stateを更新し、全結合層が出力テキストを生成します。

Long Short-Term Memory (LSTMs) and Gated Recurrent Units (GRUs)

基本的なRNNは特定のタスクでは効果的ですが、勾配消失問題に悩まされることがあります。これは訓練時の勾配が非常に小さくなり、長期依存関係を学習するのが難しくなる問題です。この問題に対処するため、2つのRNNの変種が開発されました: Long Short-Term Memory (LSTMs) と Gated Recurrent Units (GRUs)。

LSTMsとGRUsは、前の時間ステップからの情報を選択的に記憶・忘却するゲートメカニズムを導入しており、入力系列の長期依存関係をより良く捉えることができます。

テキスト分類のためのLSTMモデルの例は以下の通りです:

import torch.nn as nn
 
class LSTMModel(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, num_layers):
        super(LSTMModel, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_dim, 2)
 
    def forward(self, x):
        embedded = self.embedding(x)
        output, (hn, cn) = self.lstm(embedded)
        output = self.fc(hn[-1, :, :])
        return output

このLSTMモデルは、埋め込み層、LSTM層、全結合層で構成されています。LSTM層は入力系列を処理し、hidden stateとcell stateを更新し、全結合層が最終的なhidden stateを分類します。

Attention Mechanisms

Attention.注意メカニズムは、自然言語処理(NLP)の分野を中心に、さまざまな深層学習モデルで広く採用されている強力な手法です。注意は、入力シーケンス全体を同等に扱うのではなく、出力を生成する際に最も関連性の高い部分に焦点を当てることができます。

注意の基本的なアイデアは、入力シーケンスの加重和を計算することです。重みは、各入力要素と現在の出力の関連性によって決まります。これにより、モデルは RNN や LSTM の最終隠れ状態に完全に依存するのではなく、入力の最も重要な部分に動的に焦点を当てることができます。

機械翻訳のための注意ベースのモデルの例を以下に示します:

import torch.nn as nn
 
class AttentionModel(nn.Module):
    def __init__(self, src_vocab_size, tgt_vocab_size, embedding_dim, hidden_dim):
        super(AttentionModel, self).__init__()
        self.src_embedding = nn.Embedding(src_vocab_size, embedding_dim)
        self.tgt_embedding = nn.Embedding(tgt_vocab_size, embedding_dim)
        self.encoder = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
        self.decoder = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
        self.attn = nn.Linear(hidden_dim * 2, 1)
        self.fc = nn.Linear(hidden_dim, tgt_vocab_size)
 
    def forward(self, src, tgt):
        # 入力ソース系列をエンコーダーに通す
        src_embedded = self.src_embedding(src)
        # 入力ターゲット系列をデコーダーに通す
        tgt_embedded = self.tgt_embedding(tgt)
 
        # エンコーダーの出力とhidden state, cell stateを取得する
        encoder_output, (encoder_hn, encoder_cn) = self.encoder(src_embedded)
        # デコーダーの出力とhidden state, cell stateを取得する
        decoder_output, (decoder_hn, decoder_cn) = self.decoder(tgt_embedded, (encoder_hn, encoder_cn))
 
        # 注意重みを計算する
        attn_weights = nn.functional.softmax(self.attn(torch.cat((decoder_output, encoder_output), dim=2)), dim=1)
        # コンテキストベクトルを計算する
        context = torch.bmm(attn_weights, encoder_output)
        # 最終的な出力を生成する
        output = self.fc(context)
 
        return output

このモデルは、エンコーダー、デコーダー、注意メカニズムで構成されています。エンコーダーは...以下は、提供されたマークダウンファイルの日本語翻訳です。コードの部分は翻訳せず、コメントのみ翻訳しています。ファイルの先頭に追加のコメントは付けていません。

Transformerモデル

Transformerモデルは、Vaswani et al.による「Attention is All You Need」の論文で紹介されたもので、深層学習、特にNLPタスクの分野を革新しました。Transformerは、再帰型層や畳み込み層を使用せずに、注意機構のみに基づいています。これにより、高度に並列化され効率的になり、従来のRNNやCNNベースのモデルよりも長いデータシーケンスを効果的に処理できるようになりました。

Transformerモデルの主要な構成要素は以下の通りです:

  1. エンコーダ: エンコーダは、入力シーケンスを処理し、入力の表現を生成する責任があります。複数のエンコーダ層で構成され、各層はマルチヘッド注意機構とフィードフォワードニューラルネットワークを入力に適用します。

  2. デコーダ: デコーダは、出力シーケンスを1つの要素ずつ生成する責任があります。複数のデコーダ層で構成され、各層は入力表現と前に生成された出力に対してマルチヘッド注意機構を適用します。

  3. マルチヘッド注意機構: マルチヘッド注意機構は、各出力要素を生成する際に、入力シーケンスの異なる部分に注目できるようにします。これは、前の例の注意機構と似ています。

機械翻訳のためのTransformerベースのモデルの例を以下に示します:

import torch.nn as nn
from torch.nn import TransformerEncoder, TransformerEncoderLayer, TransformerDecoderLayer, TransformerDecoder
 
class TransformerModel(nn.Module):
    def __init__(self, src_vocab_size, tgt_vocab_size, d_model, nhead, num_encoder_layers, num_decoder_layers, dim_feedforward=2048, dropout=0.1):
        super(TransformerModel, self).__init__()
        # ソース語彙サイズ、ターゲット語彙サイズ、モデル次元数、ヘッド数、エンコーダ層数、デコーダ層数、フィードフォワード次元数、ドロップアウト率を設定
        self.src_embedding = nn.Embedding(s.```python
# ソース語彙サイズ、モデルの次元数
        self.src_embedding = nn.Embedding(src_vocab_size, d_model)
        # ターゲット語彙サイズ、モデルの次元数
        self.tgt_embedding = nn.Embedding(tgt_vocab_size, d_model)
        # エンコーダレイヤー: モデルの次元数、ヘッド数、フィードフォワード次元数、ドロップアウト率
        encoder_layer = TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout)
        # エンコーダ: エンコーダレイヤー、エンコーダ層数
        self.encoder = TransformerEncoder(encoder_layer, num_encoder_layers)
        # デコーダレイヤー: モデルの次元数、ヘッド数、フィードフォワード次元数、ドロップアウト率
        decoder_layer = TransformerDecoderLayer(d_model, nhead, dim_feedforward, dropout)
        # デコーダ: デコーダレイヤー、デコーダ層数
        self.decoder = TransformerDecoder(decoder_layer, num_decoder_layers)
        # 全結合層: モデルの次元数、ターゲット語彙サイズ
        self.fc = nn.Linear(d_model, tgt_vocab_size)
 
    def forward(self, src, tgt, src_mask=None, tgt_mask=None, memory_mask=None, src_key_padding_mask=None, tgt_key_padding_mask=None, memory_key_padding_mask=None):
        # ソース系列のエンベディング
        src_embedded = self.src_embedding(src)
        # ターゲット系列のエンベディング
        tgt_embedded = self.tgt_embedding(tgt)
        # エンコーダの出力
        encoder_output = self.encoder(src_embedded, src_mask, src_key_padding_mask)
        # デコーダの出力
        decoder_output = self.decoder(tgt_embedded, encoder_output, tgt_mask, memory_mask, tgt_key_padding_mask, memory_key_padding_mask)
        # 全結合層の出力
        output = self.fc(decoder_output)
        return output

この例では、Transformerモデルはエンコーダ、デコーダ、全結合層で構成されています。エンコーダは入力系列を処理し、入力の表現を生成します。デコーダは、この入力表現と前に生成された出力に基づいて出力系列を生成します。エンコーダとデコーダの両方のレイヤーでマルチヘッド注意機構が使用されています。

結論

ディープラーニングは人工知能の分野を革新し、コンピュータービジョンや自然言語処理など、幅広い分野で前例のない精度と効率を持つタスクを実行できるようにしました。