Я использую нейронную сеть, чтобы выучить уравнение (формула Блэка-Шоулза для определения цены опциона). Мне удалось позволить NN хорошо аппроксимировать вывод уравнения, но я также хочу, чтобы производная уравнения также была изучена. Чтобы проверить результат, мне нужно вычислить производную NN-вывода w.r.t от первой переменной моего ввода.
Моя модель представляет собой 5-слойную полностью подключенную NN. У меня уже есть градиенты для каждого слоя, но я не уверен, правильно ли я вычисляю производную.
В приведенном ниже коде я вычисляю производную для первой переменной, выполняя точечное произведение для всех слоев и игнорируя смещение. Мне просто интересно, правильно ли это делать? Потому что после вычисления производных для всех тестовых случаев я обнаружил, что они довольно далеки от своих теоретических значений. Так что либо мой код неверен, либо я просто не могу правильно выучить уравнение.
P.S. Вот как выглядит градиентная структура:
[<tf.Tensor 'gradients/dense_1/MatMul_grad/MatMul_1:0' shape=(2, 128) dtype=float32>,
<tf.Tensor 'gradients/dense_1/BiasAdd_grad/BiasAddGrad:0' shape=(128,) dtype=float32>,
<tf.Tensor 'gradients/dense_2/MatMul_grad/MatMul_1:0' shape=(128, 64) dtype=float32>,
<tf.Tensor 'gradients/dense_2/BiasAdd_grad/BiasAddGrad:0' shape=(64,) dtype=float32>,
<tf.Tensor 'gradients/dense_3/MatMul_grad/MatMul_1:0' shape=(64, 32) dtype=float32>,
<tf.Tensor 'gradients/dense_3/BiasAdd_grad/BiasAddGrad:0' shape=(32,) dtype=float32>,
<tf.Tensor 'gradients/dense_4/MatMul_grad/MatMul_1:0' shape=(32, 16) dtype=float32>,
<tf.Tensor 'gradients/dense_4/BiasAdd_grad/BiasAddGrad:0' shape=(16,) dtype=float32>,
<tf.Tensor 'gradients/dense_5/MatMul_grad/MatMul_1:0' shape=(16, 1) dtype=float32>,
<tf.Tensor 'gradients/dense_5/BiasAdd_grad/BiasAddGrad:0' shape=(1,) dtype=float32>]
[введите описание изображения здесь] [1]
# My NN structure:
def build_nn_model(feats):
model = models.Sequential()
model.add(layers.Dense(128, activation='relu',
input_shape=(len(feats),)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1))
model.compile(optimizer='rmsprop', loss='mse', metrics=['mse'])
return model
# to get the gradient:
outputs = nn_model.output
trainable_variables = nn_model.trainable_weights
gradients = K.gradients(outputs, trainable_variables)
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
# to calculate the derivative
trainingExample = X_val[['var_1', 'var_2']].iloc[0].values.reshape(1, 2)
evaluated_gradients = sess.run(gradients,feed_dict={nn_model.input:trainingExample})
layer_1 = evaluated_gradients[0][0].reshape(1, 128)
layer_2 = evaluated_gradients[2]
layer_3 = evaluated_gradients[4]
layer_4 = evaluated_gradients[6]
layer_5 = evaluated_gradients[8]
derivative = layer_1.dot(layer_2).dot(layer_3).dot(layer_4).dot(layer_5)
[1]: https://i.stack.imgur.com/Kuidb.png