您的位置:首页 > 其它

机器学习中导数最优化方法(基础篇)

2016-03-29 13:07 295 查看

1. 前言

熟悉机器学习的童鞋都知道,优化方法是其中一个非常重要的话题,最常见的情形就是利用目标函数的导数通过多次迭代来求解无约束最优化问题。实现简单,coding 方便,是训练模型的必备利器之一。这篇博客主要总结一下使用导数的最优化方法的几个基本方法,梳理梳理相关的数学知识,本人也是一边写一边学,如有问题,欢迎指正,共同学习,一起进步。

2. 几个数学概念

1) 梯度(一阶导数)

考虑一座在 (x1, x2) 点高度是 f(x1, x2) 的山。那么,某一点的梯度方向是在该点坡度最陡的方向,而梯度的大小告诉我们坡度到底有多陡。注意,梯度也可以告诉我们不在最快变化方向的其他方向的变化速度(二维情况下,按照梯度方向倾斜的圆在平面上投影成一个椭圆)。对于一个含有 n 个变量的标量函数,即函数输入一个 n 维 的向量,输出一个数值,梯度可以定义为:

# Code from Chapter 11 of Machine Learning: An Algorithmic Perspective
# by Stephen Marsland (http://seat.massey.ac.nz/personal/s.r.marsland/MLBook.html)

# The conjugate gradients algorithm

from numpy import *

def Jacobian(x):
#return array([.4*x[0],2*x[1]])
return array([x[0], 0.4*x[1], 1.2*x[2]])

def Hessian(x):
#return array([[.2,0],[0,1]])
return array([[1,0,0],[0,0.4,0],[0,0,1.2]])

def CG(x0):

i=0
k=0

r = -Jacobian(x0)
p=r

betaTop = dot(r.transpose(),r)
beta0 = betaTop

iMax = 3
epsilon = 10**(-2)
jMax = 5

# Restart every nDim iterations
nRestart = shape(x0)[0]
x = x0

while i < iMax and betaTop > epsilon**2*beta0:
j=0
dp = dot(p.transpose(),p)
alpha = (epsilon+1)**2
# Newton-Raphson iteration
while j < jMax and alpha**2 * dp > epsilon**2:
# Line search
alpha = -dot(Jacobian(x).transpose(),p) / (dot(p.transpose(),dot(Hessian(x),p)))
print "N-R",x, alpha, p
x = x + alpha * p
j += 1
print x
# Now construct beta
r = -Jacobian(x)
print "r: ", r
betaBottom = betaTop
betaTop = dot(r.transpose(),r)
beta = betaTop/betaBottom
print "Beta: ",beta
# Update the estimate
p = r + beta*p
print "p: ",p
print "----"
k += 1

if k==nRestart or dot(r.transpose(),p) <= 0:
p = r
k = 0
print "Restarting"
i +=1

print x

x0 = array([-2,2,-2])
CG(x0)


参考资料:

[1] Machine Learning: An Algorithmic Perspective, chapter 11
[2] 最优化理论与算法(第2版),陈宝林
[3] wikipedia
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: