如何使用 TensorFlow 求函数最小值

Spe*_*pen 5 python optimization tensorflow

我尝试在 TensorFlow 中实现优化算法的可视化。

因此我从比尔函数开始

巴勒函数巴勒函数

全局最小值为

全局最小值

Beale 函数的图确实如下所示 Baele 函数图

我想从这一点开始f(x=3.0, y=4.0)

如何使用优化算法在 TensorFlow 中实现这一点?

我的第一次尝试看起来像这样

import tensorflow as tf

# Beale's function
x = tf.Variable(3.0, trainable=True)
y = tf.Variable(4.0, trainable=True)
f = tf.add_n([tf.square(tf.add(tf.subtract(1.5, x), tf.multiply(x, y))),
          tf.square(tf.add(tf.subtract(2.25, x), tf.multiply(x, tf.square(y)))),
          tf.square(tf.add(tf.subtract(2.625, x), tf.multiply(x, tf.pow(y, 3))))])

Y = [3, 0.5]

loss = f
opt = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for i in range(100):
    print(sess.run([x, y, loss]))
    sess.run(opt)
Run Code Online (Sandbox Code Playgroud)

显然这是行不通的。我想我必须定义正确的损失,但是如何定义呢?澄清一下:我的问题是我不明白 TensorFlow 是如何工作的,而且我不太了解 python(来自 Java、C、C++、Delphi 等)。我的问题不是关于它是如何工作的以及最好的优化方法是什么,而是关于如何以正确的方式实现它。

Spe*_*pen 4

哦,我已经能弄清楚了。问题是我需要将 x 和 y 的最大值和最小值剪裁为 -4.5 和 4.5,这样它们就不会爆炸到无穷大。

该解决方案有效:

import tensorflow as tf

# Beale's function
x = tf.Variable(3.0, trainable=True)
y = tf.Variable(4.0, trainable=True)
f = tf.add_n([tf.square(tf.add(tf.subtract(1.5, x), tf.multiply(x, y))),
          tf.square(tf.add(tf.subtract(2.25, x), tf.multiply(x, tf.square(y)))),
          tf.square(tf.add(tf.subtract(2.625, x), tf.multiply(x, tf.pow(y, 3))))])

opt = tf.train.GradientDescentOptimizer(0.01)
grads_and_vars = opt.compute_gradients(f, [x, y])
clipped_grads_and_vars = [(tf.clip_by_value(g, -4.5, 4.5), 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())

for i in range(100):
    print(sess.run([x, y]))
    sess.run(train)
Run Code Online (Sandbox Code Playgroud)

如果有人知道是否可以向此代码添加多个神经元/层,请随时写下答案。