COLA を読んだ

Contrastive Learning of General-Purpose Audio Representations

arxiv: https://arxiv.org/abs/2010.10915

Github: https://github.com/google-research/google-research/tree/master/cola

実装はtensorflow

許して

Qiitaにあるような丁寧な全訳記事ではなく、かいつまんでまとめただけです

summary

  • Google Research Paris が出した音声版 self-supervised learning
  • 同じclipから切り出したsampleをpositive, ほかのclip から切り出したsampleをnegative としてcontrastive learningする。シンプル。
  • fine-tuning して使えばいい性能が出た。
  • 重みは公開されてない*1

論文内容

contrastive

手法は非常にシンプル。同じclipから切り出したサンプルをpositive sample, ほかのclip から切り出したサンプルをnegative sampleとしてcontrastive learning します。

contrastive learning についてはわかりやすい記事があったので紹介しておきます。参照してください。翻訳記事を書く予定はありません。

gombru.github.io

このシンプルなサンプリング手法には以下の利点があります。

  1. ただcropするだけなので、画像などで行われているような 「augmentation の探索」をする必要がない
  2. 同じ(ミニ)バッチ内の他のclipはすべてnegative sampleになるので、多様な組み合わせが用意できる(さらにshuffleもいれている)
  3. どれがnegative sampleかを決めるために余分な計算を必要としない
  4. バッチ内で完結するのでメモリにも優しい

目的関数

目的関数はmulti-class cross entropy

f:id:timtoronto634:20201111161825p:plain

これによって複数のnegative distractorを用いることができます。

s()はsimilarity. コサインではなくbilinear similarity 。私は重み付けの内積という理解をしています→参考。 bilinear similarityを選んだ理由は、「そっちの方が性能いいから」ということらしいです。論文中でも比較実験がされてます。

ネットワーク

ネットワーク構造は、EfficientNet-B0をEncoderに使って、特徴表現hを得たあと、h をprojection head (ただの全結合層) に入力して得たz について、agreementをとる、という構造。

agreementは要はcontrastive learning のことだと思います。

pre-trainしたencoderを他のタスクに使うときは、hまでのネットワークを用います。projection headやgは使いません。理由について明確に述べられてませんが、projection head で次元が減る分情報量が減るからみたいです。実際にgを抜かしたら性能いいよ、って言ってる人もいます。

その他

入力

log-compressed mel-filterbanks

事前学習時のパラメータ

事前学習時は batch_size = 1024, learning_rate = 10^-4, epochs=500, optimizer = Adam, を用いてます(公式のコードのデフォルト値とは違うので注意)。

感想

Contrastive learningもaudioも初めてだったんですが、シンプルな内容でよかったです。

憶測

何かとはやりのself-supervisedをやってみたい。音声界隈のビッグデータセットであるAudioSetとcontrastive learningでpre-trainしたものがまだない。的な感じで着手されたのではないでしょうか。自然な流れだと思います。

脚注

*1:なんでやねーん!もし公開されてたら教えてください