avatarPierre Guillou

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

5891

Abstract

es/multifit#how-to-use-it-with-fastai-v10">https://github.com/n-waves/multifit#how-to-use-it-with-fastai-v10</a></p><p id="47b7">Le code suivant permet de spécialiser (fine-tune) un modèle MultiFiT (déjà entraîné) sur un corpus de la même langue et d’en extraire son encoder qui permettra alors de créer un modèle particulier comme un classificateur.</p><div id="619a"><pre><span class="hljs-title">from</span> fastai.text <span class="hljs-keyword">import</span> * <span class="hljs-keyword">import</span> multifit</pre></div><div id="a4c2"><pre>exp = multifit.from_pretrained(<span class="hljs-string">"name of the model"</span>) fa_config = exp.pretrain_lm.tokenizer.get_fastai_config(<span class="hljs-attribute">add_open_file_processor</span>=<span class="hljs-literal">True</span>) data_lm = (TextList.from_folder(imdb_path, *<span class="hljs-number">*fa</span>_config) .filter_by_folder(include=[<span class="hljs-string">'train'</span>, <span class="hljs-string">'test'</span>, <span class="hljs-string">'unsup'</span>]) .split_by_rand_pct(0.1) .label_for_lm()
.databunch(<span class="hljs-attribute">bs</span>=bs)) learn = exp.finetune_lm.get_learner(data_lm)
<span class="hljs-comment"># learn is a preconfigured fastai learner with a pretrained model loaded</span> learn.fit_one_cycle(10) learn.save_encoder(<span class="hljs-string">"enc"</span>) <span class="hljs-built_in">..</span>.</pre></div><h1 id="0d07">Architecture et entraînement d’un modèle MultiFiT</h1><p id="273c">Source: <a href="https://arxiv.org/abs/1909.04761">https://arxiv.org/abs/1909.04761</a> (cf dernière page)</p><figure id="fd36"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*SGpg53Lvr1WEvIpruEeRdQ.png"><figcaption>Source: <a href="https://arxiv.org/abs/1909.04761">https://arxiv.org/abs/1909.04761</a> (cf dernière page)</figcaption></figure><p id="12c1">Voici copié/collé du paper MultiFiT, les explications en anglais sur l’architecture du MultiFiT et sa méthode d’entraînement:</p><blockquote id="54a2"><p><b>(from the paper) The MultiFiT architecture has:</b></p></blockquote><blockquote id="182d"><p><b>- 4 <a href="https://arxiv.org/abs/1611.01576">QRNN</a> layers</b> with a <b>hidden dimensionality of 1550</b>,</p></blockquote><blockquote id="eb79"><p>- a <b>vocabulary size of 15,000 subword tokens (<a href="https://readmedium.com/nlp-fastai-sentencepiece-d6922b5480d6">SentencePiece</a>)</b></p></blockquote><blockquote id="6d27"><p>- and an <b>embeding size of 400</b>.</p></blockquote><blockquote id="28fb"><p>The vocabularies were computed using the <b>SentencePiece unigram language</b> model (Kudo, 2018) with 99% character coverage for Chinese and Japanese and 100% for the rest. The encoder’s and decoder’s weights are shared (Press and Wolf, 2017).</p></blockquote><blockquote id="7fff"><p>The output of the last QRNN layer (the last time step concatenated with an average and maximum pooled over time steps) is passed to the classifier with 2 dense layers. Our <b>language models were trained for 10 epochs on 100 million tokens of Wikipedia articles</b> and then <b>fine-tuned for 20 epochs on the corresponding dataset</b> (MLDoc or CLS).</p></blockquote><blockquote id="67df"><p><b>The classifier was fine-tuned for 4 to 8 epochs.</b> Results of the best model based on accuracy on the validation set are reported.</p></blockquote><blockquote id="80a4"><p><b>We used a modified version of 1-cycle learning rate schedule (Smith, 2018) that uses cosine instead of linear annealing, cyclical momentum and discriminative finetuning (Howard and Ruder, 2018).</b></p></blockquote><blockquote id="721e"><p>Our <b>batch size for language model training was 50</b> and for <b>classification tasks 18</b>. We were using <b>BPTT of length 70</b>. Due to the large amount of available training data <b>our pretrained language models were trained without any dropout</b>.</p></blockquote><blockquote id="fa6d"><p><b>We used the same dropout values as (Howard and Ruder, 2018) multiplied by 0.3 and 0.5 for fine-tuning of language models and the classification task respectively.</b> We used <b>weight decay of 0.01 for both tasks</b>. The final regularization method was<b> label smoothing</b> (Szegedy et al., 2016) with epsilon of 0.1.</p></blockquote><h1 id="03f9">fastai | Passer de ULMFiT à MultiFiT</h1><p id="b8c6">Si vous voulez créer votre propre code (ie, sans utiliser celui sur github), vous pouvez réutiliser les 2 notebooks présentés ci-après dans le paragraphe “<i>MultiFiT pour le portuguais</i>”.</p><p id="7678">Vous verrez que le code du MultiFiT réutilise le code du ULMFiT à 2 changements près:</p><h2 id="9efe">1. Utilisation du tokenizer SentencePiece au lieu de SpaCy</h2><p id="6611">Comme le tokenizer par défaut dans fastai v1 est SpaCy, <b>il faut spécifier l’utilisation de SentencePiece lors de l’entraînement du modèle de langage général</b>. Pour cela, il faut donner la taille du vocabulaire lors de la création du Databunch et utiliser la <a href="https://docs.fast.ai/text.data.html#SPProcessor">class SPProcessor</a>.</p><p id="279d">Voici ci-dessous un exemple de code fastai avec un vocabulaire de taille 15 000:</p><div id="e9a0"><pre>data = <span class="hljs-params">(TextList.from_folder(dest, <span class="hljs-attr">processor</span>=[OpenFileProcessor()</span>, SPProcessor<span class="hljs-params">(<span class="hljs-attr">max_vocab_sz</span>=15000)</span>]) <span class="hljs-string">.split_by_rand_pct</span><span class="hljs-params">(0.1, <span class="hljs-attr">seed</span>=42)</span> <span class="hljs-string">.label_for_lm</span><span class="hljs-params">()</span> <span class="hljs-string">.databunch</span><span class="hljs-params">(<span class="hljs-attr">bs</span>=bs, <span class="hljs-attr">num_workers</span>=1)</span>)</pre>

Options

</div><p id="6c59">Lors du Transfer Learning du modèle de langage général pour le spécialiser à un corpus de la même langue, <b>il faut passer dans le Databunch du nouveau corpus le modèle et le vocabulaire créés par SentencePiece dans le corpus du modèle général</b>.</p><p id="0cda">Voici ci-dessous un exemple de code fastai:</p><div id="0b46"><pre># un répertoire tmp dans le répertoire corpus_general a é<span class="hljs-built_in">t</span>é automatiquement créé lors de la première utilisation de SentencePiece (databunch du <span class="hljs-built_in">mod</span>èle de langage gé<span class="hljs-built_in">n</span>éral) afin d'enregistrer les paramêtres du <span class="hljs-built_in">mod</span>èle et le vocabulaire détecté dest = path/corpus_general</pre></div><div id="3d59"><pre>data_lm = (TextList.from_df(df_trn_val, path, <span class="hljs-attribute">cols</span>=reviews, <span class="hljs-attribute">processor</span>=SPProcessor.load(dest)) .split_by_rand_pct(0.1, <span class="hljs-attribute">seed</span>=42) .label_for_lm() .databunch(<span class="hljs-attribute">bs</span>=bs, <span class="hljs-attribute">num_workers</span>=1))</pre></div><h2 id="da6e">2. Changement de l’architecture du modèle</h2><p id="67b0">MultiFiT utilise une architecture QRNN en 4 couches avec 1550 activations chacune. Pour utiliser cette architecture dans le modèle à entraîner, <b>il suffit de changer la configuration</b> (argument <i>config </i>dans <i>language_model_learner()</i>) du modèle ULMFiT qui utilise un AWD-LSTM en 3 couches avec 1152 activations chacune.</p><p id="5366">Voici ci-dessous un exemple de code fastai:</p><figure id="72ef"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*PSrDy2hlpnTr3mceyswQLw.png"><figcaption>Code fastai pour passer de l’architecture AWD-LSTM (ULMFiT) à celle du QRNN (MultiFiT)</figcaption></figure><h1 id="0de3">Applications</h1><h2 id="2b20">MultiFiT pour le portugais</h2><p id="8964">Source: <a href="https://readmedium.com/nlp-fastai-portuguese-language-model-980c8ec75362">NLP &amp; fastai | Portuguese Language Model</a></p><figure id="66b3"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/0*8G_XkEsqyjkNsOl0.jpeg"><figcaption>Source: <a href="https://readmedium.com/nlp-fastai-portuguese-language-model-980c8ec75362">NLP &amp; fastai | Portuguese Language Model</a></figcaption></figure><p id="5446"><b>Notebooks</b></p><ul><li><a href="https://github.com/piegu/language-models/blob/master/lm3-portuguese.ipynb">lm3-portuguese.ipynb</a> (<a href="https://nbviewer.jupyter.org/github/piegu/language-models/blob/master/lm3-portuguese.ipynb">nbviewer</a>): modèle de langage général bidirectionnel du portugais (MultiFiT) entraîné sur un corpus de 100 millions de tokens extraits de Wikipedia en portugais.</li><li><a href="https://github.com/piegu/language-models/blob/master/lm3-portuguese-classifier-TCU-jurisprudencia.ipynb">lm3-portuguese-classifier-TCU-jurisprudencia.ipynb</a> (<a href="https://nbviewer.jupyter.org/github/piegu/language-models/blob/master/lm3-portuguese-classifier-TCU-jurisprudencia.ipynb">nbviewer</a>): modèle de langage bidirectionnel du portugais (et classificateur associé) spécialisé sur un <a href="http://modèle de langage bidirectionnel du portugais (et classificateur associé) spécialisé sur un corpus de jurisprudence de la Cour fédérale des comptes - Brasilia (Brésil) à partir du modèle de langage général bidirectionnel du portugais utilisant la technique du Transfer Learning. classificateur de textes formés dans">corpus de documents de jurisprudence de la Cour Fédérale des Comptes</a> (TCU, Tribunal de Contas da União à Brasilia (Brésil)) à partir du modèle de langage général bidirectionnel du portugais précédent utilisant la technique du Transfer Learning.</li><li>Paramètres à télécharger: <a href="https://github.com/piegu/language-models/tree/master/models">Models and Vocabularies</a></li></ul><h2 id="d24f">MultiFiT pour le français</h2><p id="d5b4">Source: <a href="https://readmedium.com/nlp-fastai-french-language-model-d0e2a9e12cab">NLP &amp; fastai | French Language Model</a></p><p id="7b19">Tous les liens vers les notebooks et les explications se trouvent dans le post.</p><figure id="90dd"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/0*jqR_dhHc8uBnbwbc.jpeg"><figcaption>Source: <a href="https://readmedium.com/nlp-fastai-french-language-model-d0e2a9e12cab">NLP &amp; fastai | French Language Model</a></figcaption></figure><h1 id="f426">Ressources</h1><ul><li><a href="https://readmedium.com/understanding-building-blocks-of-ulmfit-818d3775325b">Understanding building blocks of ULMFIT</a></li><li>(fastai) <a href="https://forums.fast.ai/t/using-qrnn-in-language-models/17278">Using QRNN in Language Models</a></li><li>(fastai) <a href="https://forums.fast.ai/t/multilingual-ulmfit/28117">Multilingual ULMFiT</a></li><li><a href="https://www.salesforce.com/products/einstein/ai-research/neural-network-building-block-accurate-understanding/#">New neural network building block allows faster and more accurate text understanding</a></li><li><a href="https://github.com/salesforce/pytorch-qrnn">Quasi-Recurrent Neural Network (QRNN) for PyTorch</a></li><li><a href="https://mlexplained.com/2018/04/09/paper-dissected-quasi-recurrent-neural-networks-explained/">Paper Dissected: “Quasi-Recurrent Neural Networks” Explained</a></li><li><a href="https://blog.einstein.ai/new-neural-network-building-block-allows-faster-and-more-accurate-text-understanding/">New Neural Network Building Block Allows Faster and More Accurate Text Understanding</a></li></ul><p id="5ee6"><b>À propos de l’auteur:</b> Pierre Guillou est consultant en Intelligence Artificielle au Brésil et en France. Merci de le contacter via son <a href="https://www.linkedin.com/in/pierreguillou/">profil Linkedin</a>.</p></article></body>

NLP & fastai | MultiFiT

MultiFiT suit les mêmes 3 étapes que ULMFiT (Image Credit: fastai Deep Learning Part 1 v3: Lesson 4)

L’objectif de ce post est de présenter les concepts clés de la méthode MultiFiT de fastai et son architecture associée. Son contenu a été présenté par Pierre Guillou lors du séminaire sur le “Processamento de Linguagem Natural” du Groupe d’Etude du Deep Learning à Brasília le lundi 02/12/2019.

Autres posts de la série NLP & fastai: Topic Modeling | Sentiment Classification | Language Model | Transfer Learning | ULMFiT | French Language Model | Portuguese Model Language | RNN | LSTM & GRU | SentencePiece | Sequence-to-Sequence Model (seq2seq) | Attention Mechanism | Transformer Model | GPT-2

BLOG | Efficient multi-lingual language model fine-tuning

Source: http://nlp.fast.ai/classification/2019/09/10/multifit.html

Le 10 septembre 2019, Sebastian Ruder publiait sur le site de fastai le post “Efficient multi-lingual language model fine-tuning”.

Ce post annonçait la publication d’une nouvelle méthode de classification de textes appelée MultiFiT (Multi-lingual Language Model Fine-tuning), évolution de la méthode ULMFiT (Universal Language Model Fine-tuning for Text Classification) publiée presque 2 ans auparavant au début de l’année 2018.

L’idée du MultiFiT était double:

  1. faciliter le téléchargement et la formation de modèles sur Wikipédia dans n’importe quelle langue (Wikipedia ou potentiellement sur CommonCrawl à l’avenir).
  2. fournir un zoo modèle constitué de modèles de langues pré-entraînés dans de nombreuses langues, que les utilisateurs peuvent ensuite simplement ajuster pour leurs propres applications.
Source: http://nlp.fast.ai/classification/2019/09/10/multifit.html

PAPER | MultiFiT: Efficient Multi-lingual Language Model Fine-tuning

Source: https://arxiv.org/abs/1909.04761

Le post de Sebastian Ruder — publié en association avec Julian Eisenschlos, Piotr Czapla, Marcin Kardas, Sylvain Gugger, Jeremy Howard — présentait à la fois le concept idéologique sous-jacent au MultiFiT (ne pas laisser croire qu’un classificateur entraîné sur un corpus en anglais puisse classifier avec un haut niveau de performance — et sans Transfer Learning , ni fine-tuning— un texte dans une autre langue comme le fait Multi-Lingual BERT), sa nature qui est d’entraîner un modèle de langage par langue (pour ensuite le mettre à disposition en ligne afin de pouvoir le spécialiser sur des tâches comme la classification) et son architecture qui diminue fortement le temps d’entraînement tout en augmentant la performance (principalement: remplacement du tokenizer SpaCy par SentencePiece, des 3 couches AWD-LSTM par 4 couches QRNN avec 1550 activations chacune et de la fonction de loss par Smooth Loss).

Source: https://arxiv.org/abs/1909.04761

CÓDIGO | Github

Source: https://github.com/n-waves/multifit

MultiFiT fait parti aujourd’hui de la bibliothèque fastai. Son code est disponible en ligne sur github ainsi que 7 modèles entraînés sur les langues suivantes: allemand, espagnol, français, italien, japonais, russe et chinois.

Source: https://github.com/n-waves/multifit

Comment ajuster (fine-tune) un modèle MultiFiT déjà entraîné avec fastai v1.0

Source: https://github.com/n-waves/multifit#how-to-use-it-with-fastai-v10

Le code suivant permet de spécialiser (fine-tune) un modèle MultiFiT (déjà entraîné) sur un corpus de la même langue et d’en extraire son encoder qui permettra alors de créer un modèle particulier comme un classificateur.

from fastai.text import *
import multifit
exp = multifit.from_pretrained("name of the model")
fa_config =  exp.pretrain_lm.tokenizer.get_fastai_config(add_open_file_processor=True)
data_lm = (TextList.from_folder(imdb_path, **fa_config)
            .filter_by_folder(include=['train', 'test', 'unsup']) 
            .split_by_rand_pct(0.1)
            .label_for_lm()           
            .databunch(bs=bs))
learn = exp.finetune_lm.get_learner(data_lm)  
# learn is a preconfigured fastai learner with a pretrained model loaded
learn.fit_one_cycle(10)
learn.save_encoder("enc")
...

Architecture et entraînement d’un modèle MultiFiT

Source: https://arxiv.org/abs/1909.04761 (cf dernière page)

Source: https://arxiv.org/abs/1909.04761 (cf dernière page)

Voici copié/collé du paper MultiFiT, les explications en anglais sur l’architecture du MultiFiT et sa méthode d’entraînement:

(from the paper) The MultiFiT architecture has:

- 4 QRNN layers with a hidden dimensionality of 1550,

- a vocabulary size of 15,000 subword tokens (SentencePiece)

- and an embeding size of 400.

The vocabularies were computed using the SentencePiece unigram language model (Kudo, 2018) with 99% character coverage for Chinese and Japanese and 100% for the rest. The encoder’s and decoder’s weights are shared (Press and Wolf, 2017).

The output of the last QRNN layer (the last time step concatenated with an average and maximum pooled over time steps) is passed to the classifier with 2 dense layers. Our language models were trained for 10 epochs on 100 million tokens of Wikipedia articles and then fine-tuned for 20 epochs on the corresponding dataset (MLDoc or CLS).

The classifier was fine-tuned for 4 to 8 epochs. Results of the best model based on accuracy on the validation set are reported.

We used a modified version of 1-cycle learning rate schedule (Smith, 2018) that uses cosine instead of linear annealing, cyclical momentum and discriminative finetuning (Howard and Ruder, 2018).

Our batch size for language model training was 50 and for classification tasks 18. We were using BPTT of length 70. Due to the large amount of available training data our pretrained language models were trained without any dropout.

We used the same dropout values as (Howard and Ruder, 2018) multiplied by 0.3 and 0.5 for fine-tuning of language models and the classification task respectively. We used weight decay of 0.01 for both tasks. The final regularization method was label smoothing (Szegedy et al., 2016) with epsilon of 0.1.

fastai | Passer de ULMFiT à MultiFiT

Si vous voulez créer votre propre code (ie, sans utiliser celui sur github), vous pouvez réutiliser les 2 notebooks présentés ci-après dans le paragraphe “MultiFiT pour le portuguais”.

Vous verrez que le code du MultiFiT réutilise le code du ULMFiT à 2 changements près:

1. Utilisation du tokenizer SentencePiece au lieu de SpaCy

Comme le tokenizer par défaut dans fastai v1 est SpaCy, il faut spécifier l’utilisation de SentencePiece lors de l’entraînement du modèle de langage général. Pour cela, il faut donner la taille du vocabulaire lors de la création du Databunch et utiliser la class SPProcessor.

Voici ci-dessous un exemple de code fastai avec un vocabulaire de taille 15 000:

data = (TextList.from_folder(dest, processor=[OpenFileProcessor(), SPProcessor(max_vocab_sz=15000)])
        .split_by_rand_pct(0.1, seed=42)
        .label_for_lm()
        .databunch(bs=bs, num_workers=1))

Lors du Transfer Learning du modèle de langage général pour le spécialiser à un corpus de la même langue, il faut passer dans le Databunch du nouveau corpus le modèle et le vocabulaire créés par SentencePiece dans le corpus du modèle général.

Voici ci-dessous un exemple de code fastai:

# un répertoire tmp dans le répertoire corpus_general a été automatiquement créé lors de la première utilisation de SentencePiece (databunch du modèle de langage général) afin d'enregistrer les paramêtres du modèle et le vocabulaire détecté
dest = path/corpus_general
data_lm = (TextList.from_df(df_trn_val, path, cols=reviews, processor=SPProcessor.load(dest))
    .split_by_rand_pct(0.1, seed=42)
    .label_for_lm()           
    .databunch(bs=bs, num_workers=1))

2. Changement de l’architecture du modèle

MultiFiT utilise une architecture QRNN en 4 couches avec 1550 activations chacune. Pour utiliser cette architecture dans le modèle à entraîner, il suffit de changer la configuration (argument config dans language_model_learner()) du modèle ULMFiT qui utilise un AWD-LSTM en 3 couches avec 1152 activations chacune.

Voici ci-dessous un exemple de code fastai:

Code fastai pour passer de l’architecture AWD-LSTM (ULMFiT) à celle du QRNN (MultiFiT)

Applications

MultiFiT pour le portugais

Source: NLP & fastai | Portuguese Language Model

Source: NLP & fastai | Portuguese Language Model

Notebooks

MultiFiT pour le français

Source: NLP & fastai | French Language Model

Tous les liens vers les notebooks et les explications se trouvent dans le post.

Source: NLP & fastai | French Language Model

Ressources

À propos de l’auteur: Pierre Guillou est consultant en Intelligence Artificielle au Brésil et en France. Merci de le contacter via son profil Linkedin.

Deep Learning
NLP
Fastai
Ulmfit
Pln
Recommended from ReadMedium