用十位数转义局部最小值

2024-03-29 11:05:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我用tensorflow解这个方程组:

f1 = y - x*x = 0
f2 = x - (y - 2)*(y - 2) + 1.1 = 0

enter image description here

如果我选择错误的起始点(x,y)=(-1.3,2),那么我就进入局部极小值优化f1^2+f2^2,代码如下:

^{pr2}$

使用内置的tensorflow工具,我如何逃过这个局部极小值呢?从这个坏点开始,有没有其他的TF方法可以用来解这个方程?在


Tags: 工具方法代码tftensorflow错误局部方程组
2条回答

Tensorflow(TF)不包括内置的全局优化方法。对于非凸损失函数,TF中所有基于梯度的方法(如Adam)都能收敛到局部极小值。对于大型神经网络来说,这是可以接受的(如果不可取的话),因为在接近全局最小值时存在过拟合问题。在

对于这个特定的问题,您可能需要scipy的根解析例程:

https://docs.scipy.org/doc/scipy/reference/optimize.html#root-finding

目前,还没有一种内置tensorflow的全局优化方法。有一个通过^{}打开的关于scipy世界的窗口,但是它(当前?)只包装scipy的minimize,这是一个局部极小。在

但是,您仍然可以将tensorflow的执行结果视为任何其他函数,这些函数可以提供给您选择的优化器。假设您要试验scipy的^{}全局优化器。你可以写

import numpy as np
from scipy.optimize import basinhopping
import tensorflow as tf

v = tf.placeholder(dtype=tf.float32, shape=(2,))
x = v[0]
y = v[1]

f1 = y - x*x
f2 = x - (y - 2)*(y - 2) + 1.1
sq = f1 * f1 + f2 * f2
starting_point = np.array([-1.3, 2.0], np.float32)

with tf.Session() as sess:
  o = basinhopping(lambda x: sess.run(sq, {v: x}), x0=starting_point, T=10, niter=1000)
print(o.x)
# [0.76925635 0.63757862]

(我不得不调整basinhopping的温度和迭代次数,因为默认值通常不会让解离开作为起点的局部最小值的范围)。在

将tensorflow视为优化器的一个黑匣子会使优化器松了一口气,因为后者无法访问由tensorflow自动计算的渐变。从这个意义上说,它不是最佳的,尽管你仍然受益于GPU加速来计算你的函数。在

编辑

由于您可以显式地为basinhopping使用的局部最小值提供渐变,因此可以输入tensorflow的渐变结果:

^{pr2}$

由于某些原因,这比不提供梯度要慢得多,但也可能是提供了梯度,最小化算法不一样,因此比较可能没有意义。在

相关问题 更多 >