web-dev-qa-db-ja.com

TensorFlowのグラフの勾配が正しく計算されていませんか?

Tensorflowの非常に単純な例:min (x + 1)^2ここで、xはスカラーです。コードは次のとおりです。

import tensorflow as tf

x = tf.Variable(initial_value=3.0)
add = tf.add(x, 1)
y = tf.square(add)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(y)

次に、グラフをディスクに書き込みます

graph = tf.get_default_graph()
writer = tf.summary.FileWriter("some/dir/to/write/events")
writer.add_graph(graph=graph)

最終的にテンソルボードで視覚化すると、次のようになります

enter image description here

問題は、ノード「追加」がグラデーションに接続されている理由です。 yを最小化しようとしているので、ノード「Square」はそうあるべきだと思いますが、それはバグですか?誰かがそれを説明できますか?

13
Jie.Zhou

関係するバグはありません。勾配とは何かを理解し、自分で勾配を計算する方法を知っている必要があります。したがって、_(x+1)^2' = 2*(x+1)_。つまり、勾配を計算するために_(x+1)^2_を計算する必要はありません。グラデーション部分を拡大すると、正方形のグラデーションが計算され、グラフのどの部分が必要かがわかります: enter image description here

これは、より興味深く、より直感的な例です。

_import tensorflow as tf

x = tf.Variable(initial_value=3.0)
y = tf.cos(x)

train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(y)

with tf.Session() as sess:
    writer = tf.summary.FileWriter('logs', sess.graph)
    writer.close()
_

cos(x)' = - sin(x)であることを知っておく必要があります。つまり、勾配の計算に必要なのはxだけです。そして、これはあなたがグラフで見るものです: enter image description here

26
Salvador Dali