Upgrade to Pro — share decks privately, control downloads, hide ads and more …

生成 AI の基礎 〜 サンプル実装で学ぶ基本原理

生成 AI の基礎 〜 サンプル実装で学ぶ基本原理

Etsuji Nakai

July 17, 2023
Tweet

More Decks by Etsuji Nakai

Other Decks in Technology

Transcript

  1. Copyright (C) 2024 National Institute of Informatics, All rights reserved.

    生成モデルの基礎 〜 サンプル実装で学ぶ基本原理 中井悦司 / Etsuji Nakai 2025/01/10 ver2.3
  2. 目次 第1部:前提知識 ◦ Keras による分類モデルの実装 ◦ 多層ニューラルネットワーク ◦ 畳み込みフィルターと転置畳み込みフィ ルター

    第2部:画像生成モデルの基礎 ◦ オートエンコーダと潜在空間 ◦ 変分オートエンコーダ ◦ マルチタスク学習 ◦ 条件付 変分オートエンコーダ 第3部:自然言語モデルの基礎 ◦ LSTM によるテキスト分類 ◦ LSTM によるテキスト生成 第4部:より高性能な生成モデル ◦ Transformer モデル ◦ DCGAN ◦ Diffusion モデル ◦ VQ-VAE ◦ マルチモーダル生成モデル
  3. サンプルコードの入手について • 新 開い ノートブック上で次のコマンドを実行 ると、本講義のサンプルノートブック ダウンロー ドで ま 。

    ◦ 次のコマンドを実行 ると、ユーザー認証 行われて、Colab の実行環境に該当ユーザーの Google Drive マウント れま 。 ◦ 次のコマンドを実行 ると、サンプルノートブック Google Drive に保存 れま 。 from google.colab import drive drive.mount('/content/gdrive') %%bash cd '/content/gdrive/My Drive/Colab Notebooks' git clone https://github.com/enakai00/colab_GenAI_lecture 4
  4. GPU ランタイムを使用する際の注意 • 各ノートブックの先頭部分に、使用 るランタイムの種類(GPU を使用 る どう ) 記載

    れてい ま 。 • Google Colaboratory を無償枠で使用 ている場合、GPU ランタイムの使用時間には制限 あり、長時 間使用を続 ると、一定期間(半日〜1日程度)GPU ランタイム 使用で な なる と ありま 。 ◦ GPU ランタイムを使用 るノートブックは、実行 終わっ ら に、画面上部のメニュー ら 「ランタイム」→「ランタイムを接続解除 て削除」を選択 て、ランタイムを停止 て と を 勧め ま 。 5
  5. 線形多項分類器 • 各ラベルに対 る「可能性の高 」を 1 次関数で計算 ま 。 ◦

    例えば、28 × 28 (= 784) ピクセルの画像データであれば、1 つの画像は 784 個の実数 値 らなるデータと見な るので、784 変数の 1 次関数を使用 ま 。 ◦ ラベル とに異なる 1 次関数を用意 て、 れ れのラベルに対 る計算値を得ま 。 9 ・・・ MNIST の画像データを 10 種類に分類 る場合 れ れの画像に対 て 10 個の出力値 得られる
  6. 分類モデルの誤差関数 • n 番目のデータ  の正解ラベルを次の One-hot 表現で与えま 。(正解を k と て、k

    番 目の要素  のみ 1 になっている。) • 今のモデルで正解 k に対 る確率は    なので、 れ 大 なるようにモデルを学習 ま 。 ※ One-hot 表現の正解ラベルを用いると    は次式で表 と で ま 。 11
  7. 分類モデルの誤差関数 • の誤差関数を「カテゴリカル・クロスエントロ ピー」と呼びま 。 12 ※ 対数関数の性質 • 実際には、数値計算の丸め誤差を避

    る めに対数を取って、 らに全データについての和 を取っ ものの符号違いを誤差関数と て、 れを最小化 ま 。
  8. Keras による線形多項分類器の実装例 • 「784 個の値を受取る 1 次関数」を10 個用意 後に、 れらにソフトマックス関数を適

    用 る とで、前述の分類モデル 構成で ま 。 13 model = models.Sequential(name='linear_model') model.add(layers.Input(shape=(784,))) model.add(layers.Dense(10, activation='softmax', name='softmax'))
  9. Keras による線形多項分類器の実装例 • 最適化アルゴリズム、誤差関数、性能指標を指定 後に、学習処理を実施 ま 。 • トレーニングデータとは別の「テストデータ」を指定 ると、性能指標の計算は、テスト

    データに対 ても行わま 。 ◦ トレーニングデータに対 る性能指標 を見ていると、トレーニングデータには高い 正解率を示 にも わら 、 の他のデータには正解率 あ らない「過学習 (オー バーフィッティング)」の発生を見落と 危険性 あるので注意 必要で 。 14 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc']) history = model.fit(train_images, train_labels, validation_data=(test_images, test_labels), batch_size=128, epochs=10) テストデータの指定
  10. Keras による線形多項分類器の実装例 15 Epoch 1/10 469/469 [==============================] - 5s 8ms/step

    - loss: 0.6776 - acc: 0.8321 - val_loss: 0.3868 - val_acc: 0.9012 Epoch 2/10 469/469 [==============================] - 3s 5ms/step - loss: 0.3638 - acc: 0.9018 - val_loss: 0.3226 - val_acc: 0.9120 Epoch 3/10 469/469 [==============================] - 2s 5ms/step - loss: 0.3207 - acc: 0.9117 - val_loss: 0.2985 - val_acc: 0.9168 Epoch 4/10 469/469 [==============================] - 3s 6ms/step - loss: 0.3002 - acc: 0.9169 - val_loss: 0.2868 - val_acc: 0.9210 Epoch 5/10 469/469 [==============================] - 2s 4ms/step - loss: 0.2882 - acc: 0.9204 - val_loss: 0.2783 - val_acc: 0.9243 Epoch 6/10 469/469 [==============================] - 2s 3ms/step - loss: 0.2799 - acc: 0.9222 - val_loss: 0.2748 - val_acc: 0.9238 Epoch 7/10 469/469 [==============================] - 2s 3ms/step - loss: 0.2737 - acc: 0.9237 - val_loss: 0.2710 - val_acc: 0.9240 Epoch 8/10 469/469 [==============================] - 1s 2ms/step - loss: 0.2693 - acc: 0.9250 - val_loss: 0.2692 - val_acc: 0.9257 Epoch 9/10 469/469 [==============================] - 1s 3ms/step - loss: 0.2652 - acc: 0.9263 - val_loss: 0.2674 - val_acc: 0.9244 Epoch 10/10 469/469 [==============================] - 1s 2ms/step - loss: 0.2626 - acc: 0.9266 - val_loss: 0.2680 - val_acc: 0.9250 テストデータに 対 る正解率 92.5%
  11. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part01/1. Linear model MNIST

    classification.ipynb ▪ 線形多項分類器を Keras で実装 て、MNIST データセットの分類を行いま 。 16
  12. 多層ニューラルネットワーク • 入力データを のまま線形多項分類器に入力 るのではな 、事前に多層ニューラルネット ワークを介 て、分類に有用な情報を抽出 ま 。

    • 1 つのノードは、「1 次関数」+「活性化関数」を表 ま 。 ◦ 活性化関数には、ReLU よ 用いられま 。 18 ・・・ ・・・ 線形多項分類器 ・・・ ・・・ 全結合層
  13. Keras による多層ニューラルネットワークの実装例 • レイヤーを順に追加 る形で定義 ま 。 • モデルの出力は(線形多項分類器と同様の)確率値なので学習処理は変わりま ん。

    19 model = models.Sequential(name='multilayer_model') model.add(layers.Input(shape=(784,))) model.add(layers.Dense(512, activation='relu', name='feedforward1')) model.add(layers.Dense(256, activation='relu', name='feedforward2')) model.add(layers.Dense(128, activation='relu', name='feedforward3')) model.add(layers.Dense(10, activation='softmax', name='softmax')) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc']) history = model.fit(train_images, train_labels, validation_data=(test_images, test_labels), batch_size=128, epochs=10)
  14. Keras による多層ニューラルネットワークの実装例 20 Epoch 1/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 11s 19ms/step -

    acc: 0.8669 - loss: 0.4483 - val_acc: 0.9683 - val_loss: 0.1004 Epoch 2/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 9s 17ms/step - acc: 0.9723 - loss: 0.0942 - val_acc: 0.9761 - val_loss: 0.0804 Epoch 3/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 9s 19ms/step - acc: 0.9825 - loss: 0.0562 - val_acc: 0.9778 - val_loss: 0.0823 Epoch 4/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 8s 16ms/step - acc: 0.9868 - loss: 0.0419 - val_acc: 0.9783 - val_loss: 0.0823 Epoch 5/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 8s 16ms/step - acc: 0.9895 - loss: 0.0339 - val_acc: 0.9768 - val_loss: 0.0840 Epoch 6/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 11s 18ms/step - acc: 0.9919 - loss: 0.0249 - val_acc: 0.9774 - val_loss: 0.0896 Epoch 7/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 9s 16ms/step - acc: 0.9930 - loss: 0.0221 - val_acc: 0.9732 - val_loss: 0.1149 Epoch 8/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 8s 17ms/step - acc: 0.9929 - loss: 0.0215 - val_acc: 0.9788 - val_loss: 0.0936 Epoch 9/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 9s 18ms/step - acc: 0.9937 - loss: 0.0187 - val_acc: 0.9753 - val_loss: 0.1155 Epoch 10/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 7s 15ms/step - acc: 0.9954 - loss: 0.0145 - val_acc: 0.9831 - val_loss: 0.0842 テストデータに 対 る正解率 98.3% 過学習 発生
  15. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part01/2. Multilayer model MNIST

    classification.ipynb ▪ 多層ニューラルネットワークによる多項分類器を Keras で実装 て、MNIST データセットの 分類を行いま 。 ▪ モデルの構成(レイヤー数、レイヤー内のノード数)を変更 て、結果 どのように変わる 観察 て い。 21 model = models.Sequential(name='multilayer_model') model.add(layers.Input(shape=(784,))) model.add(layers.Dense(512, activation='relu', name='feedforward1')) model.add(layers.Dense(256, activation='relu', name='feedforward2')) model.add(layers.Dense(128, activation='relu', name='feedforward3')) model.add(layers.Dense(10, activation='softmax', name='softmax'))
  16. 畳み込みフィルターによる特徴量の抽出 • 実際の畳み込みフィルターでは、フィルター 適用後に「定数を加えて、活性化関数を適用 る」という追加処理を行いま 。 • 下図は、フィルター適用後に定数 -0.2 を加え

    て、ReLU を適用 ていま 。(フィルター適 用後にピクセル値 0.2 以下の部分は強制的 に 0 に変換 れる) 25 定数 b (< 0) を加えて ReLU を適用 結果
  17. ストライドの指定による画像の縮小 • フィルターを 1 ピクセル とに計算 るのではな 、一定数のピクセルをスキップ な ら

    適用 る とで画像サイズ 縮小 れま 。 • 下図は、画像サイズを半分に縮小 例で 。 ◦ 「分類に必要な特徴を取り出 」には、多 の場合、画像を縮小 方 効果的で 。 26
  18. 畳み込みフィルターの動的な学習 • 一般の画像データの場合、どのようなフィルター 適切なの は、 には分 らないの で、フィルターも学習対象のパラメーターと て、適切なフィルター のものを学習

    ま 。 • 下記のモデルでは、16 種類のフィルターを適用 後、全結合層を介 て、線形多項分類器 に入力 ていま 。 27 model = models.Sequential(name='CNN_model') model.add(layers.Input(shape=(784,))) model.add(layers.Reshape((28, 28, 1), name='reshape')) model.add(layers.Conv2D(16, (5, 5), padding='same', strides=(2, 2), use_bias=True, activation='relu', name='conv_filter')) model.add(layers.Flatten(name='flatten')) model.add(layers.Dense(512, activation='relu', name='hidden')) model.add(layers.Dense(10, activation='softmax', name='softmax'))
  19. 畳み込みフィルターの動的な学習 28 Epoch 1/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - acc:

    0.8820 - loss: 0.4215 - val_acc: 0.9752 - val_loss: 0.0788 Epoch 2/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - acc: 0.9771 - loss: 0.0754 - val_acc: 0.9793 - val_loss: 0.0594 Epoch 3/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 2s 3ms/step - acc: 0.9856 - loss: 0.0457 - val_acc: 0.9828 - val_loss: 0.0492 Epoch 4/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 2s 3ms/step - acc: 0.9912 - loss: 0.0289 - val_acc: 0.9834 - val_loss: 0.0547 Epoch 5/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 2s 3ms/step - acc: 0.9942 - loss: 0.0193 - val_acc: 0.9847 - val_loss: 0.0540 Epoch 6/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - acc: 0.9962 - loss: 0.0133 - val_acc: 0.9863 - val_loss: 0.0496 Epoch 7/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - acc: 0.9976 - loss: 0.0092 - val_acc: 0.9830 - val_loss: 0.0671 Epoch 8/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - acc: 0.9968 - loss: 0.0098 - val_acc: 0.9837 - val_loss: 0.0620 Epoch 9/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - acc: 0.9969 - loss: 0.0089 - val_acc: 0.9841 - val_loss: 0.0724 Epoch 10/10 469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - acc: 0.9972 - loss: 0.0086 - val_acc: 0.9870 - val_loss: 0.0498 テストデータに 対 る正解率 98.7% 学習後のフィルターの様子
  20. 複数レイヤーに対する畳み込みフィルター適用の仕組み • 1 つのフィルターは、各レイヤー に適用 るサブフィルターを内部 的に保持 て り、各サブフィル ターの出力を合成

    もの 出力 画像になりま 。 • RGB 画像ファイルを入力 ても、 の出力は RGB 画像ファイルに なるわ ではありま ん。 29
  21. 2 層目のフィルターの適用方法 • 1 層目のフィルター ら得られ n 枚の画像データを「n 個の レイヤー

    らなる画像」と て、2層目のフィルターを適用 ま 。 • 右図は 1 層目に 32 個、2 層目 に 64 個のフィルターを用意 例で 。2 層目の 64 個の フィルターは、 れ れ内部的 に 32 個のサブフィルターを持 ま 。 30
  22. 転置畳み込みフィルターの仕組み • 元画像にストライドの隙間を空 て ら畳み込みフィルターを適用 る とで、画像サイズ を拡大 ま 。

    • 複数レイヤーの画像については、レイヤー とのサブフィルターで処理 結果を合成 1 レイヤーの画像を生成 ま 。 33 ストライド (2, 2) で 3 × 3 ピクセルの画像を 6 × 6 ピクセルに拡大 る例 https://github.com/vdumoulin/conv_arithmetic
  23. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part01/3. Static filter example.ipynb

    ▪ 縦/横のエッジを取り出 固定的なフィルターを適用 ま 。 ◦ Part01/4. Dynamic filter MNIST classification.ipynb ▪ 畳み込みニューラルネットワーク(CNN)で MNIST データセットの分類を行いま 。(16 個のフィルターを持つ畳み込み層を使用 ていま 。) ▪ フィルター数を変更 て、結果 どのように変わる 観察 て い。 34 model = models.Sequential(name='CNN_model') model.add(layers.Input(shape=(784,))) model.add(layers.Reshape((28, 28, 1), name='reshape')) model.add(layers.Conv2D(16, (5, 5), padding='same', strides=(2, 2), use_bias=True, activation='relu', name='conv_filter')) model.add(layers.Flatten(name='flatten')) model.add(layers.Dense(512, activation='relu', name='hidden')) model.add(layers.Dense(10, activation='softmax', name='softmax')) フィルター数
  24. オートエンコーダ • エンコーダとデコーダを接続 て、 同 データを再現 る様に学習 モデルをオートエンコーダと言いま 。 •

    エンコーダとデコーダの接続部分の 低次元空間を「潜在空間」、も は、「埋め込み空間」と言いま 。 • 潜在空間には、画像の「種類」を表 抽象化 れ 情報 埋め込まれて いると考える と で ま 。 37 潜在空間
  25. オートエンコーダの学習例 • 32 × 32 ピクセルの画像を 2 次元の潜 在空間に埋め込むオートエンコーダを 定義

    ま 。 • つまり、1 つの画像は、2 次元平面の 1 つの点に対応づ られま 。 • エンコーダ部分は畳み込みフィル ター、デコーダ部分は転置畳み込み フィルターを使用 ま 。 38 32 × 32 × 1 16 × 16 × 32 4 × 4 × 128 8 × 8 × 64 2 次元の 潜在空間
  26. オートエンコーダの実装例(エンコーダ) • エンコーダは    の 2 つの値を出力 ま 。 39 encoder

    = models.Sequential(name='encoder') encoder.add(layers.Input(shape=(32*32,), name='encoder_input')) encoder.add(layers.Reshape((32, 32, 1), name='reshape')) encoder.add(layers.Conv2D(32, (3, 3), strides=2, padding='same', activation='relu', name='conv_filter1')) # (16, 16, 32) encoder.add(layers.Conv2D(64, (3, 3), strides=2, padding='same', activation='relu', name='conv_filter2')) # (8, 8, 64) encoder.add(layers.Conv2D(128, (3, 3), strides=2, padding='same', activation='relu', name='conv_filter3')) # (4, 4, 128) encoder.add(layers.Flatten(name='flatten')) encoder.add(layers.Dense(2, name='embedding_space')) 32 × 32 × 1 16 × 16 × 32 4 × 4 × 128 8 × 8 × 64 潜在空間
  27. オートエンコーダの実装例(デコーダ) • エンコーダ 出力 潜在空間の点 ら画像を生成 ま 。 40 decoder

    = models.Sequential(name='decoder') decoder.add(layers.Input(shape=(2,), name='decoder_input')) decoder.add(layers.Dense(4 * 4 * 128, name='expand')) decoder.add(layers.Reshape((4, 4, 128), name='reshape')) decoder.add(layers.Conv2DTranspose(64, (3, 3), strides=2, padding='same', activation='relu', name='conv_transpose1')) # (8, 8, 64) decoder.add(layers.Conv2DTranspose(32, (3, 3), strides=2, padding='same', activation='relu', name='conv_transpose2')) # (16, 16, 32) decoder.add(layers.Conv2DTranspose(1, (3, 3), strides=2, padding='same', activation='sigmoid', name='conv_transpose3')) # (32, 32, 1) decoder.add(layers.Flatten(name='flatten')) 潜在空間
  28. オートエンコーダの実装例(学習用モデル) • KL ダイバージェンスの計算に必要なエンコーダの出力値と、デコーダ らの出力イメージ を同時に出力 るモデルを定義 て、 のモデルに対 て学習処理を行いま

    。 • 学習 終わっ 後は、エンコーダとデコーダは個別に使用 る と で ま 。 41 model = models.Model(inputs=encoder.inputs, outputs=decoder(encoder(encoder.inputs)), name='CNN_AutoEncoder') model.compile(optimizer='adam', loss='mse') エンコーダとデコーダを 結合 学習用モデル エンコーダ デコーダ 誤差関数 正解ラベル
  29. オートエンコーダの学習例 • Fashion MNIST の画像データで学習 結果、 潜在空間には、10 種類の画像に対応 クラス ター

    で ている と 分 りま 。 • デコーダを使用 ると、潜在空間の点 ら新 い画像を生成 る と で ま 。 42 学習データに対 る エンコーダの出力値
  30. オートエンコーダの課題 • 潜在空間の中で、整っ 画像を生成で る点 偏っ 分布を ていま 。 •

    連続的に画像を変化 場合、「中間状態」の 画像 多 含まれま 。 43 円周上の画像を連続的に 変化 例 デコーダ 出力 る 画像のサンプル
  31. オートエンコーダを改善するアイデア • オートエンコーダを学習 る際に、エンコーダによって学習データ ら得られ 点を のま まデコーダに入れるのではな 、乱数で一定範囲に広 て

    らデコーダに入力 ま 。 • れにより、デコーダは、潜在空間のより広い範囲に いて、学習データに近い「整っ 画 像」を再現 るように学習 れま 。 44 潜在空間 デコーダは、広 っ 範囲 の点に対 て学習データを 再現 る様に学習 れる エンコーダ ら得られ 点を乱数で 移動 て らデコーダに入力 る エンコーダ デコーダ
  32. 演習 ◦ Part02/2. AutoEncoder Fashion MNIST.ipynb ▪ 畳み込みフィルターと転置畳み込みフィルターによるオートエン コーダのモデルを Fashion

    MNIST データセットで学習 ま 。 45 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part02/1. AutoEncoder MNIST example.ipynb ▪ フィードフォワード・ネットワークによるオートエンコーダのモデルを MNIST データセット で学習 ま 。 ▪ ま まな手書 文字を入力 て、どのような出力結果になる 観察 て い。
  33. 正規分布について • 平均 μ 、分散 σ2(標準偏差 σ)の正規分布に従う乱数を      で表 ま 。 •

    特に       の場合      を「標準正規分布」と言いま 。 ◦ 標準正規分布の乱数は、次の式で、正規分布       に変換で ま 。 47 正規分布 2次元の 正規分布
  34. ◦ エンコーダ 出力 る正規分布 標準正規分布 ら大 外れない様に、誤差関数に罰則項を追加 ま 。 •

    れらにより、潜在空間の原点の近 に「整っ 画像 得られる点」 集まるものと期待で ま 。 変分オートエンコーダの仕組み • 2 次元の潜在空間を用いるものと て、次の手続 を実行 ま 。 ◦ エンコーダは、入力画像に対 て、正規分布の平均    と各軸方向の標準偏差     を出力 ま 。 ◦ 得られ 正規分布 らサンプリング 値をデコーダに入力 ま 。 ◦ デコーダの出力画像 入力画像に近づ ようにモデルのパラメーターを更新 ま 。 48 潜在空間 の範囲の乱数で得られ 値をデコーダに入力 る
  35. 変分オートエンコーダの実装例(エンコーダ) • エンコーダは           の 4 つの値を出力 ま 。 ◦ 次式で     に変換

    て利用 ま 。 49 encoder = models.Sequential(name='encoder') encoder.add(layers.Input(shape=(32*32,), name='encoder_input')) encoder.add(layers.Reshape((32, 32, 1), name='reshape')) encoder.add(layers.Conv2D(32, (3, 3), strides=2, padding='same', activation='relu', name='conv_filter1')) # (16, 16, 32) encoder.add(layers.Conv2D(64, (3, 3), strides=2, padding='same', activation='relu', name='conv_filter2')) # (8, 8, 64) encoder.add(layers.Conv2D(128, (3, 3), strides=2, padding='same', activation='relu', name='conv_filter3')) # (4, 4, 128) encoder.add(layers.Flatten(name='flatten')) encoder.add(layers.Dense(4, name='mean_and_log_var')) 32 × 32 × 1 16 × 16 × 32 4 × 4 × 128 8 × 8 × 64
  36. 変分オートエンコーダの実装例(サンプラー) • サンプラーは次の関係を利用 て、平均    、各軸方向の標準偏差     の正規分 布 ら、デコーダに入力 る値をランダムに選択 ま 。

    50 def get_samples(x): # x: encoder output num_examples = tf.shape(x)[0] means, log_vars = x[:, 0:2], x[:, 2:4] std_samples = tf.random.normal(shape=(num_examples, 2)) samples = means + tf.exp(0.5 * log_vars) * std_samples return samples sampler = models.Sequential(name='sampler') sampler.add(layers.Input(shape=(4,), name='sampler_input')) sampler.add(layers.Lambda(get_samples, name='sampled_embedding')) デコーダに入力 る 値をランダムに選択 潜在空間 標準正規分布 × 標準正規分布の乱数を 目的の正規分布に変換
  37. 変分オートエンコーダの実装例(デコーダ) • デコーダは、サンプラー 選択 潜在空間の点 ら画像を生成 ま 。(オートエンコーダと同 コードで 。)

    51 decoder = models.Sequential(name='decoder') decoder.add(layers.Input(shape=(2,), name='decoder_input')) decoder.add(layers.Dense(4 * 4 * 128, name='expand')) decoder.add(layers.Reshape((4, 4, 128), name='reshape')) decoder.add(layers.Conv2DTranspose(64, (3, 3), strides=2, padding='same', activation='relu', name='conv_transpose1')) # (8, 8, 64) decoder.add(layers.Conv2DTranspose(32, (3, 3), strides=2, padding='same', activation='relu', name='conv_transpose2')) # (16, 16, 32) decoder.add(layers.Conv2DTranspose(1, (3, 3), strides=2, padding='same', activation='sigmoid', name='conv_transpose3')) # (32, 32, 1) decoder.add(layers.Flatten(name='flatten')) 潜在空間 × サンプラー 選ん 値
  38. 変分オートエンコーダの実装例(誤差関数) • 「KL ダイバージェンス」は、2 つの乱数分布 どの程度似ている を表 計算式で 。 (KL

    ダイバージェンスの値 小 いほど、2 つの分布はより似ていま 。) • エンコーダの出力 ら得られる正規分布      の標準正規分布      に対 る KL ダイバージェンスを誤差関数に罰則項と て加えま 。 ◦ 罰則項の重み(下の例では 0.001)は、ハイパーパラメータと てチューニング 必 要で 。 52 def custom_loss(y_true, y_pred): mean, log_var, pred = y_pred[:, 0:2], y_pred[:, 2:4], y_pred[:, 4:1028] reconstruction_loss = losses.mse(pred, y_true) kl_loss = tf.reduce_mean(tf.reduce_sum( -0.5 * (1 + log_var - tf.square(mean) - tf.exp(log_var)), axis=1)) loss = reconstruction_loss + 0.001 * kl_loss return loss KL ダイバージェンス
  39. 変分オートエンコーダの実装例 • KL ダイバージェンスの計算に必要なエンコーダの出力値と、デコーダ らの出力イメージ を同時に出力 るモデルを定義 て、 のモデルに対 て学習処理を行いま

    。 53 model_inputs = encoder.inputs[0] model_outputs = layers.Concatenate(name='prediction_with_mean_log_var')( [encoder(model_inputs), decoder(sampler(encoder(model_inputs)))]) model = models.Model(inputs=model_inputs, outputs=model_outputs, name='Variational_AutoEncoder') model.compile(optimizer='adam', loss=custom_loss) デコーダの出力 エンコーダの出力 エンコーダ サンプラー デコーダ 誤差関数 正解ラベル
  40. ラベルデータの利用 • 変分オートエンコーダは、ラベルデータを使わ に、画像の特徴 ら、潜在空間に画像の種類 とのクラスター 生成で ま 。 •

    ラベルデータを明示的に使用 る事で、次の様な 応用 可能になりま 。 ◦ マルチタスク学習 ⇨ ラベル とのより明確なクラスターを生成 ◦ 条件付 変分オートエンコーダ ⇨ ラベル指定で特定の画像を生成 57
  41. 演習 58 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part02/3. Variational AutoEncoder

    Fashion MNIST.ipynb ▪ 変分オートエンコーダのモデルを Fashion MNIST データセットで学習 ま 。 ▪ 誤差関数に る KL ダイバージェンスの重みを変化 て、結果 どのように変わる 観 察 て い。 def custom_loss(y_true, y_pred): mean, log_var, pred = y_pred[:, 0:2], y_pred[:, 2:4], y_pred[:, 4:1028] reconstruction_loss = losses.mse(pred, y_true) kl_loss = tf.reduce_mean(tf.reduce_sum( -0.5 * (1 + log_var - tf.square(mean) - tf.exp(log_var)), axis=1)) loss = reconstruction_loss + 0.001 * kl_loss return loss KL ダイバージェンスの重み
  42. 分類モデルとの同時学習 • 潜在空間の値 らラベルを予測 る分類モデルを同時に学習 ま 。 • 分類モデルの立場 らは、潜在空間の中でラベル

    とにデータ 分離 れている と 重要 なので、ラベル とのより明確なクラスター 得られると期待で ま 。 60 潜在空間 × 分類モデル ラベル:2 画像データ ラベル付 画像データ 画像を比較 ラベルを比較 エンコーダ デコーダ サンプラー
  43. マルチタスク学習の実装例 • エンコーダ、サンプラー、デコーダは変分オートエンコーダと同 ものを再利用 ま 。 • サンプラーの出力を受 取って、ラベルを予測 る線形多項分類器を追加で用意

    ま 。 • エンコーダの出力値、デコーダ らの出力イメージ、分類の予測値を同時に出力 るモデル を定義 て、 のモデルに対 て学習処理を行いま 。 61 discriminator = models.Sequential(name='discriminator') discriminator.add(layers.Dense(10, activation='softmax', input_shape=(2, ), name='softmax')) model_input = tf.keras.Input(shape=(32*32,)) model_output = layers.Concatenate(name='multi_task_output')( [encoder(model_input), # mean and log_var decoder(sampler(encoder(model_input))), # reconstructed image discriminator(sampler(encoder(model_input))) # label prediction ] )
  44. マルチタスク学習の実装例 62 def custom_loss(y_true, y_pred): mean, log_var, image, label_pred =

    y_pred[:, 0:2], y_pred[:, 2:4], y_pred[:, 4:4+32*32], y_pred[:, 4+32*32:] image_true, label_true = y_true[:, :32*32], y_true[:, 32*32:] reconstruction_loss = losses.mse(image, image_true) discriminator_loss = losses.CategoricalCrossentropy()(label_true, label_pred) kl_loss = tf.reduce_mean(tf.reduce_sum( -0.5 * (1 + log_var - tf.square(mean) - tf.exp(log_var)), axis=1)) loss = reconstruction_loss + 0.001 * kl_loss + 0.05 * discriminator_loss return loss • 学習時の正解ラベルと て使用 る め、画像データにラベル値を付与 データを用意 ま 。各画像データの末尾に(One-hot エンコーディングの)10 要素のラベル値 追加 れ 形になりま 。 • 誤差関数は、VAE の誤差関数に、分類モデルの誤差関数(カテゴリカル・クロスエントロ ピー)を加えま 。 labeled_images = np.hstack([train_images, train_labels])
  45. マルチタスク学習による学習結果 • ラベル とに、より明確なクラスター で て いる と 分 りま

    。 • クラスターの境界 広い め、「中間状態」の 画像 生成 れや い可能性 ありま 。 63
  46. 演習 65 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part02/4. VAE multitask

    learning Fashion MNIST.ipynb ▪ 変分オートエンコーダに分類モデルを組み合わ マルチタスク学習を適用 ま 。 ▪ 誤差関数に る分類モデルに対 る誤差(カテゴリカル・クロスエントロピー)の重みを 変化 て、結果 どのように変わる 観察 て い。 def custom_loss(y_true, y_pred): mean, log_var, image, label_pred = y_pred[:, 0:2], y_pred[:, 2:4], y_pred[:, 4:4+32*32], y_pred[:, 4+32*32:] image_true, label_true = y_true[:, :32*32], y_true[:, 32*32:] reconstruction_loss = losses.mse(image, image_true) discriminator_loss = losses.CategoricalCrossentropy()(label_true, label_pred) kl_loss = tf.reduce_mean(tf.reduce_sum( -0.5 * (1 + log_var - tf.square(mean) - tf.exp(log_var)), axis=1)) loss = reconstruction_loss + 0.001 * kl_loss + 0.05 * discriminator_loss return loss カテゴリカル・クロスエントロピーの重み
  47. ラベル付き画像データの準備 • 画像データの直後に One-hot 表現のラベルデータを付加 データを用意 ま 。 68 ラベル:2

    labeled_images = np.hstack([train_images, train_labels]) image = labeled_images[0][:32*32] # Image part label = labeled_images[0][32*32:] # Label part 前半の 32×32 個の数値 画像データで の後の 10 個の数値 ラベルデータ
  48. 条件付き変分オートエンコーダの実装例 • デコーダには、サンプラー の出力値に加えて、ラベル 値を入力 るようにモデル を構成 ま 。 69

    decoder = models.Sequential(name='conditional_decoder') decoder.add(layers.Dense(4 * 4 * 128, input_shape=(2+10,), name='expand')) decoder.add(layers.Reshape((4, 4, 128), name='reshape2')) decoder.add(layers.Conv2DTranspose(64, (3, 3), strides=2, padding='same', activation='relu', name='conv_transpose1')) # (8, 8, 64) decoder.add(layers.Conv2DTranspose(32, (3, 3), strides=2, padding='same', activation='relu', name='conv_transpose2')) # (16, 16, 32) decoder.add(layers.Conv2DTranspose(1, (3, 3), strides=2, padding='same', activation='sigmoid', name='conv_transpose3')) # (32, 32, 1) decoder.add(layers.Flatten(name='flatten')) model_input = tf.keras.Input(shape=(32*32+10,)) model_output = layers.Concatenate(name='prediction_with_mean_log_var')( [encoder(model_input[:, :32*32]), # Receive mean and log_var decoder(tf.concat( (sampler(encoder(model_input[:, :32*32])), model_input[:, 32*32:]), axis=1) # Provide label to the decoder ) # Receive reconstructed image ] ) ラベル値 サンプラーの出力値
  49. 条件付き変分オートエンコーダの学習結果 • れまでと異なり、ラベル とのクラスターはで ていま ん。 ◦ デコーダは、追加で受 取るラベル値 利用で

    るので、潜在空間の値にラベルの情 報を紐づ る必要 ありま ん。 70 学習データに対 る エンコーダの出力値
  50. 条件付き変分オートエンコーダの学習結果 • 潜在空間をシグモイド関数で変換 後、均 等にサンプリング 値をデコーダに入力 て、対応 る画像を確認 ま 。

    • 入力 るラベル とに対応 る画像 生成 れる一方、潜在空間の値によって、共通の特 徴(画像の横幅や色の濃 など) 調整で る と わ りま 。 72
  51. 条件付き変分オートエンコーダの学習結果 • デコーダに入力 るラベル値は、One-hot エンコーディングなので、複数のラベルを同時 に指定 る と で ま

    。 れにより、複数の種類を合成 新 い画像 得られま 。 73 Trouser と Shirt のラベルを同時に指定 Bag と Ankle Boot のラベルを同時に指定
  52. 演習 74 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part02/5. Conditional VAE

    Fashion MNIST.ipynb ▪ 条件付 変分オートエンコーダのモデルを Fashion MNIST データセットで学習 ま 。 ▪ 学習後のデコーダに ま まなラベル値(複数のラベルを同時に指定)を与えて、生成 れ る画像 どのように変化 る 観察 て い。 fig = plt.figure(figsize=(6, 6)) label = [0] * 10 label[1], label[6] = 0.5, 0.5 # Trouser + Shirt add_grid_images(fig, label) ラベル値の設定 ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] One-hot エンコーディングの フラグと画像の種類の対応
  53. 出力値 リカレント・ニューラルネットワークの仕組み • 時系列データに対 て、同 構造の「セル」を繰り返 適用 る とで、各時刻に る出

    力データを得る形式のモデルをリカレント・ニューラルネットワーク(RNN)と言いま 。 • RNN のセルは、出力値と同時に「隠れ状態」の値 h を出力 ま 。 の値は、次の時刻の データを処理 る際に利用 れま 。隠れ状態には、 れまでの処理結果の情報 埋め込ま れているものと期待 れま 。 77 セル セル セル t = 1 入力値 t = 2 t = T ・・・ パラメーターの値は べてのセルで共通 隠れ状態
  54. リカレント・ニューラルネットワークの仕組み • 図は、最もシンプルな RNN の例で 。隠れ状態と入力値をハイパボリック・タンジェント を活性化関数と る全結合層に入力 て、得られ 結果を新

    い隠れ状態、 よび、出力値 と ま 。 • 直前の出力値を新 い隠れ状態と る め、長期的な情報の保持 困難になりま 。(次の セルは直前の出力のみを参照 ま 。) ◦ 数学的には、ハイパボリック・タンジェント 繰り返 適用 れる結果、勾配消失 発生 て学習 進まな なりま 。 78 ハイパボリック・タンジェントのグラフ
  55. LSTM の仕組み • LSTM のセルは、「隠れ状態 h」と「セル状態 c」の 2 種類の情報を伝達 ま

    。隠れ状態 は、直前の出力値に一致 ま 。 ◦ 隠れ状態とセル状態は同 次元のベクトル値で、具体的な次元数はハイパーパラメーターと て利 用者 指定 ま 。 79 • 大雑把には、次の様に理解 る事 で ま 。 ◦ セル状態に、 れまでの処理結果の情報 保存 れま 。 ◦ 隠れ状態と新 い入力値を用いて、セル状態の情 報を更新 ま 。(不要な情報を削除 て、新 い情報を追加 ま 。) ◦ 更新後のセル状態の情報を用いて、「隠れ状態+ 入力値」 ら出力値を生成 ま 。 ◦ 隠れ状態は短期的な(=直前の)情報、セル状態 は長期的な情報を伝達 ると考えられま 。 不要な情報 を削除 新 い情報 を追加 更新 れ セル状態 ら出力値を生成 「直前+現在」 の情報 長期的な 情報
  56. LSTM の仕組み 80 新 い情報 を追加 「直前+現在」 の情報 長期的な 情報

    不要な情報 を削除 新 い情報 を追加 出力 る情報を 選定 るゲート 更新 れ セル状態 ら出力値を生成 削除 る情報を 選定 るゲート • シグモイド関数を除いてみると、LSTM の基本的な情報の流れ 理解で ま 。 ◦ 2 つの tanh は、入力情報・出力情報に対 る活性化関数と て機能 ま 。 ◦ 3 つのシグモイド関数は、削除・追加・出力 る情報を選定 るゲートになりま 。 追加 る情報を 選定 るゲート
  57. LSTM の利用方法 • 時系列データ全体 ら 1 つの予測値 必要な場合は、最後のセル の出力値のみを利用 ま

    。一方、各時刻に対 る予測値 必要 な場合は、 べてのセルの出力値を利用 ま 。 • 複数の LSTM を多段に重ねて利用 る ともで ま 。 81 出力値 セル A セル A セル A t = 1 入力値 t = 2 t = T ・・・ セル B セル B セル B ・・・ LSTM レイヤー1 LSTM レイヤー2 多項分類器 テキスト分類を行う例
  58. 双方向 LSTM について • 予測内容によっては、時系列データを必 も時間順に処理 る必要はありま ん。 のよ うな場合、正方向と逆方向の処理を組み合わ

    、双方向 LSTM も使用で ま 。 82 出力値 t = 1 入力値 t = 2 t = T ・・・ ・・・ れ れのセル らの 出力を結合 ものを 出力値と る セル B セル A セル B セル A セル B セル A
  59. 双方向 LSTM によるテキスト分類 • 双方向 LSTM でテキスト分類を行う場合、各方向の最後のセルの出力を結合 て、 れを多 項分類器に入力

    ま 。 83 ・・・ ・・・ セル B セル A セル B 多項分類器 t = 1 入力値 t = 2 t = T セル B セル A セル A 最後のセル らの 出力を結合 ものを 出力値と る
  60. テキストのトークン化について • テキストデータを扱う場合、あら め、 れ れの単語を対応 る整数値(トークン ID) に置 換えて、数値リストのデータに変換

    ま 。事前に用意 れ トークン化ツール (トークナイザー)を用いて変換 ま 。 84 I didn't feel humiliated. [101, 1045, 2134, 2102, 2514, 26608, 102, 0, 0, ..., 0] [CLS] i didn ##t feel humiliated [SEP] [PAD] [PAD] ... [PAD] ◦ アポストロフィー(')などの記号は、 トークナイザー 自動判別 て処理 ま 。 ◦ テキストの先頭と末尾を示 トークン ([CLS] / [SEP]) 付与 れま 。 ◦ 固定長のリストに る め残りの部分 は 0([PAD]) で埋められま 。 トークン ID のリストに変換 トークン ID をテキストに再変換 トークナイザーに よる処理の例
  61. トークンの埋め込み表現について • テキストデータをニューラルネットワークで処理 る場合、最初の「埋め込み層」で れ れのトークン ID を高次元空間の埋め込みベクトルに変換 ま 。

    ◦ トークン ID とベクトル値は、単純に 1 対 1 で対応 ま 。 の際の「対応表」 埋 め込み層のウェイト(チューニング対象のパラメータ)になりま 。 ◦ モデルの学習結果と て、意味 近い単語は、埋め込みベクトルも類似 値になるも のと期待で ま 。 85 ID = 1 に対応 るベクトル ID = 2 に対応 るベクトル ID = 3 に対応 るベクトル ・・・ 埋め込みベクトルの次元 トークン ID の値の範囲 埋め込み層のウェイト
  62. 双方向 LSTM による分類モデルの実装例 • 埋め込み層と双方向 LSTM では次のオプションを指定 ま 。 ◦

    埋め込み層:トークン ID の値の範囲(VOCAB_SIZE)、埋め込み ベクトルの次元(512) ◦ 双方向 LSTM: 隠れ状態の次元(512、 よび、256)、 べての セルの出力値を使用 る どう (return_sequences) • 過学習を防止 る めのドロップアウト層 挟まれていま 。 86 lstm_model = models.Sequential(name='Bidirectional_LSTM_classifier') lstm_model.add(layers.Input(shape=(None,), name='input_ids')) lstm_model.add(layers.Embedding(VOCAB_SIZE, 512, name='text_embedding')) lstm_model.add(layers.Bidirectional(layers.LSTM(512, return_sequences=True), name='bidirectional_LSTM1')) lstm_model.add(layers.Dropout(rate=0.4, name='dropout1')) lstm_model.add(layers.Bidirectional(layers.LSTM(256, return_sequences=False), name='bidirectional_LSTMs')) lstm_model.add(layers.Dropout(rate=0.4, name='dropout2')) lstm_model.add(layers.Dense(256, activation='relu', name='feedforward')) lstm_model.add(layers.Dropout(rate=0.4, name='dropout3')) lstm_model.add(layers.Dense(6, activation='softmax', name='softmax')) 埋め込み層 双方向 LSTM 線形多項分類器 ・・・ [101, 1045, 2134, ..., 0] ・・・ 双方向 LSTM ・・・ 全結合層 [N] [N, 512] [N, 512*2] [256*2] [256] トークン数 N
  63. (参考)ドロップアウト層について • ドロップアウト層は、モデルの学習時に、2つのレイヤー間の接続の一部をランダムに切断 ま 。 ◦ 例えば、512 次元のベクトル値(= 512 個の実数値)を受

    渡 際に、40% の値 強制的に 0 に書 換えられま 。 • ドロップアウト層の直後のレイヤーは、一部の情報 欠落 状態で予測を る必要 ある め、学習データに過度に依存 る とな 、汎化性能 維持で ると期待 れま 。 87
  64. 演習 89 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part03/1. LSTM emotion

    recognizer.ipynb ▪ LSTM によるテキスト分類モデルを emotion データセットで学習 ま 。 ▪ ま まなテキストに対 る予測結果を確認 てみて い。 ▪ モデルの定義に含まれる layers.LSTM を layers.SimpleRNN に変えると、 LSTM のセル 「最もシンプルな RNN」のセルに変わりま 。LSTM の場 合と精度を比較 て い。 input_text = [ "I lost my words as he nudged me.", "It always makes my day.", "I'm caring about you as your mother.", "I am not happy at all. It's opposite!", "The movie gave me a chill in my spine.", "I am stunned at the heartfelt welcome." ]
  65. RNN による「次の単語」の予測 • RNN で「次の単語」を予測 る場合、トークン ID の値をカテゴリーラベルと て、多項分 類器でトークン

    ID との確率値を出力 ま 。 • 各セルは、入力データに対 て、「自身 受 取るトークンよりも前にある情報」を隠れ状 態 ら受 取って利用 て予測 ま 。 91 出力値 セル セル セル t = 1 入力値 t = 2 t = T ・・・ 多項分類器 多項分類器 多項分類器 t = 2 の単語 を予測 t = 3 の単語 を予測 トークン ID 確率 出力値 べてのトークン ID に ついて確率値を出力
  66. RNN による「次の単語」の予測 • 学習に使用 るデータは、下図のように、トークン ID に変換 テキストに対 て、最後の トークンを除い

    ものを入力データ、最初のトークンを除い ものを正解ラベルと ま 。 92 time flies like an arrow [101, 2051, 10029, 2066, 2019, 8612, 102, 0, 0, 0] 入力データ 正解ラベル [SEP] トークン ID に変換 [101, 2051, 10029, 2066, 2019, 8612, 102, 0, 0] [2051, 10029, 2066, 2019, 8612, 102, 0, 0, 0] 入力データ 正解ラベル [CLS] ・・・ [CLS] time flies like an arrow [SEP] [PAD] [PAD] time flies like an arrow [SEP] [PAD] [PAD] [PAD]
  67. RNN によるテキスト生成 • 学習後のモデルにテキストの冒頭部分を入力 ると、最後の出力 ら次の単語の確率分布 得られま 。 ら単語をサンプリング て、末尾に付

    加える作業を繰り返 ま 。 93 93 セル セル t = 1 t = 2 多項分類器 多項分類器 Recipe      for spicy セル t = 3 多項分類器 確率分布に従って単語をサンプ リング て、末尾に付 加える
  68. 温度パラメーターについて • モデル 出力 確率分布を次の様に変換 て らサンプリング る とで、生成 れるテキストの変化を調整で

    ま 。 • 温度パラメーター T 小 いほど実行 と の変動 小 なりま 、同 文章 繰 り返 れる問題 発生 や なりま 。 94 94 温度パラメーター T による分布の変化
  69. LSTM によるテキスト生成モデルの学習結果 • 料理レシピのデータセットでテキスト生成モデルを学習 る例 ノートブックに用意 れていま 。実際に生成 れ るテキストの例は、ノートブックで確認

    て い。 95 学習データの例 https://huggingface.co/datasets/Shengtao/recipe 埋め込み層 線形多項分類器 ・・・ [101, 1045, 2134, ..., 0] ・・・ [N] [N, 512] [N, 512] トークン数 N [N, 30522] LSTM ・・・ ・・・
  70. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part03/2. LSTM recipe generator

    training.ipynb ▪ LSTM によるテキスト生成モデルを「レシピ」のデータセットで学習 ま 。 ◦ Part03/3. LSTM recipe generator analysis.ipynb ▪ 学習後のテキスト生成モデルを用いて、レシピのテキストを生成 ま 。 ▪ 温度パラメーターによる生成テキストの変化を観察 て い。 96 gen_text('Recipe for beef', temp=0.5, lang='ja') 温度パラメーターの指定
  71. Transformer モデルの考え方 99 • テキストに る単語の「意味」は、まわりにある単語との関係で変化 ま 。例えば、次 の 2

    つのテキストの「flies」の品詞・意味は、最後にある単語(arrow / banana)を見て 初めて決定 る事 で ま 。 ◦ Time flies like an arrow.(時間は矢のように飛ぶ) ◦ Time flies like a banana.(「時間バエ」はバナナを好む) • 一般に、トークンを埋め込み空間のベクトルに変換 場合、「意味 近いトークンはベク トル値も近 なる」と期待 れま 、テキストに依存 ない一般的な「意味」と、特定の テキストに置 れ 場合の「意味」は異なりま 。
  72. Transformer モデルの考え方 100 • で、テキスト内のトークンの関係を見て、埋め込みベクトルの値を「 のテキストに る意味」にあう様に更新 る処理(Attention レイヤー)を実装 ま

    。 • 画像データに る畳み込みフィルターは、あるピクセルと周囲のピクセルの関係 ら、画 像の特徴を抽出 ま 、 れに類似 処理と考えられま 。 time flies like a banana テキストに依存 ない 一般的な意味を表現 埋め込みベクトル のテキストに 応 意味を表現 Attention レイヤー
  73. ◦ 先の例では、「flies の Query」と「banana の Key」は内積値 大 なると期待 れま 。

    • 内積値に基づい 重みで、 べてのトークンの Value を合成 ものを新 い埋め込みベク トルの値と て出力 ま 。 • トークン とに、現在の埋め込みベクトルの値 ら、  Query, Key, Value の 3 種類のベクトル値を生成 ま 。 ◦ れらは同 次元のベクトルで、 の次元を「Attention Head のサイズ」と言いま 。 ◦ Query, Key, Value は、 れ れ(トークンの位置に依存 な い)共通のアフィン変換(1 次関数の集まり=活性化関数を持 ない隠れ層)で生成 ま 。 • 「トークン A の意味に、トークン B 及ぼ 影響度」は、 「トークン A の Query」と「トークン B の Key」の内積値 で決まると考えま 。(内積値 大 いと影響 大 い。) Attention Head の仕組み 101 Query Value Key Query Value Key Query Value Key ・・・
  74. Attention Head の仕組み 102 time flies like a banana Key

    Value Query Key Value Query Key Value Query Key Value Query Key Value Query weight Query, Key, Value を生成 weight weight weight weight Query と Key の内積で weight を計算 weight の重みで Value を合成 "flies" の新 い 埋め込みベクトル "flies" の現在の 埋め込みベクトル • 右図は「flies」について、新 い埋め込み ベクトルを出力 る流れで 。 • べてのトークンについて同様の処理を行 いま 。
  75. Multi-Head Attention 103 • 複数の Attention Head を並列に使用 る と

    で、異なる観点での「意味」 抽出で ま 。 • れ れの Attention Head の出力を 1 列につ な ものを新 い埋め込みベクトルの値と ま 。 ◦ 各 Attention Head のサイズは、「元の次元 / Attention Head の個数」に ま 。 れによ り、結合後のベクトル 元の次元に戻りま 。 • 複数の Attention Head らなる、右図のブロッ クを「Multi-Head Attention」と呼びま 。 time flies like a banana 各アテンションヘッド らの出力を結合 Attention Head アテンションヘッド
  76. (参考)RNN と Attention Head の比較 104 • 埋め込みベクトル ら Query,

    Key, Value を生成 る仕組みは、トークンの位置に依存 ないので、 の 意味では、同一のセルを繰り返 使用 る RNN に類似 仕組みと言えま 。 • RNN は隣接 るトークンの相互作用のみを考え のに対 て、Attention Head は べてのトークンの相 互作用を取り入れ 点 大 な違いになりま 。( の結果、Attention Head の処理結果は、トークン の順序に依存 ない とになりま 。) セル セル セル t = 1 t = 2 t = T ・・・ Query Value Key Query Value Key Query Value Key ・・・ RNN Attention Head アフィン変換 (トークンの位置に依存 ない) ウェイトの値は べてのセルで共通
  77. Transformer エンコーダの構造 105 • Multi-Head Attention の後段に、「レイヤー正規化+全 結合層+レイヤー正規化」を繋 もの 「Transformer

    エンコーダ」で 。 ◦ レイヤー正規化と全結合層もトークンの位置に依存 ない、 べてのトークンに共通の計算処理を適用 ま 。 • 一般には、複数の Transormer エンコーダを多段に積み 重ねて利用 ま 。 Transformer エンコーダ レイヤー正規化 全結合層 スキップ接続 レイヤー正規化 マルチヘッド・アテンション
  78. (参考)スキップ接続について 106 • レイヤーに対 て、入力 x に対 る「変化分」を計算 い場合に使用 ま

    。 • 学習の初期に いても(ウェイトを小 い値で初期化 れば)、出力 y 入力 x に近い値に なる め、後続のレイヤーに意味のある情報を伝える と で て、学習 スムーズに進む と期待で ま 。 入力 x 出力 y のレイヤーは x と y の 差分 y - x を計算 ればよい スキップ接続
  79. (参考)レイヤー正規化について 107 • 埋め込みベクトルを            と て、 べての成分についての平均と分散 0, 1 になるように正規化

    上で、成分 とにスケーリング(定数倍 て定数値を加える) ま 。 ◦ スケーリングの定数   は学習対象のパラメータで 。 れは、成分 とに適 ス ケール あるという想定に基づい 仕組みで 。 埋め込みベクトル レイヤー正規化 トークン とに 個別に正規化 σ ≒ 0 の時にエラーにならない ように小 な値を加える
  80. アテンションマスクについて 108 出力データ t = 1 入力データ t = 2

    t = T t = 2 の単語 を予測 t = 3 の単語 を予測 Transformer エンコーダ • Transformer で「次の単語の予測」を行う場合、学習時に、入力トークンよりも後ろのトー クンの情報を参照 ないように Attention Head の処理を制限 る必要 ありま 。 • Attention Head はオプションで「アテンションマスク」を受 取り、 れ れのトークン に対 て、処理対象と るトークンを限定 る と で ま 。 多項分類器 多項分類器 多項分類器 [[1, 0, 0, 0, 0], [1, 1, 0, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0], [1, 1, 1, 1, 1]] t = 1 のトークンに 対 る処理対象 t = 2 のトークンに 対 る処理対象 アテンションマスクの例 ・・・ ・・・
  81. Positional エンコーディングについて 109 • までの実装では、「テキスト内でのトークンの位置」を意識 処理 含まれていま ん。トークン同士の関係は Query と

    Key の内積値 で決まるので、図のようにトークン の位置を入れ替えても出力値は変わりま ん。 アテンションヘッド time flies like a banana アテンションヘッド banana flies like a time <A> <B> <C> <D> <E> <E> <B> <C> <D> <A> 出力値 出力値
  82. Positional エンコーディングについて 110 • 実際には、トークンの位置関係も各トークンの「意味」に影響 るので、何ら の方法で位 置情報を組み込む必要 ありま 。

    • で、最初の埋め込み層で、各トークンを埋め込みベクトルに変換 後、トークンの位 置情報を埋め込みベクトルに変換 ものを加えま 。 time flies like a banana 1 2 3 4 5 トークンと位置情報の 埋め込みベクトルを合計 トークン用の埋め込み層 位置情報用の埋め込み層
  83. Transformer モデルによるテキスト分類 111 • Transformer モデルでテキスト分類を 実装 る場合、最初のトークンに対 る出力値を多項分類器に入力 ま

    。 • 最初のトークンの埋め込みベクトル に、分類に必要な情報 集約 るよう にモデル全体 学習 れるものと期待 ま 。 • アテンションマスクによる参照制限は 行いま ん。(固定長リストに る めの末尾の Padding 部分は参照 ない ようにアテンションマスクを設定 ま 。) t = 1 入力データ t = 2 t = T 多項分類器 ・・・ Positional エンコーディング Transformer エンコーダ Transformer エンコーダ
  84. Transformer モデルによるテキスト分類 112 • 下図は、1 層目と 2 層目の Transformer エンコーダの

    Attention Heads 計算 トーク ン間の Weights(4 つの Attention Heads の最大値を 2 レイヤーで平均)の例で 。
  85. Transformer モデルによるテキスト生成 113 • RNN による実装と同様に、各トークン について「次の単語」の確率分布を予 測 るようにモデルを学習 ま

    。 • 学習後のモデルにテキストの冒頭部分 を入力 ると、最後の出力 ら次の単 語の確率分布 得らるので、 ら 単語をサンプリング て、末尾に付 加える作業を繰り返 ま 。 • 学習時はアテンションマスクにより、 「自分より後ろのトークン」は参照 ないように制限 ま 。 t = 1 入力データ t = 2 t = T 多項分類器 ・・・ Positional エンコーディング Transformer エンコーダ 多項分類器 多項分類器 べてのトークン ID に ついて確率値を出力
  86. (参考)Transformer を用いた LLM の例 115 埋め込みベクトルの次元 Attention Head の個数 Transformer

    エンコーダの段数 Attention Head のサイズ https://arxiv.org/abs/2204.02311 • 2022 年に論文公開 れ モデル(PaLM)では、モデルのサイズに関連 下記の値 公開 れていま 。 ◦ モデルに入力可能なトークン数は 2048 で 。
  87. 117 Transformer のエンコーダとデコーダの違い • Attention 機構の論文では、原文の意味を抽出 る エンコーダと、原文の意味を補助情報と て訳文を 生成

    るデコーダを組み合わ 、翻訳モデル 提 案 れま 。 • の後、エンコーダ を用い LLM と て、 PaLM 開発 れま 。 https://arxiv.org/abs/1706.03762
  88. (参考)Vision Transformer による画像の意味抽出 118 • Vision Transformer (ViT) は、画像データに Transformer

    を適用 るモデルで 。 • 画像を小 なパッチの列に分解 て、モデルに入力 ま 。 https://arxiv.org/abs/2010.11929 • れ れのパッチは、最初のレイヤー で、対応 る「埋め込みベクトル」に変 換 れま 。 • の後は、LLM と同様の Transformer エンコーダで処理を行いま 。 ◦ 複数のパッチの位置関係 ら「画像 の意味」を表 情報 得られると期 待 れま 。
  89. (参考)Vision Transformer による画像の意味抽出 119 https://arxiv.org/abs/2010.11929 • 一例と て、後段に分類モデルを接続 て、画像 を分類

    るモデルを作ると、分類に有用な情報を 持つ部分に Attention の Weight 掛 ると期 待 れま 。
  90. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part04/1. Transformer emotion recognizer.ipynb

    ▪ Transformer によるテキスト分類モデルを emotion データセットで学習 ま 。 ▪ 埋め込みベクトルの次元、Attention Head の個数とサイズ、全結合層のノード数 れ れ 下記のパラメータで指定で ま 。パラメータの値によってモデルの精度 どのように変化 る 、観察 て い。 120 EMBEDDING_DIM = 512 N_HEADS = 4 KEY_DIM = EMBEDDING_DIM // N_HEADS FEED_FORWARD_DIM = 2048
  91. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part04/2. Transformer recipe generator

    training.ipynb ▪ Transformer によるテキスト生成モデルを「レシピ」のデータセットで学習 ま 。 ▪ 「Part04/1. Transformer emotion recognizer.ipynb」と同様に下記のパラメータ 指定で ま 。 ◦ Part04/3. Transformer recipe generator analysis.ipynb ▪ 学習後のテキスト生成モデルを用いて、レシピのテキストを生成 ま 。 121 EMBEDDING_DIM = 512 N_HEADS = 4 KEY_DIM = EMBEDDING_DIM // N_HEADS FEED_FORWARD_DIM = 2048
  92. DCGAN の仕組み 123 • DCGAN では、エンコーダを用い に、デコーダ部分 を直接に学習 ま 。

    • デコーダ 生成 画像と学習用の画像を識別 るモデルを別途用意 て 、 れらを交 互に学習 る とで、互いの性能を高めてい ま 。 識別モデル デコーダ 学習データ 本物?偽物?
  93. DCGAN の仕組み 124 識別モデル デコーダ 学習データ B 画像セット A 潜在空間

    らランダムに 入力値をサンプリング P(A) : A 本物である確率 P(B) : B 本物である確率 識別モデル 出力 る P(A) 大 なる方向に パラメーターを修正 P(A) 小 、P(B) 大 なる 方向にパラメーターを修正
  94. 学習後の潜在空間の様子 127 Smile Man Woman Neutral Neutral Woman Smiling Woman

    Smiling Man Neutral Man http://arxiv.org/abs/1511.06434 • DCGAN の論文では、学習後の潜在空間には、画像の種類を表現 る「方向」 存在 る と 指摘 れていま 。
  95. 「データ分布」の再現機能としての生成モデル 129 • 32 × 32 ピクセルの画像データは、1,024 次元空間の点にマッピングで ま 。

    の際、 「整っ 画像」に対応 るい つ のクラスター で ていると想像で ま 。 • VAE のデコーダは、潜在空間の原点付近の点を「整っ 画像」の点にマッピング ま 。 れは、潜在空間上の「標準正規分布のデータ」を 1,024 次元空間内の「整っ 画像のクラ スター」に変換 る機能と考えられま 。 潜在空間 画像空間
  96. 「データ分布」の再現機能としての生成モデル 130 • の考え方を理解 る めに、1,024 次元空間の点(=画像データ)ではな 、2 次元平面 に広

    っ 点を学習データと て、変分オートエンコーダ(VAE)を学習 ま 。 • 下図のように、潜在空間の標準正規分布 らサンプリング データ 、デコーダによっ て、学習データの分布に変換で るようになると期待 れま 。 潜在空間 学習データ デコーダ 標準正規分布 "Moons" 分布
  97. 「データ分布」の再現機能としての生成モデル 131 潜在空間 デコーダ エンコーダ サンプラー Moons 分布 • 右図のように、Moons

    分布の各点を学習 データと て、変分オートエンコーダを 学習 ま 。 • エンコーダは、学習データ全体を潜在空 間上の標準正規分布に近 なるように マッピング ま 。 • の結果、デコーダは、潜在空間の標準 正規分布を元の Moons 分布に変換 ると 期待 れま 。
  98. Diffusion モデルの元になるアイデア 134 • 潜在空間を介 に、画像データの空間(画像空間) 内で直接に、「ノイズ画像のクラスター」を「整っ 画像のクラスター」に変換 るモデル で

    れば、生 成モデルと て利用で ま 。 ◦ 画像空間に る標準正規分布のクラスター (各ピクセル値 標準正規分布で分布 画像 の集合)を「ノイズ画像のクラスター」と考え ま 。 • 「ノイズ画像」は簡単に用意で る一方、「整っ 画 像」は簡単には用意で ない点 ポイントになりま 。 「整っ 画像」 のクラスター 「ノイズ画像」 のクラスター 画像空間のイメージ図
  99. Diffusion モデルの考え方 135 ノイズ画像の集合 学習用の画像の集合 Diffusion プロセス 標準正規分布 Moons 分布

    • 簡単の めに画像空間を2次元と仮定 て説明 ま 。平面上の 1 つの点 1 つの画像デー タに対応 ると考えて い。 • 学習用画像データの集合を標準正規分布のノイズ画像に変換 る「Diffusion プロセス」を 用意 て、 れと逆向 の変換(再構成プロセス)を機械学習モデルで実現 ま 。 再構成プロセス
  100. Diffusion プロセスの構成 136 • 個々の学習用の画像  に標準正規 分布のノイズ画像の 1 つ  を割り

    当てま 。 • 次式で、元の画像をノイズ画像に置 換えてい ま 。 ノイズ画像の集合 学習用の画像の集合 標準正規分布 ・・・ t = 0.0 t = 0.1 t = 0.2 t = 0.3 Diffusion プロセス
  101. ノイズ予測モデルの学習 137 • Signal rate   と Noise rate  

    は、右図の「オフセット ・コサインスケジュール」 よ 用いられま 。 • 各タイムステップで       を用意 て、「ノイズ予 測モデル」を学習 ま 。 オフセット・コサインスケジュール を予測 ノイズ予測モデル ・・・ t = 0.0 t = 0.1 t = 0.2 t = 0.3 Diffusion プロセス
  102. 学習後のモデルによる画像生成の流れ 139 • 一例と て、Diffusion プロセスのステップを t = 0, 0.1,

    0.2, …, 1.0 の 10 ステップと ま 。 • ノイズ画像(t = 1.0) らノイズ成分を予測 て、オリジナル画像の方向に 1 ステップ分 修正 ま 。 • 得られ 画像(t = 0.9) ら同様の予測を行 い、オリジナルデータの方向に 1 ステップ分 修正 ま 。 • れを 10 ステップ分繰り返 て、オリジナ ル画像を近似的に再現 ま 。 t = 1.0 モデルの予測 t = 0.9 t = 0.8 オリジナル 予測の方向に 1 ステップ分修正
  103. 140 Diffusion モデルの実装 — ノイズ予測モデル • ノイズ予測モデルは、ノイズを含むデータ  と Noise rate  を元に

    て、ノイズ成分   を予測 ま (*)。 diffusion_model = models.Sequential(name='diffusion_model') diffusion_model.add(layers.Input(shape=(3,))) diffusion_model.add(layers.Dense(64, name='expand')) diffusion_model.add(layers.Dense(64, activation='relu', name='feedforward1')) diffusion_model.add(layers.Dense(64, activation='relu', name='feedforward2')) diffusion_model.add(layers.Dense(64, activation='relu', name='feedforward3')) diffusion_model.add(layers.Dense(64, activation='relu', name='feedforward4')) diffusion_model.add(layers.Dense(2, name='estimated_noise')) ノイズを含むデータと Noise rate を受 取る データに含まれる ノイズ成分を出力 る (*) t = 1 の最終状態でも S R = 0.02 なので、オリジナルデータの  痕跡はわ に残っていま 。モデルは、t = 1 の場合でも、  のわ な痕跡との違いを発見 るように学習 れま 。 ノイズを含む データ を予測 ノイズ予測モデル
  104. ノイズ画像の集合 学習用の画像の集合 • Diffusion プロセスを用意 て、 ら ま まなタイムステップ t

    の三つ組        を集めま 。 • 学習画像とノイズ画像の対応づ は任 意なので、偏らないように複数の対応 付 による、複数の Diffusion プロセス を用意 ま 。 • れ れの対応付 について、複数の ランダムな t についてのデータを用意 ま 。 Diffusion モデルの実装 — 学習データの集め方 141 標準正規分布 学習データ を予測 ノイズ予測モデル Diffusion プロセスの用意 三つ組データの用意 入力データ 正解ラベル
  105. Diffusion モデルの実装 — 学習データの集め方 142 を予測 ノイズ予測モデル 三つ組データの用意 noisy_data nise_data

    num_examples = len(train_data) inputs, labels = [], [] for _ in range(16): noise_data = np.random.multivariate_normal( [0, 0], [[1, 0], [0, 1]], size=num_examples) for _ in range(32): # select 32 random time steps t = np.random.uniform(0, 1, size=1) noise_rate, signal_rate = diffusion_schedule(t) noisy_data = signal_rate * train_data + noise_rate * noise_data noise_rate_stack = np.vstack(np.array([noise_rate]*num_examples)) inputs.append(np.hstack((noisy_data, noise_rate_stack))) labels.append(noise_data) # predict noise_data inputs, labels = np.vstack(inputs), np.vstack(labels) 標準正規分布 正解ラベル 入力データ タイムステップを ランダムに選択 16 種類の対応付 でデータを用意 32 個のタイム ステップを選択 noise_rate
  106. 学習後のモデルによるオリジナルデータの再現 143 • 一例と て、Diffusion プロセスのステップを t = 0, 0.1,

    0.2, …, 1.0 の 10 ステップと ま 。t = 1.0 のノイズデータ ら t = 0.9 のデータを再現 て、 らに れ ら t = 0.8 のデータ を再現 る、という処理を t = 0 まで繰り返 ま 。 • 1 ステップ前のデータは次の様に計算 ま 。 ◦ 現在のデータ(noisy_data)に対 てモデル 予測 ノイズ(noise_data)を用いて、オリジナ ルデータを次の計算で再現 ま 。 ◦ 再現 (近似的な)オリジナルデータに対 て、1 ステップ前のノイズを再度加えま 。 estimated_original_data = (noisy_data - noise_rate * noise_data) / signal_rate noisy_data = signal_rate * estimated_original_data + noise_rate * noise_data 1 ステップ前の値を使う 1 ステップ前の 予測データ 得られる 1 ステップ前の値を使う
  107. 学習後のモデルによるオリジナルデータの再現 144 • オリジナルデータを再現 るコードの例で 。 def reverse_diffusion(initial_data, steps=100): denoise_history

    = [initial_data] num_examples = len(initial_data) step_size = 1 / steps noisy_data = initial_data for step in range(steps): # Estimate noise_data from the current noisy_data t = 1 - step * step_size noise_rate, signal_rate = diffusion_schedule(t) noise_rate_stack = np.array([noise_rate]*num_examples).reshape(num_examples, 1) input_data = np.hstack((noisy_data,noise_rate_stack)) noise_data = diffusion_model.predict(input_data, verbose=0) # Reconstruct the estimated original data estimated_original_data = (noisy_data - noise_rate * noise_data) / signal_rate # Get new noisy_data (1-step prior) next_noise_rate, next_signal_rate = diffusion_schedule(t-step_size) noisy_data = next_signal_rate * estimated_original_data + next_noise_rate * noise_data denoise_history.append(noisy_data) return denoise_history 現在のステップ値 t に対応 る Noise rate / Signal rate を取得 現在のデータと Noise rate のペア らノイズを予測 ノイズを取り除い オリジナルデータを計算 1 つ前のステップ値に対応 る Noise rate / Signal rate を取得 て 1 つ前のステップのデータを再構成 指定 ステップ数(steps)によって、ステップ値 t の取り得る 値 変わりま 、学習時は 0 < t < 1 の範囲の ま まな t に対 るデータで学習 ているので問題ありま ん。
  108. Diffusion モデルの学習例 145 • 2 次元平面のデータについて Diffusion モデルを適用 例で 。"Moons"

    データセットを 学習データ、標準正規分布をノイズデータと て学習 ていま 。下図は、標準正規分布ノ イズ らオリジナルデータを再現 るステップを表 ま 。
  109. Diffusion モデルが優れている理由 147 • DCGAN は、デコーダと識別器を並列に学習 る必要 あり、学習の進捗のバランス 重要 になりま

    。 ◦ 識別器 弱 るとデコーダは整っ 画像を生成 る必要 ありま ん。 ◦ 識別器 強 るとデコーダは整っ 画像を生成 る方法 発見で ま ん。 ◦ 識別器に偏り ある(特定の特徴をもっ 画像を「本物」と判別 る)とデコーダは特定の画像ば り生成 ま 。 • 変分オートエンコーダも内部的には2つのモデル(エンコーダとデコーダ)を学習 て り、類似の課題 ありま 。 ◦ 最終的な潜在空間の状態 エンコーダの学習過程に依存 て り、特に、誤差関数に る KL ダ イバージェンスの重みによって、結果 大 変わりま 。 ◦ 潜在空間の分布 標準正規分布 ら れると、整っ 画像 再現 れに なりま 。
  110. Diffusion モデルが優れている理由 148 • 一方、Diffusion モデルには、次のような特性 ありま 。 ◦ 単一のモデルを学習

    る め、複数モデルのバランスを考える必要 ありま ん。 ◦ 学習データと標準正規分布ノイズを明示的に紐づ て り、標準正規分布 ら安定的に整っ 画像 再現で ま 。 ◦ 画像生成のステップを複数に分 る とで、安定的に整っ 画像 生成で ま 。
  111. VQ-VAE のアイデア 150 • 最終的な潜在空間の状態 学習に依存 る(ど に「整っ 画像に対応 る点」

    ある 分 りに い)という VAE の課題を根本的に解決 るアイデアと て、Vector Quantized VAE(VQ-VAE) ありま 。 • VQ-VAE では、潜在空間を「画像の各部位の役割を示 ベクトル値の集合」に置 換える とで、画像の特徴をダイレクトに表現 ま 。 1 つの画像に対応 「潜在空間の値」のイメージ ・・・ コードブック 空 空 空 海 海 海 雲 雲 海 海 船 船 海 島 島 海 海 海 島 島 ◦ 「各部位の役割を示 ベクトル値」は一定数の ベクトル値を事前に用意 ま 。 れを「コー ドブック」と呼びま 。コードブックの個々の ベクトル値は、直感的には、「空」「雲」 「海」などの意味を表 と考えま 。 ◦ コードブックの値のみを組み合わ る とで、 「整っ 画像に対応 る潜在空間の値」 構成 や なりま 。 空 海 雲 島 海 海 島 島 島
  112. VQ-VAE の学習処理 151 • エンコーダは、元の画像に対 て「画像サイズを縮小 て(縦横のピクセル数を減ら て)各ピクセル値 をベクトル値に置 換える」という処理を行いま

    。 らに、各ベクトル値をコードブックに載っている ベクトル値(値 一番近いもの)に置 換えて らデコーダに入力 ま 。 • 勾配ベクトルの計算時は「コードブックに載っている値への置 換え(不連続関数)」はスキップ ま 。(不連続関数部分を近似的に恒等関数に置 換えて勾配ベクトルを計算 ま 。) • 画像生成時は、「潜在空間の各点 にコードブックの値を割り当てる モデル」を別途学習 て使いま 。(整っ 画像 ら得られる潜 在空間の値を教師データと て、 PixelCNN を学習 ま 。) https://arxiv.org/abs/1711.00937
  113. VQ-VAE による学習例 152 • 入力画像:128 × 128 ピクセルのカラー画像 ◦ 画像は

    256 階調(RGB の各レイヤーのピクセル値は 256 = 28 通りの値を取る)なので、1 つの画 像の情報量は 128 × 128 × 3 × 8 ビット • コードブック:512 個の 1 次元ベクトル(つまり、512 = 29 種類の離散値) • 潜在空間のサイズ:32 × 32 ピクセル ◦ 潜在空間の情報量は 32 × 32 × 9 ビットなので、画像の情報量は約 1/40 に削減 https://arxiv.org/abs/1711.00937 デコーダ らの出力 エンコーダへの入力
  114. • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part05/2. VAE distribution conversion example.ipynb

    ▪ 変分オートエンコーダでデータ分布の変換モデルを実装 例で 。 ▪ 誤差関数に る KL ダイバージェンスの重みを変化 て、結果 どのように変わる 観 察 て い。 ◦ Part05/3. Diffusion model example.ipynb ▪ 2 次元空間のデータに Diffusion モデルを適用 例で 。 def custom_loss(y_true, y_pred): mean, log_var, pred = y_pred[:, 0:2], y_pred[:, 2:4], y_pred[:, 4:6] reconstruction_loss = losses.mse(y_true, pred) kl_loss = tf.reduce_mean(tf.reduce_sum( -0.5 * (1 + log_var - tf.square(mean) - tf.exp(log_var)), axis=1)) loss = reconstruction_loss + 0.8 * kl_loss return loss 演習 153 KL ダイバージェンスの重み
  115. ラベル情報を用いたデコーダの学習 • 条件付 変分オートエンコーダでは、デコーダにラベル情報を入力 る とで、生成 る画 像を指定で ま 。

    • の際、単純なラベル値ではな 、「画像の説明文を Transformer モデルのテキストエン コーダで埋め込みベクトルに変換 値」を入力 れば、自然言語テキストで生成画像を指 定で る様になると期待で ま 。 155 潜在空間 × "a photograph of an astronaut riding a horse" エンコーダ デコーダ 画像データ テキスト エンコーダ テキストの 埋め込みベクトル
  116. CLIP による埋め込みベクトルの生成 • 実際に れを実現 るには、テキストエンコーダは、入力テキスト ら「画像の種類を表 情報」を抽出 る様に学習 て

    必要 ありま 。 ◦ れにより、入力テキストの文面 学習に使っ テキストと異なっていても、「画像の 種類」と て同 意味内容であれば、類似の画像 生成で るようになりま 。 156 • れを実現 るモデルの一例と て、CLIP ありま 。「画像と の説明文」のペアを学習データと て 用意 て 、画像とテキストを個別にエンコーダで 変換 て、得られる埋め込みベクトルの類似度 大 なるようにエンコーダを学習 ま 。 ◦ 類似 画像は類似 埋め込みベクトルにな るので、対応 るテキストの埋め込みベクトル も類似 ものになりま 。 https://github.com/openai/CLIP
  117. CLIP による埋め込みベクトルの特徴 • 画像 A と画像 B 画像データと て似ていると埋め込みベクトルは似ている ◦

    • 学習の結果、画像とペアになるテキストの埋め込みベクルは似ている ◦ • れらの結果、類似画像のテキストは埋め込みベクトル 似ている ◦ 157
  118. Diffusion モデルとテキストエンコーダの組み合わせ • Diffusion モデルにテキストエンコーダ らの入力を組み合わ る とで、自然言語テキス ト ら画像を生成

    る ま まなモデル 提案 れて り、一例と て、次の様なバリエー ション ありま 。 ◦ テキストエンコーダを使わ にテキスト(トークン ID の列)を のまま入力 ◦ CLIP のテキストエンコーダ らの出力(テキストの埋め込みベクトル I)を利用 る ◦ CLIP のテキストエンコーダ らの出力を らにイメージエンコーダ側の出力(対応 る画像の埋め込みベクトル T)に置 換えるモデルを追加 ▪           なので、    よりも    の方 類似度 高い 158
  119. Diffusion モデルとテキストエンコーダの組み合わせ • 右図は、前ページの 3 つの 方法を比較 例で 。下 にい

    ほど、入力テキスト の意味によりマッチ 画 像 生成 れている と わ りま 。 159 https://arxiv.org/abs/2204.06125
  120. Stable Diffusion について 160 ◦ 潜在空間は、オートエンコーダで事前に用 意 て ま 。LDM

    で得られ 「整っ 画像に対応 る点」をデコーダに入力 て 実際の画像を出力 ま 。 • らに、「画像の種類を表 埋め込みベクトル」 を入力 る とで、生成 る画像を操作で るよ うに設計 れていま 。 • オリジナルの Diffusion モデルは、高次元の画像空間で直接に「整っ 画像」と「ノイズ画 像」の分布を変換 ま 。 • Stable Diffusion の Latent Diffusion Model(LDM)は、潜在空間の中で、「乱数で分布 集合」と「整っ 画像に対応 る点の集合」を変換 ま 。 https://arxiv.org/abs/2112.10752
  121. PaLI のアーキテクチャー 161 https://arxiv.org/pdf/2209.06794.pdf • PaLI は、テキストと画像のペア らテキストを出力 るモデルで 。

    • テキストは通常の Transformer エンコーダに入力 ま 。画像は Vision Transformer で 「画像の意味を表 埋め込みベクトル」に変換 後に、テキスト用の Transoformer エン コーダに入力 ま 。 ◦ れでテキストと画像を組み合わ 表現の「意味」 抽出で ると期待 ま 。 • 後段に Transformer デコーダを接続 て、 の意味に基づい 出力テキストを生成 ま 。
  122. 162 Gemini のアーキテクチャー https://storage.googleapis.com/deepmind-media/gemini/gemini_1_report.pdf • モデルの詳細は公開 れていま ん 、PaLI のアーキテクチャーを拡張

    ものと想像 れ ま 。テキストと画像に加えて、音声と動画のデータも入力可能で、 れ れのデータ形式 に応 エンコーダ 用意 れていま 。 • 後段にテキスト生成用のデコーダと画像生成用のデコーダを接続 て、テキストと画像の両 方を出力 ま 。
  123. 163 Gemini のデモ動画 https://www.youtube.com/watch?v=UIZAiXYceBI ※ の動画はデモ用に編集 れ もので 。実際の Gemini

    の処理内容は下記の Blog を参照  https://developers.googleblog.com/2023/12/how-its-made-gemini-multimodal-prompting.html