GANを用いた半教師あり学習

機械学習

GAN:敵対的生成ネットワークとは【GANを使用した教師なし学習】

2020年12月19日

こんにちは。産婦人科医のとみー(Twitter:@obgyntommy)といいます。

 

私は普段は画像系の機械学習の研究をさせて頂いてます。

 

研究の過程で教師なし学習で用いる"GAN"について学習したので、まとめました。

 

この記事の対象者は機械学習の初学者〜中級者の方です。

 

そのため、前線で活躍されている方には有益ではありません。

 

この記事では、まずはGANについて簡単に把握して頂き、次に実際にどの様な例で使用するのかということをGoogle Colaboratoryで手を動かして頂ければ幸いです。

 

Google Colaboratoryの使い方は以下の記事でまとめています。

 

Google Colaboratory グーグルコラボラトリー グーグルコラボ 使い方
Google Colaboratoryの使い方【完全マニュアル】

続きを見る

 

また、実際にGANを使用した教師なし機械学習をGoogle Colaboratoryで行った試行例は以下になります。実際にPythonのコードを動かして頂く事も可能です。

 

Google Colab
Google Colab

続きを見る

 

誤りがあった場合にはお問い合わせフォームにまでご連絡いただけましたら幸いです。

 

こちらのスライドに沿って解説させて頂きます。

 

 

 

 

GAN(敵対的生成ネットワーク)とは

GAN(Genera tive Adversarial Networks. 以下、GAN)敵対的生成ネットワークと呼ばれ、『生成』とあるように画像などを生成できる技術です。

 

例えば下図のように、GANのモデルに有名人の画像を学習させると、その後は有名人っぽい画像を出力するようになります。

 

GANは単純な画像生成の他に、DeepFakeなどの合成技術にも一部使われています。

 

GANのモデル概要

GANの中身は、Generator(以下G)と呼ばれるモデルとDiscriminator(以下D)と呼ばれるモデルの2つで構成されています。

»  PythonのGeneratorに関する説明【Python  tutorialより引用】

 

下図のようにGはランダムノイズから本物画像に似た画像(=偽画像)を生成するよう学習され、Dは入力された画像がGによる偽画像か本物画像かを見分けられるように学習されるます。

 

GANのモデル概要 GANの中身は、Generator(以下G)と呼ばれるモデルとDiscriminator(以下D)と呼ばれるモデルの2つで構成される。

 

GANを例にすると

前述のGとDに関しては、よくGを『偽通貨を偽造する偽造犯』とDを『偽通貨と本物の通貨を見分ける警察』と表現される事があります。

 

学習初期は偽造犯Gの偽造する通貨は大したことはないですが、警察Dもそれを中々見分けることが出来ません。

 

次第に警察Dは学習により見分ける能力が徐々に付いてくると、さらに偽造犯Gは偽通貨を本物っぽくすることで見分けがつかないようにしていきます。

 

学習後は偽造犯Gは本物と見分けがつかない偽通貨を造るようになり、警察Dは全てを本物の通貨と判断するようになります。

 

GANの分かりやすい例え GとDに関しては、よくGを『偽通貨を偽造する偽造犯』とDを『偽通貨と本物の通貨を見分ける警察』と表現される

 

GANの学習の仕組み

Gはノイズから画像を出力できるように、転置畳み込み層などを用いたニューラルネットワークを設定します。

 

Dは画像から本物/偽物のラベルを出力できるように、畳み込み層を用いたニューラルネットワークを設定します。(こちらは普通のCNNモデルと捉えても問題ないです)

 

Dの出力と正解ラベル(偽画像か本物画像か)の損失を計算して、その損失をDとGにバックプロパゲーションを行うことによりGとDのネットワークの学習を行います。

 

GANの学習の仕組み詳細 Gはノイズから画像を出力できるように、転置畳み込み層などを用いたニューラルネットワークを設定する。  Dは画像から本物/偽物のラベルを出力できるように、畳み込み層を用いたニューラルネットワークを設定する。(こちらは普通のCNNモデルと捉えても問題ない)  Dの出力と正解ラベル(偽画像か本物画像か)の損失を計算し、その損失をDとGにバックプロパゲーションを行うことによりGとDのネットワークの学習を行う

 

 

GANを用いた半教師あり学習

GANを用いた手法として半教師ありGANというものがあります。

 

半教師あり学習とは、教師あり学習において教師ラベルがつけられていないデータも学習に用いる手法でして、教師ラベルをつけるのにコストが大きい際に有効な手法となります。

 

以下の図は半教師ありGANの仕組みを示しています。

 

Gは前述と同様ですが、Dには本物画像のラベルありなし両方のデータを用いて

 

  • 本物画像に関しては画像分類(男か女か)タスク
  • 偽物画像に関しては本物画像と見分けるタスク

 

を解かせ学習させます。それによりラベルなし画像をDの学習に活かすことができ、Dの画像分類性能を従来より向上させることが可能となります。

 

GANを用いた半教師あり学習 GANを用いた手法として半教師ありGANというものがある。半教師あり学習とは、教師あり学習において教師ラベルがつけられていないデータも学習に用いる手法であり、教師ラベルをつけるのにコストが大きい際に有効な手法となる。  以下の図は半教師ありGANの仕組みを示す。Gは前述と同様だが、Dには本物画像のラベルありなし両方のデータを用いて 本物画像に関しては画像分類(男か女か)タスク 偽物画像に関しては本物画像と見分けるタスク を解かせ学習させる。それによりラベルなし画像をDの学習に活かすことができ、Dの画像分類性能を従来より向上させることが可能となる。

 

全体を把握して頂いた後に、以下の練習問題を手を動かして体験して頂ければ幸いです。

 

それでは次の項で、GANを用いた半教師あり学習による精度向上を実際に行ってみましょう。

 

GANを用いた半教師あり学習による精度向上の試行

GANを用いての半教師あり学習により、通常の教師あり学習に比べて精度が向上することを確認してみました。

 

データセットはMNISTを用い、ラベルがついているデータを1000個としています。

 

半教師あり学習の場合は、このラベルつきのデータ以外も学習データとして用います。

 

通常の教師あり学習モデルは、GANのDiscriminatorと同じネットワーク構造をもつとして設定します。

 

In[]

 

Out[]

GANを用いた半教師あり学習

 

 

 

In[]

 

MNISTのデータセットのクラスを作成します。

 

また今回「マスク」という手法を用いて、教師ラベルとして扱う1000個のデータはマスクをせず(1とする) それ以外の教師ラベルがないとするデータはマスクを行う(0で埋める)という方法にしました。

 

In[]

 

次にtrain時とtest時それぞれに使用できるDataLoader を利用する関数を定義します。

 

In[]

 

次にGeneratorのネットワークを定義します。Generatorは一般的には転置畳み込みと LeakyRelu  と呼ばれる活性化関数が用いられます。

In[]

 

次に Discriminator のネットワークを定義します。

 

Discriminator は LeakyRelu と呼ばれる活性化関数を使うのですすが、大体は一般的なCNNと一緒です。

In[]

 

続いて、このGAN半教師あり学習のモデルが通常の、教師あり学習のみの場合と精度が高いということを確認します。

 

そのために、一般的な教師あり学習分類モデルを設定します。このモデルのネットワークはDiscriminatorと一緒にしておきます。

In[]

 

gan_logit という関数がありますが、こちらはモデルの出力の1つであり非常に簡単にいうと「モデルが入力を本物と判断するほど出力値が高く、偽物と判断するほど出力値が小さくなる」です。

 

これにより本物偽物判断についての損失計算が可能になります。

In[]

 

続いて重み初期化とonehot処理をする関数を定義します。

In[]

 

続いてテスト時に使用する関数を定義しておきます。

 

In[]

 

続いて、モデルに関するものを中心にその他の変数を定義します。

 

In[]

 

Loaderデータの読み込みを行います。

 

In[]

Out[]
(略)

 

モデルやオプティマイザなどのインスタンスを作成します。

 

In[]

 

Out[]

(略)

 

In[]

 

続いて学習を行います。1epochごとにテストデータを用いて精度の確認を行っています。また、結構時間がかかりましたので注意してください。

 

In[]

Out[]

(略)

 

結果と精度結果

以下は上の結果を用いてテストデータでの分類精度がどのように変化するかを確認しています。

自分が確認した時の結果を入力しているため、皆さんの実行時の結果とは異なっている可能性がありますので異なっていてもご容赦ください。

 

In[]

 

Out[]

GANを用いた半教師あり学習

 

考察

以上の精度結果について考察です。

 

GANによる半教師あり学習により、分類モデルの精度を約4%ほど向上させることができました。

 

結果から、通常のモデルは精度の向上が不安定なことがありますが、半教師あり学習を用いたモデルは比較的安定的に精度が向上する結果となりました。

 

今後も色々と試してみますが、もしご覧になって頂いた方の中で御気づきの点があった場合には、お問い合わせフォームにまでご連絡いただけましたら幸いです。

 

Google Colaboratoryを使用してコードを動かす場合には、以下のリンクをご利用ください。

Google Colab
Google Colab

続きを見る

 

今回は以上となります。

 

関連記事 【入門から上級レベルまで】AI•機械学習におすすめの本25選

関連記事 無料あり:機械学習エンジニアの僕がおすすめするAI(機械学習)特化型プログラミングスクール3社


-機械学習
-, ,

Copyright© Tommy blog  , 2024 All Rights Reserved.