導航:首頁 > 源碼編譯 > adam優化演算法的演算法流程圖

adam優化演算法的演算法流程圖

發布時間:2023-02-28 12:48:44

演算法流程圖怎麼畫

演算法流程圖的畫法:

品牌型號:華碩。

系統版本:UX30K723A。

軟體版本:win7,億圖圖示1.221.2,網路瀏覽器1.2.222.1。

1、第一步:搜索使用「億圖圖示」,開始作圖。

② 粒子群優化演算法

         粒子群演算法 的思想源於對鳥/魚群捕食行為的研究,模擬鳥集群飛行覓食的行為,鳥之間通過集體的協作使群體達到最優目的,是一種基於Swarm Intelligence的優化方法。它沒有遺傳演算法的「交叉」(Crossover) 和「變異」(Mutation) 操作,它通過追隨當前搜索到的最優值來尋找全局最優。粒子群演算法與其他現代優化方法相比的一個明顯特色就是所 需要調整的參數很少、簡單易行 ,收斂速度快,已成為現代優化方法領域研究的熱點。

         設想這樣一個場景:一群鳥在隨機搜索食物。已知在這塊區域里只有一塊食物;所有的鳥都不知道食物在哪裡;但它們能感受到當前的位置離食物還有多遠。那麼找到食物的最優策略是什麼呢?

        1. 搜尋目前離食物最近的鳥的周圍區域

        2. 根據自己飛行的經驗判斷食物的所在。

        PSO正是從這種模型中得到了啟發,PSO的基礎是 信息的社會共享

        每個尋優的問題解都被想像成一隻鳥,稱為「粒子」。所有粒子都在一個D維空間進行搜索。

        所有的粒子都由一個fitness function 確定適應值以判斷目前的位置好壞。

        每一個粒子必須賦予記憶功能,能記住所搜尋到的最佳位置。

        每一個粒子還有一個速度以決定飛行的距離和方向。這個速度根據它本身的飛行經驗以及同伴的飛行經驗進行動態調整。

        粒子速度更新公式包含三部分: 第一部分為「慣性部分」,即對粒子先前速度的記憶;第二部分為「自我認知」部分,可理解為粒子i當前位置與自己最好位置之間的距離;第三部分為「社會經驗」部分,表示粒子間的信息共享與合作,可理解為粒子i當前位置與群體最好位置之間的距離。

        第1步   在初始化范圍內,對粒子群進行隨機初始化,包括隨機位置和速度

        第2步   根據fitness function,計算每個粒子的適應值

        第3步   對每個粒子,將其當前適應值與其個體歷史最佳位置(pbest)對應的適應值作比較,如果當前的適應值更高,則用當前位置更新粒子個體的歷史最優位置pbest

        第4步   對每個粒子,將其當前適應值與全局最佳位置(gbest)對應的適應值作比較,如果當前的適應值更高,則用當前位置更新粒子群體的歷史最優位置gbest

        第5步   更新粒子的速度和位置

        第6步   若未達到終止條件,則轉第2步

        【通常演算法達到最大迭代次數或者最佳適應度值得增量小於某個給定的閾值時演算法停止】

粒子群演算法流程圖如下:

以Ras函數(Rastrigin's Function)為目標函數,求其在x1,x2∈[-5,5]上的最小值。這個函數對模擬退火、進化計算等演算法具有很強的欺騙性,因為它有非常多的局部最小值點和局部最大值點,很容易使演算法陷入局部最優,而不能得到全局最優解。如下圖所示,該函數只在(0,0)處存在全局最小值0。

③ 優化神經網路梯度演算法——Adam

"""
Created on Wed Oct 3 21:54:36 2018

@author: ltx
"""

import numpy as np
import matplotlib.pyplot as plt
import scipy.io
import math
import sklearn
import sklearn.datasets

import opt_utils
import testCase
plt.rcParams['figure.figsize'] = (7.0, 4.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'

def GetMinibatch(X,Y,batch_number,seed=0):
np.random.seed(seed)#指定隨機種子
m=X.shape[1]

print("-------------測試random_mini_batches-------------")
X_assess,Y_assess,mini_batch_size = testCase.random_mini_batches_test_case()
mini_batches = GetMinibatch(X_assess,Y_assess,mini_batch_size)

print("第1個mini_batch_X 的維度為:",mini_batches[0][0].shape)
print("第1個mini_batch_Y 的維度為:",mini_batches[0][1].shape)
print("第2個mini_batch_X 的維度為:",mini_batches[1][0].shape)
print("第2個mini_batch_Y 的維度為:",mini_batches[1][1].shape)
print("第3個mini_batch_X 的維度為:",mini_batches[2][0].shape)
print("第3個mini_batch_Y 的維度為:",mini_batches[2][1].shape)

def Initial_velocity(parameters):
L=len(parameters)//2 #L=4 //除後結果為整數,/除後結果為浮點數
V={}
for l in range(L):

print("-------------測試initialize_velocity-------------")
parameters = testCase.initialize_velocity_test_case()
v = Initial_velocity(parameters)

print('v["dW1"] = ' + str(v["dW1"]))
print('v["db1"] = ' + str(v["db1"]))
print('v["dW2"] = ' + str(v["dW2"]))
print('v["db2"] = ' + str(v["db2"]))

def UpdateWith_velocity (parameters,grads,V,beta,learning_rate):
L=len(parameters)//2
for l in range(L):
V["dW"+str(l+1)]=beta V["dW"+str(l+1)]+(1-beta) grads["dW"+str(l+1)]
V["db"+str(l+1)]=beta V["db"+str(l+1)]+(1-beta) grads["db"+str(l+1)]

print("-------------測試update_parameters_with_momentun-------------")
parameters,grads,v = testCase.update_parameters_with_momentum_test_case()
UpdateWith_velocity (parameters,grads,v,beta=0.9,learning_rate=0.01)

print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
print('v["dW1"] = ' + str(v["dW1"]))
print('v["db1"] = ' + str(v["db1"]))
print('v["dW2"] = ' + str(v["dW2"]))
print('v["db2"] = ' + str(v["db2"]))

def initial_Adam(parameters):
L=len(parameters)//2
S={}
V={}
for l in range(L):
S["dW"+str(1+l)]=np.zeros_like(parameters["W"+str(1+l)])
S["db"+str(1+l)]=np.zeros_like(parameters["b"+str(1+l)])

print("-------------測試initialize_adam-------------")
parameters = testCase.initialize_adam_test_case()
v,s = initial_Adam(parameters)

print('v["dW1"] = ' + str(v["dW1"]))
print('v["db1"] = ' + str(v["db1"]))
print('v["dW2"] = ' + str(v["dW2"]))
print('v["db2"] = ' + str(v["db2"]))
print('s["dW1"] = ' + str(s["dW1"]))
print('s["db1"] = ' + str(s["db1"]))
print('s["dW2"] = ' + str(s["dW2"]))
print('s["db2"] = ' + str(s["db2"]))

def Update_parameter_Adam(parameters,grads,V,S,t,learning_rate=0.01,beta1=0.9,beta2=0.999,epsilon=1e-8):
L=len(parameters)//2
V_corrected={}
S_corrected={}
for l in range(L):
V["dW"+str(1+l)]=beta1 V["dW"+str(1+l)]+(1-beta1) grads["dW"+str(1+l)]
V["db"+str(1+l)]=beta1 V["db"+str(1+l)]+(1-beta1) grads["db"+str(1+l)]

print("-------------測試update_with_parameters_with_adam-------------")
parameters , grads , v , s = testCase.update_parameters_with_adam_test_case()
Update_parameter_Adam(parameters,grads,v,s,t=2)

print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
print('v["dW1"] = ' + str(v["dW1"]))
print('v["db1"] = ' + str(v["db1"]))
print('v["dW2"] = ' + str(v["dW2"]))
print('v["db2"] = ' + str(v["db2"]))
print('s["dW1"] = ' + str(s["dW1"]))
print('s["db1"] = ' + str(s["db1"]))
print('s["dW2"] = ' + str(s["dW2"]))
print('s["db2"] = ' + str(s["db2"]))

def Upadate_parameter(parameters,grads,learing_rate=0.8):
L=len(parameters)//2
for l in range(L):
parameters["W"+str(1+l)]=parameters["W"+str(1+l)]-learing_rate grads["dW"+str(1+l)]
parameters["b"+str(1+l)]=parameters["b"+str(1+l)]-learing_rate
grads["db"+str(1+l)]
return parameters

train_X,train_Y = opt_utils.load_dataset(is_plot=False)

batch_number=64
layer_dims=[train_X.shape[0],5,2,1]

costs = []
parameters=opt_utils.initialize_parameters(layer_dims)

def model (parameters,td="gd",learing_rate=0.0007,beta=0.9,is_plot=True,print_cost=True,iterations=10000):
t = 0
seed = 10
for i in range(iterations):
seed=seed+1
Batches = GetMinibatch(train_X,train_Y ,batch_number,seed)
for batch in Batches :
(bacth_X,batch_Y)=batch
#向前傳播
A3,cache=opt_utils.forward_propagation(bacth_X,parameters)
#計算cost
cost=opt_utils.compute_cost(A3,batch_Y)
#向後傳播
grads=opt_utils.backward_propagation(bacth_X,batch_Y,cache)
#更新模型參數
if(td=="gd"):
parameters=Upadate_parameter(parameters,grads,learing_rate)
elif(td=="velocity"):
V=Initial_velocity(parameters)
parameters,V=UpdateWith_velocity (parameters,grads,V,beta,learing_rate)
elif(td=="adam"):
V,S=initial_Adam(parameters)
t=t+1
parameters,V,S=Update_parameter_Adam(parameters,grads,V,S,t,learing_rate,beta1=0.9,beta2=0.999,epsilon=1e-8)

parameters = model(parameters,td="gd",is_plot=True)

preditions = opt_utils.predict(train_X,train_Y,parameters)

plt.title("Model with Gradient Descent optimization")
axes = plt.gca()
axes.set_xlim([-1.5, 2.5])
axes.set_ylim([-1, 1.5])
opt_utils.plot_decision_boundary(lambda x: opt_utils.predict_dec(parameters, x.T), train_X, train_Y)

--------------實驗結果------------------------------

④ 優化演算法筆記(二)優化演算法的分類

(以下描述,均不是學術用語,僅供大家快樂的閱讀)

在分類之前,我們先列舉一下常見的優化演算法(不然我們拿什麼分類呢?)。
1遺傳演算法Genetic algorithm
2粒子群優化演算法Particle Swarm Optimization
3差分進化演算法Differential Evolution
4人工蜂群演算法Artificial Bee Colony
5蟻群演算法Ant Colony Optimization
6人工魚群演算法Artificial Fish Swarm Algorithm
7杜鵑搜索演算法Cuckoo Search
8螢火蟲演算法Firefly Algorithm
9灰狼演算法Grey Wolf Optimizer
10鯨魚演算法Whale Optimization Algorithm
11群搜索演算法Group search optimizer
12混合蛙跳演算法Shuffled Frog Leaping Algorithm
13煙花演算法fireworks algorithm
14菌群優化演算法Bacterial Foraging Optimization
以上優化演算法是我所接觸過的演算法,沒接觸過的演算法不能隨便下結論,知之為知之,不知為不知。其實到目前為止優化演算法可能已經有幾百種了,我們不可能也不需要全面的了解所有的演算法,而且優化演算法之間也有較大的共性,深入研究幾個之後再看其他優化演算法上手速度會灰常的快。
優化演算法從提出到現在不過50-60年(遺傳演算法1975年提出),雖種類繁多但大多較為相似,不過這也很正常,比較香蕉和人的基因相似度也有50%-60%。當然演算法之間的相似度要比香蕉和人的相似度更大,畢竟人家都是優化演算法,有著相同的目標,只是實現方式不同。就像條條大路通羅馬,我們可以走去,可以坐汽車去,可以坐火車去,也可以坐飛機去,不管使用何種方式,我們都在去往羅馬的路上,也不會說坐飛機去要比走去更好,交通工具只是一個工具,最終的方案還是要看我們的選擇。

上面列舉了一些常見的演算法,即使你一個都沒見過也沒關系,後面會對它們進行詳細的介紹,但是對後面的分類可能會有些許影響,不過問題不大,就先當總結看了。
再對優化演算法分類之前,先介紹一下演算法的模型,在筆記(一)中繪制了優化演算法的流程,不過那是個較為簡單的模型,此處的模型會更加復雜。上面說了優化演算法有較大的相似性,這些相似性主要體現在演算法的運行流程中。
優化演算法的求解過程可以看做是一個群體的生存過程。

有一群原始人,他們要在野外中尋找食物,一個原始人是這個群體中的最小單元,他們的最終目標是尋找這個環境中最容易獲取食物的位置,即最易存活下來的位置。每個原始人都去獨自尋找食物,他們每個人每天獲取食物的策略只有採集果實、製作陷阱或者守株待兔,即在一天之中他們不會改變他們的位置。在下一天他們會根據自己的策略變更自己的位置。到了某一天他們又聚在了一起,選擇了他們到過的最容易獲取食物的位置定居。
一群原始人=優化演算法中的種群、群體;
一個原始人=優化演算法中的個體;
一個原始人的位置=優化演算法中個體的位置、基因等屬性;
原始人變更位置=優化演算法中總群的更新操作;
該位置獲取食物的難易程度=優化演算法中的適應度函數;
一天=優化演算法中的一個迭代;
這群原始人最終的定居位置=優化演算法所得的解。
優化演算法的流程圖如下:

對優化演算法分類得有個標准,按照不同的標准分類也會得到不一樣的結果。首先說一下我所使用的分類標准(動態更新,有了新的感悟再加):

按由來分類比較好理解,就是該演算法受何種現象啟發而發明,本質是對現象分類。

可以看出演算法根據由來可以大致分為有人類的理論創造而來,向生物學習而來,受物理現象啟發。其中向生物學習而來的演算法最多,其他類別由於舉例有偏差,不是很准確,而且物理現象也經過人類總結,有些與人類現象相交叉,但仍將其獨立出來。
類別分好了,那麼為什麼要這么分類呢?

當然是因為要湊字數啦,啊呸,當然是為了更好的理解學習這些演算法的原理及特點。
向動物生存學習而來的演算法一定是一種行之有效的方法,能夠保證演算法的效率和准確性,因為,如果使用該策略的動物無法存活到我們可以對其進行研究,我們也無法得知其生存策略。(而這也是一種倖存者偏差,我們只能看到行之有效的策略,但並不是我們沒看到的策略都是垃圾,畢竟也發生過小行星撞地球這種小概率毀滅性事件。講個冷笑話開cou心一shu下:一隻小恐龍對他的小夥伴說,好開心,我最喜歡的那顆星星越來越亮了(完)。)但是由於生物的局限性,人們所創造出的演算法也會有局限性:我們所熟知的生物都生存在三維空間,在這些環境中,影響生物生存的條件比較有限,反應到演算法中就是這些演算法在解決較低維度的問題時效果很好,當遇到超高維(維度>500)問題時,結果可能不容樂觀,沒做過實驗,我也不敢亂說。

按更新過程分類相對復雜一點,主要是根據優化演算法流程中更新位置操作的方式來進行分類。更新位置的操作按我的理解可大致分為兩類:1.跟隨最優解;2.不跟隨最優解。
還是上面原始人的例子,每天他有一次去往其他位置狩獵的機會,他們採用何種方式來決定今天自己應該去哪裡呢?
如果他們的策略是「跟隨最優解」,那麼他們選取位置的方式就是按一定的策略向群體已知的最佳狩獵位置(歷史最佳)或者是當前群體中的最佳狩獵位置(今天最佳)靠近,至於是直線跑過去還是蛇皮走位繞過去,這個要看他們群體的策略。當然,他們的目的不是在最佳狩獵位置集合,他們的目的是在過去的途中看是否能發現更加好的狩獵位置,去往已經到過的狩獵地點再次狩獵是沒有意義的,因為每個位置獲取食物的難易程度是固定的。有了目標,大家都會朝著目標前進,總有一日,大家會在謀個位置附近相聚,相聚雖好但不利於後續的覓食容易陷入局部最優。
什麼是局部最優呢?假設在當前環境中有一「桃花源」,擁有上帝視角的我們知道這個地方就是最適合原始人們生存的,但是此地入口隱蔽「山有小口,彷彿若有光」、「初極狹,才通人。」,是一個難以發現的地方。如果沒有任何一個原始人到達了這里,大家向著已知的最優位置靠近時,也難以發現這個「桃源之地」,而當大家越聚越攏之後,「桃源」被發現的可能性越來越低。雖然原始人們得到了他們的解,但這並不是我們所求的「桃源」,他們聚集之後失去了尋求「桃源」的可能,這群原始人便陷入了局部最優。

如果他們的策略是「不跟隨最優解」,那麼他們的策略是什麼呢?我也不知道,這個應該他們自己決定。畢竟「是什麼」比「不是什麼」的范圍要小的多。總之不跟隨最優解時,演算法會有自己特定的步驟來更新個體的位置,有可能是隨機在自己附近找,也有可能是隨機向別人學習。不跟隨最優解時,原始人們應該不會快速聚集到某一處,這樣一來他們的選擇更具多樣性。
按照更新過程對上面的演算法分類結果如下

可以看出上面不跟隨最優解的演算法只有遺傳演算法和差分進化演算法,他們的更新策略是與進化和基因的重組有關。因此這些不跟隨最優解的演算法,他們大多依據進化理論更新位置(基因)我把他們叫做進化演算法,而那些跟隨群體最優解的演算法,他們則大多依賴群體的配合協作,我把這些演算法叫做群智能演算法。

目前我只總結了這兩種,分類方法,如果你有更加優秀的分類方法,我們可以交流一下:

目錄
上一篇 優化演算法筆記(一)優化演算法的介紹
下一篇 優化演算法筆記(三)粒子群演算法(1)

⑤ 自適應矩估計Adam優化演算法

Adam演算法直觀上其實是RMSProp演算法和Momentum演算法的加和,即Adam = RMSProp + Momentum,因為其思想採用了使用過去的累加動量和梯度。

一般設置 , , 就相當於動量法,是一階梯度矩陣, 相當於RMSProp法,是二階梯度矩陣, 和 分別是對原始值的偏差修正。採用偏差矯正的原因是因為採用移動指數平均方法並且在 和 初始值都為0向量, 所以在剛開始階段如果不進行修正,演算法會給梯度分配很小的權重,得到不真實的結果

閱讀全文

與adam優化演算法的演算法流程圖相關的資料

熱點內容
pdf背景綠色 瀏覽:610
記事本dos命令 瀏覽:274
伺服器如何搭建多個節點 瀏覽:326
acx演算法 瀏覽:258
幽冥詭匠漫畫全集用什麼app可以看 瀏覽:1001
租用伺服器為什麼越來越慢 瀏覽:960
演算法創新就業方向 瀏覽:423
演算法最優解作者 瀏覽:868
通達信紅綠寶塔線指標源碼 瀏覽:667
app是什麼東西合法嗎 瀏覽:231
怎麼鎖app視頻教程 瀏覽:841
迅捷pdf注冊碼生成器 瀏覽:749
androidsdkosx 瀏覽:303
壓縮面膜紙熒光 瀏覽:841
app怎麼分身三個 瀏覽:744
電影bt下載源碼 瀏覽:422
iwatch屏幕加密晶元 瀏覽:570
公安主題網站源碼 瀏覽:986
天津市伺服器供應商雲伺服器 瀏覽:117
數控車床子程序編程 瀏覽:112