導航:首頁 > 源碼編譯 > 多變數優化演算法

多變數優化演算法

發布時間:2023-01-31 04:08:47

1. 常用優化器演算法歸納介紹

優化器是神經網路訓練過程中,進行梯度下降以尋找最優解的優化方法。不同方法通過不同方式(如附加動量項,學習率自適應變化等)側重於解決不同的問題,但最終大都是為了加快訓練速度。

這里就介紹幾種常見的優化器,包括其原理、數學公式、核心思想及其性能;

核心思想: 即針對每次輸入的訓練數據,計算輸出預測與真值的Loss的梯度;

從表達式來看,網路中參數的更新,是不斷向著最小化Loss函數的方向移動的:

優點:
簡單易懂,即對於相應的最優解(這里認為是Loss的最小函數),每次變數更新都是沿著局部梯度下降最快的方向,從而最小化損失函數。

缺點:

不同於標准梯度下降法(Gradient Descent)一次計算所有數據樣本的Loss並計算相應的梯度,批量梯度下降法(BGD, Batch Gradient Descent)每次只取一個小批次的數據及其真實標簽進行訓練,稱這個批次為mini-batch;

優點:

缺點:
隨機梯度下降法的 batch size 選擇不當可能導致模型難以收斂;由於這種方法是在一次更新中,就對整個數據集計算梯度,所以計算起來非常慢,遇到很大量的數據集也會非常棘手,而且不能投入新數據實時更新模型。

我們會事先定義一個迭代次數 epoch,首先計算梯度向量 params_grad,然後沿著梯度的方向更新參數 params,learning rate 決定了我們每一步邁多大。

Batch gradient descent 對於凸函數可以收斂到全局極小值,對於非凸函數可以收斂到局部極小值。

和 BGD 的一次用所有數據計算梯度相比,SGD 每次更新時對每個樣本進行梯度更新,對於很大的數據集來說,可能會有相似的樣本,這樣 BGD 在計算梯度時會出現冗餘,而 SGD 一次只進行一次更新,就沒有冗餘,而且比較快,並且可以新增樣本。

即訓練時,每次只從一批訓練樣本中隨機選取一個樣本進行梯度下降;對隨機梯度下降來說,只需要一次關注一個訓練樣本,一點點把參數朝著全局最小值的方向進行修改了。

整體數據集是個循環,其中對每個樣本進行一次參數更新

缺點:

梯度下降速度比較慢,而且每次梯度更新時往往只專注與局部最優點,而不會恰好指向全局最優點;

單樣本梯度更新時會引入許多雜訊(跟訓練目標無關的特徵也會被歸為該樣本分類的特徵);

SGD 因為更新比較頻繁,會造成 cost function 有嚴重的震盪。

BGD 可以收斂到局部極小值,當然 SGD 的震盪可能會跳到更好的局部極小值處。

當我們稍微減小 learning rate,SGD 和 BGD 的收斂性是一樣的。

優點:

當處理大量數據時,比如SSD或者faster-rcnn等目標檢測模型,每個樣本都有大量候選框參與訓練,這時使用隨機梯度下降法能夠加快梯度的計算。

隨機梯度下降是通過每個樣本來迭代更新一次,如果樣本量很大的情況,那麼可能只用其中部分的樣本,就已經將 迭代到最優解了,對比上面的批量梯度下降,迭代一次需要用到十幾萬訓練樣本,一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。缺點是SGD的噪音較BGD要多,使得SGD並不是每次迭代都向著整體最優化方向。所以雖然訓練速度快,但是准確度下降,並不是全局最優。雖然包含一定的隨機性,但是從期望上來看,它是等於正確的導數的。

梯度更新規則:

MBGD 每一次利用一小批樣本,即 n 個樣本進行計算,這樣它可以降低參數更新時的方差,收斂更穩定,另一方面可以充分地利用深度學習庫中高度優化的矩陣操作來進行更有效的梯度計算。

和 SGD 的區別是每一次循環不是作用於每個樣本,而是具有 n 個樣本的批次。

超參數設定值: n 一般取值在 50~256

缺點:(兩大缺點)

鞍點就是:一個光滑函數的鞍點鄰域的曲線,曲面,或超曲面,都位於這點的切線的不同邊。例如這個二維圖形,像個馬鞍:在x-軸方嚮往上曲,在y-軸方嚮往下曲,鞍點就是(0,0)。

為了應對上面的兩點挑戰就有了下面這些演算法

核心思想:

不使用動量優化時,每次訓練的梯度下降方向,都是按照當前批次訓練數據計算的,可能並不能代表整個數據集,並且會有許多雜訊,下降曲線波動較大:

添加動量項之後,能夠有效減小波動,從而加快訓練速度:

當我們將一個小球從山上滾下來時,沒有阻力的話,它的動量會越來越大,但是如果遇到了阻力,速度就會變小。
加入的這一項,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂並減小震盪。

優點:

通過動量更新,參數向量會在有持續梯度的方向上增加速度;
使梯度下降時的折返情況減輕,從而加快訓練速度;

缺點:

如果數據集分類復雜,會導致 和 時刻梯度 向量方向相差較大;在進行向量求和時,得到的 會非常小,反而使訓練速度大大下降甚至模型難以收斂。

這種情況相當於小球從山上滾下來時是在盲目地沿著坡滾,如果它能具備一些先知,例如快要上坡時,就知道需要減速了的話,適應性會更好。

目前為止,我們可以做到,在更新梯度時順應 loss function 的梯度來調整速度,並且對 SGD 進行加速。

核心思想:

自適應學習率優化演算法針對於機器學習模型的學習率,採用不同的策略來調整訓練過程中的學習率,從而大大提高訓練速度。

這個演算法就可以對低頻的參數做較大的更新,對高頻的做較小的更新,也因此,對於稀疏的數據它的表現很好,很好地提高了 SGD 的魯棒性,例如識別 Youtube 視頻裡面的貓,訓練 GloVe word embeddings,因為它們都是需要在低頻的特徵上有更大的更新。

Adagrad 的優點是減少了學習率的手動調節

式中, 表示第 個分類, 表示第 迭代同時也表示分類 累計出現的次數。 表示初始的學習率取值(一般為0.01)

AdaGrad的核心思想: 縮放每個參數反比於其所有梯度歷史平均值總和的平方根。具有代價函數最大梯度的參數相應地有較大的學習率,而具有小梯度的參數又較小的學習率。

缺點:

它的缺點是分母會不斷積累,這樣學習率就會收縮並最終會變得非常小。

這個演算法是對 Adagrad 的改進,

和 Adagrad 相比,就是分母的 換成了過去的梯度平方的衰減平均值,指數衰減平均值

這個分母相當於梯度的均方根 root mean squared (RMS),在數據統計分析中,將所有值平方求和,求其均值,再開平方,就得到均方根值 ,所以可以用 RMS 簡寫:

其中 的計算公式如下, 時刻的依賴於前一時刻的平均和當前的梯度:

梯度更新規則:

此外,還將學習率 換成了 RMS[Δθ],這樣的話,我們甚至都不需要提前設定學習率了:

超參數設定值: 一般設定為 0.9

RMSprop 是 Geoff Hinton 提出的一種自適應學習率方法。

RMSprop 和 Adadelta 都是為了解決 Adagrad 學習率急劇下降問題的,

梯度更新規則:

RMSprop 與 Adadelta 的第一種形式相同:(使用的是指數加權平均,旨在消除梯度下降中的擺動,與Momentum的效果一樣,某一維度的導數比較大,則指數加權平均就大,某一維度的導數比較小,則其指數加權平均就小,這樣就保證了各維度導數都在一個量級,進而減少了擺動。允許使用一個更大的學習率η)

超參數設定值:

Hinton 建議設定 為 0.9, 學習率 為 0.001。

這個演算法是另一種計算每個參數的自適應學習率的方法。相當於 RMSprop + Momentum

除了像 Adadelta 和 RMSprop 一樣存儲了過去梯度的平方 vt 的指數衰減平均值 ,也像 momentum 一樣保持了過去梯度 mt 的指數衰減平均值:

如果 和 被初始化為 0 向量,那它們就會向 0 偏置,所以做了偏差校正,通過計算偏差校正後的 和 來抵消這些偏差:

梯度更新規則:

超參數設定值:
建議

示例一

示例二

示例三

上面情況都可以看出,Adagrad, Adadelta, RMSprop 幾乎很快就找到了正確的方向並前進,收斂速度也相當快,而其它方法要麼很慢,要麼走了很多彎路才找到。

由圖可知自適應學習率方法即 Adagrad, Adadelta, RMSprop, Adam 在這種情景下會更合適而且收斂性更好。

如果數據是稀疏的,就用自適用方法,即 Adagrad, Adadelta, RMSprop, Adam。

RMSprop, Adadelta, Adam 在很多情況下的效果是相似的。

Adam 就是在 RMSprop 的基礎上加了 bias-correction 和 momentum,

隨著梯度變的稀疏,Adam 比 RMSprop 效果會好。

整體來講,Adam 是最好的選擇。

很多論文里都會用 SGD,沒有 momentum 等。SGD 雖然能達到極小值,但是比其它演算法用的時間長,而且可能會被困在鞍點。

如果需要更快的收斂,或者是訓練更深更復雜的神經網路,需要用一種自適應的演算法。

各種優化器Optimizer原理:從SGD到AdamOptimizer

深度學習——優化器演算法Optimizer詳解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

2. 想知道優化演算法是什麼

優化演算法是通過改善計算方式來最小化或最大化損失函數E(x)。模型內部有些參數是用來計算測試集中目標值Y的真實值和預測值的偏差程度的,基於這些參數就形成了損失函數E(x),比如說,權重(W)和偏差(b)就是這樣的內部參數,一般用於計算輸出值,在訓練神經網路模型時起到主要作用。

優化演算法分的分類

一階優化演算法是使用各參數的梯度值來最小化或最大化損失函數E(x),最常用的一階優化演算法是梯度下降。函數梯度導數dy/dx的多變數表達式,用來表示y相對於x的瞬時變化率。

二階優化演算法是使用了二階導數也叫做Hessian方法來最小化或最大化損失函數,由於二階導數的計算成本很高,所以這種方法並沒有廣泛使用。

3. 優化演算法有哪些

你好,優化演算法有很多,關鍵是針對不同的優化問題,例如可行解變數的取值(連續還是離散)、目標函數和約束條件的復雜程度(線性還是非線性)等,應用不同的演算法。
對於連續和線性等較簡單的問題,可以選擇一些經典演算法,例如梯度、Hessian
矩陣、拉格朗日乘數、單純形法、梯度下降法等;而對於更復雜的問題,則可考慮用一些智能優化演算法,例如你所提到的遺傳演算法和蟻群演算法,此外還包括模擬退火、禁忌搜索、粒子群演算法等。
這是我對優化演算法的初步認識,供你參考。有興趣的話,可以看一下維基網路。

4. 怎麼分析用於多目標優化演算法的目標變數之間是否有沖突

會說不可以用其他演算法了,遺傳演算法最精華就在於fitness,要是多目標優化也是把多個目標融合在一起 變成一個目標 然後再結合實際目標意義(越大越優,越小越...

5. matlab進行多變數二次多項式單目標優化

採用粒子群演算法,可得出優化最小值和最大值

優化最小值: 0.8806

6. 優化演算法是什麼

智能優化演算法是一種啟發式優化演算法,包括遺傳演算法、蟻群演算法、禁忌搜索演算法、模擬退火演算法、粒子群演算法等。·智能優化演算法一般是針對具體問題設計相關的演算法,理論要求弱,技術性強。一般,我們會把智能演算法與最優化演算法進行比較,相比之下,智能演算法速度快,應用性強。

群體智能優化演算法是一類基於概率的隨機搜索進化演算法,各個演算法之間存在結構、研究內容、計算方法等具有較大的相似性。

各個群體智能演算法之間最大不同在於演算法更新規則上,有基於模擬群居生物運動長更新的(如PSO,AFSA與SFLA),也有根據某種演算法機理設置更新規則(如ACO)。

(6)多變數優化演算法擴展閱讀:

優化演算法有很多,關鍵是針對不同的優化問題,例如可行解變數的取值(連續還是離散)、目標函數和約束條件的復雜程度(線性還是非線性)等,應用不同的演算法。 對於連續和線性等較簡單的問題,可以選擇一些經典演算法,例如梯度、Hessian 矩陣、拉格朗日乘數、單純形法、梯度下降法等;而對於更復雜的問題,則可考慮用一些智能優化演算法。

7. 多設計變數優化問題用什麼優化演算法好(除了遺傳演算法)

粒子群演算法,模擬退火演算法都還不錯哦

8. 如何用遺傳演算法實現多變數的最優化問題

是不是像求函數最值那樣子?建議你了解一下遺傳演算法的實數編碼,這個對於求函數最值很方便,不用像二進制那樣需要轉換。

簡單介紹一下思路:
最重要的是確定適應度函數,只要確定這個函數就很容易了,就用你不會編程,直接調用matlab的工具箱就行了。

1st.設置種群規模,並初始化種群p,並計算各個個體的適應度。
例如,20個個體,每個個體包含5個變數,x1,x2,x3,x4,x5.
如果你用matlab來編程的話,這個可以很容易實現,會用到random('unif',a,b)這個函數吧。
例如x1的取值范圍是[0,1],那麼x1=random('unif',0,1).

2nd.採用輪盤賭選出可以產生後代的父本,p_parents。
額,輪盤賭的實質就是適應度大的被選出的概率大。這個不難,但說起來比較長,你可以自己去看一下。

3rd.雜交過程的思路隨機將p_parents中的個體隨機兩兩配對,然後隨機產生一個1到n的數(n為變數的個數),設為i,交換每對父本中i之後的變數值。交換以後的p_parents成為後代p_offspring.
這里變起來有點點復雜,不過只要耐心一點,編好配對過程和交換過程。

4th.變異過程,這個比較簡單,不過需要自己把握的較好。
基本的思路是設置一個概率,例如0.05,然後產生一個隨機數如果隨機數比0.05小那麼這個變數值就要產生微小的增加或減少。
這個變異過程要歷遍p_offspring所有的變數喔。

5th.將p和p_offspring合並起來,然後選出適應度大的,重新構成一個如原始種群規模相等的種群。

9. 進化演算法的差分演算法

差分進化演算法(Differential Evolution, DE)是一種新興的進化計算技術,或稱為差分演化演算法、微分進化演算法、微分演化演算法、差異演化演算法。它是由Storn等人於1995年提出的,最初的設想是用於解決切比雪夫多項式問題,後來發現DE也是解決復雜優化問題的有效技術。DE與人工生命,特別是進化演算法有著極為特殊的聯系。
差分進化演算法是基於群體智能理論的優化演算法,通過群體內個體間的合作與競爭產生的群體智能指導優化搜索。但相比於進化演算法,DE保留了基於種群的全局搜索策略,採用實數編碼基於差分的簡單變異操作和一對一的競爭生存策略,降低了遺傳操作的復雜性。同時,DE特有的記憶能力使其可以動態跟蹤當前的搜索情況,以調整其搜索策略,具有較強的全局收斂能力和魯棒性,且不需要藉助問題的特徵信息,適於求解一些利用常規的數學規劃方法所無法求解的復雜環境中的優化問題。
差分進化演算法是一種基於群體進化的演算法,具有記憶個體最優解和種群內信息共享的特點,即通過種群內個體間的合作與競爭來實現對優化問題的求解,其本質是一種基於實數編碼的具有保優思想的貪婪遺傳演算法。
DE是一種用於優化問題的啟發式演算法。本質上說,它是一種基於實數編碼的具有保優思想的貪婪遺傳演算法 。同遺傳演算法一樣,DE包含變異和交叉操作,但同時相較於遺傳演算法的選擇操作,DE採用一對一的淘汰機制來更新種群。由於DE在連續域優化問題的優勢已獲得廣泛應用,並引發進化演算法研究領域的熱潮。
DE由Storn 以及Price提出,演算法的原理採用對個體進行方向擾動,以達到對個體的函數值進行下降的目的,同其他進化演算法一樣,DE不利用目標函數的梯度信息,因此對目標的可導性甚至連續性沒有要求,適用性很強。同時,演算法與粒子群優化有相通之處 ,但因為DE在一定程度上考慮了多變數間的相關性,因此相較於粒子群優化在變數耦合問題上有很大的優勢。演算法的實現參考實現代碼部分。

10. MATLAB基礎問題

命令fminunc().

單獨寫個.M文件,把約束條件寫進去,在約束區有個「Nonlinear constraint function」 @+"約束文件名"

例子:
求解如附件圖片所示的有約束非線規劃問題,分三個步驟
1.建立名為myobjfunc的m文件如下
function RES = myobjfunc(x)

RES=(x(3)*(1/(2*(x(3)^2 + x(5))*(x(4)^2 + x(3) + x(1)*x(2))^(1/2)) ...
- (2*x(3)*(x(4)^2 + x(3) + x(1)*x(2))^(1/2))/(x(3)^2 + x(5))^2))...
/(2*((x(4)^2 + x(3) + x(1)*x(2))^(1/2)/(x(3)^2 + x(5)) + 1)^(1/2)) ...
+ x(4)^2/(2*((x(4)^2 + x(3) + x(1)*x(2))^(1/2)/(x(3)^2 + x(5)) + 1)^(1/2)...
*(x(3)^2 + x(5))*(x(4)^2 + x(3) + x(1)*x(2))^(1/2)) ...
- (x(5)*(x(4)^2 + x(3) + x(1)*x(2))^(1/2))/(2....
*((x(4)^2 + x(3) + x(1)*x(2))^(1/2)/(x(3)^2 + x(5)) + 1)...
^(1/2)*(x(3)^2 + x(5))^2) + (x(1)*x(2))/(2*((x(4)^2 + x(3) + x(1)*x(2))...
^(1/2)/(x(3)^2 + x(5)) + 1)^(1/2)*(x(3)^2 + x(5))...
*(x(4)^2 + x(3) + x(1)*x(2))^(1/2));

2. 建立名為mymodelcons的m文件如下
function [C,CEQ]=mymodelcons(x)
C(1)=x(1)+x(2)^2-10;
C(2)=1-x(1)-x(2)^2;
CEQ=[];

3.在matlab命令窗口中輸入以下命令並執行
lb=[0.5 0.5 0.5 1 1];
ub=[5 5 5 3 4];
[X,Y,FLAG]=fmincon(@myobjfunc,[1 1 1 1 1],[],[],[],[],lb,ub,@mymodelcons)

結果為
Active inequalities (to within options.TolCon = 1e-006):
lower upper ineqlin ineqnonlin
5 1 1
4
X = 5.0000 2.2361 1.2359 3.0000 1.0000.

==================================================
在天涯回答上有類似的問題的兩個解答供參考
http://wenda.tianya.cn/wenda/thread?tid=29980be1cb2bb991

參考解答一
--------------------------------------------------
fun=@(x)sqrt(x(1)^2+x(2)^2)+sqrt(x(1)^2+(x(2)-52)^2)+sqrt(x(1)^2+(x(2)-139.5)^2)+sqrt(x(1)^2+(x(2)-228)^2)+sqrt(x(1)^2+(x(2)-288)^2)+sqrt((x(1)-65)^2+x(2)^2)+sqrt((x(1)-84)^2+x(2)^2)+sqrt((x(1)-110)^2+(x(2)-288)^2)+sqrt((x(1)-110)^2+(x(2)-217)^2)+sqrt((x(1)-110)^2+(x(2)-93)^2)+sqrt((x(1)-110)^2+x(2)^2)+sqrt((x(1)-65)^2+x(2)^2);
lb=[0;0];
ub=[110;228];
options=optimset('PlotFcns',{@optimplotx,@optimplotfirstorderopt,@optimplotstepsize,@optimplotfval});
[x,fval]=fmincon(fun,rand(2,1),[],[],[],[],lb,ub,[],options)

Optimization terminated: magnitude of directional derivative in search
direction less than 2*options.TolFun and maximum constraint violation
is less than options.TolCon.
No active inequalities.

x =

55.3467
74.3034

fval = 1.3748e+003

參考解答二
-------------------------------------------
(一)非線性一元函數的最小值
Matlab函數為fminbnd(),其使用格式為:
X=fminbnd(fun,x1,x2)
[X,fval,exitflag,output]= fminbnd(fun,x1,x2)

其中:fun為目標函數,x1,x2為變數的邊界約束,即x1≤x≤x2,X為返回的滿足fun取得最小值的x的值,而fval則為此時的目標函數值。 exitflag>0表示計算收斂,exitflag=0表示超過了最大的迭代次數,exitflag<0表示計算不收斂,返回值 output有3個分量,其中iterations是優化過程中迭代次數,funcCount是代入函數值的次數,algorithm是優化所採用的演算法。

例1:求函數 在區間 的最小值和相應的 值。
解決此問題的Matlab程序為:
clear
fun='(x^5+x^3+x^2-1)/(exp(x^2)+sin(-x))'
ezplot(fun,[-2,2])
[X,fval,exitflag,output]= fminbnd(fun,-2,2)
結果為:
X = 0.2176
fval =-1.1312
exitflag = 1
output = iterations: 13
funcCount: 13
algorithm: 'golden section search, parabolic interpolation'

(二)無約束非線性多變數優化問題
這里我們介紹兩個命令:fminsearch()和fminunc(),前者適合處理階次低但是間斷點多的函數,後者則對於高階連續的函數比較有效。
命令fminsearch()的格式為:
X= fminsearch(fun,X0)
[X,fval,exitflag,output]= fminsearch(fun,X0,options)

該命令求解目標函數fun的最小值和相應的x值,X0為x的初始值,fval為返回的函數值,exitflag=1表示優化結果收斂,exitflag=0 表示超過了最大迭代次數。返回值output有3個分量,其中iterations是優化過程中的迭代次數,funcCount是代入函數值的次數,algorithm是優化所採用的演算法。options是一個結構,裡面有控制優化過程的各種參數,參考optimset()命令來設置,一般情況下我們不必改動它,即使用預設設置就可以了。

例2:求函數 的最小值以及最小值點。
完成該計算的Matlab程序如下:
clear
fun1='sin(x)+cos(y)'
fun2='sin(x(1))+cos(x(2))'
ezmesh(fun1)
[X,fval]=fminsearch(fun2,[0,0])
X = -1.5708 3.1416
fval = -2.0000

其中語句ezmesh()是為了畫出函數的圖形,注意這里fun1和fun2的不同,考慮如果用相同的是否可行。

命令fminunc()的格式為:
X=fminunc(fun,X0)
[X,fval,exitflag,output,grad,hessian]=fminunc(fun,X0,options)
命令fminunc()通過計算尋找多變數目標函數fun的最小值,X0為優化的初始值,X為返回的變數的值,grad返回解點的梯度,hessian返回解點的漢森矩陣。其它參數的意義和命令fminsearch()相同。

例3:求函數 的最小值。
解:Matlab程序為
clear
fun='exp(x(1))*(2*x(1)^2+3*x(2)^2+2*x(1)*x(2)+3*x(2)+1)';
x0=[0,0];
options=optimset('largescale','off','display','iter','tolx',1e-8,'tolfun',1e-8);
[x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0,options)

運行結果為:
Iteration
Func-count
f(x)
Step-size
Directional derivative

1
2
1
0.2
-10

2
8
0.369471
0.134277
-0.020 .

閱讀全文

與多變數優化演算法相關的資料

熱點內容
程序員放棄後會怎樣 瀏覽:187
河北模具編程 瀏覽:190
adb查找命令 瀏覽:324
安卓手機視頻文件夾怎麼打開 瀏覽:314
平板加密手機後怎麼關閉 瀏覽:572
流媒體伺服器應該注意什麼 瀏覽:539
d8命令編譯 瀏覽:968
壓縮包解壓需要多少空間 瀏覽:152
如何查找app屬性 瀏覽:391
android人臉識別技術 瀏覽:326
pc104編程 瀏覽:338
二維碼反編譯破解推廣 瀏覽:686
修改伺服器的mac地址 瀏覽:529
好玩的編程軟體 瀏覽:902
編程語言創始人有錢嗎 瀏覽:809
短視頻app怎麼獲客 瀏覽:18
查看雲伺服器的應用 瀏覽:441
javadump工具 瀏覽:569
程序員16g 瀏覽:449
程序員沒有辦法成為top怎麼辦 瀏覽:223