close

深度學習需要解決一個高維且非凸優化之問題,解決這些問題的難點在於,他可能具有多個好的解(local minimum),導致學習演算法(神經網路/loss)難以收斂到一個全域最佳值(global minimum)

這種問題在隨機優化領域(stochastic optimization)中,被稱為優化演算法的收斂問題(problems with the convergence of the optimization algorithm on a solution),而需要被收斂的解,在演算法中為一組權重(weight values),深度學習也屬於隨機優化領域,因此也面臨此問題,其權重通常以.h5檔案格式儲存

觀察神經網路訓練時每一個 epoch 的 loss,若不斷震盪,且平均來說不下降,則表示無法收斂 

而解決此問題的方式有可以透過調參或等等,但這次,討論的是在不更動參數以及網路結構的情況下,如何利用已產生的權重檔,來達到較佳的 test 結果

方法是,在訓練過程即將結束時合併所收集的權重,通常這可以稱為時間平均(temporal averaging),或以發明此方法的人 Polyak-Ruppert 命名,稱為 Polyak Averaging

''Polyak averaging consists of averaging together several points in the trajectory through parameter space visited by an optimization algorithm.''

''Polyak平均包括將軌跡中通過優化算法訪問的參數空間中的幾個點平均在一起'

雖然此方式聽起來很暴力破解,但對於需要訓練很久的神經網路,可能為一個簡單的解決方式,可以平滑各個權重檔中的噪音點

可以為權重檔的平均進行加權,將越後面epoch訓練出來的weight結果配以較大的比例,通常來說,會將時間越遠的權重加權值呈指數衰減

 

實作:

套件: keras

1. 首先正常訓練,獲得一堆權重檔

2. 將權重檔用 load_model() 讀出來,append 進一個 list => 得到個權重值得list (一維是不同epoch權重,二維是權重值)

3. 得到一個網路結構層數 n_layers = len(members[0].get_weights()) ,才知道有幾層要做平均

 

參考:

How to Calculate an Ensemble of Neural Network Model Weights in Keras (Polyak Averaging)

https://machinelearningmastery.com/polyak-neural-network-model-weight-ensemble/

loss不下降時調參或更改網路結構等方法

https://blog.ailemon.me/2019/02/26/solution-to-loss-doesnt-drop-in-nn-train/

arrow
arrow
    文章標籤
    Ensemble Weight Model Average
    全站熱搜

    KR 發表在 痞客邦 留言(0) 人氣()