Производит ли распределенное обучение NN, которое является средним из NN, обученных в каждом распределенном узле? - PullRequest
0 голосов
/ 30 июня 2019

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

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

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

Если я прав в отношении вещей, описанных выше, то я хотел бы попробовать объединить веса, полученные распределенными узлами, вручную.

Итак, мой вопрос: Как вы производите в среднем два или более веса нейронной сети, используя любую основную технологию, такую ​​как тензорный поток / caffe / mxnet / ...

Заранее спасибо

РЕДАКТИРОВАТЬ @Matias Valdenegro

Матиас: Я понимаю, что вы говорите: вы имеете в виду, что как только вы примените градиент, новый градиент изменится, и, следовательно, невозможно выполнить распараллеливание, потому что старые градиенты не имеют отношения к новым обновленным весам. Таким образом, алгоритмы реального мира оценивают градиенты, усредняют их и затем применяют их.

Теперь, если вы просто расширите скобки в этой математической операции, вы заметите, что можете применять градиенты локально. По сути, нет никакой разницы, если вы усредните дельты (векторы) или усредните NN состояния (точки). Пожалуйста, обратитесь к диаграмме ниже:

enter image description here

Предположим, что NN-веса являются двумерным вектором.

Initial state  = (0, 0)
Deltas 1       = (1, 1)
Deltas 2       = (1,-1)
-----------------------
Average deltas = (1, 1) * 0.5 + (1, -1) * 0.5 = (1, 0)
NN State       = (0, 0) - (1, 0) = (-1, 0)

Теперь тот же результат может быть достигнут, если градиенты были применены локально к узлу, а центральный узел усреднит веса вместо дельт:

--------- Central node 0 ---------
Initial state  = (0, 0)
----------------------------------

------------- Node 1 -------------
Deltas 1       = (1, 1)
State 1        = (0, 0) - (1,  1) = (-1, -1)
----------------------------------

------------- Node 2 -------------
Deltas 2       = (1,-1)
State 2        = (0, 0) - (1, -1) = (-1,  1)
----------------------------------

--------- Central node 0 ---------
Average state  = ((-1, -1) * 0.5 + (-1,  1) * 0.5) = (-1, 0)
----------------------------------

Значит, результаты такие же ...

1 Ответ

1 голос
/ 02 июля 2019

Вопрос в названии отличается от вопроса в теле :) Я отвечу на оба вопроса:

Заглавный вопрос: «Производит ли распределенное обучение NN, являющееся средним числом NN, обученных в каждом распределенном узле?»

Нет. В контексте обучения модели с использованием мини-пакета SGD, распределенное обучение обычно относится к распределенному обучению с параллельными данными, которое распределяет вычисление градиентов мини-пакета записей по N работнику, а затем создает средний градиент, используемый для обновления центральной модели. веса, в асинхронном или синхронизированном режиме. Исторически усреднение происходило в отдельном процессе, называемом сервером параметров (историческое значение по умолчанию в MXNet и TensorFlow), но в современных подходах используется более экономичный, одноранговый кольцевой стиль все-редуцированный, демократизированный Uber's. Расширение Horovod , изначально разработанное для TensorFlow, но теперь доступно и для Keras, PyTorch и MXNet * . Обратите внимание, что параллельное обучение по моделям (наличие другой части модели, размещенной на разных устройствах) также существует, но параллельное обучение по данным более распространено на практике, возможно потому, что его проще реализовать (распределение среднего легко) и потому что полные модели часто подходят удобно в памяти современного оборудования. Тем не менее, параллельное обучение моделей иногда наблюдается для очень больших моделей, таких как GNMT от Google .

Основной вопрос: «Как вы производите в среднем два или более веса нейронной сети, используя любую основную технологию?»

Это зависит от каждого API-интерфейса, например:

В TensorFlow: Tensorflow - Усреднение весов моделей из восстановленных моделей

В PyTorch: Как взять среднее значение весов двух сетей?

В MXNet (фиктивный код при условии инициализации gluon nn.Sequential() моделей с аналогичной архитектурой):

# create Parameter dict storing model parameters
p1 = net1.collect_params()
p2 = net2.collect_params()
p3 = net3.collect_params()

for k1, k2, k3 in zip(p1, p2, p3):
    p3[k3].set_data(0.5*(p1[k1].data() + p2[k2].data()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...