Почему выше необходимо глубокое копирование параметров базовой модели для создания функциональной модели? - PullRequest
1 голос
/ 17 июня 2020

Я нашел эту строку кода в более высокой библиотеке:

self.param_groups = _copy.deepcopy(other.param_groups)

и я не понимаю, зачем это нужно.

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

Если бы эта глубокая копия не означала, что оптимизатор (внешний l oop) будет вычислять градиенты по параметрам нет в графике вычислений? Поскольку:

параметры дифференцируемого / внутреннего оптимизатора являются глубокой копией по сравнению с исходными параметрами / весами, внешний оптимизатор (например, Адам) будет иметь исходные / начальные параметры, поэтому их градиент всегда должен быть нуль. Это единственное объяснение, которое я могу придумать, чтобы объяснить свои проблемы в прошлом (градиенты неожиданно обнулялись), однако, похоже, работает более высокий учебник MAML, который должен go противоречить моей теории. Если моя теория находится прямо в конце внутреннего l oop MAML и когда внешний оптимизатор (обычно Адам) вычисляет градиенты, они должны быть равны нулю (что я иногда наблюдал). Но я предполагаю, что они НЕ равны нулю, иначе этот учебник не работал бы.

Итак, я спрашиваю о необходимости использования глубокой копии при создании внутренних оптимизаторов. Какова его цель и почему она не вызывает проблем, которые я описываю в исходном руководстве по MAML выше. Как получается, что глубокая копия не прерывает прямой проход и, следовательно, все вычисление градиента относительно инициализации, которую использовал бы внешний оптимизатор?


Я думаю, что в основе моей путаницы лежит то, что Я не понимаю, зачем нам вообще нужно делать deepcopy. Без всего остального кода (который мне кажется запутанным) мы даже рискуем, что инициализация, которую мы, возможно, захотим обучить с помощью внешнего оптимизатора, может не обучиться, поскольку внешний / мета-оптимизатор имеет указатель на параметры исходной модели, а не копия глубокой копии, которую мог иметь внутренний оптимизатор.

Зачем разработчикам go через все это, добавляя существенный код, который, кажется, имеет высокие риски?


Связанный вопрос о том, как происходит копирование начальных параметров в вышестоящую: Что означает документация copy_initial_weights в вышестоящей библиотеке для Pytorch?

1 Ответ

0 голосов
/ 18 июня 2020

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

Если вы проследите, как используются self.param_groups, вы обнаружите, что 'params' каждого элемента фактически просто заменяется на Никаких позже здесь .

При инициализации дифференцируемого оптимизатора здесь необходимо сделать копии всех параметров эталонного other оптимизатора (включая тензорные и нетензорные, такие как lr, и состояния, например, momentum_buffer, но состояния копируются позже здесь ). Это эффективно создает моментальный снимок всех параметров оптимизатора other, за исключением обучаемых весов, в которые other должен был накапливать градиенты. Таким образом, в целом градиенты не распространяются через эти копии - они распространяются через начальные веса fmodel (если copy_initial_weights=False для этой модели) и / или через тензоры, требующие градиента, которые были переданы дифференцируемому оптимизатору с использованием override.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...