有几个实验依赖于梯度上升而不是梯度下降。我已经研究了一些使用“成本”和最小化函数来模拟“最大化”函数的方法,但我仍然不确定我是否知道如何正确实现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 )
答案 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)