採用はこちら!

Shinonome Tech Blog

株式会社Shinonomeの技術ブログ
3 min read

GANとその実用化

今回は機械学習の中でも深層学習について学習している際によく出てくるGANについての基本的な知識や、そのGANの中でも現在プロジェクトで調査しているGANのことについて述べようと思います。

 はじめまして、データサイエンスコース修了で普段は機械学習系の実装を担当しているYoshidaです。今回は機械学習の中でも深層学習について学習している際によく出てくるGANについての基本的な知識や、そのGANの中でも現在プロジェクトで調査しているGANのことについて述べようと思います。

GANについての基本的な知識

 GANは下の図Overview of GAN StructureのようにGeneratorとDiscriminatorから成り立っている、主に画像を生成する用途に使われることの多い生成モデルである。

 まず何かランダムな値をGeneratorに入力することでGeneratorが画像を生成する。次に学習データの画像、つまり「本物の画像」を一枚ランダムに取ってくる。そして先ほど出力した画像とともにDiscriminatorに入力すると、DiscriminatorはどちらがGeneratorが生成した画像でどちらが学習データの画像か見分ける。最初Generatorは学習データとは似ても似つかないような画像を生成するが、正しく学習が行われれば学習が進んでいくにつれてGeneratorは学習データのような画像を生成するようになる。

現在調査中のGANについて

 先ほどまではGANについて「主に画像を出力する生成モデルである」というような説明をしたが、GANの技術の発展によってGANをボーカロイドやボイスロイドのような音声を生成する音声生成にも応用できるようになっている。(ただ、単に音声データをGANに突っ込むだけでは音声合成をすることはできず、GANはVocoderという部分を担当しているが、そのような細かいことに関しては今回は割愛する。)

 そのようなモデルで有名なものはLINE株式会社の音声合成についての研究の発表(https://linedevday.linecorp.com/2020/ja/sessions/8721)での資料にあった以下の図にあるものが有名である。その中でも私が注目したのは、有名度が頭一つ抜けているモデルであるParallel WaveGANと、一番新しいモデルであるHiFi-GANである。

Parallel WaveGANについて

 ほぼ普通のGANと同じ構造をしていて、特徴的なところといえばGeneratorに依然までよく音声合成に使われてきたWaveNetを用いていて、Discriminatorが見分けられるかのloss以外にGeneratorにおけるSTFT(短時間フーリエ変換)でのlossが入っているところぐらいである。

HiFi-GANについて

 Parallel WaveGAN同様に大部分は普通のGANと同じではあるが、特徴的なのはDiscriminatorが2つあることである。まずGeneratorの中身から見てみるとFigure 1のようになる。メルスペクトログラムを入力として、まず全結合層で出力がある一定のサイズまでアップサンプリングして、その後のMRF層のカーネル数K_r分ResBlockを足し合わせる。ここでResBlockの中身は、D_r分アップサンプリングされたものになっている。


 次に2つあるDiscriminatorを見てみるとthe multi-period discriminator (MPD)はGeneratorの出力を[2, 3, 5, 7, 11]個を一つの周期として二次元配列にし、各行において全結合した結果を用いて識別する。次に、MPDでは不連続なサンプルについて評価したが、MelGANでも用いたようなmulti-scale discriminator (MSD)により音声シーケンスの連続的な評価を行う。MSDでは入力をそのまま、×2のAverage Pooling、×4のAverage Poolingを用いてconvolutionにかけて識別する。

次にやること

 このように基礎的な学習から始まって、プロジェクトに使えるような技術を論文を読む中で見つけることができたら、次は実装することを考える。一口に実装といっても、何も毎回論文を読みながらゼロから自分でコードを書くという必要はないのである(自主学習としてはとても大事ではあるが)。というのも、多くの論文は論文の著者や有志の方々が既に実装してgithubに載せているということが多い。はじめのうちはそのコードをありがたく拝借して動かしてみることから始めて、パラメータを変えてみるなどコードの中身を自分の手でいじってみたりして、ゆくゆくは自分の手で実装できるようになるとよいと私は考える。

 いかにも機械学習について何でも知っているかのような語り口で書いてしまったが、まだ私は新B2で機械学習について1年も学んでいない青二才であるから今後も機械学習についての学習に邁進して様々なプロジェクトに貢献したい。