Few-Shot Learning Basic Concepts

Youtube で見つけたFew-Shot Learningの解説動画の聴講メモ。

# [Basic Concepts of Few-Shot Learning](https://www.youtube.com/watch?v=hE7eGew4eeg&t=162s)
- Few-Shot Learningの定義 : 少ないサンプル数で分類や回帰をするもの
- Few-Shot Learningの目的 : 物体の同質性や相違性を学ぶこと
    - 教師あり学習のような、学習データを記憶することとは異なる
- データ
    - Training Set : 学習データ / 量が多い / DNNを学習する
    - Support Set : ラベル付きの少数のサンプル / DNNの学習は不可
    - Query Image : 評価用データ 
- メタ学習とFew-Shot Learning
    - メタ学習 : Learn to Learn(学習することを学ぶこと)
        - ex) 初めてカワウソを見た子供に、いろんな動物の画像を含んだSupport Setを見せて、カワウソがどれかを言い当てさせる
        - Support Setの画像が各動物一枚ずつ＝One shot Learning
- 教師あり学習 VS Few-Shot Learning
    - 教師あり学習
        - 評価データはモデルにとって未知のデータ
        - 評価データはモデルにとって既知のクラスに属している
    - Few-Shot Learning
        - 評価データはモデルにとって未知のデータ
        - 評価データはモデルにとって未知のクラス
- k-way n-shot Support set
    - k-way : Support Setのクラス数
        - way数が多いほど、モデルにとって難しい問題となる
    - n-shot : Support Setのクラスごとのサンプル数
        - shot数が多いほど、モデルにとって簡単な問題となる
- メカニズム
    - 1. Similarity 関数(画像ペアの類似度を測る関数)をTraining Setで学習する
    - 2. 1.で作成した関数でQuery Imageと各Support Setを比較し、もっとも類似度が高い画像を探す
![スクリーンショット 2021-03-24 17.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/d1126451-7607-82b4-0b7f-8a33fad85b2a.png)

- よく使われるデータセット
    - Omniglot
        - 50のアルファベットについて、手書き文字画像20サンプルずつ存在
![スクリーンショット 2021-03-26 12.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/045b519a-2ce1-3056-e5de-33678a30ff57.png)
![スクリーンショット 2021-03-24 17.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/a8ff2e83-964e-50fe-3604-f90378b70127.png)

    - Mini-Imagenet
        - 100クラスの物体について、それぞれ600サンプルずつ存在
        
![スクリーンショット 2021-03-26 12.22.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/b7d70fae-dd98-6cf6-3b36-e6ba07b7f469.png)


# [Siamese Network](https://www.youtube.com/watch?v=4S-XDefSjTM)
- 手法１ : Learning Pairwise Similarity Scores
    - Training Set
        - Positive Samples
            - どの画像ペアが同じクラスかを学習させる
        - Negative Samples
            - どの画像ペアが異なるクラスかを学習させる
        - Positive SamplesとNegative Samplesは同数となる
![スクリーンショット 2021-03-24 17.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/16a91281-f462-6830-0dee-a2baae9cce73.png)
    - モデル
![スクリーンショット 2021-03-24 18.00.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/0210de60-ee21-f4d9-524d-ecc6b4b14589.png)
    - 順伝播
        - 以下はPositive samplesの例
        - Negative Samplesの場合はTargetが0となる
        - Lossはクロスエントロピーなどで算出
![スクリーンショット 2021-03-24 18.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/c4bba6a6-e607-a4f1-9af4-648895c71458.png)

    - 逆伝播
![スクリーンショット 2021-03-24 18.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/ae503f90-ef55-4e6f-2803-c930de1fe84b.png)

    - 評価時
![スクリーンショット 2021-03-24 18.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/fceee971-32f1-5102-dacc-9c4c912bd324.png)

- 手法2 : Triplet Loss
    - Training Setの取得方法
        - Anchor / Postive / Negativeを選択する
        - AnchorとPostiveは同クラス、Negativeは左記らと異なるクラス
![スクリーンショット 2021-03-24 18.12.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/2359a121-2eab-c94a-d828-4751784f1839.png)
    - Lossのイメージ
        - d+は小さくなることが期待される
        - d-は大きくなることが期待される
![スクリーンショット 2021-03-24 18.15.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/3d37d280-ffdc-5428-4460-f6e8913a6567.png)

    - 潜在空間でのLossのイメージ
![スクリーンショット 2021-03-24 18.17.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/afbc57b9-3917-d5b6-18cf-3290dfc019cf.png)

    - マージンの設定
![スクリーンショット 2021-03-24 18.19.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/61f9c86c-f8ef-528a-8fec-0866435b18e9.png)

    - Lossの算出方法
![スクリーンショット 2021-03-24 18.20.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/18020ee4-cbad-4f02-7964-1f79fa9b0531.png)
    
    -　評価時
![スクリーンショット 2021-03-25 11.20.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/1f57cf89-8137-189e-4e4d-4b1556819377.png)

- 要約
    - 学習はSiamese networkをふ大規模なtraining setを用いて行う
        - Siamese networkは対象物の類似性や相違性を学習する
    - Support setを与える
        - k-way は k classであることを指す
        - n-shotは各クラスがnサンプルあることを指す
        - training setはk classを含まない

# [Pretraining and Fine Tuning](https://www.youtube.com/watch?v=U6uFOIURcD0&t=6s)
- 予備知識
    - コサイン類似度
        - 二つのベクトルの類似度の計算方法
        - 二つのベクトルの内積を、それぞれのベクトルのノルムを乗算したもので除算する
            - しかし、ノルムは１なので実質的にコサイン類似度は内積
        - コサイン類似度は以下の図xの正射影とも理解できる(ノルムが1であることに注意)
        - もしノルムが1でない場合は、正規化する
![スクリーンショット 2021-03-25 11.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/c216ae12-ffa4-5996-b2dd-4989a8453a39.png)
![スクリーンショット 2021-03-25 11.44.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/2e4ea679-b2b7-b79c-34fb-113c5f56ef3b.png)

    - Softmax関数
        -  ベクトルを確率分布に変換する関数
        -  もっとも大きい入力を相対的により大きく、小さい入力を相対的により小さく変換する
![スクリーンショット 2021-03-25 17.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/ccb1c2b8-9e13-9404-f968-ac05f67b0e5c.png)
![スクリーンショット 2021-03-25 17.27.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/1b2a8110-b422-aa1e-4986-833a65bccc9e.png)

- 事前学習
    - 事前学習時の学習方法については、以下がある。
        - 一般的な教師あり学習
        - Siamese Networkを用いた学習
![スクリーンショット 2021-03-25 17.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/cb42d605-8635-8aae-4f58-2dda347a49ac.png)

    - 評価方法
        - 以下の3-way 2-shotの例では以下を行う
            - 事前学習した特徴抽出器で画像からベクトルを生成
            - クラスごとに平均
            - 正規化
![スクリーンショット 2021-03-25 17.41.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/1ebbc763-de79-5c4e-1080-5cd53f3d352c.png)
![スクリーンショット 2021-03-25 17.44.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/40d31ad9-e4c9-fef0-00b4-337f283152c2.png)

![スクリーンショット 2021-03-25 17.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/3b58d3dd-652f-e195-49d5-054a757dd69c.png)

![スクリーンショット 2021-03-26 11.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/7a171e5c-8e73-3670-bbaa-b24780a7c087.png)


- 転移学習
    - 5way 1shotで2~7%の改善が見られた
    - 5way 5shotで1.5~4%の改善が見られた

![スクリーンショット 2021-03-26 11.43.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/13344a23-1dde-0c4d-e667-2dc4320d9c1d.png)

![スクリーンショット 2021-03-26 11.50.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/2b25fa82-220f-5608-8729-17a2e8536f68.png)

![スクリーンショット 2021-03-26 11.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/f6bfee42-7807-d655-5403-d2850aa24234.png)

![スクリーンショット 2021-03-26 11.54.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/d7eff917-d02a-f92e-2adb-4deb2e8775ca.png)
![スクリーンショット 2021-03-26 11.55.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025945/ef64d075-106b-27c9-d035-0c2c70e25986.png)



- 要約
    - 事前学習したCNNでのFew-Shot評価は以下の工程で行える。
        - Step1(事前学習)
            - CNNを大規模なtraining dataで学習する
        - Step2(評価)
            - Support Setの画像を特徴ベクトルへと変換する
            - 各クラスの平均特徴ベクトルを作成し、それぞれを行ベクトルとする行列Mを作成
            - Queryと行列Mの積にバイアス項を加え、Softmaxを適用する
    - 転移学習をする場合, 
        - Step1(事前学習)
            - CNNを大規模なtraining dataで学習する
        - Step1-dash(転移学習)
            - Support Setで学習する
        - Step2(評価)
            - Support Setの画像を特徴ベクトルへと変換する
            - 各クラスの平均特徴ベクトルを作成する、それぞれを行ベクトルとする行列Mを作成
            - Queryと行列Mの各行とのコサイン類似度を計算し、Softmaxを適用する