びぼーろぐ

備忘録としての勉強のログです。淡々と学んだことをログって行くので、雑な記事が多いです。

BinaryConnet: Training Deep Neural Networks with binary weights during propagations

arxiv.org
2015
BinaryConnectの筆者らの実装 github.com

ベロンベロンで書いているので日本語になってないかも

一言でいうと

学習の順伝搬及び逆伝搬で重みを2値化(-1, 1)して、精度を維持しながらDNNの容量及び計算を少なくする。このBinaryConnectは正則化として振る舞い、(2015年当時の)SOTAレベルの結果を維持することができる。

2値化でも機能する理由:

  • ノイジーな重みでも互換性SGDに互換性がある。ランダムまたは確率的な丸めが偏りのない離散化をするのに使われる。
  • ノイジーな重みは正則化として汎化性能を高める。

結果

  • 2/3の演算が除去できた
  • 学習時間が3倍短くなった。
  • 16倍以上の必要メモリ量を削減(16bitの浮動少数から単ビット精度)

精度も維持

f:id:taku-buntu:20190117032019p:plain
エラー率

手法

+1 or -1

重みは-1か+1にする。 こうすることで、行列演算は単なる加算か減算になる。 固定ポイントアダーとして固定ポイント積算アキュムレータよりもエネルギーと面積が少ない。

決定論的2値化 vs 確率的2値化

決定論的:  w _ { b } = \left{ \begin{array} { l l } { + 1 } & { \text { if } w \geq 0 } \ { - 1 } & { \text { otherwise } } \end{array} \right.

確率的:  w _ { b } = \left{ \begin{array} { l l } { + 1 } & { \text { with probability } p = \sigma ( w ) } \ { - 1 } & { \text { with probability } 1 - p } \end{array} \right.
 \sigmaはハードシグモイド関数
 \sigma ( x ) = \operatorname { clip } \left( \frac { x + 1 } { 2 } , 0,1 \right) = \max \left( 0 , \min \left( 1 , \frac { x + 1 } { 2 } \right) \right)

決定論的にも2値化可能だが、中間層の複数の入力重みに渡って離散化したものを平均化したものを利用したほうが情報損失が少ない。

プロパゲーション vs アップデート

  1. まず順伝搬
  2. 次に逆伝搬。それぞれの層のアクティベーションに対する、ターゲットの勾配を計算。出力層側の求めて~入力層一歩手前の中間層へ。
  3. パラ更新。各層の重みパラの勾配を求める。勾配と過去の重みを使って更新。

↑を踏まえたBinaryConnectのパラ更新が以下

f:id:taku-buntu:20190117024643p:plain
BinaryConnectのSGD学習。

順伝搬、逆伝搬中に重みだけしか2値化しない。(step1, 2) SGDをうまくやるには重みパラの精度がある程度無いといけない。 勾配降下法で得られるパラ変化はごく小さな値。 値の更新(step 3)自体はそのまま実数重みで行っていることに注意。 クリッピングは、[-1, 1]で行う。

何度もちっちゃな更新させて、最終的には以下のパラメータ w ^ { * }を採用する。
 w ^ { * } = \operatorname { sign } \left( \sum _ { t } g _ { t } \right)  g _ { t }はノイジー推定器

ランダムに離散化することで精度を保ちながら異なる重みの離散化誤差を互いに相殺することができる。

Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding

arxiv.org
2016

一言で言うと

Deep compressionを使って,精度劣化なしに35倍から49倍NNの必要ストレージを削減する.
Deep compressionは以下の3つのパイプラインステージから成る

  1. 枝刈り(学習フェーズで必要な(重要な)接続だけを学習 )
  2. 量子化(あと重み共有)
  3. ハフマン符号(バイアスの偏りを有効に利用するため)

これらを一緒に使う.
はじめの2ステップをやったら,残りのパラメータを微調整するために再学習する.枝刈りは9倍から13倍のパラ数を削減,量子化は32倍から5倍のビット表現を削減する.

結果

精度劣化無しで,AlexNetを35倍圧縮(240MB-->6.9MB), VGG-16を49倍圧縮(552MB-->11.3MB)に成功.
これによりオフチップのDRAMメモリではなく,オンチップなSRAMキャッシュにモデルを搭載させることができる.

f:id:taku-buntu:20190116113043p:plain

枝刈り+量子化を同時に使うと最も圧縮率が高い。枝刈りを使うと、同程度の量子化でも高い精度を保つことができる。また、線形な重心初期化が最も良かった。

手法

f:id:taku-buntu:20190115114429p:plain
Deep compressionの3つのパイプラインステージ

枝刈り

  1. 完全な学習済みネットワークを作る.
  2. 値の小さい重みを枝刈りする.しきい値よりも小さな結合重み全てをネットワークから削除.
  3. 最終的なスパース重みを再学習

これにより9倍から13倍のパラ数を削減 行圧縮(CSR)か列圧縮(CSC)を使った枝刈りの結果をスパース構造で結果を保存. 絶対位置ではなくインデックス差を下図の形式で保存する.このインデックス差をconv層では8bit,fc層では5ビットにエンコード.それらの境界よりも差が大きければ0パディング.

f:id:taku-buntu:20190115114733p:plain
相対インデックスを持つスパース行列表現.オーバーフローを防ぐためにゼロパディング

量子化と重み共有

以下の図の様に重み共有をする. 重みパラの値が近い者同士をビン(上段の色)に入れる.それに対応する勾配のところをグループ化して積み重ねる(下段).下段の同じビンの中身を全部足して,学習率と掛けて,最後にcentroidsとを減算する.

f:id:taku-buntu:20190115121720p:plain
図1 重み共有.(上)重みパラ(下)勾配.centroidsは入力.

k=クラスタ数としたとき,インデックスをエンコードするのに必要なビット数は log _ { 2 } (k) bits.一般的に,それぞれb bitsのn個の結合を持つネットワークでは
圧縮率は,
 r = \frac { n b } { n \log _ { 2 } ( k ) + k b }

上の図1では,元々4x4=16の重みがあるが,4つのグループとして重み共有するとそれぞれ32bitで構成される4個の重みになり,それと3.2(=1632/(432+2*16))の圧縮率を与える2ビットで構成される16のインデックスになる.(うまい翻訳わからない)

重み共有

重みを共有するパラメータを決定するのには学習済みネットワークの各層に対して,k-meansクラスタリングを利用する.層を超えての共有はない.nのパラをkクラスタにするのにはWCSS(within-cluster sum of squares)を最小化する.

 \underset { C } { \arg \min } \sum _ { i = 1 } ^ { k } \sum _ { w \in c _ { i } } \left| w - c _ { i } \right| ^ { 2 }
 W = \left{ w _ { 1 } , w _ { 2 } , \ldots , w _ { n } \right}, C = \left{ c _ { 1 } , c _ { 2 } , \ldots , c _ { k } \right}

HashNet(Chen et al. 2015)と違うのは,ネットワークが訓練データを見る前に重み共有はハッシュ関数によって決定されていること.今回は,完全にネットワークを学習させて,そのあとにオリジナルネットワークに近似していく.

共有重みの初期化
  • Forgy:ランダムにk個の観測値を取ってきて,それを重心(centroid)とする.観測点は黄色o.
  • Density-based: 重みのCDF空間のy軸に線形に棒線(赤い点線)を引いて,CDFとの交点のx軸ポイントを重心として取り出す.(青o)
  • Linear:オリジナル重みの[min, max]の範囲から線形に重心を取り出す. で初期化,元の分布とそれぞれで初期化した重みの分布を示す.

f:id:taku-buntu:20190115172320p:plain
(左)重心初期化の分布.(右)重み分布(青)とコード分布(緑x)とファインチューニングあとの分布(赤)

Forgy, Density-basedだと重みに広がりがでない(値の大きな値がない)からよくない.

逆伝搬は以下の式で行う.
 \frac { \partial \mathcal { L } } { \partial C _ { k } } = \sum _ { i , j } \frac { \partial \mathcal { L } } { \partial W _ { i j } } \frac { \partial W _ { i j } } { \partial C _ { k } } = \sum _ { i , j } \frac { \partial \mathcal { L } } { \partial W _ { i j } } \mathbb { 1 } \left( I _ { i j } = k \right)

ハフマン符号化

損失のない圧縮をするのに一般的に利用される. ソースシンボルを可変長コードでエンコードする.

重みやバイアスは偏っている.それをハフマン符号化で圧縮. f:id:taku-buntu:20190115190934p:plain

Automated flow for compressing convolution neural networks for efficient edge-computation with FPGA

arxiv.org
2017
LeapMindさんの論文です。

一言で言うと

学習済みTensorFLowモデルの自動フローをbinarized CNNのFPGA SoC実装に移植する。このフローは、パラメータとアクティベーション(おそらく、中間レイヤーに対する入力値)の量子化と、(binary CNNに向けたFPGAアクセラレータの自動生成による)C組み込みのネットワークとモデルを生成する。 binarized YOLOv2をこの自動フローで実装し、低コストで低パワーなCyclone-V FPGAで動作させた。それを動かしたら、CPUやモバイルCPUと比べてモデルサイズや推論スピードで非常に良い性能が得られた。さらに、学習済みモデルからFPGA合成(高位合成)をする全体の自動フローは1時間以内に完了させることができる。

感想

チャネルの順番をDを最後にする(Depth is first updated)と計算の速度だったり、メモリ効率だったりが変わるなんて衝撃だった。この論文が初?

結果

f:id:taku-buntu:20190112222817p:plain

f:id:taku-buntu:20190112222758p:plain

ざっく理論(もうざっくりじゃない)

手順

  1. full precisionモデルを 重みパラ=1 bit、アクティベーション=2 bitにして、オリジナルデータセットで再学習。
  2. 完全に再学習された量子化モデルであるTensorFlow protocol buffer formatが得られる。
  3. モデルはパースされ、関連性のあるグラフ変換が適用される。
  4. 量子化ネットワークのための組み込みCコードが生成され、FPGAアクセラレータの高位合成(HLS)実装が量子化ネットワーク用にカスタマイズされる。これは、適切なレベルの並列化とローカルメモリ使用率を選択するための、モデルの必要メモリと計算の複雑さを考慮して自動スクリプトを使って生成される。

f:id:taku-buntu:20190112175159p:plain
学習済みTensorFlow実装CNNモデルのFPGAへの実装フロー

モデルパース

いろいろな深層学習フレームワークの完全に学習されたモデルは、それぞれのbinary protocol buffer fileにシリアライズされる(.h5ファイルとか)。そのファイルは計算グラフやパラメータを保持している。
量子化アクティベーションと重みパラメータの自動的かつ透明性のある管理をするのがこの論文のキモな部分。量子化がサブグラフ(これは枝刈りされて、オリジナルグラフとビットごとに対応したもの、将来的に置換される)に使用されるなら、推論はすごく効率的になる。(←うまい日本語ができない...こんな感じかな)

下図は2つの連続した畳み込みがそれらの間で線形演算を持つときの例をサブグラフで示している。この場合、カーネル量子化サブグラフは削除することができる。これらのサブグラフは32ビットfloatの実数定数テンソルを持っている。しかし、Binary CNNはで学習は実行でき、その各層の重みは効率的に保存(pack)される。これは、1つの4ビットワードで32個の重みを保持することができるということ。

f:id:taku-buntu:20190112181300p:plain
連続した畳み込み間のサブグラフ。しきい値ユニットに置換される。

アクセラレーションに基づくFPGA

FPGAアクセラレータの並列化はターゲットFPGAの計算リソースやRAM block、メモリ帯域幅に大きく依存する。

設計準備

ここでは、以下の点を仮定する

  1. 特徴マップの数は8の倍数個
  2. 入力の特徴マップの数は16の倍数個
  3. オンチップメモリは制限されてる
アクセラレータ生成

以下の3つのステップ

  1. 基本的なbuilding blockをカスタマイズ
    i.e. 入力やカーネルに対する要素あたりのビットに従うPE
  2. PE行列の形にPENをカスタマイズ。PEの数は16からmin( depth _ { i })数個ある。( depth _ { i }は任意の層の入力次元の深さ)
  3. 自動的に他の関連性のあるパラメータと制御コードを計算

ここで、

  • PE:32ビット(1ワード)で保持されているカーネル要素積 。 1ビットカーネルなら、一つのPEで並列に32カーネル要素を計算できる。
  • PEN:並列に処理されるカーネル積。これはPEの同じ入力要素と異なるカーネル要素を並列に処理できる。なので、カーネル間の並列処理を利用してインプットを再利用できる。

f:id:taku-buntu:20190112211753p:plain
並列要素処理を持つFPGA SoCプラットフォームブロックダイアグラム

データ順序の最適化

CNNの入力、出力とカーネルは3次元データ配列で可視化される。典型的に(D, W, H)か(D, H, W)だが、今回は(H, W, D)か(W, H, D)を使う(Depth次元が最初に更新される)。Depth first順序は下記のちょっとしたメリットがある。

メモリ帯域の最適化

FPGAからおふチップDRAMへのメモリ帯域はボトルネックになりがち。これはバースト転送(Burst transfers)を使えば緩和することができる。けど、バーストサイズは連続的にアクセスされるメモリアドレスに制限される。上の提案順序はバーストサイズを最大化し、かつ効率的にメモリ帯域が改善する。

W-barとD-bar

W-barでは、入力サイズ( I _ { h }, I _ { d })、カーネルサイズ( K _ { h }, K _ { d })で、 I _ { w } K _ { w })の異なる幅を持つ。

D-barだと \operatorname { Ih } \times I w K h \times K wは違うは I _ { d } K _ { d }の異なる深さを持つ。

この図よくわからn...普通の畳み込みっぽく見えるんだけど

f:id:taku-buntu:20190112214428p:plain
入力とカーネルの要素ごとの重なり

外部と内部メモリアクセス
  • 外部メモリからの入力:D-barだとメモリジャンプが少ない。W-barだとKwの要素しかオーバーラップしないので、Kw×Kh×Kdのカーネル全体でKh×Kdの入力のメモリアドレスジャンプがある。一方、D-barだとKd×Kwの要素がオーバーラップするので、Khだけしかジャンプしない。結果、D-barだとメモリの連続性が向上してバースト性能が向上する。

f:id:taku-buntu:20190112220011p:plain
データ順序によるメモリアクセスの違い

  • ローカルメモリビットパッキングとPE:D-barは分かりやすくて、効率的にRAMブロック上で量子化のためのbit-packing実装ができ、複数のローカルメモリアクセスとマスキング演算が不要になる。D-barだとcourse-grainアクセスが可能になる。

f:id:taku-buntu:20190112221230p:plain
提案データ順序でのローカルRAMブロック上のbit-packing実装の効率的最適化

  • カーネル間の並列化:出力がローカルメモリに保存されてたら、D-barはクリーンなメモリ書き込みが可能になる。

英語

..., followed by...・・・その後に...

FITNETS: HINTS FOR THIN DEEP NETS

arxiv.org
2014/12

一言でいうと

knowledge distillationの拡張。今回の生徒モデルは教師モデルよりも深くて細長いモデル。教師モデルの出力だけを使うのではなく、中間特徴も生徒モデルの最終結果(出力層の結果)を改善させるために、ヒントとして利用する。生徒モデルの中間層のパラメータ数は、教師モデルのものよりも少ないため、それらをマッチングさせるマップの役割を果たすパラメータが導入される。これにより、深い生徒モデルはおよそ10.4倍のパラメータを削減できた。 得られたdeep and thinな生徒モデルを(FitNet)と呼ぶ。

結論

教師の中間層から中間レベルのヒントを教えてやることで、とても深い細長い生徒モデルでは、パラメータを少なくし、かつ教師モデルよりも高速で汎化性能の高いモデルを作ることができた。
データセットベンチマークから、キャパシティの少ないDNNは10倍のパラメータを持つネットワークよりも比較的良い特徴表現を得ることがわかった。

手法

knowledge distillation

knowledge distillationの損失は以下の式で取る

 \mathcal { L } _ { K D } \left( \mathbf { W } _ { \mathbf { S } } \right) = \mathcal { H } \left( \mathbf { y } _ { \text { true } } , \mathbf { P } _ { \mathbf { S } } \right) + \lambda \mathcal { H } \left( \mathbf { P } _ { \mathrm { T } } ^ { \tau } , \mathbf { P } _ { \mathbf { S } } ^ { \tau } \right)

ここで、 \mathcal { H } はクロスエントロピー関数で、 \lambdaは生徒モデルがハードターゲットかソフトターゲットのどちらから多く学ぶかを決める比率パラメータ。 このままだと、同じ深さの生徒モデルしか教えることができない。

Hint training

教師モデルの中間層の特徴をhintとして、生徒モデルの学習プロセスを指導する。 guided layer(FitNet(生徒モデル)の中間層)は教師のhint layerから学習。 hint layerとguided layerのペアは過剰に正則化(regularized)されていない層から選ばないと行けない。 教師モデルは生徒モデルよりもwiderなので、特徴サイズを一致させるためにregressorをguided layerに挿入する必要がある。
hint learningの損失関数が以下

 \mathcal { L } _ { H T } \left( \mathbf { W } _ { \text { Guided } } , \mathbf { W } _ { \mathbf { r } } \right) = \frac { 1 } { 2 } \left| u _ { h } \left( \mathbf { x } ; \mathbf { W } _ { \text { Hint } } \right) - r \left( v _ { g } \left( \mathrm { x } ; \mathbf { W } _ { \text { Guided } } \right) ; \mathbf { W } _ { \mathrm { r } } \right) \right| ^ { 2 }
 u _ { h } v _ { g } W _ { Hint } W _ { Guided }を対応付けるネスト関数で、 rは次元を一致させるregressor。

FitNetのステージごとの訓練

f:id:taku-buntu:20190108165442p:plain
生徒モデルのヒントを使った訓練

(a):教師モデルを学習することと、生徒モデルをランダムに初期化する。
(b):FitNetのguided layerのパラメータ W _ { Guided }の上に W _ { r }をつけて、 \mathbf { W } _ { Guided }を上式の L _ { HT }が最小化するように学習。
(c): L _ { KD }が最小化するように全体のFitNetのパラメータ W _ { S }を訓練。

f:id:taku-buntu:20190108170551p:plain
FitNEtsのステージごとの訓練

Learning Efficient Object Detection Models with Knowledge Distillation

https://papers.nips.cc/paper/6676-learning-efficient-object-detection-models-with-knowledge-distillation.pdf
2017

一言でいうと

knowledge distillationとhint learningを使った物体検出モデルの圧縮

新規性・差分

knowledge distillationは単純な分類問題に対して素晴らしい改善が示されているが、 物体検出では、回帰やRegion proposal、膨大なラベルがない場合に新たなchallengeが出現する。
これらの問題に、

  • クラスの不均衡に対処するために重みのクロスエントロピー誤差
  • 回帰コンポーネントを扱うための損失が制限された教師
  • 中間の教師分布からよりよく学ぶための適応層

で対処する。 結果、一貫してaccuracy-sppedトレードオフが改善した。(多クラス物体検出)

この論文の貢献

この論文の貢献は4つ

  • knowledge distillationを用いてend-to-endで学習可能なマルチクラス物体検出のフレームワークの提案
  • 前述のchallenge用の新しい損失関数の提案。特に、クラスの不均衡(背景である場合が多い)に対処するための重みクロスエントロピーの提案、knowledge distillationのための回帰損失を制限された教師、生徒モデルが教師の中間層ニューロンの蒸留からよりよく学習できるようにする適応層(adaptive layer)を提案している。
  • 大きなデータセットでの包括的な検証
  • 汎化と過小適合に関連付けた提案フレームワークの振る舞いの考察

ざっく理論

Faster-RCNNは3つのコンポーネントから成り立つ 1) 特徴を検出するCNN 2) Region Propossal Network(RPN) 3) 分類があっているのかと、出てきたRegion proposalがちゃんと物体のあるところに被さっているかを測るRegression(RCN) 2)は1)の特徴を使い、3)は1)も2)も両方使う。

全体構成

  1. hintを適応して、生徒モデルの特徴を教師モデルの特徴に近づけていく。
  2. knowledge distillationフレームワークを使って、RPNとRCNを強化する。
  3. 生徒モデルと教師モデルの重み量の不均衡を解消するために重みクロスエントロピーロス(weighted cross entropy loss)で損失を取る。
  4. 上界として教師の回帰出力を転送する。生徒の回帰出力のほうが教師のよりもよかったら、追加の損失は加えない。

f:id:taku-buntu:20190108012233p:plain
全体構成図

それぞれの損失の求め方

RCN, RPN, 総合的な損失

L _ { R C N } = \frac { 1 } { N } \sum _ { i } L _ { c l s } ^ { R C N } + \lambda \frac { 1 } { N } \sum _ { j } L _ { r e g } ^ { R C N }

 L _ { R P N } = \frac { 1 } { M } \sum _ { i } L _ { c l s } ^ { R P N } + \lambda \frac { 1 } { M } \sum _ { j } L _ { r e g } ^ { R P N }

 L = L _ { R P N } + L _ { R C N } + \gamma L _ { H i n t }
NはRCN、MはRPN用のバッチサイズ。[tex: L{cls}]はgrand truthラベルを使ったhard softmax lossとsoft knowledge distillation lossをあわせた損失。[tex: L{reg}]はバウンディングボックスの回帰損失(L1損失と教師が制限したL2回帰損失(4)の組み合わせ)

クラス損失

 L _ { c l s } = \mu L _ { h a r d } \left( P _ { s } , y \right) + ( 1 - \mu ) L _ { s o f t } \left( P _ { s } , P _ { t } \right)

soft target損失

 L _ { s o f \iota } \left( P _ { s } , P _ { \iota } \right) = - \sum w _ { c } P _ { l } \log P _ { s }
背景クラスの重みは大きくする。ex.  w_0=1.5

バウンディングボックスの回帰のところの損失

f:id:taku-buntu:20190108030653p:plain  L _ { r e g } = L _ { s L 1 } \left( R _ { s } , y _ { r e g } \right) + \nu L _ { b } \left( R _ { s } , R _ { l } , y _ { r e g } \right)
教師モデルといえども結構間違えることあるから、この出力をそのままターゲットにするのはまずい...
そこで、教師モデルの結果を上限として利用する。 mはマージン。生徒モデルの損失がある程度の余裕mを持って超える(生徒の損失のほうが低い)とき、生徒の損失は0。

特徴適応を用いたHint Learningの損失

教師モデルの中間特徴を生徒の中間特徴に教える。
次の式のように、特徴ベクトルV, ZでL2距離を使う。(学習)

 L _ { \operatorname { Hin } \iota } ( V , Z ) = | V - Z | _ { 2 } ^ { 2 }

L1損失で評価する。

 L _ { H i n t } ( V , Z ) = | V - Z | _ { 1 }

hint learningは指導する層(guided layer)の(チャネル, 幅, 高さ)が一致一致していないと使うことができないので、それらを一致させる層として適応層(adaptation layer)を入れる。hint layerもguided layerもFCなら、adaptation layerにはFCが使われる。Conv層なら1x1のConvを使う。

結果

  • 複雑なCNNベースの物体検出器は効率的に生徒モデルを指南することできた。
  • knowledge distillationとhint learningを今回提案した損失関数と一緒に使うことで、様々な実験で一貫して改善がみられた。
  • 精度の妥協も少なかった。特にPASCALデータセットの場合は全く精度妥協はなかった。

英語

comprehensive・・・総合的な
adaptation・・・適応的な
consistent・・・一貫して
notably・・・特に
insight・・・洞察
ample・・・十分な

英語論文をどうやってまとめるかの方針決め

いかにして論文を読むか

そもそも僕は論文をまとめる以前に読むのに非常に多くの時間を使ってしまうという大きな問題があります。

論文の読み方云々もそうですが、書物の読み方として大きく2つ

  • 精読
  • 速読

という方法があります。 論文に対する精読・速読との向き合い方に

www.slideshare.net

のが非常に役立ちます。

精読=研究を深めるため。論文の詳しい理解のため。
速読=研究分野の大まかなトピックや問題点を探り、研究テーマの策定などに活かす

と使い分けていくのが肝要らしいです。 じゃあ、論文においてそれらをやるにはどうすればよいのかというと

「読む順番を整理して、用途に応じて深度を変える」

を行えば良いです。

読む順番はいろいろありますが。

  1. アブストラク
  2. 図・表
  3. 結果
  4. イントロダクション
  5. 関連研究の後半(本論文の位置づけが書いてある箇所)
  6. 提案手法
  7. 実験環境・実験方法
  8. 議論

の順番で読むのがいいと感じました。
速読は太字のみ、精読はできれば6番目以降はさらっとでいいのですべて行きたいところです。特に、提案手法は一回目は難しくても一旦読み切るのが大事なように感じます。

いかにして論文をまとめるか

いろいろな論文のまとめかたがあります。

  • ArXivTimes
    f:id:taku-buntu:20181230021721p:plain
    ArXivTimes
  • 落合陽一フォーマット
    f:id:taku-buntu:20181230021916p:plain
    落合陽一フォーマット
  • 落合陽一派生フォーマット
    f:id:taku-buntu:20181230022053p:plain
    落合陽一派生フォーマット

そこで、僕は

  • 論文リンクと発表年月日
  • 一言でいうと
  • この論文のすごいところ
  • 技術のキモ
  • ざっくりとした理論
  • 結果
  • 英単語

僕の場合、英語能力が乏しいのと、今後も関連論文をいろいろ読んでいこうと考えているので、英単語を最後にまとめておこうと思いました。

Do Deep Nets Really Need to be Deep?

arxiv.org
2014

一言でいうと

浅いネットで深いネットをmimic learning(ものまね学習)することで、モデル圧縮をする。

この論文のすごいところ

教師モデルを使って浅くても優秀な生徒モデルを作ることができることを示した

感想

優れた教師で学習させたら、生徒モデルも性能がよくなるっていうことが定量化されていたので良かった。この論文のウリは事前にHinton先生のKnowledge Distillationを読んでいたのであまり衝撃はなかった。

ざっく理論

ディープなネットでラベル付されたデータを使ってシャローネットを学習。
ディープネット=softmaxとクロスエントロピー関数で学習
シャローネット=183のp値(ディープネットのsoftmaxの出力)とのクロスエントロピーで学習

softmaxを通して確率化してしまうとlogit[10, 20, 30]も[-10, 0, 10]も同じ値になってしまう。これだと重要な情報がなくなってしまうため、logitをターゲットとして使うほうが良い。

回帰を真似る目的関数はこれ(SNN-MIMIC)

 \mathcal { L } ( W , \beta ) = \frac { 1 } { 2 T } \sum _ { t } \left| g \left( x ^ { ( t ) } ; W , \beta \right) - z ^ { ( t ) } \right| _ { 2 } ^ { 2 }
training data= {(x^{(1)}, z^{(1)}), ...}
W=入力特徴xと中間層間の重み行列
 \beta=中間層から出力層の重み
 g \left( x ^ { ( t ) } ; W , \beta \right) = \beta f \left( W x ^ { ( t ) } \right)= t^{th}番目の訓練データの出力

KLダイバージェンスをものまねモデルの損失関数に使うことも考えた。

 \mathrm { KL } \left( p _ { \text { teacher } } | p _ { \text { student } } \right) とL2ノルム損失を最小化する。

線形層を導入してmimic learningを高速化する

シャローネットはディープネットを真似しなきゃいけないから、一層あたりのパラメータ数が多く必要になる(そういうもんなのか...)。 つまりは、Wのサイズが大きくなるから学習に時間がかかる。
--> W \in \mathbb { R } ^ { H \times D }を低ランク近似行列U \in \mathbb { R } ^ { H \times k }V \in \mathbb { R } ^ { k \times D }にする。

 \mathcal { L } ( U , V , \beta ) = \frac { 1 } { 2 T } \sum _ { t } \left| \beta f \left( U V x ^ { ( t ) } \right) - z ^ { ( t ) } \right| _ { 2 } ^ { 2 }

結果

f:id:taku-buntu:20181229224240p:plain
omparison of shallow and deep models: phone error rate (PER) on TIMIT core test set

f:id:taku-buntu:20181229224329p:plain
ShallowMimicNetは100Mになると通常の(アンサンブルCNNと比べれば小さいがそれでも大きい)CNNと同等の結果を示すようになる

浅いものまねモデルは過学習しにくい、1層あたりのパラ数が増えれば精度も上がっていく。

  • なぜものまねモデルはオリジナルラベルで学習したときよりも精度が高いのか?
    • 一部の正解ラベルに間違いがあって、教師モデルはそれを排除している
    • 正解ラベルの状態では生徒のものまねモデルはその領域を表現できない。教師モデルはもっと柔らかい表現を生徒に教えることができる
    • 蒸留が有効である理由と同じ。教師モデルからの出力は0/1のラベルよりも多くの情報を含んでいる

f:id:taku-buntu:20181229231927p:plain
x軸: 教師モデルの精度、y軸: ものまねモデルの精度
優れた教師から学ぶと生徒モデルも良くなる

英単語

fidelity・・・忠実
logarithm・・・対数