zoukankan      html  css  js  c++  java
  • 机器学习中优化算法【需整理】

    1、怎么证明凸函数, 二阶Hessian矩阵半正定,函数为凸函数

        证明参考:https://math.stackexchange.com/questions/946156/proving-convexity-of-a-function-whose-hessian-is-positive-semidefinite-over-a-co 

    以简单的线性回归为例,

    样本回归模型:

    平方损失函数:

    1、最小二乘法

         最小二乘法是求解令损失函数最小的参数的过程。主要就是对每个参数求导,令结果为0,所求的参数即可满足令损失函数最小

    2、梯度下降

    梯度下降法是一种迭代法,先给定一个eta ,然后向Delta下降最快的方向调整eta ,在若干次迭代之后找到局部最小。梯度下降法的缺点是到最小点的时候收敛速度变慢,并且对初始点的选择极为敏感,其改进大多是在这两方面下功夫。

    梯度下降分为批量梯度下降、随机梯度下降和小批量梯度下降

    首先当我们只有一个数据点(x,y)的时候,J的偏导数是:

    则对所有数据点,上述损失函数的偏导(累和)为:

     

    再最小化损失函数的过程中,需要不断反复的更新weights使得误差函数减小,更新过程如下:

     

    三种梯度下降的python实现

    1、批量梯度下降:

         批量即选择全部样本进行迭代,当样本数很大时,将会非常慢

    2、随机梯度下降:

     随机梯度下降随机选择一个样本进行迭代,容易受噪声/离群点/异常值的影响非常大,所以采用很小的learning rate

    3、小批量梯度下降:

    每次迭代时使用一批数据,这批数据可以自行选择也可以随机产生,大小也可自由自定,越大越接近批量梯度下降算法,越小越接近随机梯度下降算法

    梯度下降过程中学习率是不改变的,当太大的时候可能错过最优点,当太小收敛太慢,所以产生了一种动态修改学习率的方式[Backtracking line search],初始的学习率很大,随着不断学习,学习率慢慢减小

    引用于 https://www.cnblogs.com/fstang/p/4192735.html
    # -*- coding: cp936 -*-
    #optimization test, y = (x-3)^2
    from matplotlib.pyplot import figure, hold, plot, show, xlabel, ylabel, legend
    def f(x):
            "The function we want to minimize"
            return (x-3)**2
    def f_grad(x):
            "gradient of function f"
            return 2*(x-3)
    x = 0
    y = f(x)
    err = 1.0
    maxIter = 300
    curve = [y]
    it = 0
    step = 0.1
    #下面展示的是我之前用的方法,看上去貌似还挺合理的,但是很慢
    while err > 1e-4 and it < maxIter:
        it += 1
        gradient = f_grad(x)
        new_x = x - gradient * step
        new_y = f(new_x)
        new_err = abs(new_y - y)
        if new_y > y: #如果出现divergence的迹象,就减小step size
            step *= 0.8
        err, x, y = new_err, new_x, new_y
        print 'err:', err, ', y:', y
        curve.append(y)
    
    print 'iterations: ', it
    figure(); hold(True); plot(curve, 'r*-')
    xlabel('iterations'); ylabel('objective function value')
    
    #下面展示的是backtracking line search,速度很快
    x = 0
    y = f(x)
    err = 1.0
    alpha = 0.25
    beta = 0.8
    curve2 = [y]
    it = 0
    
    while err > 1e-4 and it < maxIter:
        it += 1
        gradient = f_grad(x)
        step = 1.0
        while f(x - step * gradient) > y - alpha * step * gradient**2:
            step *= beta
        x = x - step * gradient
        new_y = f(x)
        err = y - new_y
        y = new_y
        print 'err:', err, ', y:', y
        curve2.append(y)
    
    print 'iterations: ', it
    plot(curve2, 'bo-')
    legend(['gradient descent I used', 'backtracking line search'])
    show()
    View Code

    3、牛顿法

    牛顿法与梯度下降的对比?

    参考:https://www.zhihu.com/question/19723347

    牛顿法是二阶收敛,梯度下降是一阶收敛,二阶收敛要比一阶收敛快, 为什么?

    我觉着可以从泰勒展开的角度来分析:当是二阶的时候表示泰勒取到了二次项,此时更接近真实的函数,所以会比取一次收敛的快

     

    牛顿法迭代公式,可由泰勒展开推出

    梯度下降是一种特殊的牛顿法,当海参矩阵为单位矩阵是,牛顿法就变成梯度下降了。

     

     4、拟牛顿法

     因为在牛顿法中出现了海参矩阵,这个矩阵的计算比较麻烦,所以想办法不来直接求海参矩阵,而用其他的方式来替代,也就是牛顿方法

    参考:

    http://www.hankcs.com/ml/l-bfgs.html

    https://applenob.github.io/crf.html

  • 相关阅读:
    聊聊WS-Federation
    用双十一的故事串起碎片的网络协议(上)
    责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析
    最小化局部边际的合并聚类算法(中篇)
    最小化局部边际的合并聚类算法(上篇)
    UVaLive 7371 Triangle (水题,判矩形)
    UVaLive 7372 Excellence (水题,贪心)
    POJ 3312 Mahershalalhashbaz, Nebuchadnezzar, and Billy Bob Benjamin Go to the Regionals (水题,贪心)
    UVa 1252 Twenty Questions (状压DP+记忆化搜索)
    UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/9223119.html
Copyright © 2011-2022 走看看