精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

5分鐘快速掌握Adam優化算法

開發 后端 算法
在本教程中,您將發現如何從頭開始使用Adam優化算法開發梯度下降。

[[389202]]

 梯度下降是一種優化算法,遵循目標函數的負梯度以定位函數的最小值。

梯度下降的局限性是,所有輸入變量都使用單個步長(學習率)。像AdaGrad和RMSProp這樣的梯度下降的擴展會更新算法,以對每個輸入變量使用單獨的步長,但可能會導致步長迅速減小到非常小的值。自適應運動估計算法(Adam)是梯度下降的擴展,是AdaGrad和RMSProp等技術的自然繼承者,該技術可自動為目標函數的每個輸入變量調整學習率,并通過使用以指數方式降低梯度的移動平均值以更新變量。

在本教程中,您將發現如何從頭開始使用Adam優化算法開發梯度下降。完成本教程后,您將知道:

  •  梯度下降是一種優化算法,它使用目標函數的梯度來導航搜索空間。
  •  可以通過使用稱為Adam的偏導數的遞減平均值,將梯度下降更新為對每個輸入變量使用自動自適應步長。
  •  如何從頭開始實施Adam優化算法并將其應用于目標函數并評估結果。

教程概述

本教程分為三個部分:他們是:

  •  梯度下降
  •  Adam優化算法
  •  Adam梯度下降

          二維測試問題

          Adam的梯度下降優化

          Adam可視化

梯度下降

梯度下降是一種優化算法。它在技術上稱為一階優化算法,因為它明確利用了目標目標函數的一階導數。一階導數,或簡稱為“導數”,是目標函數在特定點(例如,點)上的變化率或斜率。用于特定輸入。如果目標函數采用多個輸入變量,則將其稱為多元函數,并且可以將輸入變量視為向量。反過來,多元目標函數的導數也可以視為向量,通常稱為梯度。

梯度:多元目標函數的一階導數。

對于特定輸入,導數或梯度指向目標函數最陡峭的上升方向。

梯度下降是指一種最小化優化算法,該算法遵循目標函數的下坡梯度負值來定位函數的最小值。梯度下降算法需要一個正在優化的目標函數和該目標函數的導數函數。目標函數f()返回給定輸入集合的分數,導數函數f'()給出給定輸入集合的目標函數的導數。梯度下降算法需要問題中的起點(x),例如輸入空間中的隨機選擇點。

假設我們正在最小化目標函數,然后計算導數并在輸入空間中采取一步,這將導致目標函數下坡運動。下坡運動是通過首先計算輸入空間中的運動量來進行的,計算方法是將步長(稱為alpha或學習率)乘以坡度。然后從當前點減去該值,以確保我們逆梯度移動或向下移動目標函數。

x(t)= x(t-1)–step* f'(x(t-1))

在給定點的目標函數越陡峭,梯度的幅度越大,反過來,在搜索空間中采取的步伐也越大。使用步長超參數來縮放步長的大小。

步長(alpha):超參數,控制算法每次迭代時相對于梯度在搜索空間中移動多遠。

如果步長太小,則搜索空間中的移動將很小,并且搜索將花費很長時間。如果步長太大,則搜索可能會在搜索空間附近反彈并跳過最優值。

現在我們已經熟悉了梯度下降優化算法,下面讓我們看一下Adam算法。

Adam優化算法

自適應運動估計算法(簡稱“Adam”)是梯度下降優化算法的擴展。Diederik Kingma和Jimmy Lei Ba在2014年發表的題為“Adam:隨機優化方法”的論文中描述了該算法。Adam旨在加速優化過程,例如減少達到最佳狀態所需的功能評估次數,或提高優化算法的功能,例如產生更好的最終結果。這是通過為每個要優化的輸入參數計算步長來實現的。重要的是,每個步長都將根據每個變量遇到的梯度(偏導數)自動調整搜索過程的吞吐量。

讓我們逐步介紹該算法的每個元素。首先,對于作為搜索一部分而被優化的每個參數,我們必須維持一個矩矢量和指數加權無窮大范數,分別稱為m和v(真是希臘字母nu)。在搜索開始時將它們初始化為0.0。

m = 0 

v = 0

該算法在從t=1開始的時間t內迭代執行,并且每次迭代都涉及計算一組新的參數值x,例如。從x(t-1)到x(t)。如果我們專注于更新一個參數,這可能很容易理解該算法,該算法概括為通過矢量運算來更新所有參數。首先,計算當前時間步長的梯度(偏導數)。

g(t)= f'(x(t-1))

接下來,使用梯度和超參數beta1更新第一時刻。

m(t)= beta1 * m(t-1)+(1 – beta1)* g(t)

然后,使用平方梯度和超參數beta2更新第二時刻。

v(t)= beta2 * v(t-1)+(1 – beta2)* g(t)^ 2

由于第一和第二力矩是用零值初始化的,所以它們是有偏的。接下來,對第一力矩和第二力矩進行偏差校正,并以第一力矩為起點:

mhat(t)= m(t)/(1 – beta1(t))

然后第二個時刻:

vhat(t)= v(t)/(1 – beta2(t))

注意,beta1(t)和beta2(t)指的是beta1和beta2超參數,它們在算法的迭代過程中按時間表衰減。可以使用靜態衰減時間表,盡管該論文建議以下內容:

beta1(t)= beta1 ^ t

beta2(t)= beta2 ^ t

最后,我們可以為該迭代計算參數的值。

x(t)= x(t-1)– alpha * mhat(t)/(sqrt(vhat(t))+ eps)

其中alpha是步長超參數,eps是一個較小的值(epsilon),例如1e-8,可確保我們不會遇到被零除的誤差,而sqrt()是平方根函數。

注意,可以使用對本文中列出的更新規則進行更有效的重新排序:

alpha(t)= alpha * sqrt(1 – beta2(t))/(1 – beta1(t)) x(t)= x(t-1)– alpha(t)* m(t)/(sqrt(v(t))+ eps)

回顧一下,該算法有三個超參數,它們是:

  •  alpha:初始步長(學習率),典型值為0.001。
  •  beta1:第一個動量的衰減因子,典型值為0.9。
  •  beta2:無窮大范數的衰減因子,典型值為0.999。

接下來,讓我們看看如何在Python中從頭開始實現該算法。

Adam梯度下降

在本節中,我們將探討如何使用Adam實現梯度下降優化算法。

二維測試問題

首先,讓我們定義一個優化函數。我們將使用一個簡單的二維函數,該函數將每個維的輸入平方,并定義有效輸入的范圍(從-1.0到1.0)。

下面的Objective()函數實現了此功能 

  1. # objective function  
  2. def objective(x, y):  
  3.  return x**2.0 + y**2.0 

我們可以創建數據集的三維圖,以了解響應面的曲率。下面列出了繪制目標函數的完整示例。 

  1. # 3d plot of the test function  
  2. from numpy import arange  
  3. from numpy import meshgrid  
  4. from matplotlib import pyplot   
  5. # objective function  
  6. def objective(x, y):  
  7.  return x**2.0 + y**2.0   
  8. # define range for input  
  9. r_min, r_max = -1.0, 1.0  
  10. # sample input range uniformly at 0.1 increments  
  11. xaxis = arange(r_min, r_max, 0.1)  
  12. yaxis = arange(r_min, r_max, 0.1)  
  13. # create a mesh from the axis  
  14. x, y = meshgrid(xaxis, yaxis)  
  15. # compute targets 
  16. results = objective(x, y)  
  17. # create a surface plot with the jet color scheme  
  18. figure = pyplot.figure()  
  19. axis = figure.gca(projection='3d' 
  20. axis.plot_surface(x, y, results, cmap='jet'
  21. # show the plot  
  22. pyplot.show() 

運行示例將創建目標函數的三維表面圖。我們可以看到全局最小值為f(0,0)= 0的熟悉的碗形狀。

我們還可以創建函數的二維圖。這在以后要繪制搜索進度時會很有幫助。下面的示例創建目標函數的輪廓圖。 

  1. # contour plot of the test function  
  2. from numpy import asarray  
  3. from numpy import arange  
  4. from numpy import meshgrid  
  5. from matplotlib import pyplot   
  6. # objective function  
  7. def objective(x, y):  
  8.  return x**2.0 + y**2.0   
  9. # define range for input  
  10. bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])  
  11. # sample input range uniformly at 0.1 increments  
  12. xaxis = arange(bounds[0,0], bounds[0,1], 0.1)  
  13. yaxis = arange(bounds[1,0], bounds[1,1], 0.1)  
  14. # create a mesh from the axis  
  15. x, y = meshgrid(xaxis, yaxis)  
  16. # compute targets  
  17. results = objective(x, y)  
  18. # create a filled contour plot with 50 levels and jet color scheme  
  19. pyplot.contourf(x, y, results, levels=50cmap='jet' 
  20. # show the plot  
  21. pyplot.show() 

運行示例將創建目標函數的二維輪廓圖。我們可以看到碗的形狀被壓縮為以顏色漸變顯示的輪廓。我們將使用該圖來繪制在搜索過程中探索的特定點。

現在我們有了一個測試目標函數,讓我們看一下如何實現Adam優化算法。

Adam梯度下降優化

我們可以將帶有Adam的梯度下降應用于測試問題。首先,我們需要一個函數來計算此函數的導數。

f(x)= x ^ 2

f'(x)= x * 2

x ^ 2的導數在每個維度上均為x * 2。 derived()函數在下面實現了這一點。 

  1. # derivative of objective function  
  2. def derivative(x, y):  
  3.  return asarray([x * 2.0, y * 2.0]) 

接下來,我們可以實現梯度下降優化。首先,我們可以選擇問題范圍內的隨機點作為搜索的起點。假定我們有一個數組,該數組定義搜索范圍,每個維度一行,并且第一列定義最小值,第二列定義維度的最大值。 

  1. # generate an initial point  
  2. x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])  
  3. score = objective(x[0], x[1]) 

接下來,我們需要將第一時刻和第二時刻初始化為零。 

  1. # initialize first and second moments  
  2. m = [0.0 for _ in range(bounds.shape[0])]  
  3. v = [0.0 for _ in range(bounds.shape[0])] 

然后,我們運行由“ n_iter”超參數定義的算法的固定迭代次數。 

  1. ...  
  2. # run iterations of gradient descent  
  3. for t in range(n_iter):  
  4.  ... 

第一步是使用導數()函數計算當前解決方案的梯度。 

  1. # calculate gradient  
  2. gradient = derivative(solution[0], solution[1]) 

第一步是計算當前參數集的導數。 

  1. # calculate gradient g(t)  
  2. g = derivative(x[0], x[1]) 

接下來,我們需要執行Adam更新計算。為了提高可讀性,我們將使用命令式編程樣式一次執行一個變量的這些計算。

在實踐中,我建議使用NumPy向量運算以提高效率。 

  1. ...  
  2. # build a solution one variable at a time  
  3. for i in range(x.shape[0]):  
  4.  ... 

首先,我們需要計算力矩。 

  1. # m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)  
  2. m[i] = beta1 * m[i] + (1.0 - beta1) * g[i] 

然后是第二個時刻。 

  1. # v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2  
  2. v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2 

然后對第一和第二時刻進行偏差校正。 

  1. # mhat(t) = m(t) / (1 - beta1(t))  
  2. mmhat = m[i] / (1.0 - beta1**(t+1)) 
  3. # vhat(t) = v(t) / (1 - beta2(t))  
  4. vvhat = v[i] / (1.0 - beta2**(t+1)) 

然后最后是更新的變量值。 

  1. # x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + eps)  
  2. x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps) 

然后,針對要優化的每個參數重復此操作。在迭代結束時,我們可以評估新的參數值并報告搜索的性能。 

  1. # evaluate candidate point  
  2. score = objective(x[0], x[1])  
  3. # report progress  
  4. print('>%d f(%s) = %.5f' % (t, x, score)) 

我們可以將所有這些結合到一個名為adam()的函數中,該函數采用目標函數和派生函數的名稱以及算法超參數,并返回在搜索及其評估結束時找到的最佳解決方案。

下面列出了完整的功能。 

  1. # gradient descent algorithm with adam  
  2. def adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2, eps=1e-8):  
  3.  # generate an initial point  
  4.  x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])  
  5.  score = objective(x[0], x[1])  
  6.  # initialize first and second moments  
  7.  m = [0.0 for _ in range(bounds.shape[0])]  
  8.  v = [0.0 for _ in range(bounds.shape[0])]  
  9.  # run the gradient descent updates  
  10.  for t in range(n_iter):  
  11.   # calculate gradient g(t)  
  12.   g = derivative(x[0], x[1])  
  13.   # build a solution one variable at a time  
  14.   for i in range(x.shape[0]):  
  15.    # m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)  
  16.    m[i] = beta1 * m[i] + (1.0 - beta1) * g[i]  
  17.    # v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2  
  18.    v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2  
  19.    # mhat(t) = m(t) / (1 - beta1(t))  
  20.    mmhat = m[i] / (1.0 - beta1**(t+1))  
  21.    # vhat(t) = v(t) / (1 - beta2(t))  
  22.    vvhat = v[i] / (1.0 - beta2**(t+1))  
  23.    # x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + eps)  
  24.    x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps)  
  25.   # evaluate candidate point  
  26.   score = objective(x[0], x[1])  
  27.   # report progress  
  28.   print('>%d f(%s) = %.5f' % (t, x, score))  
  29.  return [x, score] 

注意:為了提高可讀性,我們有意使用列表和命令式編碼樣式,而不是矢量化操作。隨意將實現改編為帶有NumPy數組的矢量化實現,以實現更好的性能。

然后,我們可以定義我們的超參數并調用adam()函數來優化我們的測試目標函數。

在這種情況下,我們將使用算法的60次迭代,初始步長為0.02,beta1和beta2值分別為0.8和0.999。經過一些反復試驗后,發現了這些超參數值。 

  1. # seed the pseudo random number generator  
  2. seed(1)  
  3. # define range for input  
  4. bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])  
  5. # define the total iterations  
  6. n_iter = 60 
  7. # steps size  
  8. alpha = 0.02  
  9. # factor for average gradient  
  10. beta1 = 0.8  
  11. # factor for average squared gradient  
  12. beta2 = 0.999  
  13. # perform the gradient descent search with adam  
  14. best, score = adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2)  
  15. print('Done!')  
  16. print('f(%s) = %f' % (best, score)) 

綜合所有這些,下面列出了使用Adam進行梯度下降優化的完整示例。 

  1. # gradient descent optimization with adam for a two-dimensional test function  
  2. from math import sqrt  
  3. from numpy import asarray  
  4. from numpy.random import rand  
  5. from numpy.random import seed   
  6. # objective function  
  7. def objective(x, y):  
  8.  return x**2.0 + y**2.0  
  9. # derivative of objective function  
  10. def derivative(x, y):  
  11.  return asarray([x * 2.0, y * 2.0])  
  12. # gradient descent algorithm with adam  
  13. def adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2, eps=1e-8):  
  14.  # generate an initial point  
  15.  x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])  
  16.  score = objective(x[0], x[1])  
  17.  # initialize first and second moments  
  18.  m = [0.0 for _ in range(bounds.shape[0])]  
  19.  v = [0.0 for _ in range(bounds.shape[0])]  
  20.  # run the gradient descent updates  
  21.  for t in range(n_iter):  
  22.   # calculate gradient g(t)  
  23.   g = derivative(x[0], x[1])  
  24.   # build a solution one variable at a time  
  25.   for i in range(x.shape[0]):  
  26.    # m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)  
  27.    m[i] = beta1 * m[i] + (1.0 - beta1) * g[i]  
  28.    # v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2  
  29.    v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2  
  30.    # mhat(t) = m(t) / (1 - beta1(t))  
  31.    mmhat = m[i] / (1.0 - beta1**(t+1))  
  32.    # vhat(t) = v(t) / (1 - beta2(t))  
  33.    vvhat = v[i] / (1.0 - beta2**(t+1))  
  34.    # x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + eps)  
  35.    x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps)  
  36.   # evaluate candidate point  
  37.   score = objective(x[0], x[1])  
  38.   # report progress  
  39.   print('>%d f(%s) = %.5f' % (t, x, score)) 
  40.  return [x, score]  
  41. # seed the pseudo random number generator  
  42. seed(1)  
  43. # define range for input  
  44. bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])  
  45. # define the total iterations  
  46. n_iter = 60  
  47. # steps size  
  48. alpha = 0.02  
  49. # factor for average gradient  
  50. beta1 = 0.8  
  51. # factor for average squared gradient  
  52. beta2 = 0.999  
  53. # perform the gradient descent search with adam  
  54. best, score = adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2)  
  55. print('Done!')  
  56. print('f(%s) = %f' % (best, score)) 

運行示例將Adam優化算法應用于我們的測試問題,并報告算法每次迭代的搜索性能。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

在這種情況下,我們可以看到在搜索53次迭代后找到了接近最佳的解決方案,輸入值接近0.0和0.0,評估為0.0。 

  1. >50 f([-0.00056912 -0.00321961]) = 0.00001  
  2. >51 f([-0.00052452 -0.00286514]) = 0.00001  
  3. >52 f([-0.00043908 -0.00251304]) = 0.00001  
  4. >53 f([-0.0003283  -0.00217044]) = 0.00000  
  5. >54 f([-0.00020731 -0.00184302]) = 0.00000  
  6. >55 f([-8.95352320e-05 -1.53514076e-03]) = 0.00000  
  7. >56 f([ 1.43050285e-05 -1.25002847e-03]) = 0.00000  
  8. >57 f([ 9.67123406e-05 -9.89850279e-04]) = 0.00000  
  9. >58 f([ 0.00015359 -0.00075587]) = 0.00000  
  10. >59 f([ 0.00018407 -0.00054858]) = 0.00000  
  11. Done!  
  12. f([ 0.00018407 -0.00054858]) = 0.000000 

Adam可視化

我們可以在域的輪廓圖上繪制Adam搜索的進度。這可以為算法迭代過程中的搜索進度提供直觀的認識。我們必須更新adam()函數以維護在搜索過程中找到的所有解決方案的列表,然后在搜索結束時返回此列表。下面列出了具有這些更改的功能的更新版本。 

  1. # gradient descent algorithm with adam  
  2. def adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2, eps=1e-8):  
  3.  solutions = list()  
  4.  # generate an initial point  
  5.  x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])  
  6.  score = objective(x[0], x[1])  
  7.  # initialize first and second moments  
  8.  m = [0.0 for _ in range(bounds.shape[0])]  
  9.  v = [0.0 for _ in range(bounds.shape[0])]  
  10.  # run the gradient descent updates  
  11.  for t in range(n_iter):  
  12.   # calculate gradient g(t)  
  13.   g = derivative(x[0], x[1])  
  14.   # build a solution one variable at a time  
  15.   for i in range(bounds.shape[0]):  
  16.    # m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)  
  17.    m[i] = beta1 * m[i] + (1.0 - beta1) * g[i]  
  18.    # v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2  
  19.    v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2  
  20.    # mhat(t) = m(t) / (1 - beta1(t))  
  21.    mmhat = m[i] / (1.0 - beta1**(t+1))  
  22.    # vhat(t) = v(t) / (1 - beta2(t))  
  23.    vvhat = v[i] / (1.0 - beta2**(t+1))  
  24.    # x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + ep)  
  25.    x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps)  
  26.   # evaluate candidate point  
  27.   score = objective(x[0], x[1])  
  28.   # keep track of solutions  
  29.   solutions.append(x.copy())  
  30.   # report progress  
  31.   print('>%d f(%s) = %.5f' % (t, x, score))  
  32.  return solutions 

然后,我們可以像以前一樣執行搜索,這一次將檢索解決方案列表,而不是最佳的最終解決方案。 

  1. # seed the pseudo random number generator  
  2. seed(1)  
  3. # define range for input  
  4. bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])  
  5. # define the total iterations  
  6. n_iter = 60  
  7. # steps size  
  8. alpha = 0.02  
  9. # factor for average gradient  
  10. beta1 = 0.8  
  11. # factor for average squared gradient  
  12. beta2 = 0.999  
  13. # perform the gradient descent search with adam  
  14. solutions = adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2) 

然后,我們可以像以前一樣創建目標函數的輪廓圖。 

  1. # sample input range uniformly at 0.1 increments  
  2. xaxis = arange(bounds[0,0], bounds[0,1], 0.1)  
  3. yaxis = arange(bounds[1,0], bounds[1,1], 0.1)  
  4. # create a mesh from the axis  
  5. x, y = meshgrid(xaxis, yaxis)  
  6. # compute targets  
  7. results = objective(x, y)  
  8. # create a filled contour plot with 50 levels and jet color scheme  
  9. pyplot.contourf(x, y, results, levels=50cmap='jet'

最后,我們可以將在搜索過程中找到的每個解決方案繪制成一條由一條線連接的白點。 

  1. # plot the sample as black circles  
  2. solutions = asarray(solutions)  
  3. pyplot.plot(solutions[:, 0], solutions[:, 1], '.-', color='w'

綜上所述,下面列出了對測試問題執行Adam優化并將結果繪制在輪廓圖上的完整示例。 

  1. # example of plotting the adam search on a contour plot of the test function  
  2. from math import sqrt  
  3. from numpy import asarray  
  4. from numpy import arange  
  5. from numpy.random import rand  
  6. from numpy.random import seed  
  7. from numpy import meshgrid  
  8. from matplotlib import pyplot  
  9. from mpl_toolkits.mplot3d import Axes3D  
  10. # objective function  
  11. def objective(x, y):  
  12.  return x**2.0 + y**2.0  
  13. # derivative of objective function  
  14. def derivative(x, y):  
  15.  return asarray([x * 2.0, y * 2.0])  
  16. # gradient descent algorithm with adam  
  17. def adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2, eps=1e-8):  
  18.  solutions = list()  
  19.  # generate an initial point  
  20.  x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])  
  21.  score = objective(x[0], x[1])  
  22.  # initialize first and second moments  
  23.  m = [0.0 for _ in range(bounds.shape[0])]  
  24.  v = [0.0 for _ in range(bounds.shape[0])]  
  25.  # run the gradient descent updates  
  26.  for t in range(n_iter):  
  27.   # calculate gradient g(t)  
  28.   g = derivative(x[0], x[1])  
  29.   # build a solution one variable at a time  
  30.   for i in range(bounds.shape[0]):  
  31.    # m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)  
  32.    m[i] = beta1 * m[i] + (1.0 - beta1) * g[i]  
  33.    # v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2  
  34.    v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2  
  35.    # mhat(t) = m(t) / (1 - beta1(t))  
  36.    mmhat = m[i] / (1.0 - beta1**(t+1))  
  37.    # vhat(t) = v(t) / (1 - beta2(t))  
  38.    vvhat = v[i] / (1.0 - beta2**(t+1))  
  39.    # x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + ep)  
  40.    x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps)  
  41.   # evaluate candidate point  
  42.   score = objective(x[0], x[1])  
  43.   # keep track of solutions  
  44.   solutions.append(x.copy())  
  45.   # report progress  
  46.   print('>%d f(%s) = %.5f' % (t, x, score))  
  47.  return solutions 
  48. # seed the pseudo random number generator  
  49. seed(1)  
  50. # define range for input  
  51. bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])  
  52. # define the total iterations  
  53. n_iter = 60  
  54. # steps size  
  55. alpha = 0.02  
  56. # factor for average gradient  
  57. beta1 = 0.8 
  58. # factor for average squared gradient  
  59. beta2 = 0.999  
  60. # perform the gradient descent search with adam  
  61. solutions = adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2)  
  62. # sample input range uniformly at 0.1 increments  
  63. xaxis = arange(bounds[0,0], bounds[0,1], 0.1)  
  64. yaxis = arange(bounds[1,0], bounds[1,1], 0.1)  
  65. # create a mesh from the axis  
  66. x, y = meshgrid(xaxis, yaxis)  
  67. # compute targets  
  68. results = objective(x, y)  
  69. # create a filled contour plot with 50 levels and jet color scheme  
  70. pyplot.contourf(x, y, results, levels=50cmap='jet' 
  71. # plot the sample as black circles  
  72. solutions = asarray(solutions)  
  73. pyplot.plot(solutions[:, 0], solutions[:, 1], '.-', color='w' 
  74. # show the plot  
  75. pyplot.show() 

運行示例將像以前一樣執行搜索,但是在這種情況下,將創建目標函數的輪廓圖。

在這種情況下,我們可以看到在搜索過程中找到的每個解決方案都顯示一個白點,從最優點開始,逐漸靠近圖中心的最優點。

 

 

責任編輯:龐桂玉 來源: Python中文社區 (ID:python-china)
相關推薦

2020-12-07 11:23:32

Scrapy爬蟲Python

2021-01-29 11:25:57

Python爬山算法函數優化

2021-03-12 09:45:00

Python關聯規則算法

2020-12-17 10:00:16

Python協程線程

2021-01-11 09:33:37

Maven數目項目

2021-04-27 10:16:51

優化機器學習人工智能

2017-01-10 09:07:53

tcpdumpGET請求

2020-10-14 11:31:41

Docker

2020-10-27 10:43:24

Redis字符串數據庫

2019-05-08 14:02:52

MySQL索引查詢優化數據庫

2023-03-27 09:40:01

GoWebAssembl集成

2021-01-27 18:15:01

Docker底層宿主機

2021-06-07 09:51:22

原型模式序列化

2009-11-17 14:50:50

Oracle調優

2021-10-20 06:58:10

工具低代碼無代碼

2018-01-30 05:04:06

2021-04-19 23:29:44

MakefilemacOSLinux

2020-12-01 12:44:44

PythonHook鉤子函數

2020-11-24 11:50:52

Python文件代碼

2021-01-06 05:23:15

ServiceMesh網絡阿帕網
點贊
收藏

51CTO技術棧公眾號

伊人精品视频| 最新国产精品精品视频| 中文字幕一区二区三区视频| 91九色露脸| wwwxxx亚洲| 成人三级视频| 亚洲福利视频专区| 中文字幕av不卡在线| 激情av在线| 国产欧美精品在线观看| av一区观看| 欧美 亚洲 另类 激情 另类| 国产中文一区| 中文字幕亚洲自拍| 亚洲av成人片无码| 亚洲视频资源| 日本久久一区二区| 免费看欧美一级片| 日本在线免费中文字幕| 91麻豆国产在线观看| 91久久精品国产91久久| 在线视频一区二区三区四区| 午夜久久福利| 中文字幕日韩av| 亚洲天堂资源在线| 国产欧美日韩电影| 在线观看区一区二| 国产精品后入内射日本在线观看| 高清免费电影在线观看| 国产视频在线观看一区二区三区| 国产二区不卡| 国产视频在线免费观看| 日本亚洲三级在线| 欧美综合国产精品久久丁香| 麻豆一区二区三区精品视频| 首页国产精品| 国产亚洲精品美女久久久| 精品国产一区在线| 这里视频有精品| 91精品国产乱码久久蜜臀| 一本色道久久亚洲综合精品蜜桃 | 国产毛片在线视频| 日韩av电影一区| 欧美在线视频免费| 亚洲精品午夜久久久久久久| 欧美日韩视频一区二区三区| 精品国内亚洲在观看18黄| 91麻豆制片厂| 成人区精品一区二区婷婷| 一本大道久久加勒比香蕉| 精品少妇人妻一区二区黑料社区| 亚洲精品一级二级三级| 精品亚洲一区二区三区在线播放 | 精品国产午夜| 亚洲人永久免费| 亚洲女优在线观看| 日本一本不卡| 色偷偷偷亚洲综合网另类| 91麻豆制片厂| 亚洲自拍偷拍网| 欧美不卡视频一区发布| 清纯粉嫩极品夜夜嗨av| 亚洲午夜极品| 777午夜精品福利在线观看| 日本熟伦人妇xxxx| 久久亚洲精品伦理| 国产精品久久久久久婷婷天堂| 少妇一级淫片日本| 久久国产视频网| 91精品天堂| 手机看片国产1024| 久久精品视频免费| 一区一区视频| 黄色的视频在线观看| 欧美视频一二三| 国产高清视频网站| 欧美高清hd| 国产丝袜一区二区三区免费视频| 久久精品视频18| 国产精品久久久久久| 欧美黑人性生活视频| 欧美激情黑白配| 欧美aaaaaa午夜精品| 91视频国产精品| 色哟哟国产精品色哟哟| 国产日韩精品一区二区三区在线| 一区二区高清视频| 爱情岛论坛亚洲品质自拍视频网站 | 欧美va亚洲va| 欧美特黄一区二区三区| 国产精品99视频| 欧美精品久久久久久久免费观看| 亚洲天堂一区在线观看| 久久激情五月婷婷| 国产主播一区二区三区四区| www日韩tube| 亚洲一区二区在线免费看| 无码人妻丰满熟妇区五十路百度| 精品91福利视频| 亚洲美女久久久| 男女做暖暖视频| 亚洲制服av| 亚洲一区中文字幕| 久草在线青青草| 亚洲一区二区黄色| 麻豆三级在线观看| 国产毛片久久久| 精品国产一区二区三区久久久狼| 特一级黄色大片| 国产在线视频一区二区三区| 日产精品一线二线三线芒果| 欧美理论电影| 欧美日本视频在线| 久久精品视频18| 亚洲经典三级| 91传媒免费看| 性开放的欧美大片| 色综合天天综合在线视频| 少妇欧美激情一区二区三区| 日韩精品诱惑一区?区三区| 国内精品久久久久影院优| 91亚洲视频在线观看| 久久久亚洲精品一区二区三区 | 老司机午夜精品99久久| 精品在线视频一区二区三区| 国产原厂视频在线观看| 在线观看国产91| 好吊一区二区三区视频| 欧美在线亚洲综合一区| 成人激情视频在线观看| 99se视频在线观看| 欧洲国产伦久久久久久久| 人妻丰满熟妇av无码久久洗澡| 欧美特黄视频| 91一区二区三区| 成人免费看片| 91精品国产欧美一区二区| 久久一级免费视频| 麻豆一区二区三区| 水蜜桃亚洲一二三四在线| 欧美性xxx| 亚洲新中文字幕| 人人妻人人爽人人澡人人精品| 久久亚洲一区二区三区明星换脸| 国产二级片在线观看| 精品女人视频| 91av视频在线免费观看| 午夜在线视频免费| 欧美丝袜第一区| 久久久亚洲av波多野结衣| 亚洲综合精品| 日韩av电影免费在线观看| 国产日韩另类视频一区| 国产一区二区三区视频免费| 色老头在线视频| 国产精品欧美经典| 91国内在线播放| 偷拍欧美精品| 国产精成人品localhost| www在线观看黄色| 亚洲国产精品网站| 国产黄网在线观看| 国产精品久久综合| 黄色片子免费看| 国产精品扒开腿做爽爽爽软件| 国产精品久久7| 看黄在线观看| 亚洲色图13p| 一道本在线视频| 又紧又大又爽精品一区二区| 中文字幕在线视频播放| 亚洲影音先锋| 一区视频二区视频| 亚洲精品一区二区三区中文字幕| 91精品国产一区| 国产在线日本| 88在线观看91蜜桃国自产| 欧美日韩免费一区二区| 99re这里只有精品首页| xxxx一级片| 欧美 日韩 国产一区二区在线视频 | 美女av一区二区三区| 男人的天堂a在线| 色激情天天射综合网| caoporn91| 97se亚洲国产综合自在线不卡| 欧美成人免费高清视频| 亚洲成av人片乱码色午夜| 国产激情一区二区三区在线观看| 久久人体大尺度| 久久国产精品久久国产精品| 色视频免费在线观看| 欧美日韩成人综合天天影院| xxxx 国产| 国产精品天干天干在线综合| 95视频在线观看| 日本特黄久久久高潮| 黄色一级片国产| 国产亚洲一区二区三区不卡| 99电影网电视剧在线观看| 日韩漫画puputoon| 久久久久久亚洲精品| 91porn在线观看| 亚洲激情久久久| 国产又粗又猛又爽又黄的| 欧美午夜女人视频在线| 欧产日产国产v| 欧美国产日韩精品免费观看| 麻豆精品国产传媒av| 韩国视频一区二区| 青青草av网站| 国产欧美不卡| 欧美一二三不卡| 日韩欧美中文| 欧美在线日韩精品| 精品女人视频| 国产精品乱码| 国产日韩在线观看视频| 国产精品久久一区主播| 综合另类专区| 97色在线视频观看| 黄页网站在线| 欧美大片欧美激情性色a∨久久| 在线视频二区| 尤物精品国产第一福利三区| 四虎影视在线观看2413| 亚洲二区在线播放视频| 亚洲av无码国产精品久久不卡 | 青青草原一区二区| 麻豆视频在线观看免费网站黄| 色综合男人天堂| av网址在线看| 久久久国产成人精品| www在线播放| 中文字幕日韩欧美在线| 国产小视频在线观看| 亚洲欧美在线免费| 免费人成在线观看网站| 亚洲欧美国产一区二区三区| 天堂а√在线8种子蜜桃视频| 精品国产一区二区在线观看| 亚洲国产精品二区| 精品国产一区二区三区久久久蜜月 | 搜索黄色一级片| 国产精品电影一区二区| 亚洲 欧美 国产 另类| 国产精品久久久久影院色老大| 免费91在线观看| 中文字幕亚洲精品在线观看| 成人一级黄色大片| 一色桃子久久精品亚洲| 中文字幕五月天| 夜夜亚洲天天久久| 亚洲综合一二三| 色偷偷88欧美精品久久久| 波多野结衣黄色网址| 精品视频在线免费看| 国产理论片在线观看| 日韩亚洲欧美在线| 人妻精品一区二区三区| 日韩精品在线私人| 北条麻妃在线| 美女福利视频一区| 超碰在线99| 国产成人精品日本亚洲| 成人毛片免费| 99精品99久久久久久宅男| 国产一区调教| 日韩免费中文专区| 小处雏高清一区二区三区| 久久久久久久香蕉| 亚洲一区中文| 国产精品久久久久久久av福利| 国产成人av影院| 一级黄色片大全| 国产精品成人免费精品自在线观看| 欧美另类视频在线观看| 欧美日韩国产中文字幕| 在线免费观看视频网站| 精品少妇一区二区三区在线播放| 水莓100在线视频| 久久精品成人欧美大片古装| ****av在线网毛片| 国产精品吊钟奶在线| 日韩一区二区三区精品视频第3页| 久久久久九九九| 欧美91视频| 久久精品午夜福利| 国产成人小视频| 国产伦精品一区二区三区视频女| 亚洲精品国产a| 波多野结衣午夜| 日韩欧美电影一区| av在线三区| 91av视频在线观看| 日本在线视频一区二区三区| 欧美日韩亚洲一区二区三区四区| 91成人网在线观看| 亚洲人成无码www久久久| 国产91丝袜在线播放| 国产视频不卡在线| 偷拍与自拍一区| av在线免费在线观看| 伊人伊成久久人综合网站| av有码在线观看| 国产色视频一区| 精品在线观看入口| 国产高清www| 国产一区二区在线观看免费| 微拍福利一区二区| 天天综合网 天天综合色| 国产日韩欧美视频在线观看| 国产亚洲人成a一在线v站| www555久久| 99电影在线观看| 重囗味另类老妇506070| 亚洲一级免费在线观看| 久久女同性恋中文字幕| 久久视频免费在线观看| 欧美xxxxxxxxx| av网站在线看| 91精品久久久久久综合乱菊 | 综合欧美国产视频二区| 在线毛片观看| 国内精品久久国产| 很黄很黄激情成人| 亚洲欧美一区二区三区不卡| 国产精品国产三级国产a| 亚洲精品自拍偷拍| 99国产精品久久久久久久成人 | 欧美中文字幕| 伦理片一区二区| 亚洲国产欧美另类丝袜| 精品黑人一区二区三区在线观看| 久久精品99久久香蕉国产色戒| 欧美v亚洲v综合v国产v仙踪林| 日本在线观看一区| 日韩电影在线观看一区| 欧美 日韩 国产 成人 在线观看| 欧美性极品少妇精品网站| 深夜福利视频在线免费观看| 97视频在线观看播放| 蜜桃一区av| 女人和拘做爰正片视频| 久久午夜色播影院免费高清| 日本中文字幕在线| 亚洲人成电影在线播放| www.久久.com| 一区二区三区av在线| 久久99久久久欧美国产| 国产天堂av在线| 日韩三级视频在线观看| 激情网站在线| 九九久久99| 日韩成人一区二区三区在线观看| 丁香激情五月少妇| 欧美精品久久天天躁| 伊人精品影院| 国产一区免费| 日韩精品欧美成人高清一区二区| 91香蕉国产视频| 日韩一级完整毛片| 九色porny丨入口在线| 欧美亚洲丝袜| 蜜桃视频免费观看一区| 四虎精品免费视频| 亚洲国产精品成人va在线观看| 校园春色亚洲| 亚洲精品在线视频观看| 国产精品一区二区视频| 久久青青草视频| 综合久久五月天| 成人av动漫| 一本久道中文无码字幕av| 亚洲欧洲99久久| 天堂在线视频免费观看| 国产精品久久久久久亚洲调教| 香蕉久久网站| 久久精品综合视频| 欧美日韩一区二区三区在线看| 毛片网站在线看| 日本成人黄色| 粉嫩av一区二区三区| 久久国产乱子伦精品| 欧美精品生活片| 国产欧美日韩一区二区三区四区| 久久精品亚洲天堂| 精品久久久久久国产| 欧美一区二区三区| 久久精品人成| 国产一区二区三区四| 日本中文字幕第一页| 精品中文字幕在线2019| 国产成人一区| 国产精久久久久| 欧美日韩国产影片| 成人福利av| 国产精品videossex国产高清 | www.伊人久久| 欧美成人午夜激情|