1.3K Views
February 25, 25
スライド概要
PyTorchを用いたニューラルネットワーク回帰、autoencoder, variational autoencoder
マテリアルズインフォマティクスチュートリアル
マテリアルズ・インフォマティクス 連続セミナー 大規模言語モデルによる ニューラルネットワークモデル手法の学習 木野日織(きのひおり)
今回の目的 各自が自分で大規模言語モデル(LLM)を用いて、ニューラルネット ワークモデル手法を学習、コード生成ができることを解説します。 そのため、 • LLMが手法やコードを詳しく説明できることを、紹介します。 • コードの説明は詳しく行いません。詳しいコードの説明は各自LLMに求めてくください。 • 私は、式と文章でわかりにくい部分を図を加えて解説します。
関連モジュールのインストール インストールの仕方については公式ホームページ https://pytorch.org/get-started/locally/ の上の方に以下の選択画面があります。 本教材を実行するにはPyTorchのインストールが必要 です。 • condaによるインストールは勧めません。 動作する Pythonのversionが限られます。 • pipを用いてインストールすることを勧めます。 1. 赤い部分を各自選択する。 2. 一番下の”Run this Command”にpip コマンドが表示される。 このハンズオン例では $ pip torch のみで良いはず。GPU (CUDA)を用いる場合はCompute PlatformでCUDAのあなたのPCのversionを選択してください。
大規模言語モデル(LLM)を用いたニューラルネット ワークモデルの学習 ニューラルネットワークを使った手法は数が多く、把握 するのが大変です。 幸いなことに、有名なニューラルネットワークモデルは 世の中に初心者向けのコード例、解説例が多いためLLM が妥当な回答を行うことができます。 今回はLLMを用いてニューラルネットワー クの定義の仕方と、PyTorchでのモデル学 習(訓練)の仕方を紹介します。 ここではChatGPTをLLMの例として用い ます。
教師あり学習 復習 回帰モデル、分類モデルにかかわらず、 何かの最適化関数𝐿があり、𝐿を最小化するようにモデルを学習する。 𝐿に正則化項、拘束条件を加えることもある。 ニューラルネットワークモデルの場合𝐿は損失関数と呼ばれる。
記載方法 ChatGPTに尋ねる際の • プロンプトと • 回答 • 回答の要約 • コメント を表示で区別します。 # 私について 私は機械学習手法の初心者です。 # 依頼 プロンプト ニューラルネットワークモデルの (青枠) 学習過程を初心者に分かるように 教えて下さい。数式を用いてくだ さい。 以下、openAI APIを用いて回答 を取得している。 枠外はコメント 回答はopenAI APIを用いて取得し ている。 場合によりgpt-4o, o3-mini-highな どを利用する。 ニューラルネットワークの基本構造 ニューラルネットワークは、以下のふたつの要素から成 り立っています。 ニューロン(ノード): 各層でデータを処理する基本 単位。 APIによる取得による回答そのもの 層: ニューロンが階層的に配置されたもの。一般に、 (黒枠) 入力層、隠れ層、出力層の3つの層があります。 具体的には、次のようになります: 入力層: 入力データが最初に入る場所。 隠れ層: 入力を処理し、出力に変換する中間層。 出力層: 最終結果を出す層。分類結果や予測値を出力 します。 ニューラルネットワークの基本構造 回答の要約 ニューラルネットワークは、以下のふたつの要素から成 り立っています。 (黒点線枠)
今回の説明について 説明順序の違い: 教科書は、後ろを参照しないように、 細部→細部をまとめた手法→目的、という順で説明を行います。 一方、ChatGPTの説明はそれとは逆になります。 目的←そのための手法←手法の細部の説明の順です。 そして不明事項(細部)を更に尋ねていくことになります。 説明形式: ChatGPTへの質問→回答という順に説明を行います。 講演者自体この形式は面倒で、回答のみをまとめた方が楽なのですが、受講者が自分で「 ChatGPT への質問→回答」という順で知識獲得を行う例とするためこの形式で説明を行います。 受講者が将来、他の手法に対して、ChatGPTを用いて同様に知識獲得できることを期待します。
ニューラルネットワークモデルの基礎 # 私について 私は機械学習手法の初心者です。 # 依頼 ニューラルネットワークモデルの学習過 程を初心者に分かるように教えて下さい。 数式を用いてください。 ニューラルネットワークの基本構造 ニューラルネットワークは、以下のふたつの要素から成り立っています。 ニューロン(ノード): 各層でデータを処理する基本単位。 層: ニューロンが階層的に配置されたもの。一般に、入力層、隠れ層、 出力層の3つの層があります。 具体的には、次のようになります: 入力層: 入力データが最初に入る場所。 隠れ層: 入力を処理し、出力に変換する中間層。 出力層: 最終結果を出す層。分類結果や予測値を出力します。 出力層 入力層 隠れ層
ニューラルネットワークモデルの基礎 学習過程 ニューラルネットワークは以下の4つのステップ で学習を行います。 1. 前向き伝播(Forward Propagation): 2. 損失の計算(Loss Calculation): 3. 逆伝播(Backpropagation): 4. 重複(Epochs): 出力 𝑎 重み 𝑤 入力 出力 𝑤 𝑎 𝑎 𝑧 𝑤 𝜎:活性化関数 𝑎 𝑏:バイアス
ニューラルネットワークモデルの基礎 𝑎 𝑤 𝑎 𝑤 𝑤 𝑎 𝑏 後でこういう場合もあることが分かる。 𝑎 𝑧 𝜎 𝑤:重み, 𝑏:バイアス を調整する。
損失関数 回帰モデルと分類モデルの損失関数の例 を教えてください。 よく見ないと間違いますが、 𝑦 (𝑖) と 𝑦ො (𝑖) は異なります。 𝑦 (𝑖) : 実際のクラス(実際のなので0か1。) 𝑦ො (𝑖) :予測されたクラスの確率
損失関数 𝑦 (𝑖) : 実際のクラス(「実際の」なので0か1。) 𝑦ො (𝑖) :予測されたクラスの確率
損失関数 「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クラスの場合がバイナリクロスエントロピーと等価である ことが理解できるでしょう。
コメント
ニューラルネットワーク回帰モデルの例
コード保存ファイル 以下のコードは 200.NN/200.010.simple_NN.ipynb に保存してあります。
ニューラルネットワーク回帰モデルの作成 gpt-4o-miniを用いて生成。 問題なくコードが生成される。 # 依頼 ニューラルネットワーク回帰モデルのコード例 を作成してください。 # 詳細 PyTorchを用いてください。 簡単なデータ例を作成してください。 隠れ層を1つとしたニューラルネットワークを 作成してください。 可視化部分が少し間違っていたが、修正する。 エポック数を多くすると妥当な回帰モデルが学習でき る。ただし、訓練データ・テストデータ分割はなし。 まず実行結果を表示する。 図:実行結果
コードの説明 コードをブロック毎に説明して ください。
コードの説明 後で説明
コードの説明 可視化部分は省略。 ドロップアウトやバッチ正則化の説明は後で行う。
Pytorchの学習枠組み 以下の一般的な枠組みができています。 モデルの定義 学習 for epoch in range(num_epochs): 訓練データを使って 1. モデルを訓練モードに 2. 勾配を初期化 3. フォーワードパス 4. 損失関数を定義 5. バックプロパゲーション実行 6. パラメタ更新 モデルを評価モードに 予測値
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) 𝑊: 重み行列 𝑏: バイアス レルー … ℎ 𝑥 𝑦ො
Backpropagation部分 ニューラルネットワークモデルの一般 的な説明として以下がありました。 定義したニューラルネットワークから backpropagationはコードのどこで計算さ れますか。
オプティマイザ モデルの𝑊や𝑏の値を最適化し、損失関 数を最小化します。 Adam以外に使用できるオプティマイザを 教えてください。 全部紹介されているわけではありません。(PyTorchの新版がでる タイミングでは昔の版の紹介をすることもあります。) これらが最新版の紹介かは https://pytorch.org/docs/stable/optim.htmlを御覧ください。 学習率についても説明を求めてみてください。
ドロップアウトとバッチ正則化 コードの説明で「ドロップアウトやバッチ正則化」が 出てきた。 実は作成されたコードではドロップアウ トもバッチ正則化も有効になっていませ んが、もし定義され有効であったら、と いう説明でした。 ドロップアウトはニューラルネットワークモデルの過 学習を防ぐための手法。 訓練中にランダムにいくつかのニューロンを無効とす る。具体的に無効とはニューロンの出力を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.
ドロップアウトとバッチ正則化 モデルの定義 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
コード修正:ドロップアウトとバッチ正則化 ドロップアウトとバッチ正則化を有効にし たコードを作成してください。 問題なく作成できる。 パラメタが妥当かどうかは別の話。
回帰コードの修正:訓練データとテストデータ # 依頼 コードを修正してください。 # 詳細 ドロップアウトとバッチ正則化を無効にします。 全データを訓練データとテストデータに分けます。 テストデータで回帰モデルを評価してください。 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の関数を用います。
回帰コードの修正:訓練データとテストデータ 乱数により、かなり結果は異なります。 右が結果の図です。 図:実行結果
回帰コードの修正:説明変数の要素数の変更 修正されたコードの一部 説明変数が一つのコードだったので、 説明変数を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がコードを適切に書き直してくれます。 特に、ニューラルネットワークモデルが複雑な場合にネットワーク 定義パラメタの辻褄をあわせてくれるのでとても有用です。 実行結果は示しません。
回帰コードの修正: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 実行結果は示しません。
回帰コードの修正:ReCoデータへの適用 書き換え後のコード 010.regression/でも使ったReCoデータを用いる。 • • 隠れ層が1層では不足。 一般的なXに対応できるようにする。 1 # 依頼 class SimpleNN(nn.Module): のニューラルネットワークモデルを書き 換えてください。 # 詳細 隠れ層を2層にします。 入力層のサイズをPとします P 10 X,yを読み込む部分は自分で修正する。 図:実行結果 5
Autoencoder
ChatGPTを用いた画像解析例 物質例でなく、scikit-learnに含まれる手書き文字 データを用います。 このデータはよく知られており、例が多い方がChatGPTが コードを生成しやすいという理由です。 scikitの手書き文字を表示するコードを書いてください。 答え(ラベル) 画像 日本人の数字文字とやや異なる場合もある。 8x8のサイズで0から16までの値を持つことも知って います。 コメント: scikit-learnに含まれる手書き文字データは、28x28サイ ズのMNISTデータセットをサイズ縮小してデータセット にしています。scikit-learnの手書き文字はMNISTの手書 き文字をサイズ縮小して作成しているため、一部文字が 潰れています。 単に手書き文字データというとChatGPTはMNISTデータ セットを用います。
Autoencoder 完全に元画像に戻るかどうかは別として、 左のネットワークを用いて潜在空間 (latent space) の分布を評価するコー ドを書いてもらう。 Latent spaceは図示しやすいように二次 元にする。 Latent space 入力 encoder decoder 出力 出力が入力画像にどの程度戻るかは今は 人間が判断する。 (なるべく)入力画像に戻るように encoder-decoderのネットワークを修正 した。
Autoencoderコード生成 コード生成と説明はAPIでgpt4-oを用いた。 コードは修正して200.050.autoencoder.ipynb に保存してあります。
Autoencoder # 私について 私は機械学習手法の初心者です。 # 依頼 autoencoderのコードを書いてください。 latent spaceを二次元にしてください。 scikit-learnの手書き文字データセットを用いてください。 PyTorchを用いてください。 epoch vs lossを図示してください。 最後に、 latent spaceを離散値として色をつけてく可視化してください。 図:実行結果、epoch vs Loss, 元画像と再構成画 像の比較。
Autoencoder 4 1 7 6 2 3 5 9 0 9 1 図:二次元潜在空間 図:左の図の 二次元潜在空間を50%拡張し、各軸10 分割して、対応する画像を並べてた。
コードの説明 以下のコードをブロックごとに説明して ください
コードの説明 encoder decoder hidden_dim hidden_dim lattent_dim … … … … … Input_dim output_dim 全結合ニューラルネットワークモデル (ただし、これはgpt-4oが作った最初のモデル)
コードの説明
コードの説明 モデルの定義 for epoch in range(num_epochs): for 訓練データのバッチ毎に 1. モデルを訓練モードに 2. 勾配を初期化 3. フォーワードパス 4. 損失関数 5. バックプロパゲーション 6. パラメタ更新 モデルを評価モードに 予測値
損失関数 ``` loss = criterion(reconstructed, batch_data) ``` 部分が何を比較しているのかを教えてください。 batch_data: 元々の入力データ Reconstructed: オートエンコーダーが復元したデータ criterion = nn.MSELoss() と定義したので、 元々の入力データとオートエンコーダーが復元したデータの差を MSEで評価した。 元画像と再構成画像を MSEで比較。
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
コメント • Scikit-learnの手書き文字の画像が8x8サイズであること、0-16までの値を持つことをgpt-4o が知っていました。(それもあり、指定が簡単になるので Scikit-learnの手書き文字を使っ ています。)ユーザー画像を用いる場合は縦横サイズ、値が、0-255までであることなど、 をプロンプトに付け加えると適切なpreprocessをしてくれるでしょう。 • 例ではChatGPTは全結合ニューラルネットワークモデルを作成しましたが、畳み込みニュー ラルネットワークや(有名ならば)〇〇Netという指定も可能です。畳み込みニューラル ネットワークを用いても画像サイズにより妥当なネットワークは異なります。
Variational AutoEncoder (VAE)
VAEコード コード生成と説明はAPIでgpt4-oを用いた。 一部、o3-mini-high説明を行った。 コードは修正して200.060.VAE.ipynb に保存してあります。
Autoencoderの復習 まず、autoencoderの説明 variational autoencoderを説明してください。 autoencoderと比較して説明してください。 数式を用いてください。 𝑧 𝑥 𝑞𝜙 (z|x) 𝑥ො 𝑝𝜃 (x|z)
VAE 続いて、variational autoencoderの説明 1.と2. 𝑧 =𝜇+𝜎⊙𝜖 𝑥 3. 𝜇, 𝜎 2 𝑧 𝐿 = 𝐿𝑟𝑒𝑐𝑜𝑛𝑠𝑡𝑟𝑢𝑐𝑡𝑖𝑜𝑛 + 𝐿𝐾𝐿 𝑞𝜙 (𝑧|𝑥)の分布でlog 𝑝𝜃 (𝑥|𝑧)評価する。 サンプリングと再パラメタ化、 再構成誤差、KLダイバージェンス は次に説明。 第一項と第二項の比率は場合により異なる。 𝑥ො
autoencoderとvariational autoencoder autoencoder 6 . (𝑧 , 𝑧 ) 1 4 . 2 variational autoencoder 6 4 (𝜇1 , 𝜇2 , 𝜎12 , 𝜎22 )
サンプリングと再パラメタ化 サンプリングと再パラメータ化について 教えて下さい。 https://en.wikipedia.org/wiki/Reparameterization_trick
再パラメタ化トリック モデルの定義 for epoch in range(num_epochs): 訓練データを使って 1. モデルを訓練モードに 2. 勾配を初期化 3. フォーワードパス 4. 損失関数 5. バックプロパゲーション 6. パラメタ更新 モデルを評価モードに 予測値 勾配計算をconsistentに定義で きればよい。
再パラメタ化トリック 𝑧~N(𝜇, 𝜎 2 ) 同じに見える。 𝑧 =𝜇+𝜎⊙𝜖 ⊙ は成分ごとの積 𝑥 𝜇, 𝜎 𝑧 𝑥ො あるforward過程とbackward(backpropagation) 過程で それぞれ𝝐 をランダムにサンプリングする。 異なる。 →微分できない。 𝑥 𝜇, 𝜎 𝑧 𝑥ො 𝝐はランダムにサンプリングして作成されるが、 あるforward過程でサンプリングした 𝝐を同じbackward(backpropagation)過程でも使う。 → consistentに微分できる。 (PyTorchのコードの書き方で自然に同じ𝝐を用いるこ とになる。)
再構成誤差 Variational antoencoderの再構成誤差 を詳しく説明してください。 Autoencoderのコードも BCEで計算可能 画像が0-1なので誤差関数はどちらでも良い。
バイナリー交差エントロピー(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項とのバランスは異なります。
KL項 KLダイバージェンス(Kullback-Leibler divergence、カルバック・ライブラー情報量): o3-mini-highで VAEのKL divergence項 の式変形をを 説明して下さい。 𝐷𝐾𝐿 (P| Q = 𝑃 𝑥 𝑙𝑜𝑔 𝑥 𝑃(𝑥) 𝑄(𝑥) 𝐷𝐾𝐿 (P| Q = න 𝑑𝑥 𝑃 𝑥 𝑙𝑜𝑔 𝑃(𝑥) 𝑄(𝑥) とした回答の要約を表示する。 𝑃 𝑥 正解データの分布 に従うデータが与えられたとき、 そのデータを 𝑄(𝑥)(モデルが学習した分布) で表現したときの「情報のロス」
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は上の加え てかなり詳細に式変形して説明する。
KL項:分布の学習 訓練データ点全体の分布を定めたい。 全体をN(𝜇 = 0, 𝜎 2 = 1)で分布させる。 個々𝜇𝑖 , 𝜎𝑖2 をではない。 図:Autoencoderのlatent space
VAEコードの生成 # 依頼 {# コード}をvariational antoencoderを 用いたコードに書き換えてださい。 # コード (autoencoderコードをコピペ。) 結果を示す。 図:実行結果、epoch vs Loss, 元画像と再構成画像の比較。
VAEの結果 0 9 6 3 8 4 7 2 1 図:二次元潜在空間。𝑁(0, 𝐼)に従うはず。 図:左の図の 二次元潜在空間を50%拡張し、各軸10 分割して、対応する画像を並べてた。
VAEコードの説明 VAEのモデル定義と 損失関数の定義を詳しく説明してください。 コードと数式を関連付けてください。 「対数分散にするのはなぜ?」と聞くと、「𝜎 2 を評価するより計算が安定するから。」 と回答する。𝜎 2 = exp(log(𝜎 2 ))
VAEコードの説明 𝑧 =𝜇+𝜎⊙𝜖 ⊙ は成分ごとの積 𝑥 𝜇, log(𝜎 2 ) 実際のネットワーク 𝑧 𝑥ො
VAEコードの説明 Logvar = log 𝜎 2 mu.pow(2) = 𝜇2 Logvar.exp = exp(log 𝜎 2 )
コメント • かなり簡単な理解しやすいコードを書く。 • 説明はネットに書いてある説明をそのまま用いる。ネットの説明が分かりにくいと ChatGPTの説明も分かりにくい。 • 式変形の説明を依頼する場合はo3を使う方が正答率は上がる。しかし、完全ではないので、 式変形が正確かは自分で確認できるようになる必要はある。
全体に対するコメント 初心者が論文の数式やネットワークを見て、いきなり対応するコード書くことはできない。 大学での勉強は数式の理解→手法のコードだが、 実際は数式→PyTorch→手法のコーディングとなる。 ニューラルネットワークモデルは確立されたフレームワークが存在し、皆そのフレームワークに沿ってコードを書 くので、コードからの方が比較的理解しやすいかもしれない。 大学の授業の順序と異なりますが、PyTorchを例として手法のコード→数式の理解、でも良いと私は思います。理 解したい人は、コードやChatGPTの説明だけを見ても数式や背後の考え方が分からないので、数式をみるようにな るでしょう。 物理・化学を専門とした人が機械学習という数学の世界の式を見ても数式の書き方が異なり最初は理解しがたいで しょう。コードから入ると数式理解の手助けにもなると思います。 各自が数式変形を理解できる程度に数学の勉強も必要です。 各自が考えられるように勉強が必要なことも分かると思います。
全体に対するコメント 他にも回答を求めると、例が少ない手法はうまく回答できないことも分かるでしょう。 似た用語、同じ用語の説明をすることもあります。 例)「拡散モデル」シミュレーションの拡散モデル?生成AIの拡散モデル? ChatGPTの回答は常に批判的にとらえてください(=どこか間違っているに違いない) 。
以上です。