【发布时间】:2018-07-30 09:21:18
【问题描述】:
就上下文而言,我正在尝试使用 Tensorflow 实现梯度下降算法。
我有一个矩阵X
[ x1 x2 x3 x4 ]
[ x5 x6 x7 x8 ]
我乘以某个特征向量Y得到Z
[ y1 ]
Z = X [ y2 ] = [ z1 ]
[ y3 ] [ z2 ]
[ y4 ]
然后我将 Z 通过 softmax 函数,并获取日志。我将输出矩阵称为 W。
所有这些都是按如下方式实现的(添加了一点样板文件以便它可以运行)
sess = tf.Session()
num_features = 4
num_actions = 2
policy_matrix = tf.get_variable("params", (num_actions, num_features))
state_ph = tf.placeholder("float", (num_features, 1))
action_linear = tf.matmul(params, state_ph)
action_probs = tf.nn.softmax(action_linear, axis=0)
action_problogs = tf.log(action_probs)
W(对应action_problogs)看起来像
[ w1 ]
[ w2 ]
我想求w1相对于矩阵X的梯度——也就是我想计算一下
[ d/dx1 w1 ]
d/dX w1 = .
.
[ d/dx8 w1 ]
(最好仍然看起来像一个矩阵,这样我就可以将它添加到X,但我真的不关心这个)
我希望tf.gradients 能解决问题。我这样计算“梯度”
problog_gradient = tf.gradients(action_problogs, policy_matrix)
但是,当我检查 problog_gradient 时,我得到了以下结果
[<tf.Tensor 'foo_4/gradients/foo_4/MatMul_grad/MatMul:0' shape=(2, 4) dtype=float32>]
请注意,这与X 的形状完全相同,但实际上不应该。我希望得到一个包含两个渐变的列表,每个渐变都涉及 8 个元素。我怀疑我得到了两个渐变,但每个渐变都涉及四个元素。
我对 tensorflow 很陌生,所以我会很感激并解释正在发生的事情以及如何实现我想要的行为。
【问题讨论】:
标签: python matrix tensorflow gradient-descent reinforcement-learning