2024マテリアルズ・インフォマティクス連続セミナー,大規模言語モデルによる ニューラルネットワークモデル手法の学習

2.9K Views

February 25, 25

スライド概要

PyTorchを用いたニューラルネットワーク回帰、autoencoder, variational autoencoder

profile-image

マテリアルズインフォマティクスチュートリアル

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

マテリアルズ・インフォマティクス 連続セミナー 大規模言語モデルによる ニューラルネットワークモデル手法の学習 木野日織(きのひおり)

2.

今回の目的 説明 講義資料 自分で大規模言語モデル(LLM)を用いて、 ニューラルネットワークモデル手法を学習、コー ド生成ができることを説明します。 受講者 限定的な回答 • LLM:手法の解説やコードの高い説明能力を持つ。 • 本資料では、コードの詳細な説明は行いません。必要 に応じて、各自がLLMに質問し、詳細な解説を得てく ださい。 講義資料 私は、数式や文章だけでは理解しにくい箇所について、 図を用いて補足説明します。 受講者 言語モデル

3.

このチュートリアルの到達目標 講義終了時に、受講者が次のことをできるようになる、ことを期待します。 •ニューラルネットワークの基本的な学習手順を説明できる •PyTorchコードの主要部分を読める •Autoencoder、VAE、Diffusion model、Flow matchingの違 いを説明できる •LLMに適切な質問をして、コード生成・修正・説明を依頼できる •生成されたコードが正しいか、最低限確認できる

4.

話の流れ 簡単なニューラルネットワークモデル Autoencoder Variational Autoencoder diffusion model Flow matching

5.

今回必要な前提知識 必要な知識: •Pythonの変数、関数、for文を知っている。 •NumPy配列の概念を知っている •PyTorchの経験は不要 数式を完全に理解することよりも、入力、出力、損失、 更新の関係を理解することを目標とします。

6.

関連モジュールのインストール 本教材を実行するにはPyTorchのインストールが必要 です。 インストールの仕方については公式ホームページ https://pytorch.org/get-started/locally/ に以下の選択画面があります。 • Pipを用いてインストールすることを勧めます。 2026年7月25日撮影 1. 赤い部分を各自選択する。 2. 一番下の”Run this Command”にpip コマンドが表示される。 GPU (CUDA)を用いる場合はCompute PlatformでCUDAの versionを選択してください。

7.

大規模言語モデル(LLM)を用いたニューラルネットワーク モデルの学習 ニューラルネットワークを使った手法は数が多く、 把握するのが大変です。 幸いなことに、有名なニューラルネットワークモ デルは世の中に初心者向けのコード例、解説例が 多いためLLMが妥当な回答を行うことができます。 さらにLLMの進歩により、難しい例も妥当な回答 が可能になっています。 今回はLLMを用いてニューラルネットワークの 定義の仕方と、PyTorchでのモデル学習(訓練) の仕方を紹介します。 ここではChatGPTをLLMの例として用います。

8.

LLMの回答は必ず確認する •実行できるコードとは限らない •数式の添字や符号が間違う場合がある •バージョンが異なるlibraryを使うことが ある •指示していない機能を勝手に追加するこ とがある •実行結果が妥当でも、評価方法が不適切 な場合がある 確認方法: 1. コードを実行する 2. エラーをLLMに提示する コードを理解する。 1. 入力と出力のshapeを確認する 2. 損失が減少しているか確認する コードと数式の対応を理解する。 1. 更に、コードと数式、説明の対応を把握すること LLMがコードを生成できると言ってもそれを確認す るのはあなたの作業となります。 それ故にあなた自身が手法の学習することは無駄で はありません。むしろ、LLMを利用してあなたの学習 速度を高めてください。

9.

教師あり学習 復習 回帰モデル、分類モデルにかかわらず、 何かの目的関数𝐿があり、𝐿を最小化するようにモデルを学習する。 𝐿に正則化項、拘束条件を加えることもある。 ニューラルネットワークモデルの場合𝐿は損失関数と呼ばれる。

10.

記載方法 ChatGPTに尋ねる際の • プロンプトと • 回答 • 回答の要約 • コメント を表示で区別します。 # 私について 私は機械学習手法の初心者です。 # 依頼 プロンプト ニューラルネットワークモデルの (青枠) 学習過程を初心者に分かるように 教えて下さい。数式を用いてくだ さい。 以下、openAI APIを用いて回答 を取得している。 枠外はコメント 回答はopenAI APIを用いて取得し ている。 場合によりgpt modelが変わる。 ニューラルネットワークの基本構造 ニューラルネットワークは、以下のふたつの要素から成 り立っています。 ニューロン(ノード): 各層でデータを処理する基本 単位。 APIによる取得による回答そのもの 層: ニューロンが階層的に配置されたもの。一般に、 (黒枠) 入力層、隠れ層、出力層の3つの層があります。 具体的には、次のようになります: 入力層: 入力データが最初に入る場所。 隠れ層: 入力を処理し、出力に変換する中間層。 出力層: 最終結果を出す層。分類結果や予測値を出力 します。 ニューラルネットワークの基本構造 回答の要約 ニューラルネットワークは、以下のふたつの要素から成 り立っています。 (黒点線枠)

11.

今回の説明について 説明順序の違い: 教科書は、後ろを参照しないように、 細部→細部をまとめた手法という順で説明を行います。 一方、ChatGPTへの質問と回答を用いるとそれとは逆になります。 目的←そのための手法←手法の細部の説明の順です。 そして不明事項(細部)を更に尋ねていくことになります。 説明形式: ChatGPTへの質問→回答という順に説明を行います。 講演者自体この形式は面倒で、回答のみをまとめた方が楽なのですが、受講者が自分で「 ChatGPT への質問→回答」という順で知識獲得を行う例とするためこの形式で説明を行います。 受講者が将来、他の手法に対して、ChatGPTを用いて同様に知識獲得できることを期待します。

12.

ニューラルネットワークモデルの基礎 # 私について 私は機械学習手法の初心者です。 # 依頼 ニューラルネットワークモデルの学習過 程を初心者に分かるように教えて下さい。 数式を用いてください。 ニューラルネットワークの基本構造 ニューラルネットワークは、以下のふたつの要素から成り立っています。 ニューロン(ノード): 各層でデータを処理する基本単位。 層: ニューロンが階層的に配置されたもの。一般に、入力層、隠れ層、 出力層の3つの層があります。 具体的には、次のようになります: 入力層: 入力データが最初に入る場所。 隠れ層: 入力を処理し、出力に変換する中間層。 出力層: 最終結果を出す層。分類結果や予測値を出力します。 出力層 入力層 隠れ層

13.

ニューラルネットワークモデルの基礎 学習過程 ニューラルネットワークは以下の4つのステップ で学習を行います。 1. 前向き伝播(Forward Propagation): 2. 損失の計算(Loss Calculation): 3. 逆伝播(Backpropagation): 4. 重複(Epochs): 出力 𝑎 重み 𝑤 入力 出力 𝑤 𝑎 𝑎 𝑧 𝑤 𝜎:活性化関数 𝑎 𝑏:バイアス

14.

ニューラルネットワークモデルの基礎 𝑎 𝑤 𝑎 𝑤 𝑤 𝑎 𝑏 後でこういう場合もあることが分かる。 𝑎 𝑧 𝜎 𝑤:重み, 𝑏:バイアス を調整する。

15.

損失関数 回帰モデルと分類モデルの損失関数の例 を教えてください。 よく見ないと間違いますが、 𝑦 (𝑖) と 𝑦ො (𝑖) は異なります。 𝑦 (𝑖) : 観測データの値 𝑦ො (𝑖) :予測された値

16.

損失関数 𝑦 (𝑖) : 観測データのクラス(0か1。) 𝑦ො (𝑖) :予測されたクラスの確率

17.

損失関数 「one-hot エンコーディング」という言葉が出てきます。 これは何でしょう? chatGPTにこれを尋ねると、 クラスの数がCの場合、期待されるラベルはC次元のベクト ルで、正しいクラスのインデックスだけが1で、他は0とな ります。 と答えます。さらに、 one-hot エンコーディングを具体的に教えて下さい。 と質問すると、例えば、クラスの数C=3で、(犬、猫、鳥) として、 • ラベルが犬の場合は𝑦=(1, 0, 0) →𝑦1 = 1, 𝑦2 = 0, 𝑦3 = 0 • ラベルが猫の場合は𝑦=(0, 1, 0) →𝑦1 = 0, 𝑦2 = 1, 𝑦3 = 0 とすると回答が得られます。𝑦も上の表示に倣います。 ො 2クラスの場合がバイナリクロスエントロピーと等価である ことが理解できるでしょう。

18.

ニューラルネットワーク回帰モデルの例

19.

コード保存ファイル 以下のコードは 200.NN/200.010.simple_NN.ipynb に保存してあります。

20.

ニューラルネットワーク回帰モデルの作成 gpt-4o-miniを用いて生成。 問題なくコードが生成される。 # 依頼 ニューラルネットワーク回帰モデルのコード例 を作成してください。 # 詳細 PyTorchを用いてください。 簡単なデータ例を作成してください。 隠れ層を1つとしたニューラルネットワークを 作成してください。 可視化部分が少し間違っていたが、修正する。 エポック数を多くすると妥当な回帰モデルが学習でき る。ただし、訓練データ・テストデータ分割はなし。 まず実行結果を表示する。 図:実行結果

21.

コードの説明 コードをブロック毎に説明して ください。

22.

コードの説明 後で説明

23.

コードの説明 可視化部分は省略。 ドロップアウトやバッチ正則化の説明は後で行う。

24.

Pytorchの学習枠組み 以下の一般的な枠組みができています。 モデルの定義 学習 for epoch in range(num_epochs): 訓練データを使って 1. モデルを訓練モードに 2. 勾配を初期化 3. フォーワードパス 4. 損失関数を定義 5. バックプロパゲーション実行 6. パラメタ更新 モデルを評価モードに 予測値

25.

SimpleNNクラスの説明 SimpleNNクラスを数式で説明してください。 対応コード SimpleNNクラス class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.hidden = nn.Linear(1, 10) # 隠れ層 (入力次元: 1, 出力次元: 10) self.relu = nn.ReLU() # 活性化関数 self.output = nn.Linear(10, 1) # 出力層 (入力次元: 10, 出力次元: 1) def forward(self, x): x = self.hidden(x) x = self.relu(x) x = self.output(x) return x 隠れ層 ℎ = 𝑊1 𝑥 + 𝑏1 活性化関数 ℎ’ = 𝑅𝑒𝐿𝑈(ℎ) = max(0, ℎ) 出力層 𝑦 = 𝑊2 ℎ’ + 𝑏2 ReLU ReLU=max(0,h) 𝑊: 重み行列 𝑏: バイアス レルー … ℎ 𝑥 𝑦ො

26.

Backpropagation部分 ニューラルネットワークモデルの一般 的な説明として以下がありました。 定義したニューラルネットワークから backpropagationはコードのどこで計算さ れますか。

27.

オプティマイザ モデルの𝑊や𝑏の値を最適化し、損失関 数を最小化します。 Adam以外に使用できるオプティマイザを 教えてください。 全部紹介されているわけではありません。(PyTorchの新版がでる タイミングでは昔の版の紹介をすることもあります。) これらが最新版の紹介かは公式ページを御覧ください。 学習率についても説明を求めてみてください。

28.

ドロップアウトとバッチ正則化 コードの説明で「ドロップアウトやバッチ正則化」が 出てきた。 実は作成されたコードではドロップアウ トもバッチ正則化も有効になっていませ んが、もし定義され有効であったら、と いう説明でした。 ドロップアウトはニューラルネットワークモデルの過 学習を防ぐための手法。 訓練中にランダムにいくつかのニューロンを無効とす る。具体的に無効とはニューロンの出力を0とする。 なお、評価モードでは全部のニューロンが使用されま す。 ドロップアウトやバッチ正則化を説明し てください。 Nitish Srivastava, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever, Ruslan Salakhutdinov; Dropout: A Simple Way to Prevent Neural Networks from Overfitting, JMLR 15(56):1929−1958, 2014.

29.

ドロップアウトとバッチ正則化 モデルの定義 for epoch in range(num_epochs): for 訓練データのバッチ毎に 1. モデルを訓練モードに 2. 勾配を初期化 3. フォーワードパス 4. 損失関数 5. バックプロパゲーション 6. パラメタ更新 モデルを評価モードに 予測値 Sergey Ioffe, Christian Szegedy, Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, ICML'15: Proceedings of the 32nd International Conference on International Conference on Machine Learning 37, 448 - 456

30.

コード修正:ドロップアウトとバッチ正則化 ドロップアウトとバッチ正則化を有効にし たコードを作成してください。 問題なく作成できる。 パラメタが妥当かどうかは別の話。

31.

訓練データ・検証データ・テストデータ 全データを以下に分ける。 訓練データ:モデルの重みを学習する 検証データ:モデルやハイパーパラメータを選ぶ テストデータ:最後に性能を評価する 本チュートリアルでは、簡単のため、全データで、もしくは訓練・テ ストデータ分割のみで学習と性能評価を行っている。

32.

回帰コードの修正:訓練データとテストデータ # 依頼 コードを修正してください。 # 詳細 ドロップアウトとバッチ正則化を無効にします。 全データを訓練データとテストデータに分けます。 テストデータで回帰モデルを評価してください。 epoch毎に損失関数の値を図示してください。 y vs y_predの図を書いてください。 コードの変更点 1. ドロップアウトとバッチ正則化の無効化: - モデル定義でドロップアウトとバッチ正則化は行わず、隠れ層と出力層だけを使用 しています。 2. データの分割: - `train_test_split` を用いてデータを80%の訓練用と20%のテスト用に分割していま す。 3. 損失値の図示: - エポック毎に記録した損失値をプロットしています。 4. 評価指標の計算: - `mean_absolute_error`, `r2_score`, `mean_squared_error` をそれぞれ用いて、 テストデータに対するモデルの評価を行い、結果を表示しています。 5. y vs y_predのプロット: - テストデータの真の値と予測値を比較して散布図を生成し、理想的な予測(y=xの 線)を描画しています。 これらはscikit-learnの関数を用います。

33.

回帰コードの修正:訓練データとテストデータ 乱数により、かなり結果は異なります。 右が結果の図です。 図:実行結果

34.

回帰コードの修正:説明変数の要素数の変更 修正されたコードの一部 説明変数が一つのコードだったので、 説明変数を5つに増やします。 # 依頼 コードを修正してください。 # 詳細 説明変数が5つのデータを用いてください。 ドロップアウトを有効にします。 全データを訓練データとテストデータに分けます。 epoch毎に損失関数の値を図示してください。 テストデータで回帰モデルの評価指標MAE,R2,RMSEを出 力してください。 y vs y_predの図を書いてください。 class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.hidden = nn.Linear(5, 10) # 隠れ層 (5つの特徴量を入力) self.relu = nn.ReLU() # 活性化関数 self.dropout = nn.Dropout(0.5) # ドロップアウト (50%の確率でニューロ ンを無効化) self.output = nn.Linear(10, 1) # 出力層 def forward(self, x): x = self.hidden(x) x = self.relu(x) x = self.dropout(x) x = self.output(x) return x # 隠れ層へのパス # 活性化関数の適用 # ドロップアウトの適用 # 出力層へのパス ChatGPTがコードを適切に書き直してくれます。 特に、ニューラルネットワークモデルが複雑な場合にネットワーク 定義パラメタの辻褄をあわせてくれるのでとても有用です。 実行結果は示しません。

35.

回帰コードの修正:GPUの利用 変更点の説明 メモリー転送 CPU GPU 1. デバイスの設定: ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") ``` - CUDAが使用可能な場合にはGPUを選択し、そうでなければCPUを選択します。 2. データをGPUに転送: ```python X_train, y_train = X_train.to(device), y_train.to(device) X_test, y_test = X_test.to(device), y_test.to(device) ``` - 訓練データとテストデータをGPU上に移します。 「簡単に」CPUとGPUを使い変えることが出来る のがPyTorchの利点の一つです。 3. モデルをGPUに転送: ```python model = SimpleNN().to(device) ``` - モデルもGPU上に配置します。 GPUを使うように書き直してください。 4. 予測をCPUに戻す: ```python y_pred = model(X_test).cpu().numpy() ``` - テストデータに対する予測を行った後、データをCPUに戻し、NumPy配列に変換します。 この場合、GPUとCUDAを利用できればGPUを用い るコードを作成しました。 5. 評価指標の計算: - テストデータの実際の値や予測値をCPUに戻してから評価指標を計算します。 https://pytorch.org/docs/stable/generated/torch.Tensor.to.html 実行結果は示しません。

36.

回帰コードの修正:ReCoデータへの適用 書き換え後のコード 010.regression/でも使ったReCoデータを用いる。 • • 隠れ層が1層では不足。 一般的なXに対応できるようにする。 1 # 依頼 class SimpleNN(nn.Module): のニューラルネットワークモデルを書き 換えてください。 # 詳細 隠れ層を2層にします。 入力層のサイズをPとします P 10 X,yを読み込む部分は自分で修正する。 図:実行結果 5

37.

NN部分まとめ ✓NNは入力から出力への関数 ✓損失を小さくする ✓backwardで勾配計算 ✓optimizerでパラメータ更新

38.

Autoencoder

39.

Autoencoderとは? 28x28=784

40.

Autoencoderの学習方法 x1 x2 x3 y 回帰モデル: 𝑥 → 𝑦ො 正解 𝑦 (目的変数)が必要。 Autoencoder: 𝑥 → 𝑥ො 入力自身を正解として使う。

41.

ChatGPTを用いた画像解析例 物質例でなく、scikit-learnに含まれる手書き文字 データを用います。 このデータはよく知られており、例が多い方がChatGPTが コードを生成しやすいという理由です。 scikitの手書き文字を表示するコードを書いてください。 答え(ラベル) 画像 日本人の数字文字とやや異なる場合もある。 8x8のサイズで0から16までの値を持つことも知って います。 コメント: scikit-learnに含まれる手書き文字データは、28x28サイ ズのMNISTデータセットをサイズ縮小してデータセット にしています。scikit-learnの手書き文字はMNISTの手書 き文字をサイズ縮小して作成しているため、一部文字が 潰れています。 単に手書き文字データというとChatGPTはMNISTデータ セットを用います。

42.

Autoencoder 完全に元画像に戻るかどうかは別として、 左のネットワークを用いて潜在空間 (latent space) の分布を評価するコー ドを書いてもらう。 Latent spaceは図示しやすいように二次 元にする。 Latent space 入力 encoder decoder 出力 出力が入力画像にどの程度戻るかは今は 人間が判断する。 (なるべく)入力画像に戻るように encoder-decoderのネットワークを修正 した。

43.

Autoencoderコード生成 コード生成と説明はAPIでgpt4-oを用いた。 コードは修正して200.050.autoencoder.ipynb に保存してあります。

44.

Autoencoder # 私について 私は機械学習手法の初心者です。 # 依頼 autoencoderのコードを書いてください。 latent spaceを二次元にしてください。 scikit-learnの手書き文字データセットを用いてください。 PyTorchを用いてください。 epoch vs lossを図示してください。 最後に、 latent spaceを離散値として色をつけてく可視化してください。 図:実行結果、epoch vs Loss, 元画像と再構成画 像の比較。

45.

Autoencoder 4 1 7 6 2 3 5 9 0 9 1 図:二次元潜在空間 図:左の図の 二次元潜在空間を50%拡張し、各軸10 分割して、対応する画像を並べてた。

46.

コードの説明 以下のコードをブロックごとに説明して ください (コードはコピペした)

47.

コードの説明 encoder decoder hidden_dim hidden_dim lattent_dim … … … … … Input_dim output_dim 全結合ニューラルネットワークモデル (ただし、これはgpt-4oが作った最初のモデル)

48.

コードの説明

49.

コードの説明 モデルの定義 for epoch in range(num_epochs): for 訓練データのバッチ毎に 1. モデルを訓練モードに 2. 勾配を初期化 3. フォーワードパス 4. 損失関数 5. バックプロパゲーション 6. パラメタ更新 モデルを評価モードに 予測値

50.

損失関数 ``` loss = criterion(reconstructed, batch_data) ``` 部分が何を比較しているのかを教えてください。 batch_data: 元々の入力データ Reconstructed: オートエンコーダーが復元したデータ criterion = nn.MSELoss() と定義したので、 元々の入力データとオートエンコーダーが復元したデータの差を MSEで評価した。 元画像と再構成画像を MSEで比較。

51.

Dataloader 「データローダからデータをバッチごと に取り出し、」の部分をもっと詳しく教 えてください。 dataloader = Dataloader(data, batch_size=64, …) for epoch in range(num_epochs) # 全てのdataに対して for batch_data, _ in dataloader: # batch_size(今は64)個のデータ毎に以下を行う。 … という形式。 https://pytorch.org/docs/stable/data.html

52.

コメント • Scikit-learnの手書き文字の画像が8x8サイズであること、0-16までの値を持つことをgpt-4o が知っていました。(それもあり、指定が簡単になるので Scikit-learnの手書き文字を使っ ています。)ユーザー画像を用いる場合は縦横サイズ、値が、0-255までであることなど、 をプロンプトに付け加えると適切なpreprocessをしてくれるでしょう。 • 例ではChatGPTは全結合ニューラルネットワークモデルを作成しましたが、畳み込みニュー ラルネットワークや(有名ならば)〇〇Netという指定も可能です。畳み込みニューラル ネットワークを用いても画像サイズにより妥当なネットワークは異なります。

53.

Autoencoderまとめ ✓ 入力を低次元へ圧縮 ✓ decoderで再構成 ✓ 損失は元データと再構成データの 差

54.

Variational AutoEncoder (VAE)

55.

VAEとは?

56.

VAEコード コード生成と説明はAPIでgpt4-oを用いた。 一部、o3-mini-high説明を行った。 コードは修正して200.060.VAE.ipynb に保存してあります。

57.

Autoencoderの復習 まず、autoencoderの説明 variational autoencoderを説明してください。 autoencoderと比較して説明してください。 数式を用いてください。 𝑧 𝑥 𝑞𝜙 (z|x) 𝑥ො 𝑝𝜃 (x|z)

58.

Autoencoderはそのままでは生成モデ ルではない Autoencoderでは、潜在空間の分布に穴や偏りがあり、任意の座標から良い データを生成できるとは限らない。 •入力データを再構成することは得意 •潜在空間から新しいデータを生成することは保証されない •VAEは潜在空間の分布を整える •そのため、標準正規分布からサンプリングして生成できる

59.

VAE 続いて、variational autoencoderの説明 1.と2. 𝑧 =𝜇+𝜎⊙𝜖 𝑥 3. 𝜇, 𝜎 2 𝑧 𝐿 = 𝐿𝑟𝑒𝑐𝑜𝑛𝑠𝑡𝑟𝑢𝑐𝑡𝑖𝑜𝑛 + 𝐿𝐾𝐿 𝑞𝜙 (𝑧|𝑥)の分布でlog 𝑝𝜃 (𝑥|𝑧)評価する。 サンプリングと再パラメタ化、 再構成は次に説明。 誤差、KLダイバージェンス 第一項と第二項の比率は場合により異なる。 𝑥ො

60.

autoencoderとvariational autoencoder autoencoder 6 . (𝑧 , 𝑧 ) 1 4 . variational autoencoder 6 2 4 ( 𝜇1 , 𝜇2 , 𝜎12 , 𝜎22 )

61.

サンプリングと再パラメタ化 サンプリングと再パラメータ化について 教えて下さい。 https://en.wikipedia.org/wiki/Reparameterization_trick

62.

再パラメタ化トリック モデルの定義 for epoch in range(num_epochs): 訓練データを使って 1. モデルを訓練モードに 2. 勾配を初期化 3. フォーワードパス 4. 損失関数 5. バックプロパゲーション 6. パラメタ更新 モデルを評価モードに 予測値 勾配計算を consistentに 定義したい。

63.

再パラメタ化トリック 𝑧~N(𝜇, 𝜎 2 ) 同じに見える。 𝑧 =𝜇+𝜎⊙𝜖 ⊙ は成分ごとの積 𝑥 𝜇, 𝜎 𝑧 𝑥ො あるforward過程とbackward(backpropagation) 過程で それぞれ𝝐 をランダムにサンプリングする。 異なる。 →微分できない。 𝑥 𝜇, 𝜎 𝑧 𝑥ො 𝝐はランダムにサンプリングして作成されるが、 あるforward過程でサンプリングした 𝝐を同じbackward(backpropagation)過程でも使う。 → consistentに微分できる。 (PyTorchのコードの書き方で自然に同じ𝝐を用いる ことになる。)

64.

再構成誤差 Variational antoencoderの再構成誤差 を詳しく説明してください。 Autoencoderのコードも BCEで計算可能 画像が0-1なので誤差関数はどちらでも良い。

65.

バイナリー交差エントロピー(BCE) • 初めに 𝑥, 𝑥ො : 入力データと生成された値 𝑥=1 -> L=−log(𝑥) ො 𝑥=0 -> L=−log(1 − 𝑥) ො 𝑥ො = 1で最小 𝑥ො = 0で最小 𝑥 L 𝑧 𝜇, 𝜎 2 𝑥ො 1ピクセルごと比較して平均。 0 • 1 𝑥ො 拡張 𝑥の0-1の間をつなぐ BCE=−[𝑥log 𝑥ො + 1 − 𝑥 log 1 − 𝑥ො ] 𝐿𝐵𝐶𝐸 MAEとBCEは大きさが異なるので、VAEの損失関数として 用いる場合、KL項とのバランスは異なります。

66.

KL項 KLダイバージェンス(Kullback-Leibler divergence、カルバック・ライブラー情報量): o3-mini-highで VAEのKL divergence項 の式変形をを 説明して下さい。 𝐷𝐾𝐿 (P| Q = ෍ 𝑃 𝑥 𝑙𝑜𝑔 𝑥 𝑃(𝑥) 𝑄(𝑥) 𝐷𝐾𝐿 (P| Q = න 𝑑𝑥 𝑃 𝑥 𝑙𝑜𝑔 𝑃(𝑥) 𝑄(𝑥) とした回答の要約を表示する。 𝑃 𝑥 正解データの分布 に従うデータが与えられたとき、 そのデータを 𝑄(𝑥)(モデルが学習した分布) で表現したときの「情報のロス」

67.

KL項 正規分布 P(𝑧)=𝑁(0,𝐼) に従うデータが与えられたとき、 そのデータを VAEの潜在変数 𝑧の全体の分布 𝑄(𝑧 ∣ 𝑥) = 𝑁(𝜇, 𝜎 2 ) で表現したときの「情報のロス」 𝑄 𝑧 = 1 𝑧 − 𝜇𝑖 2 exp(− ) 2 2𝜎 𝑖 2 𝐷𝐾𝐿 (P| Q = න 𝑑𝑧 𝑃 𝑧 𝑙𝑜𝑔 𝑃(𝑧) 𝑄(𝑧) 1 = − ෍(1 + log 𝜎𝑖2 − 𝜇𝑖2 − 𝜎𝑖2 ) 2 𝑖 𝜎𝑖 , 𝜇𝑖 とデータインスタンスのindexと和 2𝜋𝜎𝑖 𝑧2 𝑃(𝑧) = exp(− ) 2 2𝜋 1 なお、𝜇 = 0, 𝜎 2 = 1が最小値。 上の説明は要約です。o3-mini-highは上の加え てかなり詳細に式変形して説明する。

68.

分布の学習 その各分布が極端にばらばらにならないように、 𝑞𝜙 𝑧 ∣ 𝑥 を標準正規分布 𝑝 𝑧 =𝒩 0 𝐼 に近づけます。 結果として、データ全体の潜在表現も標準正規分布に 近い領域へ配置されます。 (個々𝜇𝑖 , 𝜎𝑖2 を標準正規分布にするわけではない。) 図:Autoencoderのlatent space

69.

VAEコードの生成 # 依頼 {# コード}をvariational antoencoderを 用いたコードに書き換えてださい。 # コード (autoencoderコードをコピペ。) 結果を示す。 図:実行結果、epoch vs Loss, 元画像と再構成画像の比較。

70.

VAEの結果 0 9 6 3 8 4 7 2 1 図:二次元潜在空間。𝑁(0, 𝐼)に従うはず。 図:左の図の 二次元潜在空間を50%拡張し、各軸10 分割して、再構成した画像を並べてた。

71.

VAEコードの説明 VAEのモデル定義と 損失関数の定義を詳しく説明してください。 コードと数式を関連付けてください。 「対数分散にするのはなぜ?」と聞くと、「𝜎 2 を評価するより計算が安定するから。」 と回答する。𝜎 2 = exp(log(𝜎 2 ))

72.

VAEコードの説明 𝑧 =𝜇+𝜎⊙𝜖 ⊙ は成分ごとの積 𝑥 𝜇, log(𝜎 2 ) 𝑧 実際のネットワーク 𝑥ො

73.

VAEコードの説明 Logvar = log 𝜎 2 mu.pow(2) = 𝜇2 Logvar.exp() = exp(log 𝜎 2 )

74.

VAEまとめ ✓ 点ではなく分布を出力 ✓ 再パラメータ化で学習可能 ✓ 再構成誤差+KL項 ✓ latentから新データを生成可能

75.

AE・VAEから生成モデルへ Autoencoderでは、入力データを低次元の潜在空間 (latent space)へ変換し、デコーダーを用いて元 のデータを再構成しました。 Encoder Decoder 𝑥 𝑧 𝑥ො 新しい潜在変数(𝑧)をサンプリングし、デ コーダーに入力することで、 𝑧 Decoder 𝑥ො を生成できた。 VAEでは、この潜在変数の分布を、標準正規分布 𝑧 ∼ 𝑁(0, 𝐼) に近づけるように学習した。 生成モデルでは、 単純な分布からサンプルを取り出し、それ を実データに似たサンプルへ変換します。

76.

生成モデル

77.

生成モデルとは何か x ~ q は確率変数xが確率分布qに従う、と読みます。 実データの分布 生成モデルの目的 𝑥: 結晶構造、電子密度、画像 ∈ ℝ𝑑 これらのデータは、ある未知で複雑なデータ分布 𝑥 ∼ 𝑞 𝑑𝑎𝑡𝑎 に従う。 しかし、例えば、 意味のある画像は (ℝ𝑑 ) 全体に一様に存在するの ではなく、高次元空間のごく一部に分布する。 結晶構造も同様。 生成モデルは、 1.パラメータ (𝜃) を持つモデル分布 𝑝𝜃 ≈ 𝑞 𝑑𝑎𝑡𝑎 となるように学習する。 2.実データに似た新しいサンプルを生成する。 𝑥 𝑛𝑒𝑤 ∼ 𝑝𝜃 生成モデルは、 個々のデータを予測することではなく、デー タが従う分布そのものを学習し、その分布に 従う新しいデータを生成する。

78.

生成モデル Diffusion 画像生成AI DALLE 3 結晶生成 MatterSim Protein構造生成 FrameDiff アルゴリズム forward: Data ↓ 少しずつノイズ追加 ↓ Gaussian Noise backward: Gaussian Noise ↓ 少しずつ除去 ↓ Data Flow Matching Stable Diffusion 3 どちらも高品質な 画像生成が可能 E(3) FoldFlow Gaussian Noise ↓ 速度場 ↓ 速度場積分 ↓ Data SE(3)

79.

Diffusion model

80.

Diffusion modelにおける時刻 𝑡は実際の時間ではなく、ノイズ量を表すステップ 𝑡 = 0:元データ 𝑡 = 1,2, … , 𝑇:徐々にノイズが増える 𝑡 = 𝑇:ほぼガウスノイズ 𝑥0𝑑𝑎𝑡𝑎 → 元データ 𝑥1 元データ +少しノイズ → 𝑥2 → ⋯ → 𝑥𝑇𝑛𝑜𝑖𝑠𝑒 元データ +更にノイズ ほぼノイズ

81.

Diffusion model 𝑥 ∈ ℝ𝑑 前向き過程 逆過程 𝑥𝑇𝑛𝑜𝑖𝑠𝑒 ∼ 𝒩(0, 𝐼) 解析的に記述可能 こちらをニューラルネッ トワーク学習

82.

なぜ少しずつノイズを除去するのか 完全なガウスノイズから一度に画像を生成するのは非常 に難しいため、簡単な小さな変換を何度も繰り返す。 非常に難しい: 完全なノイズ → データ 比較的学習しやすい: ノイズの多いデータ → 少しノイズの少ないデータ

83.

Diffusion model 前向き過程 各インスタンスの変化 𝑥0𝑑𝑎𝑡𝑎 前向き過程 ∈ ℝ𝑑 各ステップで 𝑑 𝑞(𝑥1 |𝑥0 ) 𝑥1 ガウスノイズ𝜖𝑡 を用いると、 𝑑 𝑞(𝑥2 |𝑥1 ) 𝑥2 最終時刻Tを含めて任意のtでは解析的に以下に書ける。 … 𝑑 𝑥𝑇 ∈ ℝ𝑑 𝑞(𝑥𝑇 |𝑥𝑇−1 ) 𝑑 𝛼ത 𝑇 ≈ 0と取るので𝑥𝑇 はほぼガウスノイズ成分のみ。 (beta scheduleとして後で説明)

84.

Diffusion model 逆過程 前向き過程と別に、新にサンプリングしたノイズ( 𝑥𝑇𝑛𝑜𝑖𝑠𝑒 ∼ 𝑁(0, 𝐼) )から開始する。 ただし、対応する真の元データ( 𝑥0 )は与えられていないため、 𝑞 𝑥𝑡−1 𝑥𝑡 , 𝑥0 ) を直接利用することはできない。 このため、元データ を明示的に条件としない逆遷移分布 𝑝𝜃 𝑥𝑡−1 𝑥𝑡 ) をneural networkによって近似する。 (個々のデータを予測するわけではなく、分布を予測するモデルを作成することに注意)

85.

損失関数

86.

ニューラルネットワークは何を学習するか 基本的なdiffusion modelでは、ニューラルネットワークは元画像を直接予測 するのではなく、加えたノイズを予測します。 入力: 𝑥𝑡 , 𝑡 出力: 𝜖𝜃 𝑥𝑡 𝑡 正解: 𝜖 損失: 𝐿 = 𝜖 − 𝜖𝜃 𝑥𝑡 𝑡 2

87.

Beta schedule Diffusion model では、各時刻で加えるノイズ量を 𝛽𝑡 = 1 − 𝛼𝑡 によって指定する。 𝑞 𝑥𝑡 𝑥𝑡−1 = 𝒩(xt ; 1 − 𝛽𝑡 𝑥𝑡−1 , 𝛽𝑡 𝐼) このノイズ量をどのように変化させるかを beta schedule と呼ぶ。 代表的なbeta schedule はCosine schedulingである。 •Cosine schedule:累積信号量( 𝛼ത𝑡 ) が cosine 関数に従って減少するように設定する。 初期から中間の時刻において累積信号量( 𝛼ത𝑡 )が表す元データの信号を比較的ゆっくり減衰させ、 最終時刻付近で ゼロに近づける。

88.

Cosine schedule 𝑇 = 100

89.

Diffusion modelの種類 Diffusion modelの代表的な手法として、DDPMとDDIMがある。 DDPM(Denoising Diffusion Probabilistic Model):Gaussian noiseから出発し、各ステッ プで確率的にノイズを除去しながらデータを生成する手法。 DDIM(Denoising Diffusion Implicit Model):DDPMと同じ方法で学習したモデルを利用し ながら、より少ないステップでデータを生成できる手法。DDIMでは、確率性を調整するパラ メータを用いる。決定論的な設定では、同じ初期noiseから常に同じ結果が得られる。 ここでは、diffusion modelの最も基本的な手法であるDDPMを扱う。

90.

コード生成 200.101に保存。 gpt-5.6-terraでAPIを使い生成した後に修正を入れた。

91.

元分布と生成された分布 一次元実数データ(ℝ1 )の 場合。 𝑝𝑟𝑒𝑑 𝑥0 𝑥0

92.

コード説明 データはℝ1 → ℝ1 の変換 であるが、 (𝑥, 𝑡)が入力なので、 時間𝑡をℝ1 として付加している。 つまり、入力はℝ2 前向き過程のモデルを定義する。 注意)コード内では𝑡の替りにkを 用いている。 入力ベクトル ノイズを出力

93.

訓練部分 𝑥𝑇𝑛𝑜𝑖𝑠𝑒 を経由するのでなく、 𝑥𝑘𝑛𝑜𝑖𝑠𝑒 を経由して学習する。 各時刻tにおけるノイズ除去方法を学習するため。 pred 𝑥0𝑑𝑎𝑡𝑎 ⟶ x𝑘noise ⟶ x0 𝜖𝜃 𝜖 データ分布から元データ をサンプリングする。 (𝑖) 𝑥0 ∼ 𝑞 𝑑𝑎𝑡𝑎 𝑖 = 1, … , 𝐵 Diffusion timestepをランダムに選ぶ。 𝑘 (𝑖) = 𝑈𝑛𝑖𝑓𝑜𝑟𝑚( 0, 1, … , 𝑇 − 1 ) Forward diffusionと入力ノイズを計算する。 (𝑖) (𝑖) 𝑥𝑘 = 𝛼ത𝑘 (𝑖) 𝑥0 + 1 − 𝛼ത𝑘 (𝑖) 𝜖 (𝑖) ノイズ予測モデル 𝜖𝜃 𝑥𝑘 (𝑖) , 𝑘 (𝑖) ) 1 MSE損失: 𝐿𝜃 = 𝐵 σ𝐵𝑖 𝜖𝜃 𝑥𝑘 𝑖 , 𝑘 𝑖 ) − 𝜖 𝑖 2

94.

生成部分(逆過程) 初期状態サンプリング 時刻を逆向きに進める。[0,T-1]であることに注意。 全サンプルに同じ時刻を与える 現在時刻のschedule値を取得する noiseを予測 逆拡散分布の平均 k=0 は最後の逆拡散ステップ

95.

Flow matching

96.

Flow matching かなり簡単には: Diffusion modelは「差分」だった。 → ならば微分にできるのでは、という考え方。 ガウシアンノイズ分布 から データ分布 への 流れ(Flow) を直接学習します。

97.

速度場の生成とデータ分布への変換 最も単純な場合、 3.このとき速度は 1.ノイズ (𝑥0 )とデータ(𝑥1 )がある。 2.直線を考えて、時間𝑡で補完する。 𝑥𝑡 = 𝑥0 (1 − 𝑡) + 𝑥1 𝑡 (diffusion modelとは, 𝑡 の方向が反対ですが、 多くの方の書き方に合わせます。) です。 𝑑𝑥 𝑢(𝑥, 𝑡) = = 𝑥1 − 𝑥0 𝑑𝑡 4.ニューラルネットに 𝑢𝜃 (𝑥, 𝑡) を学習させます。 5.この速度を少しずつ積分し、 𝑥𝑡+Δ𝑡 ≈ 𝑥𝑡 + 𝑢𝜃 (𝑥, 𝑡)Δ𝑡 ノイズ分布からデータ分布へ変換します。

98.

コード生成 200.112に保存。 This code was generated by GPT-5.6-terra and subsequently modified by hand. Parts of this code are based on: Peter Roelants, “Flow Matching: A Visual Introduction” https://peterroelants.github.io/posts/flow_matching_intro/ The relevant portions are licensed under the Mozilla Public License 2.0: https://www.mozilla.org/MPL/2.0/

99.

元分布と生成された分布 一次元実数データ(ℝ1 )の 場合

100.

訓練部分

101.

生成部分 𝑑𝑥 データにするには、𝑢 𝑥, 𝑡 = 𝑑𝑡 を𝑥𝑡=1 に変換する必要がある。 𝑥 𝑡 = 0 ∼ 𝑁(0,1) 1 Δ𝑡 = 𝑇 𝑡𝑖 = 𝑖 𝑇 (n,1)データに対して一度に処理 を行う。 𝑢𝜃 𝑥𝑡𝑖 , 𝑡𝑖 オイラー法による積分 𝑥𝑡𝑖+1 = 𝑥𝑡𝑖 + 𝑢𝜃 𝑥𝑡𝑖 , 𝑡𝑖 Δ𝑡

102.

速度場の表示 カラーマップ:𝑥の密度 矢印:(𝑡, 𝑥) ↦ (𝑡 + Δ𝑡, 𝑥 + 𝑢𝜃 (𝑥, 𝑡)Δ𝑡)

103.

手書き文字の場合 Scikit-learnの手書き文字 ( ℝ64 )の場合 Diffusion スクリプトは200.122として保存 Flow matching スクリプトは200.131として保存

104.

Diffusion modelとFlow Matching の比較 項目 Diffusion Flow Matching 学習対象 ノイズまたはscore 速度場 出発点 ガウスノイズ ガウスノイズ 生成 ノイズ除去を繰り返す 常微分方程式を積分する 基本的な見方 確率過程 連続的な流れ 共通点 単純分布をデータ分布へ変換 単純分布をデータ分布へ変換

105.

Diffusion・Flow Matchingまとめ ✓ ノイズからデータを生成 ✓ Diffusionはノイズ除去 ✓ Flow Matchingは速度場の積分 参考文献 diffusion model arXiv:2312.10393v1, Lecture Notes in Probabilistic Diffusion Models, Inga Strümke and Helge Langseth, Norwegian University of Science and Technology flow matching arXiv:2412.06264v1, Flow Matching Guide and Code, Yaron Lipman, Marton Havasi, Peter Holderrieth, Neta Shaul, Matt Le, Brian Karrer, Ricky T. Q. Chen, David Lopez-Paz, Heli Ben-Hamu, Itai Gat. Also, https://peterroelants.github.io/posts/flow_matching_intro/ arXiv:2506.02070v3, An Introduction to Flow Matching and Diffusion Models, Peter Holderrieth, Ezra Erives.

106.

以上です。 お疲れ様でした。

107.

さらなる説明が必要な場合 言語モデルに尋ねるのが最も早いでしょう。 例) 私はPythonの初心者です。 私は機械学習の初心者です。 私は大学院修士課程一年生です。 以下のコードを説明してください。 ここにコードを貼り付ける。 「私はPythonを熟知しています。」など と変更も可能。 以下の回答が分かりません。 詳しく説明してください。 ここに言語モデルの回答を 貼り付ける。 注意)言語モデルの説明が間違っている ことも、私の考え方と異なっていること もあります。