このページは Cloud Translation API によって翻訳されました。
Switch to English

tf.GradientTape

TensorFlow 1バージョン GitHubでソースを表示する

自動微分のための操作を記録します。

ノートブックで使用

ガイドで使用チュートリアルで使用

操作は、このコンテキストマネージャー内で実行され、少なくとも1つの入力が「監視」されている場合に記録されます。

trainable=True変数( tf.Variableまたはtf.compat.v1.get_variableによって作成されますtf.Variable trainable=Trueはどちらの場合もデフォルトです)は自動的に監視されます。テンソルは、このコンテキストマネージャでwatchメソッドを呼び出すことにより、手動で監視できます。

たとえば、関数y = x * x考えます。 x = 3.0での勾配は、次のように計算できます。

 x = tf.constant(3.0)
with tf.GradientTape() as g:
  g.watch(x)
  y = x * x
dy_dx = g.gradient(y, x) # Will compute to 6.0
 

GradientTapesをネストして、高次導関数を計算できます。例えば、

 x = tf.constant(3.0)
with tf.GradientTape() as g:
  g.watch(x)
  with tf.GradientTape() as gg:
    gg.watch(x)
    y = x * x
  dy_dx = gg.gradient(y, x)     # Will compute to 6.0
d2y_dx2 = g.gradient(dy_dx, x)  # Will compute to 2.0
 

デフォルトでは、GradientTape.gradient()メソッドが呼び出されるとすぐに、GradientTapeによって保持されているリソースが解放されます。同じ計算で複数の勾配を計算するには、永続的な勾配テープを作成します。これにより、tapeオブジェクトがガベージコレクションされたときにリソースが解放されるため、gradient()メソッドを複数回呼び出すことができます。例えば:

 x = tf.constant(3.0)
with tf.GradientTape(persistent=True) as g:
  g.watch(x)
  y = x * x
  z = y * y
dz_dx = g.gradient(z, x)  # 108.0 (4*x^3 at x = 3)
dy_dx = g.gradient(y, x)  # 6.0
del g  # Drop the reference to the tape
 

デフォルトでは、GradientTapeは、コンテキスト内でアクセスされるトレーニング可能な変数を自動的に監視します。監視する変数をきめ細かく制御したい場合は、 watch_accessed_variables=Falseをテープコンストラクターに渡して、自動追跡を無効にできます。

 with tf.GradientTape(watch_accessed_variables=False) as tape:
  tape.watch(variable_a)
  y = variable_a ** 2  # Gradients will be available for `variable_a`.
  z = variable_b ** 3  # No gradients will be available since `variable_b` is
                       # not being watched.
 

モデルを使用するときは、 watch_accessed_variables=Falseを使用するときに変数が存在することを確認する必要があることに注意してください。それ以外の場合、最初の反復に勾配がないようにするのは非常に簡単です。

 a = tf.keras.layers.Dense(32)
b = tf.keras.layers.Dense(32)

with tf.GradientTape(watch_accessed_variables=False) as tape:
  tape.watch(a.variables)  # Since `a.build` has not been called at this point
                           # `a.variables` will return an empty list and the
                           # tape will not be watching anything.
  result = b(a(inputs))
  tape.gradient(result, a.variables)  # The result of this computation will be
                                      # a list of `None`s since a's variables
                                      # are not being watched.
 

実数または複素数のdtypeを持つテンソルのみが微分可能であることに注意してください。

persistent 永続的なグラデーションテープを作成するかどうかを制御するブール値。デフォルトではFalseです。これは、このオブジェクトのgradient()メソッドに対して最大で1つの呼び出しを行うことができることを意味します。
watch_accessed_variables テープがアクティブな間にアクセスされた(トレーニング可能な)変数をテープが自動的にwatchするかどうかを制御するブール値。デフォルトはTrueで、トレーニング可能なVariable読み取りから派生したテープで計算された任意の結果から勾配を要求できることを意味します。 Falseの場合、ユーザーはグラデーションをリクエストするVariable明示的にwatchする必要があります。

方法

batch_jacobian

ソースを表示

例ごとのヤコビアンを計算してスタックします。

ヤコビアンの定義については、 ウィキペディアの記事を参照してください。この関数は基本的に、以下の効率的な実装です。

tf.stack([self.jacobian(y[i], x[i]) for i in range(x.shape[0])])

各入力値に対する各出力値の勾配を計算するGradientTape.jacobianと比較して、この関数は、 target[i,...]j != isource[j,...]から独立している場合に役立ちます。この仮定により、 GradientTape.jacobianと比較してより効率的な計算が可能になります。中間活性化と同様に、出力は低次元であり、独立性の仮定が与えられた場合、ヤコビアン計算をもたらす冗長なゼロの束を避けます。

使用例:

 with tf.GradientTape() as g:
  x = tf.constant([[1., 2.], [3., 4.]], dtype=tf.float32)
  g.watch(x)
  y = x * x
batch_jacobian = g.batch_jacobian(y, x)
# batch_jacobian is [[[2,  0], [0,  4]], [[6,  0], [0,  8]]]
 

アーグ
target ランクが2以上で形状が[b、y1、...、y_n]のテンソル。 target[i,...]source[i,...]のみ依存する必要がsource[i,...]
source ランク2以上で形状が[b、x1、...、x_m]のテンソル。
unconnected_gradients 「なし」または「ゼロ」を保持できる値で、ターゲットとソースが接続されていない場合に返される値を変更します。可能な値と効果は「UnconnectedGradients」で詳しく説明されており、デフォルトは「none」です。
parallel_iterations 並行してディスパッチされる反復数を制御するノブ。このノブを使用して、合計メモリ使用量を制御できます。
experimental_use_pfor trueの場合、ヤコビアンの計算にpforを使用します。それ以外の場合は、tf.while_loopを使用します。

戻り値
形状が[b、y_1、...、y_n、x1、...、x_m]のテンソルtここで、 t[i, ...]target[i, ...] wrt source[i, ...] 、つまり、例ごとに積み重ねられたヤコビアン。

上げる
RuntimeError 熱心な実行が有効で、experimental_use_pforを有効にせずに、非永続的なテープで呼び出された場合。
ValueError ヤコビアン計算のベクトル化が失敗した場合、またはtargetsource最初の次元が一致しない場合。

gradient

ソースを表示

このテープのコンテキストで記録された操作を使用して勾配を計算します。

アーグ
target 区別されるテンソルまたは変数のリストまたはネストされた構造。
sources テンソルまたは変数のリストまたはネストされた構造。 targetsources内の要素と区別されsources
output_gradients グラデーションのリスト、ターゲットの各要素に1つ。デフォルトはNoneです。
unconnected_gradients 「なし」または「ゼロ」を保持できる値で、ターゲットとソースが接続されていない場合に返される値を変更します。可能な値と効果は「UnconnectedGradients」で詳しく説明されており、デフォルトは「none」です。

戻り値
リストまたはテンソル(またはIndexedSlices、またはNone)のネストされた構造、の各要素に対して1つのsources 。返される構造は、 sourcesの構造と同じsources

上げる
RuntimeError テープのコンテキスト内で呼び出された場合、または非永続的なテープで複数回呼び出された場合。
ValueError ターゲットが変数である場合、または接続されていないグラデーションが不明な値で呼び出された場合。

jacobian

ソースを表示

このテープのコンテキストで記録された操作を使用してヤコビアンを計算します。

ヤコビアンの定義については、 ウィキペディアの記事を参照してください。

使用例:

 with tf.GradientTape() as g:
  x  = tf.constant([1.0, 2.0])
  g.watch(x)
  y = x * x
jacobian = g.jacobian(y, x)
# jacobian value is [[2., 0.], [0., 4.]]
 

引数
target 区別するテンソル。
sources テンソルまたは変数のリストまたはネストされた構造。 targetsources内の要素と区別されsources
unconnected_gradients 「なし」または「ゼロ」を保持できる値で、ターゲットとソースが接続されていない場合に返される値を変更します。可能な値と効果は「UnconnectedGradients」で詳しく説明されており、デフォルトは「none」です。
parallel_iterations 並行してディスパッチされる反復数を制御するノブ。このノブを使用して、合計メモリ使用量を制御できます。
experimental_use_pfor trueの場合、ヤコビアン計算をベクトル化します。それ以外の場合は、順次while_loopにフォールバックします。ベクトル化が失敗したり、過剰なメモリ使用につながることがあります。このオプションは、このような場合にベクトル化を無効にするために使用できます。

戻り値
Tensorのリストまたはネストされた構造(またはNone)、 sources各要素に1つ。返される構造は、 sourcesの構造と同じsources 。勾配がスパース(IndexedSlices)である場合、jacobian関数は現在、勾配を密にし、代わりにTensorを返します。これは将来変更される可能性があります。

上げる
RuntimeError 熱心な実行が有効で、experimental_use_pforを有効にせずに、非永続的なテープで呼び出された場合。
ValueError ヤコビアン計算のベクトル化が失敗した場合。

reset

ソースを表示

このテープに保存されているすべての情報を消去します。

新しいテープでテープコンテキストマネージャーを終了し、再起動することと同じです。たとえば、次の2つのコードブロックは同等です。

 with tf.GradientTape() as t:
  loss = loss_fn()
with tf.GradientTape() as t:
  loss += other_loss_fn()
t.gradient(loss, ...)  # Only differentiates other_loss_fn, not loss_fn


# The following is equivalent to the above
with tf.GradientTape() as t:
  loss = loss_fn()
  t.reset()
  loss += other_loss_fn()
t.gradient(loss, ...)  # Only differentiates other_loss_fn, not loss_fn
 

これは、テープのコンテキストマネージャーを終了したくない場合、または目的のリセットポイントが制御フロー構造内にあるために終了できない場合に便利です。

 with tf.GradientTape() as t:
  loss = ...
  if loss > k:
    t.reset()
 

stop_recording

ソースを表示

このテープへの記録操作を一時的に停止します。

このコンテキストマネージャがアクティブな間に実行された操作は、テープに記録されません。これは、すべての計算をトレースすることによって使用されるメモリを減らすのに役立ちます。

例えば:

   with tf.GradientTape(persistent=True) as t:
    loss = compute_loss(model)
    with t.stop_recording():
      # The gradient computation below is not traced, saving memory.
      grads = t.gradient(loss, model.variables)
 

収量:

なし

上げる
RuntimeError テープが現在録音中でない場合。

watch

ソースを表示

tensorがこのテープによってトレースされていることを確認します。

引数
tensor TensorまたはTensorのリスト。

上げる
ValueError テンソルではない何かに遭遇した場合。

watched_variables

ソースを表示

このテープが監視する変数を構築順に返します。

__enter__

ソースを表示

操作がこのテープに記録されるコンテキストを入力します。

__exit__

ソースを表示

記録コンテキストを終了し、それ以上の操作はトレースされません。