Как рассчитать производную NN-выхода с одной переменной на входе с помощью кераса? - PullRequest
0 голосов
/ 27 марта 2019

Я использую нейронную сеть, чтобы выучить уравнение (формула Блэка-Шоулза для определения цены опциона). Мне удалось позволить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...