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 2024/06/29 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 次関数を用意 て、 れ れのラベルに対 る計算値を得ま 。 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.Dense(10, activation='softmax', input_shape=(784,), 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.Dense(256, activation='relu', input_shape=(784,), name='feedforward1')) model.add(layers.Dense(512, activation='relu', name='feedforward2')) model.add(layers.Dense(256, 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 [==============================] - 8s 14ms/step

    - loss: 0.2312 - acc: 0.9312 - val_loss: 0.1070 - val_acc: 0.9649 Epoch 2/10 469/469 [==============================] - 5s 11ms/step - loss: 0.0875 - acc: 0.9725 - val_loss: 0.0869 - val_acc: 0.9729 Epoch 3/10 469/469 [==============================] - 4s 8ms/step - loss: 0.0600 - acc: 0.9809 - val_loss: 0.0781 - val_acc: 0.9761 Epoch 4/10 469/469 [==============================] - 4s 9ms/step - loss: 0.0433 - acc: 0.9865 - val_loss: 0.0882 - val_acc: 0.9744 Epoch 5/10 469/469 [==============================] - 4s 8ms/step - loss: 0.0366 - acc: 0.9882 - val_loss: 0.1135 - val_acc: 0.9684 Epoch 6/10 469/469 [==============================] - 4s 8ms/step - loss: 0.0278 - acc: 0.9909 - val_loss: 0.0788 - val_acc: 0.9786 Epoch 7/10 469/469 [==============================] - 4s 9ms/step - loss: 0.0240 - acc: 0.9923 - val_loss: 0.0855 - val_acc: 0.9795 Epoch 8/10 469/469 [==============================] - 4s 8ms/step - loss: 0.0227 - acc: 0.9925 - val_loss: 0.0774 - val_acc: 0.9798 Epoch 9/10 469/469 [==============================] - 4s 8ms/step - loss: 0.0192 - acc: 0.9937 - val_loss: 0.0785 - val_acc: 0.9812 Epoch 10/10 469/469 [==============================] - 4s 9ms/step - loss: 0.0161 - acc: 0.9948 - val_loss: 0.0913 - val_acc: 0.9786 テストデータに 対 る正解率 97.9% 予測を誤っ 例について確率値を表示
  15. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part01/2. Multilayer model MNIST

    classification.ipynb ▪ 多層ニューラルネットワークによる多項分類器を Keras で実装 て、MNIST データセットの 分類を行いま 。 ▪ モデルの構成(レイヤー数、レイヤー内のノード数)を変更 て、結果 どのように変わる 観察 て い。 21 model = models.Sequential(name='multilayer_model') model.add(layers.Dense(256, activation='relu', input_shape=(784,), name='feedforward1')) model.add(layers.Dense(512, activation='relu', name='feedforward2')) model.add(layers.Dense(256, 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.Reshape((28, 28, 1), input_shape=(784,), 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(1024, activation='relu', name='hidden')) model.add(layers.Dense(10, activation='softmax', name='softmax'))
  19. 畳み込みフィルターの動的な学習 28 Epoch 1/10 469/469 [==============================] - 10s 9ms/step -

    loss: 0.1925 - acc: 0.9441 - val_loss: 0.0676 - val_acc: 0.9795 Epoch 2/10 469/469 [==============================] - 5s 10ms/step - loss: 0.0571 - acc: 0.9821 - val_loss: 0.0576 - val_acc: 0.9817 Epoch 3/10 469/469 [==============================] - 3s 5ms/step - loss: 0.0324 - acc: 0.9896 - val_loss: 0.0530 - val_acc: 0.9831 Epoch 4/10 469/469 [==============================] - 2s 5ms/step - loss: 0.0207 - acc: 0.9935 - val_loss: 0.0423 - val_acc: 0.9856 Epoch 5/10 469/469 [==============================] - 2s 5ms/step - loss: 0.0136 - acc: 0.9956 - val_loss: 0.0473 - val_acc: 0.9847 Epoch 6/10 469/469 [==============================] - 2s 5ms/step - loss: 0.0098 - acc: 0.9969 - val_loss: 0.0508 - val_acc: 0.9857 Epoch 7/10 469/469 [==============================] - 2s 5ms/step - loss: 0.0075 - acc: 0.9978 - val_loss: 0.0500 - val_acc: 0.9857 Epoch 8/10 469/469 [==============================] - 3s 6ms/step - loss: 0.0050 - acc: 0.9985 - val_loss: 0.0458 - val_acc: 0.9871 Epoch 9/10 469/469 [==============================] - 2s 5ms/step - loss: 0.0044 - acc: 0.9986 - val_loss: 0.0547 - val_acc: 0.9855 Epoch 10/10 469/469 [==============================] - 3s 6ms/step - loss: 0.0071 - acc: 0.9978 - val_loss: 0.0556 - val_acc: 0.9867 テストデータに 対 る正解率 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.Reshape((28, 28, 1), input_shape=(784,), 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(1024, 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.Reshape((32, 32, 1), input_shape=(32*32,), 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.Dense(4 * 4 * 128, input_shape=(2, ), 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_input = tf.keras.Input(shape=(32*32,)) model = models.Model(model_input, decoder(encoder(model_input))) 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 正規分布
  34. ◦ エンコーダ 出力 る正規分布 標準正規分布 ら大 外れない様に、誤差関数に罰則項を追加 ま 。 •

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

    い。 49 encoder = models.Sequential(name='encoder') encoder.add(layers.Reshape((32, 32, 1), input_shape=(32*32,), 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 sampler

    = models.Sequential(name='sampler') sampler.add(layers.Lambda( lambda x: x[:, 0:2] + tf.exp(0.5 * x[:, 2:4]) * tf.random.normal(shape=(tf.shape(x)[0], 2)), input_shape=(4,), name='sampled_embedding')) デコーダに入力 る 値をランダムに選択 潜在空間 標準正規分布 × 標準正規分布
  37. 変分オートエンコーダの実装例(デコーダ) • デコーダは、サンプラー 選択 潜在空間の点 ら画像を生成 ま 。 51 decoder

    = models.Sequential(name='decoder') decoder.add(layers.Dense(4 * 4 * 128, input_shape=(2, ), 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:] 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_input = tf.keras.Input(shape=(32*32,)) model_output = layers.Concatenate(name='prediction_with_mean_log_var')( [encoder(model_input), decoder(sampler(encoder(model_input)))]) model = models.Model(model_input, model_output) model.compile(optimizer='adam', loss=custom_loss) デコーダの出力 エンコーダの出力 エンコーダ サンプラー デコーダ 誤差関数 正解ラベル
  40. ラベルデータの利用 • 変分オートエンコーダは、ラベルデータを使わ に、画像の特徴 ら、潜在空間に画像の種類 とのクラスターを生成 る と で ま

    。 • ラベルデータを明示的に使用 る事で、次の様な 応用 可能になりま 。 ◦ マルチタスク学習 ⇨ ラベル とのより明確なクラスターを生成 ◦ 条件付 変分オートエンコーダ ⇨ ラベル指定で特定の画像を生成 56
  41. 演習 57 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ 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:] 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. 分類モデルとの同時学習 • 潜在空間の値 らラベルを予測 る分類モデルを同時に学習 ま 。 • 分類モデルの立場 らは、潜在空間の中でラベル

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

    ま 。 • エンコーダの出力値、デコーダ らの出力イメージ、分類の予測値を同時に出力 るモデル を定義 て、 のモデルに対 て学習処理を行いま 。 60 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. マルチタスク学習の実装例 61 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. マルチタスク学習による学習結果 • ラベル とに、より明確なクラスター で て いる と 分 りま

    。 • クラスターの境界 広い め、「中間状態」の 画像 生成 れや い可能性 ありま 。 62
  46. 演習 64 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ 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 表現のラベルデータを付加 データを用意 ま 。 67 ラベル: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. 条件付き変分オートエンコーダの実装例 • デコーダには、サンプラー の出力値に加えて、ラベル 値を入力 るようにモデル を構成 ま 。 68

    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. 条件付き変分オートエンコーダの学習結果 • れまでと異なり、ラベル とのクラスターはで ていま ん。 ◦ デコーダは、追加で受 取るラベル値 利用で

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

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

    。 れにより、複数の種類を合成 新 い画像 得られま 。 72 Trouser と Shirt のラベルを同時に指定 Bag と Ankle Boot のラベルを同時に指定
  52. 演習 73 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ 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 を出力 ま 。 の値は、次の時 刻のデータを処理 る際に利用 れま 。隠れ状態には、 れまでの処理結果の情報 埋め 込まれているものと期待 れま 。 76 セル セル セル t = 1 入力データ t = 2 t = T ・・・ ウェイトの値は べてのセルで共通
  54. LSTM の仕組み • LSTM のセルは、「隠れ状態 h」と「セル状態 c」の 2 種類の情報を伝達 ま

    。隠れ状態 は、直前の出力値に一致 ま 。 ◦ 隠れ状態とセル状態は同 次元のベクトル値で、具体的な次元数はハイパーパラメーターと て利 用者 指定 ま 。 77 • 大雑把には、次の様に理解 る事 で ま 。 ◦ セル状態に、 れまでの処理結果の情報 保存 れま 。 ◦ 隠れ状態と新 い入力値を用いて、セル状態の情 報を更新 ま 。(不要な情報を削除 て、新 い情報を追加 ま 。) ◦ 更新後のセル状態の情報を用いて、「隠れ状態+ 入力値」 ら出力値を生成 ま 。 ◦ 隠れ状態は短期的な(=直前の)情報、セル状態 は長期的な情報を伝達 ると考えられま 。 不要な情報 を削除 新 い情報 を追加 セル状態を利用 て 「直前+現在」の情報 ら出力値を生成 「直前+現在」 の情報 長期的な 情報
  55. LSTM の利用方法 • 時系列データ全体 ら 1 つの予測値 必要な場合は、最後のセルの出力値のみを利用 ま 。一方、各時刻に対

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

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

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

    ま 。事前に用意 れ トークン化ツールを用 いて変換 る ともで ま 。 81 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 をテキストに再変換 トークン化ツール による処理の例
  59. トークンの埋め込み表現について • テキストデータをニューラルネットワークで処理 る場合、最初の「埋め込み層」で れ れのトークン ID を高次元空間の埋め込みベクトルに変換 ま 。

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

    埋め込み層:トークン ID の値の範囲(VOCAB_SIZE)、埋め込み ベクトルの次元(512) ◦ 双方向 LSTM: 隠れ状態の次元(512、 よび、256)、 べての セルの出力値を使用 る どう (return_sequences) • 過学習を防止 る めのドロップアウト層 挟まれていま 。 83 lstm_model = models.Sequential(name='Bidirectional_LSTM_classifier') lstm_model.add(layers.Embedding(VOCAB_SIZE, 512, input_shape=(None,), 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(1024, 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, 1] [N, 512] [N, 512*2] [256*2] [1024] トークン数 N
  61. (参考)ドロップアウト層について • ドロップアウト層は、モデルの学習時に、2つのレイヤー間の接続の一部をランダムに切断 ま 。 ◦ 例えば、512 次元のベクトル値(= 512 個の実数値)を受

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

    recognizer.ipynb ▪ LSTM によるテキスト分類モデルを emotion データセットで学習 ま 。 ▪ ま まなテキストに対 る予測結果を確認 てみて い。 input_text = [ "I am so heartbroken that I don't know what to do.", "I am happy to be here with you.", "I'm caring about you as your mother.", "I'm irritated with your behavior.", "I'm afraid of what might happen to the people I love.", "I was shocked to see the broken window."]
  63. RNN による「次の単語」の予測 • RNN で「次の単語」を予測 る場合、トークン ID の値をカテゴリーラベルと て、多項分 類器でトークン

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

    文字 シフト ものを正解ラベルと ま 。 89 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] ・・・
  65. RNN によるテキスト生成 • 学習後のモデルにテキストの冒頭部分を入力 ると、最後の出力 ら次の単語の確率分布 得られま 。 ら単語をサンプリング て、末尾に付

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

    ま 。 • 温度パラメーター T 小 いほど実行 と の変動 小 なりま 、同 文章 繰 り返 れる問題 発生 や なりま 。 91 91 T = 1.0 T = 0.5 T = 0.1 温度パラメーター T による分布の変化
  67. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part03/2. LSTM recipe generator

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

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

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

    • の内積値の重みで、 べてのトークンの Value を合成 ものを新 い埋め込みベクトル の値と て出力 ま 。 • トークン とに、現在の埋め込みベクトルの値 ら、  Query, Key, Value の 3 種類のベクトル値を生成 ま 。 ◦ れらは同 次元のベクトルで、 の次元を「Attention Head のサイズ」と言いま 。 ◦ Query, Key, Value は、 れ れ(トークンの位置に依存 な い)共通のアフィン変換(1 次関数の集まり=活性化関数を持 ない隠れ層)で生成 ま 。 • 「トークン A の意味に、トークン B 及ぼ 影響度」は、 「トークン A の Query」と「トークン B の Key」の内積値 に比例 ると考えま 。 Attention Head の仕組み 98 Query Value Key Query Value Key Query Value Key ・・・
  71. Attention Head の仕組み 99 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」について、新 い埋め込み ベクトルを出力 る流れで 。 • べてのトークンについて同様の処理を行 いま 。
  72. Multi-Head Attention 100 • 複数の Attention Head を並列に使用 る とで、異なる

    観点での「意味」 抽出で ま 。 • れ れの Attention Head の出力を 1 列につな もの を新 い埋め込みベクトルの値と ま 。 ◦ 各 Attention Head のサイズは、典型的には、「元の次元 / Attention Head の個数」(端数は切り捨て)に ま 。 ◦ 結合後のベクトルを「元の次元」に戻 めに、アフィン変 換(活性化関数を持 ない隠れ層)で次元を調整 ま 。 • 複数の Attention Head らなる、右図のブロックを   「Multi-Head Attention」と呼びま 。 time flies like a banana Attention Head Attention Head 各 Attention Head らの出力を結合 1 次関数で次元を戻
  73. (参考)RNN と Attention Head の比較 101 • 埋め込みベクトル ら 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 3 種類のアフィン変換 (トークンの位置に依存 ない) ウェイトの値は べてのセルで共通
  74. Transformer エンコーダの構造 102 • Multi-Head Attention の後段に、「レイヤー正規化+全結合層+レイヤー正規化」を繋 て、最後に(活性化関数を持 ない)隠れ層で元の埋め込みベクトルと同 次元に変換

    る 処理を加え もの  「Transformer エンコーダ」になりま 。 • 一般には、複数の Transormer エンコーダを多段に積み重ねて利用 ま 。 Transformer エンコーダ スキップ接続 スキップ接続
  75. (参考)スキップ接続について 103 • レイヤーに対 て、入力 x に対 る「変化分」を計算 い場合に使用 ま

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

    1 になるように正規化 上で、成分 と にスケーリング(定数倍 て定数値を加える) ま 。 ◦ スケーリングの定数   は、l に依存 ない学習対象のパラメータで 。 れは、成 分 とに適 スケール あるという想定に基づい 仕組みで 。 埋め込みベクトル レイヤー正規化 ベクトル値 極端に 大 な値にならない σ ≒ 0 の時にエラーにならない ように小 な値を加える
  77. アテンションマスクについて 105 出力データ 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 のトークンに 対 る処理対象 アテンションマスクの例 ・・・ ・・・
  78. Positional エンコーディングについて 106 • までの実装では、「テキスト内でのトークンの位置」を意識 処理 含まれていま ん。トークン同士の関係は Query と

    Key の内積値 で決まりま 。 • 実際には、トークンの位置関係も各トークンの「意味」に影響 るので、何ら の方法で位 置情報を組み込む必要 ありま 。 • で、最初の埋め込み層で、各トークンを埋め込みベクトルに変換 後、トークンの位 置情報を埋め込みベクトルに変換 ものを加えま 。 time flies like a banana 1 2 3 4 5 トークンと位置情報の 埋め込みベクトルを合計
  79. Transformer モデルによるテキスト分類 107 • Transformer モデルでテキスト分類を 実装 る場合、最初のトークンに対 る出力値を多項分類器に入力 ま

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

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

    。 • 学習後のモデルにテキストの冒頭部分 を入力 ると、最後の出力 ら次の単 語の確率分布 得らるので、 ら 単語をサンプリング て、末尾に付 加える作業を繰り返 ま 。 • 学習時はアテンションマスクにより、 「自分より後ろのトークン」は参照 ないように制限 ま 。 t = 1 入力データ t = 2 t = T 多項分類器 ・・・ Positional エンコーディング Transformer エンコーダ 多項分類器 多項分類器 べてのトークン ID に ついて確率値を出力
  82. Transformer モデルによるテキスト生成 110 • 下図は、Transformer エンコーダの Attention Heads 計算 トークン

    間の Weights(8つの Attention Heads の平均値)の例で 。 • 最下行の例では、chicken, :, mix, garlic, bowl などの単語に注目 て、 次の単語を予測 ようと ている と 分 りま 。
  83. (参考)Transformer を用いた LLM の例 112 埋め込みベクトルの次元 Attention Head の個数 Transformer

    エンコーダの段数 Attention Head のサイズ https://arxiv.org/abs/2204.02311 • 2022 年に論文公開 れ モデル(PaLM)では、モデルのサイズに関連 下記の値 公開 れていま 。 ◦ モデルに入力可能なトークン数は 2048 で 。
  84. 0-shot, 1-shot, few-shot learning について 113 • テキスト生成モデルを用いると、Yes / No

    で回答で る質問に対 て、次の方法で回答 予想で ま 。 れを 0-shot learning と言いま 。 ◦ Yes / No で回答で る質問文を入力 て、 れに続 単語 「Yes」である確率と 「No」である確率を比較 ま 。 • Yes / No では回答で ないオープンな質問に対 る回答は、次の方法で生成 ま 。 ◦ 1-shot learning:「質問と解答の例」+「質問文」を入力 て、 れに続 べ 文章を生成 ま 。 ⇨ 回答の形式に対 るヒントを与える とで、回答を予測 や ていま 。 ◦ few-shot learning:「質問と解答の例」を 2 〜 3 個程度に増や ま 。
  85. PaLM による 1-shot learning の例 114 シンプルな回答例 と 正答に失敗 る

    推論過程を含め サンプル を与えると正答 る
  86. 117 Transformer のエンコーダとデコーダの違い • Attention 機構の論文では、原文の意味を抽出 る エンコーダと、原文の意味を補助情報と て訳文を 生成

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

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

    るモデルを作ると、分類に有用な情報を 持つ部分に Attention の Weight 掛 ると期 待 れま 。
  89. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ 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
  90. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ 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 = 8 KEY_DIM = EMBEDDING_DIM // N_HEADS FEED_FORWARD_DIM = 2048
  91. DCGAN の仕組み 123 • DCGAN では、エンコーダを用い に、デコーダ部分 を直接に学習 ま 。

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

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

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

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

    っ 点を学習データと て、変分オートエンコーダ(VAE)を学習 ま 。 • 下図のように、潜在空間の標準正規分布 らサンプリング データ 、デコーダによっ て、学習データの分布に変換で るようになると期待 れま 。 潜在空間 学習データ デコーダ 標準正規分布 "Moons" 分布
  96. Diffusion モデルの元になるアイデア 133 「整っ 画像」 のクラスター 「ノイズ画像」 のクラスター • 潜在空間を介

    に、画像データの空間(画像空間) 内で直接に、「ノイズ画像のクラスター」を「整っ 画像のクラスター」に変換 るモデル で れば、生 成モデルと て利用で ま 。 ◦ 画像空間に る標準正規分布のクラスター (各ピクセル値 標準正規分布で分布 画像 の集合)を「ノイズ画像のクラスター」と考え ま 。 • 「ノイズ画像」は簡単に用意で る一方、「整っ 画 像」は簡単には用意で ない点 ポイントになりま 。
  97. Diffusion モデルの考え方 134 • 「整っ 画像」を「ノイズ画像」に複数ステップ で変化 な ら、逆向 の変換を実現

    るモデ ルを学習 ま 。 ◦ オリジナルデータをノイズに変換 るプロ セスを「Diffusion プロセス」と言いま 。 • のモデルは、「ノイズを含む画像」+「ステッ プ数」の情報 ら「画像に含まれるノイズ」を予 測 ま 。 ◦ 与えられ 画像 ら予測 ノイズを取り 除 とで、オリジナル画像 近似的に再 現 れま 。ステップ数 大 なるほ ど、予測は不正確になると想像 れま 。 オリジナル Diffusion プロセス モデルの予測 ら 再現 オリジナル ステップ 進むと 予測 難 なる 2 次元データによる概念説明(平面上の 1 つの点 1 つの画像データに対応 ると考えて い。) ノイズ画像 (に相当 る点)
  98. Diffusion モデルの考え方 135 • 直感的に言うと、オリジナル らノイズに変化 る各ステップのデータを学習データと て、 れ れについて、オリジナルを予測

    るモデルを用意 ま 。 • 実際には、ステップ とに個別のモデルを使うのではな 、「ノイズを含むデータ+ステッ プ数」を受 取って予測 るモデルを学習 ま 。 学習データ A t = 0.1 オリジナル t = 0.0 学習データ B t = 0.2 学習データ C t = 0.3 ・・・ モデル A モデル B モデル C ・・・ Diffusion プロセス
  99. 学習後の Diffusion モデルによる画像生成の流れ 136 • 一例と て、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 ステップ分修正
  100. Diffusion モデルの実装 — Diffusion プロセス 137 • の後の計算式は、画像データ(高次元空間の点)ではな 、2 次元平面の点の場合で

    。 • ステップ t に る Signal rate   と Noise rate   を設定 て、 れらの重みでオリジ ナルデータ    とノイズデータ    を合成 る とで、ノイズデータに近づ てい ま 。 オフセット・コサイン・スケジュール ノイズを含むデータ • Signal rate と Noise rate は右図の「オフセット・コサ イン・スケジュール」 よ 用いられま 。 オリジナルデータ(のクラスター) ノイズデータ(のクラスター)に変化 る様子
  101. 138 Diffusion モデルの実装 — Diffusion モデル • Diffusion モデルは、ノイズを含むデータ    とステップ値 t

    を元に て、ノイズ成分     を予測 ま (*)。 ◦ ステップ値 t ら の時点の  と   決まるので、実装上は、    と  のペ アを受 取って、    の予測を返 ように構成 ま 。 diffusion_model = models.Sequential(name='diffusion_model') diffusion_model.add(layers.Dense(64, input_shape=(3,))) diffusion_model.add(layers.Dense(64, activation='relu')) diffusion_model.add(layers.Dense(64, activation='relu')) diffusion_model.add(layers.Dense(64, activation='relu')) diffusion_model.add(layers.Dense(64, activation='relu')) diffusion_model.add(layers.Dense(2, name='estimated_noise_data')) ノイズを含むデータと Noise rate を受 取る データに含まれる ノイズ成分を出力 る (*) t = 1 の最終状態でも S R = 0.02 なので、オリジナルデータの  痕跡はわ に残っていま 。モデルは、t = 1 の場合でも、  のわ な痕跡を発見 るように学習 れま 。 予測 ノイズを含む データ
  102. • Diffusion モデルは、 ま まなステップ値 t のデータを用意 て学習 る必要 ありま

    。 とえば、以下の手順を繰り返 とで学習で ま 。 ◦ べての    を含むリストを train_data と る ▪ noisy_data と noise_rate のペアを入力データ、noise_data を対応 る正解ラベルと て学 習データのセットに追加 る ◦ 用意 学習データのセットでモデルを学習 る ◦ 同数のノイズデータ    を生成 て、noise_data に保存 る ◦ 以下を繰り返 て、 ま まなステップ値 t の学習データを用意 る ▪ ステップ値 t をランダムに 1 つ選択 て、対応 る    を計算 後、次式でノイズを含むデータのリスト noisy_data を用意 る Diffusion モデルの実装 — モデルの学習方法 139 noisy_data = signal_rate * train_data + noise_rate * noise_data 数回繰り返 学習 収束 るまで繰り返 train_data noise_data
  103. 学習後のモデルによるオリジナルデータの再現 140 • 一例と て、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)を用いて、オリジナ ルデータ(train_data)を次の関係 ら再現 ま 。 ◦ 再現 (近似的な)オリジナルデータ(train_data)に対 て、次の関係を用いて、1 ステップ 前のノイズを再度加えま 。 noisy_data = signal_rate * train_data + noise_rate * noise_data noisy_data = signal_rate * train_data + noise_rate * noise_data 1 ステップ前の値を使う 1 ステップ前の値を使う 1 ステップ前の 予測データ 得られる
  104. 学習後のモデルによるオリジナルデータの再現 141 • オリジナルデータを再現 るコードの例で 。 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 に対 るデータで学習 ているので問題ありま ん。
  105. Diffusion モデルの学習例 142 • 2 次元平面のデータについて Diffusion モデルを適用 例で 。"Moons"

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

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

    る め、複数モデルのバランスを考える必要 ありま ん。 ◦ ステップ値 t を補助入力と る め、簡単なタスク(t 小 い)と困難なタスク(t 大 い)を 同時に学習 る とで、困難なタスクのみを学習 るよりも安定的に学習 進みま 。 ◦ 画像生成のステップを複数に分 る とで、安定的に整っ 画像 生成で ま 。 ◦ 学習データと標準正規分布ノイズを明示的に紐づ て り、標準正規分布 ら安定的に整っ 画像 再現で ま 。
  108. VQ-VAE のアイデア 147 • 最終的な潜在空間の状態 学習に依存 る(ど に「整っ 画像に対応 る点」

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

    。 らに、各ベクトル値をコードブックに載っている ベクトル値(値 一番近いもの)に置 換えて らデコーダに入力 ま 。 • 勾配ベクトルの計算時は「コードブックに載っている値への置 換え(不連続関数)」はスキップ ま 。(エンコーダはデコーダに入力 れ 値を直接に出力 と仮定 て勾配ベクトルを計算) • 画像生成時は、「潜在空間の各 点にコードブックの値を割り当 てるモデル」(PixelCNN)を 別途学習 て使いま 。 https://arxiv.org/abs/1711.00937
  110. VQ-VAE による学習例 149 • 入力画像: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 デコーダ らの出力 エンコーダへの入力
  111. 演習 • 以下のノートブックを見て、コードの実装を理解 てみて い。 ◦ Part04/4. VAE distribution conversion

    example.ipynb ▪ 変分オートエンコーダでデータ分布の変換モデルを実装 例で 。 ◦ Part04/5. Diffusion model example.ipynb ▪ 2 次元空間のデータに Diffusion モデルを適用 例で 。 150
  112. ラベル情報を用いたデコーダの学習 • 条件付 変分オートエンコーダでは、デコーダにラベル情報を入力 る とで、生成 る画 像を指定で ま 。

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

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

    る ま まなモデル 提案 れて り、一例と て、次の様なバリエー ション ありま 。 ◦ CLIP を使わ にテキストエンコーダも Diffusion モデルと同時に学習 るもの ◦ CLIP のテキストエンコーダ らの出力を利用 るもの ◦ CLIP のテキストエンコーダ らの出力を らにイメージエンコーダ側の出力に置 換 えるモデルを追加 もの(イメージエンコーダ側の出力の方 、画像の特徴をよりダ イレクトに表現 ていると考えられる め) 154
  115. Diffusion モデルとテキストエンコーダの組み合わせ • 右図は、前ページの 3 つの 方法を比較 例で 。下 にい

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

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

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

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

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