1. 程式人生 > 其它 >優化演算法——梯度下降法

優化演算法——梯度下降法

一、優化演算法概述

    優化演算法所要求解的是一個問題的最優解或者近似最優解。現實生活中有很多的最優化問題,如最短路徑問題,如組合優化問題等等,同樣,也存在很多求解這些優化問題的方法和思路,如梯度下降方法。

    機器學習在近年來得到了迅速的發展,越來越多的機器學習演算法被提出,同樣越來越多的問題利用機器學習演算法得到解決。優化演算法是機器學習演算法中使用到的一種求解方法。在機器學習,我們需要尋找輸入特徵與標籤之間的對映關係,在尋找這樣的對映關係時,有一條重要的原則就是使得尋找到的對映結果與原始標籤之間的誤差最小。機器學習問題歸納起來就是把一個學習的問題轉化為優化的問題,機器學習演算法的本質就是如何對問題抽象建模,使一個學習的問題變為一個可求解的優化問題。

    優化的演算法有很多種,從最基本的梯度下降法到現在的一些啟發式演算法,如遺傳演算法(GA),差分演化演算法(DE),粒子群演算法(PSO)和人工蜂群演算法(ABC)。

二、梯度下降法

1、基本概念

    梯度下降法又被稱為最速下降法(Steepest descend method),其理論基礎是梯度的概念。梯度與方向導數的關係為:梯度的方向與取得最大方向導數值的方向一致,而梯度的模就是函式在該點的方向導數的最大值。對於一個無約束的優化問題:

例如

2、演算法流程

梯度下降法的流程:

1、初始化:隨機選取取值範圍內的任意數
2、迴圈操作:
       計算梯度;
       修改新的變數;
       判斷是否達到終止:如果前後兩次的函式值差的絕對值小於閾值,則跳出迴圈;否則繼續;
3、輸出最終結果

與梯度下降法對應的是被稱為梯度上升的演算法,主要的區別就是在梯度的方向上,一個方向是下降最快的方向,相反的就是梯度上升最快的方法。主要用來求解最大值問題:

梯度的更新公式為:

下面以

為例,給出一下的Java程式:

public class SteepestDescend {
	public static double alpha = 0.5;// 迭代步長
	public static double e = 0.00001;// 收斂精度

	public double x0;
	public double y0;

	public double getY(double x) {
		return (x * x - 3 * x + 2);
	}

	public double getDerivative(double x) {
		return (2 * x - 3);
	}

	public void init() {
		x0 = 0;
		y0 = this.getY(x0);
	}

	public double getSteepestDescend() {
		double min = 0;
		double x = x0;
		double y = y0;
		double y1;
		double temp = 0;
		/*
		 * 做梯度運算
		 */
		while (true) {
			temp = this.getDerivative(x);
			x = x - alpha * temp;
			y1 = this.getY(x);
			if (Math.abs(y1 - y) <= e) {
				break;
			}
			y = y1;
			min = y;
		}
		return min;
	}
}

主函式:

public class TestMain {
	public static void main(String args[]) {
		double min;
		SteepestDescend sd = new SteepestDescend();
		sd.init();
		min = sd.getSteepestDescend();
		System.out.println("最小值:"+ min );
	}

}