四、邏輯回歸
5、梯度下降法
(1)梯度解釋
偏導數:簡單來說是對於一個多元函數,選定一個自變量並讓其他自變量保持不變,只考察因變量與選定自變量的變化關系。
梯度:梯度的本意是一個向量,由函數對每個參數的偏導組成,表示某一函數在該點處的方向導數沿着該方向取得最大值,即函數在該點處沿着該方向變化最快,變化率最大。
梯度向量的方向即為函數值增長最快的方向,沿着梯度方向可以最快地找到函數的最大值,而我們要求誤差的最小值,所以在梯度下降中我們要沿着梯度相反的方向:
其中0<=η<=1為學習率,學習率的大小會對我們的算法產生影響,學習率太小,逼近極值點的速度慢,學習率太大,逼近極值點的速度快,但容易產生震盪。
(2)梯度下降算法思想:
梯度下降是一種非常通用的優化算法,能夠為大范圍的問題找到最優解。
梯度下降的中心思想就是迭代地調整參數從而使損失函數最小化。
假設你迷失在山上的迷霧中,你能感覺到的只有你腳下路面的坡度。快速到達山腳的一個策略就是沿着最陡的方向下坡,這就是梯度下降的做法。即通過測量參數向量 θ 相關的損失函數的局部梯度,並不斷沿着降低梯度的方向調整,直到梯度降為 0 ,達到最小值。
梯度下降公式如下:
對應到每個權重公式為:
其中 ,η 為學習率,是 0 到 1 之間的值,是個超參數,需要我們自己來確定大小。
(3)算法原理:
在傳統機器學習中,損失函數通常為凸函數,假設此時只有一個參數,則損失函數對參數的梯度即損失函數對參數的導數。
①如果剛開始參數初始在最優解的左邊,如圖 5.3.1 。很明顯,這個時候損失函數對參數的導數是小於 0 的,而學習率是一個 0 到 1 之間的數,此時按照公式更新參數,初始的參數減去一個小於 0 的數是變大,也就是在坐標軸上往右走,即朝着最優解的方向走。
圖 5.3.1 圖5.3.2
②如果參數初始在最優解的右邊,如圖5.3.2。此時按照公式更新,參數將會朝左走,即最優解的方向。
所以,不管剛開始參數初始在何位置,按着梯度下降公式不斷更新,參數都會朝着最優解的方向走。
(4)梯度下降算法流程
1)隨機初始參數
2)確定學習率
3)求出損失函數對參數梯度
4)按照公式更新參數
5)重復 3) 4)直到滿足終止條件(如:損失函數或參數更新變化值小於某個閾值,或者訓練次數達到設定閾值)
(5)代碼實現梯度下降
要求:使用 Python 實現梯度下降算法,並損失函數最小值時對應的參數theta
,theta
會返回給外部代碼,由外部代碼來判斷theta
是否正確。
# -*- coding: utf-8 -*- import numpy as np import warnings warnings.filterwarnings("ignore") def gradient_descent(initial_theta,eta=0.05,n_iters=1000,epslion=1e-8): ''' 梯度下降 :param initial_theta: 參數初始值,類型為float :param eta: 學習率,類型為float :param n_iters: 訓練輪數,類型為int :param epslion: 容忍誤差范圍,類型為float :return: 訓練后得到的參數 ''' theta = initial_theta i_iter = 0 while i_iter < n_iters: gradient = 2*(theta-3) last_theta = theta theta = theta - eta*gradient if(abs(theta-last_theta)<epslion): break i_iter +=1 return theta