多餘的元學習廢話也不多說,直接上乾貨:
算法:
關於學習率:
兩個學習率a、b,要知道,爲了一步優化探測task最優參數的位置(inner loop),我們必須使用稍微大點的學習率a,這叫一步到位。
而優化你真正模型參數的學習率應該是很小的(outer loop),因爲他必須在參數空間中經過漫長的迭代,慢慢找到最合適的位置。
關於損失函數:分類交叉熵,迴歸MSE
關於1階和2階的MAML:
首先,Nway K shot ,support set 和query set的知識就不介紹了。
看這個圖,訓練的過程中,在每一個task中(上面算法中的4-6),我們在support set 上由g1得到θm,在query set 上由θm得到loss,如果一個meta_batch(內循環)裏面有多個task,我們是需要將這些task的loss求和,然後在外循環中更新模型參數(就是上面算法的第8步),此時φ0變爲了φ1,然後一步一步走外循環的迭代。這是正向。
那求梯度呢?L1’(φ1) =L1’(φ0) * (φ1/φ0)’ ,這個兩個導數相乘的就是2-order,而近似以後的L1’(φ0)就是1-order.
作者通過理論推導,證明了兩種方法理論差距不是很大,但是1-order會快很多。
關於算法理解:
一、 爲什麼我們要在訓練集上更新一次參數,然後測試集的損失值傳回外循環,進行下一步的更新?
1.如果只在訓練集上更新損失值,那麼無法合理利用測試集,相當於pretraining預訓練。如果此時你直接反傳,繼續優化,你的model參數就沿着這個專一的任務越走越遠了。
2.訓練集數量較少,用於傳損失值不具有參考性。(N way K shot 只約束了訓練集的數量,並沒有約束測試集的數量,按理說測試集的數量增加,對模型的性能會越好。)
3.在訓練集上更新參數,其實是可以更新很多次的,但是爲了簡化運算量,因此我們只更新了一次。我們在訓練集上更新一次參數,然後將測試集上的損失值傳回,是因爲我們要找的並不是使當前模型最優的參數,而是在進行梯度更新以後能夠收斂到最優損失值的參數。即算法要根據訓練集產生一個可以很好適應測試集的agent,這樣經過多個任務的訓練之後也就學會了快速學習的方法。
MAML的優點:
可用於小樣本學習,快速適應
可以用於迴歸、分類和增強學習多種任務上。
MAML的缺點:
1.模型結構是固定的,在算法中,模型的圖像輸入尺寸也是一定的,因此泛化性不好。
2.任務可以不同,但是需要有一定的相關性
3.二次梯度可能不穩定
4. Robustness一般:不是說MAML的robustness不好,因爲也是由一階online的優化方法SGD求解出來的,會相對找到一個flatten minima location。然而這和非gradient-based meta learning方法求解出來的model的robust肯定是沒法比的。