Как проверить наличие пропущенных частичек - PullRequest
0 голосов
/ 12 октября 2018

Я реализовал систему, которая состоит из нескольких групп и нескольких компонентов.Он относительно сложен и имеет компонентные входы / выходы, некоторые из которых зависят / не зависят и т. Д.

Градиентные оптимизаторы, кажется, застряли в начальных значениях и никогда не идут дальше, чем итерация 0 (не застряли в локальной системе).оптимальный).Я сталкивался с этой ошибкой раньше, так как мне не хватало встроенной функции для некоторых переменныхЕсть ли способ автоматически проверить, на каком компоненте ввода / вывода отсутствуют партиалы, аналогичные отсутствующим соединениям на диаграмме N ^ 2.

1 Ответ

0 голосов
/ 12 октября 2018

Существует два инструмента, которые необходимо использовать для проверки на наличие деривативов.Первый - check_partials .Это будет идти компонент за компонентом и использовать либо конечную разность, либо комплексный шаг, чтобы проверить частичные производные для каждого компонента (независимо от того, были ли они объявлены вами при настройке этого компонента).Это поймает проблему, если вы пропустите какие-либо частичные, потому что check-fd увидит их как ненулевые и покажет вам, что есть ошибка.

Check_partials должен быть вашей первой остановкой, всегда.Если вы можете, используйте комплексный шаг, чтобы проверить свои производные.Таким образом, вы знаете, что они абсолютно точны.Кроме того, check_partials выполнит проверку вокруг любой точки, которая в данный момент инициализирована.Так что иногда у вас может быть вырожденный случай (например, у вас есть некоторый ввод, равный 0), и поэтому ваш check_passes, но ваши производные по-прежнему неверны.Например, если ваш компонент представляет y = 2 * x, и вы забыли определить производные, но запустили check_partials при x = 0, тогда проверка прошла бы.Но если вы запустите его при x = 1, то проверка покажет ошибку.

Если все ваши частные производные верны, но вы все еще получаете плохие результаты, тогда вы можете попробовать check_totals .В зависимости от структуры вашей модели, и если у вас есть какая-либо связь (т.е. вам нужно использовать какой-то нелинейный решатель), то возможно, что у вас нет правильно сконфигурированной линейной решающей программы для правильного решения для общих производных.Во многих случаях, если у вас есть связь, вы можете просто поставить DirectSolver прямо на том же уровне, что и нелинейный решатель, который вы вставили в модель.

...