溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何用Python理解人工智能優(yōu)化算法

發(fā)布時(shí)間:2021-10-28 17:23:04 來(lái)源:億速云 閱讀:255 作者:柒染 欄目:編程語(yǔ)言

這篇文章給大家介紹如何用Python理解人工智能優(yōu)化算法,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

 概述

梯度下降是神經(jīng)網(wǎng)絡(luò)中流行的優(yōu)化算法之一。一般來(lái)說(shuō),我們想要找到最小化誤差函數(shù)的權(quán)重和偏差。梯度下降算法迭代地更新參數(shù),以使整體網(wǎng)絡(luò)的誤差最小化。

梯度下降是迭代法的一種,可以用于求解最小二乘問(wèn)題(線性和非線性都可以)。在求解機(jī)器學(xué)習(xí)算法的模型參數(shù),即無(wú)約束優(yōu)化問(wèn)題時(shí),梯度下降(Gradient  Descent)是最常采用的方法之一,另一種常用的方法是最小二乘法。在求解損失函數(shù)的最小值時(shí),可以通過(guò)梯度下降法來(lái)一步步的迭代求解,得到最小化的損失函數(shù)和模型參數(shù)值。反過(guò)來(lái),如果我們需要求解損失函數(shù)的最大值,這時(shí)就需要用梯度上升法來(lái)迭代了。在機(jī)器學(xué)習(xí)中,基于基本的梯度下降法發(fā)展了兩種梯度下降方法,分別為隨機(jī)梯度下降法和批量梯度下降法。

該算法在損失函數(shù)的梯度上迭代地更新權(quán)重參數(shù),直至達(dá)到最小值。換句話說(shuō),我們沿著損失函數(shù)的斜坡方向下坡,直至到達(dá)山谷?;舅枷氪笾氯鐖D3.8所示。如果偏導(dǎo)數(shù)為負(fù),則權(quán)重增加(圖的左側(cè)部分),如果偏導(dǎo)數(shù)為正,則權(quán)重減小(圖中右半部分)  學(xué)習(xí)速率參數(shù)決定了達(dá)到最小值所需步數(shù)的大小。

如何用Python理解人工智能優(yōu)化算法

圖3.8 隨機(jī)梯度最小化的基本思想

如何用Python理解人工智能優(yōu)化算法

誤差曲面

尋找全局最佳方案的同時(shí)避免局部極小值是一件很有挑戰(zhàn)的事情。這是因?yàn)檎`差曲面有很多的峰和谷,如圖3.9所示。誤差曲面在一些方向上可能是高度彎曲的,但在其他方向是平坦的。這使得優(yōu)化過(guò)程非常復(fù)雜。為了避免網(wǎng)絡(luò)陷入局部極小值的境地,通常要指定一個(gè)沖量(momentum)參數(shù)。

如何用Python理解人工智能優(yōu)化算法

圖3.9 典型優(yōu)化問(wèn)題的復(fù)雜誤差曲面

我很早就發(fā)現(xiàn),使用梯度下降的反向傳播通常收斂得非常緩慢,或者根本不收斂。在編寫(xiě)第一個(gè)神經(jīng)網(wǎng)絡(luò)時(shí),我使用了反向傳播算法,該網(wǎng)絡(luò)包含一個(gè)很小的數(shù)據(jù)集。網(wǎng)絡(luò)用了3天多的時(shí)間才收斂到一個(gè)解決方案。幸虧我采取一些措施加快了處理過(guò)程。

說(shuō)明 雖然反向傳播相關(guān)的學(xué)習(xí)速率相對(duì)較慢,但作為前饋算法,其在預(yù)測(cè)或者分類(lèi)階段是相當(dāng)快速的。

如何用Python理解人工智能優(yōu)化算法

隨機(jī)梯度下降

傳統(tǒng)的梯度下降算法使用整個(gè)數(shù)據(jù)集來(lái)計(jì)算每次迭代的梯度。對(duì)于大型數(shù)據(jù)集,這會(huì)導(dǎo)致冗余計(jì)算,因?yàn)樵诿總€(gè)參數(shù)更新之前,非常相似的樣本的梯度會(huì)被重新計(jì)算。隨機(jī)梯度下降(SGD)是真實(shí)梯度的近似值。在每次迭代中,它隨機(jī)選擇一個(gè)樣本來(lái)更新參數(shù),并在該樣本的相關(guān)梯度上移動(dòng)。因此,它遵循一條曲折的通往極小值的梯度路徑。在某種程度上,由于其缺乏冗余,它往往能比傳統(tǒng)梯度下降更快地收斂到解決方案。

說(shuō)明 隨機(jī)梯度下降的一個(gè)非常好的理論特性是,如果損失函數(shù)是凸的 43 ,那么保證能找到全局最小值。

代碼實(shí)踐

理論已經(jīng)足夠多了,接下來(lái)敲一敲實(shí)在的代碼吧。

一維問(wèn)題

假設(shè)我們需要求解的目標(biāo)函數(shù)是:

()=2+1f(x)=x2+1

如何用Python理解人工智能優(yōu)化算法

顯然一眼就知道它的最小值是 =0x=0 處,但是這里我們需要用梯度下降法的 Python 代碼來(lái)實(shí)現(xiàn)。

#!/usr/bin/env python # -*- coding: utf-8 -*- """ 一維問(wèn)題的梯度下降法示例 """   def func_1d(x):  """  目標(biāo)函數(shù)  :param x: 自變量,標(biāo)量  :return: 因變量,標(biāo)量  """  return x ** 2 + 1   def grad_1d(x):  """  目標(biāo)函數(shù)的梯度  :param x: 自變量,標(biāo)量  :return: 因變量,標(biāo)量  """  return x * 2   def gradient_descent_1d(grad, cur_x=0.1, learning_rate=0.01, precision=0.0001, max_iters=10000):  """  一維問(wèn)題的梯度下降法  :param grad: 目標(biāo)函數(shù)的梯度  :param cur_x: 當(dāng)前 x 值,通過(guò)參數(shù)可以提供初始值  :param learning_rate: 學(xué)習(xí)率,也相當(dāng)于設(shè)置的步長(zhǎng)  :param precision: 設(shè)置收斂精度  :param max_iters: 最大迭代次數(shù)  :return: 局部最小值 x*  """  for i in range(max_iters):  grad_cur = grad(cur_x)  if abs(grad_cur) < precision:  break # 當(dāng)梯度趨近為 0 時(shí),視為收斂  cur_x = cur_x - grad_cur * learning_rate  print("第", i, "次迭代:x 值為 ", cur_x)   print("局部最小值 x =", cur_x)  return cur_x   if __name__ == '__main__':  gradient_descent_1d(grad_1d, cur_x=10, learning_rate=0.2, precision=0.000001, max_iters=10000)

關(guān)于如何用Python理解人工智能優(yōu)化算法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI