[論文メモ] Towards Improved Zero-shot Voice Conversion with Conditional DSVAE

arxiv.org

既存のコンテンツと話者分離系のVoice Conversion(VC)の改良

既存コンテンツと話者分離系手法でバックボーンにdisentangled sequential variational autoencoder (DSVAE) を使う手法がある。
DSVAEは時不変な情報と時変な情報を洗剤空間で分離する手法。
しかし、DSVAEはコンテンツをランダムに初期化された分布に埋め込むため音声の構造がうまく表現できない。

DSVAEは各エンコーダで話者とコンテンツをエンコードし、それらをconcatして音声にする。

入力  Xと出力 \hat Xは両方メルスペクトログラムで音声にするときはVocoderを利用する(HiFi-GAN V1)。
はじめの層を共有したコンテンツエンコーダ  E_Cと話者エンコーダ E_Sは入力 Xからコンテンツ埋め込み z_cと話者埋め込みz_sの事後分布、それぞれ、 q_{\theta}(z_c|X) q_{\theta}(z_s|X)を予測する。
そして各分布から z_c z_sをサンプリングしデコーダ Dによってメルスペクトログラム \hat X = D(z_c, z_s)を得る。
DSVAEの目的関数は以下。

DSVAEではコンテンツの事前分布  p_{\theta}をランダムに初期化された分布を利用しているが、これがコンテンツ埋め込みの学習に適していないと指摘。
同じ発話の z_cをt-SNEで可視化した結果が図2。(a)がDSVAEが学習したコンテンツ埋め込み、(c)がメルスペクトログラムそのまま。DSVAEの埋め込みはランダムな分布になっている。

ちょっとよくわからないが、同じ発話の特徴は近くにあってほしいということ?でもコンテンツならそうならなくない?何か勘違いしてるかも?

手法

事前分布を調整したconditional DSVAE(C-DSVAE)を提案。
 p_{\theta}(z_c) p_{\theta}(z_c|Y(X))モデリングすることで音声構造を保持させる。ここでは Y(X)をコンテンツバイアスと呼ぶ。

コンテンツバイアスとしていくつか実験。

1) Align
Kaldi toolkitによる42音素を利用

2) BEST-RQ
VQ-VAEによる量子化ベクトルを利用

3) Mel
メルスペクトログラムにkmeansを適用し、クラスタセンターをラベルとして利用

4) WavLM
事前に学習したWavLMを利用(HuBERT系?)

実験・結果

データセットはVCTKコーパス
各種法によるコンテンツ埋め込みを可視化したのが図2。
各種法によるコンテンツ埋め込みを利用して音素分類をした結果が表2。

図2で可視化した結果、よく分離されているものほど音素分類の結果も良い。

VCの結果

所感

確かに、事前分布の選択は大事だよねという気持ち。
音素ラベルのあるデータセットを使って、音素ラベルを事前分布にした実験もしてほしかった。
図2のお気持ちがちょっとわかっていないので何か勘違い、もしくは知識不足かもしれない。
WavLMの結果が良いがWavLMをよく知らないので勉強しておく。

[論文メモ] UnivNet: A Neural Vocoder with Multi-Resolution Spectrogram Discriminators for High-Fidelity Waveform Generation

arxiv.org
github.com

INTERSPEECH 2021

高速・高品質なVocoder、UnivNetを提案

多くのVocoderは帯域制限したメルスペクトログラムから音声波形を生成する。
しかし、一部のモデルでは生成結果のスペクトログラムがオーバースムージングされる問題がある。
これをなんとかしたい。


手法

主にDiscriminatorを使って解決する。

Generator  Gについて

 Gは図1(a)でMelGANに倣った形式。
ノイズ  \textbf{z}を入力、ログメルスペクトログラム  \textbf{c}を条件として音声波形  \hat{\textbf{x}}を生成する。
 \textbf {z} \textbf{c}は同じ長さ。

生成を高速かつ高品質にするためにlocation-variable convolution (LVC)を導入。
LVCは \textbf cを入力としたKernel Predictorによって生成されたカーネルを使ってconvolutionを行う。
LVCは \textbf cによる局所的な情報を適切に扱えるらしい。

residual connectionの前に活性化関数としてgated activation unit(GAU)を追加することでマルチスピーカーの性能が改善。

Discriminator  Dについて

図1(b)のようにDiscriminatorは複数ある。
大まかには2つあり、1つ目はmulti-resolution spectrogram discriminator (MRSD)。
 M個のSTFTのパラメータを用意し、それらでSTFTした結果を各Disciriminatorの入力とする。
既存手法はフィルタバンクを利用して一つのスペクトログラムを分割し識別するが、
提案手法はフルバンドで高解像の音声を生成することを目的としている。

2つ目はHiFiGANで提案されたmulti-period waveform discriminator(MPWD)。

loss

least-squares GANのadversarial lossとauxiliary loss  L_{aux}
 L_{aux}はspectral convergence loss  L_{sc}と log STFT magnitude loss  L_{mag}からなる。これはMulti-band MelGANと同じ。

 ||\cdot||_{F}はフロベニウスノルム、 ||\cdot||_1はL1ノルム。

全体として以下のlossになる。

 D_k k番目のMRSDとMPWDで KはDiscriminatorの合計、 \lambdaはハイパラ。

実験・結果

データセットはLibriTTSデータセット
 Gの中間のチャンネルサイズ違いで2つモデルを用意(UnivNet-c16とUnivNet-c32)
評価指標はPESQ(高いほど良い)、スペクトログラムでのRMSE(小さいほどいい)、MOSの3つ。
結果が表2で、既存手法より優れていそう。速度もそれなり。

ablations。
コンポーネントの有無での性能を評価(MOS)。

MRSDの効果。より細かいスペクトログラムになっていそう。

所感

TorToiSe TTSに採用されていたので読んだ。
個人的にHiFiGANがベースラインなのでそれより高速かつ高精度そうなので良さそう。
ただ、HiFiGANはどうやら自前で学習したっぽいので比較の信頼度は微妙かも。
また、個人的にVocGANもかなり良かったので、VocGANとも比較して欲しかった(あとBDDM)。

TorToiSe TTSの個人的なメモ

github.com
nonint.com

とても良いと言われているTorToiSe TTSについて、作者のアーキテクチャデザイン資料とRedditの作者の発言を読んだ個人的なメモ。
推論等も混ざっていて間違っているかもしれないのであしからず。
図は基本的に作者のWebページから(図がすべて手書きなの趣深い)。

概要

TorToiSeはtext-to-speech(TTS)アプリケーションで、複数の人の声への対応とリアルさに重点をおいている。
2~4つほどの少量の音声データからターゲットとなる話者の声を模倣する。

現在は推論部分を提供しており、学習方法等については公開していない(公開予定もないそう)。

作者はスピーチ関連のリポジトリ名をモハーヴェ砂漠の動植物からとっているらしい。
モデルはautoregressive + diffusionでものすごく遅い。

アーキテクチャデザイン

アーキテクチャデザインについてはコードや以下の著者のドキュメントが公開されている。
nonint.com
TorToiSeは別々に学習された5つのネットワークから成り立っている。

The Autoregressive Decoder


デコーダは話者の埋め込みネットワークとメインのデコーダからなる。

図の左側、話者埋め込みネットワークはカーネルサイズ3のConv1d x 2とattention block x 5からなるVision Transformerと似たアーキテクチャで、ターゲット話者の複数の発話を入力し、そこからconditionになる話者ベクトルを生成する。
入力はメルスペクトログラム。出力は複数入力の平均を扱う。

メインデコーダがTTSの根幹になる。
音声データセットのテキストからBPEを学習しテキストを256個のトークンに変換する。これは入力になる。
BPEはByte Pair Encodingで未知語に対応するために単語をより細かい単位に分割する。
tokenizerというライブラリを使っていそう。

音声(メルスペクトログラム)はVQVAEを使って8192個のトークンに変換する。これが出力になる。

アーキテクチャはtransformerのデコーダで構成。デコーダのみにしたのはencoder-decoderの形式にしたらスケール(深さや幅)したときに収束しなかったから。

Huggingface TransformersライブラリのGPT2モデルを複数モダリティ対応のため少し変更して利用。
最終的に30層で、各層は16のattention headで中間特徴は1024次元。パラメータ数は420Mくらい。

このモデルの前に小さいモデルも学習したがマルチボイスには能力が不足していたらしい。

入力は[話者埋め込み, テキストトークン, 音声トークン]をconcatしたもの。トークンにはそれぞれSTARTとSTOPが含まれる。
テキストトークンと音声トークンの両方を予測でき、音声トークンはテキストトークンと音声のSTARTトークンを与えることで予測出来る。
実際に利用するときはテキストトークンの予測部分は破棄し、音声トークンの予測部分のみを利用する。

問題もいくつかある。
テキストと音声がどう関係しているかの確率論的な話(よくわからない)。
デコードが困難。単純にデコードすると「uhhhhhhhhh」といった長く伸びたものが生成される(autoregressive decodingなので)。
これを解決するのが次のCLVP

Contrastive Language-Voice Pretraining (CLVP)


CLVPはデコーダの出力から生成した複数の音声トークン列候補とテキストトークン列の距離を計算する。
CLIPの音声版。

autoregressive decoderの出力からnucleus samplingし、それに対してCLVPを適用し候補を絞る。

CLVPは12層のattentionからなる(512次元の8head)。
これにより与えられたテキストから、それに最も近い音声トークン列を得られるようになった。

Contrastive Voice-Voice Pretraining(CVVP)

生成した音声の品質を高めるためのもの。
CLVPがテキストと音声を近づけるのに対して、CVVPは音声と音声を近づける。
同じ話者の異なる発話で学習した。

TorToiSeへの貢献は小さく、なくてもいいかも?。
定量評価できないけど定性評価的には効果あり(聴き比べたら違いがわかる)。

The Diffusion Decoder


音声トークンから音声波形にするのにメルスペクトログラムを介す。音声トークンは大きく圧縮されているので非常に難しいところ。
Diffusion modelを採用し、autoregressive decoderの出力(音声トークン)とターゲット話者の発話からメルスペクトログラムを生成する。
超解像モデルともいえるし生成モデルともいえる。

音声トークンは4層のattention blockと3つのattention/resnet blockで前処理が行われる。
これを"code"と呼ぶ

図の上の方はデコーダの話者埋め込みネットワークと同じようにでターゲット話者の発話を埋め込む。
埋め込みネットワークはautoregressiveとは別モデルを使用している様子。
これによって得られた特徴を"conditioning latent"と呼ぶ。

conditioning latentを使ってcodeをスケール・シフトする(AdaIN)。
スケール・シフトしたcodeと元のcodeにConv1dしたものconcatして再度Conv1dでチャンネル数を戻してdiffusion modelに入力する。
diffusion modelは最後の層がattentionのU-Net。

Vocoder

ここまででテキストと条件となる音声からメルスペクトログラムを生成できたので、それを音声波形に変換する必要がある。
ここではunivnetを採用した。univnetは高速で精度もwaveglowと同等レベルなので。

ただオープンソースのunivnetは24kHzで、TorToiSeは22kHzなのでNVIDIA tacotronのコードを利用したらしい。ちょっとよくわかっていない。

Why Use a Vocoder at All?

diffusion modelには音声波形を直接生成出来る能力があるのになぜVocoderを噛ませたのか?

時間をかけて色々実験した結果以下のことがわかった

  • U-Netで波形生成したら最終的に採用したアーキテクチャに比べパフォーマンスが落ちる
  • diffusionのU-Netの上位層のチャンネルが少なくなりパフォーマンスが落ちる(どういうこと?)
  • diffusionでのconvolutionのコストが高い
  • Vocoderはそれらに関してめっちゃ性能が良い

とのこと

System Level Description


システムをまとめると
1) テキストとターゲット話者の音声を入力し、音声トークンの確率を取得。nucleus samplingでトークン列候補を複数選出。
2) CLVPとCVVPでトークン列の候補を絞り、トークン列を選択
3) diffusion decoderでトークン列からメルスペクトログラムを生成
4) vocoderでメルスペクトログラムを音声波形に変換

データセットや学習

はじめに述べた通り学習方法については今の所公開予定はなし。
データセットは約50k時間のスピーチデータを使用。数エポックしか回していないのでunderfitしているかも(収束もまだ)。
話者は10kくらい(定量化できない)?
audiobookのもので、作者のお手製の音声認識でラベルをつけた?
データセットはアンバランスなので、生成が難しいものもある。

作者いわく

  • いい感じ正則化を導入すれば1桁少ないデータセットでも出来るのは?
  • 重要なのは多様な声を入力すること(難しいけど)

とのこと


データセットについても権利的な問題で、こちらは公開予定はしない。

所感

正直、英語だと聞いてもどれだけ性能が良いのかわからないがReddit等を見る感じかなり良いらしい。
他のZero-shot VC系論文で論文内での定量評価ではなく、デモやOSSのコードを触った結果の一般ユーザーの定性評価的に良いとされるものに関していくつか共通した特徴があると感じた(ここでは多くは語らないが)。

VQVAEは良さそうだけど学習が難しそう。どれだけ苦労したんだろうか。
直接音声を生成するよりはVocoderを介すのが良いというのは自分も感じた。やはりVocoderは優秀で、学習時にデノイジング等もすれば生成されたメルスペクトログラム等にもしっかり対応できる。

自分はTTSでのVCは直接しない派(別にTTSモデルとVCモデルを組み合わせればいい)なのでVCに興味があった。

話者特徴を足すのではなく、BERTとかのクラストークンのように頭に追加するのは思いつかなかった。どちらがいいのか。

学習方法等の説明は無いが、試行錯誤の記録等、有益な情報が多かった。

[論文メモ] Speaking-Rate-Controllable HiFi-GAN Using Feature Interpolation

arxiv.org

HiFi-GANにおいて話速を操作可能にした

既存の話速変更手法はDNNベースのモデルに適用しにくい。WaveNetについては話速変更の手法が提案されているが生成が遅い。
高速で高精度なHiFI-GANについて話速変更をしたいというお気持ち。

手法

ネットワークの途中にinterpolationを導入し伸縮する。図1に全体像を示す。

interpolationに関しては2種類を提案。
1つ目は帯域制限をしてカイザー窓を適用。HiFi-GANの中間特徴は波形の特徴とみなせるので問題はないだろうとのこと。
2つ目はメルスペクトログラムを画像(周波数軸と時間軸の2D)として扱い線形補完する。


実験・結果

既存手法では適切なデータセットで評価されていなかったらしい(低速等のデータがなかった?)。
そこで男女の各話者が高速・普通・低速の3つの速度で325個の文を読み上げた話速変更の評価用データセット、SpeedSpeech-JA-2022を作成。
これは公開している。
ast-astrec.nict.go.jp

SpeedSpeech-JA-2022の話速情報を表1に示す。

コーパスはITAコーパス

各話者の各速度の発話から15個の発話をテストに利用(計45個)。3種類の話速があるので、入力とは異なる2種速度に変換し検証。
評価指標はメルケプストラム歪み(MCD)とリアルタイムファクター(RTF)。比較対象はWSOLAという既存手法。

各interpolationをHiFi-GANの4つのブロックにそれぞれに導入して比較。
全体的に線形補完が良い。

MOS評価。

異なる話速からターゲットの話速への変換。
低速と普通の相互変換は良さそう。高速は全体に少々厳しい。

TTSでの評価。FastSpeech2を利用。既存手法(WSOLA)より良さそう。

所感

HiFi-GANの中間特徴で補完するという非常にシンプルな方法。
今までいい感じの評価データセットがなかったのでありがたい。

[論文メモ] TIME DOMAIN ADVERSARIAL VOICE CONVERSION FOR ADD 2022

arxiv.org

ICASSP 2022

ADD2022のDeepFake検出のタスク用のVoice Conversionモデルを作成しトップになった


Audio Deep Synthesis Detection Challenge (ADD 2022)というのが行われた。近年のVoice Conversion(VC)やText-to-Speech(TTS)の発展により声のなりすましの問題が出てきているから。
ADD2022には以下の3部門がある。
(1) リアルなノイズやBGMのある環境での音声の真偽判定(偽音声はいろいろなTTSやVCで生成)
(2) 部分的に偽の音声に変換し、その部分を検出
(3) 2部門に別れミニマックスゲームを行う

(3)はGenerationとDetectionにの2部門に分かれる。Generation部門はDetection部門に見抜かれないような生成モデルを作り、Detection部門はその逆。まさにAdversarial Attack。
この論文では(3)のGeneration部門に参加しトップをとった。

手法

Detectorに見抜かれないために、対象の音声にできるだけ近づける必要がある。
しかしADD2022で使えるデータ(ターゲット音声、それ以外の音声)は少ないのでaugmentationなどの工夫が必要。
こちらの手法ではVCシステムとpost-processsingの2ステージに分けて処理する。

Voice Conversion

VCシステムの全体像は図2。

BNF extractor、synthesizer network、 vocoderに分かれる。
BNFはbottleneck featureの略でTDNN7層とLSTM3層のASRを自分たちで用意したデータで学習し、その中間特徴(512次元)を利用。
synthesizer networkはFastSpeech-VCのものを利用。
vocoderはHiFi-GANを利用。

Time-Domain Adversarial Post-Processing

システム全体像は図1。

生成した音声にをwhite-box attackで調整する。
ざっくり説明すると、生成した音声を識別器がターゲット音声と間違えるような差分を学習する

まずターゲットの音声かどうかの識別器を作成する。
ResNet-34を使ったターゲット話者の識別機を学習。lossはbinary cross-entropy。
入力は linear frequency cepstrum coefficients (LFCCs) 。

次にターゲット音声との差分を予測するモデル、residual generation network (RGN)を学習する。
RGNはMelGANのようなFCNN。
RGNの出力はResBlockのように入力に加算される。

RGNの学習方法は
1) 生成した音声をRGNに通し差分音声を生成
2) 入力した生成音声に差分音声を足してPost-processed speechを得る
3) 識別器に入力するためにPost-processed speechをLFCCに変換する
3) ターゲット音声の識別器がPost-processed speechをターゲット音声と間違えるようにadversarial training

式的には以下。

 sが入力音声、 P(s)RGNで生成した差分音声、 FがLFCC特徴抽出、 D_tがターゲット音声識別器。

また以下の正則化のlossも導入する。

 L_rは差分音声の最大値と最小値の差、 L_mは差分音声と0ベクトルとのMSE。
 L_sは以下の式。


 s_tはt番目のサンプル、 Tは総サンプル数。本物の音声に関しては差分を出ないようにする?説明が少なくよくわからない。

実験・結果

AIShell-3データセットの10人がターゲット。
評価指標は以下の式のdeception success rate(DSR)。

 Wは各識別器が本物と識別したサンプル数、 Aが総サンプル数、 Nが識別器の総数。

結果が図3、自分たちのチーム(C10)がトップ。

差分処理による話者埋め込みのコサイン類似度(COS_SIM)とcharacter error rate(CER)の変化。
CERは増加し音声として劣化するが、コサイン類似度も増加している。

差分処理による変化の例(図4)。
上が処理前、下が処理後だがほぼほぼ変化がなく調整は僅か。
また無音部分(白い破線)には変化がなくRGNが音声にだけ作用しているのがわかる。

所感

ADD2022のタスクがそもそも面白い。
GeneratorとDetector(Discriminator)で別れて参加者同士で競い合うというのは単純な品質を求めるタスクより面白いし、Detectorを他人が作るのでDetectorの弱点がリークしないのもいい。
差分音声を使ったwhite-box attackはDetectorを騙すのには良さそうだが、品質が落ちるので現実では微妙かも。
Detectorが話者性だけでなく、品質てきな部分で合成音声か見抜けるように学習していた場合どうなのか。

[論文メモ] DeiT III: Revenge of the ViT

arxiv.org

Meta AI


ただの教師あり学習だけ(自己教師あり学習なし)でVision Transformerのパフォーマンスを向上させた。

Vision Transformer(ViT)はconvolutionのような帰納バイアスが無い分能力は高いが学習しパフォーマンスを出すのが難しく、事前学習としてBerTのような自己教師あり学習が重要と考えられてきたが本当にそうなのか?というお気持ち
あくまでこの議論を盛り上げようということ。

手法

VIT用に教師あり学習を工夫する。具体的には

  • augmentationの見直し
  • 正則化追加
  • lossの見直し
  • crop方法の見直し
  • 低解像度でのカリキュラム学習

Regularization & loss

Stochastic depth

stochastic depthはresidual構造がある場合にブロック部分を確率的にパスしてskip connectionの部分のみでforwardする手法。
Dropoutのレイヤーバージョン。
drop率は表13参照。

LayerScale

LayerScaleはresidual blockに学習可能パラメータを導入しtransformerの収束を助けるためのものだがパフォーマンスの向上も確認できたので導入。
初期値はシンプルに 10^{-4}に。

Binary cross-entropy

クラス分類の学習ではcross-entropy(CE)が一般的だがこれをbinary cross-entropy(BCE)に変更する。
既存研究ではCEからBCEへの変更は精度向上はわずかだがMixup等のaugmentationとの親和性が高いと結論づけていたが、今回のImageNet1kの実験では大きなパフォーマンス向上があった(表4)。

ただImageNet-21kではそうでもなかったのでImageNet-21kの実験はCEを採用。

Data-augmentation

ConvNetではRandAugmentのようなaugmentationが採用されているがViTはアーキテクチャが全く異なり帰納バイアス等を考えても同じaugmentationでは過学習する可能性がある。
再検討した結果3つを採用する。

  • Grayscale:色ではなく形状に重点が置かれるように
  • Solarization:色に対して強いノイズを加え、色変化にロバストにする。これも形状に注目しやすくなる
  • Gaussian Blur:形状を少し変化させ形状にロバストにする

3つのaugmentationの例が図2。

この3つに加え一般的なaugmentationのhorizontal flipとcolor-jitterも採用。

ablationで効果を検証(表2)。

Corpping

Random Resized Crop(RRC)

GoogLenetで採用された方法。
大きなモデルでの過学習を防ぐのに重要とされてきたが、オブジェクトの見た目の大きさの変化により学習データセットとテストデータセットで不整合が発生する。これは実質ドメイン変化といえる。
また、ImageNet-21kのような巨大で過学習しにくいデータセットでも効果的なのかは懐疑的。

Simple Random Crop (SRC)

AlexNetで採用されたシンプルなクロップ。
画像の短辺を入力解像度なるようにリサイズしてクロップする。
ここでは4ピクセルだけreflect paddingしてクロップ。

図3にRRCとSRCの例を示す。

SRCはアスペクト比を保っているがオーバーラップが大きく、画像の多様性が少ない。
ImageNet-1kの学習ではRRCのほうが効果的だった。
しかしImageNet-21kのような巨大なデータセットではそもそも過学習リスクが小さく、データの多様性もデータ自体で担保している。
むしろSRCのようにアスペクト比を保った方法の方にアドバンテージがある。
またRRCはクロップされた画像から対象となるオブジェクトを推測できないことが多々ある(図4)。

表5にImageNet21kに対してRRCとSRCを適用した際の比較を示す。

Lower Resolution

ViTではあまり使われないが、既存手法で低解像度で学習しターゲットの解像度でfine-tuningをするという方法がある。
これにより学習時とテスト時の(サイズに関する)ドメインの不一致を軽減出来るらしい。
適用してみると大きいモデルへの正則化の効果も確認できた。

こちらの論文を参照(著者がほぼ一緒)
arxiv.org


既存手法との学習方法の最終的な差異のまとめ

実験・結果

ImageNet系のクラス分類とセグメンテーション等のダウンストリームタスク。

ImageNet-1k-trainをバッチサイズ2048で400エポック学習。解像度は224x224。
結果は図7。

ImageNet-21k(224x224)を90epoch学習後、ImageNet-1kを50エポック学習。解像度は224x224と384x384。
結果は図8。

過適合してないかのチェックのため上記2つのモデルをImageNet-v2(validationでも見たことが無いデータ)で評価した結果。
しっかりパフォーマンスが出ている。

BerT系との比較。MAEはこれ
ninhydrin.hatenablog.com

結果が表9。提案手法は自己教師あり学習なしでもそれらに匹敵するパフォーマンス。

転移学習

セマンティックセグメンテーション


Ablations。
学習の量による変化(図5)

augmentationの比較(表3)
既存のaugmentationはConvNet用に提案されたものなのでResNetでの比較実験もした。
提案した3-augmentはViTに効果的。既存のaugmentは確かにConvNet(ResNet)で有効だった。

低解像度で学習->ターゲット解像度でのfine-tuningの効果。
わずかだが確かに効果あり。低解像度での学習はViTはパッチ数が減るため高速化・省メモリの恩恵もあり、またViT-H52等の大きなモデルも安定する。

所感

クロップによるドメインシフトはありそうだなと思っていたが、しっかりと考えてはいなかった。
今後augmentationするときはドメインシフトについても考えて使おうと思う。
最近の論文では新しい良い方法が出るとそれをスタンダードとして特に検証せず採用することが多いのでこういう論文も大切。
「既存研究でいいらしいから採用しました!!」じゃなくて「実際検証してよかったです!!」といったablationも欲しいということです。
過去の手法を見直して、現在の設計に合っているか考るのも大切。

[論文メモ] Simple Baselines for Image Restoration

arxiv.org

画像修復タスクで非線形の活性化関数なしのシンプルなSOTAモデルを提案。

f:id:Ninhydrin:20220415090259p:plain

既存のSOTA手法は複雑だが、このモデルの複雑さをinter-blockとintra-blockに分けて考えてみる。

inter-blocアーキテクチャ自体についてで、図2のようにマルチスケールやマルチステージのモデルが提案されている。
intra-blockはアーキテクチャを構成するブロックについてで、Swin Transformer BlockやHINBlockなどが提案されている。
これらのinter・intra blockの中でも単純なblockでSOTAを達成できないか?というお気持ち。
f:id:Ninhydrin:20220415091329p:plain

手法

「必要な構造」だけの非常に単純な形のベースラインモデルを作成する。
「必要な構造」はタスク(SIDDデータセットのdenoising、GoProデータセットのdeblurring)の評価で決定。

inter-blockの複雑さが小さいアーキテクチャとしてシングルステージのUNet(図2(c))を採用。
アーキテクチャはintra-blockをスタックして全体を構成するがそのBlockをどう設計するか。
intra-blockに関しては3つを考える

PlainNet's Block

まずはシンプルにConv(Depth-wise Convも)とReLUとショートカットのBlockとする(論文では図3(a)となっているが多分図3(b)の間違い)。
f:id:Ninhydrin:20220415095743p:plain

transformer blockを使わないのは

  • transformer blockのパフォーマンスは良いとされているがSOTAモデルのために必須では無いという主張がある
  • Depth-wise Conv(DWConv)のほうがself-attentionより単純な構造
  • ConNetとTransformerを比較するのが目的ではない

といった理由から。
このBlockをPlain Blockと予備、これを使ったアーキテクチャをPlainNetとする。

Baseline's Block

ベースラインモデルを作成するために先ほどPlain BlockにNormalizationとAttentionの追加とActivationの変更を行う。

Normalization

BatchNormはバッチサイズが小さいと不安定で、代わりに提案されたInstanceNormは必ずしもプラス効果があるわけではなくチューニングが必要。
そこでLayerNormを採用した。
これにより10倍大きい学習率でも学習がスムーズになり、SIDDとGoProデータセットでもパフォーマンスが向上した。

Activation

ReLUはよく使われている活性化関数だが、近年のSOTAでは主流がReLUからGELUに置き換わってきている。
そこでPlain BlockのReLUをGELUに変更したら一部のパフォーマンスが向上したのでGeLUを採用する。

Attention

ViTのようなself-attentionは計算コストが高い。Swin Transformerのwindow-basedなattentionはグローバルな情報が欠落し、そもそもローカルな情報はPlainBlockのDWConvで十分。
しかし、Channel Attentionについては低コストかつグローバルな情報を扱えるので採用した。パフォーマンスも向上。

これがBaseline Block(図3(c))で、Baseline Blockを使ったアーキテクチャをBaselineとする。
Baselineモデルのパフォーマンスは表1参照。
f:id:Ninhydrin:20220418091652p:plain

Nonlinear Activation Free Network

このBaselineモデルは結果的に低コストでSIDDとGoProデータセットでSOTAを超えたが、現状のようにシンプルな構造のままよりパフォーマンスを向上させられないか?もしくはパフォーマンスを維持したままよりシンプルにできないか?

BaselineモデルのGELUとCAに注目する。

GELU

いくつかのSOTAモデルを見るとGated Liner Units(GLU)が採用されていて、これがキーになる可能性が高い。

GLUは特徴マップを \textbf{X}、線形変換を f, g、活性化関数 \sigmaとして以下の式(入力を分割したり線形変換が1つとか種類はあるが)。
f:id:Ninhydrin:20220415100503p:plain
 \odotアダマール積。活性化関数はSigmoidが多い。
それに対してBaselineで採用したGeLUは以下の式。
f:id:Ninhydrin:20220415100832p:plain

以下のように実装されることが多い。
f:id:Ninhydrin:20220415100849p:plain

 f,gを恒等写像 \sigma \PhiとするとGELUはGLUの特殊なケースと考えられる。
なのでGELUをGLUに置き換えられそう。また、GLUは非線形な計算を含んでいて非線形活性化関数 \sigmaは必須では無いのでこれも取り除く。
そうすると f(\textbf{X}) \odot g(\textbf{X})といった非線形なものが含まれない形になる。
これらから、入力をチャンネル方向で2分割しチャンネル次元でアダマール積を取るSimpleGateでGLUを置き換える。
f:id:Ninhydrin:20220415101759p:plain
 \textbf{X}, \textbf{Y}は二分割され同じ形の特徴マップ。
SimpleGateのイメージを図4(c)に示す。
f:id:Ninhydrin:20220415102235p:plain

Channel Attention(CA)

CAとしてSqueeze-and-excitation networks(SENet)のものを採用したが(図4(a))、CAは以下の式に書ける。
f:id:Ninhydrin:20220415102519p:plain

 *はチャンネル毎の積。 \Psiがpoolingやconvをひっくるめたもので、これは式(1)GLUに非常に似ていて、これもGLUの特徴ケースとみなせる。poolingによるグローバル情報の集約は必須なので、それを追加してSimple Channel Attention(SCA)を提案。
f:id:Ninhydrin:20220415102733p:plain
 Wは線形変換。図4(b)がSCAのイメージ。

BaselineモデルのGELUとCAをそれぞれSimpleGateとSCAに置き換えることでパフォーマンスを落とさず、よりシンプルなモデルにできた。
しかも非線形活性化関数を完全に取り除けた。
なのでこれを Nonlinear Activation Free Network(NAFNet)とする。

実験・結果

PlainNetからBaselineモデルへのパフォーマンス変化は表1に示した。
BaselineモデルからNAFNetへのパフォーマンス変化を表2に示す。
f:id:Ninhydrin:20220418094037p:plain

SIDDデータセットのdenoising
f:id:Ninhydrin:20220418093944p:plain
f:id:Ninhydrin:20220418094647p:plain

GoProデータセットのdeblurring
f:id:Ninhydrin:20220418094727p:plain
f:id:Ninhydrin:20220418094748p:plain

その他は論文参照

Ablations。
ブロック数によるパフォーマンス変化。
f:id:Ninhydrin:20220418094216p:plain

GLUの \sigmaはSigmoidだが、ほかの変換も調べ非線形関数が必要であるか調査。
f:id:Ninhydrin:20220418094339p:plain

所感

実際、非線形活性化関数がなくてもSOTAが達成できたというのはすごいが、「シンプルでもSOTAのベースとなるモデルを作る」という目標から「非線形活性化関数を取り除く」に切り替わっている感がある。目的と手段が逆転している的な。
結果はUNet + 非線形活性化関数の無いブロックとなったが、個人的にはもっと簡単な構造のinter blockでの結果とかもっとAblationが欲しかった。