Тензорный поток (или Pytorch?) С функцией стоимости, определенной в терминах выборки Монте-Карло (функция стоимости, которая меняется каждую эпоху) - PullRequest
0 голосов
/ 03 марта 2019

Редактировать: Я по сути переписал это, чтобы (надеюсь) было намного яснее и лаконичнее.Вот новая версия, за которой следует оригинальная версия.


В настоящее время я использую 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).Итак, алгоритм таков:

В каждую эпоху:

  1. начинаем с l = 0;форма l как функция x k неизвестна в этой точке

  2. определить форму λ 1 .Затем оцените λ 1 (и автоматически ∂λ 1 / ∂x k )

  3. Сделайте сумму за I, в процессе определения и оценки l (и автоматически ∂l / ∂x k ).

  4. 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 лучше?

1 Ответ

0 голосов
/ 04 марта 2019

Во-первых, MCMC доступен через такие библиотеки, как pyMC3 и tensorflow-probability.Практические примеры для обеих платформ доступны в большом вероятностном программировании и байесовских методах для хакеров .

Что касается ваших реальных вычислений, я не совсем уверен, если я последую.Как правило, обратное распространение путем случайной выборки имеет две основные разновидности: производная по траектории и функция оценки.Оба они кратко описаны в документации PyTorch , хотя вы можете найти лучший ресурс.Я не думаю, что ваша проблема поддается производной от пути из-за размера пространства путей, и я не уверен, будет ли работать функция оценки.

Одна идея, которая может быть применимым, но о котором я не могу судить без дополнительных знаний, это подход максимизации ожиданий.Возможно ли следующее для вашей проблемы?

  1. Взять N образцов из цепочки Маркова [S1, ..., SN] (ожидание)
  2. Рассчитать убыток L(S1) + ... + L(SN), выполнить для него шаг минимизации (минимизация))
  3. Повтор
...