9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【検証】AI Agentは学術論文を読んでプロトタイプ実装まで本当にできるのか?(波乱の実装編)

Last updated at Posted at 2025-10-07

はじめに

GMOコネクトの永田です。

前回の記事では論文読解と設計まで実施しましたが、今回はスタート(Inputにするドキュメント)を揃えた上で、実装を試してみます!

設計までだと多少のブレがあっても違いが分かりにくいですが、実装になるとプログラムした通りにしか動きませんので、モデルの力量がストレートに出てくると期待されます。

まとめ

  • アウトプットは、人がレビュー出来る程度の、「適度な」大きさにタスク分解する方が良い
    • VibeCodingに一気にやらせすぎるとレビューが辛いのと、うまく動作しない時の切り分けが困難なため
      • 再現性がありエラーログで分かるものは良いが、機械学習のようなエラーは出ないが結果がおかしい系は、切り分けがとても困難なため、適度に分解したい
  • まさかのGPT-5 miniが一番素直だった😊
    • Modelが新しくなったりコンテキストが大きくなると、余計なお世話でbugを入れる傾向にある? previewなのでまだ完全じゃない可能性あり。
  • (当たり前だけど)一見正しく動作していても実装漏れや誤りがあるので、人手でのレビューは必須
    • 全数レビューは難しいので、コアロジック部分(今回で言うとFedGANとGANのロジック)のみ念入りにレビューし、結果出力などそれ以外はレビューを簡易にする(それっぽく出力できていればOK)のが良い

事前準備: GAN Tensorflow Tutorialを準備

動作がおかしかったとき、GANの実装自体に問題があるのか、FedGANの実装に問題があるのか、の切り分けを容易にするため、一旦(Federatedではない)単体で動作するGANを準備します。

実務でも、人がレビューしやすい単位でタスクを良い感じに分割しておくと良いかと思います。

GPT-5 miniに単体GANを作ってもらう

では、作ってもらいます。

参考にできるTutorialがあるので、まずはこのTutorial+αを作ってもらいましょう。
Tutorialがあるので、GPT-5 miniでも十分なアウトプットになるだろう、という予測から、GPT-5 miniを選択しています。(CopilotのPremium requestsの節約という思いもありますが)

Tutorialはこれです。

変な独自実装を入れてこないように、前もって釘を刺しておきます😡
(たまに変な独自実装いれてくるので)

Tensorflow GAN Tutorialを元に、GANを実装。
https://www.tensorflow.org/tutorials/generative/dcgan?hl=ja

- 実装結果は、src/gan_tf_tutorial/ に保存。
  - requirements.txt も上記フォルダに保存

- model, loss, optimizerはTutorialのままとすること

- まずは実装までで、実際に動作させての検証は後で行う

- Python3.12 venv

- 以下のライブラリを使用
  - TensorFlow2.16.2(MacOSのGPU利用のため)
  - tensorflow-metal(MacOSのGPU利用のため)
  - numpyを利用する場合、Python3.12をサポートしているバージョンとする

- CLIで実装し、可変パラメータはCLIのparameterで定義

- 学習完了後、以下のデータを主力
  - Epoch毎の学習完了後にgeneratorで画像を生成
    - Animnation GIFで、学習の経過を可視化するため、generatorへのSeedは固定すること。
      - see: Tensorflow Tutorial, You will reuse this seed overtime (so it's easier) to visualize progress in the animated GIF)
    - Animation GIF生成も、今回のプロトタイプで実装する。
    - Animation GIFは生成画像に加え、Epoch数も画像に含めること
   - 注意: あくまでepoch毎の結果確認のseedが固定であり、学習に使うseedはbatch毎にrandomとすること
    - see: Tensorflow Tutorial, def train_step(images):
  - Loss Graph(PNG、CSV)、generatorとdiscriminatorを合わせて1つのPNGとCSVにする

単体GANの動作検証

さて、サクッと作ってくれたので、動作確認していきます。

❯ pip install -r src/gan_tf_tutorial/requirements.txt 
Collecting tensorflow==2.16.2 (from -r src/gan_tf_tutorial/requirements.txt (line 1))
  Using cached tensorflow-2.16.2-cp312-cp312-macosx_12_0_arm64.whl.metadata (4.1 kB)
ERROR: Could not find a version that satisfies the requirement tensorflow-metal==0.8.4 (from versions: 1.2.0)
ERROR: No matching distribution found for tensorflow-metal==0.8.4

いきなりエラーですね😇
ライブラリのバージョンが古かったり、特定バージョンにmatchしたバージョンの選択といったことは、生成AIは苦手なイメージです。

エラーそのままをAgentにいれて直してもらいます。・・・10分ぐらい経過して、変な修正してきましたね。

今回versionはTensorflowに合わせてpipの自動選択でもいいので、tensorflow-metal==0.8.4tensorflow-metal>=0.8.4 に手動でそっと直して、次にいきます。

また、ざっとレビューしてみたところlossがEpoch内の平均ではなかった(Epoch毎の最終Batchのlossだった)ので、分かりやすいように直してもらいます。

train.py の loss 記録を「エポック平均」に修正

さて、概ね良さそうですので、GPTさんが実施手順をREADME.mdに書いてくれた内容に沿って、流してみます。

python train.py --epochs 50 --batch_size 256 --output_dir outputs --save_gif

それっぽく出来ました!

losses.png

training_progress.gif

事前準備

FedGAN実装結果のチェックポイント(レビュー観点)作成

さて、実際にFedGANを実装してもらう前に、チェックポイント(レビュー観点) をまとめておきましょう。
Agentの検証用なので、今回は手動で一覧化します。
(内容的には、普通の開発のソースコードレビューと同じですね)

Category Point
Python 実行時エラーがないか
TF Tensorflow GPUが使えているか? @tf.function を使ってくれているか
GAN GANのモデル、Optimizer、損失関数がTutorialと同じか
FedGAN Agent class, Intermediary classが実装されているか
FedGAN MNISTデータがAgent毎に分割されているか
FedGAN 重みの初期値をAgentで統一する処理があるか
FedGAN Agent毎にlocal generator, discriminator, optimizerがあるか
FedGAN Epoch毎の学習はAgent classに実装されているか
FedGAN 同期間隔K毎に、重みの同期を行っているか
FedGAN Server(Intermediary)は、重みの加重平均のみか。Agentのデータ数に比例した加重平均か
FedGAN 学習結果が収束しており、生成画像がTutorialに近いものか
GAN 学習結果として、Epoch毎の画像およびAnimationGIFと、Loss Graph(PNG/CSV)が保存されているか
GAN AnimationGIF用にEpoch毎の生成画像のSeedが固定されているか
Python プロトタイプとして必要最小限の実装になっているか
Python コメントやtypingは十分か

利用したprompt

今回も、「実装方針の思い」は丁寧に伝えます。
実行できない系のエラーが出ない限り、1回のみAgentに指示します。
(実務ではレビューコメントなど、Agentにフィードバックしてあげてください)

FedGAN論文の読解結果と実装方針( docs/docs/fedgan_summary_gpt5_codex.md )を元に、
FedGANのプロトタイプを実装。

実装結果は、src/fedgan_{model}/ に保存。
・requirements.txt も上記フォルダに保存


##### 実装方針

- まずは実装までで、実際に動作させての検証は後で行う

- GANの実装は、DCGAN Tutorialを参考にする: src/gan_tf_tutorial
  - Python3.12 venv
  - src/gan_tf_tutorial/requirements.txt: 以下のライブラリを使用
    - TensorFlow2.16(MacOSのGPU利用のため)
    - tensorflow-metal(MacOSのGPU利用のため)
    - numpyを利用する場合、Python3.12をサポートしているバージョンとする
  - GANのmodel、optimizer、ノイズdim、MNISTデータ前処理など、GANの設定は、Tutorialを参考にする
  - データはMNISTを利用
  - 学習完了後、以下のデータをAgent毎に主力
    - Epoch毎の学習完了後にgeneratorで画像を生成
      - Animnation GIFで、学習の経過を可視化するため、generatorへのSeedは固定すること。
        - see: Tensorflow Tutorial, You will reuse this seed overtime (so it's easier) to visualize progress in the animated GIF)
      - Animation GIF生成も、今回のプロトタイプで実装する。
      - Animation GIFは生成画像に加え、Epoch数も画像に含めること
     - 注意: あくまでepoch毎の結果確認のseedが固定であり、学習に使うseedはbatch毎にrandomとすること
      - see: Tensorflow Tutorial, def train_step(images):
    - Loss Graph(PNG、CSV)、generatorとdiscriminatorを合わせて1つのPNGとCSVにする
  - 生成画像の品質評価は、今回のプロトタイプのスコープ外

- FedGAN実装の注意点
  - Single-Processで良い。
    - 今回のプロトタイプでは、Single-Loopでの簡易な実装で良い
    - Agent-Server間の通信実装は、今回のプロトタイプのスコープ外
  - CLIで実装し、可変パラメータはCLIのparameterで定義
    - 以下はソースコード上できる限り可変とする。
      - Agent、動作検証時は3Agent
      - Epoch、動作検証時は50Epoch
      - 同期間隔K、動作検証時は5
  - FedGANのAgentはclassで定義し、Agent毎にインスタンスを分ける
  - 仲介者(intermediary, サーバ)の処理は、別のclassに分ける
    - 将来的に、Agent-intermediaryの通信処理を拡張しやすくするため
  - サーバの加重平均は、各エージェントのデータサイズに基づく

使ったモデル

設計から引き続き、次の3つを追加います。

モデル 選定理由
GPT-5 mini 0x の中で一番良かった
Claude Sonnet 4.5(preview) 新しいので、その1
GPT-5-Codex(preview) 新しいので、その2

FedGAN実行時の条件

  • Agent数: 3
  • Epoch: 50
  • 同期間隔: 1
  • BatchSize: 256

では、実際にやっていきましょう!

FedGANをAgent(生成AI)のみで実装してみた

summary

  • 総評
    • GPT-5 mini: いくつかコメントしたいところ(❌)はあったものの、アウトプットが全くできない・異なるような、致命的な問題はなかった。
      • 人手による追加コメントをするのであれば、十分実用的。
    • Claude Sonnet4.5: 学習Loopが誤っていそうという致命的なバグあり(その他のバグもあるかは未確認)、ソースやドキュメントはGPT-5 miniより綺麗で読みやすい
    • GPT-5 Codex: Claude Sonnet 4.5と同じ傾向あり
Category Point GPT-5 mini Claude Sonnet4.5 GPT-5 Codex
Python 実行時エラーがないか
TF Tensorflow GPUが使えているか? @tf.function を使ってくれているか
GAN GANのモデル、Optimizer、損失関数がTutorialと同じか
FedGAN Agent class, Intermediary classが実装されているか
FedGAN MNISTデータがAgent毎に分割されているか
FedGAN 重みの初期値をAgentで統一する処理があるか
FedGAN Agent毎にlocal generator, discriminator, optimizerがあるか
FedGAN Epoch毎の学習はAgent classに実装されているか
FedGAN 同期間隔K毎に、重みの同期を行っているか ❌❌❌ ❌❌❌
FedGAN Server(Intermediary)は、重みの加重平均のみか。Agentのデータ数に比例した加重平均か
FedGAN 学習結果が収束しており、生成画像がTutorialに近いものか ❌❌❌ ❌❌❌
GAN 学習結果として、Epoch毎の画像およびAnimationGIFと、Loss Graph(PNG/CSV)が保存されているか
GAN AnimationGIF用にEpoch毎の生成画像のSeedが固定されているか
Python プロトタイプとして必要最小限の実装になっているか
Python コメントやtypingは十分か

生成画像比較

Model loss graph(Agent0) gen image(Agent0)
(比較用)GAN losses.png training_progress.gif
GPT-5 mini agent_0_losses.png training_progress.gif
Claude Sonent 4.5 agent_0_losses.png training_progress.gif
GPT-5 Codex agent_0_loss.png training_progress.gif

GPT-5 miniのNG箇所の詳細

(TF)Tensorflow GPUが使えているか? @tf.function を使ってくれているか

  • GAN Tutorilalのrequirements.txt を引き継いで、tensorflow-metal あり
  • ただ、batch毎の学習で @tf.function が削除されている

(FedGAN) 重みの初期値をAgentで統一する処理があるか

前回GPT-5 miniで分析していた時に、この観点が抜けていたのでわざわざCodexの設計をベースにしたのですが、やっぱり実装時にも入れてくれませんでした😇
(追加コメントすると修正はしてくれそうでした)

-->結局、他のmodelもこの処理はだれも実装してくれず

(GAN) 学習結果として、Epoch毎の画像およびAnimationGIFと、Loss Graph(PNG/CSV)が保存されているか

Animation GIFがAgent=0しか出力されていませんでした。
(その他の結果出力はOK)

ただ、これぐらいなら、コメントするとすぐに修正してくれそうです・

Claude Sonnet 4.5のNG箇所の詳細

(Python) 実行時エラーがないか

2025-10-06 17:11:31.733110: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:117] Plugin optimizer for device_type GPU is enabled.
  Agent 0: gen_loss=0.7009, disc_loss=1.4535
  Agent 1: gen_loss=0.6913, disc_loss=1.4644
  Agent 2: gen_loss=0.7033, disc_loss=1.4060
Traceback (most recent call last):
  File "/fedgan-paper-agent/src/fedgan_claudesonnet4_5/main.py", line 228, in <module>
    main()
  File "/fedgan-paper-agent/src/fedgan_claudesonnet4_5/main.py", line 180, in main
    agent_params = [agent.get_parameters() for agent in agents]
                    ^^^^^^^^^^^^^^^^^^^^^^
  File "/fedgan-paper-agent/src/fedgan_claudesonnet4_5/agents/agent.py", line 142, in get_parameters
    gen_weights = [w.numpy() for w in self.generator.get_weights()]
                   ^^^^^^^
AttributeError: 'numpy.ndarray' object has no attribute 'numpy'. Did you mean: 'dump'?

エラーになったので、上記をAgentにそのまま投げて修正してくれました。
すぐに修正してくれたので、それほど大きな問題ではないです。

(FedGAN) 同期間隔K毎に、重みの同期を行っているか

Line171で、同期間隔 args.sync_interval をAgentに渡してます。

次に Agent#train_local_epochs の実装を確認してみましょう。

Epoch数分local学習をするのではなく、Batch数分の学習しかしていないですね😇
ざっくりと、本来学習したかったbatchの1/100ぐらいしか、学習が進んでいないです。

これは致命的です。

(FedGAN) 学習結果が収束しており、生成画像がTutorialに近いものか

おそらく上記のbugに起因して、学習がほとんど進んでいないです。
(他にもbugが残っている可能性がありますが、未確認)

GPT-5 CodexのNG箇所の詳細

(TF)Tensorflow GPUが使えているか? @tf.function を使ってくれているか

  • GAN Tutorilalのrequirements.txt を引き継いで、tensorflow-metal あり
  • ただ、batch毎の学習で @tf.function が削除されている

(FedGAN) 同期間隔K毎に、重みの同期を行っているか

Line200で、同期間隔 args.sync_interval をAgentに渡してます。

次に Agent#train_local_steps の実装を確認してみましょう。

Epoch数分local学習をするのではなく、Batch数分の学習しかしていないですね😇
ざっくりと、本来学習したかったbatchの1/100ぐらいしか、学習が進んでいないです。

これは致命的です。(Claude Sonnet 4.5に続いて2回目)

(FedGAN) 学習結果が収束しており、生成画像がTutorialに近いものか

Claude Sonnet 4.5と同じ

(再掲)まとめ

  • アウトプットは、人がレビュー出来る程度の、「適度な」大きさにタスク分解する方が良い
    • VibeCodingに一気にやらせすぎるとレビューが辛いのと、うまく動作しない時の切り分けが困難なため
      • 再現性がありエラーログで分かるものは良いが、機械学習のようなエラーは出ないが結果がおかしい系は、切り分けがとても困難なため、適度に分解したい
  • まさかのGPT-5 miniが一番素直だった😊
    • Modelが新しくなったりコンテキストが大きくなると、余計なお世話でbugを入れる傾向にある? previewなのでまだ完全じゃない可能性あり。
  • (当たり前だけど)一見正しく動作していても実装漏れや誤りがあるので、人手でのレビューは必須
    • 全数レビューは難しいので、コアロジック部分(今回で言うとFedGANとGANのロジック)のみ念入りにレビューし、結果出力などそれ以外はレビューを簡易にする(それっぽく出力できていればOK)のが良い

弊社では、機械学習・AI・LLMなどを使ったサービスの開発や技術支援をはじめ、幅広い支援を行っておりますので、何かありましたらお気軽にお問合せください。

お問合せ: https://gmo-connect.jp/contactus/

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?