Docker、敵対的画像生成でAI性能向上!?

2020.04.20

Lab研究員 北山

もくじ

  1. 1.Docker、その先へ
  2. 2.ラベルスムージング正則化
  3. 3.学習サンプル増量
  4. 4.GANとAutoEncoder

Docker、その先へ

Lab_Column_202004_1.png

 

 

 

Docker は仮想化技術の一種です。

数年前までは Windows への対応が芳しくなく、使い勝手に難がある印象でした。
月日は流れ Docker は進化しメジャーになりました。

昨今 GitHub の普及などもあり個人レベルのものを含めると数多くの OSSが公開されています。GitHub は2008年には約33,000件だったリポジトリ数が2018年に1億件(プライベートを含む)を突破したそうです。でも、それらOSSは動作要件がバラバラで,バージョンの整合性など、その環境構築はエンジニア泣かせです。

特にAIは開発スピードが凄まじく、GPU の cuda バージョンを 10 にしなさいだとか、ライブラリが古くてインストールできないだとかで、あちらのアプリを立てればこちらのアプリが動かないなど、これまで何度も苦い経験をしました。

コンテナ仮想化技術なら様々な環境を併存できて便利ですが、その環境を別のマシンやクラウド環境へ複製するのはやはり面倒です。
Dockerなら環境(コンテナ)の配布が楽々、Linux アプリを Windows 上で動かしたり、Windows Server アプリを Windows10 で動かすといったことが実現できます。

Lab_Column_202004_2.png

 

 

 

 https://www.nginx.com/

しかも、Docker Hub というサイトに著名なアプリケーションのコンテナイメージが公開されているので、それを使えば初期インストール作業すら不要です。今回はWEBサーバとして有名な Apache の代替として注目の軽量 WEBサーバ nginx(エンジンエックス)をノートPC(Windwos10)で動かしてみます。

あらかじめノートPCに Docker Desktop for Windows をインストールしておく必要があります。インストール方法はこちら↓

Install Docker Desktop for Windows
https://docs.docker.com/docker-for-windows/install/

Community Edition (CE) が無償版、Enterprise Edition(EE)は有償です。
対応プラットフォームはこちら↓を参照ください。

対応プラットフォーム
http://docs.docker.jp/engine/installation/#platform-support-matrix

ググれば Docker の情報は豊富です。
では nginx を動かしてみましょう!

コマンドプロンプト画面を開き、いきなり nginx を実行します。
ポート番号は適宜変更ください。ここでは 8080 です。

Lab_Column_202004_3.png



初回は Docker Hub から nginx のコンテナイメージが自動でダウンロードされます。

ブラウザで localhost にアクセスすると・・・

Lab_Column_202004_4.png

Linuxアプリの nginx が Windows10 上であっさり動きました
Docker はオンプレやAWS、Azure、GCPなどの環境が混在する現代に必須のキーテクノロジーとして要注目です。

ここから本題です。

ラベルスムージング正則化

敵対的画像を調べている中で、興味深い論文を見つけたので共有です。
製造業では規格値を境目として良品と不良が分けれられます。

Lab_Column_202004_5.png

識別境界を挟んで良品と不良が隣り合わせであり、境界付近では似通った画像なのに一方は良品、他方は不良とラベル付けされます。
でも学習時にAIに与える正解ラベルは1か0、つまり 100% か 0% のどちらかです。「ちょっと不良っぽいけど良品」のような "程度" が表現されません。

このため「明らかな良品」も「ちょっと不良っぽいけど良品」もAIは同じように必死に「100%良品だ」と覚えようとします。どのように必死なのかというと、少し前の記事で紹介した確信度のグラフで表すと、確信度を 100% にするためには x → ∞ 無限大 にしなければならないということです。

Lab_Column_202004_6.png

AI がどれだけ頑張っても 100% には届かない!?

AIへの無茶な要求は過剰適合につながる可能性があります。そこで 100% ではなく例えば 「90% でいいよ」と曖昧さを許容してあげることにします。そうすれば無限大にする必要がなくなります。これをラベルスムージング正則化 LSR, Label-Smoothing Regularization といいます。

手書き数字画像 MNIST の分類で試したところ、僅かですが、でも、全ケースで交差エントロピーより正解率が高くなりました。

Lab_Column_202004_7.png

学習サンプル数を変えて何度も試した結果↓

縦軸は正解率. 青がLSR、オレンジは通常の交差エントロピー
差が分かりづらいが全てにおいてLSRが交差エントロピーを上回っている

参考として chainer 用に実装したLSR損失関数のコードを掲載しておきます↓

Lab_Column_202004_8.png

※注 log_softmax() を用いているのはアンダーフローを回避するためです.
対数をとることで掛け算の繰り返しを足し算に変更しています。

LSR論文はこちら↓
https://arxiv.org/abs/1512.00567

学習サンプル増量

敵対的画像生成を利用し学習用サンプルを増量すれば、AI の性能を向上させられるかもしれません。どうすれば学習用サンプルを増やせるか、その方法を検討します。多分に憶測を含みますのでご留意ください。
敵対的画像の生成方法↓ 

Lab_Column_202004_9.png


(詳細は前号を参照)

ここで C は画像分類器 Classifier です。
Cの逆伝播で敵対的画像を最適化します

ここで図のこの部分↓に注目すると

Lab_Column_202004_10.png

左右を反転させると順伝播で画像を生成できる!
これが現在、AIの画像生成でよく用いられる転置畳み込みです。転置畳み込みは、畳み込みが逆伝播で行う演算を順伝播で実行できるようにしたものです。
以降では、この画像生成モデルをジェネレータ, Generator と呼びます。

Lab_Column_202004_11.png

GANとAutoEncoder

画像を生成できても学習に有効なサンプルでなければ意味がありません。
例えば数字の "6" を学習させたいなら数字の "6" に見える画像を生成しなければダメです。数字の "6" に見えるかどうかをどうやって判断しますか

そこは人力ではなく AI に任せたい。
ということで数字の "6" に見えるかどうか、つまり本物か偽物かを識別する AI (以下、ディスクリミネータ)を別に用意して、ジェネレータとディスクリミネータを互いに競い合わせればいいじゃないか、というのが GAN です。

Lab_Column_202004_13.jpg


GANについての詳細は、別のコラムで紹介したいと思いますが、GANはジェネレータとディスクリミネータを競争させることから学習を収束させるのが難しいことで知られています。
ところで GAN の図をよく見ると「ノイズ」とありますが。
このノイズって何でしょうか?

Lab_Column_202004_14.png

ここではノイズを「特徴」だと考えます。例えばゾウには鼻の長さだったり、耳の大きさだったりという特徴がありますが、このノイズを操作することで、鼻の短いゾウや耳が小さいゾウの画像を生成することができるといった特徴の強弱を操作するレバーのようなものをイメージしてください。

Lab_Column_202004_15.png


もし、そのような操作レバーがあれば、様々なバリエーションの教師画像を生成できます。

手書き数字を識別する画像分類器は0~9の数字の「らしさ」を出力しますが、この「らしさ」も一種の画像の特徴といえます。
そこで特徴を抽出する画像分類器とジェネレータを組み合わせて、次のアーキテクチャを実現できないでしょうか。

Lab_Column_202004_16.png


このアーキテクチャは畳み込みAutoEncoderといわれるものです。

中途半端ですが、次回へ続きます。

  • LINE
  • Mail