184 Views
May 08, 25
スライド概要
AI・機械学習を勉強したい学生たちが集まる、京都大学の自主ゼミサークルです。私たちのサークルに興味のある方はX(Twitter)をご覧ください!
2025年度前期輪読会 #3 (2025/05/08)【生成Deep Learning】 第4章 敵対的生成ネットワーク (4.1~4.2) 京都大学 大学院工学研究科 M1 河田 賢斗
アジェンダ ■ 4.1 イントロダクション ■ 4.2 深層畳み込みGAN(DCGAN) • • • • • • 4.2.1 Bricks データセット 4.2.2 識別器 4.2.3 生成器 4.2.4 DCGANを訓練する 4.2.5 DCGANの分析 4.2.6 GANの訓練 : ヒントとコツ • • • • • 4.2.6.1 識別器が生成器を圧倒する 4.2.6.2 生成器が識別器を圧倒する 4.2.6.3 役に立たない損失 4.2.6.4 ハイパーパラメータ 4.2.6.5 GANの課題に取り組む
4.1 イントロダクション ◆ 敵対的生成ネットワーク(Generative adversarial network : GAN) ◆ 論文「Generative Adversarial Nets」¹で導入された ⇒生成モデリングの歴史において重要なターニングポイントとなった ◆ 「生成器」(generator) と「識別器」(discriminator) の利用 生成器は、ランダムノイズから元のデータセットに含まれる画像に類似した画像を出力 識別器は、観測が元のデータセットからのものか、生成器が偽造したものかを予測する ⇒ 2つのネットワークの訓練を行うことで、生成器は識別器を騙し、識別器はどの観測が偽物か を正しく特定する ⇒ これが、GANのキーポイントである 図1. GAN内の2つのネットワークの入力と出力 3
4.2 深層畳み込みGAN(DCGAN) ◆ ブロックの写真を生成するGANをKerasで作成 ◆ 論文「Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks」²に追従 ⇒ 様々なデータセットからリアルな画像生成を実現するため の深層畳み込みGANを構築する方法及び生成画像の品質の 向上法について紹介されている ◆ コード ⇒ テキストのリポジトリの Jupyter ノートブック 04_gan/01_dcgan/dcgan.ipynb 上に存在 4
4.2.1 Bricks データセット ◆ BricksデータセットのLEGO画像を使用 ◆ 50種類のおもちゃブロックに関する4万枚の写真画像 ⇒ Bricks データセットのダウンロードの実行(下記コード参照) $ bash scripts/downloaders/download_kaggle_data.shjoostazelzet lego-brickimages ⇒ 画像が保存されているディレクトリを指す TensorFlow データセットを作成する ⇒ 元のデータセットは[0,255] の範囲の値となっているため、tanh活性化関数を使える ようにデータを[-1,1]の範囲にスケーリングしなおす(下記コード参照) def preprocess (img) : img = (tf.cast(img, “float32”) – 127.5 / 127.5 return img train = train_data.map(lambda x : preprocess(x)) 5
4.2.2 識別器 ◆ 識別器の目的は、画像が本物か偽物かを予測すること ⇒ 教師ありの画像分類問題であると考えることができる コードはテキスト例4-4に記載の通り ① InputLayer (None, 64, 64, 1) : 識別器のInput層を定義する ② Batchnormalization 層, LeakyReLU 層, Dropout 層を挟んで、Conv2D 層を重ねる ③ layers.Flatten()(x) を用いて最後の畳み込み層を平坦化する ④ 識別器を定義する Keras のモデルでは入力に画像を取り、出力には0~1の数値をとる ✓ Conv2D 層を通過させることで、テンソルの形状を小さくし、単一の予測に縮退させる ✓ 一方で、チャンネル数はConv2D 層を通過させることで増加し、畳み込みにより1つの予測に収束 される ✓ 最後のConv2D 層では sigmoid 活性化関数を用いて、0から1の値を出力する 6
4.2.3 生成器 ◆ 生成器は、潜在空間内のベクトルを画像に変換するという目的を有する ◆ 具体的には、多変量正規分布のベクトルから、元の訓練データの画像と同じサイズの画像を出力 ① 生成器のInput 層を、長さ100のベクトルで定義する ② 転置畳み込み演算が可能なように、Reshape 層 を用いて1×1×100 のテンソルに変換する ③ 4つのConv2DTranspose層に通し、間にBatch normalization 層とLeaky ReLU層を挟む ④ 最後のConv2DTranspose層は、tanh活性化関数により出力を[-1,1] の範囲に変換 ⑤ 長さ100のベクトルを受け入れ、形状[64,64,1] のテンソルを出力するKerasモデルを定義する ✓ Conv2DTranspose層のいくつかで2のストライドを用いて、ネットワークを通過させる際にテンソ ルの形状を大きくし、一方でチャンネル数を減少させている ✓ Conv2DTranspose層を使う代わりに、Upsampling2D層の後に、ストライド1のConv2D層を使う 方法もある 7
4.2.4 DCGANを訓練する ◆ 訓練方法について ◆ 識別器の訓練→生成器の訓練の順に実行 ✓ 識別器の訓練 ⇒ 訓練セットからの本物の画像と生成器から出力された偽画像を含んだ訓練セットを用いる ⇒ 教師あり学習問題(本物の画像 : ラベル1、偽画像 : ラベル0) として扱い、損失関数として2値の交 差エントロピーを用いる ✓ 生成器の訓練 ⇒ 生成された各画像をスコアリングする方法を見つけ、高いスコアの画像となるように訓練 ⇒ 作成された画像のバッチを識別器に通し、各画像のスコアを取得する ⇒ この確率ベクトルとベクトル1(識別器が本物だと思う画像を生成したい)との間の2値の交差エント ロピーが損失関数となる ✓ 訓練は交互に行い、一度に1つのネットワークの重みだけを更新することが重要 ✓ 生成器の訓練では、生成期のパラメータを更新させて、識別器に1(本物)に近いと予測されたい ⇒ 識別器の重みも変化させると、識別器が生成器により出力された画像を本物だと認識するようにな るだけである 8
4.2.4 DCGANを訓練する ◆ 具体的な処理について ① 生成器と識別器の損失関数は BinaryCrossentropy である ② ネットワークの訓練開始時には、多変量標準正規分布からベクトルのバッチをサンプリングする ③ これらを生成器に通し、生成された画像のバッチを作成 ④ 次に、実画像のバッチの真偽を予測させる ⑤ 生成画像のバッチの真偽を予測させる ⑥ 識別器の損失は、本物の画像(ラベル1)と偽の画像(ラベル0)の両方にわたる平均2値交差エントロ ピーである ⑦ 生成器の損失は、生成画像の識別器の予測値とラベル1との間の2値交差エントロピーである ⑧ 識別器と生成器の重みを別々に更新する ✓ 理想的には、訓練プロセスは生成器が識別器から意味のある情報を学習できるような均衡を見つけ ることである ✓ 十分なエポックの後、識別器が優勢になる傾向があるが、生成器もすでに十分に高品質な画像の生 成を学習している可能性が高い ✓ 生成器を圧倒させず、訓練プロセスの安定化を図るために、訓練ラベルに少量のランダムノイズを 加えることが重要(ラベルの平滑化) 9
4.2.5 DCGANの分析 ◆ 生成器が出力した画像について ◆ 生成器は訓練プロセスにおいて、訓練セットから取り出したとしても差 し支えない画像を生成することに長けるようになる ⇒ある意味、ランダムノイズから何か意味のあるものに変換できている ⇒上手くいく生成モデルに求められることとは? テキストでは、訓練セット内の、生成された画像の出力例に最も近い画像 をL1距離を用いて検索 def compare_images(img1, img2) return np.mean(np.abs(img1 – img2) ⇒訓練セットの高いレベルの特徴を理解し、訓練で見たことのあるもの とは異なる例を生成 10
4.2.6 GANの訓練 : ヒントとコツ/ 4.2.6.1 識別器が生成器を圧倒する ◆ GANを訓練する際に直面する問題や課題について ◆ 識別器が生成器を圧倒する ⇒ 最悪のシナリオでは、識別器は本物の画像と偽の画像の分離方法を完 璧に学習し、勾配消失が起こり、訓練が全く出来なくなる ⇒ 識別器を弱める方法を見つける必要がある 以下①~⑤の手法が存在する ① Dropout層のrateパラメータを増やして、ネットワークを流れる情 報量を減衰させる ② 識別器の学習率を下げる ③ 識別器の畳み込みフィルタの数を減らす ④ 識別器の訓練時にラベルにノイズを加える ⑤ 識別器の訓練時に画像のラベルをランダムに反転させる 11
4.2.6.2 生成器が識別器を圧倒する ◆ 生成器が識別器を簡単に騙す方法を見つけてしまう場合 ◆ モード崩壊として知られている ⇒ 生成器が、常に識別器を欺く単一の観測(モード)を見つけ、潜在入力空間のすべての点をこの画像 に写像し始める ⇒ 損失関数の勾配が0に限りなく近づき、この状態から回復できなくなる ⇒ 識別器を再学習しようとしても、生成器は識別器を惑わす別のモードを見つけるだけである ⇒ 生成器は、出力を多様化する動機がない (解決策) ✓ 前頁の①~⑤で挙げたことと反対のことを実施する ✓ バッチサイズを上げる ✓ 両方のネットワークの学習率を下げる 12
4.2.6.3 役に立たない損失/4.2.6.4 ハイパーパラメータ/4.2.6.5 GANの課題に取り組む ◆ 損失関数に関して(4.2.6.3 役に立たない損失) ◆ 損失関数が小さくなれば、生成される画像の品質が向上するのでは? ✓ 生成器はその時点での識別器が評価する一方、その識別器はディープラーニングの訓練プロセスに おいて徐々に良くなる ⇒ 訓練プロセスにおける異なる場所で評価された損失関数を比較することは困難 ⇒ テキスト図4-6で示す通り、画像の品質が向上するにも関わらず、生成器の損失関数は時間の経過 とともに増加傾向にある ⇒ 生成器の損失と画像品質との相関関係の欠如が、GANの訓練をモニタリングしにくくする ◆ ハイパーパラメータ(4.2.6.4 ハイパーパラメータ) ◆ 識別器と生成器両方の全体的なアーキテクチャでは、ストライド・バッチサイズ・カーネルサイ ズ・学習率・活性化関数・ドロップアウト・バッチ正規化・潜在空間 など考慮すべき多数のパラ メータがある ⇒ GANの内部の動きを理解し、損失関数の解釈の仕方を知ることで、モデルの安定性を向上させる可 能性のあるハイパーパラメータを調整できる ◆ GANの課題(4.2.6.5 GANの課題に取り組む) GANモデルの安定性が劇的に改善 ⇒ WGAN-GP(Wasserstein GAN with Gradient Penalty) を次章以 降で説明 13
参考文献 1 : Ian J. Goodfellow et al., “Generative Adversarial Nets, ” June 10, 2014, https://arxiv.org/abs/1406.2661 2 : Alec Radford et al., ““Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks, ” January 7, 2016, https://arxiv.org/abs/1511.06434 14