web-dev-qa-db-ja.com

Tensorflow Gradient Tapeの目的は何ですか?

TensorflowでのEager Executionに関するTensorflow Developerのサミットビデオを視聴し、プレゼンターは「グラデーションテープ」について紹介しました。グラデーションテープは、TFモデルで発生する自動微分を追跡することを理解しました。

グラデーションテープを使用する理由を理解しようとしていましたか? Gradient Tapeが診断ツールとしてどのように使用されているか説明できますか?なぜ誰かがグラデーションテープとTensorboardの重みの視覚化を使用するのでしょうか。

したがって、モデルで発生する自動微分は、各ノードの勾配を計算することです。つまり、データのバッチが与えられると、各ノードでの重みとバイアスの調整を意味します。それが学習プロセスです。しかし、実際にtf.keras.callback.TensorBoard()呼び出しを使用してトレーニングのテンソルボード視覚化を見ることができるという印象を受けていたので、各ノードの重みを監視し、デッドノードまたは過飽和ノードがあるかどうかを判断できます。

グラデーションテープの使用は、一部のグラデーションがゼロになるか、本当に大きくなるかなどを確認するためだけですか?または、グラデーションテープの他の用途はありますか?

19
krishnab

積極的な実行が有効になっている場合、Tensorflowは、コードで発生するテンソルの値を計算します。これは、プレースホルダーを介して入力が入力される静的なグラフを事前計算しないことを意味します。これは、エラーを逆伝播するために、計算の勾配を追跡し、これらの勾配をオプティマイザーに適用する必要があることを意味します。

これは、グラフを作成し、sess.runを使用して損失を評価し、これをオプティマイザーに直接渡す、熱心な実行なしで実行することとは大きく異なります。

基本的に、テンソルはすぐに評価されるため、勾配を計算するグラフがないため、勾配テープが必要です。視覚化のためだけに使用されるのではなく、それなしでは勾配降下を熱心なモードで実装することはできません。

明らかに、Tensorflowは、すべてのtf.Variableでのすべての計算のすべての勾配を追跡できます。ただし、これはパフォーマンスの大きなボトルネックになる可能性があります。グラデーションテープが公開されているため、コードのどの領域にグラデーション情報が必要かを制御できます。非熱心モードでは、これは損失の子孫である計算ブランチに基づいて静的に決定されますが、熱心モードでは静的なグラフがないため、知る方法がありません。

20
iyop45

最初の質問を投稿した後、しばらくの間これに取り組んできたので、グラデーションテープがどこで役立つのかがよくわかりました。 Gradient Tapの最も便利なアプリケーションは、たとえばkerasモデルでカスタムレイヤーを設計する場合、またはモデルのカスタムトレーニングループを同等に設計する場合です。

カスタムレイヤーがある場合は、計算される勾配や累積される損失量の計算など、そのレイヤー内での操作の正確な方法を定義できます。

したがって、グラデーションテープを使用すると、レイヤー内の個々のグラデーションに直接アクセスできます。

Tensorflowに関するAurelien Geronの第2版の本の例を次に示します。

アクティベーションとして必要な機能があるとします。

 def f(w1, w2):
     return 3 * w1 ** 2 + 2 * w1 * w2

ここで、respecを使用してこの関数の導関数をw1およびw2

w1, w2 = tf.Variable(5.), tf.Variable(3.)
with tf.GradientTape() as tape:
    z = f(w1, w2)

gradients = tape.gradient(z, [w1, w2])

そのため、オプティマイザーは勾配を計算し、それらの値にアクセスできるようにします。次に、好きなように、2倍、2乗、3倍などを行うことができます。何を選択しても、これらの調整された勾配を逆伝搬ステップなどの損失計算に追加できます。

3
krishnab