kaggle TensorFlow Speech Recognition Challengeの上位者のアプローチを紹介する（前編）

## INTRODUCTION
今更ながらこちらのkaggleのコンペの上位者のアプローチを紹介します。

[TensorFlow Speech Recognition Challenge](https://www.kaggle.com/c/tensorflow-speech-recognition-challenge)

tensorflowの名を冠していることから予想できるように、
google brainがorganizerです。
自分も一応は参加しておりました・・・。

長いので前編・後編に分けてポストいたします。  

今回はコンペそのものと、アプローチの要素のうちタスク設計と特徴量について触れます。

# このコンペについて
## コンペのタスクの内容
音声認識の中でも、いわゆる"keyword spotting" taskに該当します。  

1秒前後のオーディオファイルが、 
10種類のどの音声コマンド (例：go) に該当するか分類します。  

一つのオーディオファイルには基本的には１つの単語の発声しか含まれていません。
分類するクラスには、そもそも発声していないクラス(silence)や
コマンドじゃないkeyword(unknown)クラス(例: dog)も含みます。  

つまり最終的には12クラスに分類されます。 

## データセット
訓練用データセットは[googleが2017年にオープンにしたもの](https://research.googleblog.com/2017/08/launching-speech-commands-dataset.html)とほぼ同じです。  
一方LB用(テスト用)データセットは新規のもののようです。  

## ベンチマーク
organizerのPete Wardenが試した場合、
スコア(accuracy)がアンサンブルなしで0.88だったそうです。 
(参考: https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/43516)、
（注: LBに乗っているGolden Benchmarkではありません）

対して今回のトップクラスでもアンサンブルありで0.91と、 
劇的に効果的なアプローチが見つかったというわけではなさそうです。

## 評価・賞  
モデルの正解率を競います。  

今回のコンペで特に面白い点は通常の1~3位の賞以外に、 
ラズベリーパイ３上で高速に(200 ms 以下)予測できかつ高い性能を持つモデルに対し、
[special prizeが用意されている点です。]
(https://www.kaggle.com/c/tensorflow-speech-recognition-challenge#Prizes)

当然モデルのサイズは5,000,000 bytes以下と小さいものが求められます。  

今までのコンペ上位者のensembleをしまくる巨大で複雑なモデルは、 
実用性から離れてしまっているという批判があったので、([参考](https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/43511))
kaggleの新しい風を感じます。 

なおkaggleではこれからこういったLBのデータに対する性能以外の面も考慮する種類のコンペは増えていくみたいです。
([参考](http://blog.kaggle.com/2018/01/22/reviewing-2017-and-previewing-2018/))


## 今回のコンペのポイント  
一見普通の分類タスクですが、このコンペ特有のポイントがありました。

1. LBのunknown classに、train用datasetのunknown classには含まれないwordが存在する ([参考][1st-link1])  
    単語を区別しなければならないのに、LBのデータには未知の単語が含まれています。  
2. silenceラベルのデータがtrain用datasetに含まれていない  
    6種類のノイズデータは配られていますが、そのままでは訓練データとして使えません。
3. public LB score用のデータとprivate LB score用のデータ、さらにはtrain用データのクラス分布が違う（と予想される）[参考](https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/44250)  
結果手元のCV scoreがよくなっても、public LB scoreが落ちたり([参考][4th-link1])しました。
4. ミスラベルが含まれる  
    train用データに間違ったラベリングがされているサンプルがありました  
5. (special prizeのみ)モデルのサイズに制限がある  
    resnetなどの大きなネットワークが使えません。  
   また、ensemble/stackingなども使えないと予想されます。  
   （おそらくほぼsingle modelでないと条件を達成できない）

# 上位者のアプローチの要素別のまとめ 
## アプローチを公開している上位者  
※本当はチームですが、公開している人の名前だけ表記しています。

- [1st Heng CherKeng][1st-link1] et al  
[special prizeもこのチームがとりました。](https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/47703)  
 [1st-link1]: https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/47728  
 [1st-link2]: https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/46945

- [2nd　O'Malley][2nd-link1] et al  
 [2nd-link1]: https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/47715

- [3rd Little Boat][3rd-link1]
[3rd-link1]: https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/47722  
[3rd-link2]: https://github.com/xiaozhouwang/tensorflow_speech_recognition_solution/blob/master/solution.pdf  

- [4th P.Ostyakov & feels_g00d_man][4th-link1] et al  
   
   [4th-link1]: https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/47674  
   
   [4th-link2]: https://github.com/heyt0ny/Kaggle-TensorFlow-Speech-Recognition-Challenge-Solution

- [7th JihaoLiu][7th-link1]
 
 [7th-link1]: https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/47730

- [10th tugstugi][10th-link1] et al
[10th-link1]: https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/48546
[10th-link2]: https://github.com/tugstugi/pytorch-speech-commands
[10th-link3]: https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/47660

以下に要素ごとに各々のアプローチをまとめていきます。

## タスク設計・解釈
一見今回のコンペは、12 クラスの分類タスクに見えます。 
しかし、さらにタスクを分解したり、解釈しなおす余地がありました。  

1. 12クラスに分類 ([1st CherKeng][1st-link1]など)  
　10種類のコマンド +　unknown + silenceの12クラスに一気に分類します。  
  訓練用にsilence用のサンプルを生成する必要があります。
2. 11クラスに分類 + 出力からsilenceを判定　([4th P.Ostyakov][4th-link1]) 
　10種類のコマンド + unknownに分類します。そのあとその予測値やサンプルの波形などからsilenceを判断します。

3. 31(+1)クラスに分類  [4th feels_g00d_man][4th-link1]
  実際にはunknownは全くバラバラの単語が含まれているわけではなく、 
  コマンド以外に指定された単語をスピーカーが読み上げています。
  そのため、train用データ内のunknownに該当するサンプルはさらにbed, birdなどの20のクラスに分かれています。 
よって、unknownを一つのクラスにまとめずに、単語ごとの20のクラスとみなすこともできました。 
(当然結果をsubmitするときには、それらのラベルをunknownに置き換えます)。 
確かに、一つのunknownクラスに全然違う単語を含むサンプルがまとめられてしまうよりかは、
  こちらのほうが収束しやすそうです。 
  <br>ただし、これだけではLB用のデータにある未知の単語を含むunknonサンプルには対応できません。
  そこで、feels_g00d_manはさらにunknown unknownクラスを加えています(生成方法は後編で言及)。  


## 特徴量
特徴量はそれぞれ色々なものを使っています。 
ネットワークアーキテクチャーにあってさえいれば、徹底的な差にはつながらなかったようです。[参考][1st-link1]
ensembleを前提とするなら、いろいろな特徴量を使ったモデルを用意したほうが、
ensembleの効果が得られやすいようです。([参考](https://www.kaggle.com/c/tensorflow-speech-recognition-challenge/discussion/47079))

4. Mel spectrogram ([10th tugstugi][10th-link1], [3rd Little Boat][3rd-link1], [4th P.Ostyakov][4th-link1], [10th tugstugi][10th-link1])
    - tugstugiは1 x 32 x 32になるように設定<br><br>

1. log mel spectrogram (log-mel filterbank energy) ([2nd O'Malley][2nd-link1],[1st CherKeng][1st-link1], [7th JihaoLiu][7th-link1]) 
    1の対数をとったものです。 
    なおmel spectrogramとmel filterbank energyは同じ変換をしたものですが、
    powerかenegyかの違いがあります。powerはenergyの２乗です。
   - O'Mallyは120個のfilterbank energyを使用
   - JihaoLiuは出力の次元が40 x 98になるようにしたpowerを使用 <br><br>

2. MFCC ([1st CherKeng][1st-link1], [3rd Little Boat][3rd-link1], [4th P.Ostyakov][4th-link1], [7th JihaoLiu][7th-link1])<br><br>
    
5. Chroma fft ([4th P.Ostyakov][4th-link1])<br><br>
6. Temprogram  ([4th P.Ostyakov][4th-link1])<br><br>
7. raw waveform ([1st CherKeng][1st-link1], [3rd Little Boat][3rd-link1], [4th P.Ostyakov][4th-link1])<br><br>
8. spectrogram ([1st CherKeng][1st-link2], [4th P.Ostyakov][4th-link1])<br><br>

なお、帯域フィルターなどであらかじめノイズを取り除くといったことは行われなかった、もしくは有効でなかったようです。  
注目すべき点はraw waveformのままでも他の特徴量と同等の性能が得られた点です。([参考][1st-link1])
ただし、special prizeを狙う場合は、raw waveではネットワークが大きくなり、厳しかったのではと思います。

## 後編へ続きます

※　なおこの記事は加筆・修正を行う可能性があります。

変更履歴
- 20170211 fix:
   特徴量のlog mel spectrogramとlog mel filterbank energyを統合