【筆記】關於N-Way K-Shot 分類問題的理解

  • 2019 年 10 月 27 日
  • 筆記
  • Time: 2019年10月27日
  • Author:Veagau

在看講Repitle的論文【On First-Order Meta-Learning Algorithm】時,實驗環節對N-Way K-Shot分類問題的SetUp進行的描述引起了我的二度思考,以前對這個問題的理解感覺沒摸透,以此為契機,重新思考得出了一種理解。

所謂N-Way K-Shot 分類問題就是指用少量樣本構建分類任務的。主要應用於少樣本學習(Few-Shot Learning)領域,樣本數據不足的情況,後來逐漸延伸到元學習(Meta-Learning)領域。

元學習需要通過在大量的任務上進行學習,學習到泛化能力強大的模型演算法,以快速適應新的任務,即學會學習

因為元學習是以一個個的任務(如分類任務)作為自己的訓練數據的,傳統的基於大量數據的訓練任務顯然不適用於目前的研究(算力約束)。

從字面上理解,N-Way就是N-路或N-類K-Shot就是K-次或K-個

每次在構建分類任務時,從數據集里抽取N-類的數據,每一類數據由K-個樣本構成。這樣就形成了一個小型分類任務的數據集,實際上就是原始數據集的一次取樣。

那這個小型分類任務的訓練集和測試集具體是怎麼劃分的呢?

其實這個問題也是困擾我很久的,看了幾篇文獻都沒明白。訓練過程中用的是什麼數據?測試過程中呢?直到我看到這篇論文中的描述:

If we are doing K-shot, N-way classi cation, then we sample tasks by selecting N classes from C and then selecting K + 1 examples for each class. We split these examples into a training set and a test set, where the test set contains a single example for each class.

其中關鍵的一點就是,在取數據時對於N類數據,每一類其實取了K+1個樣本,而不是K個!

然後就是這個+1引出了我的理解。

以5-Way 5-Shot分類問題為例,在構建一個任務的數據集時的具體流程應該如下:

  1. 從元數據集(Meta-dataset)中隨機抽取5類(Way)樣本,每一類樣本隨機抽取5+1個(Shot)實例

    元數據集:也就是整體數據集中,可以理解為傳統的大型數據集,其中的數據類別>>N-Way,每一類的實例數量>>K-Shot.

  2. 從這5類樣本的6個實例中,每類樣本隨機抽取5個實例一起作為Training Set(→Support Set),每一類剩下的一個實例一起組成Testing Set(→Query Set)。

    由於元學習是以任務(Task)作為自己的訓練數據的,即元學習的實際訓練集和測試集是由一個個的Task組成的,所以為了進行區分,每個任務內部的訓練集(Training Set)更名為支援集(Support Set)、測試集更名為查詢集(Query Set)

  3. 訓練:從Support Set中每一類隨機選取一個實例,一起夠成一組訓練數據,輸入到模型中,進行訓練。

  4. 測試:從Query Set中隨機抽取一個實例,用模型判斷其屬於哪一類。

    這個判斷過程其實可以視為一種查詢過程,給定了支援集,只要讓模型能夠準確的查詢到其屬於支援集中的哪一類即可證明模型性能較好。

  5. 重複幾輪,最終得出該任務模型的準確率,實際上即是元學習參數確定的模型在該任務上的損失

  6. 損失梯度反向傳播到元學習參數,對其進行更新,也即元學習過程。

圖示如下:

Way 1
(C1)
Way 2
(C2)
Way3
(C3)
Way 4
(C4)
Way5
(C5)
C~11~ C~21~ C~31~ C~41~ C~51~ Support
C~12~ C~22~ C~32~ C~42~ C~52~ Support
C~13~ C~23~ C~33~ C~43~ C~53~ Support
C~14~ C~24~ C~34~ C~44~ C~54~ Support
C~15~ C~25~ C~35~ C~45~ C~55~ Support
C~16~ C~26~ C~36~ C~46~ C~56~ Query