机器学习优化函数的直观介绍

优化是机器学习的研究人员最感兴趣的领域之一。在本文中,我想从简单的函数优化开始介绍,然后讨论找到只能找到局部最小值或难以找到最小值的较为复杂的函数,约束优化和几何优化问题。我也希望使用完全不同的方法进行优化:从基于梯度的方法开始,并结合进化算法和其他深度学习的最新方法。当然,我们要使用机器学习应用程序来展示它们,而我目的是展示数值优化中的问题和算法,并让你理解AdamOptimizer()的原理。

我专注于将不同的算法行为可视化,以理解其背后的数学和代码的直觉,因此在这一系列文章中会有很多的GIF图。如零阶方法在SciPy中的一阶方法Tensorflow中的一阶方法二阶方法

源代码:https://github.com/Rachnog/Optimization-Cookbook/tree/master/chapter1

优化函数

首先,我们来定义数据集。我决定从最简单的那个开始,它应该很容易优化,并用不同的工具显示一般的演练。你可以访问下方链接获取的函数和公式的完整列表,在这里我只选取一部分。

完整列表:https://www.sfu.ca/~ssurjano/optimization.html

可视化教程:http://tiao.io/notes/visualizing-and-animating-optimization-algorithms-with-matplotlib/

BOWL函数(呈碗状的函数)

Bohachevsky函数和Trid函数

def bohachevsky(x,y):

    return x ** 2 + 2 * y ** 2 -0.3 * np.cos(3 * 3.14 * x)-0.4 * np.cos(4 * 3.14 * y)+0.7

def trid(x,y):

    return(x-1)** 2 +(y-1)** 2  -  x * y

Bohachevsky函数(左)和Trid函数(在右边)  

PLATE函数(呈板状)

Booth、Matyas和Zakharov函数

def booth(x,y):

    return(x + 2 * y  -  7)** 2 +(2 * x + y  -  5)** 2

def matyas(x,y):

    return 0.26 *(x ** 2 + y ** 2) -  0.48 * x * y

def zakharov(x,y):

    return(x ** 2 + y ** 2)+(0.5 * x + y)** 2 +(0.5 * x + y)** 4

Booth(左),Matyas(中)和Zakharov(右)  

VALLEY函数(呈谷状)

Rozenbrock,Beale和Six Hump Camel函数

def rozenbrock(x,y):

    return(1-x)** 2 + 100 *(y  -  x ** 2)** 2

def beale(x,y):

    return(1.5  -  x + x * y)** 2 +(2.25  -  x + x * y ** 2)** 2 +(2.65  -  x + x * y ** 3) ** 2

def six_hump(x,y):

    return(4-2.1 * x ** 2 + x ** 4/3)* x ** 2 + x * y +(-4 + 4 * y ** 2)* y * * 2

Rozenbrock(左),Beale(中)和Six Hump Camel(右)函数  

算法

在这里,我们简单看一下SciPy和Tensorflow中优化的基本算法。

无梯度优化

通常我们的代价函数是嘈杂的或不可微分的,因此我们不能在这种情况下应用使用梯度的方法。在本教程中,我们比较了Nelder-Mead和Powell算法,它们不计算梯度。第一种方法构建(n + 1)维的单纯型(simplex),并在其上找到最小值,依次更新它。Powell方法在空间的每个基向量上进行一维搜索。使用SciPy实现如下:

minimize(fun ,x0 ,method ='Nelder-Mead' ,tol = None ,callback = make_minimize_cb )

callback用于保存中间结果(取自上方链接的可视化教程)。

一阶算法

你可能会从Tensorflow等机器学习框架中了解到这种算法。它们朝着反梯度的方向发展,得出函数的最小化。但这些算法移动到最小值的细节差别很大。我们使用Tensorflow来实现:梯度下降(有和没有),Adam和RMSProp。(完整代码在github中可以找到):

x = tf.Variable(8., trainable=True)

y = tf.Variable(8., trainable=True)

f = tf.add_n([

    tf.add(tf.square(x), tf.square(y)),

    tf.square(tf.add(tf.multiply(0.5, x), y)),

    tf.pow(tf.multiply(0.5, x), 4.) 

])

并按以下方式进行优化:

opt = tf.train.GradientDescentOptimizer(0.01)

grads_and_vars = opt.compute_gradients(f, [x, y])

clipped_grads_and_vars = [(tf.clip_by_value(g, xmin, xmax), v) for g, v in grads_and_vars]

train = opt.apply_gradients(clipped_grads_and_vars)

sess = tf.Session()

sess.run(tf.global_variables_initializer())

points_tf = []

for i in range(100):

    points_tf.append(sess.run([x, y]))

    sess.run(train)

在SciPy中我们使用共轭梯度法,牛顿共轭梯度法,截断牛顿法,序贯最小二乘设计法。你可以阅读更多关于这些算法的更多信息可以阅读Boyd and Vandenberghe写的凸优化

SciPy接口或多或少与零阶方法相同。

二阶算法

我们还将碰到一些使用二阶导数加速收敛的算法:dog-leg信赖域, nearly exact信赖域。这些算法顺序地解决搜索区域(通常是球状)被发现的局部最优问题。我们知道,这些算法需要Hessian(或它的近似),所以我们使用numdifftools库来计算它们并传入SciPy优化器:

from numdifftools import Jacobian, Hessian

def fun(x):

    return (x[0]**2 + x[1]**2) + (0.5*x[0] + x[1])**2 + (0.5*x[0] + x[1])**4

def fun_der(x):

    return Jacobian(lambda x: fun(x))(x).ravel()

def fun_hess(x):

    return Hessian(lambda x: fun(x))(x)

minimize(fun, x0, method='dogleg', jac=fun_der, hess=fun_hess)

无梯度优化

在本文中,我希望优先从视觉角度评估结果,我认为用你的眼睛轨迹来观察是非常重要,这样公式会更加清晰。

以下是部分可视化(完整https://imgur.com/a/pFPyx)。

通过Nelder-Mead和Powell优化的Bohachevsky,Matyas和Trid函数  

Jacobian优化

在这里你可以看到使用SciPy和Tensorflow的基于梯度方法的比较。其中一些算法可能看起来很“慢”,​​但这很大程度上取决于超参数的选择。

完整gif(imgur.com/a/cqN0Z,imgur.com/a/SWFwQ)

Booth,Rosenbrok和Six Hump函数(SciPy)  
Booth,Rosenbrok和Six Hump函数(Tensorflow)  

Hessian优化

使用二阶导数几乎立刻就能使我们得到很好的二次函数的最小值,但对于其他函数来说不像那样简单。例如对于Bohachevsky函数它接近最小值,但不精确。

其他函数的更多例子:https://imgur.com/a/PmyBq

Bohachevsky,Matyas和Trid的函数优化轨迹线  

超参数

学习率

首先,我想你已经注意到,像Adam和RMSprop这样流行的自适应算法与比SGD慢的多。但它们不是应该被设计成速度更快吗?这是因为这些损失曲面的学习率太低。参数必须分别针对每个问题进行调整。在下面的图片中,你可以看到如果将它的值增加到1会发生什么。

提高了学习率的Adam和RMSProp  

起始点

通常我们从一个随机点开始寻找最小值(或者像神经网络中的一些智能初始化块),但通常这不是正确的策略。在下面的例子中,我们可以看到,如果从错误的点开始,二阶方法甚至会发生偏移。在纯粹的优化问题中克服这个问题的方法之一是:使用全局搜索算法估计全局最小值的区域。

使用错误的起始点的二阶方法发生了严重的偏移  

机器学习

现在你可能想要尝试使用SciPy中的算法来在Tensorflow中训练机器学习模型。你甚至无需构建自定义优化器,因为tf.contrib.opt已经为你准备好了!它允许使用相同的算法以及参数:

vector = tf.Variable([7., 7.], 'vector')

# Make vector norm as small as possible.

loss = tf.reduce_sum(tf.square(vector))

optimizer = ScipyOptimizerInterface(loss, options={'maxiter': 100}, method='SLSQP')

with tf.Session() as session:

  optimizer.minimize(session)

结论

本文只是对优化领域的介绍,但从这些结果我们可以看出,这并不容易。使用二阶或自适应速率算法并不能保证我们收敛到最小值。现在你有一些直觉,了解所有这些算法的工作原理。

Rastrigin函数

原文网址:http://www.atyun.com/17210_机器学习优化函数的直观介绍&=3.html

关于人工智能,如果想了解更多,可关注微信公众号:atyun_com或者网站AiTechYun( http://www.atyun.com/),最快获得第一手信息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容