梯度下降法

梯度下降法

本文主要是爲了講解 梯度下降法 的原理和實踐,至於什麼是梯度下降法,他能做什麼,相信百度一下你就都知道了,所以下面進入正題

從一元二次方程開始

梯度下降法主要是用來求解某個方程的最小值,這裏我們以 凹一元二次方程爲例。

準備數據

這裏我們用到 matplotlibnumpy,如果你對這兩個庫不瞭解也沒關係,我們主要是藉助它來進行講解,不會過多涉及相關的東西

import matplotlib.pyplot as plt
import numpy as np
# 生成一個等差數列 plot_x
plot_x = np.linspace(1,5,20)
# plot_x 平方 再加2 生成一個數列 plot_y
plot_y = (plot_x-3)**2+2
# 將 plot_x  plot_y 對應位置作爲一個點的 x,y 座標,那麼就可以畫出如下圖的一條一元二次方程的曲線
plt.plot(plot_x,plot_y)
plt.show()

損失函數 和 梯度函數

這裏我們首先明確兩個概念:

  • 損失函數:即是我們這個一元二次方程,爲什麼叫損失函數呢?一般來說,我們都希望將損失降低到最小,所以求最小值,就是爲了將損失減到最少咯,所以。。。這裏就是我自己想當然把。。。哈哈

  • 梯度函數:一元二次方程來說,就是某個點的導數,可以指導我們的函數該往哪個方向走。並且梯度總是指向損失函數變大的方向,這裏因爲是梯度下降,所以每次迭代的值應該是梯度的負方向

編程實現梯度下降法

# 梯度函數
def dJ(x):
    return (x-3)*2

# 損失函數    
def J(x):
    return (x-3)**2+2


x = 0.1
# 記錄每次梯度下降的點
history_x=[x]

i_iter=1

# 進行梯度迭代
while i_iter < 1e4:
    i_iter += 1
    dj = dJ(x)
    last_x = x
    x =x -0.1*dj
    history_x.append(x)
    
    # 如果迭代精確的達到,則結束結算     
    if abs(J(x)-J(last_x))<0.0000000001 :
        break

history_y = J(np.array(history_x))

plt.plot(plot_x,plot_y)
plt.plot(history_x,history_y,color='r',marker='+')
plt.show()

後記

本文講的並不如何易懂 和 通俗,不過因爲 一元二次的 梯度應該是相對很容易的,所以這裏也就不囉嗦了,梯度下降其實也不外呼這個原理,只是可能損失函數會不太一樣,那麼梯度函數也就跟着不太一樣了,但是到最後都是通過這兩個函數來進行迭代達到最後的標準求出最優解

梯度下降法容易陷入局部最優解的而達不到全局最優解,所以可能需要隨機選取多個起始點進行梯度迭代,這樣全量的梯度下降法也叫做 批量梯度下降法

對於多元二次方程,因爲多元會使得 批量梯度下降法 的梯度函數計算的非常緩慢,所以可以採用隨機梯度下降,並且隨機梯度下降不容易陷入局部最優解的的陷阱,所謂的隨機梯度就是隨機選取多元二次方程的 某元進行一次迭代。

其實梯度函數是不容易求得,所以如何驗證你的梯度函數是否正確也就顯的相當重要了。。。。然後。。。這裏一句兩句就說不明白了。。。還是留個讀者你把

嗯,當作知識點看看就好,別太較真,寫的確實不咋樣。。。哈哈!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章