某大学生の機械学習日記

趣味はでぃーぷらーにんぐ

Parallel WaveNetの論文を読み解く

原論文→https://arxiv.org/pdf/1711.10433.pdf

Parallel WaveNetとは
簡単にいうならば、WaveNetよりも早く音声合成を行えるようにしたモデル。WaveNetではoutput音素を次の音素を出すためのinputとする回帰な接続をもつため音声一つ出すだけでも時間がかかるという問題点があった。それを解決するべくでてきたのがParallel-WaveNet。同時分布的な入力を使って出力を一発で出せるということから音声合成にかかった時間を短縮させた。個人的には、時系列的な入力を必要とした従来のWaveNetを使って、同時分布的な入力をつかうstudentモデルを学習させるための工夫のところが面白かった。蒸留(distillation)と呼ぶらしい。

学習
teacherモデルとstudentモデル(←学習させたいモデル)をつかう。論文ではteacherモデルに学習済みWaveNetを用いている。WaveNet teacherは学習するのが早く、結果を得るのが遅い。それに対してWaveNet student は学習が遅く、結果を得るのが早いというのを逆手にとった構造となっている。下の図がとてもわかりやすい。Studentモデルのinput(s)にはランダムに生成した白色雑音を使っている。tにおけるoutput(s)では時系列に依存しないようになっているため、output(s)は並列的に得ることができる。そして、そのoutput(s)をteacherモデルのinput(t)として利用する。もともとWaveNetは回帰的な構造を持っているためWaveNet studentのoutput(s)をinput(t)としても問題はない。このようにWaveNet studentをWaveNet teacherでtrainする手法を論文では"distillation(蒸留)"というらしい。
f:id:knto-h:20180501012950p:plain:w400

Loss計算
通常のDNNのトレインでは出力のL1平均、L2平均をLossとするのをよく散見する。しかし、今回の場合はモデルをロジスティック分布の繰り返し(論文では"a mixture o logistics distribution"と読んでいた)で確率密度関数とみなしているため、WaveNet teacherとWaveNet studentそれぞれとのKL距離(Kullback-Leibler divergence)をLossとして学習させている。下の式がそれを表している。交差エントロピーの公式から導出可能である。確率密度関数としているのでそれぞれの出力は確率であらわされている。
f:id:knto-h:20180501114240p:plain:w400
f:id:knto-h:20180501121826p:plain:w200
f:id:knto-h:20180501121851p:plain:w200

Lossの追加

  • Power loss
    このLoss関数を入れることによってhigh-entropy状態(例えば囁きのよう)になることを防ぎ、より人の発言に似せることを目指す。
    f:id:knto-h:20180501170815p:plain:w200
    φ: SIFT(Short-Term-Fourier Transform)の二乗, g: WaveNet studentによる変換, (y,c): 教師データを表している。yは実際の音声でcはextra-conditioning-data(話者の性質を表すものだと僕は理解している)

  • Perceptual loss
    悪い発音になることを防ぐ目的でloss関数を定義した。WaveNet studentによって合成された音声と実際の音声との差をlossとしている。論文ではstyle lossを用いることで精度を改善した。

  • Contrastive loss
    同じ話者同士のKL-divergence Lossを小さくし、違う話者とのKL-divergence Lossを大きくするために導入されたLoss関数 f:id:knto-h:20180501172340p:plain:w200