情報学部大学生のダラダラ日記

β日記

機械学習や日記っぽいものを書きます

モデルを蒸留するのではなくデータセットを蒸留する(論文紹介②Dataset Distillation)

スポンサーリンク

蒸留とは

 中学生の時に化学で学んだ蒸留について、

蒸留(じょうりゅう、Distillation)とは、混合物を一度蒸発させ、後で再び凝縮させることで、沸点の異なる成分を分離・濃縮する操作をいう。

引用元:Wikipedia

 深く、大きいモデルが優秀であることは想像に難くありません。しかし、実際にはそのような大きいモデルが使用できないが機械学習モデルを使用したい場面があります(ラズパイとかでやる時など)。そのような時に、深く大きいニューラルネットワークの知識を蒸留し、より浅く小さいニューラルネットワークへ学習させるために使われるものです。特に大きいモデルを教師モデル、小さいモデルを生徒モデルと言います。つまり性能をできるだけそのままに教師モデルから生徒モデルへ知識の継承を行うことを目的としています。これについての元論文は以下です。

Distilling the Knowledge in a Neural Network,Geoffrey Hinton, Oriol Vinyals, Jeff Dean,2015,https://arxiv.org/abs/1503.02531

日本語でまとめられた文献もあります。

Deep Learningにおける知識の蒸留 | Code Craft House

論文紹介

今後、本記事での画像等の引用は全てこの論文からです。

引用数は9でタイトルはそのまま「データセットの蒸留」です。

概要

 先ではモデルの蒸留を行っていましたが本論文ではデータセットの蒸留をします。具体的には膨大なデータセットをサンプリングすることなく、各クラスごとに新たな画像を生成することでデータセットを圧縮している。

f:id:Parco1021:20191127182634p:plain

引用元:Dataset Distillation

 

イメージとしては上のような感じ。このように新たに画像を生成することで数万枚のデータセットが10~300枚へと蒸留することができている。

アルゴリズム

f:id:Parco1021:20191127184527p:plain

引用元:Dataset Distillation

<!--以下自己解釈

蒸留後データセット{\displaystyle x ̃ }を初期化する。

元データ{\displaystyle x }を取得する。

ある重み{\displaystyle }θ_0^{(j )}において勾配を求め、より良い重み{\displaystyle }θ_1^{(j )}を決定

元データと{\displaystyle }θ_1^{(j )}を使ってロス関数を計算する。

ロス関数の勾配から蒸留後データセット{\displaystyle x ̃ }を更新する。

-->

実験結果

まず、上記のアルゴリズムを繰り返し行う2パターンの実験を行う。

上のアルゴリズムを拡張して2つの方法を用意する。

(a)重み{\displaystyle θ }の更新を複数回行う

(b){\displaystyle x ̃ }の更新を複数回行う

f:id:Parco1021:20191127190345p:plain

引用元:Dataset Distillation

 

実験対象としてMNISTとCIFAR10が用いられたが、(a),(b)どちらの場合にも複数回行った方が正確となっている。

 

次に、ベースライン条件として以下の4つの条件を用意し、それとデータセットを蒸留した時の結果を比較する。

ベースライン条件

  1. ランダム
  2. 学習効果の高かった上位20%
  3. k-means法
  4. 各画像の平均

結果が以下です。ベースライン条件よりも良い結果になっていることがわかります。

f:id:Parco1021:20191127193422p:plain

引用元:Dataset Distillation 

さいごに

 今回は蒸留という手法の新しいアプローチを行った論文でした。どのようなクラスからどのような画像が生成されたかは参考文献の公式リンクから観てみてください。carクラスだったりが1つの画像になっているのは結構面白いです。

英語キチィ~

参考文献

 

 

 おわり。

もしよければ↓ぽちっと↓お願いします。

ブログランキング・にほんブログ村へにほんブログ村

 

PVアクセスランキング にほんブログ村

スポンサーリンク