Comment gérer les problèmes de mémoire dans la formation de mots Plongements sur les grands jeux de données?

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

Question

Je veux former une tâche de prévisibilité de mot pour générer mot incorporations. La collection de documents contient 243k documents. La mise en œuvre du code est en torche. Je me bats avec la taille énorme du jeu de données et des idées sur la façon de le besoin de former mot encastrements sur un vaste ensemble de données qui est une collection de 243 mille documents de l'article complet. La recherche de ressources de calcul est programmé de manière à obtenir un accès court au noeud GPU et ainsi opté pour la formation progressive du modèle:

  1. Modèle de formation incrémental: un moyen de train sur tout le jeu de données consiste à utiliser la formation modèle supplémentaire qui est former le modèle sur un morceau des données et de l'enregistrer. Par la suite prendre le même modèle de pré-formation et commencer la formation sur la prochaine partie de données. Le problème que je suis confronté à cette approche est que comment maintenir le vocabulaire / dictionnaire des mots. Dans les méthodes d'inclusion mot du dictionnaire / vocab joue un rôle important. Nous balayent tous les documents et créer vocab des mots qui ont le nombre supérieur à une fréquence fixe minimum. Maintenant, en fait ce vocab est une carte de hachage qui a l'index associé à chaque mot et dans les échantillons de formation, nous remplaçons les mots avec leurs indices dans le vocab pour la simplicité dans le modèle. Dans le cas de la formation progressive comment puis-je créer le dictionnaire progressivement? Est-ce que je dois créer vocab / dictionnaire sur des documents entiers au départ et puis train progressivement? Ou est la façon d'étendre vocab aussi dans la formation progressive?
  2. Un autre problème est la limite de mémoire de la taille de la structure de données vocab. Je suis mon modèle dans la mise en œuvre de la flamme qui est basé LUA. Ainsi, LUA met une limite sur la taille des tables, je ne peux pas charger vocab pour des documents entiers dans une seule table. Comment surmonter ces problèmes de mémoire?
  3. Se inspirant de vecteurs gants. Dans leur article, ils disent qu'ils « Nous avons formé notre modèle sur cinq corpus de tailles différentes: a 2010 décharge Wikipédia avec 1 milliard de jetons; une décharge de Wikipedia 2014 avec 1,6 milliard To- Kens; Gigaword 5 qui a 4,3 milliards de jetons; la combinaison Gigaword5 + Wikipedia2014, qui a 6 milliards de jetons; et 42 milliards de jetons de données Web, de Common Crawl5. Nous segmentons et minuscules chaque corpus avec le tokenizer Stanford, construire un vocabulaire de 400 000 words6 le plus fréquent, puis construire une matrice de nombre de co-occurrence X ». Toute idée sur la façon dont les vecteurs gants formés sur un gros corpus et grand vocabulaire et comment les restrictions mémoire dans leur cas aurait pu prendre manipulé? Référence papier - http://nlp.stanford.edu/pubs/glove.pdf
  4. Toutes les idées sur la façon de limiter la taille de l'ensemble de données pour générer incorporations de mot? Comment aurait-il une incidence sur la performance ou la couverture du mot encastrements avec l'augmentation ou la diminution du nombre de documents? Est-ce une bonne idée d'utiliser des techniques d'échantillonnage à des exemples de documents de jeu de données? Si oui, s'il vous plaît suggérer quelques-unes des techniques d'échantillonnage.
Était-ce utile?

La solution

Vous pouvez être en mesure de surmonter la limite de mémoire intégrée avec la bibliothèque tds, ce qui vous permet de créer des structures plus ou moins équivalents qui ne sont pas limités par le plafond de la mémoire de Lua. Cela ne va pas aider les limites de votre matériel, mais vous serez en mesure d'avoir des choses comme des tables qui sont plus de 2 Go.

https://github.com/torch/tds

En outre, si tout le reste échoue, vous pourriez envisager le partitionnement de votre vocabulaire dans des tables plus petites. Ensuite, lorsque vous avez besoin d'y accéder, vous auriez une sorte de table principale dans laquelle vous souhaitez regarder la table vocab correcte pour l'élément que vous recherchez. Cela nécessiterait le tri de votre vocabulaire, de sorte que vous auriez encore tout avoir en mémoire à la fois (ou implémenter votre propre algorithme de tri rusée, je suppose), mais vous auriez seulement besoin de faire une fois aussi longtemps que votre vocabulaire reste constante. Ensuite, vous sérialiser toutes les tables de vocab et de les charger de disque au besoin, qui sera lente, mais encore plus vite que remplir votre mémoire physique et de manger de l'espace d'échange. Probablement.

Autres conseils

Je ne suis pas au courant de la flamme, mais comme essentiellement word2vec et doc2vec sont considérés, ces modèles apprendre les uns des phrases et donc il n'y a pas besoin d'avoir toutes les phrases dans la mémoire. Vous pouvez itérer par chaque phrase dans le corpus et laisser le modèle apprendre de chacun de la phrase. Et c'est probablement la façon dont les gens forment sur d'énormes corpora avec ou sans machines haut de calcul.

Un court exemple en 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)

De cette façon, la mémoire est chargée avec une seule phrase à la fois et quand il est fait la charge de mémoire suivant. Pour la construction du vocabulaire, vous pouvez faire tout le itérer via tous les documents pour construire le vocab d'abord, puis former les données, en fonction des fonctions de mot-enrobage mis en œuvre.

Licencié sous: CC-BY-SA avec attribution
scroll top