關於MAML的那些事

2021-10-07 08:41:54 字數 1673 閱讀 9867

多餘的元學習廢話也不多說,直接上乾貨:

演算法:

關於學習率:

兩個學習率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肯定是沒法比的。

關於開始的那些事

人總是有惰性的,當然我自己深有體會。一直有個想法想寫寫自己的blog,但隨時間的推移,很久都沒付出行動。最近工作專案開始不那麼忙了,維護乙份自己的blog的想法愈發強烈了。想把自己的一些想法,或者看到的一些有用的東西給大家分享,也給自己留下成長的痕跡。我從小喜歡看書,各種各樣的書屬於不求甚解的狀態。...

關於coredump的那些事

今天在網上搜了一些有關coredump的知識,簡單記一下,以防忘記 core dump檔名的模式儲存在 proc sys kernel core pattern中,預設是core 主要是今天比較鬱悶,要除錯程式crash,就用ulimit c unlimited設定了一下core檔案的大小,但是測試...

關於STL 的那些事

今晚參加訓練。樹狀陣列的練習,傻乎乎的用stl做了一晚,雖然題沒做出來,不過對stl的查詢有了更深一層的理解。關於stl。輸入輸出 vector push back pop back stack push pop queue push pop 頭 front 尾 back priority queu...