モナリザをしゃべらせる技術、Few-Shot Adversarial Learning of Realistic Neural Talking Head Modelsの論文紹介

https://i.gyazo.com/4dc21b010b38144320d51916d1df59e7.gif

arxiv.org

今回はこの論文を紹介します。いよいよハリーポッターの魔法の世界も夢ではなくなってきました感じがしますね。

Background

技術としては画像生成の分野ではお約束のGAN(Generative Adversarial Network)を中心として、style変換に用いられるAda-IN(Adaptive Instance Normalization)やEncoder(Embedder)の出力をGeneratorの各層に入れるアーキテクチャProjection Discriminatorマルチタスク学習・Few-shot learning*1のためのMeta-learningなどが用いられています。

以下に関連リンクを貼っておきます。

Adaptive Instance Normalization

[1703.06868] Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization (cited: 238)

Projection Discriminator

[1802.05637] cGANs with Projection Discriminator (cited: 51, 日本の方の論文!)

MAML

[1703.03400] Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks (cited: 644)

Proposed Method

f:id:ey_nosukeru:20190629224006p:plain
全体のアーキテクチャ

全体のアーキテクチャは上のようになります。

Embedder

 e = E(x, y; \phi)

Embedderは人の画像 xとその顔の向きを表すランドマーク yを入力して受け取り、入力画像についての人物や背景そのものに関する特徴量 eを出力します。*2 この特徴量は顔の向きに依存せず、人物の種類のみの情報を抽出することを目指します。 \phiはネットワークのパラメータ。

Generator

 x = G(y, e; \psi, P)

ランドマークを入力として受け取り、Embedderの出力 e Pで線形変換したスタイル \hat{\psi} = PeをAdaIN(Adaptive Instance Normalization)を用いて各層に注入しながら特徴抽出・生成画像の肉付けを行い、最終的に与えられたスタイルとランドマークに照らして自然な画像を出力します。 \psiがネットワークのパラメータ、 Pが線形変換のパラメータになります。

ここでAdaINは入力を x、スタイルを sとして次の式で計算されます。

 AdaIN (x, s) = \sigma (s) \frac {x - \mu (x)}{\sigma (x)} + \mu (x)

ここで x sがバッチ単位、多チャンネルの画像、 \mu(x) \sigma(x) xのサンプルごと・チャンネルごとの平均と標準偏差(つまり各サンプル・チャンネルの画素値についての統計量)、 \mu(s) \sigma(s)も同様の統計量です。

DNNにおいては特徴ベクトルの平均・標準偏差などの統計量が画像のスタイルを決定する上で重要な役割をもつことが知られており、AdaINによってこれを操作することによって画像のスタイルを変換することが可能になるようです。

以上のようにAdaINの論文[1703.06868] Arbitrary Style Transfer in Real-time with Adaptive Instance Normalizationには書かれているのですが、ここでの e \hat{\psi}は単純なベクトルなので微妙に細部が異なっていそうです。恐らくStyle-Based GANと同様に eからそれぞれのレイヤー、チャンネルごとの \mu(s) \sigma(s)への変換を直接学習するようにしているのではないかと思います。つまり \hat{\psi}がそれぞれのレイヤー、チャンネルごとの \mu \sigmaを集めたものになります。

Discriminator

 r = D(x, y, i; \theta, W, w_0, b)

通常のGAN同様 xが本物か偽物かを判定します。 iはデータセットの種類、つまり人物のインデックスを表しています。 Wは人物ごとの特徴量(つまりeに似た役割を持つもの)を集めてきたもので、 W_iが対象の人物についての特徴量となります( Wもパラメータ)。畳み込み層の出力ベクトルを、 W_i + w_0, bのパラメータを持つ全結合層に入れて rを計算します。 W_iの役割については後で詳しく説明します。

Training

画像の生成方法

Embedderの出力値 eを顔の向きに依存せず、人物のみに依存するパラメータにするために次のような手順を踏みます。

  1. 人物のインデックスiをランダムに選び、そのデータセットからランダムにK個のサンプルフレーム x _ {i} ^ k, y _ {i} ^ kをサンプリングする。
  2.  \hat{e_i} = \frac{1}{K} \sum_{k=1}^K E(x _ i ^ k, y _ i ^ k; \phi)により人物の特徴量を計算。
  3. これを元に推論画像 \hat{x_i} = G(y_i, P\hat{e_i})を計算。

これによって \hat{e_i}の各フレーム(つまり顔の向き)に対する依存性が失われ、不変な特徴量が学習されることが期待されます。

誤差関数

この手順で得られた出力画像を元に次の誤差関数を最小化することを目指します。

 L = L_{content} (\hat{x_i}, x_i) + L_{adv} (\hat{x_i}, x_i, y_i, i) + L_{match} (\hat{e_i}, W_i)

 L_{content}はGeneratorの出力画像 \hat{x_i}と正解の画像 x_iの中身に関する誤差で単純なピクセル二乗誤差からVGGに突っ込んだ時の中間層の特徴量の二乗誤差などが用いられます。

 L_{adv}は出力画像 \hat{x_i}と正解の画像 x_iがDiscriminatorにとってどれだけ見分けづらいか、つまり出力画像のリアルさに関する誤差で、GANの基本となる誤差です。普通は \log D(\hat{x_i}, y_i) + \log (1 - D(x_i, y_i))などが用いられることが多いですが、ここでは次のヒンジ型誤差を使っています(最近の流行り?)。

 L_{adv} (\hat{x_i}, x_i, y_i, i) = max(0, 1 + D(\hat{x_i}, y_i, i)) + max(0, 1 - D(x_i, y_i, i))

 L_{match}はEmbedderによる人物特徴量 e_iとDiscriminatorの人物特徴量 W_iが一致することを要請する特徴量で、単純に L_1誤差が用いられるようです。

 W_iの存在意義

 e_i W_iを近づけるよう学習するなら最初から W_iの部分に e_iを突っ込めばいいやんけとなりそうですが、この工夫には次のような事情が考えられそうです。

  •  e_iはモデルの出力値で訓練中大きく変化する上、Generatorは e_iに大部分依存しているのでこれをDiscriminatorにも使うと学習が不安定になりそう
  • そもそもGeneratorとDiscriminatorでパラメータを共有するのはまずいのでは?(敵対的に学習させるので両者が完全に独立であるべき )

f:id:ey_nosukeru:20190630005823p:plain
メタ学習のイメージ(ML-PIPより)

またそもそもなぜ W_iのようなパラメータを用意するかについてですが、メタ学習は上図のようにタスク(ここではそれぞれの人物)に依存しないパラメータとタスクごとのパラメータを明示的に分け、共通パラメータをうまく学習させることでタスク依存のパラメータの最適化を効率化する、ということが目的のフレームワークです。ここではモデルパラメータ \phi, \psi, \thetaなどが共通パラメータにあたり、人物特徴量 e_i W_iはタスク依存のパラメータになります。 W_iに人物への依存性を集中させることでDiscriminatorのパラメータ \thetaの人物への依存性を減らしていると考えられます。

Fine-Tuning

このプロセスによりモデルの学習が完了したら、次のような手順で推論ができることになります。

  1. 推論対象の人物の画像を複数Embedderに入れて e _ {new} = \frac{1}{T} \sum _ {t = 1} ^ T E(x _ i ^ t) \hat{\psi} = Pe _ {new}を計算
  2. 推論対象のランドマーク y \hat{\psi}をGeneratorに入れて推論結果 \hat{x} = G(y, \hat{\psi})を得る

このまま推論をしてもある程度はうまく行くようですがさらにリアルな画像を得るために次のFine-Tuningを行うと良いみたいです。

  1. 複数の人物に対して推論する必要はもうないのでEmbedderは不要、代わりに直接スタイル \hat{\psi}を最適化する。初期値を \hat{\psi} = Pe_{new}としてGeneratorの新しいパラメータの一部とする。
  2. Discriminatorの W_iも人物ごとに保持しておく必要はなく、 w' = W_i + w_0の部分を直接最適化すれば良い。ただし W_iはわからないので代わりに e _ {new}を使い、初期値を w' = e _ {new} + w_0として新しいパラメータ w'を作る。
  3.  L _ {match}以外の誤差 L = L _ {content} + L _ {adv}により(通常のGANと同様に)パラメータ \psi, \hat{\psi}, \theta, w', bを最適化する。

以上により推論対象の人物に最適化されたパラメータを得ることができます。

Results

結果については公式のビデオを見るのが圧倒的にわかりやすいので割愛します。 L _ {match}やFine-Tuningを使わない場合の比較も行なっています。

www.youtube.com

Comment

GANの部分についてはさほど目新しさはありませんが、メタ学習の考え方を取り入れることで人物依存のパラメータと共通のパラメータをうまく分離して効率的な学習が可能になっているのが興味深い点だと思います。特にFine-Tuningの部分の、前段階の学習の結果の出力値を初期値として新しいパラメータを作り、それを目的のタスクに向けて最適化していくというのがとても面白く、参考になりました。

個人的に最近メタ学習やfew-shot learningに興味が出てきたのでこれからそちらの方向に勉強の範囲を広げていければと思っています。

最後までお読み頂きありがとうございました!

*1:ハイパーパラメータやネットワークの初期値を調整することで、訓練データにないクラスに対してもごく少量のデータを学習することで高い精度での推論を目指す枠組み

*2:Embedderにもランドマークを入力しますが、これは単に顔の向きに関する情報を与えることでそれ以外の特徴抽出を容易にするためだと考えられます。