Monthly Hacker's Blog

プログラミングや機械学習の記事を中心に書きます。

WaveRNN解説[ネットワーク構造編]

できること

この記事では、次のことができるようになります。

  • シンプルなwaveRNNのネットワーク構造の理解

はじめに

こんにちは、dhgrsです。先日公開したVQ-VAEが私の公開したコードの中では好評で、色々な方に見ていただけました。さて、mixture of logisticsやParallel WaveNet化でもしようかと思っていたところ、DeepMindからまた新しい音声合成に関する論文が出ました。
[1802.08435] Efficient Neural Audio Synthesis
論文中ではWaveRNNと呼ばれている提案手法が、WaveNetと同等、それ以上に革新的だったので、簡単にまとめていきます。なお、ネットワーク構造編と銘打ちましたが、今のところ続編を書く予定はありません。試してみたい音声合成の新アイディアがあるので、そちらの実験をしばらく優先しようと思うためです。もしかしたら気が向いたときに他に良い解説記事がなければ、続きを書くかもしれませんが期待しないでください。

何がすごいのか

24kHz/16bitでWaveNetとほぼ同品質な音声合成ができます。それも1層RNN+全結合2層というWaveNetに比べて大きくパラメータを削減したニューラルネットで実現できるため、合成の高速化が実現しました。単純にネットワークの規模を比較するだけでも高速化したのが分かる上に、pruningによってパラメータ数をさらに少なくしたSparse WaveRNNや、複数のサンプルを同時に計算するSubscale WaveRNNなど、高速化のテクニックが盛り込まれています。その結果、GPUでは実時間の4倍速で合成が可能になったそうです。

ネットワークの出力

WaveNetではmu law変換された8bitのそれぞれの値をとる予測確率や、mixture of logisticsのパラメータがネットワークの出力でした。WaveRNNでは、出力が2種類あります。まず1つ目は、8bit(mu law変換ではなく、いわゆるファミコン風)のそれぞれの値をとる確率を予測するcoarse(粗い)な出力です。2つ目は、coarseな出力をさらに8bitに分割したときのそれぞれの値をとる確率を予測するfine(細かい)な出力です。coarseの予測には前時点までのサンプルを入力とします。fineの予測には、加えて現時点のcoarseな予測も入力とします。論文では、2種類の出力があるにも関わらず、マスク(coarseな予測に0を掛けることで無視)する行列を用いることで、無理やり表現していたため、どうもネットワークの構造が掴めなかったため、(個人的には)分かりやすい図を作りました。

2018/07/07 論文中のIをマスクした単位行列と解釈していたが、マスクした重み行列と解釈を改めました。合わせて図を変更しています。@stnk20 さんご指摘ありがとうございます。

Step1: coarseの予測

f:id:d-higurashi:20180707111046p:plain

Step2: fineの予測

f:id:d-higurashi:20180707111054p:plain

基本的には論文と同じ文字を使っています。ただし、マスク行列や、途中でのsplitをしなくて済むように、step1とstep2に分けることでsplitしています。それに合わせて論文中では1つの変数が2つに分かれているため、上付き文字で表現しています。以上が、WaveRNNの基本形です。追試していないので予想ですが、これだけでもWaveNetに比べれば十分高速ですが、WaveRNNの魅力を活かすためにはその他の高速化手法も取り入れる必要があります。

さいごに

本当に基礎の部分だけですが、WaveRNNを解説してみました。鮮度重視で勢いで書き上げたので、おかしな点や分かりにくいところがあるかもしれません。間違いや質問があれば、ブログのコメントやTwitterまでお願いします。そして、優秀な方がササッと実装してくれることを期待しています。