Как решить проблемы с памятью в обучающих встроениях слов на больших наборах данных?

datascience.stackexchange https://datascience.stackexchange.com/questions/12109

Вопрос

Я хочу обучить задачу предсказуемости слова для создания встроенных слов. Сбор документов содержит 243K документы. Реализация кода в факеле. Я борюсь с огромным размером набора данных и нуждаюсь в идеях о том, как обучать встроения слов на таком большом наборе данных, который представляет собой коллекцию из 243 тысяч полных документов статьи. Исследовательский вычисленный ресурс временен, поэтому получите короткий доступ к узлу графического процессора и, таким образом, выбрал постепенное обучение модели:

  1. ИНКРЕМЕНТАЛЬНАЯ ОБУЧЕНИЯ МОДЕЛИ: Один из способов обучения на весь набор данных - использовать инкрементную модельную обучение, которая обучает модель на одну часть данных и сохранить ее. Позже выберите ту же предварительно обученную модель и начните обучение по ней в следующем куче данных. Проблема, с которой я сталкиваюсь в этом подходе, заключается в том, что как мне сохранить словарный запас/словарь слов. В Word Methods Methods Dictionary/Vocab играет важную роль. Мы охватываем все документы и создаем словар слова, которые имеют больше минимальной частоты. Теперь, на самом деле этот словарь является хэш -картой, которая имеет индекс, связанный с каждым словом, и в обучающих образцах мы заменяем слова на их индексы в словаре для простоты в модели. В случае постепенного обучения, как мне постепенно создавать словарь? Должен ли я сначала создавать словарь/словарь на целые документы, а затем постепенно тренироваться? Или способ продлить словарь также в постепенном обучении?
  2. Другая проблема - ограничение памяти по размеру структуры данных Vocab. Я внедряю свою модель в Torch, которая основана на Lua. Таким образом, Луа устанавливает ограничение на размер таблиц, я не могу загрузить словарь для целых документов в одной таблице. Как преодолеть такие проблемы с памятью?
  3. Черпает вдохновение в перчатках векторов. В своей статье они говорят, что «мы обучили нашу модель пяти корпусам различных размеров: свалку в Википедии 2010 года с 1 миллиардами жетонов; Википедийская свалка в 2014 году с 1,6 миллиардами TOKEN; Gigaword 5, который имеет 4,3 миллиарда жетонов; Комбинированный Gigaword5 + Wikipedia2014, который имеет 6 миллиардов жетонов; и на 42 миллиарда жетона веб -данных, от Common Crawl5. Мы токенизируем и строят каждый корпус с помощью Стэнфордского токенизатора, строим словарный запас из 400 000 наиболее частых слов6, а затем строим матрицу количества коэффициентов x ». Есть идеи о том, как векторы перчаток обучались такому большому корпусу и большому словарному запасу, и как ограничения на память в их случае могли быть обработаны? Ссылка на бумагу - http://nlp.stanford.edu/pubs/glove.pdf
  4. Любые идеи о том, как ограничить размер набора данных для генерации встроенных слов? Как это повлияет на производительность или охват встроенных слов с увеличением или уменьшением количества документов? Хорошей идеей использовать методы выборки для выборки документов из набора данных? Если да, то пожалуйста, предложите некоторые из методов отбора проб.
Это было полезно?

Решение

Возможно, вы сможете преодолеть встроенный предел памяти с помощью библиотеки TDS, которая позволяет вам создавать более или менее эквивалентные структуры, которые не ограничены ограничением памяти Lua. Это не поможет с ограничениями вашего оборудования, но вы сможете иметь такие вещи, как таблицы, превышающие 2 ГБ.

https://github.com/torch/tds

Кроме того, если все остальное не удалось, вы можете рассмотреть вопрос о разделении своего словаря на более мелкие столы. Затем, когда вам нужно получить к нему доступ, у вас будет какая -то главная таблица, в которой вы бы искали правильный словарной таблицы для элемента, который вы ищете. Это потребует сортировки вашего словаря, поэтому вам все равно придется иметь все в памяти одновременно (или, я думаю, реализовать свой собственный алгоритм сортировки), но вам нужно сделать это только один раз, как и ваш словарный запас остается постоянным. Затем вы сериализуете все столики Vocab и загружаете их с диска с при необходимости, что будет медленным, но все равно быстрее, чем заполнять вашу физическую память и поесть в обмен. Вероятно.

Другие советы

Я не знаком с Torch, но, поскольку в основном рассматриваются Word2VEC и DOC2VEC, эти модели учатся на каждом предложениях, и поэтому нет необходимости иметь все предложения в памяти. Вы могли бы итерации через каждое предложение в корпорации и позволить модели извлечь уроки из каждого предложения. И это, вероятно, то, как люди тренируются в огромных корпусах с или без высоких вычислительных машин.

Короткий пример в Python:

class SentenceIterator(object):
   def __iter__(file_name):
      for line in open(file_name)
         yield line

sentences = SentenceIterator("path/to/file")
for line in sentences:
    model.train(line)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с datascience.stackexchange
scroll top