Я обучил нейронную сеть выполнять регрессию по функции синуса и хотел бы вычислить первую и вторую производную по входным данным. Я попытался использовать функцию tf.gradients () следующим образом (neural_net является экземпляром tf.keras.Sequential):

prediction = neural_net(x_value)
dx_f = tf.gradients(prediction, x_value)
dx_dx_f = tf.gradients(dx_f, x_value)

X_value - это массив, имеющий длину тестового размера. Однако это приводит к прогнозам и производным. Предсказание сети (синяя кривая) в основном точно улавливает функцию синуса, но мне пришлось разделить первую производную (оранжевую) с коэффициентом 10 и вторую производную (зеленую) с коэффициентом 100, чтобы она была в том же порядке. Таким образом, первая производная выглядит (после этого масштабирования) нормально, но вторичная производная совершенно ошибочна. Поскольку предсказание функции синуса работает очень хорошо, здесь явно происходит нечто забавное.

3
Florian_O 26 Июн 2019 в 15:02

3 ответа

Лучший ответ

Одним из возможных объяснений того, что вы наблюдали, может быть то, что ваша функция не может быть получена два раза. Похоже, что есть скачки в 1-й производной вокруг экстремумов. Если это так, вторая производная функции на самом деле не существует, и сюжет, который вы получаете, зависит от того, как библиотека обрабатывает такие места.

Рассмотрим следующую картину негладкой функции, которая скачет с 0,5 до -0,5 для всех x в {1, 2, ....}. Его наклон равен 1 во всех местах, кроме случаев, когда х - целое число. Если вы попытаетесь построить его производную, вы, вероятно, увидите прямую линию при y = 1, что может быть легко неверно истолковано, потому что, если кто-то просто смотрит на этот график, он может подумать, что функция полностью линейна и начинается с -infinity до + бесконечность .

Если ваши результаты получены нейронной сетью, которая использует RELU, вы можете попытаться сделать то же самое с функцией активации сигмовидной кишки. Я полагаю, вы не увидите столько шипов с этой функцией.

enter image description here

0
jottbe 27 Июн 2019 в 05:37

То, что вы узнали, было функцией синуса, а не ее производной: в процессе обучения вы управляете ошибкой с помощью своей функции стоимости, которая учитывает только значения, но не контролирует наклон вообще: вы могли бы выучить очень шумная функция, но точно соответствует точкам данных.

Если вы просто используете точку данных в своей функции затрат, у вас нет никаких гарантий относительно изученного производного. Однако, используя некоторые методы повышения квалификации, вы также можете изучить такую производную: https://arxiv.org/abs/ 1706.04859

Таким образом, как резюме, это не проблема кода, а только теоретическая проблема

0
Nathan 27 Июн 2019 в 05:56

Я не думаю, что вы можете рассчитать производные второго порядка, используя tf.gradients. Взгляните на tf.hessians (вам действительно нужна диагональ матрицы Гессе), например, [ 1 ] .

Альтернативой является использование tf.GradientTape: [2].

[1] https://github.com/gknilsen/pyhessian

[2] https://www.tensorflow.org/api_docs/python/tf/GradientTape

0
MichaelSB 26 Июн 2019 в 19:28