ラベルへのオーギュメンテーション新登場！「SLA」を解説！


**オミータです。[ツイッター](https://twitter.com/omiita_atiimo)で人工知能のことや他媒体の記事など** を紹介していますので、人工知能のことをもっと知りたい方などは **[@omiita_atiimo](https://twitter.com/omiita_atiimo)をご覧ください！**
他にも次のような記事を書いていますので興味があればぜひ！

> * [【基本編】画像認識に使用されるData Augmentationを一挙にまとめてみた！](https://ai-scholar.tech/articles/data-augmentation/data-augmentation-image-recognition-survey)
> * [わずか1%のラベルでImageNet高精度「SimCLR」解説](https://ai-scholar.tech/articles/image-recognition/simclr-ai-400)
> * [GANにもオーギュメンテーションは超有効だった！DAだけでSoTA達成した最新論文を解説！](https://qiita.com/omiita/items/3d967f30fcf73c435c6f)
> * [新たな活性化関数「FReLU」誕生&解説！](https://qiita.com/omiita/items/bfbba775597624056987)
> * [2019年最強の画像認識モデルEfficientNet解説](https://qiita.com/omiita/items/83643f78baabfa210ab1)

# ラベルへのオーギュメンテーション新登場！「SLA」を解説！

画像データに対するデータオーギュメンテーション(以下、DA)は今では必要不可欠な技術となっており、これまでたくさんのDAが考案されてきています(参考：[DAまとめ記事](https://ai-scholar.tech/articles/data-augmentation/data-augmentation-image-recognition-survey))。ただこれまでのDAは画像自体に適用するものが主流で、**ラベルは変更しないというものが多かった**です(MixupやCutMixなどソフトラベルを使う例もありますが。)。そこで**ラベルも変更してしまおう**、というのが**ICML2020**で登場した[["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)]](https://arxiv.org/abs/1910.05872)になります。本記事では、論文で提案されている「SLA」(=Self-supervised Label Augmentation)という手法について解説していきます。「ラベルも変えちゃおうよ」という発想を**単純な仕組みで実現**しており、画像分類やFew-shotなどで性能向上を果たしています。SLAを早速見ていきましょう。

![sla_fig1a](https://i.imgur.com/6qBXJAW.png)

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)
> 公式実装： [PyTorch](https://github.com/hankook/SLA)


**本記事の流れ**:

- **忙しい方へ**
- **SLAの解説**
  - **自己教師あり学習**
  - **SLA**
- **SLAの実験結果**
- **まとめと所感**
- **参考**


> 原論文: ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)


|略称|名称|
|:--:|:--|
|**SLA**|Self-supervised Label Augmentation|
|**DA**|Data Augmentation|
|**SSL**|Self-Supervised Learning|
|**AG**|Aggregation|
|**SD**|Self-Distillation|
|**SI**|Single Inference|



## 0. 忙しい方へ

- SLAの構成要素は次の3つだよ
  - **結合ラベル**:「元のラベル」と「適用したDA」の組み合わせを新たなラベルとしたよ
  - **アンサンブル**:予測ラベルは「元の画像」と「DA適用後の画像たち」を全て考慮して出力するよ
  - **自己蒸留**:推論時にもアンサンブルの効果が得られるように、アンサンブルによる出力を模倣するような線形変換を用意するよ
- CIFAR10/100/TinyImageNetなど**幅広いデータセットで大きなゲイン**を得ているよ
- **Few-shotや不均衡データに対しても性能向上**を示したよ

<img src="https://imgur.com/3IzuSyH.png" alt="icr_icrgan" width=400>



## 1. SLAの解説
SLAは、Self-Supervised Learning(=SSL)にインスピレーションを得ています。ラベル予測にはアンサンブルを用いており、また推論時のスピードを速くするために自己蒸留を用いています。SLAの説明は次の順番で行います。

1. Self-Supervised Learning(=**SSL**)
2. Self-supervised Label Augmentation(=**SLA**)
  2.1 結合ラベル
  2.2 アンサンブル
  2.3 自己蒸留

### 1.1 Self-Supervised Learning

<img src="https://imgur.com/ABibfYO.png" alt="icr_icrgan" width=500>


そもそも教師あり学習の「教師」とは何でしょうか。この教師とはつまり「ラベル」のことでしたね。教師あり学習では、そのラベルを用いてモデルを学習させます。それではSelf-Supervised Learning(=SSL)、自己教師あり学習の「自己教師」とは何のことを指しているのでしょうか。**自己教師とは「自ら生成したラベル」のことを指しています**。例えば、ある画像を90度回転させた場合にSSLで用いるラベルは「90度」です。このように、画像にDAを適用させてその適用したDAを当てさせるというタスクがSSLにはよくあります(Ex.回転角度）。教師あり学習を行う前の事前学習としてSSLを用いると最終的により高い性能のモデルが出来上がったりします。もっと詳しく知りたい方は[こちらのページ](https://lilianweng.github.io/lil-log/2019/11/10/self-supervised-learning.html)でSSLについてまとめられていますのでご覧ください。

ただし、論文著者はSSLの問題点として次の2つを上げています。まず、SSLでは教師ラベルを予測する識別器と自己教師ラベルを予測する識別器それぞれ用意するため「学習の難しいマルチタスク学習」になっているという欠点があるということです。また、画像にDA適用してもその予測結果は同じでなければならないので、「不要な一貫性モデルに強制」してしまっています。そのため**提案手法であるSelf-supervised Label Augmentation(=SLA)ではこの「マルチタスク学習」と「不要な一貫性の制約」を結合ラベルを用いることで解決**しています。


### 1.2 Self-supervised Label Augmentation

ここからはSLAの説明に入ります。前述したとおり、SLAは主に3つの要素で構成されています。それぞれの役割を簡単に記すと、学習時に使用する「**結合ラベル**(=Joint Label)」、ラベル予測の精度を上げるための「**アンサンブル**」、推論時のスピードアップのための「**自己蒸留**」です。結合ラベルがSLAの一番重要な構成要素で、あとの2つはさらにモデルを良くするためのテクニックのようなものです。


#### 1.2.1 結合ラベル

![sla_fig1a](https://i.imgur.com/6qBXJAW.png)

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

まず、通常学習時に使用するラベルは「犬」や「猫」という画像の意味を示すもの(ここでは便宜上**意味ラベル**と呼びます。)となります(上図上段)。SSLではこれに加えてDAに対するラベル(回転であれば「0度回転」や「90度回転」など)も用いました(**DAラベル**とします)。そのため「90度回転」を適用した「犬」の画像であれば、SSLモデルには「90度回転」を予測する識別器と「犬」を予測する識別器が別々でありました(上図中段)。SLAでは、この別々で予測していたものを1つの識別器で一気に予測します。つまり、**「90度回転した犬」というラベルとして1つの識別器で予測する**、ということです(上図下段)。このように意味ラベルとDAラベルをくっつけたラベルが**結合ラベル**です。DAラベルが$M$個あり、意味ラベルが$N$個あれば**結合ラベルはそれら1つ1つの組み合わせになるので$M\times N$個ある**ということです。(例えば、DAが回転(0, 90, 180, 270)ならM=4で意味ラベルが犬、猫、馬ならN=3なので、学習に用いる結合ラベルは$4\times3=12$個ということになります。)

![sla_joint_label](https://imgur.com/R3lNO8Y.png)


結合ラベルは1つの識別器で判断します。またDAが異なる画像なら結合ラベルももちろん異なります。こうして結合ラベルを用いることで**マルチタスク学習と一貫性の制約が同時に解決**できました。ちなみに、このSLAによって最終層のパラメータ数はわずかに増加しますが全体のネットワークと比べて無視できる程度(ResNet32に対して0.4%の増加)なので問題ありません。ここまでを踏まえて、SLAに対する損失関数は次のように書けます。単純ですね。

```math
\mathcal{L}_\mathrm{SLA}(x, y;\theta, w) = \frac{1}{M}\sum_{j=1}^M\mathcal{L}_\mathrm{CE}(\rho(\tilde{z}_j);w), (y, j))
```

ここで $x, y, M, \rho(\cdot), \tilde{z}\_j$は、それぞれ入力画像、意味ラベル、DAの数、Softmax識別器、DAの$j$を適用した画像$x$の潜在表現を表しています。$\tilde{z}\_j$はつまり、DAとニューラルネットをそれぞれ$t(\cdot),f(\cdot)$とすると$\tilde{z}\_j=f(t_j(x))$のことです。$\mathcal{L}\_\mathrm{CE}$はクロスエントロピーです。ちなみに、学習時は、$M$個のDAが適用された画像たち($M$個)は同時に処理されます。つまり通常の画像が入ってきたらそれに対して$M$個のDAを適用し$M$個の画像を獲得してから実際のニューラルネットへと全て入力する、ということです。ミニバッチ$B$を用いるとSLAによる学習は単に$\frac{1}{|B|}\sum_{(x,y)\in B}\mathcal{L}_\mathrm{SLA}(x,y;\theta,w)$を最小化することになります。ちなみに論文中で取り扱われているDAは**回転**($M=4$)と**RGB入れ替え**($M=3!=6$)の2つです(下図例)。

![sla_fig1cd](https://i.imgur.com/l7YpAYv.png)

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)


#### 1.2.2 アンサンブル

結合ラベルによってSSLの問題点をうまく解決できることはわかりました。ただし、このままではモデルはもちろん結合ラベルを出力してしまいます。予測時の出力は意味ラベルであって欲しいはずです。画像のラベル予測においては、90度猫も270度猫もいずれも「猫」とだけ答えて欲しいです。そこで、[実装](https://github.com/hankook/SLA/blob/a36149281c7f01cffeb5208fd85e910ea0e927c4/trainers.py#L76)では、まず角度0度の画像を入力します。この時logitの角度0度の部分だけを抜き取ります(長さ$N$のベクトル)。続いて角度90度にした画像を入力しlogitの角度90度の部分だけを抜き取ります(長さ$N$のベクトル)。角度180度と270度に対しても同様の処理を行います。最終的にそれぞれの角度におけるlogit(のような)ベクトルがあるので、それらを要素ごとに平均して最終的にその平均ベクトル(もちろん長さ$N$のベクトル)に対してSoftmaxをかけて意味ラベルを手に入れます(実際には各角度の画像は順に入れるのではなくミニバッチで一気に入力します)。この処理は、意味ラベルに対する**各角度によるアンサンブル**と見なすこともできます。論文中ではこのアンサンブル部分を**Aggregated Inference**と呼んでいます。

<img alt="sla_ag" src="https://i.imgur.com/jg6vTKn.png" width=400>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)改変


このアンサンブルを式で表すと、

```math
P_\mathrm{aggregated}(i|x)=\frac{\exp(s_i)}{\sum_{k=1}^N\exp(s_k)}
```

ただし、

```math
s_i = \frac{1}{M}\sum_{j=1}^Mw^\intercal_{ij} \tilde{z}_j
```

そして最後にPyTorchによる実装例(論文に記載)を示します。`AG`がアンサンブルによる出力(`BxN`)を表しています。`model`による出力は`4B x 4N`のlogitです。

![sla_agimpl](https://i.imgur.com/DAiQAcL.png)

この推論方法によって、モデルを別々に用意する**通常のアンサンブルと同程度の性能**を叩き出したというので驚きです。

#### 1.2.3 自己蒸留

先ほどのアンサンブルによって性能は大きく向上するのですが、推論時間がM倍長くなってしまうという欠点があります。それもそのはずで、1枚の予測をするためにまずM個の画像を生成させてそれぞれに対する予測から最終的な予測を1つにするためです。ただし、この推論時間を削減したいです。そのために用いるのが「蒸留」というテクニックです。

ここで用いる蒸留は端的に言えば、「アンサンブルによる出力を模倣させる」というものです。自分自身を模倣しているので**自己蒸留**です。式で見るともっとわかりやすいかもしれません。自己蒸留というのは次式のKLダイバージェンスを最小化させるような小さなネットワーク$\sigma(z;u)$を用意することになります。ここで$z$はオリジナル画像の埋め込み表現です。

```math
D_{KL}(P_{\mathrm{aggregated}}(\cdot|x)||\sigma(z;u))
```

この$\sigma(z;u)$はアンサンブルの出力を模倣しているので、**推論時はこのネットワークを使うだけでアンサンブルのような効果が得られる**ということです。ただし、自己蒸留はあくまでアンサンブルを模倣することで推論時間を減らしているだけなので**推論時もそのままアンサンブルを用いる方が基本的には良い性能**を示します。最後にこの自己蒸留を加えたネットワークの図を示して実験結果へと移ります。先ほどのアンサンブルの図にSelf-distillation(自己蒸留)が加えられているだけです。

<img alt="sla_sd" src="https://i.imgur.com/6tQEmCM.png" width=400>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)



## 2. SLAの実験結果

実験は大きく分けて以下の3つです。
* **アブレーションスタディ**
* **画像分類**
* **特殊なデータでの画像分類**(Few-shotやimbalancedなど)


### 2.1 アブレーションスタディ

早速アブレーションスタディからです。ここではSLAの有用性を見るために次の2つを行います。

* DAとマルチタスク(SSL)との比較
* 他アンサンブル手法との比較


#### 2.1.1 DAとマルチタスク(SSL)との比較

<img src="https://imgur.com/Qe165B6.png" alt="sla_tab1" width=500>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

まずはSLAを他の学習方法と比較します。上表のそれぞれの列の意味は次の通りです。

* Baseline: ランダムクロップ+水平反転適用し学習させたモデル
* DA: 回転を適用し学習させたモデル
* MT: SSLのこと。回転角度とラベルの2つをそれぞれ予測できるようにしたモデル。
* SLA+SI: 提案手法。推論時は回転を加えていない画像の予測ラベルのみを用いる。(=SI)

上表を見ると他の学習手法では性能劣化が起きてしまっていますが、**提案手法のみがベースラインをわずかに改善させている**ことがわかります。

<img src="https://imgur.com/kBsLavM.png" alt="sla_fig3" width=400>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

上図はCIFAR100における各学習方法の学習過程を示しています。実線は学習時の精度で、点線は推論時の精度です。論文中では、「推論時にDAの精度が低いのはDAが不要な一貫性をモデルに強制しているため」であるとしています。

#### 2.1.2 他アンサンブル手法との比較

<img src="https://imgur.com/9BFppPS.png" alt="sla_tab2" width=400>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

続いて、SLAを他アンサンブル手法と比較してみます。1.2.2のアンサンブルにて説明したように、SLAには各回転角度での推論結果から最終的な意味ラベルを1つ予測するアンサンブルのような機構があります。上表ではAGと表されています。またIEとはIndependent Ensembleの略で、単に4つのモデルを用いたアンサンブルとの比較も行っています。(回転を用いた場合にAGでは4つの回転角度から予測を決定するため。)
上表を見るとSLA+AGはベースラインをしっかりと改善させていますが、この**SLA+AGがIEと同程度の性能を示していることがもっと驚き**です。SLA+AGを4つのモデルで行う(=IE+SLA+AG)ことでさらなる性能向上を達成しています。

<img src="https://imgur.com/L0IjzVN.png" alt="sla_tab2" width=650>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

さらにテスト時のアンサンブルとも称されるten-cropとの比較も行っています。ten-cropは1枚の画像から10個のクロップを生成しそれぞれに対するsoftmaxを平均して最終出力とするものです。クロップ版AGのようなものですね。**ten-cropにも見事SLA+AGが勝ってます**ね。


### 2.2 画像分類

それでは、実際の画像分類タスクにおけるSLAの有用性を見ていきます。次の3つを行います。

* 画像分類における実験結果
* DAの数
* 他手法との組み合わせ

#### 2.2.1 画像分類における実験結果

<img src="https://imgur.com/gM7Hi4Q.png" alt="sla_tab2" width=600>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

上表では、回転とRGB入れ替えの場合それぞれについての各データセットでの識別精度をまとめています。ネットワークにはCIFAR10/100にはResNet32を、それ以外にはResNet18を用いています。ここから言えることは次の2つです。

* **SLAを使うことでどのデータセットでも分類精度が向上**
* AGほどではないものの**Self-Distillation(=SD)でもある程度のゲイン**を得られる。


#### 2.2.2 DAの数

<img src="https://imgur.com/lfBlJyd.png" alt="sla_tab2" width=600>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

ここでは回転とRGB入れ替えの両方を一気に適用した場合を考えます。その時、回転角度やRGB入れ替えのパターンなどの一部だけを用いた場合についても同時に見ていきます。上表では回転角度とRGBのそれぞれのパターンとそれによる組み合わせの数(=$M$)が記されています。上表を見ると、回転角度は4つ全て用いてRGBの入れ替えに関しては3パターンを用いる**合計12個の組み合わせ($M=4\times3=12$)のときが最も良い性能**を示していることが分かります。

#### 2.2.3 他手法との組み合わせ

<img src="https://imgur.com/q8rIcI6.png" alt="sla_tab2" width=400>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

さらに他DA手法たちと同時に使った場合に識別精度がどうなるのかについても見てみます。上表を見ると、CutoutやCutMix、AutoAugmentなど**比較的最近のDA手法と一緒にSLAを用いることでさらなるゲイン**が得られることがわかります。

### 2.3 特殊なデータでの画像分類

続いて特殊なデータセットで画像分類を行います。実験設定は次の4つです。

* データ数が少ない場合
* Few-shot
* 不均衡データ
* ラベル数が多い場合

#### 2.3.1 データ数が少ない場合

<img src="https://imgur.com/DWjivxp.png" alt="sla_tab2" width=400>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

まずは各クラスごとのデータ数が少ない場合について検証してみます。上図はSLAのAG(赤)とSD(青)を用いた場合を示しています。ここではBaseline(黒)との相対的な性能向上が示されています。この相対的な性能向上はデータ数が少ないほど(表の左側ほど)、SLAの相対的ゲインが大きいことがわかります。そのため**データ数が少ない場合にもSLAはより上手に対応してくれる**ことがわかります。

#### 2.3.2 Few-shot

<img src="https://imgur.com/jnUNDBd.png" alt="sla_tab6" width=600>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

データ数が少ない場合にSLAが比較的よく働いてくれることから、Few-shotでも性能向上を果たしてくれそうです。上表はそれをまとめたもので、**予想通りSLAを用いることでFew-shotでもゲインが得られている**ことが分かります(ProtoNet/MetaOptNet)。

#### 2.3.3 不均衡データ

<img src="https://imgur.com/Q0OsL93.png" alt="sla_tab7" width=600>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

**不均衡データ(=クラスごとのデータ数が大きく異なるデータ)に対してもSLAがゲイン**をもたらしていますね。

#### 2.3.4 ラベル数が多い

<img src="https://imgur.com/Ltr1yCu.png" alt="sla_tab7" width=400>

> ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)

そして最後にむしろラベル数が多い場合(ImageNet:1000ラベル、iNaturalist: 8,000ラベル)でもSLAがうまくいくのかを見てみます。そもそものラベル数が多いと、結合ラベルはDAとの組み合わせなのでものすごく大きくなりうまく学習できなさそうですが、**実際のところはSLAを用いると性能が上がっています**。やはりSLA+AGがもっとも良いですね。


## 3. まとめと所感

SLAは、結合ラベルという新たなラベルを導入することで性能向上を果たしました。本論文では画像分野に対する実験のみでしたが、SLAの考え方はどの分野にも使えるものであり今後のさらなる発展が気になります。PyTorchによる[公式実装](https://github.com/hankook/SLA)もありますので試してみてはいかがでしょうか！

**Twitterで人工知能のことや他媒体の記事などを紹介していますので[@omiita_atiimo](https://twitter.com/omiita_atiimo)もご覧ください。**

こちらもどうぞ：
> * [【基本編】画像認識に使用されるData Augmentationを一挙にまとめてみた！](https://ai-scholar.tech/articles/data-augmentation/data-augmentation-image-recognition-survey)
> * [わずか1%のラベルでImageNet高精度「SimCLR」解説](https://ai-scholar.tech/articles/image-recognition/simclr-ai-400)
> * [GANにもオーギュメンテーションは超有効だった！DAだけでSoTA達成した最新論文を解説！](https://qiita.com/omiita/items/3d967f30fcf73c435c6f)
> * [新たな活性化関数「FReLU」誕生&解説！](https://qiita.com/omiita/items/bfbba775597624056987)
> * [2019年最強の画像認識モデルEfficientNet解説](https://qiita.com/omiita/items/83643f78baabfa210ab1)



## 4. 参考
* ["Self-supervised Label Augmentation via Input Transformations", Lee, H., Hwang, S., Shin, J., (ICML'20)](https://arxiv.org/abs/1910.05872)  
原論文