有没有一种简单的方法可以在TensorFlow中实现Optimizer.Maximize()函数

时间:2016-07-06 23:54:45

标签: machine-learning tensorflow reinforcement-learning

有几个实验依赖于梯度上升而不是梯度下降。我已经研究了一些使用“成本”和最小化函数来模拟“最大化”函数的方法,但我仍然不确定我是否知道如何正确实现maximize()函数。此外,在大多数情况下,我会说他们更接近无监督学习。因此,给出了成本函数的代码概念:

cost = (Yexpected - Ycalculated)^2
train_step = tf.train.AdamOptimizer(0.5).minimize(cost)

我想写一些东西,因为我遵循正梯度并且可能没有Yexpected值:

maxMe = Function(Ycalculated)
train_step = tf.train.AdamOptimizer(0.5).maximize(maxMe)

这种需求的一个很好的例子是“http://cs229.stanford.edu/proj2009/LvDuZhai.pdf”与经常性强化学习

我已经阅读了一些论文和参考文献,状态改变符号会将运动方向转换为增加渐变,但是考虑到TensorFlow对渐变的内部计算,我不确定这是否适用于Maximize,因为我没有知道验证结果的方法:

maxMe = Function(Ycalculated)
train_step = tf.train.AdamOptimizer(0.5).minimize( -1 * maxMe )

1 个答案:

答案 0 :(得分:0)

直觉很简单,minimize()函数会不断挤压给定的值,例如,如果您从5开始,那么对于每次迭代(例如,取决于学习率),该值将变为,4、3、2、1、0,以此类推。现在,如果您在开头输入-5(实际上是+5,但您显式更改了符号),则渐变会尝试更改参数以使数字进一步降低,例如-5,-6, -7,-8,...等但是实际上,由于我们更改了符号,所以该函数正在增加,而实际符号是(+)。换句话说,在后一种情况下,梯度以maximizes函数而不是使函数最小的方式改变了神经网络的参数。

带有任意数字的玩具示例:

The input x = 1.5, The weight parameter at time (t) w_t = 0.1, 
The observed response y = 3.0, The learning rate lr = 0.1.

x * w = 0.15 (this is y predicted for the current w)

loss function = (3.0 - 0.15)^2 = 8.1

Applying gradient descent:

w_(t+1) = w_t - lr * (derivative of loss function with respect to w)

w_(t+1) = 0.1 - (0.1 * [1.5 * 2(0.15 - 3.0)]) =  0.1 - (-0.855) = 0.955

如果我们使用新的w_(t+1),我们将:

1.5 * 0.955 = 1.49 (which is closer to the correct answer 3.0)

and the new loss is: (3.0 - 1.49)^2 = 2.27 (smaller error).

如果我们不断进行迭代,我们将调整w的值,使其尽可能地降低成本。


现在,让我们重复相同的实验,但是将符号翻转为负:

loss function = - (3.0 - 0.15)^2 = -8.1

Applying gradient descent:

w_(t+1) = w_t - lr * (derivative of loss function with respect to w)

w_(t+1) = 0.1 - (0.1 * [1.5 * -2(0.15 - 3.0)]) =  0.1 - 0.855 = −0.755

如果我们应用新的w_(t+1),我们将拥有:

1.5 * −0.755 = −1.1325 and the new loss is: (3.0 - (-1.1325))^2 = 17.07 

(the loss function is maximizing!).

这也适用于任何微分函数,但这只是一个简单的幼稚示例,用以说明这一思想。

因此,您可以按照建议进行操作:

optimizer.minimize( -1 * value) 

或者,如果您愿意,可以创建一个包装函数(实际上是不必要的,但仅需提及):

def maximize(optimizer, value, **kwargs):
  return optimizer.minimize(-value, **kwargs)