Вычисление Гессеана с градиентной лентой тензорного потока

Спасибо за ваш интерес к этому вопросу.

Я хочу рассчитать матрицу Гессе tensorflow.keras.Model

для производных высокого порядка я попробовал вложенный график GradientTape.# примера и входные данные

xs = tf.constant(tf.random.normal([100,24]))

ex_model = Sequential()
ex_model.add(Input(shape=(24)))
ex_model.add(Dense(10))
ex_model.add(Dense(1))

with tf.GradientTape(persistent=True) as tape:
    tape.watch(xs)
    ys = ex_model(xs)
g = tape.gradient(ys, xs)
h = tape.jacobian(g, xs)
print(g.shape)
print(h.shape)

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-20-dbf443f1ddab> in <module>
      5 h = tape.jacobian(g, xs)
      6 print(g.shape)
----> 7 print(h.shape)

AttributeError: 'NoneType' object has no attribute 'shape'

И снова суд...

with tf.GradientTape() as tape1:
    with tf.GradientTape() as tape2:
        tape2.watch(xs)
        ys = ex_model(xs)
    g = tape2.gradient(ys, xs)
h = tape1.jacobian(g, xs)
    
print(g.shape)
print(h.shape)


(100, 24)

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-17-c5bbb17404bc> in <module>
      7 
      8 print(g.shape)
----> 9 print(h.shape)

AttributeError: 'NoneType' object has no attribute 'shape'

почему я не могу рассчитать градиент g относительно x?


person MyPrunus    schedule 03.02.2021    source источник


Ответы (1)


Вы уже вычислили ys второй порядок градиентов относительно xs, который равен нулю, как и должно быть, когда вы вычисляете градиенты относительно константы, и поэтому tape1.jacobian(g, xs) возвращает None

Когда второй порядок градиентов не относительно константы:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Dense

x = tf.Variable(1.0)
w = tf.constant(3.0)
with tf.GradientTape() as t2:
  with tf.GradientTape() as t1:
    y = w * x**3
  dy_dx = t1.gradient(y, x)
d2y_dx2 = t2.gradient(dy_dx, x)

print('dy_dx:', dy_dx) # 3 * 3 * x**2 => 9.0
print('d2y_dx2:', d2y_dx2) # 9 * 2 * x => 18.0

Выходы:

dy_dx: tf.Tensor(9.0, shape=(), dtype=float32)
d2y_dx2: tf.Tensor(18.0, shape=(), dtype=float32)

Когда второй порядок градиентов является константой:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Dense

x = tf.Variable(1.0)
w = tf.constant(3.0)
with tf.GradientTape() as t2:
  with tf.GradientTape() as t1:
    y = w * x
  dy_dx = t1.gradient(y, x)
d2y_dx2 = t2.gradient(dy_dx, x)

print('dy_dx:', dy_dx)
print('d2y_dx2:', d2y_dx2)

Выходы:

dy_dx: tf.Tensor(3.0, shape=(), dtype=float32)
d2y_dx2: None

Однако вы можете рассчитать параметры слоя второго порядка градиентов относительно xs, например, регуляризация входного градиента

person Mr. For Example    schedule 03.02.2021
comment
Спасибо за ваш ответ. После того, как я добавил лямбда-слой с x**2 в модель, вложенный тензор возврата ленты. Спасибо - person MyPrunus; 04.02.2021
comment
@MyPrunus Рад помочь, если мой ответ решил вашу проблему, отметьте его как ответ, чтобы другие люди с похожей проблемой знали, где найти ответ, хорошего дня :) - person Mr. For Example; 04.02.2021