Re:ゼロから始めるML生活

機械学習ド素人が、流行に乗ってニューラルネットとかその他いろいろ勉強してみるブログ

【R】時系列分析の覚書(導入)

こんな本を買ってみたので、エンジニアというよりデータサイエンティストっぽい機械学習の勉強もぼちぼち再開します。

この本すごい評判が良いそうで、読んでて構成がわかりやすかったです。 全体構成と今回の対象は下図にします。

f:id:nogawanogawa:20180715133805j:plain:w500

ということで、まずは導入をやってみます。

時系列分析とは

時系列分析とは、時間方向に関して得られる系列的なデータに対する分析のことです。

もうちょっと詳しく言うとこんな感じらしいです。

基本的には関心のある事象における過去・現在・未来の値を適切に把握し(推定し)、関連してその結果を元に、事象の仕組みや影響に関する知見を得たり対策を考えたりする営みである

やることのなんとなくのイメージがこんな感じです。

f:id:nogawanogawa:20180716101546j:plain:w500

時系列分析を通じて、何らかの値を推定することになるのですが、この本では確定的手法と確率的手法の2種類に分けて解説されています。 確定的手法は状態空間モデルを用いた分析(基本)、統計的手法は状態空間モデルを用いた分析(応用)で扱うようです。

確率・統計について

この本とんでもなくわかりやすいので、詳しい説明は本を読んでいただければと。 用語の定義とかをさわりだけ列挙していきます。

平均やら分散やらは、過去にやっているのでこちらをご参照。

tsunotsuno.hatenablog.com

その他、新しく出てきたとこだけ見ていきます。

複数の確率変数の関係

不安定に揺らぐ変数を確率変数と呼び、大文字のアルファベットで表します。 確率変数自体は値ではなく関数に近い意味合いを持ち、確率変数の具体的な値は実現値と言い、小文字のアルファベットで表します。

確率変数X, Yについて、X, Yが同時に成立する同時確率


p(x, y)

と表されます。 また、確率変数X, Yについて、Yが確定したときのX条件付き確率


p(x | y)

と表されます。 条件付き確率に対して、確率の乗法定理を使用すると以下の関係が導けます。


p(x | y)p(y) = p(x, y) = p(y, x) = p(y | x)p(x)

上式から、


p(x | y) = \frac{p(y | x)p(x)}{p(y)}

が得られます。上の関係をベイズの定理と呼びます。 ちなみに、p(x)事前確率p(x | y)事後確率p(y | x)を(xの条件での)尤度(ゆうど)と呼んだりします。事前確率を条件を確定することで事後確率に変換することをベイズ更新と言ったりします。

確率過程

確率変数が時間方向につながった集合を確立過程といいます。 表記としてはX_t, Y_tのように下付き文字を使用してタイムステップを表現します。

共分散・相関

ある時系列を説明する際に使用される統計量として、共分散・相関が使われます。

共分散Cov)は、確率変数のX, Yの関連を表していて、それぞれの確率変数の期待値と比較したときの値の大小の関係性を表現します。


Cov[X, Y] = E[(X - E[X])(Y-E[Y])]

共分散を規格化したものを相関係数\rho)といいます。


\rho = \frac{Cov[X, Y]}{\sqrt{Var[X]}\sqrt{Var[Y]}}

相関係数は-1〜1の値になり、負、0、正に応じて下記のような関係性があることを示しています。

f:id:nogawanogawa:20180716151100j:plain:w500

確率過程X_t, Y_tに関して、時間軸方向にラグkだけずれたX_t, Y_{t-k}に関する共分散を表す相関関数は、下記のように表現されます。


R(t, k) = E[X_t Y_{t-k}]

異なる確率変数間だけでなく、一つの確率変数の時間方向のラグに関する相関を見る場合は、自己共分散・自己相関係数を使用します。

自己共分散は下記の式で表されます。


Cov[X_t, X_{t-k}] = E[(X_t - E[X_t]) (X_{t-k} - E[X_{t-k}])]

自己相関係数は下記の式で表されます。


\rho_{t,k} = \frac{Cov[X_t, X_{t-k}]}{\sqrt{Var[X_t]}\sqrt{Var[X_{t-k}]}}

自己相関係数も-1〜1の範囲で値を取りますが、今回は値ではなくtkの関数になっています。 時刻とラグの関数から周期的な変動を確認することができます。

定常過程と非定常過程

強定常・弱定常・非定常に関して、時刻が変動したときに平均・分散・自己共分散・自己相関係数・確率分布そのものが変動するかどうかをまとめると下記の様になるそうです。

分類 平均・分散・自己共分散・自己相関係数 確率分布
強定常
弱定常
非定常

この本では、弱定常のことを定常と呼んでいるそうです。 要するに、周期性があれば定常、なければ非定常といったところでしょう。

最尤推定ベイズ推定

確率分布を特徴づけるパラメータ\thetaは一般に未知であり、何らかの方法で特定化します。 確率過程Y_t (t=1, 2, ..., T)全体の尤度はp(y_1, y_2, ..., y_T; \theta)で表されます。 この自然対数である対数尤度


l(\theta) = log p(y_1, y_2, ..., y_T; \theta)

で表され、これを用いて尤度が最大にするように\thetaを決定する方法を最尤法と呼びます。 最尤推定


\hat{\theta}= argmax\ l(\theta)

で表されます。

パラメータ\thetaすら確率変数として取り扱うのがベイズ推定と言うそうです。

とりあえずやってみる

数式ばっかりなのは苦手なので、実際にやってみて感じを掴んでみます。 基本的な分析の流れはこんな感じらしいです。

  1. 目的の確認とデータの収集
  2. データの下調べ
  3. モデルの定義
  4. パラメータ値の特定
  5. フィルタリング・予測・平滑化の実行
  6. 結果の確認と吟味
  7. 1.へ戻る

1. 目的の確認とデータの収集

データ

今回使用するデータはこちらです。

  1. ナイル川の年間流量
  2. 待機中の二酸化炭素濃度
  3. 英国の四半期ごとのガス消費量

※本当は4つ目もあったんですが11章に詳しい説明があるらしく、今回は省略。

目的

分析の目的と対象となるデータを以下に示します。

  目的 データ
1 データ取得中に各時点でのノイズをできる限り除去する 1. 2. 3.
2 過去の急激な変化を捉える 1.
3 未来の値を予測する 2.

2. データの下調べ

まずはデータをそのままの形で見てみます。 データの眺め方にもいろいろあるみたいで、この本では下のような表示を行っています。

横軸時間のプロット

ナイル川の流量については、あまり規則性が見られません。 これは不規則な擾乱を除けば、毎年概ね同じ値に保たれているということを意味します。 二酸化炭素濃度については、小刻みに上下を繰り返しながら、全体としては右肩上がりの傾向が見て取れます。 イギリスのガスの量は右肩上がりの傾向があるようで、更に年々変動の幅が大きくなっていることがわかります。

ヒストグラムと五数要約

どのグラフにも大きな外れ値はなさそうです。 ここで、二酸化炭素濃度のデータについては、東日本大震災時の際のデータの欠損がありますので、前後の月のデータの値の平均で代用しています。 欠損は放って置くと変な結果になったりするそうなので、潰しておきます。

自己相関係数

全体として自己相関係数の値がある程度ありそうなので、時系列的な関係性がありそうだとわかります。 また、イギリスのガスのデータはラグが整数のとき自己相関係数が大きくなる傾向があるようです。

周波数スペクトル

フーリエ変換して周波数成分の大きさを確認します。 音とかで言うところの、「聞こえてきた音の中から、成分("ド"とか"レ"とか)がどれくらい入っているか」を調べる作業みたいなものです。

ナイル川の流量についてはあまり周波数成分に特徴が見られません。 二酸化炭素濃度とイギリスのガスについては、特定の周波数成分が大きくなっている事がわかります。

3. モデルの定義

だいたい、傾向がわかったところで仮置きでモデルを設定してみます。

f:id:nogawanogawa:20180717213549j:plain

左から、レベル、傾き、周期を表していて、これを組み合わせでグラフが構成されていそうだということが想像つきます。

  1. レベル
  2. レベル + 傾き + 周期
  3. レベル + 傾き + 周期

なんとなく、こんな感じの組み合わせで表現できそうです。

4. パラメータ値の特定

検討したモデルに対して、具体的な数字を当てはめていきます。 上で指定したモデルでは、経済分野などで使用されるホルト・ウィンタース法が使用できます。

ホルト・ウィンタース法

k期予測値\hat{y}_{t+k}は次のように表されます。


\hat{y}_{t+k}= level_t + trend_t k + season_z{t-p+k_p^+}

このとき、レベル(level)、傾き(trend)、周期(season)はそれぞれ、

level_t = \alpha(y_t - season_{t-1}) + (1 + \alpha)(level_{t-1} + trend_{t-1})

 trend_t = \beta(level_t + level_{t-1}) + (1-\beta)trend_{t-1}

season_t = \gamma(y_t - level_t) + (1 - \gamma)season_{t-p}

となります。ここで、k_p^+ =  \lfloor(k-1)mod p\rfloor +1です。

式で書くとややこしいですが、Rにはこれらをビシッと計算してくれる関数が用意されており、HoltWinters()でパラメータを決定できます。

5. フィルタリング・予測・平滑化の実行

HoltWinters()でサクッとパラメータを特定できます。

赤い点線がモデルによるフィッティング(フィルタリング値)を表すグラフです。

成分ごとに見ていくとこんな感じだそうです。

未来の予測に関しては、二酸化炭素濃度を使用して、未使用の2015年分を予測するとこんな感じになります。

6. 結果の確認と吟味

最後に仮定したモデルが良いか悪いかを評価します。 今回、目的はこんな感じでした。

  • データ取得中に各時点でのノイズをできる限り除去する
  • 過去の急激な変化を捉える
  • 未来の値を予測する

ノイズの除去に関しては、残差(Residual)を確認します。これが大きいとモデルと実測値がかけ離れていることになるので、ノイズを除去しきれていないことを意味します。これはどこまでを許容するかわかりませんが、今回は一旦良しとします。

また、過去の急激な変な変化を捉えるという点については、ナイル川の流量が1899年に急減しているそうですが、そこを捉えることはできていません。この点については更に改良が必要と言うことがわかります。

未来の予測については、二酸化炭素濃度の予測は直感的には一致しているように見えるので、問題ないこととします。

ここで出てきた問題を踏まえて再度手順をやり直し、モデルを改良していきます。

感想

基本的な用語、式の説明と簡単な時系列分析のやり方の説明でした。 久しぶりにやるとRむずいっす。。。

【論文メモ:HDGAN】Photographic Text-to-Image Synthesis with a Hierarchically-nested Adversarial Network

論文

[1802.09178] Photographic Text-to-Image Synthesis with a Hierarchically-nested Adversarial Network

著者

Zizhao Zhang, Yuanpu Xie, Lin Yang
University of Florida

背景

テキストから写実的画像を生成すること(Text-to-Image)は生成モデルの分野での大きなテーマとなっている。 このテーマでは、精細な画像を生成することと入力したテキストとの一貫性を両立することが必要になる。

Text-to-Imageの分野では、近年ではGANを用いた生成モデルが多数提案されている。 GANを使用する場合には学習の収束と安定性が大きな課題となる。 これらの課題を解決し解像度とテキストの一貫性を実現するような先行研究が行われてきたが、解像度が低かったり大きなネットワークを必要としたりと、まだまだ確立した手法があるとは言えない。

目的とアプローチ

目的

高解像度かつテキスト一貫性を併せ持つ生成モデルの実現

アプローチ

HDGAN (High-Definition results and the idea of Hierarchically-nested Discriminators)

  • one generator - multi discriminator の使用によるステージングを必要としない
  • 中間生成画像を段階的にDiscriminatorに入力するLoss

提案手法

HDGAN

GANを使用した生成モデルの先行研究では、学習を安定させるためにStageを使用したり、multi Discriminatorにすることで、DiscriminatorがGeneratorより過剰に学習していくことを回避していた。 今回の提案手法であるHDGANの概要を下記に示す。

f:id:nogawanogawa:20180625223238j:plain

HDGANは、Generator1つに対して、複数の階層的Discriminatorを用意する。 Generatorの中間生成画像をそれぞれDiscriminatorに入力することで、Generatorを1つにすることが可能である。

また、先行研究と提案手法を比較を下記に示す。

f:id:nogawanogawa:20180625223635j:plain

(A)StackGANでは、低解像度の画像を生成するStage-Ⅰと高解像度の画像を生成するStage-Ⅱの二段階のステージを使用する。 Stage-Iを先に重点的に学習することで、安定した学習が可能になる一方で、通常のネットワークに加えステージを導入するためアーキテクチャが複雑になる。

(B)また、GMANのようにDiscriminatorを複数使用したGANのモデルも提案されている。 これによって、Discriminatorに1つの場合より、Generatorの学習が安定する。 一方で、これを高解像度の場合に適用してうまくいくかは不透明である。

(C)さらに、PGGANでは低解像度から高解像度まで段階的にGeneratorとDiscriminatorの層を増やしていく。 これにより、低解像度の層が安定するまで学習して層を追加するので、安定して学習させる事ができる。 一方で、高解像度を生成しようとするにつれて、高い演算性能ができる。

(D)提案手法では、Generatorの中間生成物と対応する解像度のDiscriminatorに入力する。 これにより、隠れ層の出力に対するフィードバックの信号がより強いフィードバックとして反映されるため、学習が安定化する。

Multi-purpose adversarial losses

一般的なGANの目的関数を下記に示す。

f:id:nogawanogawa:20180702213014j:plain

ここでGはGenerator、DはDiscriminatorを表している。 このように一般的なGANではGeneratorとDiscriminatorのLossを最小化することが目的関数になっている。 このときのLossは下記の様になっている。

f:id:nogawanogawa:20180702213741j:plain

Eはクロスエントロピーを表し、DiscriminatorをGeneratorに対して2つの項を考えている。

一方、HDGANの目的関数を下記に示す。

f:id:nogawanogawa:20180702213105j:plain

一般的なGANに対して、Textに関する項tが追加されている。 このときのLoss計算の概念図とLossの計算式を下記に示す。

f:id:nogawanogawa:20180625223709j:plain

f:id:nogawanogawa:20180702213118j:plain

HDGANでは、Discriminatorが複数あるmulti-Discriminatorの構成を取るため、Generatorの隠れ層の分だけLossを個別に計算して足し合わせ る。 そのため、Lossも各階層について計算した後、総和を取ることで表現される。

Architecture Design

Generator

Generatorは単純な3つのモジュールで構成される。

  • K-repeat Res block
    • 畳み込み層×2
    • ReLU
    • batch normalization
  • stretching layers
    • サイズ2の近傍アップサンプリング
    • ReLU
    • 畳み込み層×1
    • batch normalization
  • linear compression layers
    • 畳み込み層
    • Tanh(RGB空間に圧縮)

入力は conditioning augmentationと学習済みのembedding matrixによって生成された1024×4×4のembeddingを使用する。

Discriminator

Discriminatorはシンプルにストライド2の畳み込み層に対してバッチノーマライゼーションとLeakyLUを適用させる。 実装には2通りの選択肢がある。 1つはDiscriminatorそれぞれに対して教師データと生成データの判別を行う方法である。 もう1つは、始めに512×4×4の特徴マップと128×4×4のtext embeddingを合体させる。 それからサイズ1の畳み込み層を使用してテキストと画像の特徴を統合し、4×4の畳み込み層によって画像とテキストのペアに対して教師データと生成データとを判別する。

その他の最適化等は通常のGANと同様であるため割愛する。

評価

Experimental Setup

Dataset

評価に使用するデータセットは下記の3種類である。

  • CUB dataset
  • Oxford-102
  • COCO dataset

Evaluation metric

評価の指標としてInception scoreとMulti-scale structural similarity (MS-SSIM score)を使用する。 これら2つはGANの評価に広く使用されている一方、テキストと生成画像の一貫性については評価できない。 そこで本研究では、 Visual-semantic similarityを評価指標として導入する。

Visual-semantic similarityは下記の式によって評価する。

f:id:nogawanogawa:20180702213933j:plain

ここでvはインセプションモデルによって抽出された特徴ベクトルを表す。 スコアリング関数cを使用して二次元のロスを計算している。

テスト段階においては、text embeddingと生成画像のペアで算出される特徴ベクトルは同じであることが望ましい。 上の式によって、ペアの特徴ベクトルが親しいほど、大きく算出される仕組みとなっている。

先行研究との比較

提案手法の妥当性を評価するために、先行研究との比較を行う。 比較対象は、GAN-INT-CLS、GAWWN、TAC-GAN、Progressive GAN、StackGAN、StackGAN++をとする。 特に、StackGANについては詳細に評価する。

提案手法と比較対象のInception scoreを下記に示す。

f:id:nogawanogawa:20180625224100j:plain

HDGANでは、CUBのデータセットでStackGANに比べて45%、StackGAN++に比べて31%良いなど、先行研究に対して非常に良い効果が得られている事がわかる。 Oxford-102では、TAC-GANと同等の結果が得られているが、TAC-GANで使用しているような付加情報を本研究では使用していないという優位性がある。

提案手法とStackGANで生成された画像を下記に示す。

f:id:nogawanogawa:20180625224207j:plain

f:id:nogawanogawa:20180625224241j:plain

提案手法のほうが、文章の詳細も表現され、自然な色使いで複雑な形状を表現できている。

解像度別のInception scoreを下記に示す。

f:id:nogawanogawa:20180625224313j:plain

解像度が高くなってもInception scoreはStackGANより優れている。 また、StackGANでは画像の一貫性が崩れているが、HDGANでは解像度を大きくしたときに画像の一貫性が崩れていない。

Visual-semantic similarityの評価を下記に示す。

f:id:nogawanogawa:20180625224124j:plain

HDGANのほうが値が大きく、意味論的な一貫性が取れていることがわかる。

さらに多様性についても評価した結果を下記に示す。

f:id:nogawanogawa:20180625224438j:plain

HDGANは、同じ入力からでも広いバリエーションで画像を生成できている。

MS-SSIMについてStackGAN・Prog.GANと比較した結果を下記に示す。

f:id:nogawanogawa:20180625224507j:plain

StackGANよりEquallity lineより小さく、多様性の高い優れたモデルとわかる。 また、Prog.GANと比較してもMS-SSIMの値は優れている。

文を書き換えによるstyle transfer

文の書き換えによるstyle transferに関する結果を下記に示す。

f:id:nogawanogawa:20180625224528j:plain

提案手法により、なめらかに画像が変換されている事がわかり、細部まで表現されている。

考察

階層的敵対性学習

階層化した学習の妥当性に関して、下記に示す。

f:id:nogawanogawa:20180625224558j:plain

Discriminatorの層が深くなればなるほど、当手法は有効であると考えられる。 また、StackGANではStageごとにTextを入力していたが、当手法では入力は一度だけにもかかわらず、良い結果となっている。

局所的画像のLoss

局所的画像のlossの使用について評価する。

f:id:nogawanogawa:20180625224614j:plain

上の表ではlocal image lossを使用した場合(w/)、使用しない場合(w/o)よりも値が優れることがわかる。 そのため、local image lossの活用は妥当であるといえる。

また、下記の図からも、テキストの内容をより詳細に反映した画像を生成できることがわかる。

f:id:nogawanogawa:20180625224632j:plain

結論

本論文では、中間生成画像をDiscriminatorに階層的に学習させるHDGANを提案した。 本手法により、先行研究よりテキストに忠実かつ表現力のある生成モデルが実装されることがわかった。

【論文メモ:PGGAN】Progressive Growing of GANs for Improved Quality, Stability, and Variation

論文

https://arxiv.org/abs/1710.10196

著者

Tero Karras, Timo Aila, Samuli Laine, Jaakko Lehtinen
NVIDIA

背景

生成的手法の中でも現在特に優れているものには、autoregressive models、variational autoencoders (VAE) そして generative adversarial networks (GAN)などが挙げられる。 これらにはそれぞれ長所・短所があり、現在も研究が進められている。

このうち、GANは生成する分布(画像など)の解像度が高くなるに連れてランダム要素の影響が色濃くなり、DiscriminatorはGeneratorの生成分布と教師データを区別することが容易になってしまい、ネットワーク全体の学習が不安定になる。 このように、GANは高解像度の画像を出力することが難しいという問題がある。

目的とアプローチ

目的

  • GANを用いた高解像度分布の生成

アプローチ

PGGAN(Progressive Growing of GANs)

  • 段階的にネットワーク層を増加させ、追加した層の影響を学習に度合に応じて比重を変化
  • ミニバッチ標準偏差を活用した多様性の向上
  • マルチスケールによるワッサースタイン計量を用いた統計的類似度の使用

提案手法

PGGAN(Progressive Growing of GANs)

PGGAN(Progressive Growing of GANs)の概念図を下記に示す。

f:id:nogawanogawa:20180528215414j:plain

PGGANでは、低解像度の画像(上では4×4)から学習を開始し、徐々に層を追加することで対象の画像の解像度を向上させる。 層を新しく追加する際には、学習がなされていないためランダム要素が強く、Generatorの出力にランダム要素が強く反映されてしまう。 そこで、PGGANでは下図のように、出力に対する新しく追加した層の影響度(α)を段階的に増やす。

f:id:nogawanogawa:20180528215600j:plain

これにより、ネットワーク全体の出力として学習が完了していない層のランダム要素を軽減することが可能になり、学習が安定化する。

ミニバッチ標準偏差を活用した多様性の向上

GANでは、学習データの範囲でしか特徴を学習できず、学習データの限られた特徴に大きく影響された学習をしてしまう恐れがある。 この問題を解決するために、ミニバッチの標準偏差を用いた正規化によってミニバッチのまとまりから得られる特徴を学習する方法を導入する。

はじめに、ミニバッチ内のテンソル(H×W×C)で同じ位置に対応する画素について標準偏差を計算し、H×W×Cのテンソルを一つ求める。 次にそのテンソル内のすべてのピクセルの平均を計算し、スカラ値を一つ得る。 最後にそのスカラ値を複製し、一つのテンソルを作成する。

この処理は、理論上ネットワークのどこにでも挿入することができるが、諸々の事情からDiscriminatorの最終層に挿入する。 (詳細は論文のAppendix参照)

補足

イメージとしてはこんな感じらしいです。

f:id:nogawanogawa:20180603112433j:plain

GeneratorとDiscriminatorの正規化

学習データに特徴的な学習データが含まれている際に、そのデータに学習結果が強く影響を受けてしまう問題がある。 一般にこの問題に対してはバッチノーマライゼーションを使用して対処することが多い。 しかし、我々はGANのネットワーク自体が問題なのではなく、学習信号の大きさとその評価に制限がないことに問題があると考えた。

そこで我々は下記の2つの成分を使用することでこの問題に対処する。

Equalized learning rate

従来のネットワークの重みの繊細な初期化は行わず、0~1の範囲での初期化に対して実行時にネットワークの重みを変化させる。 ネットワークの重みに下記の式を導入する。


\hat{\omega_i} = \omega_i / c

ここで、\omega_iはネットワークの重み、cはレイヤごとの標準化定数を表す。

通常Adamなどでは、入力パラメータとは独立に標準偏差をもとに勾配を決める。 そのため、ダイナミックレンジが大きいパラメータはそうでないパラメータよりも学習に時間を要する。 我々の手法では、ダイナミックレンジを考慮されるため、すべてのパラメータで均質の学習スピードを確保することができる。

Pixelwise feature vector normalization in generator

GeneratorとDiscriminatorがコントロールできなくならないように、Generatorの各畳み込み層のあとに各ピクセルごとにfeature vectorを正規化する処理を行う。

f:id:nogawanogawa:20180603122733j:plain:w280

ここで、\epsilon=10^{-8}はネットワークの重み、Nは特徴マップの数(チャンネル数)、abはそれぞれオリジナルと正規化された特徴ベクトルを表す。

これにより、変化の小さな学習の際には影響は小さく、変化の大きな学習の際には必要に応じて信号を減衰させることができる。

マルチスケールにおける統計的類似性の使用

異なるGANのモデルを評価するには、膨大な数の生成画像を評価する必要があり、主観的になってしまう。 したがって、これらの評価には画像から得られる指標を用いて自動的に評価する必要がある。 これまでも、multi-scale structural similarity (MS- SSIM)のような手法もあったが、色や形状の多様性による細かな効果には影響しにくい。

我々は、優れたGeneratorはどんなスケールにおいても学習データと類似した局所的画像構造を生成するものだと考えている。 そこで、教師データとラプラシアンピラミッドによって得られる局所イメージを統計的に比較する手法を用いる。 連続するピラミッド階層において、前のレベルをアップサンプリングしたものと次のレベルとの差分を見ることで、これを実現する。

各層は7×7の画素近傍によって表現される記述子(各層128個)で表現される。 それぞれの記述子を正規化し、標準偏差を計算、その後ワッサースタイン計量によって類似度を判定する。 これにより、小さい解像度部分で見たときの差分は画像全体の大まかな構造を捉え、高解像度部分で見たときの差分は輪郭やノイズといった部分まで表現する。

補足

イメージとしてはこんな感じみたいです。

f:id:nogawanogawa:20180603153152j:plain

評価

実際に生成された画像はこちら。

youtu.be

統計的類似度に関する評価

sliced Wasserstein distance (SWD) とmulti-scale structural similarity (MS- SSIM)に関する評価を行う。

条件は下記のとおり。

  • 最新のloss function (WGAN-GP)と学習の設定を使用
  • 学習データ : CelebA, LSUN BEDROOM
  • 解像度 : 128×128

次の表は数値的にSWDとMS-SSIMに関してワッサースタイン計量とMS-SSIMを計算した結果である。

f:id:nogawanogawa:20180528215914j:plain

また、提案手法によって提案された画像を下記に示す。

f:id:nogawanogawa:20180528220113j:plain

直感的に、良い評価指標では様々な色や形状、視点が反映されたもっともらしい画像が良い評価とされるべきである。 つまり、(h)の行が最も値が小さくなるはずである。 しかし、今回それがMS-SSIMには見られない。 そのため、MS-SSIMより提案手法のSWDのほうが良い指標と考えられる。

収束及び学習スピード

収束と学習速度に関する評価結果を下記に示す。

f:id:nogawanogawa:20180528220454j:plain

図(a)はprogressive growingがない場合、(b)はprogressive growingがある場合を示している。 これらを比較すると、progressive growingを使用したほうが収束時のSWDの値が小さく、学習時間を短縮できている事がわかる。

progressive growingなしだとマクロな視点とミクロな視点の両方の学習を同時にこなす。 一方progressive growingありの場合は低い解像度の学習は終わっているため、解像度を大きくしたときに安定して学習できている。

図(b)より、各ラプラシアンピラミッドの層において、はじめの低解像度のときはまっすぐSWDが減少している。 解像度が向上しても、一貫してSWDは減少傾向を示している。 一方、図(a)ではすべての各ラプラシアンピラミッドの層で似たカーブの動きを見せ、データによって共鳴した学習をたどっている。

図(c)より、progressive growingを使用した場合は1024×1024の画像について収束するまでに96時間要したのに対し、progressive growingを使用しなかった場合には520時間を要した。 そのため、progressive growingを使用したほうが約5.4倍高速化する事がわかる。

CelebAを用いた高解像度画像の生成

本論文で1024×1024の高解像度の画像を生成した結果を下記に示す。

f:id:nogawanogawa:20180528220626j:plain

これらの画像を生成するのに、Tesla V100 GPUを8機使用して、4日計算した。

LSUNの結果

LSUNのBED-ROOMについて、生成画像を比較したものを下記に示す。 f:id:nogawanogawa:20180528220756j:plain

また、下記には別のLSUNカテゴリの図を示す。

f:id:nogawanogawa:20180528221024j:plain

全般的に生成画像の質は高いが、先行研究と大差ない。

実装

著者の方が実際に書いてくれているので、こちらをご参照。

https://github.com/tkarras/progressive_growing_of_gans

コードを眺めるだけならいいけど、実際に計算は勘弁してください。 論文の実装では100万くらいのGPU8機使ってるし、GitHubのREADMEによるとGPUは1000万超えるみたいですし。 ここまでくると一般人では、予算的に実行することすら不可能ですね。

おまけ

書いてる途中で超わかりやすいブログで見つけました。 すごい参考にさせていただきました。 ありがとうございます。

st-hakky.hatenablog.com

TensorBoardを使ってみた

今回はTensorFlowのライブラリに付属しているTensorBoardなるものを使って色々可視化してみたいと思います。

参考にさせていただいたのはこちらです。

deepage.net

TensorBoard

TensorFlowにはTensorBoardという付属のツールがあって、こいつを使えるのがTensorFlowの結構大きなポイントだったりします。

TensorBoardではTensorFlowでの実行時に発生するデータを可視化・表現できます。 可視化できるものとして代表的なものはこんな感じらしいです。

使い方

TensorBoardでは、可視化したいデータや形式をプログラム中に明示的に指定することで、 TensorBoardが表示するための情報を裏で取得してくれるみたいです。

手順

そもそも動くTensorFlowを使用したコードがある状態から考えると、手順としてはこんな感じでしょうか。

  1. プログラム中に可視化用のコードを追加
  2. 普通にプログラムを実行
  3. TensorBoardを起動
  4. ブラウザからTensorBoardを開く

具体例

今回は試しにこの前使用したコードを使用してやってみます。

tsunotsuno.hatenablog.com

1. プログラム中に可視化用のコードを追加

使うためには、上のコードにちょびっと追加します。

# TensorBoardで追跡する変数を定義                                                                                                                               
with tf.name_scope('summary'):
    tf.summary.scalar('loss', cross_entropy)
    merged = tf.summary.merge_all()
    writer = tf.summary.FileWriter('./logs', sess.graph)

2. 普通にプログラムを実行

特に何も考えずに普通に実行してください。

python3 main.py

普通に実行します。 すると、カレントディレクトリにlogというディレクトリができているかと思います。 これができていれば、とりあえず問題なく動いていそうです。

3. TensorBoardを起動

実行が完了したら、TensorFlowを起動します。 TensorBoardは次のコマンドで起動します。

tensorboard --logdir=./logs

4. ブラウザからTensorBoardを開く

コンソールに出ているURLをブラウザに放り込めばTensorBoardを確認する事ができます。 きちんとTensorFlowが起動できていれば下のurlをで可視化結果が開きます。

http://localhost:6006/

f:id:nogawanogawa:20180131203555p:plain

Google Cloud Platformの導入メモ

この前はGoogle Colabを使って見たんですが、どうやらGANをやるには不向きな感じでした。

tsunotsuno.hatenablog.com

こうなったら、やはり本家だろうということでGoogle Cloud Platform (GCP)を使って機械学習をやる方法を調べてみました。

参考にさせていただいたのはこちら。

qiita.com

Google Cloud Platform (GCP)

登録

何はともあれ登録。

cloud.google.com

料金

無料トライアルで始めの1年は$300分使えるみたいです。 (2018年5月3日現在)

f:id:nogawanogawa:20180503223011j:plain

その他の料金はこちら。

cloud.google.com

クラウド使うのが初めてなので、どれ使えばいいとかイマイチわかりません。 参考サイトでも言われていますが、すぐに$300使い切ることはまず無いので、一旦使ってみてからサービスは考えることにしたほうが良さそうです。

チュートリアル(途中まで)

Google公式の説明書はこちら。

(英語)https://cloud.google.com/ml-engine/docs/tensorflow/getting-started-training-prediction?hl=ja

(日本語)https://cloud.google.com/ml-engine/docs/getting-started-training-prediction

どうやら、CLOUD SHELLを使うほうがお手軽らしいので、今回はそちらでやってみました。

"TensorBoard を使用した要約ログの検査"までやってみましたが、書いてあるとおりにコマンドをコピペしていけばいけました。

f:id:nogawanogawa:20180504100030p:plain

f:id:nogawanogawa:20180504100039p:plain

あとはコードを手元のコードを吸い上げれば普通に実行できそうです。

まとめ

GCPチュートリアルレベルであれば結構簡単に動きました。 クラウドとのファイル転送やらGPUの使い方やらは勉強しないといけませんが、ひとまず環境が使えることを確認できてよかったです。

Google Colabを使ってみた

f:id:nogawanogawa:20180503144836p:plain

ちょっと前にこんなブログが話題になってました。

karaage.hatenadiary.jp

無料でクラウドGPUを使える日がついに来たようです。 機会学習を始めたころから、すごーく使いたかったんです。 というわけで、使ってみました。

Google Colabとは

こちらの記事が大変参考になりました。

www.codexa.net

要は、Notebook形式で機械学習プログラムをお手軽に実装できる環境ということですね。 Notebook形式はJupiter notebookがあるので、機械学習屋さんには慣れ親しんだ環境がクラウドになったイメージでしょうか。

使い方

google colabへアクセス

URLはこちら。 https://colab.research.google.com/

こんな画面が出てくるかと思います。 f:id:nogawanogawa:20180503140640p:plain

右上のログインからgoogle アカウントを使用してログインしてください。

ノートブックの作成

左上のファイルから

f:id:nogawanogawa:20180503140249p:plain

ファイル>Python3のノートブックを新規作成

するとこんな感じのノートブックができます。 f:id:nogawanogawa:20180503140508p:plain

あとは、セルにコードを書いていくだけです。

適当に使ってみる

人様のコードを拝借。 拝借したのはこちら。

qiita.com

先にGPUの設定だけやっちゃいました。

編集 > ノートブックの設定

からGPUを選択します。

Input

入力はこちら。

Output

おお〜。特に環境構築もせず動きましたし、GPUもちゃんと使えてますね。

どうやらGPUを使えば10倍程度は速くなることが期待できるようです。

感想

正直に言うと、想像以上にめんどくさいです。 notebook形式に慣れていないってのもあるんですが、それ以外にも制約がいやですね。

まず、ファイルIOがGoogle ドライブ経由なんですが、それが手間がかかります。

それから、こちらの記事をみると時間に関して制約があるみたいです。

qiita.com

12時間制約は置いておいて、90分制約はちょっと嫌ですね。 セッションが切れたら計算が止まるのはやりたいことできなさそうなので、おとなしく普通のクラウドにしますか、、、

【論文メモ:StackGAN】StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks

論文

[1612.03242] StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks

著者

Han Zhang, Tao Xu, Hongsheng Li, Shaoting Zhang, Xiaogang Wang, Xiaolei Huang, Dimitris Metaxas

Rutgers University, Lehigh University, The Chinese University of Hong Kong, Baidu Research

背景

テキスト表現を基に写実的画像を生成することは、コンピュータビジョンの大きな課題となっている。 先行研究では、文字の意味を反映した大まかな画像を生成することには成功していたが、詳細な部分の表現や物体の要素については表現できない問題があった。

目的とアプローチ

目的

テキスト表現に基づく高解像度の写実的画像の生成

アプローチ

StackGAN(Stacked Generative Adversarial Networks)による画像生成の段階的詳細化

  • 第一段階:テキスト表現から低解像度の画像を出力
  • 第二段階:第一段階の出力とテキスト表現から高解像度の画像を出力

提案手法

StackGANの全体構成を下記に示す。

f:id:nogawanogawa:20180414144515j:plain

StackGANは2段階の画像生成プロセス(Stage-Ⅰ GAN, Stage-Ⅱ GAN)から構成される。

Stage-Ⅰ GAN

Stage-Ⅰ GANでは、大まかな形状、ベースとなる色や背景画像の領域を描画する。

Stage-Ⅰ GANは入力としてテキスト表現を使用する。 先行研究で、テキストのエンコード非線形の変換となるため、Generatorへの入力となる潜在変数は偏りが生じることがわかっている。 一方で、潜在変数のベクトルは高次元(>100)になることが多く、入力の不連続性が大きくなり、不安定な学習になる恐れがある。

この問題を解決するために、平均(μ(φt ))、対角共分散行列(diagonal covariance matrix, Σ(φt))となるガウス分布(N (μ(φt ), Σ(φt )))から無作為に値をサンプリングする。 これにより、多様性を維持することができ、少ない入力テキスト表現から幅広い分布を生成することができる。

過学習を避けるために、Lossにカルバック・ライブラー情報量(Kullback-Leibler divergence)を用いた調整を加える。 下記にStage-Ⅰ GANでのGenerator, DiscriminatorのLossの算出式を示す。

f:id:nogawanogawa:20180429105102j:plain

その他

実装の詳細について下記に列挙する。

  • テキストの潜在変数(φt )はガウス分布の平均μと∑の値であるσの全結合層として組み込まれる
  • λ =1
  • c0 = μ0 + σ0 ⊙ ε
補足

多次元の正規分布に関してはこちら。 s0sem0y.hatenablog.com

入力に関しての全体像についてのイメージは下記のようになる。 f:id:nogawanogawa:20180429111152j:plain

テキストから得られるガウス分布と、予め用意したガウス分布を組み合わせて入力の多様性を維持する(偏りをなくす)ようです。

Stage-Ⅱ GAN

Stage-Ⅰ GANでは、画像に歪みや欠損が残る。 Stage-Ⅱ GANでは、細部を描画し低解像度画像の欠損を修正する。

Stage-Ⅱ GANでは、Stage-Ⅰ GANで出力された低解像度の画像とテキスト埋め込みベクトルを再使用する。

下記にStage-Ⅱ GANでのGenerator, DiscriminatorのLossの算出式を示す。

f:id:nogawanogawa:20180429112717j:plain

実装のパラメータ

実装のパラメータについて下記に列挙する。

アップサンプリングブロック
ダウンサンプリングブロック
パラメータ他
  • Ng =128
  • Nz =100
  • Mg =16
  • Md =4
  • Nd = 128
  • W0 = H0 = 64
  • W = H = 256
  • 始め600epochはStage-II GANを修正しながら実行、次の600epochはStage-I GANを修正しながら実行
  • バッチサイズ64のAdam Optimizerを使用
  • 学習率0.0002で100epochごとに学習率を半減する

評価

データセット

下記に示す2種類のデータセットを使用して評価を行う。

  • Caltech-UCSD Bird(CUB)
  • Oxford-102 flower

比較対象

下記に示す2つの先行研究と比較する。

  • GAN-INT-CLS
  • GAWWN

評価指標

Inception Score

画像分類器に生成画像を分類させ、下記の式によるInception Scoreを算出する。 (数値が大きいほど優れている)

f:id:nogawanogawa:20180503105733j:plain

Human Rank

各モデルによって生成された画像を被験者(人間)に見せてランク付けする。 (数値が小さいほど順位が高く、優れている)

多様性と画質に関する評価

Inception ScoreとHuman Rankの結果を以下の表に示す。

f:id:nogawanogawa:20180503105943j:plain

比較対象より提案手法が優れていることが分かる。 次に各モデルによって生成された画像(Caltech-UCSD Bird)を下記に示す。

f:id:nogawanogawa:20180414150455j:plain

また、各モデルによって生成された画像(Oxford-102 flower)を下記に示す。

f:id:nogawanogawa:20180414150507j:plain

先行研究のモデルより高解像度かつ細部まで表現できている事がわかる。

設計の妥当性評価

次に、設計の妥当性に関して評価する。

Stageの段階分け

ガウス分布(CA)の使用、テキストの二段階活用、Stageの段階分けに関する結果を下記の表に示す。 f:id:nogawanogawa:20180503112116j:plain

ガウス分布(CA)の使用、テキストの二段階活用をどちらも行った場合が最もInception Scoreが高いことが分かる。

次に、Stageごとの生成画像を下記に示す。 f:id:nogawanogawa:20180414150520j:plain

Stageを経る毎に輪郭がはっきり、高精細な画像になっていることが分かる。

また、入力Textに対して生成された画像と近しいTraning Setを下記に示す。 f:id:nogawanogawa:20180414150537j:plain

Datasetを学習して、正しく反映できている事がわかる。

ガウス分布による入力生成

先に示したTable 2で、128×128の画像のInception Scoreを見ると、CAを使用した場合の方がInception Scoreが向上する結果がわかった。

また、同じTextから生成された画像を下記に示す。 f:id:nogawanogawa:20180414150549j:plain

同じ入力から別々の画像が生成されていることがわかり、多様性が担保されていることが分かる。

入力Textへの対応評価

入力のTextを一部変化させた際の出力画像を下記に示す。 f:id:nogawanogawa:20180414150601j:plain

入力のTextの変化が正しく画像に反映されている事がわかる。

結論

テキスト表現を基に高解像度の写実的画像を生成することは、コンピュータビジョンの大きな課題となっている。 提案手法により、テキスト表現だけを入力する場合で初めて256×256の画像の生成に成功し、細部までの表現が可能になった。

実装

どう考えてもMacBook Airでは現実的な時間内で計算が終わらないので、今回は実装はありません。 ただでさえ、最近マシンパワーの限界を感じてるのに200 epochとか普通に考えてGPU使わなきゃ無理でしょう。。。←クズでごめんなさい。

AWSやらGoogle Colabの使い方を勉強したら、そのタイミングで別の記事で投稿します。

感想

GANで高解像度の画像を生成することは一つの大きなテーマになっているようです。 何に応用できるかまではまだわかりませんが、やり方くらいはマスターしたいですね。 引き続きがんばります。