Ответ 1
Мне посчастливилось работать в лаборатории, которая использовала оба этих метода для обучения сетей, и хотя оба они полезны в очень дорогостоящих вычислительных настройках, расположение вычислительного узкого места обычно определяет, какой метод использовать.
Обучение сети с использованием распределенной системы (например, HADOOP)
Это полезно, когда ваша сеть большая, достаточная, чтобы умножение матриц, участвующих в обучении, становилось громоздким на традиционном ПК. Эта проблема особенно распространена, когда у вас есть жесткие ограничения по времени (например, онлайн-обучение), поскольку в противном случае сложность реализации HADOOP не стоит (просто запустите сеть в одночасье). Если вы думаете о HADOOP, потому что хотите возиться с сетевыми параметрами, и вам не нужно ждать дня, прежде чем запускать еще несколько (часто в моей лаборатории), просто запустите несколько экземпляров сети с разными параметрами на разных машинах. Таким образом, вы можете использовать свой кластер, не имея дело с фактическими распределенными вычислениями.
Пример:
Вы тренируете сеть, чтобы найти количество людей в изображениях. Вместо предопределенного набора примеров обучения (количество пар изображений людей) вы решаете, что программа вытаскивает случайные изображения из Google. Пока сеть обрабатывает изображение, вы должны просмотреть изображение и предоставить обратную связь о том, сколько людей действительно находится на изображении. Поскольку это обработка изображений, размер вашей сети, вероятно, находится в масштабе миллионов единиц. И поскольку вы предоставляете обратную связь в режиме реального времени, важна скорость вычислений в сети. Таким образом, вы, вероятно, должны инвестировать в распределенную реализацию.
Обучение сети на графическом процессоре
Это правильный выбор, если основным вычислительным узким местом является не размер сети, а размер набора для обучения (хотя сети по-прежнему в целом довольно большие). Поскольку графические процессоры идеально подходят для ситуаций, связанных с применением одной и той же операции с вектором/матрицей для большого количества наборов данных, они в основном используются, когда вы можете использовать пакетное обучение с очень большим размером партии.
Пример:
Вы тренируете сеть, чтобы отвечать на вопросы, заданные на естественном языке. У вас есть огромная база данных пар ответов вопросов и не против сети, только обновляя ее веса каждые 10000 вопросов. С таким большим размером партии и, предположительно, довольно большой сетью, реализация на GPU была бы хорошей идеей.