А.И.: Как бы я тренировал нейронную сеть на нескольких машинах?

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

Я думал, что для каждой части сети сервер может отправить, может быть, 1000 наборов данных для обучения сети... но... у вас будет примерно одно и то же вычислительное время, t иметь возможность тренироваться на разных наборах данных одновременно (это то, что я хочу сделать).

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

Я приветствую все идеи.

Ответ 1

Цитата http://en.wikipedia.org/wiki/Backpropagation#Multithreaded_Backpropagation:

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

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

что в основном описывает другие ответы.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Здесь - ссылка на вопрос о пакетном обучении.