自己教師あり学習 Barlow Twins とSimCLRなどの先行研究

20210914 初稿
20210914 SimCLRを中心に修正
20210915 InfomationBottleneckについて追記
20211014 CVPRではなくICML2021でした。指摘を頂き修正しました。@theta さんありがとうございました。

# 1.概要

- 自己教師あり学習 Barlow Twins([ICML2021](https://icml.cc/Conferences/2021/ScheduleMultitrack?event=10299))の関連リンクとメモです。ちょこちょこ追記していく予定です。
- 先行研究と比較することで、扱いやすいのにSoTAと並ぶ性能が出せる優れた手法だということが分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/20e1ebd5-5520-f46e-a47e-fec81809a403.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/2a6d6f5b-f613-bef8-f8e9-f80f2117a165.png)

https://paperswithcode.com/sota/self-supervised-image-classification-on?metric=Top%205%20Accuracy


# 2.ところでBarlowって何ですか？

人です。大昔に本物の神経細胞の分野で「冗長性を削減するモデル」を提唱したのだそうです。
ピッタリの命名ですね。
あと進化論のダーウィンの曾孫。

> Barlow（1959）は脳が段階的に（階層性のある処理で）冗長性を削減するモデルを提示し，さらに情報理論的に最適な表現を生成する（optimal coding）のが感覚情報処理だとしてモデル化することを提唱している．この論文ではCraik（1943）9)を引いて，情報理論的に最適な表現は環境のモデルになっていることも議論されている.

https://www.ds.shiga-u.ac.jp/ttakuma/ttakuma2018a.pdf

2020年に亡くなったのもこの名前に影響しているのかも。
↓は訃報を知らせる記事から。HoraceはBarlow氏のファーストネームです。先見性ありすぎ。活躍している期間長すぎ。


> 感覚経路の冗長性と相関する活動のアイデアは、「教師なし学習」に関する彼の非常に影響力のある論文の根底にあります（Neural Comput。（1989）1、295–311）。この論文は、教師あり学習や強化学習ではなく、教師なし学習の重要性に最初に注目したものの1つです。教師なし学習は、神経系（または実際には人工知能）が「統計的規則性」または入力のパターンをどのように認識するかについてであり、皮質を理解するために基本的に重要です。Horaceは、Tolmanの「認知地図」やCraikの「作業モデル」などの古いアイデアを現代のエントロピーの概念と結び付け、感覚信号の冗長性がこれらの地図に組み込まれた知識を提供すると結論付けました。このような知識により、予期しない不一致を即座に特定して対処することができます。Horaceの情報理論ベースのアプローチは、ニューラルネットワークおよびベイズ学習における教師なし学習への多くの最新のアプローチの根底にあります。

https://www.cell.com/current-biology/fulltext/S0960-9822(20)31085-X


# 3.自己教師あり学習で起きる問題

ここからはJure（ユーリと読むらしい）さん本人の解説動画のキャプチャを軸にいろいろ足しています。

https://www.youtube.com/watch?v=H1q9RC5SI4I

- 人によるアノテーションなしで「役に立つ」表現に変換したいというのがモチベーションです。ここでの「役に立つ」というのは、作った表現を画像分類、物体検出、インスタンスセグメンテーションといったタスクに転移学習で使えるということです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/6fcffb05-2de7-a9e8-5bcf-24f7ae77ce9e.png)

- よくやられるのが、ネットワークのペアに別の雑音を入れた画像を入れることです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/b2926436-5ecb-e67f-b90a-3259bee865c9.png)

- すると得られる解はトリビアルなものになってしまうという問題が発生します。この場合はLossを-1にするためにベクトル$Z_A$と$Z_B$の全部成分が1になってしまいました。このトリビアルな解になってしまう現象をCollapseと呼ぶそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/68837e51-91bd-d7c8-ffe9-e700a17ded09.png)

# 4.先行研究

このCollapseを回避する先行研究達です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/1d49734e-c690-64bf-feb8-504b2d3d8b63.png)

SimSiam視点の比較画像もありました。個人的にはこれが分かりやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/193f2a7a-eeba-236a-2165-fcb1317ef0ac.png)


## 4-1.SimCLR：A Simple Framework for Contrastive Learning of Visual Representations(2020/2)
* Contrastive Learning（対照学習） の代表的な手法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/57551bca-28ed-1fc3-60e5-76dbceb80958.png)

* Lossの変更で対処します。Negative Sampleを使います。
  違う画像同士ではコサイン類似度が-1になって、同じ画像なら１になることを目指します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/5454e938-a77d-f021-c22d-a475be71fd01.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/bd2e2612-c555-2445-eff7-840afd61a1fc.png)


* 画像分類で教師ありに並ぶような性能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/c20a27b1-afb7-b9a9-f3cc-f9bc31ab4d59.png)

* Negative Sampleが要るのでバッチサイズとエポック数がエグいです。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/a39b8030-1d3f-8de1-bb9d-94aa51e034c5.png)



https://arxiv.org/abs/2002.05709
 
https://ai-scholar.tech/articles/image-recognition/simclr-ai-400

https://www.youtube.com/watch?v=wySLC4nszv8

https://qiita.com/omiita/items/a7429ec42e4eef4b6a4d

## 4-2.BYOL：Bootstrap Your Own Latent A New Approach to Self-Supervised Learning(2020/6)
* Lossではなくアーキテクチャの変更で対処します。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/d14b46bf-f2da-4e41-865a-55f0231d8310.png)

* 画像分類タスクでSimCLRを上回りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/b9f9ef10-8b47-ae4d-0795-d14d9bc80296.png)

* Negative Sampleが要りません。なので（？）バッチサイズの影響を受けにくいです。
* 逆伝搬によるウェイトの更新は片方だけします。もう片方は更新されたウェイトにExponential Moving Average($\tau$でカットオフ周波数が決まる1次のローパスフィルタ)をかけたものにします。これはこれで遅いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/8c4a11f3-2ac0-f7a8-e8da-89196da93e80.png)



https://arxiv.org/abs/2006.07733

https://github.com/sthalles/PyTorch-BYOL

https://ai-scholar.tech/articles/self-supervised-learning/bylo

https://sn-neural-compute.netlify.app/202006250/

## 4-3.SimSiam: Exploring Simple Siamese Representation Learning(2020/11)
* アーキテクチャの変更で対処しました。
* Negative Sampleが要りません。
* Exponential Moving Averageが要りません。
* ウェイトは2つパスで共通にして、片方にpredictor（MLPのヘッド）を追加して対称性を崩しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/c4f02fb9-4008-b4cf-35c3-f68a29a170f8.png)

* と思いきや、反対側につけたものも計算して平均しています。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/9cb00832-2ac4-36cf-5b7f-a2bc5968f71c.png)

とはいえ、だいぶシンプルな方法になってきました。

https://arxiv.org/abs/2011.10566

https://qiita.com/T-STAR/items/c3ba462c64823d40fcca

https://www.guruguru.science/competitions/17/discussions/a39d588e-aff2-4728-8323-b07f15563552/


# 5.Barlow Twins: Self-Supervised Learning via Redundancy Reduction(2021/03)

このあたりからはこちらの動画のキャプチャが多いです。

https://youtu.be/8L10w1KoOU8?t=3507

## 5-1.特徴
* SimCLRに近いLossを工夫するアプローチです。
* だけどNegative Sampleが要りません。
* アーキテクチャを変更しません。
* Exponential Moving Averageが要りません。

## 5-2.方法

* 方針

本物の神経がとっている戦略をニューラルネットワークに真似させます。
つまり、Barlowが唱える説のように特徴量（ニューロン）に対して冗長性の削減を要求します。

①data augmentation に対して不変（augumentationをかけても同じ成分同士の相関が１）
これくらい変化をしても区別して表現せず、犬は犬だと思いなさいということ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/ba36268c-c0de-7db2-7b87-fa8f096222ef.png)

②それぞれの特徴量は独立（別の成分同士の相関が0）
二つ以上の成分で同じことを表現するのは無駄なのでやってはいけません。

* 図解と定式化したのがこちらです。$i$は特徴量ベクトルの成分、$b$はバッチ方向の成分を表します。
  $C_{ii}$の各成分が特徴量の各成分同士の相関を表します。
  あと、計算を簡単にするために平均0の分布にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/92f25a6d-3a45-105d-8d6f-6bf3c4ec791c.png)

* 疑似コードに次元を書いてくれているのでわかりやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/d2c82876-0a67-247f-4bbd-d3ba76aed2c2.png)

* ネットワークはこれ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/c9d194f9-6528-13ce-1b37-e62e20b509b4.png)


* 非対角項が多いので素直にやるとベクトルの全成分がゼロに向かう。ラムダで調整している。
ユーリさんはこんな感じで書いている。
実際には、探索で決めています。特徴量ベクトルの次元の逆数に対して非対角成分は結構大きめです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/d582a4ae-d633-58f4-2f2a-9abf2e04deb6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/8e4af852-b396-84f0-47ba-1a92eb95c208.png)

 
## 5-3.結果

* 転移学習でSOTAに並ぶ性能です。
    - imagenetの1%、10%の画像で(ラベルありの)finetune
    - バックボーンを固定して線形分離機だけ学習
    - 細かい学習の条件は論文の付録C

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/71e4d8e0-2a9c-8820-e537-104c91cbda26.png)

* 物体検出の転移学習に使うなら、supervisedを使うより良いみたいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/2a7609d8-7f83-cfe7-f788-a2cfcc8faed0.png)


* バッチサイズが小さくてもいいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/79bb82e2-b95e-10c4-b8ca-b1122d7cbb79.png)

* augmentationを減らすと性能が低下していきます。同一だとみなすaugmentationの選択に素直に反応していると言っていました。確かにこのほうが扱いやすいかもしれませんね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/8f5b1e4e-05e9-9a97-b6ad-904c29b457e8.png)

* 「学習するときの」ベクトルの成分の大きさに依存します。冗長性を削減するはずだったのでは？これはユーリさんにとっても意外だったようで、逆になると思っていたと言っていました。評価するときは2024成分の層を使っているので後ろの層の成分の数が影響するのもまた不思議ですが、特に考察は見つけられませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/10f4720a-8cec-c393-fb39-278ee622ae14.png)

* 評価するときの2024というのは、resnet50をbackboneとして使うときの成分の数ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/5f76abb9-cc3e-4f3f-fdbc-09417f80de42.png)


## 5-3. Information Bottleneck Principle との関係
T.B.D.
少しずつ追記中です。

情報ボトルネックについてはこれらが分かりやすかったです。


> 現実には歪み関数d として適切なものが何であるのか判断するのが難しい状況がある。
> 代わりに、「ある別の変数Yに関する情報を最大限保ちつつなるべく小さな空間にエンコードする」という問題を考えるというのがinformation bottleneckの発想である。

https://ktrmnm.github.io/blog/2020/03/22/20200322-information-bottleneck/

https://ai-scholar.tech/articles/treatise/entropy-penalty



# まとめ

- Lossの変更だけ（アーキテクチャを触らず）で使えるのに、バッチサイズは小さくていい。
- Lossだけ変えるのにNegative Sampleのことを考えなくていい。
- こんなに気軽なのにSOTAと並ぶ性能。

# 参考

arXiv 

https://arxiv.org/abs/2103.03230

arXiv Vanity (Vanityはweb表示なので翻訳が簡単😁)

https://www.arxiv-vanity.com/papers/2103.03230/

github(公式) 

https://github.com/facebookresearch/barlowtwins

第一著者本人が解説する動画！Jureはユーリと読むらしいです。

https://www.youtube.com/watch?v=H1q9RC5SI4I

共著者のtwitter。背景やモチベーションはこの一連のポストが一番まとまっているかも。

https://twitter.com/stephanedeny/status/1368886834420457472

共著者による解説動画。グラフについているコメントがいちいち分かりやすい。

https://www.youtube.com/watch?v=8L10w1KoOU8&t=229s

日本語解説記事。

https://ai-scholar.tech/articles/self-supervised-learning/barlow_twins






https://www.youtube.com/watch?v=EXJmodhu4_4