В настоящее время я просеиваю тонну материалов по распределенному обучению для нейронных сетей (обучение с обратным распространением). И чем больше я копаюсь в этом материале, тем больше мне кажется, что, по сути, каждый алгоритм обучения распределенной нейронной сети - это просто способ объединить градиенты, создаваемые распределенными узлами (обычно выполняемыми с использованием среднего), с учетом ограничений на среду выполнения (т. Е. Сеть). топология, равенство производительности узла, ...).
И вся соль лежащих в основе алгоритмов сконцентрирована вокруг использования предположений об ограничениях среды выполнения с целью уменьшения общего отставания и, следовательно, общего количества времени, необходимого для завершения обучения.
Таким образом, если мы просто комбинируем градиенты с распределенным обучением с использованием усреднения весов каким-то умным способом, то весь процесс обучения (более или менее) эквивалентен усреднению сетей, полученному в результате обучения в каждом распределенном узле.
Если я прав в отношении вещей, описанных выше, то я хотел бы попробовать объединить веса, полученные распределенными узлами, вручную.
Итак, мой вопрос:
Как вы производите в среднем два или более веса нейронной сети, используя любую основную технологию, такую как тензорный поток / caffe / mxnet / ...
Заранее спасибо
РЕДАКТИРОВАТЬ @Matias Valdenegro
Матиас: Я понимаю, что вы говорите: вы имеете в виду, что как только вы примените градиент, новый градиент изменится, и, следовательно, невозможно выполнить распараллеливание, потому что старые градиенты не имеют отношения к новым обновленным весам. Таким образом, алгоритмы реального мира оценивают градиенты, усредняют их и затем применяют их.
Теперь, если вы просто расширите скобки в этой математической операции, вы заметите, что можете применять градиенты локально. По сути, нет никакой разницы, если вы усредните дельты (векторы) или усредните NN состояния (точки). Пожалуйста, обратитесь к диаграмме ниже:
Предположим, что 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)
----------------------------------
Значит, результаты такие же ...