最优化算法-梯度下降

梯度下降算法,参考Edwin《最优化导论》8.2章节,算法采用go语言实现。

此处算法仍然存在疑惑,主要是获取梯度下降时如何确定步长,即使采用割线法获取最优步长,那么割线法的初始值又如何确定??

下面程序中虽然采用了牛顿法获取极值,但非常依赖初始取值范围!!

/*****************************************
 * FileName  : grad.go
 * Author    : fredric
 * Date      : 2017.09.01
 * Note      : 梯度算法
 * History   :
*****************************************/
package grad

import(
    "fmt"
    "math"
)

//无法采用牛顿方法求得极值,主要原因在于无法确定初始值,造成导数偏差很大
func _get_argmin_newton(x1, x2, x3, grad_x1, grad_x2, grad_x3 float64) float64 {

    fmt.Printf("_get_argmin input value %f,%f,%f,%f,%f,%f\n", x1, x2, x3, grad_x1, grad_x2, grad_x3)

    //f(x - a*delta) = (x1 - a * grad_x1 - 4)^4 + (x2 - a * grad_x2 - 3)^2 + 4 * (x3 - a*grad_x3 + 5)^4
    //f‘(x - a*delta) = 4 * grad_x1 * (x1 - a * grad_x1 - 4)^3
    //                + 2 * grad_x2 * (x2 - a * grad_x2 - 3)
    //                + 16* grad_x3 * (x3 - a*grad_x3 + 5)^3
    //f‘‘(x - a*delta)= 12 * grad_x1^2 * (x1 - a * grad_x1 - 4)^2
    //                + 2  * grad_x2^2 * a
    //                + 48 * grad_x3^2 * (x3 - a*grad_x3 + 5)^2
    //采用牛顿法求取f(a)的最小值

    //此处的初始值还是比较疑惑,因为初始值取不对,结果差太远
    var a0 float64 = 0.0002
    var a1 float64 = 0.0005
    delta := 0.0005

    for math.Abs(a1 - a0) > delta {

        a0 = a1

        //fmt.Printf("a0: %f\n" , a0)
        //fmt.Printf("grad_x2: %f\n" , grad_x2)
        //fmt.Printf("grad_x2 * a0: %f\n" , grad_x2 * a0)
        //fmt.Printf("grad_x2 * 0.2: %f\n" , grad_x2 * 0.2)

        f_1_v := 4 * grad_x1 * (x1 - a0 * grad_x1 - 4)* (x1 - a0 * grad_x1 - 4)* (x1 - a0 * grad_x1 - 4) +
        2 * grad_x2 * (x2 - a0 * grad_x2 - 3) +
        16* grad_x3 * (x3 - a0 * grad_x3 + 5)* (x3 - a0 * grad_x3 + 5) * (x3 - a0 * grad_x3 + 5)

        f_2_v := 12 * grad_x1 * grad_x1 * (x1 - a1 * grad_x1 - 4)* (x1 - a1 * grad_x1 - 4) + 2  * grad_x2* grad_x2 * a1 + 48 * grad_x3* grad_x3 * (x3 - a1 * grad_x3 + 5)* (x3 - a1 * grad_x3 + 5)

        a1 = a0 - f_1_v / f_2_v

        //fmt.Printf("----------abs = %f\n", math.Abs(a1 - a0))

        fmt.Printf("step value = %f f_1_v = %f, f_2_v = %f\n", (a0 + a1)/2, f_1_v, f_2_v)
    }

    return (a0 + a1)/2
}

//采用常量方式求极值
func _get_argmin_const(x1, x2, x3, grad_x1, grad_x2, grad_x3 float64) float64{

    /*
    * 不是很搞的清楚,当采用快速下降算法时如何确定固定步长,网上有一个说法实践是正确的
    * 即满足李普希兹条件存在L>0使得|f(x1)-f(x2)|<=L|x1-x2|,步长取1/L
    * 下面这个例子由于存在x3这个高阶,所以如果步长取大的话,完全没有办法计算
    */

    return 0.0004
}

func DoGradAlgorithm(){

    //计算f(x1,x2,x3) = (x1 - 4)^4 + (x2 - 3)^2 + 4*(x3 + 5)^4
    //所谓梯度本质上也是导数,只是针对多维度上,取了各个维度偏导数,组成向量;
    //最速下降法就是在每次迭代时取当前负梯度方向的能获取的函数数最小值

    //初始值x0 = [4, 2, -1]
    x1 := 4.0
    x2 := 2.0
    x3 := -1.0

    //取三次迭代
    for i := 0; i < 4; i++ {

        grad_x1 := 4 * (x1 - 4)*(x1 - 4)*(x1 - 4)
        grad_x2 := 2 * (x2 - 3)
        grad_x3 := 16 * (x3 + 5)* (x3 + 5)* (x3 + 5)

        a := _get_argmin_newton(x1,x2,x3, grad_x1, grad_x2, grad_x3)

        fmt.Printf("grad_x1 = %f, grad_x2 = %f, grad_x3 = %f\n", grad_x1, grad_x2, grad_x3)

        x1 = x1 - a * grad_x1
        x2 = x2 - a * grad_x2
        x3 = x3 - a * grad_x3

        fmt.Printf("x1 = %f, x2 = %f, x3 = %f\n", x1, x2, x3)

    }
}
时间: 2024-12-22 10:55:30

最优化算法-梯度下降的相关文章

优化算法—梯度下降

转自:https://www.cnblogs.com/shixiangwan/p/7532858.html 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战. 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent) 随机梯度下降

[算法] 优化算法 梯度下降

导数 导数是一个数,函数y(x)在x0点的导数y'(x0)反应了在x0处y随x的变化快慢 微分 微分指函数值的微小变化 在x0可微:在x0点y和x的微分成线性关系(只与该点函数值有关) 导数可看做函数的微分与自变量的微分之商,故导数又称微商 偏导数 函数在一点处沿坐标轴的变化率 方向导数 函数在一点处沿射线方向的变化率 偏导数是双侧的,方向导数是单侧的.函数f(x,y)在一点处对x偏导数等于沿x轴正向的方向导数 梯度 梯度是一个向量 方向导数沿梯度方向取最大值,最大值为梯度的模,即沿梯度方向函数

深度解读最流行的优化算法:梯度下降

深度解读最流行的优化算法:梯度下降 By 机器之心2016年11月21日 15:08 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战.(本文的中文版 PDF 下载地址) 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent)

七月算法--12月机器学习在线班-第六次课笔记—梯度下降和拟牛顿

七月算法--12月机器学习在线班-第六次课笔记—梯度下降和拟牛顿 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

梯度下降优化算法综述

本文翻译自Sebastian Ruder的"An overview of gradient descent optimization algoritms",作者首先在其博客中发表了这篇文章,其博客地址为:An overview of gradient descent optimization algoritms,之后,作者将其整理完放在了arxiv中,其地址为:An overview of gradient descent optimization algoritms,在翻译的过程中以

随机梯度下降的逻辑回归算法(SGDLR)

由于第一次实验的实验报告不在这台机器,先写这一算法吧. SGDLR(the Stochastic Gradient Descent for Logistic Regression),要讲解这一算法,首先要把名字拆为几块. 1 随机   2 梯度下降   3逻辑回归 先贴一篇文章:http://blog.csdn.net/zouxy09/article/details/20319673 这篇文章中解释的还不错. 其实这一算法,通俗来讲是这样子的: 1.手中肯定有很多带有label标记的数据,这是训

机器学习最常用优化之一——梯度下降优化算法综述

转自:http://www.dataguru.cn/article-10174-1.html 梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法.几乎当前每一个先进的(state-of-the-art)机器学习库或者深度学习库都会包括梯度下降算法的不同变种实现.但是,它们就像一个黑盒优化器,很难得到它们优缺点的实际解释.这篇文章旨在提供梯度下降算法中的不同变种的介绍,帮助使用者根据具体需要进行使用. 这篇文章首先介绍梯度下降算法的三种框架,然后介绍它们所存在的

梯度下降优化算法综述(翻译)

原文链接:http://sebastianruder.com/optimizing-gradient-descent 原文题目:An overview of gradient descent optimization algorithms 博文地址:http://blog.csdn.net/wangxinginnlp/article/details/50974594 梯度下降是最流行的优化算法之一并且目前为止是优化神经网络最常见的算法.与此同时,每一个先进的深度学习库都包含各种算法实现的梯度下降

梯度下降和EM算法,kmeans的em推导

I. 牛顿迭代法给定一个复杂的非线性函数f(x),希望求它的最小值,我们一般可以这样做,假定它足够光滑,那么它的最小值也就是它的极小值点,满足f′(x0)=0,然后可以转化为求方程f′(x)=0的根了.非线性方程的根我们有个牛顿法,所以 然而,这种做法脱离了几何意义,不能让我们窥探到更多的秘密.我们宁可使用如下的思路:在y=f(x)的x=xn这一点处,我们可以用一条近似的曲线来逼近原函数,如果近似的曲线容易求最小值,那么我们就可以用这个近似的曲线求得的最小值,来近似代替原来曲线的最小值了: 显然