Используйте Tensorflow / PyTorch для ускорения минимизации пользовательской функции - PullRequest
1 голос
/ 07 июля 2019

Я делаю много симуляций, для которых мне часто нужно минимизировать сложные пользовательские функции, для которых я обычно использую numpy и scipy.optimize.minimize().Однако проблема в том, что мне нужно явно записать градиентную функцию, которую иногда бывает очень трудно / невозможно найти.А для больших размерных векторов численные производные, рассчитанные как scipy, непомерно дороги.

Итак, я пытаюсь переключиться на Tensorflow или PyTorch, чтобы воспользоваться их возможностями автоматического дифференцирования и иметь возможность свободно использовать графические процессоры.Позвольте мне привести явный пример функции, производную которой несколько сложно записать (потребовалось бы много правил цепочки), и, таким образом, она кажется созревшей для Tensorflow или PyTorch - вычисления двугранного угла между двумя сформированными треугольниками.на четыре точки в трехмерном пространстве:

def dihedralAngle(xyz):
## calculate dihedral angle between 4 nodes

    p1, p2, p3, p4 = 0, 1, 2, 3

    ## get unit normal vectors
    N1 = np.cross(xyz[p1]-xyz[p3] , xyz[p2]-xyz[p3])
    N2 = - np.cross(xyz[p1]-xyz[p4] , xyz[p2]-xyz[p4])
    n1, n2 = N1 / np.linalg.norm(N1), N2 / np.linalg.norm(N2) 

    angle = np.arccos(np.dot(n1, n2))

    return angle

xyz1 = np.array([[0.2       , 0.        , 0.        ],
       [0.198358  , 0.02557543, 0.        ],
       [0.19345897, 0.05073092, 0.        ],
       [0.18538335, 0.0750534 , 0.        ]]) # or any (4,3) ndarray

print(dihedralAngle(xyz1)) >> 3.141

Я мог бы легко минимизировать это, используя scipy.optimize.minimize(), и я должен получить 0. Для такой маленькой функции мне не нужен градиент (явный иличисленный).Однако, если я захочу перебрать много-много узлов и минимизировать некоторую функцию, которая зависит от всех двугранных углов, тогда издержки будут намного выше?

Мои вопросы тогда -

  1. Как бы я реализовал эту проблему минимизации, используя TensorFlow или PyTorch?И для одного двугранного угла, и для списка таких углов (т. Е. Нам нужно учесть циклический перебор списков).
  2. Кроме того, могу ли я просто получить градиент с помощью автоматического дифференцирования, чтобы подключиться обратно к scipy.optimize.minimize() при желании?Например, scipy.optimize.minimize() позволяет легко определять границы и ограничения, чего я не заметил в модулях оптимизации Tensorflow или PyToch.
...