Редактировать: Я по сути переписал это, чтобы (надеюсь) было намного яснее и лаконичнее.Вот новая версия, за которой следует оригинальная версия.
В настоящее время я использую TensorFlow для задачи оптимизации физики (физические детали / фон должны быть в основном неактуальными, хотя, если вам интересно, смотрите ниже.и понять жаргон).Это на самом деле не имеет ничего общего с машинным обучением;Я просто использую TF для автоматического дифференцирования.
Итак, скажем, один оптимизирует x 1 , x 2 , ..., x N с функцией потерь L (x 1 , x 2 , ..., x N ).У меня проблема в том, что L (x 1 , x 2 , ..., x N ) невозможно рассчитать точно и эффективно;однако, это может быть аппроксимировано выборкой.То есть L (x 1 , x 2 , ..., x N ) почти равно некоторым:
l (x 1 , x 2 , ..., x N ) = Σ i λ i (x 1 , x 2 , ..., x N )
, где каждый λ i может быть эффективно рассчитан,Уловка, однако, является формой каждого λ i , зависящего от текущих значений x 1 , x 2 , ..., x N .То есть выборка не является «случайной», а выполняется контролируемым образом на основе текущего значения параметров.
Для задачи оптимизации идея состоит в том, чтобы использовать l вместо L в качестве стоимостифункция.Сложность заключается в том, что l меняет каждую итерацию (или «эпоху» в терминологии ML).Итак, алгоритм таков:
В каждую эпоху:
начинаем с l = 0;форма l как функция x k неизвестна в этой точке
определить форму λ 1 .Затем оцените λ 1 (и автоматически ∂λ 1 / ∂x k )
Сделайте сумму за I, в процессе определения и оценки l (и автоматически ∂l / ∂x k ).
update x 1 , ..., x N на основе производных ∂l i / ∂x k .
Я не уверенкак бороться с этим в TensorFlow, так как операторы if не работают.Я знаю, что есть условия TensorFlow (tf.cond), но у меня были разные проблемы с этим, и я даже не уверен, что это правильное место для использования tf.cond.Будет ли PyTorch лучше?
[На физическом фоне: я нахожу основное состояние квантовой спиновой системы;функция потерь - это энергия, которую я рассчитываю с помощью вариационного метода Монте-Карло.То, что я назвал λ i , является локальной энергией определенной спиновой конфигурации.Затем случайный спин переворачивается, и эта новая конфигурация спина принимается с вероятностью = отношением амплитуд волновой функции.λ i + 1 - это локальная энергия новой конфигурации вращения и т. д.]
Оригинальная версия: в основном, проблема в том, что моя функция потерь не определена жестко, но меняет каждую итерацию.
Как это получается: допустим, мои оптимизируемые переменные: x 1 , x 2 , ..., x N и моя потеряфункция L (x 1 , x 2 , ..., x N ).В задаче, с которой я работаю, точное вычисление L (x 1 , x 2 , ..., x N ) потребует выполнения неразборчивобольшая сумма, поэтому единственный способ - это вычислить L (x 1 , x 2 , ..., x N ) методом выборки Монте-Карло.В частности, этот метод представляет собой метод Монте-Карло с цепочкой Маркова (т.е. последовательную выборку).
На практике моя ситуация в основном такова:
С выборкойнг метод, у меня есть что-то вроде L (х 1 , ..., х N ) = L 1 (х я 1 1 , ..., x i 1 n ) + L 2 (х я 2 * +1165 * 1 * +1168 *, ..., х * * я тысяча сто шестьдесят-девять 2 * ** 1172 тысяча сто семьдесят один * N ) + ... + L M (x i M 1 , ..., x i M п ).Важным моментом является то, что функции L 1 , L 2 , ... не заданы в камне (как с точки зрения их функциональной формы, так и с точки зрения того, какое подмножество переменныхони зависят от).Чтобы вычислить L, один кулак начинается с L 1 (по существу, общая форма L k установлена, но некоторые свободные параметры остаются. Как правило, мы начинаем со "random"L 1 ).Затем мы генерируем «кандидат» L 2 путем случайного генерирования свободных параметров внутри него.Затем это принимается или отклоняется в зависимости от значений некоторых величин в зависимости от переменных x 1 ... N .Как только L 2 найден, он оценивается и добавляется к общему L, и мы переходим к L 3 и так далее.Чтобы снова вычислить L, весь процесс повторяется.
Для оптимизации весь этот процесс повторяется каждую итерацию (или «эпоху» в терминологии ML).Даже если точная функциональная форма L изменяется от эпохи к эпохе, для любых данных значений x 1 , ..., x N , значение L (x )1 , ..., x N ) четко определено (с точностью до аппроксимации), поэтому оптимизация все же должна сходиться.
Вопрос в том, можно лисделать это в TensorFlow?Легко написать обычный код на Python, используя операторы if, для оценки L (x 1 , ..., x N ), но это плохо переводится в TensorFlow.Будет ли PyTorch лучше?