優(yōu)化算法 Caffe中的SGD的變種優(yōu)化算法(2) 接上回,,我們繼續(xù)來看優(yōu)化的算法。 Adam 關(guān)于adam的算法,,我覺得它的復雜程度比前面的算法更高,,但是它還是主要使用了和計算動量相同的方法,,并把這種方法應(yīng)用到梯度的一階總量和二階總量上: 它的代碼如下所示: def adam(x_start, step, g, beta1 = 0.9, beta2 = 0.999,delta=1e-8): x = np.array(x_start, dtype='float64') sum_m = np.zeros_like(x) sum_v = np.zeros_like(x) passing_dot = [x.copy()] for i in range(50): grad = g(x) sum_m = beta1 * sum_m + (1 - beta1) * grad sum_v = beta2 * sum_v + (1 - beta2) * grad * grad correction = np.sqrt(1 - beta2 ** i) / (1 - beta1 ** i) x -= step * correction * sum_m / (np.sqrt(sum_v) + delta) passing_dot.append(x.copy()) if abs(sum(grad)) < 1e-6: break; return x, passing_dot 前面也說過,實際上這些算法背后都有些原理的,,但是這些原理在我們看來可能都比較抽象,,所以再我們看完實驗再看原理可能會更有感覺。下面我們看看它的表現(xiàn): res, x_arr = adam([5, 5], 0.1, g) contour(X,Y,Z, x_arr) 好吧,,這一回它是唯一一個走得有點過頭的算法,,不過最后還是走上了正道。 這樣除了Nesterov算法之外,,我們把其他所有的算法都展示出來了,。前面這個實驗中,,我們希望檢驗算法的“拐彎”能力。也就是說一開始算法沖著一個局部最優(yōu)點而來,什么時候它會發(fā)現(xiàn)這是個騙局并掉頭朝向真正的最優(yōu)值呢,?現(xiàn)在每一個算法都給我們交出了答案。仔細看來每個算法的表示還是不太一樣的,。有的算法比較靈敏,,剛發(fā)現(xiàn)不對就調(diào)頭逃跑,有的算法則是沖過了頭才轉(zhuǎn)過身來,。有的算法做到這一切十分容易,,并不需要很大的Learning rate,有的算法則需要強大的力量才能轉(zhuǎn)過來,,否則就會行動緩慢。 好了,,各位童鞋,,轉(zhuǎn)彎賽到此結(jié)束,下面我們進入下一個比賽——爬坡賽,。爬坡賽的比賽規(guī)則是,,所有算法使用同樣的參數(shù),從鞍點附近出發(fā),,經(jīng)過50輪迭代,,看看它能走到哪里。 爬坡賽 首先是我們的老朋友梯度下降法: res, x_arr = gd([-0.23,0.0], 0.0008, g) contour(X,Y,Z, x_arr) 我們的老朋友在爬坡賽看來是要叫白卷了,,說明它雖然很輕盈,,但是動力不是很足啊。 下面是動量算法: res, x_arr = momentum([-0.23,0], 5e-4, g) contour(X,Y,Z, x_arr) 比梯度下降好一點,,但是好的有限,。 然后是Adagrad: res, x_arr = adagrad([-0.23, 0], 1.3, g) contour(X,Y,Z, x_arr) 好吧,表現(xiàn)得比轉(zhuǎn)彎賽還好,,省去夸贊的詞語了,。 下面是Rmsprop: res, x_arr = rmsprop([-0.23, 0], 0.3, g) contour(X,Y,Z, x_arr) 同樣完成的不錯! 下面我們再看AdaDelta: res, x_arr = adadelta([-0.23, 0], 0.4, g) contour(X,Y,Z, x_arr) 好吧,,直接一騎絕塵而去了,。 最后是我們今天登場的Adam: res, x_arr = adam([-0.23, 0], 0.1, g) contour(X,Y,Z, x_arr) 同樣是跑出了我們原始規(guī)劃的區(qū)域。 總結(jié) 經(jīng)過兩輪的比賽——轉(zhuǎn)彎賽和爬坡賽,,我們測試了幾種算法在同一配置上的實力,。測試的目標不是為了比較哪個算法更厲害,而是展示另外一個實力——哪個算法表現(xiàn)更穩(wěn)定,。 因為我們在實際使用過程中,,learning rate是相對固定的,在優(yōu)化過程中我們無法預料自己將會碰上什么樣的情景,,那么我們肯定希望一個算法又能轉(zhuǎn)彎又能爬坡,。如果一個算法轉(zhuǎn)彎厲害但是爬坡比較弱,那一旦遇上爬坡它就會走得很慢,,反之也是如此,。 所以從剛才的表現(xiàn)來看,我們的新算法似乎表現(xiàn)更為平穩(wěn),,現(xiàn)在也確實有越來越多的人拋棄了一些經(jīng)典的算法,,轉(zhuǎn)而投入這些新算法的懷抱,而這些新算法也足夠爭氣,,拿出了它們的實力,。關(guān)于算法性能的測試一直在進行,這些算法還需要經(jīng)歷更多的考驗,! |
|