Python — Понимание Actor-Advantage Critic

Я пытаюсь реализовать нейронную сеть A2C в C ++ из этот урок. Я мог только найти учебники по Python, и этот учебник по Python имел для меня наибольшее значение.

Я уже внедрил обычную нейронную сеть обратного распространения, однако хочу обновить ее, чтобы использовать обучение с подкреплением. Я создал C ++ версию Pytorch Tensor и большинство других вещей, необходимых для завершения этого. У меня есть проблемы с реализацией их Variable учебный класс. Я прочитал над документы и понять концепцию автоматическое дифференцирование используя правило цепочки, но я не уверен, как конвертировать Tensorс в Variableи что все должно происходить за кулисами. Я мог бы даже иметь всю необходимую градиентную математику с моей оригинальной реализацией нейронной сети backprop.

Было очень трудно пытаться расшифровать код Python (у меня нет опыта работы с Python), тем более что мне пришлось угадывать типы сложных переменных (Variable против Tensor против Vector, так далее.). Например, я не понимаю линию total_loss.backward() (раздел In [4]: учебника). Является total_loss не двойник (или поплавок)? мой mean() функция Tensor возвращает одно значение, представляющее среднее целого Tensor, total_loss это просто простые операции, выполняемые с плавающей или двойной. Но тогда это вызывает backward() в теме. Я нашел три backwardно не уверены, какой из них, так как никто не имеет смысла в контексте. torch.autograd.backward, torch.autograd.Function.backward, а также torch.autograd.Variable.backward. Ничего из этого не имеет смысла, потому что total_loss это двойник, верно?

Другим пропущенным шагом являются реализации «вперед» и «назад». В учебнике говорится, что Pytorch выполняет обратную передачу для меня, но, поскольку я нахожусь на C ++, мне нужно сделать эту реализацию самостоятельно, и я не слишком уверен в назначении различных проходов. Это прямое и обратное распространение нейронных сетей?

Я также смущен optim и как это делает стохастическая оптимизация. Я прочитал документы на этом тоже, но я до сих пор не уверен, как это преобразуется в C ++. Я знаю, что это градиентная оптимизация стохастических целевых функций первого порядка на основе адаптивных оценок моментов более низкого порядка.

Из того, что я исследовал в течение последних нескольких недель, мне нужно создать расчетный граф прямых тензорных накоплений в виде узлов с правилом цепочки, выполненным над тензорными данными, чтобы зафиксировать зависимую переменную для вычисления производных по каждому подэлементу. выражение на узлах рекурсивно. Затем используйте автоматическое дифференцирование произвольных скалярных функций (которые являются функциями активации нейронной сети?), Чтобы распространяться по дереву и приводить к соответствующим градиентам. Правило цепочки дифференцирует график, и каждый узел будет содержать значение w.r.t и функцию, которая его создала.

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

Я также исследовал, как реализация Variable смотрит в Источник Pytorch и прочитайте примеры в раздел примеров, Однако я все еще пытаюсь понять реализацию.

В заключение (чтобы он не был помечен как слишком широкий), какие детали мне нужно знать о Pytorch Variable для того, чтобы сделать реализацию в C ++, предполагая, что концепция автоматического дифференцирования понимается? Нужно ли просто держать double для градиента и указатель функции для активации? Кроме того, как сделать model.variables() в Python работать и обойтись? Это так, чтобы я мог понять, как сделать реализацию алгоритма Адама.

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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]