update.はじめに株式会社NTTデータ数理システムのitok_msiです。みなさんご存知のように、GANを用いた画像変換が結果のセンセーショナルさもあいまって、注目を浴びています。写真を絵画調にする、馬をシマウマに変換する、航空写真から地図を作成する、など様々な応用例が開発されています。[1]を使って「画像内の犬をポーズと毛並が似た猫に変換するモデル」を作成してみようと思います。実は、犬を猫に変換するというタスクは、上に上げたような「馬をシマウマに変換する」「航空写真から地図を作成する」といったタスクとは微妙に異なるのですが、それに関しても後程説明します。cycleGANcycleGANは、2つのデータソース間の変換を学習するGANの一種です。pix2pix[2]とは異なり、2つのデータソースのインスタンスが1対1に対応していなくても学習が行えるのが特徴です。$D_A$を学習します。D_B$をだませるほど本物に近いデータを生成しようとします。作成した偽物のデータと本物のデータを区別できるよう学習します。A}$で変換すると、もとのデータに戻ることを要請します。B}$で変換すると、もとのデータに戻ることを要請します。具体的には、目的関数として次のような3つの誤差の和を用います。目的関数を大きくするように学習します。lossと呼ばれるもので、いわゆる再構築誤差です。A}$でデータを変換した結果がそれぞれ元のデータを再構築できるだけの情報を保持している必要があります。A}$として「A,Bに共通する構造を保ったまま、あるソースのデータをもう一方のソースのデータに変換する」関数が得られることになります。馬とシマウマのデータセットを与えると、画像内の馬のポーズを保ったままシマウマに変換する関数を学習できます。残念がら犬を猫に変換するのは一筋縄ではいきません。cycleGANの論文でも次の図のように失敗例として犬猫変換が紹介されています。猫と犬は毛並や質感こそ似ているものの、特に顔の形が異なります。このように形の変形を伴う変換は今後の課題として論文でも指摘されていました。cat}$は恒等写像を学習してしまっているように見えます。そこで、cycleGANで犬猫変換を作成しようとしたとき恒等写像を学習してしまう原因を考えてみました。lossの効果が強すぎる犬猫変換のように形状の変化を伴う変換は、入力画像の情報をある程度犠牲にせざるを得ません。lossを大きくしてしまいます。lossは最小になります。lossを小さくするという観点では恒等変換の方が有利です。恒等変換では犬を猫に変換できないため、cycleGANが想定する状況では$L_{GAN}$が大きくなってしまうはずです。cat}$で犬画像を変換した結果とオリジナルの猫画像は$D_{cat}$で明確に区別できることを想定しています。ここで問題になってくるのが犬と猫は局所的にとてもよく似ているということです。D_B)$の学習にpatchGAN[1][2]の機構を採用しています。これは入力画像がGeneratorによって作られたものかオリジナルのソースのものか判別するときに、画像全体を使わず、画像内の局所的なpatch(小領域)を元に判別するというものです。$L_{GAN}$の計算の際は画像上でpatchを滑らせていき、各patch上の判別の誤差の平均をとります。Discriminatorのネットワークを小さくできるという利点はありますが、猫と犬は局所的にとてもよく似ているので、学習は難しそうです。cat}$が恒等変換であっても$D_{cat}$をうまくだましてしまう可能性があります。今回は上に上げたような問題点を回避するために、cycleGANに簡単な2つの修正を施しました。Discriminatorでglobalな情報も見るようにする詳細は省略しますが、patchGANのDiscriminatorに層を追加し、globalな情報と局所的な情報の両方について$L_{GAN}$を計算するようにしました。lossの係数をオリジナルの1/10程度に減らしました。実験cycleGANの論文の著者らにより公開されているpytorchによるcycleGANの実装に上記の修正を加えて実験を行いました。実行環境はawsのp2.2xlargeインスタンスです。うまくいった例(猫→犬)なんかバカっぽい猫はなんかバカっぽい犬に変換されました。安直な修正では、期待したような結果は得られませんでした。動物の色の情報を保てていない背景と動物が区別できていないぼやけた画像になってしまっている変換先の猫や犬がほぼ同一種にみえる例が多い印象です。原因としては再構築誤差の割合を小さくしすぎたDiscriminatorのネットワークが大きすぎてうまく学習できていないなどが考えられます。今回は「画像内の犬をポーズと毛並が似た猫に変換するモデル」を作成を試みましたが、そもそも「ポーズ」や「毛並」は高次元な特徴量であり、再構築誤差として画像のピクセルごとの差を計算するcycleGANでは分が悪い気がします。再構築誤差としてより高次元の特徴量を比較したら、、、という考えに基づくGANの手法もあるので、機会があればそちらも記事にしたいと思います。(2017/06/14追記)上記の実験では再構築誤差の割合を小さくしすぎたため、形が大きく崩れてしまっていたようなので、再構築誤差を割合を元に戻し実験をし直しました。比較的うまくいった例(猫→犬)比較的うまくいった例(犬→猫)失敗例(猫→犬)失敗例(犬→猫)犬や猫が正面を向いている場合は比較的うまくいく印象です。正面から見ると、猫も犬も目鼻口の配置が似通っているためと思われます。最後の例のように、横を向いている場合や、猫にはない大きな耳を持った犬の変換は、大胆な形の変更が必要なため、依然難しいようです。機械学習系の論文について、いろいろな追加実験をした結果を記事にしていきたいです。upLoginユーザーは見つかりませんでした。