はじめに
GMOコネクトの永田です。
前回の記事では論文読解と設計まで実施しましたが、今回はスタート(Inputにするドキュメント)を揃えた上で、実装を試してみます!
設計までだと多少のブレがあっても違いが分かりにくいですが、実装になるとプログラムした通りにしか動きませんので、モデルの力量がストレートに出てくると期待されます。
まとめ
- アウトプットは、人がレビュー出来る程度の、「適度な」大きさにタスク分解する方が良い
- VibeCodingに一気にやらせすぎるとレビューが辛いのと、うまく動作しない時の切り分けが困難なため
- 再現性がありエラーログで分かるものは良いが、機械学習のようなエラーは出ないが結果がおかしい系は、切り分けがとても困難なため、適度に分解したい
- 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.4
を tensorflow-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
それっぽく出来ました!
事前準備
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と同じ傾向あり
- GPT-5 mini: いくつかコメントしたいところ(❌)はあったものの、アウトプットが全くできない・異なるような、致命的な問題はなかった。
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 | ![]() |
![]() |
GPT-5 mini | ![]() |
![]() |
Claude Sonent 4.5 | ![]() |
![]() |
GPT-5 Codex | ![]() |
![]() |
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に一気にやらせすぎるとレビューが辛いのと、うまく動作しない時の切り分けが困難なため
- 再現性がありエラーログで分かるものは良いが、機械学習のようなエラーは出ないが結果がおかしい系は、切り分けがとても困難なため、適度に分解したい
- VibeCodingに一気にやらせすぎるとレビューが辛いのと、うまく動作しない時の切り分けが困難なため
- まさかのGPT-5 miniが一番素直だった😊
- Modelが新しくなったりコンテキストが大きくなると、余計なお世話でbugを入れる傾向にある? previewなのでまだ完全じゃない可能性あり。
- (当たり前だけど)一見正しく動作していても実装漏れや誤りがあるので、人手でのレビューは必須
- 全数レビューは難しいので、コアロジック部分(今回で言うとFedGANとGANのロジック)のみ念入りにレビューし、結果出力などそれ以外はレビューを簡易にする(それっぽく出力できていればOK)のが良い
弊社では、機械学習・AI・LLMなどを使ったサービスの開発や技術支援をはじめ、幅広い支援を行っておりますので、何かありましたらお気軽にお問合せください。