2016-02-07 3 views
0

Я пытаюсь обучить нейронную сеть (backprop + gradient descent) в python с функциями, которые я строю поверх книг Google 2 грамма (английский), это в итоге будет около миллиарда строк данных с 20 функциями каждой строки. Это будет легко превышать мою память и, следовательно, использование массивов в памяти, таких как numpy, не будет вариантом, так как это требует загрузки полного набора тренировок.Обработка массива больше, чем память для обучения нейронной сети в python

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

Есть ли способ обучить модель без необходимости загружать полный набор тренировок в память для каждой итерации минимизации затрат (потерь)?

+2

Это очень напоминает Фродо: «Я возьму Кольцо в Мордор ... ... если кто-нибудь покажет мне дорогу ...» Без изучения основ вы потерпите неудачу. Что касается MongoDB, начните с документов, особенно для [структуры агрегации] (https://docs.mongodb.org/manual/aggregation/) и [sharding] (https://docs.mongodb.org/manual/core/Sharding введение /). –

+0

Вы можете попробовать использовать стохастический градиентный спуск. В каждую эпоху вам не обязательно проходить через весь тренировочный набор. Скорее, вы можете случайным образом выбрать 1000 записей набора данных в каждую эпоху. – jorgenkg

+0

@jorgenkg, спасибо за ваш комментарий, стохастический градиентный спуск будет отличным подходом, он также позволит одновременно обучать сеть на кластерах. – mdabiri

ответ

0

Что вы, вероятно, ищете, это мини-чистка. В общем, многие методы обучения нейронных сетей основаны на градиенте, и поскольку ваша функция потерь является функцией набора треугольников, то есть градиент. Как вы сказали, это может превысить вашу память. К счастью, для аддитивных функций потерь (и большинство из них вы когда-либо используете) являются аддитивными), можно доказать, что вы можете заменить полный градиентный спуск стохастическим (или минибазарным) градиентом спуска и все еще сходиться к локальным минимумам. В настоящее время очень часто приходится использовать партии 32, 64 или 128 строк, что довольно легко вписывается в вашу память. Такие сети могут фактически сходиться быстрее к решению, чем те, которые обучаются с полным градиентом, поскольку вы делаете N/128 перемещений в наборе данных вместо одного. Даже если каждый из них довольно груб - в сочетании они работают очень хорошо.