import{S as Vv,i as Wv,s as Jv,e as l,t as a,c as o,a as r,h as n,d as t,g as p,G as s,k as c,w,m as _,x as E,y as x,q as g,o as b,B as j,b as y,M as Yv,N as Xr,p as It,v as Qv,n as Ut}from"../../chunks/vendor-hf-doc-builder.js";import{T as Na}from"../../chunks/Tip-hf-doc-builder.js";import{Y as ap}from"../../chunks/Youtube-hf-doc-builder.js";import{I as Oa}from"../../chunks/IconCopyLink-hf-doc-builder.js";import{C as S}from"../../chunks/CodeBlock-hf-doc-builder.js";import{C as Gv}from"../../chunks/CourseFloatingBanner-hf-doc-builder.js";import{F as Xv}from"../../chunks/FrameworkSwitchCourse-hf-doc-builder.js";function Zv(H){let i,h;return i=new Gv({props:{chapter:7,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"English",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter7/section3_tf.ipynb"},{label:"Fran\xE7ais",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/fr/chapter7/section3_tf.ipynb"},{label:"English",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section3_tf.ipynb"},{label:"Fran\xE7ais",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/fr/chapter7/section3_tf.ipynb"}]}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function eg(H){let i,h;return i=new Gv({props:{chapter:7,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"English",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter7/section3_pt.ipynb"},{label:"Fran\xE7ais",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/fr/chapter7/section3_pt.ipynb"},{label:"English",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section3_pt.ipynb"},{label:"Fran\xE7ais",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/fr/chapter7/section3_pt.ipynb"}]}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function sg(H){let i,h,d,$,A;return{c(){i=l("p"),h=a("\u{1F64B} Si les termes \xAB mod\xE9lisation du langage masqu\xE9 \xBB et \xAB mod\xE8le pr\xE9-entra\xEEn\xE9 \xBB ne vous sont pas familiers, consultez le "),d=l("a"),$=a("chapitre 1"),A=a(", o\xF9 nous expliquons tous ces concepts fondamentaux, vid\xE9os \xE0 l\u2019appui !"),this.h()},l(q){i=o(q,"P",{});var k=r(i);h=n(k,"\u{1F64B} Si les termes \xAB mod\xE9lisation du langage masqu\xE9 \xBB et \xAB mod\xE8le pr\xE9-entra\xEEn\xE9 \xBB ne vous sont pas familiers, consultez le "),d=o(k,"A",{href:!0});var P=r(d);$=n(P,"chapitre 1"),P.forEach(t),A=n(k,", o\xF9 nous expliquons tous ces concepts fondamentaux, vid\xE9os \xE0 l\u2019appui !"),k.forEach(t),this.h()},h(){y(d,"href","/course/fr/chapiter1")},m(q,k){p(q,i,k),s(i,h),s(i,d),s(d,$),s(i,A)},d(q){q&&t(i)}}}function tg(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U,z,D,I,L;return k=new S({props:{code:`from transformers import TFAutoModelForMaskedLM

model_checkpoint = "distilbert-base-uncased"
model = TFAutoModelForMaskedLM.from_pretrained(model_checkpoint)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TFAutoModelForMaskedLM

model_checkpoint = <span class="hljs-string">&quot;distilbert-base-uncased&quot;</span>
model = TFAutoModelForMaskedLM.from_pretrained(model_checkpoint)`}}),z=new S({props:{code:`model(model.dummy_inputs)  # Construire le mod\xE8le
model.summary()`,highlighted:`model(model.dummy_inputs)  <span class="hljs-comment"># Construire le mod\xE8le</span>
model.summary()`}}),I=new S({props:{code:`Model: "tf_distil_bert_for_masked_lm"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
distilbert (TFDistilBertMain multiple                  66362880  
_________________________________________________________________
vocab_transform (Dense)      multiple                  590592    
_________________________________________________________________
vocab_layer_norm (LayerNorma multiple                  1536      
_________________________________________________________________
vocab_projector (TFDistilBer multiple                  23866170  
=================================================================
Total params: 66,985,530
Trainable params: 66,985,530
Non-trainable params: 0
_________________________________________________________________`,highlighted:`Model: <span class="hljs-string">&quot;tf_distil_bert_for_masked_lm&quot;</span>
_________________________________________________________________
Layer (<span class="hljs-built_in">type</span>)                 Output Shape              Param <span class="hljs-comment">#   </span>
=================================================================
distilbert (TFDistilBertMain multiple                  <span class="hljs-number">66362880</span>  
_________________________________________________________________
vocab_transform (Dense)      multiple                  <span class="hljs-number">590592</span>    
_________________________________________________________________
vocab_layer_norm (LayerNorma multiple                  <span class="hljs-number">1536</span>      
_________________________________________________________________
vocab_projector (TFDistilBer multiple                  <span class="hljs-number">23866170</span>  
=================================================================
Total params: <span class="hljs-number">66</span>,<span class="hljs-number">985</span>,<span class="hljs-number">530</span>
Trainable params: <span class="hljs-number">66</span>,<span class="hljs-number">985</span>,<span class="hljs-number">530</span>
Non-trainable params: <span class="hljs-number">0</span>
_________________________________________________________________`}}),{c(){i=l("p"),h=a("Allons-y et t\xE9l\xE9chargeons DistilBERT en utilisant la classe "),d=l("code"),$=a("AutoModelForMaskedLM"),A=a(" :"),q=c(),w(k.$$.fragment),P=c(),f=l("p"),C=a("Nous pouvons voir combien de param\xE8tres ce mod\xE8le poss\xE8de en appelant la m\xE9thode "),O=l("code"),M=a("summary()"),T=a(" :"),U=c(),w(z.$$.fragment),D=c(),w(I.$$.fragment)},l(v){i=o(v,"P",{});var N=r(i);h=n(N,"Allons-y et t\xE9l\xE9chargeons DistilBERT en utilisant la classe "),d=o(N,"CODE",{});var W=r(d);$=n(W,"AutoModelForMaskedLM"),W.forEach(t),A=n(N," :"),N.forEach(t),q=_(v),E(k.$$.fragment,v),P=_(v),f=o(v,"P",{});var G=r(f);C=n(G,"Nous pouvons voir combien de param\xE8tres ce mod\xE8le poss\xE8de en appelant la m\xE9thode "),O=o(G,"CODE",{});var J=r(O);M=n(J,"summary()"),J.forEach(t),T=n(G," :"),G.forEach(t),U=_(v),E(z.$$.fragment,v),D=_(v),E(I.$$.fragment,v)},m(v,N){p(v,i,N),s(i,h),s(i,d),s(d,$),s(i,A),p(v,q,N),x(k,v,N),p(v,P,N),p(v,f,N),s(f,C),s(f,O),s(O,M),s(f,T),p(v,U,N),x(z,v,N),p(v,D,N),x(I,v,N),L=!0},i(v){L||(g(k.$$.fragment,v),g(z.$$.fragment,v),g(I.$$.fragment,v),L=!0)},o(v){b(k.$$.fragment,v),b(z.$$.fragment,v),b(I.$$.fragment,v),L=!1},d(v){v&&t(i),v&&t(q),j(k,v),v&&t(P),v&&t(f),v&&t(U),j(z,v),v&&t(D),j(I,v)}}}function ag(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U,z,D,I,L;return k=new S({props:{code:`from transformers import AutoModelForMaskedLM

model_checkpoint = "distilbert-base-uncased"
model = AutoModelForMaskedLM.from_pretrained(model_checkpoint)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoModelForMaskedLM

model_checkpoint = <span class="hljs-string">&quot;distilbert-base-uncased&quot;</span>
model = AutoModelForMaskedLM.from_pretrained(model_checkpoint)`}}),z=new S({props:{code:`distilbert_num_parameters = model.num_parameters() / 1_000_000
print(f"'>>> DistilBERT nombre de param\xE8tres : {round(distilbert_num_parameters)}M'")
print(f"'>>> BERT nombre de param\xE8tres : 110M'")`,highlighted:`distilbert_num_parameters = model.num_parameters() / <span class="hljs-number">1_000_000</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&#x27;&gt;&gt;&gt; DistilBERT nombre de param\xE8tres : <span class="hljs-subst">{<span class="hljs-built_in">round</span>(distilbert_num_parameters)}</span>M&#x27;&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&#x27;&gt;&gt;&gt; BERT nombre de param\xE8tres : 110M&#x27;&quot;</span>)`}}),I=new S({props:{code:`'>>> DistilBERT  nombre de param\xE8tres : 67M'
'>>> BERT nombre de param\xE8tres : 110M'`,highlighted:`<span class="hljs-string">&#x27;&gt;&gt;&gt; DistilBERT  nombre de param\xE8tres : 67M&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; BERT nombre de param\xE8tres : 110M&#x27;</span>`}}),{c(){i=l("p"),h=a("Allons-y et t\xE9l\xE9chargeons DistilBERT en utilisant la classe "),d=l("code"),$=a("AutoModelForMaskedLM"),A=a(" :"),q=c(),w(k.$$.fragment),P=c(),f=l("p"),C=a("Nous pouvons voir combien de param\xE8tres ce mod\xE8le poss\xE8de en appelant la m\xE9thode "),O=l("code"),M=a("num_parameters()"),T=a(" :"),U=c(),w(z.$$.fragment),D=c(),w(I.$$.fragment)},l(v){i=o(v,"P",{});var N=r(i);h=n(N,"Allons-y et t\xE9l\xE9chargeons DistilBERT en utilisant la classe "),d=o(N,"CODE",{});var W=r(d);$=n(W,"AutoModelForMaskedLM"),W.forEach(t),A=n(N," :"),N.forEach(t),q=_(v),E(k.$$.fragment,v),P=_(v),f=o(v,"P",{});var G=r(f);C=n(G,"Nous pouvons voir combien de param\xE8tres ce mod\xE8le poss\xE8de en appelant la m\xE9thode "),O=o(G,"CODE",{});var J=r(O);M=n(J,"num_parameters()"),J.forEach(t),T=n(G," :"),G.forEach(t),U=_(v),E(z.$$.fragment,v),D=_(v),E(I.$$.fragment,v)},m(v,N){p(v,i,N),s(i,h),s(i,d),s(d,$),s(i,A),p(v,q,N),x(k,v,N),p(v,P,N),p(v,f,N),s(f,C),s(f,O),s(O,M),s(f,T),p(v,U,N),x(z,v,N),p(v,D,N),x(I,v,N),L=!0},i(v){L||(g(k.$$.fragment,v),g(z.$$.fragment,v),g(I.$$.fragment,v),L=!0)},o(v){b(k.$$.fragment,v),b(z.$$.fragment,v),b(I.$$.fragment,v),L=!1},d(v){v&&t(i),v&&t(q),j(k,v),v&&t(P),v&&t(f),v&&t(U),j(z,v),v&&t(D),j(I,v)}}}function ng(H){let i,h;return i=new S({props:{code:`import numpy as np
import tensorflow as tf

inputs = tokenizer(text, return_tensors="np")
token_logits = model(**inputs).logits
# Trouve l'emplacement de [MASK] et extrait ses logits
mask_token_index = np.argwhere(inputs["input_ids"] == tokenizer.mask_token_id)[0, 1]
mask_token_logits = token_logits[0, mask_token_index, :]
# On choisit les candidats [MASK] avec les logits les plus \xE9lev\xE9s
# Nous annulons le tableau avant argsort pour obtenir le plus grand, et non le plus petit, logits
top_5_tokens = np.argsort(-mask_token_logits)[:5].tolist()

for token in top_5_tokens:
    print(f">>> {text.replace(tokenizer.mask_token, tokenizer.decode([token]))}")`,highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf

inputs = tokenizer(text, return_tensors=<span class="hljs-string">&quot;np&quot;</span>)
token_logits = model(**inputs).logits
<span class="hljs-comment"># Trouve l&#x27;emplacement de [MASK] et extrait ses logits</span>
mask_token_index = np.argwhere(inputs[<span class="hljs-string">&quot;input_ids&quot;</span>] == tokenizer.mask_token_id)[<span class="hljs-number">0</span>, <span class="hljs-number">1</span>]
mask_token_logits = token_logits[<span class="hljs-number">0</span>, mask_token_index, :]
<span class="hljs-comment"># On choisit les candidats [MASK] avec les logits les plus \xE9lev\xE9s</span>
<span class="hljs-comment"># Nous annulons le tableau avant argsort pour obtenir le plus grand, et non le plus petit, logits</span>
top_5_tokens = np.argsort(-mask_token_logits)[:<span class="hljs-number">5</span>].tolist()

<span class="hljs-keyword">for</span> token <span class="hljs-keyword">in</span> top_5_tokens:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&gt;&gt;&gt; <span class="hljs-subst">{text.replace(tokenizer.mask_token, tokenizer.decode([token]))}</span>&quot;</span>)`}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function lg(H){let i,h;return i=new S({props:{code:`import torch

inputs = tokenizer(text, return_tensors="pt")
token_logits = model(**inputs).logits
# Trouve l'emplacement de [MASK] et extrait ses logits
mask_token_index = torch.where(inputs["input_ids"] == tokenizer.mask_token_id)[1]
mask_token_logits = token_logits[0, mask_token_index, :]
# Choisissez les candidats [MASK] avec les logits les plus \xE9lev\xE9s
top_5_tokens = torch.topk(mask_token_logits, 5, dim=1).indices[0].tolist()

for token in top_5_tokens:
    print(f"'>>> {text.replace(tokenizer.mask_token, tokenizer.decode([token]))}'")`,highlighted:`<span class="hljs-keyword">import</span> torch

inputs = tokenizer(text, return_tensors=<span class="hljs-string">&quot;pt&quot;</span>)
token_logits = model(**inputs).logits
<span class="hljs-comment"># Trouve l&#x27;emplacement de [MASK] et extrait ses logits</span>
mask_token_index = torch.where(inputs[<span class="hljs-string">&quot;input_ids&quot;</span>] == tokenizer.mask_token_id)[<span class="hljs-number">1</span>]
mask_token_logits = token_logits[<span class="hljs-number">0</span>, mask_token_index, :]
<span class="hljs-comment"># Choisissez les candidats [MASK] avec les logits les plus \xE9lev\xE9s</span>
top_5_tokens = torch.topk(mask_token_logits, <span class="hljs-number">5</span>, dim=<span class="hljs-number">1</span>).indices[<span class="hljs-number">0</span>].tolist()

<span class="hljs-keyword">for</span> token <span class="hljs-keyword">in</span> top_5_tokens:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&#x27;&gt;&gt;&gt; <span class="hljs-subst">{text.replace(tokenizer.mask_token, tokenizer.decode([token]))}</span>&#x27;&quot;</span>)`}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function og(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U,z,D,I,L,v,N,W,G,J,se,ie,te;return{c(){i=l("p"),h=a("\u270F\uFE0F "),d=l("strong"),$=a("Essayez !"),A=a(" Cr\xE9ez un \xE9chantillon al\xE9atoire de la r\xE9partition "),q=l("code"),k=a("unsupervised"),P=a(" et v\xE9rifiez que les \xE9tiquettes ne sont ni "),f=l("code"),C=a("0"),O=a(" ni "),M=l("code"),T=a("1"),U=a(". Pendant que vous y \xEAtes, vous pouvez aussi v\xE9rifier que les \xE9tiquettes dans les \xE9chantillons "),z=l("code"),D=a("train"),I=a(" et "),L=l("code"),v=a("test"),N=a(" sont bien "),W=l("code"),G=a("0"),J=a(" ou "),se=l("code"),ie=a("1"),te=a(". C\u2019est un contr\xF4le utile que tout praticien en NLP devrait effectuer au d\xE9but d\u2019un nouveau projet !")},l(ee){i=o(ee,"P",{});var K=r(i);h=n(K,"\u270F\uFE0F "),d=o(K,"STRONG",{});var ue=r(d);$=n(ue,"Essayez !"),ue.forEach(t),A=n(K," Cr\xE9ez un \xE9chantillon al\xE9atoire de la r\xE9partition "),q=o(K,"CODE",{});var Z=r(q);k=n(Z,"unsupervised"),Z.forEach(t),P=n(K," et v\xE9rifiez que les \xE9tiquettes ne sont ni "),f=o(K,"CODE",{});var ae=r(f);C=n(ae,"0"),ae.forEach(t),O=n(K," ni "),M=o(K,"CODE",{});var de=r(M);T=n(de,"1"),de.forEach(t),U=n(K,". Pendant que vous y \xEAtes, vous pouvez aussi v\xE9rifier que les \xE9tiquettes dans les \xE9chantillons "),z=o(K,"CODE",{});var V=r(z);D=n(V,"train"),V.forEach(t),I=n(K," et "),L=o(K,"CODE",{});var Ee=r(L);v=n(Ee,"test"),Ee.forEach(t),N=n(K," sont bien "),W=o(K,"CODE",{});var ne=r(W);G=n(ne,"0"),ne.forEach(t),J=n(K," ou "),se=o(K,"CODE",{});var me=r(se);ie=n(me,"1"),me.forEach(t),te=n(K,". C\u2019est un contr\xF4le utile que tout praticien en NLP devrait effectuer au d\xE9but d\u2019un nouveau projet !"),K.forEach(t)},m(ee,K){p(ee,i,K),s(i,h),s(i,d),s(d,$),s(i,A),s(i,q),s(q,k),s(i,P),s(i,f),s(f,C),s(i,O),s(i,M),s(M,T),s(i,U),s(i,z),s(z,D),s(i,I),s(i,L),s(L,v),s(i,N),s(i,W),s(W,G),s(i,J),s(i,se),s(se,ie),s(i,te)},d(ee){ee&&t(i)}}}function rg(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U,z,D,I,L,v,N,W,G,J,se,ie,te;return{c(){i=l("p"),h=a("\u270F\uFE0F "),d=l("strong"),$=a("Essayez !"),A=a(" Certains "),q=l("em"),k=a("transformers"),P=a(", comme "),f=l("a"),C=a("BigBird"),O=a(" et "),M=l("a"),T=a("Longformer"),U=a(", ont une longueur de contexte beaucoup plus longue que BERT et les autres premiers "),z=l("em"),D=a("transformers"),I=a(". Instanciez le "),L=l("em"),v=a("tokenizer"),N=a(" pour l\u2019un de ces "),W=l("em"),G=a("checkpoints"),J=a(" et v\xE9rifiez que le "),se=l("code"),ie=a("model_max_length"),te=a(" correspond \xE0 ce qui est indiqu\xE9 sur sa carte."),this.h()},l(ee){i=o(ee,"P",{});var K=r(i);h=n(K,"\u270F\uFE0F "),d=o(K,"STRONG",{});var ue=r(d);$=n(ue,"Essayez !"),ue.forEach(t),A=n(K," Certains "),q=o(K,"EM",{});var Z=r(q);k=n(Z,"transformers"),Z.forEach(t),P=n(K,", comme "),f=o(K,"A",{href:!0,rel:!0});var ae=r(f);C=n(ae,"BigBird"),ae.forEach(t),O=n(K," et "),M=o(K,"A",{href:!0});var de=r(M);T=n(de,"Longformer"),de.forEach(t),U=n(K,", ont une longueur de contexte beaucoup plus longue que BERT et les autres premiers "),z=o(K,"EM",{});var V=r(z);D=n(V,"transformers"),V.forEach(t),I=n(K,". Instanciez le "),L=o(K,"EM",{});var Ee=r(L);v=n(Ee,"tokenizer"),Ee.forEach(t),N=n(K," pour l\u2019un de ces "),W=o(K,"EM",{});var ne=r(W);G=n(ne,"checkpoints"),ne.forEach(t),J=n(K," et v\xE9rifiez que le "),se=o(K,"CODE",{});var me=r(se);ie=n(me,"model_max_length"),me.forEach(t),te=n(K," correspond \xE0 ce qui est indiqu\xE9 sur sa carte."),K.forEach(t),this.h()},h(){y(f,"href","https://huggingface.co/google/bigbird-roberta-base"),y(f,"rel","nofollow"),y(M,"href","hf.co/allenai/longformer-base-4096")},m(ee,K){p(ee,i,K),s(i,h),s(i,d),s(d,$),s(i,A),s(i,q),s(q,k),s(i,P),s(i,f),s(f,C),s(i,O),s(i,M),s(M,T),s(i,U),s(i,z),s(z,D),s(i,I),s(i,L),s(L,v),s(i,N),s(i,W),s(W,G),s(i,J),s(i,se),s(se,ie),s(i,te)},d(ee){ee&&t(i)}}}function ig(H){let i,h;return{c(){i=l("p"),h=a("Notez que l\u2019utilisation d\u2019une petite taille peut \xEAtre pr\xE9judiciable dans les sc\xE9narios du monde r\xE9el. Vous devez donc utiliser une taille qui correspond au cas d\u2019utilisation auquel vous appliquerez votre mod\xE8le.")},l(d){i=o(d,"P",{});var $=r(i);h=n($,"Notez que l\u2019utilisation d\u2019une petite taille peut \xEAtre pr\xE9judiciable dans les sc\xE9narios du monde r\xE9el. Vous devez donc utiliser une taille qui correspond au cas d\u2019utilisation auquel vous appliquerez votre mod\xE8le."),$.forEach(t)},m(d,$){p(d,i,$),s(i,h)},d(d){d&&t(i)}}}function ug(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U;return{c(){i=l("p"),h=a("\u270F\uFE0F "),d=l("strong"),$=a("Essayez"),A=a(" Ex\xE9cutez le code ci-dessus plusieurs fois pour voir le masquage al\xE9atoire se produire sous vos yeux ! Remplacez aussi la m\xE9thode "),q=l("code"),k=a("tokenizer.decode()"),P=a(" par "),f=l("code"),C=a("tokenizer.convert_ids_to_tokens()"),O=a(" pour voir que parfois un seul "),M=l("em"),T=a("token"),U=a(" d\u2019un mot donn\xE9 est masqu\xE9 et pas les autres.")},l(z){i=o(z,"P",{});var D=r(i);h=n(D,"\u270F\uFE0F "),d=o(D,"STRONG",{});var I=r(d);$=n(I,"Essayez"),I.forEach(t),A=n(D," Ex\xE9cutez le code ci-dessus plusieurs fois pour voir le masquage al\xE9atoire se produire sous vos yeux ! Remplacez aussi la m\xE9thode "),q=o(D,"CODE",{});var L=r(q);k=n(L,"tokenizer.decode()"),L.forEach(t),P=n(D," par "),f=o(D,"CODE",{});var v=r(f);C=n(v,"tokenizer.convert_ids_to_tokens()"),v.forEach(t),O=n(D," pour voir que parfois un seul "),M=o(D,"EM",{});var N=r(M);T=n(N,"token"),N.forEach(t),U=n(D," d\u2019un mot donn\xE9 est masqu\xE9 et pas les autres."),D.forEach(t)},m(z,D){p(z,i,D),s(i,h),s(i,d),s(d,$),s(i,A),s(i,q),s(q,k),s(i,P),s(i,f),s(f,C),s(i,O),s(i,M),s(M,T),s(i,U)},d(z){z&&t(i)}}}function Hv(H){let i,h,d,$,A,q,k,P,f,C,O;return{c(){i=l("p"),h=a("Un effet secondaire du masquage al\xE9atoire est que nos m\xE9triques d\u2019\xE9valuation ne seront pas d\xE9terministes lorsque nous utilisons la fonction "),d=l("code"),$=a("Trainer"),A=a(" puisque nous utilisons le m\xEAme assembleur de donn\xE9es pour les \xE9chantillons d\u2019entra\xEEnement et de test. Nous verrons plus tard, lorsque nous examinerons le "),q=l("em"),k=a("finetuning"),P=a(" avec \u{1F917} "),f=l("em"),C=a("Accelerate"),O=a(", comment nous pouvons utiliser la flexibilit\xE9 d\u2019une boucle d\u2019\xE9valuation personnalis\xE9e pour geler le caract\xE8re al\xE9atoire.")},l(M){i=o(M,"P",{});var T=r(i);h=n(T,"Un effet secondaire du masquage al\xE9atoire est que nos m\xE9triques d\u2019\xE9valuation ne seront pas d\xE9terministes lorsque nous utilisons la fonction "),d=o(T,"CODE",{});var U=r(d);$=n(U,"Trainer"),U.forEach(t),A=n(T," puisque nous utilisons le m\xEAme assembleur de donn\xE9es pour les \xE9chantillons d\u2019entra\xEEnement et de test. Nous verrons plus tard, lorsque nous examinerons le "),q=o(T,"EM",{});var z=r(q);k=n(z,"finetuning"),z.forEach(t),P=n(T," avec \u{1F917} "),f=o(T,"EM",{});var D=r(f);C=n(D,"Accelerate"),D.forEach(t),O=n(T,", comment nous pouvons utiliser la flexibilit\xE9 d\u2019une boucle d\u2019\xE9valuation personnalis\xE9e pour geler le caract\xE8re al\xE9atoire."),T.forEach(t)},m(M,T){p(M,i,T),s(i,h),s(i,d),s(d,$),s(i,A),s(i,q),s(q,k),s(i,P),s(i,f),s(f,C),s(i,O)},d(M){M&&t(i)}}}function pg(H){let i,h;return i=new S({props:{code:`import collections
import numpy as np

from transformers.data.data_collator import tf_default_data_collator

wwm_probability = 0.2


def whole_word_masking_data_collator(features):
    for feature in features:
        word_ids = feature.pop("word_ids")

        # Cr\xE9ation d'une correspondance entre les mots et les indices des tokens correspondants
        mapping = collections.defaultdict(list)
        current_word_index = -1
        current_word = None
        for idx, word_id in enumerate(word_ids):
            if word_id is not None:
                if word_id != current_word:
                    current_word = word_id
                    current_word_index += 1
                mapping[current_word_index].append(idx)

        # Masquer des mots de fa\xE7on al\xE9atoire
        mask = np.random.binomial(1, wwm_probability, (len(mapping),))
        input_ids = feature["input_ids"]
        labels = feature["labels"]
        new_labels = [-100] * len(labels)
        for word_id in np.where(mask)[0]:
            word_id = word_id.item()
            for idx in mapping[word_id]:
                new_labels[idx] = labels[idx]
                input_ids[idx] = tokenizer.mask_token_id
        feature["labels"] = new_labels

    return tf_default_data_collator(features)`,highlighted:`<span class="hljs-keyword">import</span> collections
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np

<span class="hljs-keyword">from</span> transformers.data.data_collator <span class="hljs-keyword">import</span> tf_default_data_collator

wwm_probability = <span class="hljs-number">0.2</span>


<span class="hljs-keyword">def</span> <span class="hljs-title function_">whole_word_masking_data_collator</span>(<span class="hljs-params">features</span>):
    <span class="hljs-keyword">for</span> feature <span class="hljs-keyword">in</span> features:
        word_ids = feature.pop(<span class="hljs-string">&quot;word_ids&quot;</span>)

        <span class="hljs-comment"># Cr\xE9ation d&#x27;une correspondance entre les mots et les indices des tokens correspondants</span>
        mapping = collections.defaultdict(<span class="hljs-built_in">list</span>)
        current_word_index = -<span class="hljs-number">1</span>
        current_word = <span class="hljs-literal">None</span>
        <span class="hljs-keyword">for</span> idx, word_id <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(word_ids):
            <span class="hljs-keyword">if</span> word_id <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> <span class="hljs-literal">None</span>:
                <span class="hljs-keyword">if</span> word_id != current_word:
                    current_word = word_id
                    current_word_index += <span class="hljs-number">1</span>
                mapping[current_word_index].append(idx)

        <span class="hljs-comment"># Masquer des mots de fa\xE7on al\xE9atoire</span>
        mask = np.random.binomial(<span class="hljs-number">1</span>, wwm_probability, (<span class="hljs-built_in">len</span>(mapping),))
        input_ids = feature[<span class="hljs-string">&quot;input_ids&quot;</span>]
        labels = feature[<span class="hljs-string">&quot;labels&quot;</span>]
        new_labels = [-<span class="hljs-number">100</span>] * <span class="hljs-built_in">len</span>(labels)
        <span class="hljs-keyword">for</span> word_id <span class="hljs-keyword">in</span> np.where(mask)[<span class="hljs-number">0</span>]:
            word_id = word_id.item()
            <span class="hljs-keyword">for</span> idx <span class="hljs-keyword">in</span> mapping[word_id]:
                new_labels[idx] = labels[idx]
                input_ids[idx] = tokenizer.mask_token_id
        feature[<span class="hljs-string">&quot;labels&quot;</span>] = new_labels

    <span class="hljs-keyword">return</span> tf_default_data_collator(features)`}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function dg(H){let i,h;return i=new S({props:{code:`import collections
import numpy as np

from transformers import default_data_collator

wwm_probability = 0.2


def whole_word_masking_data_collator(features):
    for feature in features:
        word_ids = feature.pop("word_ids")

        # Cr\xE9ation d'une correspondance entre les mots et les indices des tokens correspondants
        mapping = collections.defaultdict(list)
        current_word_index = -1
        current_word = None
        for idx, word_id in enumerate(word_ids):
            if word_id is not None:
                if word_id != current_word:
                    current_word = word_id
                    current_word_index += 1
                mapping[current_word_index].append(idx)

        # Masquer des mots de fa\xE7on al\xE9atoire
        mask = np.random.binomial(1, wwm_probability, (len(mapping),))
        input_ids = feature["input_ids"]
        labels = feature["labels"]
        new_labels = [-100] * len(labels)
        for word_id in np.where(mask)[0]:
            word_id = word_id.item()
            for idx in mapping[word_id]:
                new_labels[idx] = labels[idx]
                input_ids[idx] = tokenizer.mask_token_id
        feature["labels"] = new_labels

    return default_data_collator(features)`,highlighted:`<span class="hljs-keyword">import</span> collections
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np

<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> default_data_collator

wwm_probability = <span class="hljs-number">0.2</span>


<span class="hljs-keyword">def</span> <span class="hljs-title function_">whole_word_masking_data_collator</span>(<span class="hljs-params">features</span>):
    <span class="hljs-keyword">for</span> feature <span class="hljs-keyword">in</span> features:
        word_ids = feature.pop(<span class="hljs-string">&quot;word_ids&quot;</span>)

        <span class="hljs-comment"># Cr\xE9ation d&#x27;une correspondance entre les mots et les indices des tokens correspondants</span>
        mapping = collections.defaultdict(<span class="hljs-built_in">list</span>)
        current_word_index = -<span class="hljs-number">1</span>
        current_word = <span class="hljs-literal">None</span>
        <span class="hljs-keyword">for</span> idx, word_id <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(word_ids):
            <span class="hljs-keyword">if</span> word_id <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> <span class="hljs-literal">None</span>:
                <span class="hljs-keyword">if</span> word_id != current_word:
                    current_word = word_id
                    current_word_index += <span class="hljs-number">1</span>
                mapping[current_word_index].append(idx)

        <span class="hljs-comment"># Masquer des mots de fa\xE7on al\xE9atoire</span>
        mask = np.random.binomial(<span class="hljs-number">1</span>, wwm_probability, (<span class="hljs-built_in">len</span>(mapping),))
        input_ids = feature[<span class="hljs-string">&quot;input_ids&quot;</span>]
        labels = feature[<span class="hljs-string">&quot;labels&quot;</span>]
        new_labels = [-<span class="hljs-number">100</span>] * <span class="hljs-built_in">len</span>(labels)
        <span class="hljs-keyword">for</span> word_id <span class="hljs-keyword">in</span> np.where(mask)[<span class="hljs-number">0</span>]:
            word_id = word_id.item()
            <span class="hljs-keyword">for</span> idx <span class="hljs-keyword">in</span> mapping[word_id]:
                new_labels[idx] = labels[idx]
                input_ids[idx] = tokenizer.mask_token_id
        feature[<span class="hljs-string">&quot;labels&quot;</span>] = new_labels

    <span class="hljs-keyword">return</span> default_data_collator(features)`}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function mg(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U;return{c(){i=l("p"),h=a("\u270F\uFE0F "),d=l("strong"),$=a("Essayez"),A=a(" Ex\xE9cutez le code ci-dessus plusieurs fois pour voir le masquage al\xE9atoire se produire sous vos yeux ! Remplacez aussi la m\xE9thode "),q=l("code"),k=a("tokenizer.decode()"),P=a(" par "),f=l("code"),C=a("tokenizer.convert_ids_to_tokens()"),O=a(" pour voir que les "),M=l("em"),T=a("tokens"),U=a(" d\u2019un mot donn\xE9 sont toujours masqu\xE9s ensemble.")},l(z){i=o(z,"P",{});var D=r(i);h=n(D,"\u270F\uFE0F "),d=o(D,"STRONG",{});var I=r(d);$=n(I,"Essayez"),I.forEach(t),A=n(D," Ex\xE9cutez le code ci-dessus plusieurs fois pour voir le masquage al\xE9atoire se produire sous vos yeux ! Remplacez aussi la m\xE9thode "),q=o(D,"CODE",{});var L=r(q);k=n(L,"tokenizer.decode()"),L.forEach(t),P=n(D," par "),f=o(D,"CODE",{});var v=r(f);C=n(v,"tokenizer.convert_ids_to_tokens()"),v.forEach(t),O=n(D," pour voir que les "),M=o(D,"EM",{});var N=r(M);T=n(N,"tokens"),N.forEach(t),U=n(D," d\u2019un mot donn\xE9 sont toujours masqu\xE9s ensemble."),D.forEach(t)},m(z,D){p(z,i,D),s(i,h),s(i,d),s(d,$),s(i,A),s(i,q),s(q,k),s(i,P),s(i,f),s(f,C),s(i,O),s(i,M),s(M,T),s(i,U)},d(z){z&&t(i)}}}function cg(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U,z,D,I,L,v,N,W,G,J,se,ie,te,ee,K,ue,Z,ae,de,V,Ee,ne,me,is,Ne,Oe,us,Le,Ke,ps,xe,Me,Re,Xe,X,ge,Be,Fe,ds,Ge,be,Ce,re,_e,je,ke,qe,Ze,ye,ms,es,He,B,Q,Ve;return k=new S({props:{code:`from transformers import TrainingArguments

batch_size = 64
# Montrer la perte d'entra\xEEnement \xE0 chaque \xE9poque
logging_steps = len(downsampled_dataset["train"]) // batch_size
model_name = model_checkpoint.split("/")[-1]

training_args = TrainingArguments(
    output_dir=f"{model_name}-finetuned-imdb",
    overwrite_output_dir=True,
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    weight_decay=0.01,
    per_device_train_batch_size=batch_size,
    per_device_eval_batch_size=batch_size,
    push_to_hub=True,
    fp16=True,
    logging_steps=logging_steps,
)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TrainingArguments

batch_size = <span class="hljs-number">64</span>
<span class="hljs-comment"># Montrer la perte d&#x27;entra\xEEnement \xE0 chaque \xE9poque</span>
logging_steps = <span class="hljs-built_in">len</span>(downsampled_dataset[<span class="hljs-string">&quot;train&quot;</span>]) // batch_size
model_name = model_checkpoint.split(<span class="hljs-string">&quot;/&quot;</span>)[-<span class="hljs-number">1</span>]

training_args = TrainingArguments(
    output_dir=<span class="hljs-string">f&quot;<span class="hljs-subst">{model_name}</span>-finetuned-imdb&quot;</span>,
    overwrite_output_dir=<span class="hljs-literal">True</span>,
    evaluation_strategy=<span class="hljs-string">&quot;epoch&quot;</span>,
    learning_rate=<span class="hljs-number">2e-5</span>,
    weight_decay=<span class="hljs-number">0.01</span>,
    per_device_train_batch_size=batch_size,
    per_device_eval_batch_size=batch_size,
    push_to_hub=<span class="hljs-literal">True</span>,
    fp16=<span class="hljs-literal">True</span>,
    logging_steps=logging_steps,
)`}}),je=new S({props:{code:`from transformers import Trainer

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=downsampled_dataset["train"],
    eval_dataset=downsampled_dataset["test"],
    data_collator=data_collator,
    tokenizer=tokenizer,
)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> Trainer

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=downsampled_dataset[<span class="hljs-string">&quot;train&quot;</span>],
    eval_dataset=downsampled_dataset[<span class="hljs-string">&quot;test&quot;</span>],
    data_collator=data_collator,
    tokenizer=tokenizer,
)`}}),{c(){i=l("p"),h=a("Une fois que nous sommes connect\xE9s, nous pouvons sp\xE9cifier les arguments pour le "),d=l("code"),$=a("Trainer"),A=a(" :"),q=c(),w(k.$$.fragment),P=c(),f=l("p"),C=a("Ici, nous avons modifi\xE9 quelques options par d\xE9faut, y compris "),O=l("code"),M=a("logging_steps"),T=a(" pour s\u2019assurer que nous suivons la perte d\u2019entra\xEEnement \xE0 chaque \xE9poque. Nous avons \xE9galement utilis\xE9 "),U=l("code"),z=a("fp16=True"),D=a(" pour activer l\u2019entra\xEEnement en pr\xE9cision mixte, ce qui nous donne un autre gain de vitesse. Par d\xE9faut, "),I=l("code"),L=a("Trainer"),v=a(" va supprimer toutes les colonnes qui ne font pas partie de la m\xE9thode "),N=l("code"),W=a("forward()"),G=a(" du mod\xE8le. Cela signifie que si vous utilisez l\u2019assembleur de masquage de mots entiers, vous devrez \xE9galement d\xE9finir "),J=l("code"),se=a("remove_unused_columns=False"),ie=a(" pour vous assurer que nous ne perdons pas la colonne "),te=l("code"),ee=a("word_ids"),K=a(" pendant l\u2019entra\xEEnement."),ue=c(),Z=l("p"),ae=a("Notez que vous pouvez sp\xE9cifier le nom du d\xE9p\xF4t vers lequel vous voulez pousser avec l\u2019argument "),de=l("code"),V=a("hub_model_id"),Ee=a(" (en particulier, vous devrez utiliser cet argument pour pousser vers une organisation). Par exemple, lorsque nous avons pouss\xE9 le mod\xE8le vers l\u2019organisation "),ne=l("a"),me=l("code"),is=a("huggingface-course"),Ne=a(", nous avons ajout\xE9 "),Oe=l("code"),us=a('hub_model_id="huggingface-course/distilbert-finetuned-imdb"'),Le=c(),Ke=l("code"),ps=a("TrainingArguments"),xe=a(". Par d\xE9faut, le d\xE9p\xF4t utilis\xE9 sera dans votre espace de noms et nomm\xE9 apr\xE8s le r\xE9pertoire de sortie que vous avez d\xE9fini, donc dans notre cas ce sera "),Me=l("code"),Re=a('"lewtun/distilbert-finetuned-imdb"'),Xe=a("."),X=c(),ge=l("p"),Be=a("Nous avons maintenant tous les ingr\xE9dients pour instancier le "),Fe=l("code"),ds=a("Trainer"),Ge=a(". Ici, nous utilisons juste l\u2019assembleur standard "),be=l("code"),Ce=a("data_collator"),re=a(", mais vous pouvez essayer l\u2019assembleur de masquage de mots entiers et comparer les r\xE9sultats comme exercice :"),_e=c(),w(je.$$.fragment),ke=c(),qe=l("p"),Ze=a("Nous sommes maintenant pr\xEAts \xE0 ex\xE9cuter "),ye=l("code"),ms=a("trainer.train()"),es=a(". Mais avant, regardons bri\xE8vement la "),He=l("em"),B=a("perplexit\xE9"),Q=a(" qui est une m\xE9trique commune pour \xE9valuer la performance des mod\xE8les de langage."),this.h()},l(F){i=o(F,"P",{});var Y=r(i);h=n(Y,"Une fois que nous sommes connect\xE9s, nous pouvons sp\xE9cifier les arguments pour le "),d=o(Y,"CODE",{});var $e=r(d);$=n($e,"Trainer"),$e.forEach(t),A=n(Y," :"),Y.forEach(t),q=_(F),E(k.$$.fragment,F),P=_(F),f=o(F,"P",{});var le=r(f);C=n(le,"Ici, nous avons modifi\xE9 quelques options par d\xE9faut, y compris "),O=o(le,"CODE",{});var Pe=r(O);M=n(Pe,"logging_steps"),Pe.forEach(t),T=n(le," pour s\u2019assurer que nous suivons la perte d\u2019entra\xEEnement \xE0 chaque \xE9poque. Nous avons \xE9galement utilis\xE9 "),U=o(le,"CODE",{});var Ns=r(U);z=n(Ns,"fp16=True"),Ns.forEach(t),D=n(le," pour activer l\u2019entra\xEEnement en pr\xE9cision mixte, ce qui nous donne un autre gain de vitesse. Par d\xE9faut, "),I=o(le,"CODE",{});var We=r(I);L=n(We,"Trainer"),We.forEach(t),v=n(le," va supprimer toutes les colonnes qui ne font pas partie de la m\xE9thode "),N=o(le,"CODE",{});var ss=r(N);W=n(ss,"forward()"),ss.forEach(t),G=n(le," du mod\xE8le. Cela signifie que si vous utilisez l\u2019assembleur de masquage de mots entiers, vous devrez \xE9galement d\xE9finir "),J=o(le,"CODE",{});var pe=r(J);se=n(pe,"remove_unused_columns=False"),pe.forEach(t),ie=n(le," pour vous assurer que nous ne perdons pas la colonne "),te=o(le,"CODE",{});var De=r(te);ee=n(De,"word_ids"),De.forEach(t),K=n(le," pendant l\u2019entra\xEEnement."),le.forEach(t),ue=_(F),Z=o(F,"P",{});var fe=r(Z);ae=n(fe,"Notez que vous pouvez sp\xE9cifier le nom du d\xE9p\xF4t vers lequel vous voulez pousser avec l\u2019argument "),de=o(fe,"CODE",{});var cs=r(de);V=n(cs,"hub_model_id"),cs.forEach(t),Ee=n(fe," (en particulier, vous devrez utiliser cet argument pour pousser vers une organisation). Par exemple, lorsque nous avons pouss\xE9 le mod\xE8le vers l\u2019organisation "),ne=o(fe,"A",{href:!0,rel:!0});var ks=r(ne);me=o(ks,"CODE",{});var he=r(me);is=n(he,"huggingface-course"),he.forEach(t),ks.forEach(t),Ne=n(fe,", nous avons ajout\xE9 "),Oe=o(fe,"CODE",{});var Os=r(Oe);us=n(Os,'hub_model_id="huggingface-course/distilbert-finetuned-imdb"'),Os.forEach(t),Le=_(fe),Ke=o(fe,"CODE",{});var Je=r(Ke);ps=n(Je,"TrainingArguments"),Je.forEach(t),xe=n(fe,". Par d\xE9faut, le d\xE9p\xF4t utilis\xE9 sera dans votre espace de noms et nomm\xE9 apr\xE8s le r\xE9pertoire de sortie que vous avez d\xE9fini, donc dans notre cas ce sera "),Me=o(fe,"CODE",{});var oe=r(Me);Re=n(oe,'"lewtun/distilbert-finetuned-imdb"'),oe.forEach(t),Xe=n(fe,"."),fe.forEach(t),X=_(F),ge=o(F,"P",{});var ze=r(ge);Be=n(ze,"Nous avons maintenant tous les ingr\xE9dients pour instancier le "),Fe=o(ze,"CODE",{});var qs=r(Fe);ds=n(qs,"Trainer"),qs.forEach(t),Ge=n(ze,". Ici, nous utilisons juste l\u2019assembleur standard "),be=o(ze,"CODE",{});var _s=r(be);Ce=n(_s,"data_collator"),_s.forEach(t),re=n(ze,", mais vous pouvez essayer l\u2019assembleur de masquage de mots entiers et comparer les r\xE9sultats comme exercice :"),ze.forEach(t),_e=_(F),E(je.$$.fragment,F),ke=_(F),qe=o(F,"P",{});var $s=r(qe);Ze=n($s,"Nous sommes maintenant pr\xEAts \xE0 ex\xE9cuter "),ye=o($s,"CODE",{});var rt=r(ye);ms=n(rt,"trainer.train()"),rt.forEach(t),es=n($s,". Mais avant, regardons bri\xE8vement la "),He=o($s,"EM",{});var fs=r(He);B=n(fs,"perplexit\xE9"),fs.forEach(t),Q=n($s," qui est une m\xE9trique commune pour \xE9valuer la performance des mod\xE8les de langage."),$s.forEach(t),this.h()},h(){y(ne,"href","https://huggingface.co/huggingface-course"),y(ne,"rel","nofollow")},m(F,Y){p(F,i,Y),s(i,h),s(i,d),s(d,$),s(i,A),p(F,q,Y),x(k,F,Y),p(F,P,Y),p(F,f,Y),s(f,C),s(f,O),s(O,M),s(f,T),s(f,U),s(U,z),s(f,D),s(f,I),s(I,L),s(f,v),s(f,N),s(N,W),s(f,G),s(f,J),s(J,se),s(f,ie),s(f,te),s(te,ee),s(f,K),p(F,ue,Y),p(F,Z,Y),s(Z,ae),s(Z,de),s(de,V),s(Z,Ee),s(Z,ne),s(ne,me),s(me,is),s(Z,Ne),s(Z,Oe),s(Oe,us),s(Z,Le),s(Z,Ke),s(Ke,ps),s(Z,xe),s(Z,Me),s(Me,Re),s(Z,Xe),p(F,X,Y),p(F,ge,Y),s(ge,Be),s(ge,Fe),s(Fe,ds),s(ge,Ge),s(ge,be),s(be,Ce),s(ge,re),p(F,_e,Y),x(je,F,Y),p(F,ke,Y),p(F,qe,Y),s(qe,Ze),s(qe,ye),s(ye,ms),s(qe,es),s(qe,He),s(He,B),s(qe,Q),Ve=!0},i(F){Ve||(g(k.$$.fragment,F),g(je.$$.fragment,F),Ve=!0)},o(F){b(k.$$.fragment,F),b(je.$$.fragment,F),Ve=!1},d(F){F&&t(i),F&&t(q),j(k,F),F&&t(P),F&&t(f),F&&t(ue),F&&t(Z),F&&t(X),F&&t(ge),F&&t(_e),j(je,F),F&&t(ke),F&&t(qe)}}}function _g(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U,z,D,I,L,v,N,W,G,J,se,ie,te,ee,K,ue,Z,ae,de,V,Ee,ne,me,is,Ne,Oe,us,Le,Ke,ps,xe,Me,Re,Xe,X,ge,Be,Fe,ds,Ge,be,Ce,re,_e,je,ke,qe,Ze,ye,ms,es,He;return T=new S({props:{code:`tf_train_dataset = model.prepare_tf_dataset(
    downsampled_dataset["train"],
    collate_fn=data_collator,
    shuffle=True,
    batch_size=32,
)

tf_eval_dataset = model.prepare_tf_dataset(
    downsampled_dataset["test"],
    collate_fn=data_collator,
    shuffle=False,
    batch_size=32,
)`,highlighted:`tf_train_dataset = model.prepare_tf_dataset(
    downsampled_dataset[<span class="hljs-string">&quot;train&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">True</span>,
    batch_size=<span class="hljs-number">32</span>,
)

tf_eval_dataset = model.prepare_tf_dataset(
    downsampled_dataset[<span class="hljs-string">&quot;test&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">False</span>,
    batch_size=<span class="hljs-number">32</span>,
)`}}),Ce=new S({props:{code:`from transformers import create_optimizer
from transformers.keras_callbacks import PushToHubCallback
import tensorflow as tf

num_train_steps = len(tf_train_dataset)
optimizer, schedule = create_optimizer(
    init_lr=2e-5,
    num_warmup_steps=1_000,
    num_train_steps=num_train_steps,
    weight_decay_rate=0.01,
)
model.compile(optimizer=optimizer)

# Entra\xEEner en mixed-precision float16
tf.keras.mixed_precision.set_global_policy("mixed_float16")

model_name = model_checkpoint.split("/")[-1]
callback = PushToHubCallback(
    output_dir=f"{model_name}-finetuned-imdb", tokenizer=tokenizer
)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> create_optimizer
<span class="hljs-keyword">from</span> transformers.keras_callbacks <span class="hljs-keyword">import</span> PushToHubCallback
<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf

num_train_steps = <span class="hljs-built_in">len</span>(tf_train_dataset)
optimizer, schedule = create_optimizer(
    init_lr=<span class="hljs-number">2e-5</span>,
    num_warmup_steps=<span class="hljs-number">1_000</span>,
    num_train_steps=num_train_steps,
    weight_decay_rate=<span class="hljs-number">0.01</span>,
)
model.<span class="hljs-built_in">compile</span>(optimizer=optimizer)

<span class="hljs-comment"># Entra\xEEner en mixed-precision float16</span>
tf.keras.mixed_precision.set_global_policy(<span class="hljs-string">&quot;mixed_float16&quot;</span>)

model_name = model_checkpoint.split(<span class="hljs-string">&quot;/&quot;</span>)[-<span class="hljs-number">1</span>]
callback = PushToHubCallback(
    output_dir=<span class="hljs-string">f&quot;<span class="hljs-subst">{model_name}</span>-finetuned-imdb&quot;</span>, tokenizer=tokenizer
)`}}),{c(){i=l("p"),h=a("Une fois que nous sommes connect\xE9s, nous pouvons cr\xE9er nos jeux de donn\xE9es "),d=l("code"),$=a("tf.data"),A=a(". Pour ce faire, nous utiliserons la m\xE9thode "),q=l("code"),k=a("prepare_tf_dataset()"),P=a(", qui utilise notre mod\xE8le pour d\xE9duire automatiquement quelles colonnes doivent aller dans le jeu de donn\xE9es. Si vous voulez contr\xF4ler exactement les colonnes \xE0 utiliser, vous pouvez utiliser la m\xE9thode "),f=l("code"),C=a("Dataset.to_tf_dataset()"),O=a(" \xE0 la place. Pour garder les choses simples, nous n\u2019utiliserons ici que le l\u2019assembleur de donn\xE9es standard, mais vous pouvez aussi essayer l\u2019assembleur masquant des mots entiers et comparer les r\xE9sultats \xE0 titre d\u2019exercice :"),M=c(),w(T.$$.fragment),U=c(),z=l("p"),D=a("Ensuite, nous configurons nos hyperparam\xE8tres d\u2019entra\xEEnement et compilons notre mod\xE8le. Nous utilisons la fonction "),I=l("code"),L=a("create_optimizer()"),v=a(" de la biblioth\xE8que \u{1F917} "),N=l("em"),W=a("Transformers"),G=a(", qui nous donne un optimiseur "),J=l("code"),se=a("AdamW"),ie=a(" avec une d\xE9croissance lin\xE9aire du taux d\u2019apprentissage. Nous utilisons \xE9galement la perte int\xE9gr\xE9e au mod\xE8le, qui est la perte par d\xE9faut lorsqu\u2019aucune perte n\u2019est sp\xE9cifi\xE9e comme argument de "),te=l("code"),ee=a("compile()"),K=a(", et nous d\xE9finissons la pr\xE9cision d\u2019entra\xEEnement \xE0 "),ue=l("code"),Z=a('"mixed_float16"'),ae=a(". Notez que si vous utilisez un GPU Colab ou un autre GPU qui n\u2019a pas le support acc\xE9l\xE9r\xE9 en float16, vous devriez probablement commenter cette ligne."),de=c(),V=l("p"),Ee=a("De plus, nous mettons en place un "),ne=l("code"),me=a("PushToHubCallback"),is=a(" qui sauvegardera le mod\xE8le sur le "),Ne=l("em"),Oe=a("Hub"),us=a(" apr\xE8s chaque \xE9poque. Vous pouvez sp\xE9cifier le nom du d\xE9p\xF4t vers lequel vous voulez pousser avec l\u2019argument "),Le=l("code"),Ke=a("hub_model_id"),ps=a(" (en particulier, vous devrez utiliser cet argument pour pousser vers une organisation). Par exemple, pour pousser le mod\xE8le vers l\u2019organisation "),xe=l("a"),Me=l("code"),Re=a("huggingface-course"),Xe=a(", nous avons ajout\xE9 "),X=l("code"),ge=a('hub_model_id="huggingface-course/distilbert-finetuned-imdb"'),Be=a(". Par d\xE9faut, le d\xE9p\xF4t utilis\xE9 sera dans votre espace de noms et nomm\xE9 apr\xE8s le r\xE9pertoire de sortie que vous avez d\xE9fini, donc dans notre cas, ce sera "),Fe=l("code"),ds=a('"lewtun/distilbert-finetuned-imdb"'),Ge=a("."),be=c(),w(Ce.$$.fragment),re=c(),_e=l("p"),je=a("Nous sommes maintenant pr\xEAts \xE0 ex\xE9cuter "),ke=l("code"),qe=a("model.fit()"),Ze=a(". Mais avant, regardons bri\xE8vement la "),ye=l("em"),ms=a("perplexit\xE9"),es=a(" qui est une m\xE9trique commune pour \xE9valuer la performance des mod\xE8les de langage."),this.h()},l(B){i=o(B,"P",{});var Q=r(i);h=n(Q,"Une fois que nous sommes connect\xE9s, nous pouvons cr\xE9er nos jeux de donn\xE9es "),d=o(Q,"CODE",{});var Ve=r(d);$=n(Ve,"tf.data"),Ve.forEach(t),A=n(Q,". Pour ce faire, nous utiliserons la m\xE9thode "),q=o(Q,"CODE",{});var F=r(q);k=n(F,"prepare_tf_dataset()"),F.forEach(t),P=n(Q,", qui utilise notre mod\xE8le pour d\xE9duire automatiquement quelles colonnes doivent aller dans le jeu de donn\xE9es. Si vous voulez contr\xF4ler exactement les colonnes \xE0 utiliser, vous pouvez utiliser la m\xE9thode "),f=o(Q,"CODE",{});var Y=r(f);C=n(Y,"Dataset.to_tf_dataset()"),Y.forEach(t),O=n(Q," \xE0 la place. Pour garder les choses simples, nous n\u2019utiliserons ici que le l\u2019assembleur de donn\xE9es standard, mais vous pouvez aussi essayer l\u2019assembleur masquant des mots entiers et comparer les r\xE9sultats \xE0 titre d\u2019exercice :"),Q.forEach(t),M=_(B),E(T.$$.fragment,B),U=_(B),z=o(B,"P",{});var $e=r(z);D=n($e,"Ensuite, nous configurons nos hyperparam\xE8tres d\u2019entra\xEEnement et compilons notre mod\xE8le. Nous utilisons la fonction "),I=o($e,"CODE",{});var le=r(I);L=n(le,"create_optimizer()"),le.forEach(t),v=n($e," de la biblioth\xE8que \u{1F917} "),N=o($e,"EM",{});var Pe=r(N);W=n(Pe,"Transformers"),Pe.forEach(t),G=n($e,", qui nous donne un optimiseur "),J=o($e,"CODE",{});var Ns=r(J);se=n(Ns,"AdamW"),Ns.forEach(t),ie=n($e," avec une d\xE9croissance lin\xE9aire du taux d\u2019apprentissage. Nous utilisons \xE9galement la perte int\xE9gr\xE9e au mod\xE8le, qui est la perte par d\xE9faut lorsqu\u2019aucune perte n\u2019est sp\xE9cifi\xE9e comme argument de "),te=o($e,"CODE",{});var We=r(te);ee=n(We,"compile()"),We.forEach(t),K=n($e,", et nous d\xE9finissons la pr\xE9cision d\u2019entra\xEEnement \xE0 "),ue=o($e,"CODE",{});var ss=r(ue);Z=n(ss,'"mixed_float16"'),ss.forEach(t),ae=n($e,". Notez que si vous utilisez un GPU Colab ou un autre GPU qui n\u2019a pas le support acc\xE9l\xE9r\xE9 en float16, vous devriez probablement commenter cette ligne."),$e.forEach(t),de=_(B),V=o(B,"P",{});var pe=r(V);Ee=n(pe,"De plus, nous mettons en place un "),ne=o(pe,"CODE",{});var De=r(ne);me=n(De,"PushToHubCallback"),De.forEach(t),is=n(pe," qui sauvegardera le mod\xE8le sur le "),Ne=o(pe,"EM",{});var fe=r(Ne);Oe=n(fe,"Hub"),fe.forEach(t),us=n(pe," apr\xE8s chaque \xE9poque. Vous pouvez sp\xE9cifier le nom du d\xE9p\xF4t vers lequel vous voulez pousser avec l\u2019argument "),Le=o(pe,"CODE",{});var cs=r(Le);Ke=n(cs,"hub_model_id"),cs.forEach(t),ps=n(pe," (en particulier, vous devrez utiliser cet argument pour pousser vers une organisation). Par exemple, pour pousser le mod\xE8le vers l\u2019organisation "),xe=o(pe,"A",{href:!0,rel:!0});var ks=r(xe);Me=o(ks,"CODE",{});var he=r(Me);Re=n(he,"huggingface-course"),he.forEach(t),ks.forEach(t),Xe=n(pe,", nous avons ajout\xE9 "),X=o(pe,"CODE",{});var Os=r(X);ge=n(Os,'hub_model_id="huggingface-course/distilbert-finetuned-imdb"'),Os.forEach(t),Be=n(pe,". Par d\xE9faut, le d\xE9p\xF4t utilis\xE9 sera dans votre espace de noms et nomm\xE9 apr\xE8s le r\xE9pertoire de sortie que vous avez d\xE9fini, donc dans notre cas, ce sera "),Fe=o(pe,"CODE",{});var Je=r(Fe);ds=n(Je,'"lewtun/distilbert-finetuned-imdb"'),Je.forEach(t),Ge=n(pe,"."),pe.forEach(t),be=_(B),E(Ce.$$.fragment,B),re=_(B),_e=o(B,"P",{});var oe=r(_e);je=n(oe,"Nous sommes maintenant pr\xEAts \xE0 ex\xE9cuter "),ke=o(oe,"CODE",{});var ze=r(ke);qe=n(ze,"model.fit()"),ze.forEach(t),Ze=n(oe,". Mais avant, regardons bri\xE8vement la "),ye=o(oe,"EM",{});var qs=r(ye);ms=n(qs,"perplexit\xE9"),qs.forEach(t),es=n(oe," qui est une m\xE9trique commune pour \xE9valuer la performance des mod\xE8les de langage."),oe.forEach(t),this.h()},h(){y(xe,"href","https://huggingface.co/huggingface-course"),y(xe,"rel","nofollow")},m(B,Q){p(B,i,Q),s(i,h),s(i,d),s(d,$),s(i,A),s(i,q),s(q,k),s(i,P),s(i,f),s(f,C),s(i,O),p(B,M,Q),x(T,B,Q),p(B,U,Q),p(B,z,Q),s(z,D),s(z,I),s(I,L),s(z,v),s(z,N),s(N,W),s(z,G),s(z,J),s(J,se),s(z,ie),s(z,te),s(te,ee),s(z,K),s(z,ue),s(ue,Z),s(z,ae),p(B,de,Q),p(B,V,Q),s(V,Ee),s(V,ne),s(ne,me),s(V,is),s(V,Ne),s(Ne,Oe),s(V,us),s(V,Le),s(Le,Ke),s(V,ps),s(V,xe),s(xe,Me),s(Me,Re),s(V,Xe),s(V,X),s(X,ge),s(V,Be),s(V,Fe),s(Fe,ds),s(V,Ge),p(B,be,Q),x(Ce,B,Q),p(B,re,Q),p(B,_e,Q),s(_e,je),s(_e,ke),s(ke,qe),s(_e,Ze),s(_e,ye),s(ye,ms),s(_e,es),He=!0},i(B){He||(g(T.$$.fragment,B),g(Ce.$$.fragment,B),He=!0)},o(B){b(T.$$.fragment,B),b(Ce.$$.fragment,B),He=!1},d(B){B&&t(i),B&&t(M),j(T,B),B&&t(U),B&&t(z),B&&t(de),B&&t(V),B&&t(be),j(Ce,B),B&&t(re),B&&t(_e)}}}function fg(H){let i,h,d,$,A,q,k,P;return k=new S({props:{code:`import math

eval_loss = model.evaluate(tf_eval_dataset)
print(f"Perplexit\xE9 : {math.exp(eval_loss):.2f}")`,highlighted:`<span class="hljs-keyword">import</span> math

eval_loss = model.evaluate(tf_eval_dataset)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Perplexit\xE9 : <span class="hljs-subst">{math.exp(eval_loss):<span class="hljs-number">.2</span>f}</span>&quot;</span>)`}}),{c(){i=l("p"),h=a("En supposant que notre ensemble de test se compose principalement de phrases grammaticalement correctes, une fa\xE7on de mesurer la qualit\xE9 de notre mod\xE8le de langage est de calculer les probabilit\xE9s qu\u2019il attribue au mot suivant dans toutes les phrases de l\u2019ensemble de test. Des probabilit\xE9s \xE9lev\xE9es indiquent que le mod\xE8le n\u2019est pas \xAB surpris \xBB ou \xAB perplexe \xBB vis-\xE0-vis des exemples non vus, et sugg\xE8rent qu\u2019il a appris les mod\xE8les de base de la grammaire de la langue. Il existe plusieurs d\xE9finitions math\xE9matiques de la perplexit\xE9. Celle que nous utiliserons la d\xE9finit comme l\u2019exponentielle de la perte d\u2019entropie crois\xE9e. Ainsi, nous pouvons calculer la perplexit\xE9 de notre mod\xE8le pr\xE9-entra\xEEn\xE9 en utilisant la fonction "),d=l("code"),$=a("model.evaluate()"),A=a(" pour calculer la perte d\u2019entropie crois\xE9e sur l\u2019ensemble de test, puis en prenant l\u2019exponentielle du r\xE9sultat :"),q=c(),w(k.$$.fragment)},l(f){i=o(f,"P",{});var C=r(i);h=n(C,"En supposant que notre ensemble de test se compose principalement de phrases grammaticalement correctes, une fa\xE7on de mesurer la qualit\xE9 de notre mod\xE8le de langage est de calculer les probabilit\xE9s qu\u2019il attribue au mot suivant dans toutes les phrases de l\u2019ensemble de test. Des probabilit\xE9s \xE9lev\xE9es indiquent que le mod\xE8le n\u2019est pas \xAB surpris \xBB ou \xAB perplexe \xBB vis-\xE0-vis des exemples non vus, et sugg\xE8rent qu\u2019il a appris les mod\xE8les de base de la grammaire de la langue. Il existe plusieurs d\xE9finitions math\xE9matiques de la perplexit\xE9. Celle que nous utiliserons la d\xE9finit comme l\u2019exponentielle de la perte d\u2019entropie crois\xE9e. Ainsi, nous pouvons calculer la perplexit\xE9 de notre mod\xE8le pr\xE9-entra\xEEn\xE9 en utilisant la fonction "),d=o(C,"CODE",{});var O=r(d);$=n(O,"model.evaluate()"),O.forEach(t),A=n(C," pour calculer la perte d\u2019entropie crois\xE9e sur l\u2019ensemble de test, puis en prenant l\u2019exponentielle du r\xE9sultat :"),C.forEach(t),q=_(f),E(k.$$.fragment,f)},m(f,C){p(f,i,C),s(i,h),s(i,d),s(d,$),s(i,A),p(f,q,C),x(k,f,C),P=!0},i(f){P||(g(k.$$.fragment,f),P=!0)},o(f){b(k.$$.fragment,f),P=!1},d(f){f&&t(i),f&&t(q),j(k,f)}}}function hg(H){let i,h,d,$,A,q,k,P;return k=new S({props:{code:`import math

eval_results = trainer.evaluate()
print(f">>> Perplexity: {math.exp(eval_results['eval_loss']):.2f}")`,highlighted:`<span class="hljs-keyword">import</span> math

eval_results = trainer.evaluate()
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&gt;&gt;&gt; Perplexity: <span class="hljs-subst">{math.exp(eval_results[<span class="hljs-string">&#x27;eval_loss&#x27;</span>]):<span class="hljs-number">.2</span>f}</span>&quot;</span>)`}}),{c(){i=l("p"),h=a("En supposant que notre ensemble de test se compose principalement de phrases grammaticalement correctes, une fa\xE7on de mesurer la qualit\xE9 de notre mod\xE8le de langage est de calculer les probabilit\xE9s qu\u2019il attribue au mot suivant dans toutes les phrases de l\u2019ensemble de test. Des probabilit\xE9s \xE9lev\xE9es indiquent que le mod\xE8le n\u2019est pas \xAB surpris \xBB ou \xAB perplexe \xBB vis-\xE0-vis des exemples non vus, et sugg\xE8rent qu\u2019il a appris les mod\xE8les de base de la grammaire de la langue. Il existe plusieurs d\xE9finitions math\xE9matiques de la perplexit\xE9. Celle que nous utiliserons la d\xE9finit comme l\u2019exponentielle de la perte d\u2019entropie crois\xE9e. Ainsi, nous pouvons calculer la perplexit\xE9 de notre mod\xE8le pr\xE9-entra\xEEn\xE9 en utilisant la fonction "),d=l("code"),$=a("Trainer.evaluate()"),A=a(" pour calculer la perte d\u2019entropie crois\xE9e sur l\u2019ensemble de test, puis en prenant l\u2019exponentielle du r\xE9sultat :"),q=c(),w(k.$$.fragment)},l(f){i=o(f,"P",{});var C=r(i);h=n(C,"En supposant que notre ensemble de test se compose principalement de phrases grammaticalement correctes, une fa\xE7on de mesurer la qualit\xE9 de notre mod\xE8le de langage est de calculer les probabilit\xE9s qu\u2019il attribue au mot suivant dans toutes les phrases de l\u2019ensemble de test. Des probabilit\xE9s \xE9lev\xE9es indiquent que le mod\xE8le n\u2019est pas \xAB surpris \xBB ou \xAB perplexe \xBB vis-\xE0-vis des exemples non vus, et sugg\xE8rent qu\u2019il a appris les mod\xE8les de base de la grammaire de la langue. Il existe plusieurs d\xE9finitions math\xE9matiques de la perplexit\xE9. Celle que nous utiliserons la d\xE9finit comme l\u2019exponentielle de la perte d\u2019entropie crois\xE9e. Ainsi, nous pouvons calculer la perplexit\xE9 de notre mod\xE8le pr\xE9-entra\xEEn\xE9 en utilisant la fonction "),d=o(C,"CODE",{});var O=r(d);$=n(O,"Trainer.evaluate()"),O.forEach(t),A=n(C," pour calculer la perte d\u2019entropie crois\xE9e sur l\u2019ensemble de test, puis en prenant l\u2019exponentielle du r\xE9sultat :"),C.forEach(t),q=_(f),E(k.$$.fragment,f)},m(f,C){p(f,i,C),s(i,h),s(i,d),s(d,$),s(i,A),p(f,q,C),x(k,f,C),P=!0},i(f){P||(g(k.$$.fragment,f),P=!0)},o(f){b(k.$$.fragment,f),P=!1},d(f){f&&t(i),f&&t(q),j(k,f)}}}function vg(H){let i,h;return i=new S({props:{code:"model.fit(tf_train_dataset, validation_data=tf_eval_dataset, callbacks=[callback])",highlighted:"model.fit(tf_train_dataset, validation_data=tf_eval_dataset, callbacks=[callback])"}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function gg(H){let i,h;return i=new S({props:{code:"trainer.train()",highlighted:"trainer.train()"}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function bg(H){let i,h;return i=new S({props:{code:`eval_loss = model.evaluate(tf_eval_dataset)
print(f"Perplexit\xE9 : {math.exp(eval_loss):.2f}")`,highlighted:`eval_loss = model.evaluate(tf_eval_dataset)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Perplexit\xE9 : <span class="hljs-subst">{math.exp(eval_loss):<span class="hljs-number">.2</span>f}</span>&quot;</span>)`}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function kg(H){let i,h;return i=new S({props:{code:`eval_results = trainer.evaluate()
print(f">>> Perplexit\xE9 : {math.exp(eval_results['eval_loss']):.2f}")`,highlighted:`eval_results = trainer.evaluate()
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&gt;&gt;&gt; Perplexit\xE9 : <span class="hljs-subst">{math.exp(eval_results[<span class="hljs-string">&#x27;eval_loss&#x27;</span>]):<span class="hljs-number">.2</span>f}</span>&quot;</span>)`}}),{c(){w(i.$$.fragment)},l(d){E(i.$$.fragment,d)},m(d,$){x(i,d,$),h=!0},i(d){h||(g(i.$$.fragment,d),h=!0)},o(d){b(i.$$.fragment,d),h=!1},d(d){j(i,d)}}}function Iv(H){let i,h,d,$,A,q,k,P,f,C,O;return C=new S({props:{code:"trainer.push_to_hub()",highlighted:"trainer.push_to_hub()"}}),{c(){i=l("p"),h=a("Une fois l\u2019entra\xEEnement termin\xE9, nous pouvons pousser la carte de mod\xE8le avec les informations d\u2019entra\xEEnement vers le "),d=l("em"),$=a("Hub"),A=a(" (les "),q=l("em"),k=a("checkpoints"),P=a(" sont sauvegard\xE9s pendant l\u2019entra\xEEnement lui-m\xEAme) :"),f=c(),w(C.$$.fragment)},l(M){i=o(M,"P",{});var T=r(i);h=n(T,"Une fois l\u2019entra\xEEnement termin\xE9, nous pouvons pousser la carte de mod\xE8le avec les informations d\u2019entra\xEEnement vers le "),d=o(T,"EM",{});var U=r(d);$=n(U,"Hub"),U.forEach(t),A=n(T," (les "),q=o(T,"EM",{});var z=r(q);k=n(z,"checkpoints"),z.forEach(t),P=n(T," sont sauvegard\xE9s pendant l\u2019entra\xEEnement lui-m\xEAme) :"),T.forEach(t),f=_(M),E(C.$$.fragment,M)},m(M,T){p(M,i,T),s(i,h),s(i,d),s(d,$),s(i,A),s(i,q),s(q,k),s(i,P),p(M,f,T),x(C,M,T),O=!0},i(M){O||(g(C.$$.fragment,M),O=!0)},o(M){b(C.$$.fragment,M),O=!1},d(M){M&&t(i),M&&t(f),j(C,M)}}}function qg(H){let i,h,d,$,A;return{c(){i=l("p"),h=a("\u270F\uFE0F "),d=l("strong"),$=a("A votre tour !"),A=a(" Ex\xE9cutez l\u2019entra\xEEnement ci-dessus apr\xE8s avoir remplac\xE9 le collecteur de donn\xE9es par le collecteur de mots entiers masqu\xE9s. Obtenez-vous de meilleurs r\xE9sultats ?")},l(q){i=o(q,"P",{});var k=r(i);h=n(k,"\u270F\uFE0F "),d=o(k,"STRONG",{});var P=r(d);$=n(P,"A votre tour !"),P.forEach(t),A=n(k," Ex\xE9cutez l\u2019entra\xEEnement ci-dessus apr\xE8s avoir remplac\xE9 le collecteur de donn\xE9es par le collecteur de mots entiers masqu\xE9s. Obtenez-vous de meilleurs r\xE9sultats ?"),k.forEach(t)},m(q,k){p(q,i,k),s(i,h),s(i,d),s(d,$),s(i,A)},d(q){q&&t(i)}}}function Uv(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U,z,D,I,L,v,N,W,G,J,se,ie,te,ee,K,ue,Z,ae,de,V,Ee,ne,me,is,Ne,Oe,us,Le,Ke,ps,xe,Me,Re,Xe,X,ge,Be,Fe,ds,Ge,be,Ce,re,_e,je,ke,qe,Ze,ye,ms,es,He,B,Q,Ve,F,Y,$e,le,Pe,Ns,We,ss,pe,De,fe,cs,ks,he,Os,Je,oe,ze,qs,_s,$s,rt,fs,Gs,Ls,it,Ks,Rs,Bs,Vs,ws,Gt,Vt,ta,Es,Wt,Jt,La,aa,hs,zt,ut,na,vs,pt,Fs,Qn,la,we,Ka,dt,oa,mt,Ws,Js,Ra,ra,Hs,ia,ct,Mt,Ct,Ba,Ys;return C=new Oa({}),Re=new S({props:{code:`def insert_random_mask(batch):
    features = [dict(zip(batch, t)) for t in zip(*batch.values())]
    masked_inputs = data_collator(features)
    # Cr\xE9er une nouvelle colonne "masqu\xE9e" pour chaque colonne du jeu de donn\xE9es
    return {"masked_" + k: v.numpy() for k, v in masked_inputs.items()}`,highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">insert_random_mask</span>(<span class="hljs-params">batch</span>):
    features = [<span class="hljs-built_in">dict</span>(<span class="hljs-built_in">zip</span>(batch, t)) <span class="hljs-keyword">for</span> t <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(*batch.values())]
    masked_inputs = data_collator(features)
    <span class="hljs-comment"># Cr\xE9er une nouvelle colonne &quot;masqu\xE9e&quot; pour chaque colonne du jeu de donn\xE9es</span>
    <span class="hljs-keyword">return</span> {<span class="hljs-string">&quot;masked_&quot;</span> + k: v.numpy() <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> masked_inputs.items()}`}}),be=new S({props:{code:`downsampled_dataset = downsampled_dataset.remove_columns(["word_ids"])
eval_dataset = downsampled_dataset["test"].map(
    insert_random_mask,
    batched=True,
    remove_columns=downsampled_dataset["test"].column_names,
)
eval_dataset = eval_dataset.rename_columns(
    {
        "masked_input_ids": "input_ids",
        "masked_attention_mask": "attention_mask",
        "masked_labels": "labels",
    }
)`,highlighted:`downsampled_dataset = downsampled_dataset.remove_columns([<span class="hljs-string">&quot;word_ids&quot;</span>])
eval_dataset = downsampled_dataset[<span class="hljs-string">&quot;test&quot;</span>].<span class="hljs-built_in">map</span>(
    insert_random_mask,
    batched=<span class="hljs-literal">True</span>,
    remove_columns=downsampled_dataset[<span class="hljs-string">&quot;test&quot;</span>].column_names,
)
eval_dataset = eval_dataset.rename_columns(
    {
        <span class="hljs-string">&quot;masked_input_ids&quot;</span>: <span class="hljs-string">&quot;input_ids&quot;</span>,
        <span class="hljs-string">&quot;masked_attention_mask&quot;</span>: <span class="hljs-string">&quot;attention_mask&quot;</span>,
        <span class="hljs-string">&quot;masked_labels&quot;</span>: <span class="hljs-string">&quot;labels&quot;</span>,
    }
)`}}),Ve=new S({props:{code:`from torch.utils.data import DataLoader
from transformers import default_data_collator

batch_size = 64
train_dataloader = DataLoader(
    downsampled_dataset["train"],
    shuffle=True,
    batch_size=batch_size,
    collate_fn=data_collator,
)
eval_dataloader = DataLoader(
    eval_dataset, batch_size=batch_size, collate_fn=default_data_collator
)`,highlighted:`<span class="hljs-keyword">from</span> torch.utils.data <span class="hljs-keyword">import</span> DataLoader
<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> default_data_collator

batch_size = <span class="hljs-number">64</span>
train_dataloader = DataLoader(
    downsampled_dataset[<span class="hljs-string">&quot;train&quot;</span>],
    shuffle=<span class="hljs-literal">True</span>,
    batch_size=batch_size,
    collate_fn=data_collator,
)
eval_dataloader = DataLoader(
    eval_dataset, batch_size=batch_size, collate_fn=default_data_collator
)`}}),ss=new S({props:{code:"model = AutoModelForMaskedLM.from_pretrained(model_checkpoint)",highlighted:'model = <span class="hljs-module-access"><span class="hljs-module"><span class="hljs-identifier">AutoModelForMaskedLM</span>.</span></span>from<span class="hljs-constructor">_pretrained(<span class="hljs-params">model_checkpoint</span>)</span>'}}),Je=new S({props:{code:`from torch.optim import AdamW

optimizer = AdamW(model.parameters(), lr=5e-5)`,highlighted:`<span class="hljs-keyword">from</span> torch.optim <span class="hljs-keyword">import</span> AdamW

optimizer = AdamW(model.parameters(), lr=<span class="hljs-number">5e-5</span>)`}}),Gs=new S({props:{code:`from accelerate import Accelerator

accelerator = Accelerator()
model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(
    model, optimizer, train_dataloader, eval_dataloader
)`,highlighted:`<span class="hljs-keyword">from</span> accelerate <span class="hljs-keyword">import</span> Accelerator

accelerator = Accelerator()
model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(
    model, optimizer, train_dataloader, eval_dataloader
)`}}),Bs=new S({props:{code:`from transformers import get_scheduler

num_train_epochs = 3
num_update_steps_per_epoch = len(train_dataloader)
num_training_steps = num_train_epochs * num_update_steps_per_epoch

lr_scheduler = get_scheduler(
    "linear",
    optimizer=optimizer,
    num_warmup_steps=0,
    num_training_steps=num_training_steps,
)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> get_scheduler

num_train_epochs = <span class="hljs-number">3</span>
num_update_steps_per_epoch = <span class="hljs-built_in">len</span>(train_dataloader)
num_training_steps = num_train_epochs * num_update_steps_per_epoch

lr_scheduler = get_scheduler(
    <span class="hljs-string">&quot;linear&quot;</span>,
    optimizer=optimizer,
    num_warmup_steps=<span class="hljs-number">0</span>,
    num_training_steps=num_training_steps,
)`}}),hs=new S({props:{code:`from huggingface_hub import get_full_repo_name

model_name = "distilbert-base-uncased-finetuned-imdb-accelerate"
repo_name = get_full_repo_name(model_name)
repo_name`,highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> get_full_repo_name

model_name = <span class="hljs-string">&quot;distilbert-base-uncased-finetuned-imdb-accelerate&quot;</span>
repo_name = get_full_repo_name(model_name)
repo_name`}}),ut=new S({props:{code:"'lewtun/distilbert-base-uncased-finetuned-imdb-accelerate'",highlighted:'<span class="hljs-string">&#x27;lewtun/distilbert-base-uncased-finetuned-imdb-accelerate&#x27;</span>'}}),mt=new S({props:{code:`from huggingface_hub import Repository

output_dir = model_name
repo = Repository(output_dir, clone_from=repo_name)`,highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> Repository

output_dir = model_name
repo = Repository(output_dir, clone_from=repo_name)`}}),Hs=new S({props:{code:`from tqdm.auto import tqdm
import torch
import math

progress_bar = tqdm(range(num_training_steps))

for epoch in range(num_train_epochs):
    # Entra\xEEnement
    model.train()
    for batch in train_dataloader:
        outputs = model(**batch)
        loss = outputs.loss
        accelerator.backward(loss)

        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()
        progress_bar.update(1)

    # Evaluation
    model.eval()
    losses = []
    for step, batch in enumerate(eval_dataloader):
        with torch.no_grad():
            outputs = model(**batch)

        loss = outputs.loss
        losses.append(accelerator.gather(loss.repeat(batch_size)))

    losses = torch.cat(losses)
    losses = losses[: len(eval_dataset)]
    try:
        perplexity = math.exp(torch.mean(losses))
    except OverflowError:
        perplexity = float("inf")

    print(f">>> Epoch {epoch}: Perplexity: {perplexity}")

    # Sauvegarder et t\xE9l\xE9charger
    accelerator.wait_for_everyone()
    unwrapped_model = accelerator.unwrap_model(model)
    unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save)
    if accelerator.is_main_process:
        tokenizer.save_pretrained(output_dir)
        repo.push_to_hub(
            commit_message=f"Training in progress epoch {epoch}", blocking=False
        )`,highlighted:`<span class="hljs-keyword">from</span> tqdm.auto <span class="hljs-keyword">import</span> tqdm
<span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">import</span> math

progress_bar = tqdm(<span class="hljs-built_in">range</span>(num_training_steps))

<span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(num_train_epochs):
    <span class="hljs-comment"># Entra\xEEnement</span>
    model.train()
    <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> train_dataloader:
        outputs = model(**batch)
        loss = outputs.loss
        accelerator.backward(loss)

        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()
        progress_bar.update(<span class="hljs-number">1</span>)

    <span class="hljs-comment"># Evaluation</span>
    model.<span class="hljs-built_in">eval</span>()
    losses = []
    <span class="hljs-keyword">for</span> step, batch <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(eval_dataloader):
        <span class="hljs-keyword">with</span> torch.no_grad():
            outputs = model(**batch)

        loss = outputs.loss
        losses.append(accelerator.gather(loss.repeat(batch_size)))

    losses = torch.cat(losses)
    losses = losses[: <span class="hljs-built_in">len</span>(eval_dataset)]
    <span class="hljs-keyword">try</span>:
        perplexity = math.exp(torch.mean(losses))
    <span class="hljs-keyword">except</span> OverflowError:
        perplexity = <span class="hljs-built_in">float</span>(<span class="hljs-string">&quot;inf&quot;</span>)

    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&gt;&gt;&gt; Epoch <span class="hljs-subst">{epoch}</span>: Perplexity: <span class="hljs-subst">{perplexity}</span>&quot;</span>)

    <span class="hljs-comment"># Sauvegarder et t\xE9l\xE9charger</span>
    accelerator.wait_for_everyone()
    unwrapped_model = accelerator.unwrap_model(model)
    unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save)
    <span class="hljs-keyword">if</span> accelerator.is_main_process:
        tokenizer.save_pretrained(output_dir)
        repo.push_to_hub(
            commit_message=<span class="hljs-string">f&quot;Training in progress epoch <span class="hljs-subst">{epoch}</span>&quot;</span>, blocking=<span class="hljs-literal">False</span>
        )`}}),ct=new S({props:{code:`Epoch 0: Perplexity: 11.397545307900472
Epoch 1: Perplexity: 10.904909330983092
Epoch 2: Perplexity: 10.729503505340409`,highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span>Epoch <span class="hljs-number">0</span>: Perplexity: <span class="hljs-number">11.397545307900472</span>
<span class="hljs-meta">&gt;&gt;&gt; </span>Epoch <span class="hljs-number">1</span>: Perplexity: <span class="hljs-number">10.904909330983092</span>
<span class="hljs-meta">&gt;&gt;&gt; </span>Epoch <span class="hljs-number">2</span>: Perplexity: <span class="hljs-number">10.729503505340409</span>`}}),{c(){i=l("p"),h=a("Dans notre cas d\u2019utilisation, nous n\u2019avons pas eu besoin de faire quelque chose de sp\xE9cial avec la boucle d\u2019entra\xEEnement, mais dans certains cas, vous pourriez avoir besoin de mettre en \u0153uvre une logique personnalis\xE9e. Pour ces applications, vous pouvez utiliser \u{1F917} "),d=l("em"),$=a("Accelerate"),A=a(". Jetons un coup d\u2019\u0153il !"),q=c(),k=l("h2"),P=l("a"),f=l("span"),w(C.$$.fragment),O=c(),M=l("span"),T=l("i"),U=a("Finetuning"),z=a(" de DistilBERT avec \u{1F917} "),D=l("i"),I=a("Accelerate"),L=c(),v=l("p"),N=a("Comme nous l\u2019avons vu, avec "),W=l("code"),G=a("Trainer"),J=a(" le "),se=l("em"),ie=a("finetuning"),te=a(" d\u2019un mod\xE8le de langage masqu\xE9 est tr\xE8s similaire \xE0 l\u2019exemple de classification de texte du "),ee=l("a"),K=a("chapitre 3"),ue=a(". En fait, la seule subtilit\xE9 est l\u2019utilisation d\u2019un assembleur de donn\xE9es sp\xE9cial, et nous l\u2019avons d\xE9j\xE0 couvert plus t\xF4t dans cette section !"),Z=c(),ae=l("p"),de=a("Cependant, nous avons vu que "),V=l("code"),Ee=a("DataCollatorForLanguageModeling"),ne=a(" applique aussi un masquage al\xE9atoire \xE0 chaque \xE9valuation. Nous verrons donc quelques fluctuations dans nos scores de perplexit\xE9 \xE0 chaque entrainement. Une fa\xE7on d\u2019\xE9liminer cette source d\u2019al\xE9at est d\u2019appliquer le masquage "),me=l("em"),is=a("une fois"),Ne=a(" sur l\u2019ensemble de test, puis d\u2019utiliser l\u2019assembleur de donn\xE9es par d\xE9faut dans \u{1F917} "),Oe=l("em"),us=a("Transformers"),Le=a(" pour collecter les batchs pendant l\u2019\xE9valuation. Pour voir comment cela fonctionne, impl\xE9mentons une fonction simple qui applique le masquage sur un batch, similaire \xE0 notre premi\xE8re rencontre avec "),Ke=l("code"),ps=a("DataCollatorForLanguageModeling"),xe=a(" :"),Me=c(),w(Re.$$.fragment),Xe=c(),X=l("p"),ge=a("Ensuite, nous allons appliquer cette fonction \xE0 notre jeu de test et laisser tomber les colonnes non masqu\xE9es afin de les remplacer par les colonnes masqu\xE9es. Vous pouvez utiliser le masquage de mots entiers en rempla\xE7ant le "),Be=l("code"),Fe=a("data_collator"),ds=a(" ci-dessus par celui qui est appropri\xE9. Dans ce cas vous devez supprimer la premi\xE8re ligne ici :"),Ge=c(),w(be.$$.fragment),Ce=c(),re=l("p"),_e=a("Nous pouvons ensuite configurer les "),je=l("em"),ke=a("dataloaders"),qe=a(" comme d\u2019habitude, mais nous utiliserons le "),Ze=l("code"),ye=a("default_data_collator"),ms=a(" de \u{1F917} "),es=l("em"),He=a("Transformers"),B=a(" pour le jeu d\u2019\xE9valuation :"),Q=c(),w(Ve.$$.fragment),F=c(),Y=l("p"),$e=a("Nous suivons les \xE9tapes standard avec \u{1F917} "),le=l("em"),Pe=a("Accelerate"),Ns=a(". La premi\xE8re est de charger une version fra\xEEche du mod\xE8le pr\xE9-entra\xEEn\xE9 :"),We=c(),w(ss.$$.fragment),pe=c(),De=l("p"),fe=a("Ensuite, nous devons sp\xE9cifier l\u2019optimiseur. Nous utiliserons le standard "),cs=l("code"),ks=a("AdamW"),he=a(" :"),Os=c(),w(Je.$$.fragment),oe=c(),ze=l("p"),qs=a("Avec ces objets, nous pouvons maintenant tout pr\xE9parer pour l\u2019entra\xEEnement avec l\u2019objet "),_s=l("code"),$s=a("Accelerator"),rt=a(" :"),fs=c(),w(Gs.$$.fragment),Ls=c(),it=l("p"),Ks=a("Maintenant que notre mod\xE8le, notre optimiseur et nos chargeurs de donn\xE9es sont configur\xE9s, nous pouvons sp\xE9cifier le planificateur du taux d\u2019apprentissage comme suit :"),Rs=c(),w(Bs.$$.fragment),Vs=c(),ws=l("p"),Gt=a("Il ne reste qu\u2019une derni\xE8re chose \xE0 faire avant de s\u2019entra\xEEner : cr\xE9er un d\xE9p\xF4t de mod\xE8les sur le "),Vt=l("em"),ta=a("Hub"),Es=a(" d\u2019Hugging Face ! Nous pouvons utiliser la biblioth\xE8que \u{1F917} "),Wt=l("em"),Jt=a("Hub"),La=a(" pour g\xE9n\xE9rer d\u2019abord le nom complet de notre d\xE9p\xF4t :"),aa=c(),w(hs.$$.fragment),zt=c(),w(ut.$$.fragment),na=c(),vs=l("p"),pt=a("puis cr\xE9er et cloner le d\xE9p\xF4t en utilisant la classe "),Fs=l("code"),Qn=a("Repository"),la=a(" du \u{1F917} "),we=l("em"),Ka=a("Hub"),dt=a(" :"),oa=c(),w(mt.$$.fragment),Ws=c(),Js=l("p"),Ra=a("Une fois cela fait, il ne reste plus qu\u2019\xE0 r\xE9diger la boucle compl\xE8te d\u2019entra\xEEnement et d\u2019\xE9valuation :"),ra=c(),w(Hs.$$.fragment),ia=c(),w(ct.$$.fragment),Mt=c(),Ct=l("p"),Ba=a("Cool, nous avons \xE9t\xE9 en mesure d\u2019\xE9valuer la perplexit\xE9 \xE0 chaque \xE9poque et de garantir la reproductibilit\xE9 des entra\xEEnements multiples !"),this.h()},l(m){i=o(m,"P",{});var R=r(i);h=n(R,"Dans notre cas d\u2019utilisation, nous n\u2019avons pas eu besoin de faire quelque chose de sp\xE9cial avec la boucle d\u2019entra\xEEnement, mais dans certains cas, vous pourriez avoir besoin de mettre en \u0153uvre une logique personnalis\xE9e. Pour ces applications, vous pouvez utiliser \u{1F917} "),d=o(R,"EM",{});var Xn=r(d);$=n(Xn,"Accelerate"),Xn.forEach(t),A=n(R,". Jetons un coup d\u2019\u0153il !"),R.forEach(t),q=_(m),k=o(m,"H2",{class:!0});var Yt=r(k);P=o(Yt,"A",{id:!0,class:!0,href:!0});var xs=r(P);f=o(xs,"SPAN",{});var js=r(f);E(C.$$.fragment,js),js.forEach(t),xs.forEach(t),O=_(Yt),M=o(Yt,"SPAN",{});var _t=r(M);T=o(_t,"I",{});var ft=r(T);U=n(ft,"Finetuning"),ft.forEach(t),z=n(_t," de DistilBERT avec \u{1F917} "),D=o(_t,"I",{});var Zn=r(D);I=n(Zn,"Accelerate"),Zn.forEach(t),_t.forEach(t),Yt.forEach(t),L=_(m),v=o(m,"P",{});var ys=r(v);N=n(ys,"Comme nous l\u2019avons vu, avec "),W=o(ys,"CODE",{});var el=r(W);G=n(el,"Trainer"),el.forEach(t),J=n(ys," le "),se=o(ys,"EM",{});var sl=r(se);ie=n(sl,"finetuning"),sl.forEach(t),te=n(ys," d\u2019un mod\xE8le de langage masqu\xE9 est tr\xE8s similaire \xE0 l\u2019exemple de classification de texte du "),ee=o(ys,"A",{href:!0});var Fa=r(ee);K=n(Fa,"chapitre 3"),Fa.forEach(t),ue=n(ys,". En fait, la seule subtilit\xE9 est l\u2019utilisation d\u2019un assembleur de donn\xE9es sp\xE9cial, et nous l\u2019avons d\xE9j\xE0 couvert plus t\xF4t dans cette section !"),ys.forEach(t),Z=_(m),ae=o(m,"P",{});var Ye=r(ae);de=n(Ye,"Cependant, nous avons vu que "),V=o(Ye,"CODE",{});var Ha=r(V);Ee=n(Ha,"DataCollatorForLanguageModeling"),Ha.forEach(t),ne=n(Ye," applique aussi un masquage al\xE9atoire \xE0 chaque \xE9valuation. Nous verrons donc quelques fluctuations dans nos scores de perplexit\xE9 \xE0 chaque entrainement. Une fa\xE7on d\u2019\xE9liminer cette source d\u2019al\xE9at est d\u2019appliquer le masquage "),me=o(Ye,"EM",{});var ve=r(me);is=n(ve,"une fois"),ve.forEach(t),Ne=n(Ye," sur l\u2019ensemble de test, puis d\u2019utiliser l\u2019assembleur de donn\xE9es par d\xE9faut dans \u{1F917} "),Oe=o(Ye,"EM",{});var tl=r(Oe);us=n(tl,"Transformers"),tl.forEach(t),Le=n(Ye," pour collecter les batchs pendant l\u2019\xE9valuation. Pour voir comment cela fonctionne, impl\xE9mentons une fonction simple qui applique le masquage sur un batch, similaire \xE0 notre premi\xE8re rencontre avec "),Ke=o(Ye,"CODE",{});var ua=r(Ke);ps=n(ua,"DataCollatorForLanguageModeling"),ua.forEach(t),xe=n(Ye," :"),Ye.forEach(t),Me=_(m),E(Re.$$.fragment,m),Xe=_(m),X=o(m,"P",{});var pa=r(X);ge=n(pa,"Ensuite, nous allons appliquer cette fonction \xE0 notre jeu de test et laisser tomber les colonnes non masqu\xE9es afin de les remplacer par les colonnes masqu\xE9es. Vous pouvez utiliser le masquage de mots entiers en rempla\xE7ant le "),Be=o(pa,"CODE",{});var al=r(Be);Fe=n(al,"data_collator"),al.forEach(t),ds=n(pa," ci-dessus par celui qui est appropri\xE9. Dans ce cas vous devez supprimer la premi\xE8re ligne ici :"),pa.forEach(t),Ge=_(m),E(be.$$.fragment,m),Ce=_(m),re=o(m,"P",{});var zs=r(re);_e=n(zs,"Nous pouvons ensuite configurer les "),je=o(zs,"EM",{});var nl=r(je);ke=n(nl,"dataloaders"),nl.forEach(t),qe=n(zs," comme d\u2019habitude, mais nous utiliserons le "),Ze=o(zs,"CODE",{});var ll=r(Ze);ye=n(ll,"default_data_collator"),ll.forEach(t),ms=n(zs," de \u{1F917} "),es=o(zs,"EM",{});var Pt=r(es);He=n(Pt,"Transformers"),Pt.forEach(t),B=n(zs," pour le jeu d\u2019\xE9valuation :"),zs.forEach(t),Q=_(m),E(Ve.$$.fragment,m),F=_(m),Y=o(m,"P",{});var Dt=r(Y);$e=n(Dt,"Nous suivons les \xE9tapes standard avec \u{1F917} "),le=o(Dt,"EM",{});var ol=r(le);Pe=n(ol,"Accelerate"),ol.forEach(t),Ns=n(Dt,". La premi\xE8re est de charger une version fra\xEEche du mod\xE8le pr\xE9-entra\xEEn\xE9 :"),Dt.forEach(t),We=_(m),E(ss.$$.fragment,m),pe=_(m),De=o(m,"P",{});var da=r(De);fe=n(da,"Ensuite, nous devons sp\xE9cifier l\u2019optimiseur. Nous utiliserons le standard "),cs=o(da,"CODE",{});var At=r(cs);ks=n(At,"AdamW"),At.forEach(t),he=n(da," :"),da.forEach(t),Os=_(m),E(Je.$$.fragment,m),oe=_(m),ze=o(m,"P",{});var St=r(ze);qs=n(St,"Avec ces objets, nous pouvons maintenant tout pr\xE9parer pour l\u2019entra\xEEnement avec l\u2019objet "),_s=o(St,"CODE",{});var rl=r(_s);$s=n(rl,"Accelerator"),rl.forEach(t),rt=n(St," :"),St.forEach(t),fs=_(m),E(Gs.$$.fragment,m),Ls=_(m),it=o(m,"P",{});var il=r(it);Ks=n(il,"Maintenant que notre mod\xE8le, notre optimiseur et nos chargeurs de donn\xE9es sont configur\xE9s, nous pouvons sp\xE9cifier le planificateur du taux d\u2019apprentissage comme suit :"),il.forEach(t),Rs=_(m),E(Bs.$$.fragment,m),Vs=_(m),ws=o(m,"P",{});var Qs=r(ws);Gt=n(Qs,"Il ne reste qu\u2019une derni\xE8re chose \xE0 faire avant de s\u2019entra\xEEner : cr\xE9er un d\xE9p\xF4t de mod\xE8les sur le "),Vt=o(Qs,"EM",{});var ul=r(Vt);ta=n(ul,"Hub"),ul.forEach(t),Es=n(Qs," d\u2019Hugging Face ! Nous pouvons utiliser la biblioth\xE8que \u{1F917} "),Wt=o(Qs,"EM",{});var pl=r(Wt);Jt=n(pl,"Hub"),pl.forEach(t),La=n(Qs," pour g\xE9n\xE9rer d\u2019abord le nom complet de notre d\xE9p\xF4t :"),Qs.forEach(t),aa=_(m),E(hs.$$.fragment,m),zt=_(m),E(ut.$$.fragment,m),na=_(m),vs=o(m,"P",{});var Xs=r(vs);pt=n(Xs,"puis cr\xE9er et cloner le d\xE9p\xF4t en utilisant la classe "),Fs=o(Xs,"CODE",{});var dl=r(Fs);Qn=n(dl,"Repository"),dl.forEach(t),la=n(Xs," du \u{1F917} "),we=o(Xs,"EM",{});var ml=r(we);Ka=n(ml,"Hub"),ml.forEach(t),dt=n(Xs," :"),Xs.forEach(t),oa=_(m),E(mt.$$.fragment,m),Ws=_(m),Js=o(m,"P",{});var ma=r(Js);Ra=n(ma,"Une fois cela fait, il ne reste plus qu\u2019\xE0 r\xE9diger la boucle compl\xE8te d\u2019entra\xEEnement et d\u2019\xE9valuation :"),ma.forEach(t),ra=_(m),E(Hs.$$.fragment,m),ia=_(m),E(ct.$$.fragment,m),Mt=_(m),Ct=o(m,"P",{});var cl=r(Ct);Ba=n(cl,"Cool, nous avons \xE9t\xE9 en mesure d\u2019\xE9valuer la perplexit\xE9 \xE0 chaque \xE9poque et de garantir la reproductibilit\xE9 des entra\xEEnements multiples !"),cl.forEach(t),this.h()},h(){y(P,"id","ifinetuningi-de-distilbert-avec-iacceleratei"),y(P,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),y(P,"href","#ifinetuningi-de-distilbert-avec-iacceleratei"),y(k,"class","relative group"),y(ee,"href","/course/fr/chapter3")},m(m,R){p(m,i,R),s(i,h),s(i,d),s(d,$),s(i,A),p(m,q,R),p(m,k,R),s(k,P),s(P,f),x(C,f,null),s(k,O),s(k,M),s(M,T),s(T,U),s(M,z),s(M,D),s(D,I),p(m,L,R),p(m,v,R),s(v,N),s(v,W),s(W,G),s(v,J),s(v,se),s(se,ie),s(v,te),s(v,ee),s(ee,K),s(v,ue),p(m,Z,R),p(m,ae,R),s(ae,de),s(ae,V),s(V,Ee),s(ae,ne),s(ae,me),s(me,is),s(ae,Ne),s(ae,Oe),s(Oe,us),s(ae,Le),s(ae,Ke),s(Ke,ps),s(ae,xe),p(m,Me,R),x(Re,m,R),p(m,Xe,R),p(m,X,R),s(X,ge),s(X,Be),s(Be,Fe),s(X,ds),p(m,Ge,R),x(be,m,R),p(m,Ce,R),p(m,re,R),s(re,_e),s(re,je),s(je,ke),s(re,qe),s(re,Ze),s(Ze,ye),s(re,ms),s(re,es),s(es,He),s(re,B),p(m,Q,R),x(Ve,m,R),p(m,F,R),p(m,Y,R),s(Y,$e),s(Y,le),s(le,Pe),s(Y,Ns),p(m,We,R),x(ss,m,R),p(m,pe,R),p(m,De,R),s(De,fe),s(De,cs),s(cs,ks),s(De,he),p(m,Os,R),x(Je,m,R),p(m,oe,R),p(m,ze,R),s(ze,qs),s(ze,_s),s(_s,$s),s(ze,rt),p(m,fs,R),x(Gs,m,R),p(m,Ls,R),p(m,it,R),s(it,Ks),p(m,Rs,R),x(Bs,m,R),p(m,Vs,R),p(m,ws,R),s(ws,Gt),s(ws,Vt),s(Vt,ta),s(ws,Es),s(ws,Wt),s(Wt,Jt),s(ws,La),p(m,aa,R),x(hs,m,R),p(m,zt,R),x(ut,m,R),p(m,na,R),p(m,vs,R),s(vs,pt),s(vs,Fs),s(Fs,Qn),s(vs,la),s(vs,we),s(we,Ka),s(vs,dt),p(m,oa,R),x(mt,m,R),p(m,Ws,R),p(m,Js,R),s(Js,Ra),p(m,ra,R),x(Hs,m,R),p(m,ia,R),x(ct,m,R),p(m,Mt,R),p(m,Ct,R),s(Ct,Ba),Ys=!0},i(m){Ys||(g(C.$$.fragment,m),g(Re.$$.fragment,m),g(be.$$.fragment,m),g(Ve.$$.fragment,m),g(ss.$$.fragment,m),g(Je.$$.fragment,m),g(Gs.$$.fragment,m),g(Bs.$$.fragment,m),g(hs.$$.fragment,m),g(ut.$$.fragment,m),g(mt.$$.fragment,m),g(Hs.$$.fragment,m),g(ct.$$.fragment,m),Ys=!0)},o(m){b(C.$$.fragment,m),b(Re.$$.fragment,m),b(be.$$.fragment,m),b(Ve.$$.fragment,m),b(ss.$$.fragment,m),b(Je.$$.fragment,m),b(Gs.$$.fragment,m),b(Bs.$$.fragment,m),b(hs.$$.fragment,m),b(ut.$$.fragment,m),b(mt.$$.fragment,m),b(Hs.$$.fragment,m),b(ct.$$.fragment,m),Ys=!1},d(m){m&&t(i),m&&t(q),m&&t(k),j(C),m&&t(L),m&&t(v),m&&t(Z),m&&t(ae),m&&t(Me),j(Re,m),m&&t(Xe),m&&t(X),m&&t(Ge),j(be,m),m&&t(Ce),m&&t(re),m&&t(Q),j(Ve,m),m&&t(F),m&&t(Y),m&&t(We),j(ss,m),m&&t(pe),m&&t(De),m&&t(Os),j(Je,m),m&&t(oe),m&&t(ze),m&&t(fs),j(Gs,m),m&&t(Ls),m&&t(it),m&&t(Rs),j(Bs,m),m&&t(Vs),m&&t(ws),m&&t(aa),j(hs,m),m&&t(zt),j(ut,m),m&&t(na),m&&t(vs),m&&t(oa),j(mt,m),m&&t(Ws),m&&t(Js),m&&t(ra),j(Hs,m),m&&t(ia),j(ct,m),m&&t(Mt),m&&t(Ct)}}}function $g(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U,z,D,I,L,v,N;return{c(){i=l("p"),h=a("\u270F\uFE0F "),d=l("strong"),$=a("Essayez !"),A=a(" Pour quantifier les avantages de l\u2019adaptation au domaine, "),q=l("i"),k=a("finetunez"),P=a(" un classifieur sur le jeu de donn\xE9es IMDb pour \xE0 la fois, le "),f=l("i"),C=a("checkpoint"),O=a(" de DistilBERT pr\xE9-entra\xEEn\xE9 et e "),M=l("i"),T=a("checkpoint"),U=a(" de DistilBERT "),z=l("i"),D=a("finetun\xE9"),I=a(". Si vous avez besoin d\u2019un rafra\xEEchissement sur la classification de texte, consultez le "),L=l("a"),v=a("chapitre 3"),N=a("."),this.h()},l(W){i=o(W,"P",{});var G=r(i);h=n(G,"\u270F\uFE0F "),d=o(G,"STRONG",{});var J=r(d);$=n(J,"Essayez !"),J.forEach(t),A=n(G," Pour quantifier les avantages de l\u2019adaptation au domaine, "),q=o(G,"I",{});var se=r(q);k=n(se,"finetunez"),se.forEach(t),P=n(G," un classifieur sur le jeu de donn\xE9es IMDb pour \xE0 la fois, le "),f=o(G,"I",{});var ie=r(f);C=n(ie,"checkpoint"),ie.forEach(t),O=n(G," de DistilBERT pr\xE9-entra\xEEn\xE9 et e "),M=o(G,"I",{});var te=r(M);T=n(te,"checkpoint"),te.forEach(t),U=n(G," de DistilBERT "),z=o(G,"I",{});var ee=r(z);D=n(ee,"finetun\xE9"),ee.forEach(t),I=n(G,". Si vous avez besoin d\u2019un rafra\xEEchissement sur la classification de texte, consultez le "),L=o(G,"A",{href:!0});var K=r(L);v=n(K,"chapitre 3"),K.forEach(t),N=n(G,"."),G.forEach(t),this.h()},h(){y(L,"href","/course/fr/chapter3")},m(W,G){p(W,i,G),s(i,h),s(i,d),s(d,$),s(i,A),s(i,q),s(q,k),s(i,P),s(i,f),s(f,C),s(i,O),s(i,M),s(M,T),s(i,U),s(i,z),s(z,D),s(i,I),s(i,L),s(L,v),s(i,N)},d(W){W&&t(i)}}}function wg(H){let i,h,d,$,A,q,k,P,f,C,O,M,T,U,z,D,I,L,v,N,W,G,J,se,ie,te,ee,K,ue,Z,ae,de,V,Ee,ne,me,is,Ne,Oe,us,Le,Ke,ps,xe,Me,Re,Xe,X,ge,Be,Fe,ds,Ge,be,Ce,re,_e,je,ke,qe,Ze,ye,ms,es,He,B,Q,Ve,F,Y,$e,le,Pe,Ns,We,ss,pe,De,fe,cs,ks,he,Os,Je,oe,ze,qs,_s,$s,rt,fs,Gs,Ls,it,Ks,Rs,Bs,Vs,ws,Gt,Vt,ta,Es,Wt,Jt,La,aa,hs,zt,ut,na,vs,pt,Fs,Qn,la,we,Ka,dt,oa,mt,Ws,Js,Ra,ra,Hs,ia,ct,Mt,Ct,Ba,Ys,m,R,Xn,Yt,xs,js,_t,ft,Zn,ys,el,sl,Fa,Ye,Ha,ve,tl,ua,pa,al,zs,nl,ll,Pt,Dt,ol,da,At,St,rl,il,Qs,ul,pl,Xs,dl,ml,ma,cl,np,Zr,Ia,ei,ca,lp,eo,op,rp,si,ht,vt,_l,Ua,ti,fl,ip,ai,Qt,_a,so,Ga,up,to,pp,ni,ts,dp,Va,ao,mp,cp,no,_p,fp,lo,hp,vp,oo,gp,bp,ro,kp,qp,li,Wa,oi,Ja,ri,as,$p,io,wp,Ep,uo,xp,jp,po,yp,zp,mo,Mp,Cp,co,Pp,Dp,ii,Ya,ui,Qa,pi,Tt,Ap,_o,Sp,Tp,fo,Np,Op,di,fa,mi,ha,Lp,hl,Kp,Rp,ci,Xt,va,ho,Xa,Bp,vo,Fp,_i,Za,fi,ga,Hp,go,Ip,Up,hi,Ae,Gp,bo,Vp,Wp,ko,Jp,Yp,qo,Qp,Xp,$o,Zp,ed,vl,sd,td,wo,ad,nd,Eo,ld,od,vi,en,gi,sn,bi,Zs,rd,xo,id,ud,jo,pd,dd,yo,md,cd,ki,et,_d,zo,fd,hd,Mo,vd,gd,Co,bd,kd,qi,tn,$i,an,wi,st,qd,Po,$d,wd,Do,Ed,xd,Ao,jd,yd,Ei,ba,xi,gl,zd,ji,nn,yi,ka,zi,qa,Md,So,Cd,Pd,Mi,ln,Ci,on,Pi,bl,Dd,Di,rn,Ai,un,Si,Ms,Ad,To,Sd,Td,No,Nd,Od,Oo,Ld,Kd,Lo,Rd,Bd,Ti,pn,Ni,dn,Oi,$a,Fd,Ko,Hd,Id,Li,wa,mn,Ud,Ro,Gd,Vd,Wd,cn,Jd,Bo,Yd,Qd,Ki,kl,Xd,Ri,_n,Bi,ns,Zd,Fo,em,sm,Ho,tm,am,Io,nm,lm,Uo,om,rm,Go,im,um,Fi,Nt,pm,Vo,dm,mm,Wo,cm,_m,Hi,fn,Ii,hn,Ui,Se,fm,Jo,hm,vm,Yo,gm,bm,Qo,km,qm,Xo,$m,wm,Zo,Em,xm,er,jm,ym,sr,zm,Mm,Gi,vn,Vi,gn,Wi,ql,Cm,Ji,bn,Yi,kn,Qi,Cs,Pm,tr,Dm,Am,ar,Sm,Tm,nr,Nm,Om,lr,Lm,Km,Xi,Zt,Ea,or,qn,Rm,$n,rr,Bm,Fm,ir,Hm,Zi,ce,Im,ur,Um,Gm,pr,Vm,Wm,$l,Jm,Ym,dr,Qm,Xm,mr,Zm,ec,cr,sc,tc,_r,ac,nc,fr,lc,oc,hr,rc,ic,eu,wn,su,tt,uc,vr,pc,dc,gr,mc,cc,br,_c,fc,tu,En,au,xn,nu,Ps,hc,kr,vc,gc,qr,bc,kc,$r,qc,$c,wr,wc,Ec,lu,xa,ou,wl,Ds,xc,Er,jc,yc,xr,zc,Mc,jr,Cc,Pc,yr,Dc,Ac,ru,gt,bt,El,xl,Sc,iu,jn,uu,yn,pu,ja,du,As,Tc,zr,Nc,Oc,Mr,Lc,Kc,Cr,Rc,Bc,jl,Fc,Hc,mu,zn,cu,Mn,_u,Ss,Ic,Pr,Uc,Gc,Dr,Vc,Wc,Ar,Jc,Yc,Sr,Qc,Xc,fu,Cn,hu,ya,Zc,Tr,e_,s_,vu,Pn,gu,yl,t_,bu,kt,qt,zl,ea,za,Nr,Dn,a_,Or,n_,ku,An,qu,Ml,l_,$u,$t,wt,Cl,Sn,wu,Pl,o_,Eu,Et,xt,Dl,Al,r_,xu,jt,yt,Sl,Tn,ju,Tl,i_,yu,Nl,Ma,zu,Ol,sa,Ca,Lr,Nn,u_,Ll,p_,Kr,d_,Mu,Qe,m_,Rr,c_,__,Br,f_,h_,Fr,v_,g_,Hr,b_,k_,Ir,q_,$_,Ur,w_,E_,Cu,On,Pu,Kl,x_,Du,Ln,Au,Kn,Su,Rl,j_,Tu,Rn,Nu,Ot,y_,Bl,z_,M_,Gr,C_,P_,Ou,Pa,Lu;d=new Xv({props:{fw:H[0]}}),P=new Oa({});const A_=[eg,Zv],Bn=[];function S_(e,u){return e[0]==="pt"?0:1}z=S_(H),D=Bn[z]=A_[z](H),fs=new ap({props:{id:"mqElG5QJWUg"}}),Ls=new Na({props:{$$slots:{default:[sg]},$$scope:{ctx:H}}}),Vs=new Oa({});const T_=[ag,tg],Fn=[];function N_(e,u){return e[0]==="pt"?0:1}xs=N_(H),js=Fn[xs]=T_[xs](H),Ye=new S({props:{code:'text = "This is a great [MASK]."',highlighted:'text = <span class="hljs-string">&quot;This is a great [MASK].&quot;</span>'}}),Ia=new S({props:{code:`from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)`}});const O_=[lg,ng],Hn=[];function L_(e,u){return e[0]==="pt"?0:1}ht=L_(H),vt=Hn[ht]=O_[ht](H),Ua=new S({props:{code:`'>>> This is a great deal.' # C'est une bonne affaire
'>>> This is a great success.' # C'est un grand succ\xE8s
'>>> This is a great adventure.' # C'est une grande aventure
'>>> This is a great idea.' # C'est une bonne id\xE9e
'>>> This is a great feat.' # C'est un grand exploit`,highlighted:`<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great deal.&#x27;</span> <span class="hljs-comment"># C&#x27;est une bonne affaire</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great success.&#x27;</span> <span class="hljs-comment"># C&#x27;est un grand succ\xE8s</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great adventure.&#x27;</span> <span class="hljs-comment"># C&#x27;est une grande aventure</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great idea.&#x27;</span> <span class="hljs-comment"># C&#x27;est une bonne id\xE9e</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great feat.&#x27;</span> <span class="hljs-comment"># C&#x27;est un grand exploit</span>`}}),Ga=new Oa({}),Wa=new S({props:{code:`from datasets import load_dataset

imdb_dataset = load_dataset("imdb")
imdb_dataset`,highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset

imdb_dataset = load_dataset(<span class="hljs-string">&quot;imdb&quot;</span>)
imdb_dataset`}}),Ja=new S({props:{code:`DatasetDict({
    train: Dataset({
        features: ['text', 'label'],
        num_rows: 25000
    })
    test: Dataset({
        features: ['text', 'label'],
        num_rows: 25000
    })
    unsupervised: Dataset({
        features: ['text', 'label'],
        num_rows: 50000
    })
})`,highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;text&#x27;</span>, <span class="hljs-string">&#x27;label&#x27;</span>],
        num_rows: <span class="hljs-number">25000</span>
    })
    test: Dataset({
        features: [<span class="hljs-string">&#x27;text&#x27;</span>, <span class="hljs-string">&#x27;label&#x27;</span>],
        num_rows: <span class="hljs-number">25000</span>
    })
    unsupervised: Dataset({
        features: [<span class="hljs-string">&#x27;text&#x27;</span>, <span class="hljs-string">&#x27;label&#x27;</span>],
        num_rows: <span class="hljs-number">50000</span>
    })
})`}}),Ya=new S({props:{code:`sample = imdb_dataset["train"].shuffle(seed=42).select(range(3))

for row in sample:
    print(f"\\n'>>> Review: {row['text']}'")
    print(f"'>>> Label: {row['label']}'")`,highlighted:`sample = imdb_dataset[<span class="hljs-string">&quot;train&quot;</span>].shuffle(seed=<span class="hljs-number">42</span>).select(<span class="hljs-built_in">range</span>(<span class="hljs-number">3</span>))

<span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> sample:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;\\n&#x27;&gt;&gt;&gt; Review: <span class="hljs-subst">{row[<span class="hljs-string">&#x27;text&#x27;</span>]}</span>&#x27;&quot;</span>)
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&#x27;&gt;&gt;&gt; Label: <span class="hljs-subst">{row[<span class="hljs-string">&#x27;label&#x27;</span>]}</span>&#x27;&quot;</span>)`}}),Qa=new S({props:{code:`
'>>> Review: This is your typical Priyadarshan movie--a bunch of loony characters out on some silly mission. His signature climax has the entire cast of the film coming together and fighting each other in some crazy moshpit over hidden money. Whether it is a winning lottery ticket in Malamaal Weekly, black money in Hera Pheri, "kodokoo" in Phir Hera Pheri, etc., etc., the director is becoming ridiculously predictable. Don\\'t get me wrong; as clich\xE9d and preposterous his movies may be, I usually end up enjoying the comedy. However, in most his previous movies there has actually been some good humor, (Hungama and Hera Pheri being noteworthy ones). Now, the hilarity of his films is fading as he is using the same formula over and over again.<br /><br />Songs are good. Tanushree Datta looks awesome. Rajpal Yadav is irritating, and Tusshar is not a whole lot better. Kunal Khemu is OK, and Sharman Joshi is the best.'
'>>> Label: 0'

'>>> Review: Okay, the story makes no sense, the characters lack any dimensionally, the best dialogue is ad-libs about the low quality of movie, the cinematography is dismal, and only editing saves a bit of the muddle, but Sam" Peckinpah directed the film. Somehow, his direction is not enough. For those who appreciate Peckinpah and his great work, this movie is a disappointment. Even a great cast cannot redeem the time the viewer wastes with this minimal effort.<br /><br />The proper response to the movie is the contempt that the director San Peckinpah, James Caan, Robert Duvall, Burt Young, Bo Hopkins, Arthur Hill, and even Gig Young bring to their work. Watch the great Peckinpah films. Skip this mess.'
'>>> Label: 0'

'>>> Review: I saw this movie at the theaters when I was about 6 or 7 years old. I loved it then, and have recently come to own a VHS version. <br /><br />My 4 and 6 year old children love this movie and have been asking again and again to watch it. <br /><br />I have enjoyed watching it again too. Though I have to admit it is not as good on a little TV.<br /><br />I do not have older children so I do not know what they would think of it. <br /><br />The songs are very cute. My daughter keeps singing them over and over.<br /><br />Hope this helps.'
'>>> Label: 1'`,highlighted:`
<span class="hljs-string">&#x27;&gt;&gt;&gt; Review: This is your typical Priyadarshan movie--a bunch of loony characters out on some silly mission. His signature climax has the entire cast of the film coming together and fighting each other in some crazy moshpit over hidden money. Whether it is a winning lottery ticket in Malamaal Weekly, black money in Hera Pheri, &quot;kodokoo&quot; in Phir Hera Pheri, etc., etc., the director is becoming ridiculously predictable. Don\\&#x27;t get me wrong; as clich\xE9d and preposterous his movies may be, I usually end up enjoying the comedy. However, in most his previous movies there has actually been some good humor, (Hungama and Hera Pheri being noteworthy ones). Now, the hilarity of his films is fading as he is using the same formula over and over again.&lt;br /&gt;&lt;br /&gt;Songs are good. Tanushree Datta looks awesome. Rajpal Yadav is irritating, and Tusshar is not a whole lot better. Kunal Khemu is OK, and Sharman Joshi is the best.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Label: 0&#x27;</span>

<span class="hljs-string">&#x27;&gt;&gt;&gt; Review: Okay, the story makes no sense, the characters lack any dimensionally, the best dialogue is ad-libs about the low quality of movie, the cinematography is dismal, and only editing saves a bit of the muddle, but Sam&quot; Peckinpah directed the film. Somehow, his direction is not enough. For those who appreciate Peckinpah and his great work, this movie is a disappointment. Even a great cast cannot redeem the time the viewer wastes with this minimal effort.&lt;br /&gt;&lt;br /&gt;The proper response to the movie is the contempt that the director San Peckinpah, James Caan, Robert Duvall, Burt Young, Bo Hopkins, Arthur Hill, and even Gig Young bring to their work. Watch the great Peckinpah films. Skip this mess.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Label: 0&#x27;</span>

<span class="hljs-string">&#x27;&gt;&gt;&gt; Review: I saw this movie at the theaters when I was about 6 or 7 years old. I loved it then, and have recently come to own a VHS version. &lt;br /&gt;&lt;br /&gt;My 4 and 6 year old children love this movie and have been asking again and again to watch it. &lt;br /&gt;&lt;br /&gt;I have enjoyed watching it again too. Though I have to admit it is not as good on a little TV.&lt;br /&gt;&lt;br /&gt;I do not have older children so I do not know what they would think of it. &lt;br /&gt;&lt;br /&gt;The songs are very cute. My daughter keeps singing them over and over.&lt;br /&gt;&lt;br /&gt;Hope this helps.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Label: 1&#x27;</span>`}}),fa=new Na({props:{$$slots:{default:[og]},$$scope:{ctx:H}}}),Xa=new Oa({}),Za=new ap({props:{id:"8PmhEIXhBvI"}}),en=new S({props:{code:`def tokenize_function(examples):
    result = tokenizer(examples["text"])
    if tokenizer.is_fast:
        result["word_ids"] = [result.word_ids(i) for i in range(len(result["input_ids"]))]
    return result


# Utilisation de batched=True pour activer le multithreading rapide !
tokenized_datasets = imdb_dataset.map(
    tokenize_function, batched=True, remove_columns=["text", "label"]
)
tokenized_datasets`,highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">tokenize_function</span>(<span class="hljs-params">examples</span>):
    result = tokenizer(examples[<span class="hljs-string">&quot;text&quot;</span>])
    <span class="hljs-keyword">if</span> tokenizer.is_fast:
        result[<span class="hljs-string">&quot;word_ids&quot;</span>] = [result.word_ids(i) <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(result[<span class="hljs-string">&quot;input_ids&quot;</span>]))]
    <span class="hljs-keyword">return</span> result


<span class="hljs-comment"># Utilisation de batched=True pour activer le multithreading rapide !</span>
tokenized_datasets = imdb_dataset.<span class="hljs-built_in">map</span>(
    tokenize_function, batched=<span class="hljs-literal">True</span>, remove_columns=[<span class="hljs-string">&quot;text&quot;</span>, <span class="hljs-string">&quot;label&quot;</span>]
)
tokenized_datasets`}}),sn=new S({props:{code:`DatasetDict({
    train: Dataset({
        features: ['attention_mask', 'input_ids', 'word_ids'],
        num_rows: 25000
    })
    test: Dataset({
        features: ['attention_mask', 'input_ids', 'word_ids'],
        num_rows: 25000
    })
    unsupervised: Dataset({
        features: ['attention_mask', 'input_ids', 'word_ids'],
        num_rows: 50000
    })
})`,highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;word_ids&#x27;</span>],
        num_rows: <span class="hljs-number">25000</span>
    })
    test: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;word_ids&#x27;</span>],
        num_rows: <span class="hljs-number">25000</span>
    })
    unsupervised: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;word_ids&#x27;</span>],
        num_rows: <span class="hljs-number">50000</span>
    })
})`}}),tn=new S({props:{code:"tokenizer.model_max_length",highlighted:"tokenizer.model_max_length"}}),an=new S({props:{code:"512",highlighted:'<span class="hljs-number">512</span>'}}),ba=new Na({props:{$$slots:{default:[rg]},$$scope:{ctx:H}}}),nn=new S({props:{code:"chunk_size = 128",highlighted:'chunk_size = <span class="hljs-number">128</span>'}}),ka=new Na({props:{warning:!0,$$slots:{default:[ig]},$$scope:{ctx:H}}}),ln=new S({props:{code:`# Le d\xE9coupage produit une liste de listes pour chaque caract\xE9ristique
tokenized_samples = tokenized_datasets["train"][:3]

for idx, sample in enumerate(tokenized_samples["input_ids"]):
    print(f"'>>> Review {idx} length: {len(sample)}'")`,highlighted:`<span class="hljs-comment"># Le d\xE9coupage produit une liste de listes pour chaque caract\xE9ristique</span>
tokenized_samples = tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>][:<span class="hljs-number">3</span>]

<span class="hljs-keyword">for</span> idx, sample <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(tokenized_samples[<span class="hljs-string">&quot;input_ids&quot;</span>]):
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&#x27;&gt;&gt;&gt; Review <span class="hljs-subst">{idx}</span> length: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(sample)}</span>&#x27;&quot;</span>)`}}),on=new S({props:{code:`'>>> Review 0 length: 200'
'>>> Review 1 length: 559'
'>>> Review 2 length: 192'`,highlighted:`<span class="hljs-string">&#x27;&gt;&gt;&gt; Review 0 length: 200&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Review 1 length: 559&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Review 2 length: 192&#x27;</span>`}}),rn=new S({props:{code:`concatenated_examples = {
    k: sum(tokenized_samples[k], []) for k in tokenized_samples.keys()
}
total_length = len(concatenated_examples["input_ids"])
print(f"'>>> Longueur des critiques concat\xE9n\xE9es : {total_length}'")`,highlighted:`concatenated_examples = {
    k: <span class="hljs-built_in">sum</span>(tokenized_samples[k], []) <span class="hljs-keyword">for</span> k <span class="hljs-keyword">in</span> tokenized_samples.keys()
}
total_length = <span class="hljs-built_in">len</span>(concatenated_examples[<span class="hljs-string">&quot;input_ids&quot;</span>])
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&#x27;&gt;&gt;&gt; Longueur des critiques concat\xE9n\xE9es : <span class="hljs-subst">{total_length}</span>&#x27;&quot;</span>)`}}),un=new S({props:{code:"'>>> Longueur des critiques concat\xE9n\xE9es : 951'",highlighted:'<span class="hljs-string">&#x27;&gt;&gt;&gt; Longueur des critiques concat\xE9n\xE9es : 951&#x27;</span>'}}),pn=new S({props:{code:`chunks = {
    k: [t[i : i + chunk_size] for i in range(0, total_length, chunk_size)]
    for k, t in concatenated_examples.items()
}

for chunk in chunks["input_ids"]:
    print(f"'>>> Chunk length: {len(chunk)}'")`,highlighted:`chunks = {
    k: [t[i : i + chunk_size] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">0</span>, total_length, chunk_size)]
    <span class="hljs-keyword">for</span> k, t <span class="hljs-keyword">in</span> concatenated_examples.items()
}

<span class="hljs-keyword">for</span> chunk <span class="hljs-keyword">in</span> chunks[<span class="hljs-string">&quot;input_ids&quot;</span>]:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&#x27;&gt;&gt;&gt; Chunk length: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(chunk)}</span>&#x27;&quot;</span>)`}}),dn=new S({props:{code:`'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 128'
'>>> Chunk length: 55'`,highlighted:`<span class="hljs-string">&#x27;&gt;&gt;&gt; Chunk length: 128&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Chunk length: 128&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Chunk length: 128&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Chunk length: 128&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Chunk length: 128&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Chunk length: 128&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Chunk length: 128&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; Chunk length: 55&#x27;</span>`}}),_n=new S({props:{code:`def group_texts(examples):
    # Concat\xE9nation de tous les textes
    concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()}
    # Calcule la longueur des textes concat\xE9n\xE9s
    total_length = len(concatenated_examples[list(examples.keys())[0]])
    # Nous laissons tomber le dernier morceau s'il est plus petit que chunk_size
    total_length = (total_length // chunk_size) * chunk_size
    # Fractionnement par chunk de max_len
    result = {
        k: [t[i : i + chunk_size] for i in range(0, total_length, chunk_size)]
        for k, t in concatenated_examples.items()
    }
    # Cr\xE9er une nouvelle colonne d'\xE9tiquettes
    result["labels"] = result["input_ids"].copy()
    return result`,highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">group_texts</span>(<span class="hljs-params">examples</span>):
    <span class="hljs-comment"># Concat\xE9nation de tous les textes</span>
    concatenated_examples = {k: <span class="hljs-built_in">sum</span>(examples[k], []) <span class="hljs-keyword">for</span> k <span class="hljs-keyword">in</span> examples.keys()}
    <span class="hljs-comment"># Calcule la longueur des textes concat\xE9n\xE9s</span>
    total_length = <span class="hljs-built_in">len</span>(concatenated_examples[<span class="hljs-built_in">list</span>(examples.keys())[<span class="hljs-number">0</span>]])
    <span class="hljs-comment"># Nous laissons tomber le dernier morceau s&#x27;il est plus petit que chunk_size</span>
    total_length = (total_length // chunk_size) * chunk_size
    <span class="hljs-comment"># Fractionnement par chunk de max_len</span>
    result = {
        k: [t[i : i + chunk_size] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">0</span>, total_length, chunk_size)]
        <span class="hljs-keyword">for</span> k, t <span class="hljs-keyword">in</span> concatenated_examples.items()
    }
    <span class="hljs-comment"># Cr\xE9er une nouvelle colonne d&#x27;\xE9tiquettes</span>
    result[<span class="hljs-string">&quot;labels&quot;</span>] = result[<span class="hljs-string">&quot;input_ids&quot;</span>].copy()
    <span class="hljs-keyword">return</span> result`}}),fn=new S({props:{code:`lm_datasets = tokenized_datasets.map(group_texts, batched=True)
lm_datasets`,highlighted:`lm_datasets = tokenized_datasets.<span class="hljs-built_in">map</span>(group_texts, batched=<span class="hljs-literal">True</span>)
lm_datasets`}}),hn=new S({props:{code:`DatasetDict({
    train: Dataset({
        features: ['attention_mask', 'input_ids', 'labels', 'word_ids'],
        num_rows: 61289
    })
    test: Dataset({
        features: ['attention_mask', 'input_ids', 'labels', 'word_ids'],
        num_rows: 59905
    })
    unsupervised: Dataset({
        features: ['attention_mask', 'input_ids', 'labels', 'word_ids'],
        num_rows: 122963
    })
})`,highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;labels&#x27;</span>, <span class="hljs-string">&#x27;word_ids&#x27;</span>],
        num_rows: <span class="hljs-number">61289</span>
    })
    test: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;labels&#x27;</span>, <span class="hljs-string">&#x27;word_ids&#x27;</span>],
        num_rows: <span class="hljs-number">59905</span>
    })
    unsupervised: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;labels&#x27;</span>, <span class="hljs-string">&#x27;word_ids&#x27;</span>],
        num_rows: <span class="hljs-number">122963</span>
    })
})`}}),vn=new S({props:{code:'tokenizer.decode(lm_datasets["train"][1]["input_ids"])',highlighted:'tokenizer.decode(lm_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">1</span>][<span class="hljs-string">&quot;input_ids&quot;</span>])'}}),gn=new S({props:{code:`".... at.......... high. a classic line : inspector : i'm here to sack one of your teachers. student : welcome to bromwell high. i expect that many adults of my age think that bromwell high is far fetched. what a pity that it isn't! [SEP] [CLS] homelessness ( or houselessness as george carlin stated ) has been an issue for years but never a plan to help those on the street that were once considered human who did everything from going to school, work, or vote for the matter. most people think of the homeless"`,highlighted:'<span class="hljs-string">&quot;.... at.......... high. a classic line : inspector : i&#x27;m here to sack one of your teachers. student : welcome to bromwell high. i expect that many adults of my age think that bromwell high is far fetched. what a pity that it isn&#x27;t! [SEP] [CLS] homelessness ( or houselessness as george carlin stated ) has been an issue for years but never a plan to help those on the street that were once considered human who did everything from going to school, work, or vote for the matter. most people think of the homeless&quot;</span>'}}),bn=new S({props:{code:'tokenizer.decode(lm_datasets["train"][1]["labels"])',highlighted:'tokenizer.decode(lm_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">1</span>][<span class="hljs-string">&quot;labels&quot;</span>])'}}),kn=new S({props:{code:`".... at.......... high. a classic line : inspector : i'm here to sack one of your teachers. student : welcome to bromwell high. i expect that many adults of my age think that bromwell high is far fetched. what a pity that it isn't! [SEP] [CLS] homelessness ( or houselessness as george carlin stated ) has been an issue for years but never a plan to help those on the street that were once considered human who did everything from going to school, work, or vote for the matter. most people think of the homeless"`,highlighted:'<span class="hljs-string">&quot;.... at.......... high. a classic line : inspector : i&#x27;m here to sack one of your teachers. student : welcome to bromwell high. i expect that many adults of my age think that bromwell high is far fetched. what a pity that it isn&#x27;t! [SEP] [CLS] homelessness ( or houselessness as george carlin stated ) has been an issue for years but never a plan to help those on the street that were once considered human who did everything from going to school, work, or vote for the matter. most people think of the homeless&quot;</span>'}}),qn=new Oa({}),wn=new S({props:{code:`from transformers import DataCollatorForLanguageModeling

data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm_probability=0.15)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForLanguageModeling

data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm_probability=<span class="hljs-number">0.15</span>)`}}),En=new S({props:{code:`samples = [lm_datasets["train"][i] for i in range(2)]
for sample in samples:
    _ = sample.pop("word_ids")

for chunk in data_collator(samples)["input_ids"]:
    print(f"\\n'>>> {tokenizer.decode(chunk)}'")`,highlighted:`samples = [lm_datasets[<span class="hljs-string">&quot;train&quot;</span>][i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>)]
<span class="hljs-keyword">for</span> sample <span class="hljs-keyword">in</span> samples:
    _ = sample.pop(<span class="hljs-string">&quot;word_ids&quot;</span>)

<span class="hljs-keyword">for</span> chunk <span class="hljs-keyword">in</span> data_collator(samples)[<span class="hljs-string">&quot;input_ids&quot;</span>]:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;\\n&#x27;&gt;&gt;&gt; <span class="hljs-subst">{tokenizer.decode(chunk)}</span>&#x27;&quot;</span>)`}}),xn=new S({props:{code:`'>>> [CLS] bromwell [MASK] is a cartoon comedy. it ran at the same [MASK] as some other [MASK] about school life, [MASK] as " teachers ". [MASK] [MASK] [MASK] in the teaching [MASK] lead [MASK] to believe that bromwell high\\'[MASK] satire is much closer to reality than is " teachers ". the scramble [MASK] [MASK] financially, the [MASK]ful students whogn [MASK] right through [MASK] pathetic teachers\\'pomp, the pettiness of the whole situation, distinction remind me of the schools i knew and their students. when i saw [MASK] episode in [MASK] a student repeatedly tried to burn down the school, [MASK] immediately recalled. [MASK]...'

'>>> .... at.. [MASK]... [MASK]... high. a classic line plucked inspector : i\\'[MASK] here to [MASK] one of your [MASK]. student : welcome to bromwell [MASK]. i expect that many adults of my age think that [MASK]mwell [MASK] is [MASK] fetched. what a pity that it isn\\'t! [SEP] [CLS] [MASK]ness ( or [MASK]lessness as george \u5B87in stated )\u516C been an issue for years but never [MASK] plan to help those on the street that were once considered human [MASK] did everything from going to school, [MASK], [MASK] vote for the matter. most people think [MASK] the homeless'`,highlighted:`<span class="hljs-string">&#x27;&gt;&gt;&gt; [CLS] bromwell [MASK] is a cartoon comedy. it ran at the same [MASK] as some other [MASK] about school life, [MASK] as &quot; teachers &quot;. [MASK] [MASK] [MASK] in the teaching [MASK] lead [MASK] to believe that bromwell high\\&#x27;[MASK] satire is much closer to reality than is &quot; teachers &quot;. the scramble [MASK] [MASK] financially, the [MASK]ful students whogn [MASK] right through [MASK] pathetic teachers\\&#x27;pomp, the pettiness of the whole situation, distinction remind me of the schools i knew and their students. when i saw [MASK] episode in [MASK] a student repeatedly tried to burn down the school, [MASK] immediately recalled. [MASK]...&#x27;</span>

<span class="hljs-string">&#x27;&gt;&gt;&gt; .... at.. [MASK]... [MASK]... high. a classic line plucked inspector : i\\&#x27;[MASK] here to [MASK] one of your [MASK]. student : welcome to bromwell [MASK]. i expect that many adults of my age think that [MASK]mwell [MASK] is [MASK] fetched. what a pity that it isn\\&#x27;t! [SEP] [CLS] [MASK]ness ( or [MASK]lessness as george \u5B87in stated )\u516C been an issue for years but never [MASK] plan to help those on the street that were once considered human [MASK] did everything from going to school, [MASK], [MASK] vote for the matter. most people think [MASK] the homeless&#x27;</span>`}}),xa=new Na({props:{$$slots:{default:[ug]},$$scope:{ctx:H}}});let gs=H[0]==="pt"&&Hv();const K_=[dg,pg],In=[];function R_(e,u){return e[0]==="pt"?0:1}gt=R_(H),bt=In[gt]=K_[gt](H),jn=new S({props:{code:`samples = [lm_datasets["train"][i] for i in range(2)]
batch = whole_word_masking_data_collator(samples)

for chunk in batch["input_ids"]:
    print(f"\\n'>>> {tokenizer.decode(chunk)}'")`,highlighted:`samples = [lm_datasets[<span class="hljs-string">&quot;train&quot;</span>][i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>)]
batch = whole_word_masking_data_collator(samples)

<span class="hljs-keyword">for</span> chunk <span class="hljs-keyword">in</span> batch[<span class="hljs-string">&quot;input_ids&quot;</span>]:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;\\n&#x27;&gt;&gt;&gt; <span class="hljs-subst">{tokenizer.decode(chunk)}</span>&#x27;&quot;</span>)`}}),yn=new S({props:{code:`'>>> [CLS] bromwell high is a cartoon comedy [MASK] it ran at the same time as some other programs about school life, such as " teachers ". my 35 years in the teaching profession lead me to believe that bromwell high\\'s satire is much closer to reality than is " teachers ". the scramble to survive financially, the insightful students who can see right through their pathetic teachers\\'pomp, the pettiness of the whole situation, all remind me of the schools i knew and their students. when i saw the episode in which a student repeatedly tried to burn down the school, i immediately recalled.....'

'>>> .... [MASK] [MASK] [MASK] [MASK]....... high. a classic line : inspector : i\\'m here to sack one of your teachers. student : welcome to bromwell high. i expect that many adults of my age think that bromwell high is far fetched. what a pity that it isn\\'t! [SEP] [CLS] homelessness ( or houselessness as george carlin stated ) has been an issue for years but never a plan to help those on the street that were once considered human who did everything from going to school, work, or vote for the matter. most people think of the homeless'`,highlighted:`<span class="hljs-string">&#x27;&gt;&gt;&gt; [CLS] bromwell high is a cartoon comedy [MASK] it ran at the same time as some other programs about school life, such as &quot; teachers &quot;. my 35 years in the teaching profession lead me to believe that bromwell high\\&#x27;s satire is much closer to reality than is &quot; teachers &quot;. the scramble to survive financially, the insightful students who can see right through their pathetic teachers\\&#x27;pomp, the pettiness of the whole situation, all remind me of the schools i knew and their students. when i saw the episode in which a student repeatedly tried to burn down the school, i immediately recalled.....&#x27;</span>

<span class="hljs-string">&#x27;&gt;&gt;&gt; .... [MASK] [MASK] [MASK] [MASK]....... high. a classic line : inspector : i\\&#x27;m here to sack one of your teachers. student : welcome to bromwell high. i expect that many adults of my age think that bromwell high is far fetched. what a pity that it isn\\&#x27;t! [SEP] [CLS] homelessness ( or houselessness as george carlin stated ) has been an issue for years but never a plan to help those on the street that were once considered human who did everything from going to school, work, or vote for the matter. most people think of the homeless&#x27;</span>`}}),ja=new Na({props:{$$slots:{default:[mg]},$$scope:{ctx:H}}}),zn=new S({props:{code:`train_size = 10_000
test_size = int(0.1 * train_size)

downsampled_dataset = lm_datasets["train"].train_test_split(
    train_size=train_size, test_size=test_size, seed=42
)
downsampled_dataset`,highlighted:`train_size = <span class="hljs-number">10_000</span>
test_size = <span class="hljs-built_in">int</span>(<span class="hljs-number">0.1</span> * train_size)

downsampled_dataset = lm_datasets[<span class="hljs-string">&quot;train&quot;</span>].train_test_split(
    train_size=train_size, test_size=test_size, seed=<span class="hljs-number">42</span>
)
downsampled_dataset`}}),Mn=new S({props:{code:`DatasetDict({
    train: Dataset({
        features: ['attention_mask', 'input_ids', 'labels', 'word_ids'],
        num_rows: 10000
    })
    test: Dataset({
        features: ['attention_mask', 'input_ids', 'labels', 'word_ids'],
        num_rows: 1000
    })
})`,highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;labels&#x27;</span>, <span class="hljs-string">&#x27;word_ids&#x27;</span>],
        num_rows: <span class="hljs-number">10000</span>
    })
    test: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;labels&#x27;</span>, <span class="hljs-string">&#x27;word_ids&#x27;</span>],
        num_rows: <span class="hljs-number">1000</span>
    })
})`}}),Cn=new S({props:{code:`from huggingface_hub import notebook_login

notebook_login()`,highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`}}),Pn=new S({props:{code:"huggingface-cli login",highlighted:'huggingface-<span class="hljs-keyword">cli</span> login'}});const B_=[_g,cg],Un=[];function F_(e,u){return e[0]==="tf"?0:1}kt=F_(H),qt=Un[kt]=B_[kt](H),Dn=new Oa({}),An=new ap({props:{id:"NURcDHhYe98"}});const H_=[hg,fg],Gn=[];function I_(e,u){return e[0]==="pt"?0:1}$t=I_(H),wt=Gn[$t]=H_[$t](H),Sn=new S({props:{code:"Perplexit\xE9 : 21.75",highlighted:'<span class="hljs-meta">&gt;&gt;&gt; </span>Perplexit\xE9 : <span class="hljs-number">21.75</span>'}});const U_=[gg,vg],Vn=[];function G_(e,u){return e[0]==="pt"?0:1}Et=G_(H),xt=Vn[Et]=U_[Et](H);const V_=[kg,bg],Wn=[];function W_(e,u){return e[0]==="pt"?0:1}jt=W_(H),yt=Wn[jt]=V_[jt](H),Tn=new S({props:{code:"Perplexit\xE9 : 11.32",highlighted:'<span class="hljs-meta">&gt;&gt;&gt; </span>Perplexit\xE9 : <span class="hljs-number">11.32</span>'}});let Ie=H[0]==="pt"&&Iv();Ma=new Na({props:{$$slots:{default:[qg]},$$scope:{ctx:H}}});let Ue=H[0]==="pt"&&Uv();return Nn=new Oa({}),On=new S({props:{code:`from transformers import pipeline

mask_filler = pipeline(
    "fill-mask", model="huggingface-course/distilbert-base-uncased-finetuned-imdb"
)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

mask_filler = pipeline(
    <span class="hljs-string">&quot;fill-mask&quot;</span>, model=<span class="hljs-string">&quot;huggingface-course/distilbert-base-uncased-finetuned-imdb&quot;</span>
)`}}),Ln=new S({props:{code:`preds = mask_filler(text)

for pred in preds:
    print(f">>> {pred['sequence']}")`,highlighted:`preds = mask_filler(text)

<span class="hljs-keyword">for</span> pred <span class="hljs-keyword">in</span> preds:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;&gt;&gt;&gt; <span class="hljs-subst">{pred[<span class="hljs-string">&#x27;sequence&#x27;</span>]}</span>&quot;</span>)`}}),Kn=new S({props:{code:`'>>> this is a great movie.'
'>>> this is a great film.'
'>>> this is a great story.'
'>>> this is a great movies.'
'>>> this is a great character.'`,highlighted:`<span class="hljs-string">&#x27;&gt;&gt;&gt; this is a great movie.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; this is a great film.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; this is a great story.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; this is a great movies.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; this is a great character.&#x27;</span>`}}),Rn=new ap({props:{id:"0Oxphw4Q9fo"}}),Pa=new Na({props:{$$slots:{default:[$g]},$$scope:{ctx:H}}}),{c(){i=l("meta"),h=c(),w(d.$$.fragment),$=c(),A=l("h1"),q=l("a"),k=l("span"),w(P.$$.fragment),f=c(),C=l("span"),O=l("i"),M=a("Finetuner"),T=a(" un mod\xE8le de langage masqu\xE9"),U=c(),D.c(),I=c(),L=l("p"),v=a("Pour de nombreuses applications de NLP impliquant des "),N=l("em"),W=a("transformers"),G=a(", vous pouvez simplement prendre un mod\xE8le pr\xE9-entra\xEEn\xE9 du "),J=l("em"),se=a("Hub"),ie=a(" et le "),te=l("em"),ee=a("finetuner"),K=a(" directement sur vos donn\xE9es pour la t\xE2che \xE0 accomplir. Pour autant que le corpus utilis\xE9 pour le pr\xE9-entra\xEEnement ne soit pas trop diff\xE9rent du corpus utilis\xE9 pour le "),ue=l("em"),Z=a("finetuning"),ae=a(". L\u2019apprentissage par transfert produira g\xE9n\xE9ralement de bons r\xE9sultats."),de=c(),V=l("p"),Ee=a("Cependant, il existe quelques cas o\xF9 vous voudrez d\u2019abord "),ne=l("em"),me=a("finetuner"),is=a(" les mod\xE8les de langue sur vos donn\xE9es, avant d\u2019entra\xEEner une t\xEAte sp\xE9cifique \xE0 la t\xE2che. Par exemple, si votre jeu de donn\xE9es contient des contrats l\xE9gaux ou des articles scientifiques, un "),Ne=l("em"),Oe=a("transformer"),us=a(" classique comme BERT traitera g\xE9n\xE9ralement les mots sp\xE9cifiques au domaine dans votre corpus comme des "),Le=l("em"),Ke=a("tokens"),ps=a(" rares et les performances r\xE9sultantes peuvent \xEAtre moins que satisfaisantes. En "),xe=l("em"),Me=a("finetunant"),Re=a(" le mod\xE8le de langage sur les donn\xE9es du domaine, vous pouvez am\xE9liorer les performances de nombreuses t\xE2ches en aval, ce qui signifie que vous ne devez g\xE9n\xE9ralement effectuer cette \xE9tape qu\u2019une seule fois !"),Xe=c(),X=l("p"),ge=a("Ce processus de "),Be=l("em"),Fe=a("finetuning"),ds=a(" d\u2019un mod\xE8le de langage pr\xE9-entra\xEEn\xE9 sur des donn\xE9es "),Ge=l("em"),be=a("dans le domaine"),Ce=a(" est g\xE9n\xE9ralement appel\xE9 "),re=l("em"),_e=a("adaptation au domaine"),je=a(". Il a \xE9t\xE9 popularis\xE9 en 2018 par "),ke=l("a"),qe=a("ULMFiT"),Ze=a(" qui a \xE9t\xE9 l\u2019une des premi\xE8res architectures neuronales (bas\xE9es sur des LSTMs) \xE0 faire en sorte que l\u2019apprentissage par transfert fonctionne r\xE9ellement pour le NLP. Un exemple d\u2019adaptation de domaine avec ULMFiT est pr\xE9sent\xE9 dans l\u2019image ci-dessous. Dans cette section, nous ferons quelque chose de similaire mais avec un "),ye=l("em"),ms=a("transformer"),es=a(" au lieu d\u2019une LSTM !"),He=c(),B=l("div"),Q=l("img"),F=c(),Y=l("img"),le=c(),Pe=l("p"),Ns=a("\xC0 la fin de cette section, vous aurez un "),We=l("a"),ss=a("mod\xE8le de langage masqu\xE9"),pe=a(" sur le "),De=l("em"),fe=a("Hub"),cs=a(" qui peut autocompl\xE9ter des phrases comme indiqu\xE9 ci-dessous :"),ks=c(),he=l("iframe"),Je=c(),oe=l("iframe"),qs=c(),_s=l("p"),$s=a("Allons-y !"),rt=c(),w(fs.$$.fragment),Gs=c(),w(Ls.$$.fragment),it=c(),Ks=l("h2"),Rs=l("a"),Bs=l("span"),w(Vs.$$.fragment),ws=c(),Gt=l("span"),Vt=a("Choix d'un mod\xE8le pr\xE9-entra\xEEn\xE9 pour la mod\xE9lisation du langage masqu\xE9"),ta=c(),Es=l("p"),Wt=a("Pour commencer, nous allons choisir un mod\xE8le pr\xE9-entra\xEEn\xE9 appropri\xE9 pour la mod\xE9lisation du langage masqu\xE9. Comme le montre la capture d\u2019\xE9cran suivante, vous pouvez trouver une liste de candidats en appliquant le filtre \xAB "),Jt=l("em"),La=a("Fill-Mask"),aa=a(" \xBB sur le "),hs=l("a"),zt=l("em"),ut=a("Hub"),na=a(" :"),vs=c(),pt=l("div"),Fs=l("img"),la=c(),we=l("p"),Ka=a("Bien que les mod\xE8les de la famille BERT et RoBERTa soient les plus t\xE9l\xE9charg\xE9s, nous utiliserons un mod\xE8le appel\xE9 "),dt=l("a"),oa=a("DistilBERT"),mt=a(" qui peut \xEAtre entra\xEEn\xE9 beaucoup plus rapidement avec peu ou pas de perte de performance en aval. Ce mod\xE8le a \xE9t\xE9 entra\xEEn\xE9 \xE0 l\u2019aide d\u2019une technique sp\xE9ciale appel\xE9e "),Ws=l("a"),Js=l("em"),Ra=a("distillation de connaissances"),ra=a(", o\xF9 un grand mod\xE8le "),Hs=l("em"),ia=a("enseignant"),ct=a(" comme BERT est utilis\xE9 pour guider l\u2019entra\xEEnement d\u2019un mod\xE8le "),Mt=l("em"),Ct=a("\xE9tudiant"),Ba=a(" qui a beaucoup moins de param\xE8tres. Une explication des d\xE9tails de la distillation de connaissances nous m\xE8nerait trop loin dans cette section mais si vous \xEAtes int\xE9ress\xE9, vous pouvez lire tout cela dans le livre "),Ys=l("a"),m=l("em"),R=a("Natural Language Processing with Transformers"),Xn=a("."),Yt=c(),js.c(),_t=c(),ft=l("p"),Zn=a("Avec environ 67 millions de param\xE8tres, DistilBERT est environ deux fois plus petit que le mod\xE8le de base de BERT, ce qui se traduit approximativement par une acc\xE9l\xE9ration de l\u2019entra\xEEnement d\u2019un facteur deux. Voyons maintenant quels types de "),ys=l("em"),el=a("tokens"),sl=a(" ce mod\xE8le pr\xE9dit comme \xE9tant les compl\xE9ments les plus probables d\u2019un petit \xE9chantillon de texte :"),Fa=c(),w(Ye.$$.fragment),Ha=c(),ve=l("p"),tl=a("En tant qu\u2019\xEAtres humains, nous pouvons imaginer de nombreuses possibilit\xE9s pour le "),ua=l("em"),pa=a("token"),al=c(),zs=l("code"),nl=a("[MASK]"),ll=a(", telles que \xAB jour \xBB, \xAB promenade \xBB ou \xAB peinture \xBB. Pour les mod\xE8les pr\xE9-entra\xEEn\xE9s, les pr\xE9dictions d\xE9pendent du corpus sur lequel le mod\xE8le a \xE9t\xE9 entra\xEEn\xE9 puisqu\u2019il apprend \xE0 d\xE9tecter les mod\xE8les statistiques pr\xE9sents dans les donn\xE9es. Comme BERT, DistilBERT a \xE9t\xE9 pr\xE9-entra\xEEn\xE9 sur les jeux de donn\xE9es "),Pt=l("a"),Dt=l("em"),ol=a("English Wikipedia"),da=a(" et "),At=l("a"),St=l("em"),rl=a("BookCorpus"),il=a(", nous nous attendons donc \xE0 ce que les pr\xE9dictions pour "),Qs=l("code"),ul=a("[MASK]"),pl=a(" refl\xE8tent ces domaines. Pour pr\xE9dire le masque, nous avons besoin du "),Xs=l("em"),dl=a("tokenizer"),ml=a(" de DistilBERT pour produire les entr\xE9es du mod\xE8le, alors t\xE9l\xE9chargeons-le \xE9galement depuis le "),ma=l("em"),cl=a("Hub"),np=a(" :"),Zr=c(),w(Ia.$$.fragment),ei=c(),ca=l("p"),lp=a("Avec un "),eo=l("em"),op=a("tokenizer"),rp=a(" et un mod\xE8le, nous pouvons maintenant passer notre exemple de texte au mod\xE8le, extraire les logits, et afficher les 5 meilleurs candidats :"),si=c(),vt.c(),_l=c(),w(Ua.$$.fragment),ti=c(),fl=l("p"),ip=a("Nous pouvons voir dans les sorties que les pr\xE9dictions du mod\xE8le se r\xE9f\xE8rent \xE0 des termes de tous les jours, ce qui n\u2019est peut-\xEAtre pas surprenant \xE9tant donn\xE9 le fondement de Wikip\xE9dia. Voyons comment nous pouvons changer ce domaine pour quelque chose d\u2019un peu plus sp\xE9cialis\xE9 : des critiques de films !"),ai=c(),Qt=l("h2"),_a=l("a"),so=l("span"),w(Ga.$$.fragment),up=c(),to=l("span"),pp=a("Le jeu de donn\xE9es"),ni=c(),ts=l("p"),dp=a("Pour illustrer l\u2019adaptation au domaine, nous utiliserons le c\xE9l\xE8bre "),Va=l("a"),ao=l("em"),mp=a("Large Movie Review Dataset"),cp=a(" (ou IMDb en abr\xE9g\xE9), qui est un corpus de critiques de films souvent utilis\xE9 pour \xE9valuer les mod\xE8les d\u2019analyse de sentiments. En "),no=l("em"),_p=a("finetunant"),fp=a(" DistilBERT sur ce corpus, nous esp\xE9rons que le mod\xE8le de langage adaptera son vocabulaire des donn\xE9es factuelles de Wikip\xE9dia sur lesquelles il a \xE9t\xE9 pr\xE9-entra\xEEn\xE9 aux \xE9l\xE9ments plus subjectifs des critiques de films. Nous pouvons obtenir les donn\xE9es du "),lo=l("em"),hp=a("Hub"),vp=a(" avec la fonction "),oo=l("code"),gp=a("load_dataset()"),bp=a(" de \u{1F917} "),ro=l("em"),kp=a("Datasets"),qp=a(" :"),li=c(),w(Wa.$$.fragment),oi=c(),w(Ja.$$.fragment),ri=c(),as=l("p"),$p=a("Nous pouvons voir que les parties "),io=l("code"),wp=a("train"),Ep=a(" et "),uo=l("code"),xp=a("test"),jp=a(" sont chacune compos\xE9es de 25 000 critiques, alors qu\u2019il y a une partie non \xE9tiquet\xE9e appel\xE9e "),po=l("code"),yp=a("unsupervised"),zp=a(" qui contient 50 000 critiques. Jetons un coup d\u2019\u0153il \xE0 quelques \xE9chantillons pour avoir une id\xE9e du type de texte auquel nous avons affaire. Comme nous l\u2019avons fait dans les chapitres pr\xE9c\xE9dents du cours, nous allons encha\xEEner les fonctions "),mo=l("code"),Mp=a("Dataset.shuffle()"),Cp=a(" et "),co=l("code"),Pp=a("Dataset.select()"),Dp=a(" pour cr\xE9er un \xE9chantillon al\xE9atoire :"),ii=c(),w(Ya.$$.fragment),ui=c(),w(Qa.$$.fragment),pi=c(),Tt=l("p"),Ap=a("Oui, ce sont bien des critiques de films, et si vous \xEAtes assez \xE2g\xE9s, vous pouvez m\xEAme comprendre le commentaire dans la derni\xE8re critique sur le fait de poss\xE9der une version VHS \u{1F61C} ! Bien que nous n\u2019ayons pas besoin des \xE9tiquettes pour la mod\xE9lisation du langage, nous pouvons d\xE9j\xE0 voir qu\u2019un "),_o=l("code"),Sp=a("0"),Tp=a(" d\xE9note une critique n\xE9gative, tandis qu\u2019un "),fo=l("code"),Np=a("1"),Op=a(" correspond \xE0 une critique positive."),di=c(),w(fa.$$.fragment),mi=c(),ha=l("p"),Lp=a("Maintenant que nous avons jet\xE9 un coup d\u2019\u0153il rapide aux donn\xE9es, plongeons dans leur pr\xE9paration pour la mod\xE9lisation du langage masqu\xE9. Comme nous allons le voir, il y a quelques \xE9tapes suppl\xE9mentaires \xE0 suivre par rapport aux t\xE2ches de classification de s\xE9quences que nous avons vues au "),hl=l("a"),Kp=a("chapitre 3"),Rp=a(". Allons-y !"),ci=c(),Xt=l("h2"),va=l("a"),ho=l("span"),w(Xa.$$.fragment),Bp=c(),vo=l("span"),Fp=a("Pr\xE9traitement des donn\xE9es"),_i=c(),w(Za.$$.fragment),fi=c(),ga=l("p"),Hp=a("Pour la mod\xE9lisation autor\xE9gressive et la mod\xE9lisation du langage masqu\xE9, une \xE9tape commune de pr\xE9traitement consiste \xE0 concat\xE9ner tous les exemples, puis \xE0 diviser le corpus entier en morceaux de taille \xE9gale. C\u2019est tr\xE8s diff\xE9rent de notre approche habituelle, o\xF9 nous nous contentons de "),go=l("em"),Ip=a("tokenizer"),Up=a(" les exemples individuels. Pourquoi tout concat\xE9ner ? La raison est que les exemples individuels peuvent \xEAtre tronqu\xE9s s\u2019ils sont trop longs, ce qui entra\xEEnerait la perte d\u2019informations qui pourraient \xEAtre utiles pour la t\xE2che de mod\xE9lisation du langage !"),hi=c(),Ae=l("p"),Gp=a("Donc pour commencer, nous allons d\u2019abord tokeniser notre corpus comme d\u2019habitude, mais "),bo=l("em"),Vp=a("sans"),Wp=a(" mettre l\u2019option "),ko=l("code"),Jp=a("truncation=True"),Yp=a(" dans notre "),qo=l("em"),Qp=a("tokenizer"),Xp=a(". Nous allons aussi r\xE9cup\xE9rer les identifiants des mots s\u2019ils sont disponibles (ce qui sera le cas si nous utilisons un "),$o=l("em"),Zp=a("tokenizer"),ed=a(" rapide, comme d\xE9crit dans le "),vl=l("a"),sd=a("chapitre 6"),td=a("), car nous en aurons besoin plus tard pour faire le masquage de mots entiers. Nous allons envelopper cela dans une simple fonction, et pendant que nous y sommes, nous allons supprimer les colonnes "),wo=l("code"),ad=a("text"),nd=a(" et "),Eo=l("code"),ld=a("label"),od=a(" puisque nous n\u2019en avons plus besoin :"),vi=c(),w(en.$$.fragment),gi=c(),w(sn.$$.fragment),bi=c(),Zs=l("p"),rd=a("Comme DistilBERT est un mod\xE8le de type BERT, nous pouvons voir que les textes encod\xE9s sont constitu\xE9s des "),xo=l("code"),id=a("input_ids"),ud=a(" et des "),jo=l("code"),pd=a("attention_mask"),dd=a(" que nous avons vus dans d\u2019autres chapitres, ainsi que des "),yo=l("code"),md=a("word_ids"),cd=a(" que nous avons ajout\xE9s."),ki=c(),et=l("p"),_d=a("Maintenant que nos critiques de films ont \xE9t\xE9 tokenis\xE9es, l\u2019\xE9tape suivante consiste \xE0 les regrouper et \xE0 diviser le r\xE9sultat en chunks. Mais quelle taille doivent avoir ces "),zo=l("em"),fd=a("chunks"),hd=a(" ? Cela sera finalement d\xE9termin\xE9 par la quantit\xE9 de m\xE9moire GPU dont vous disposez, mais un bon point de d\xE9part est de voir quelle est la taille maximale du contexte du mod\xE8le. Cela peut \xEAtre d\xE9duit en inspectant l\u2019attribut "),Mo=l("code"),vd=a("model_max_length"),gd=a(" du "),Co=l("em"),bd=a("tokenizer"),kd=a(" :"),qi=c(),w(tn.$$.fragment),$i=c(),w(an.$$.fragment),wi=c(),st=l("p"),qd=a("Cette valeur est d\xE9riv\xE9e du fichier "),Po=l("em"),$d=a("tokenizer_config.json"),wd=a(" associ\xE9 \xE0 un "),Do=l("em"),Ed=a("checkpoint"),xd=a(". Dans ce cas, nous pouvons voir que la taille du contexte est de 512 "),Ao=l("em"),jd=a("tokens"),yd=a(", tout comme avec BERT."),Ei=c(),w(ba.$$.fragment),xi=c(),gl=l("p"),zd=a("Ainsi, pour r\xE9aliser nos exp\xE9riences sur des GPUs comme ceux disponibles sur Google Colab, nous choisirons quelque chose d\u2019un peu plus petit qui peut tenir en m\xE9moire :"),ji=c(),w(nn.$$.fragment),yi=c(),w(ka.$$.fragment),zi=c(),qa=l("p"),Md=a("Maintenant vient la partie amusante. Pour montrer comment la concat\xE9nation fonctionne, prenons quelques commentaires de notre ensemble d\u2019entra\xEEnement et affichons le nombre de "),So=l("em"),Cd=a("tokens"),Pd=a(" par commentaire :"),Mi=c(),w(ln.$$.fragment),Ci=c(),w(on.$$.fragment),Pi=c(),bl=l("p"),Dd=a("Nous pouvons ensuite concat\xE9ner tous ces exemples avec une simple compr\xE9hension du dictionnaire, comme suit :"),Di=c(),w(rn.$$.fragment),Ai=c(),w(un.$$.fragment),Si=c(),Ms=l("p"),Ad=a("Super, la longueur totale est correcte. Donc maintenant, nous allons diviser les exemples concat\xE9n\xE9s en morceaux de la taille donn\xE9e par "),To=l("code"),Sd=a("block_size"),Td=a(". Pour ce faire, nous it\xE9rons sur les caract\xE9ristiques de "),No=l("code"),Nd=a("concatenated_examples"),Od=a(" et utilisons une compr\xE9hension de liste pour cr\xE9er des "),Oo=l("em"),Ld=a("chunks"),Kd=a(" de chaque caract\xE9ristique. Le r\xE9sultat est un dictionnaire de "),Lo=l("em"),Rd=a("chunks"),Bd=a(" pour chaque caract\xE9ristique :"),Ti=c(),w(pn.$$.fragment),Ni=c(),w(dn.$$.fragment),Oi=c(),$a=l("p"),Fd=a("Comme vous pouvez le voir dans cet exemple, le dernier "),Ko=l("em"),Hd=a("chunk"),Id=a(" sera g\xE9n\xE9ralement plus petit que la taille maximale des morceaux. Il y a deux strat\xE9gies principales pour g\xE9rer cela :"),Li=c(),wa=l("ul"),mn=l("li"),Ud=a("Abandonner le dernier morceau s\u2019il est plus petit que "),Ro=l("code"),Gd=a("chunk_size"),Vd=a("."),Wd=c(),cn=l("li"),Jd=a("Rembourrer le dernier morceau jusqu\u2019\xE0 ce que sa longueur soit \xE9gale \xE0 "),Bo=l("code"),Yd=a("chunk_size"),Qd=a("."),Ki=c(),kl=l("p"),Xd=a("Nous adopterons la premi\xE8re approche ici, donc nous allons envelopper toute la logique ci-dessus dans une seule fonction que nous pouvons appliquer \xE0 nos jeux de donn\xE9es tokenis\xE9s :"),Ri=c(),w(_n.$$.fragment),Bi=c(),ns=l("p"),Zd=a("Notez que dans la derni\xE8re \xE9tape de "),Fo=l("code"),em=a("group_texts()"),sm=a(" nous cr\xE9ons une nouvelle colonne "),Ho=l("code"),tm=a("labels"),am=a(" qui est une copie de la colonne "),Io=l("code"),nm=a("input_ids"),lm=a(". Comme nous le verrons bient\xF4t, c\u2019est parce que dans la mod\xE9lisation du langage masqu\xE9, l\u2019objectif est de pr\xE9dire des "),Uo=l("em"),om=a("tokens"),rm=a(" masqu\xE9s al\xE9atoirement dans le batch d\u2019entr\xE9e, et en cr\xE9ant une colonne "),Go=l("code"),im=a("labels"),um=a(", nous fournissons la v\xE9rit\xE9 de base pour notre mod\xE8le de langage \xE0 apprendre."),Fi=c(),Nt=l("p"),pm=a("Appliquons maintenant "),Vo=l("code"),dm=a("group_texts()"),mm=a(" \xE0 nos jeux de donn\xE9es tokenis\xE9s en utilisant notre fid\xE8le fonction "),Wo=l("code"),cm=a("Dataset.map()"),_m=a(" :"),Hi=c(),w(fn.$$.fragment),Ii=c(),w(hn.$$.fragment),Ui=c(),Se=l("p"),fm=a("Vous pouvez voir que le regroupement puis le d\xE9coupage des textes a produit beaucoup plus d\u2019exemples que nos 25 000 exemples initiaux pour les divisions "),Jo=l("code"),hm=a("train"),vm=a(" et "),Yo=l("code"),gm=a("test"),bm=a(". C\u2019est parce que nous avons maintenant des exemples impliquant des "),Qo=l("em"),km=a("tokens"),qm=a(" contigus qui s\u2019\xE9tendent sur plusieurs exemples du corpus original. Vous pouvez le voir explicitement en cherchant les "),Xo=l("em"),$m=a("tokens"),wm=a(" sp\xE9ciaux "),Zo=l("code"),Em=a("[SEP]"),xm=a(" et "),er=l("code"),jm=a("[CLS]"),ym=a(" dans l\u2019un des "),sr=l("em"),zm=a("chunks"),Mm=a(" :"),Gi=c(),w(vn.$$.fragment),Vi=c(),w(gn.$$.fragment),Wi=c(),ql=l("p"),Cm=a("Dans cet exemple, vous pouvez voir deux critiques de films qui se chevauchent, l\u2019une sur un film de lyc\xE9e et l\u2019autre sur les sans-abri. Voyons \xE9galement \xE0 quoi ressemblent les \xE9tiquettes pour la mod\xE9lisation du langage masqu\xE9 :"),Ji=c(),w(bn.$$.fragment),Yi=c(),w(kn.$$.fragment),Qi=c(),Cs=l("p"),Pm=a("Comme pr\xE9vu par notre fonction "),tr=l("code"),Dm=a("group_texts()"),Am=a(" ci-dessus, cela semble identique aux "),ar=l("code"),Sm=a("input_ids"),Tm=a(" d\xE9cod\xE9s. Mais alors comment notre mod\xE8le peut-il apprendre quoi que ce soit ? Il nous manque une \xE9tape cl\xE9 : ins\xE9rer des "),nr=l("em"),Nm=a("tokens"),Om=a(" \xE0 des positions al\xE9atoires dans les entr\xE9es ! Voyons comment nous pouvons le faire \xE0 la vol\xE9e pendant le "),lr=l("em"),Lm=a("finetuning"),Km=a(" en utilisant un assembleur de donn\xE9es sp\xE9cial."),Xi=c(),Zt=l("h2"),Ea=l("a"),or=l("span"),w(qn.$$.fragment),Rm=c(),$n=l("span"),rr=l("i"),Bm=a("Finetuning"),Fm=a(" de DistilBERT avec l'API "),ir=l("code"),Hm=a("Trainer"),Zi=c(),ce=l("p"),Im=a("Le "),ur=l("em"),Um=a("finetuning"),Gm=a(" d\u2019un mod\xE8le de langage masqu\xE9 est presque identique au "),pr=l("em"),Vm=a("finetuning"),Wm=a(" d\u2019un mod\xE8le de classification de s\xE9quences, comme nous l\u2019avons fait dans le "),$l=l("a"),Jm=a("chapitre 3"),Ym=a(". La seule diff\xE9rence est que nous avons besoin d\u2019un collecteur de donn\xE9es sp\xE9cial qui peut masquer de mani\xE8re al\xE9atoire certains des "),dr=l("em"),Qm=a("tokens"),Xm=a(" dans chaque batch de textes. Heureusement, \u{1F917} "),mr=l("em"),Zm=a("Transformers"),ec=a(" est livr\xE9 pr\xE9par\xE9 avec un "),cr=l("code"),sc=a("DataCollatorForLanguageModeling"),tc=a(" d\xE9di\xE9 \xE0 cette t\xE2che. Nous devons juste lui passer le "),_r=l("em"),ac=a("tokenizer"),nc=a(" et un argument "),fr=l("code"),lc=a("mlm_probability"),oc=a(" qui sp\xE9cifie quelle fraction des "),hr=l("em"),rc=a("tokens"),ic=a(" \xE0 masquer. Nous choisirons 15%, qui est la quantit\xE9 utilis\xE9e pour BERT et un choix commun dans la litt\xE9rature :"),eu=c(),w(wn.$$.fragment),su=c(),tt=l("p"),uc=a("Pour voir comment le masquage al\xE9atoire fonctionne, nous allons donner quelques exemples \xE0 l\u2019assembleur de donn\xE9es. Puisqu\u2019il s\u2019attend \xE0 une liste de "),vr=l("code"),pc=a("dict"),dc=a(" o\xF9 chaque "),gr=l("code"),mc=a("dict"),cc=a(" repr\xE9sente un seul morceau de texte contigu, nous it\xE9rons d\u2019abord sur le jeu de donn\xE9es avant de donner le batch \xE0 l\u2019assembleur. Nous supprimons la cl\xE9 "),br=l("code"),_c=a('"word_ids"'),fc=a(" pour cet assembleur de donn\xE9es car il ne l\u2019attend pas :"),tu=c(),w(En.$$.fragment),au=c(),w(xn.$$.fragment),nu=c(),Ps=l("p"),hc=a("Super, \xE7a a march\xE9 ! Nous pouvons voir que le "),kr=l("em"),vc=a("token"),gc=c(),qr=l("code"),bc=a("[MASK]"),kc=a(" a \xE9t\xE9 ins\xE9r\xE9 de fa\xE7on al\xE9atoire \xE0 diff\xE9rents endroits dans notre texte. Ce seront les "),$r=l("em"),qc=a("tokens"),$c=a(" que notre mod\xE8le devra pr\xE9dire pendant l\u2019entra\xEEnement. Et la beaut\xE9 du collecteur de donn\xE9es est qu\u2019il va rendre al\xE9atoire l\u2019insertion du "),wr=l("code"),wc=a("[MASK]"),Ec=a(" \xE0 chaque batch !"),lu=c(),w(xa.$$.fragment),ou=c(),gs&&gs.c(),wl=c(),Ds=l("p"),xc=a("Lors de l\u2019entra\xEEnement des mod\xE8les pour la mod\xE9lisation du langage masqu\xE9, une technique qui peut \xEAtre utilis\xE9e est de masquer des mots entiers ensemble et pas seulement des "),Er=l("em"),jc=a("tokens"),yc=a(" individuels. Cette approche est appel\xE9e "),xr=l("em"),zc=a("masquage de mots entiers"),Mc=a(". Si nous voulons utiliser le masquage de mots entiers, nous devons construire nous-m\xEAmes un assembleur de donn\xE9es. Un assembleur de donn\xE9es est simplement une fonction qui prend une liste d\u2019\xE9chantillons et les convertit en un batch. Faisons-le ! Nous utiliserons les identifiants des mots calcul\xE9s plus t\xF4t pour faire une correspondance entre les indices des mots et les "),jr=l("em"),Cc=a("tokens"),Pc=a(", puis nous d\xE9ciderons al\xE9atoirement quels mots masquer et appliquerons ce masque sur les entr\xE9es. Notez que les \xE9tiquettes sont toutes "),yr=l("code"),Dc=a("-100"),Ac=a(" sauf celles qui correspondent aux mots masqu\xE9s."),ru=c(),bt.c(),El=c(),xl=l("p"),Sc=a("Ensuite, nous pouvons l\u2019essayer sur les m\xEAmes \xE9chantillons que pr\xE9c\xE9demment :"),iu=c(),w(jn.$$.fragment),uu=c(),w(yn.$$.fragment),pu=c(),w(ja.$$.fragment),du=c(),As=l("p"),Tc=a("Maintenant que nous avons deux assembleurs de donn\xE9es, les \xE9tapes restantes du "),zr=l("em"),Nc=a("finetuning"),Oc=a(" sont standards. L\u2019entra\xEEnement peut prendre un certain temps sur Google Colab si vous n\u2019avez pas la chance de tomber sur un mythique GPU P100 \u{1F62D}. Ainsi nous allons d\u2019abord r\xE9duire la taille du jeu d\u2019entra\xEEnement \xE0 quelques milliers d\u2019exemples. Ne vous inqui\xE9tez pas, nous obtiendrons quand m\xEAme un mod\xE8le de langage assez d\xE9cent ! Un moyen rapide de r\xE9duire la taille d\u2019un jeu de donn\xE9es dans \u{1F917} "),Mr=l("em"),Lc=a("Datasets"),Kc=a(" est la fonction "),Cr=l("code"),Rc=a("Dataset.train_test_split()"),Bc=a(" que nous avons vue au "),jl=l("a"),Fc=a("chapitre 5"),Hc=a(" :"),mu=c(),w(zn.$$.fragment),cu=c(),w(Mn.$$.fragment),_u=c(),Ss=l("p"),Ic=a("Cela a automatiquement cr\xE9\xE9 de nouvelles divisions "),Pr=l("code"),Uc=a("train"),Gc=a(" et "),Dr=l("code"),Vc=a("test"),Wc=a(" avec la taille du jeu d\u2019entra\xEEnement fix\xE9e \xE0 10.000 exemples et la validation fix\xE9e \xE0 10% de cela. N\u2019h\xE9sitez pas \xE0 augmenter la taille si vous avez un GPU puissant ! La prochaine chose que nous devons faire est de nous connecter au "),Ar=l("em"),Jc=a("Hub"),Yc=a(". Si vous ex\xE9cutez ce code dans un "),Sr=l("em"),Qc=a("notebook"),Xc=a(", vous pouvez le faire avec la fonction suivante :"),fu=c(),w(Cn.$$.fragment),hu=c(),ya=l("p"),Zc=a("qui affichera un "),Tr=l("em"),e_=a("widget"),s_=a(" o\xF9 vous pourrez saisir vos informations d\u2019identification. Alternativement, vous pouvez ex\xE9cuter :"),vu=c(),w(Pn.$$.fragment),gu=c(),yl=l("p"),t_=a("dans votre terminal pr\xE9f\xE9r\xE9 et connectez-vous l\xE0."),bu=c(),qt.c(),zl=c(),ea=l("h3"),za=l("a"),Nr=l("span"),w(Dn.$$.fragment),a_=c(),Or=l("span"),n_=a("Perplexit\xE9 pour les mod\xE8les de langage"),ku=c(),w(An.$$.fragment),qu=c(),Ml=l("p"),l_=a("Contrairement \xE0 d\u2019autres t\xE2ches, comme la classification de textes ou la r\xE9ponse \xE0 des questions, sur lesquelles nous disposons d\u2019un corpus \xE9tiquet\xE9 pour entra\xEEner, la mod\xE9lisation du langage ne s\u2019appuie sur aucune \xE9tiquette explicite. Alors comment d\xE9terminer ce qui fait un bon mod\xE8le de langage ? Comme pour la fonction de correction automatique de votre t\xE9l\xE9phone, un bon mod\xE8le de langage est celui qui attribue des probabilit\xE9s \xE9lev\xE9es aux phrases grammaticalement correctes et des probabilit\xE9s faibles aux phrases absurdes. Pour vous donner une meilleure id\xE9e de ce \xE0 quoi cela ressemble, vous pouvez trouver en ligne des s\xE9ries enti\xE8res de \xAB rat\xE9s d\u2019autocorrection \xBB o\xF9 le mod\xE8le d\u2019un t\xE9l\xE9phone produit des compl\xE9ments plut\xF4t amusants (et souvent inappropri\xE9s) !"),$u=c(),wt.c(),Cl=c(),w(Sn.$$.fragment),wu=c(),Pl=l("p"),o_=a("Un score de perplexit\xE9 faible signifie un meilleur mod\xE8le de langue. Nous pouvons voir ici que notre mod\xE8le de d\xE9part a une valeur assez \xE9lev\xE9e. Voyons si nous pouvons la r\xE9duire en l\u2019affinant ! Pour ce faire, nous commen\xE7ons par ex\xE9cuter la boucle d\u2019entra\xEEnement :"),Eu=c(),xt.c(),Dl=c(),Al=l("p"),r_=a("et ensuite calculer la perplexit\xE9 r\xE9sultante sur l\u2019ensemble de test comme pr\xE9c\xE9demment :"),xu=c(),yt.c(),Sl=c(),w(Tn.$$.fragment),ju=c(),Tl=l("p"),i_=a("Joli. C\u2019est une r\xE9duction consid\xE9rable de la perplexit\xE9, ce qui nous indique que le mod\xE8le a appris quelque chose sur le domaine des critiques de films !"),yu=c(),Ie&&Ie.c(),Nl=c(),w(Ma.$$.fragment),zu=c(),Ue&&Ue.c(),Ol=c(),sa=l("h3"),Ca=l("a"),Lr=l("span"),w(Nn.$$.fragment),u_=c(),Ll=l("span"),p_=a("Utilisation de notre mod\xE8le "),Kr=l("i"),d_=a("finetun\xE9"),Mu=c(),Qe=l("p"),m_=a("Vous pouvez interagir avec votre mod\xE8le "),Rr=l("em"),c_=a("finetun\xE9"),__=a(" soit en utilisant son "),Br=l("em"),f_=a("widget"),h_=a(" sur le "),Fr=l("em"),v_=a("Hub"),g_=a(", soit localement avec le "),Hr=l("code"),b_=a("pipeline"),k_=a(" de \u{1F917} "),Ir=l("em"),q_=a("Transformers"),$_=a(". Utilisons ce dernier pour t\xE9l\xE9charger notre mod\xE8le en utilisant le pipeline "),Ur=l("code"),w_=a("fill-mask"),E_=a(" :"),Cu=c(),w(On.$$.fragment),Pu=c(),Kl=l("p"),x_=a("Nous pouvons ensuite donner au pipeline notre exemple de texte \xAB this is a great [MASK] \xBB et voir quelles sont les 5 premi\xE8res pr\xE9dictions :"),Du=c(),w(Ln.$$.fragment),Au=c(),w(Kn.$$.fragment),Su=c(),Rl=l("p"),j_=a("Notre mod\xE8le a clairement adapt\xE9 ses pond\xE9rations pour pr\xE9dire les mots qui sont plus fortement associ\xE9s aux films !"),Tu=c(),w(Rn.$$.fragment),Nu=c(),Ot=l("p"),y_=a("Ceci conclut notre premi\xE8re exp\xE9rience d\u2019entra\xEEnement d\u2019un mod\xE8le de langage. Dans la "),Bl=l("a"),z_=a("section 6"),M_=a(", vous apprendrez comment entra\xEEner \xE0 partir de z\xE9ro un mod\xE8le autor\xE9gressif comme GPT-2. Allez-y si vous voulez voir comment vous pouvez pr\xE9-entra\xEEner votre propre "),Gr=l("em"),C_=a("transformer"),P_=a(" !"),Ou=c(),w(Pa.$$.fragment),this.h()},l(e){const u=Yv('[data-svelte="svelte-1phssyn"]',document.head);i=o(u,"META",{name:!0,content:!0}),u.forEach(t),h=_(e),E(d.$$.fragment,e),$=_(e),A=o(e,"H1",{class:!0});var Jn=r(A);q=o(Jn,"A",{id:!0,class:!0,href:!0});var Fl=r(q);k=o(Fl,"SPAN",{});var Vr=r(k);E(P.$$.fragment,Vr),Vr.forEach(t),Fl.forEach(t),f=_(Jn),C=o(Jn,"SPAN",{});var Yn=r(C);O=o(Yn,"I",{});var Hl=r(O);M=n(Hl,"Finetuner"),Hl.forEach(t),T=n(Yn," un mod\xE8le de langage masqu\xE9"),Yn.forEach(t),Jn.forEach(t),U=_(e),D.l(e),I=_(e),L=o(e,"P",{});var Is=r(L);v=n(Is,"Pour de nombreuses applications de NLP impliquant des "),N=o(Is,"EM",{});var Wr=r(N);W=n(Wr,"transformers"),Wr.forEach(t),G=n(Is,", vous pouvez simplement prendre un mod\xE8le pr\xE9-entra\xEEn\xE9 du "),J=o(Is,"EM",{});var Jr=r(J);se=n(Jr,"Hub"),Jr.forEach(t),ie=n(Is," et le "),te=o(Is,"EM",{});var Yr=r(te);ee=n(Yr,"finetuner"),Yr.forEach(t),K=n(Is," directement sur vos donn\xE9es pour la t\xE2che \xE0 accomplir. Pour autant que le corpus utilis\xE9 pour le pr\xE9-entra\xEEnement ne soit pas trop diff\xE9rent du corpus utilis\xE9 pour le "),ue=o(Is,"EM",{});var Il=r(ue);Z=n(Il,"finetuning"),Il.forEach(t),ae=n(Is,". L\u2019apprentissage par transfert produira g\xE9n\xE9ralement de bons r\xE9sultats."),Is.forEach(t),de=_(e),V=o(e,"P",{});var Us=r(V);Ee=n(Us,"Cependant, il existe quelques cas o\xF9 vous voudrez d\u2019abord "),ne=o(Us,"EM",{});var Ul=r(ne);me=n(Ul,"finetuner"),Ul.forEach(t),is=n(Us," les mod\xE8les de langue sur vos donn\xE9es, avant d\u2019entra\xEEner une t\xEAte sp\xE9cifique \xE0 la t\xE2che. Par exemple, si votre jeu de donn\xE9es contient des contrats l\xE9gaux ou des articles scientifiques, un "),Ne=o(Us,"EM",{});var Gl=r(Ne);Oe=n(Gl,"transformer"),Gl.forEach(t),us=n(Us," classique comme BERT traitera g\xE9n\xE9ralement les mots sp\xE9cifiques au domaine dans votre corpus comme des "),Le=o(Us,"EM",{});var Vl=r(Le);Ke=n(Vl,"tokens"),Vl.forEach(t),ps=n(Us," rares et les performances r\xE9sultantes peuvent \xEAtre moins que satisfaisantes. En "),xe=o(Us,"EM",{});var Wl=r(xe);Me=n(Wl,"finetunant"),Wl.forEach(t),Re=n(Us," le mod\xE8le de langage sur les donn\xE9es du domaine, vous pouvez am\xE9liorer les performances de nombreuses t\xE2ches en aval, ce qui signifie que vous ne devez g\xE9n\xE9ralement effectuer cette \xE9tape qu\u2019une seule fois !"),Us.forEach(t),Xe=_(e),X=o(e,"P",{});var bs=r(X);ge=n(bs,"Ce processus de "),Be=o(bs,"EM",{});var Qr=r(Be);Fe=n(Qr,"finetuning"),Qr.forEach(t),ds=n(bs," d\u2019un mod\xE8le de langage pr\xE9-entra\xEEn\xE9 sur des donn\xE9es "),Ge=o(bs,"EM",{});var J_=r(Ge);be=n(J_,"dans le domaine"),J_.forEach(t),Ce=n(bs," est g\xE9n\xE9ralement appel\xE9 "),re=o(bs,"EM",{});var Y_=r(re);_e=n(Y_,"adaptation au domaine"),Y_.forEach(t),je=n(bs,". Il a \xE9t\xE9 popularis\xE9 en 2018 par "),ke=o(bs,"A",{href:!0,rel:!0});var Q_=r(ke);qe=n(Q_,"ULMFiT"),Q_.forEach(t),Ze=n(bs," qui a \xE9t\xE9 l\u2019une des premi\xE8res architectures neuronales (bas\xE9es sur des LSTMs) \xE0 faire en sorte que l\u2019apprentissage par transfert fonctionne r\xE9ellement pour le NLP. Un exemple d\u2019adaptation de domaine avec ULMFiT est pr\xE9sent\xE9 dans l\u2019image ci-dessous. Dans cette section, nous ferons quelque chose de similaire mais avec un "),ye=o(bs,"EM",{});var X_=r(ye);ms=n(X_,"transformer"),X_.forEach(t),es=n(bs," au lieu d\u2019une LSTM !"),bs.forEach(t),He=_(e),B=o(e,"DIV",{class:!0});var Ku=r(B);Q=o(Ku,"IMG",{class:!0,src:!0,alt:!0}),F=_(Ku),Y=o(Ku,"IMG",{class:!0,src:!0,alt:!0}),Ku.forEach(t),le=_(e),Pe=o(e,"P",{});var Jl=r(Pe);Ns=n(Jl,"\xC0 la fin de cette section, vous aurez un "),We=o(Jl,"A",{href:!0,rel:!0});var Z_=r(We);ss=n(Z_,"mod\xE8le de langage masqu\xE9"),Z_.forEach(t),pe=n(Jl," sur le "),De=o(Jl,"EM",{});var ef=r(De);fe=n(ef,"Hub"),ef.forEach(t),cs=n(Jl," qui peut autocompl\xE9ter des phrases comme indiqu\xE9 ci-dessous :"),Jl.forEach(t),ks=_(e),he=o(e,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),r(he).forEach(t),Je=_(e),oe=o(e,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),r(oe).forEach(t),qs=_(e),_s=o(e,"P",{});var sf=r(_s);$s=n(sf,"Allons-y !"),sf.forEach(t),rt=_(e),E(fs.$$.fragment,e),Gs=_(e),E(Ls.$$.fragment,e),it=_(e),Ks=o(e,"H2",{class:!0});var Ru=r(Ks);Rs=o(Ru,"A",{id:!0,class:!0,href:!0});var tf=r(Rs);Bs=o(tf,"SPAN",{});var af=r(Bs);E(Vs.$$.fragment,af),af.forEach(t),tf.forEach(t),ws=_(Ru),Gt=o(Ru,"SPAN",{});var nf=r(Gt);Vt=n(nf,"Choix d'un mod\xE8le pr\xE9-entra\xEEn\xE9 pour la mod\xE9lisation du langage masqu\xE9"),nf.forEach(t),Ru.forEach(t),ta=_(e),Es=o(e,"P",{});var Yl=r(Es);Wt=n(Yl,"Pour commencer, nous allons choisir un mod\xE8le pr\xE9-entra\xEEn\xE9 appropri\xE9 pour la mod\xE9lisation du langage masqu\xE9. Comme le montre la capture d\u2019\xE9cran suivante, vous pouvez trouver une liste de candidats en appliquant le filtre \xAB "),Jt=o(Yl,"EM",{});var lf=r(Jt);La=n(lf,"Fill-Mask"),lf.forEach(t),aa=n(Yl," \xBB sur le "),hs=o(Yl,"A",{href:!0,rel:!0});var of=r(hs);zt=o(of,"EM",{});var rf=r(zt);ut=n(rf,"Hub"),rf.forEach(t),of.forEach(t),na=n(Yl," :"),Yl.forEach(t),vs=_(e),pt=o(e,"DIV",{class:!0});var uf=r(pt);Fs=o(uf,"IMG",{src:!0,alt:!0,width:!0}),uf.forEach(t),la=_(e),we=o(e,"P",{});var at=r(we);Ka=n(at,"Bien que les mod\xE8les de la famille BERT et RoBERTa soient les plus t\xE9l\xE9charg\xE9s, nous utiliserons un mod\xE8le appel\xE9 "),dt=o(at,"A",{href:!0,rel:!0});var pf=r(dt);oa=n(pf,"DistilBERT"),pf.forEach(t),mt=n(at," qui peut \xEAtre entra\xEEn\xE9 beaucoup plus rapidement avec peu ou pas de perte de performance en aval. Ce mod\xE8le a \xE9t\xE9 entra\xEEn\xE9 \xE0 l\u2019aide d\u2019une technique sp\xE9ciale appel\xE9e "),Ws=o(at,"A",{href:!0,rel:!0});var df=r(Ws);Js=o(df,"EM",{});var mf=r(Js);Ra=n(mf,"distillation de connaissances"),mf.forEach(t),df.forEach(t),ra=n(at,", o\xF9 un grand mod\xE8le "),Hs=o(at,"EM",{});var cf=r(Hs);ia=n(cf,"enseignant"),cf.forEach(t),ct=n(at," comme BERT est utilis\xE9 pour guider l\u2019entra\xEEnement d\u2019un mod\xE8le "),Mt=o(at,"EM",{});var _f=r(Mt);Ct=n(_f,"\xE9tudiant"),_f.forEach(t),Ba=n(at," qui a beaucoup moins de param\xE8tres. Une explication des d\xE9tails de la distillation de connaissances nous m\xE8nerait trop loin dans cette section mais si vous \xEAtes int\xE9ress\xE9, vous pouvez lire tout cela dans le livre "),Ys=o(at,"A",{href:!0,rel:!0});var ff=r(Ys);m=o(ff,"EM",{});var hf=r(m);R=n(hf,"Natural Language Processing with Transformers"),hf.forEach(t),ff.forEach(t),Xn=n(at,"."),at.forEach(t),Yt=_(e),js.l(e),_t=_(e),ft=o(e,"P",{});var Bu=r(ft);Zn=n(Bu,"Avec environ 67 millions de param\xE8tres, DistilBERT est environ deux fois plus petit que le mod\xE8le de base de BERT, ce qui se traduit approximativement par une acc\xE9l\xE9ration de l\u2019entra\xEEnement d\u2019un facteur deux. Voyons maintenant quels types de "),ys=o(Bu,"EM",{});var vf=r(ys);el=n(vf,"tokens"),vf.forEach(t),sl=n(Bu," ce mod\xE8le pr\xE9dit comme \xE9tant les compl\xE9ments les plus probables d\u2019un petit \xE9chantillon de texte :"),Bu.forEach(t),Fa=_(e),E(Ye.$$.fragment,e),Ha=_(e),ve=o(e,"P",{});var ls=r(ve);tl=n(ls,"En tant qu\u2019\xEAtres humains, nous pouvons imaginer de nombreuses possibilit\xE9s pour le "),ua=o(ls,"EM",{});var gf=r(ua);pa=n(gf,"token"),gf.forEach(t),al=_(ls),zs=o(ls,"CODE",{});var bf=r(zs);nl=n(bf,"[MASK]"),bf.forEach(t),ll=n(ls,", telles que \xAB jour \xBB, \xAB promenade \xBB ou \xAB peinture \xBB. Pour les mod\xE8les pr\xE9-entra\xEEn\xE9s, les pr\xE9dictions d\xE9pendent du corpus sur lequel le mod\xE8le a \xE9t\xE9 entra\xEEn\xE9 puisqu\u2019il apprend \xE0 d\xE9tecter les mod\xE8les statistiques pr\xE9sents dans les donn\xE9es. Comme BERT, DistilBERT a \xE9t\xE9 pr\xE9-entra\xEEn\xE9 sur les jeux de donn\xE9es "),Pt=o(ls,"A",{href:!0,rel:!0});var kf=r(Pt);Dt=o(kf,"EM",{});var qf=r(Dt);ol=n(qf,"English Wikipedia"),qf.forEach(t),kf.forEach(t),da=n(ls," et "),At=o(ls,"A",{href:!0,rel:!0});var $f=r(At);St=o($f,"EM",{});var wf=r(St);rl=n(wf,"BookCorpus"),wf.forEach(t),$f.forEach(t),il=n(ls,", nous nous attendons donc \xE0 ce que les pr\xE9dictions pour "),Qs=o(ls,"CODE",{});var Ef=r(Qs);ul=n(Ef,"[MASK]"),Ef.forEach(t),pl=n(ls," refl\xE8tent ces domaines. Pour pr\xE9dire le masque, nous avons besoin du "),Xs=o(ls,"EM",{});var xf=r(Xs);dl=n(xf,"tokenizer"),xf.forEach(t),ml=n(ls," de DistilBERT pour produire les entr\xE9es du mod\xE8le, alors t\xE9l\xE9chargeons-le \xE9galement depuis le "),ma=o(ls,"EM",{});var jf=r(ma);cl=n(jf,"Hub"),jf.forEach(t),np=n(ls," :"),ls.forEach(t),Zr=_(e),E(Ia.$$.fragment,e),ei=_(e),ca=o(e,"P",{});var Fu=r(ca);lp=n(Fu,"Avec un "),eo=o(Fu,"EM",{});var yf=r(eo);op=n(yf,"tokenizer"),yf.forEach(t),rp=n(Fu," et un mod\xE8le, nous pouvons maintenant passer notre exemple de texte au mod\xE8le, extraire les logits, et afficher les 5 meilleurs candidats :"),Fu.forEach(t),si=_(e),vt.l(e),_l=_(e),E(Ua.$$.fragment,e),ti=_(e),fl=o(e,"P",{});var zf=r(fl);ip=n(zf,"Nous pouvons voir dans les sorties que les pr\xE9dictions du mod\xE8le se r\xE9f\xE8rent \xE0 des termes de tous les jours, ce qui n\u2019est peut-\xEAtre pas surprenant \xE9tant donn\xE9 le fondement de Wikip\xE9dia. Voyons comment nous pouvons changer ce domaine pour quelque chose d\u2019un peu plus sp\xE9cialis\xE9 : des critiques de films !"),zf.forEach(t),ai=_(e),Qt=o(e,"H2",{class:!0});var Hu=r(Qt);_a=o(Hu,"A",{id:!0,class:!0,href:!0});var Mf=r(_a);so=o(Mf,"SPAN",{});var Cf=r(so);E(Ga.$$.fragment,Cf),Cf.forEach(t),Mf.forEach(t),up=_(Hu),to=o(Hu,"SPAN",{});var Pf=r(to);pp=n(Pf,"Le jeu de donn\xE9es"),Pf.forEach(t),Hu.forEach(t),ni=_(e),ts=o(e,"P",{});var nt=r(ts);dp=n(nt,"Pour illustrer l\u2019adaptation au domaine, nous utiliserons le c\xE9l\xE8bre "),Va=o(nt,"A",{href:!0,rel:!0});var Df=r(Va);ao=o(Df,"EM",{});var Af=r(ao);mp=n(Af,"Large Movie Review Dataset"),Af.forEach(t),Df.forEach(t),cp=n(nt," (ou IMDb en abr\xE9g\xE9), qui est un corpus de critiques de films souvent utilis\xE9 pour \xE9valuer les mod\xE8les d\u2019analyse de sentiments. En "),no=o(nt,"EM",{});var Sf=r(no);_p=n(Sf,"finetunant"),Sf.forEach(t),fp=n(nt," DistilBERT sur ce corpus, nous esp\xE9rons que le mod\xE8le de langage adaptera son vocabulaire des donn\xE9es factuelles de Wikip\xE9dia sur lesquelles il a \xE9t\xE9 pr\xE9-entra\xEEn\xE9 aux \xE9l\xE9ments plus subjectifs des critiques de films. Nous pouvons obtenir les donn\xE9es du "),lo=o(nt,"EM",{});var Tf=r(lo);hp=n(Tf,"Hub"),Tf.forEach(t),vp=n(nt," avec la fonction "),oo=o(nt,"CODE",{});var Nf=r(oo);gp=n(Nf,"load_dataset()"),Nf.forEach(t),bp=n(nt," de \u{1F917} "),ro=o(nt,"EM",{});var Of=r(ro);kp=n(Of,"Datasets"),Of.forEach(t),qp=n(nt," :"),nt.forEach(t),li=_(e),E(Wa.$$.fragment,e),oi=_(e),E(Ja.$$.fragment,e),ri=_(e),as=o(e,"P",{});var lt=r(as);$p=n(lt,"Nous pouvons voir que les parties "),io=o(lt,"CODE",{});var Lf=r(io);wp=n(Lf,"train"),Lf.forEach(t),Ep=n(lt," et "),uo=o(lt,"CODE",{});var Kf=r(uo);xp=n(Kf,"test"),Kf.forEach(t),jp=n(lt," sont chacune compos\xE9es de 25 000 critiques, alors qu\u2019il y a une partie non \xE9tiquet\xE9e appel\xE9e "),po=o(lt,"CODE",{});var Rf=r(po);yp=n(Rf,"unsupervised"),Rf.forEach(t),zp=n(lt," qui contient 50 000 critiques. Jetons un coup d\u2019\u0153il \xE0 quelques \xE9chantillons pour avoir une id\xE9e du type de texte auquel nous avons affaire. Comme nous l\u2019avons fait dans les chapitres pr\xE9c\xE9dents du cours, nous allons encha\xEEner les fonctions "),mo=o(lt,"CODE",{});var Bf=r(mo);Mp=n(Bf,"Dataset.shuffle()"),Bf.forEach(t),Cp=n(lt," et "),co=o(lt,"CODE",{});var Ff=r(co);Pp=n(Ff,"Dataset.select()"),Ff.forEach(t),Dp=n(lt," pour cr\xE9er un \xE9chantillon al\xE9atoire :"),lt.forEach(t),ii=_(e),E(Ya.$$.fragment,e),ui=_(e),E(Qa.$$.fragment,e),pi=_(e),Tt=o(e,"P",{});var Ql=r(Tt);Ap=n(Ql,"Oui, ce sont bien des critiques de films, et si vous \xEAtes assez \xE2g\xE9s, vous pouvez m\xEAme comprendre le commentaire dans la derni\xE8re critique sur le fait de poss\xE9der une version VHS \u{1F61C} ! Bien que nous n\u2019ayons pas besoin des \xE9tiquettes pour la mod\xE9lisation du langage, nous pouvons d\xE9j\xE0 voir qu\u2019un "),_o=o(Ql,"CODE",{});var Hf=r(_o);Sp=n(Hf,"0"),Hf.forEach(t),Tp=n(Ql," d\xE9note une critique n\xE9gative, tandis qu\u2019un "),fo=o(Ql,"CODE",{});var If=r(fo);Np=n(If,"1"),If.forEach(t),Op=n(Ql," correspond \xE0 une critique positive."),Ql.forEach(t),di=_(e),E(fa.$$.fragment,e),mi=_(e),ha=o(e,"P",{});var Iu=r(ha);Lp=n(Iu,"Maintenant que nous avons jet\xE9 un coup d\u2019\u0153il rapide aux donn\xE9es, plongeons dans leur pr\xE9paration pour la mod\xE9lisation du langage masqu\xE9. Comme nous allons le voir, il y a quelques \xE9tapes suppl\xE9mentaires \xE0 suivre par rapport aux t\xE2ches de classification de s\xE9quences que nous avons vues au "),hl=o(Iu,"A",{href:!0});var Uf=r(hl);Kp=n(Uf,"chapitre 3"),Uf.forEach(t),Rp=n(Iu,". Allons-y !"),Iu.forEach(t),ci=_(e),Xt=o(e,"H2",{class:!0});var Uu=r(Xt);va=o(Uu,"A",{id:!0,class:!0,href:!0});var Gf=r(va);ho=o(Gf,"SPAN",{});var Vf=r(ho);E(Xa.$$.fragment,Vf),Vf.forEach(t),Gf.forEach(t),Bp=_(Uu),vo=o(Uu,"SPAN",{});var Wf=r(vo);Fp=n(Wf,"Pr\xE9traitement des donn\xE9es"),Wf.forEach(t),Uu.forEach(t),_i=_(e),E(Za.$$.fragment,e),fi=_(e),ga=o(e,"P",{});var Gu=r(ga);Hp=n(Gu,"Pour la mod\xE9lisation autor\xE9gressive et la mod\xE9lisation du langage masqu\xE9, une \xE9tape commune de pr\xE9traitement consiste \xE0 concat\xE9ner tous les exemples, puis \xE0 diviser le corpus entier en morceaux de taille \xE9gale. C\u2019est tr\xE8s diff\xE9rent de notre approche habituelle, o\xF9 nous nous contentons de "),go=o(Gu,"EM",{});var Jf=r(go);Ip=n(Jf,"tokenizer"),Jf.forEach(t),Up=n(Gu," les exemples individuels. Pourquoi tout concat\xE9ner ? La raison est que les exemples individuels peuvent \xEAtre tronqu\xE9s s\u2019ils sont trop longs, ce qui entra\xEEnerait la perte d\u2019informations qui pourraient \xEAtre utiles pour la t\xE2che de mod\xE9lisation du langage !"),Gu.forEach(t),hi=_(e),Ae=o(e,"P",{});var os=r(Ae);Gp=n(os,"Donc pour commencer, nous allons d\u2019abord tokeniser notre corpus comme d\u2019habitude, mais "),bo=o(os,"EM",{});var Yf=r(bo);Vp=n(Yf,"sans"),Yf.forEach(t),Wp=n(os," mettre l\u2019option "),ko=o(os,"CODE",{});var Qf=r(ko);Jp=n(Qf,"truncation=True"),Qf.forEach(t),Yp=n(os," dans notre "),qo=o(os,"EM",{});var Xf=r(qo);Qp=n(Xf,"tokenizer"),Xf.forEach(t),Xp=n(os,". Nous allons aussi r\xE9cup\xE9rer les identifiants des mots s\u2019ils sont disponibles (ce qui sera le cas si nous utilisons un "),$o=o(os,"EM",{});var Zf=r($o);Zp=n(Zf,"tokenizer"),Zf.forEach(t),ed=n(os," rapide, comme d\xE9crit dans le "),vl=o(os,"A",{href:!0});var eh=r(vl);sd=n(eh,"chapitre 6"),eh.forEach(t),td=n(os,"), car nous en aurons besoin plus tard pour faire le masquage de mots entiers. Nous allons envelopper cela dans une simple fonction, et pendant que nous y sommes, nous allons supprimer les colonnes "),wo=o(os,"CODE",{});var sh=r(wo);ad=n(sh,"text"),sh.forEach(t),nd=n(os," et "),Eo=o(os,"CODE",{});var th=r(Eo);ld=n(th,"label"),th.forEach(t),od=n(os," puisque nous n\u2019en avons plus besoin :"),os.forEach(t),vi=_(e),E(en.$$.fragment,e),gi=_(e),E(sn.$$.fragment,e),bi=_(e),Zs=o(e,"P",{});var Da=r(Zs);rd=n(Da,"Comme DistilBERT est un mod\xE8le de type BERT, nous pouvons voir que les textes encod\xE9s sont constitu\xE9s des "),xo=o(Da,"CODE",{});var ah=r(xo);id=n(ah,"input_ids"),ah.forEach(t),ud=n(Da," et des "),jo=o(Da,"CODE",{});var nh=r(jo);pd=n(nh,"attention_mask"),nh.forEach(t),dd=n(Da," que nous avons vus dans d\u2019autres chapitres, ainsi que des "),yo=o(Da,"CODE",{});var lh=r(yo);md=n(lh,"word_ids"),lh.forEach(t),cd=n(Da," que nous avons ajout\xE9s."),Da.forEach(t),ki=_(e),et=o(e,"P",{});var Aa=r(et);_d=n(Aa,"Maintenant que nos critiques de films ont \xE9t\xE9 tokenis\xE9es, l\u2019\xE9tape suivante consiste \xE0 les regrouper et \xE0 diviser le r\xE9sultat en chunks. Mais quelle taille doivent avoir ces "),zo=o(Aa,"EM",{});var oh=r(zo);fd=n(oh,"chunks"),oh.forEach(t),hd=n(Aa," ? Cela sera finalement d\xE9termin\xE9 par la quantit\xE9 de m\xE9moire GPU dont vous disposez, mais un bon point de d\xE9part est de voir quelle est la taille maximale du contexte du mod\xE8le. Cela peut \xEAtre d\xE9duit en inspectant l\u2019attribut "),Mo=o(Aa,"CODE",{});var rh=r(Mo);vd=n(rh,"model_max_length"),rh.forEach(t),gd=n(Aa," du "),Co=o(Aa,"EM",{});var ih=r(Co);bd=n(ih,"tokenizer"),ih.forEach(t),kd=n(Aa," :"),Aa.forEach(t),qi=_(e),E(tn.$$.fragment,e),$i=_(e),E(an.$$.fragment,e),wi=_(e),st=o(e,"P",{});var Sa=r(st);qd=n(Sa,"Cette valeur est d\xE9riv\xE9e du fichier "),Po=o(Sa,"EM",{});var uh=r(Po);$d=n(uh,"tokenizer_config.json"),uh.forEach(t),wd=n(Sa," associ\xE9 \xE0 un "),Do=o(Sa,"EM",{});var ph=r(Do);Ed=n(ph,"checkpoint"),ph.forEach(t),xd=n(Sa,". Dans ce cas, nous pouvons voir que la taille du contexte est de 512 "),Ao=o(Sa,"EM",{});var dh=r(Ao);jd=n(dh,"tokens"),dh.forEach(t),yd=n(Sa,", tout comme avec BERT."),Sa.forEach(t),Ei=_(e),E(ba.$$.fragment,e),xi=_(e),gl=o(e,"P",{});var mh=r(gl);zd=n(mh,"Ainsi, pour r\xE9aliser nos exp\xE9riences sur des GPUs comme ceux disponibles sur Google Colab, nous choisirons quelque chose d\u2019un peu plus petit qui peut tenir en m\xE9moire :"),mh.forEach(t),ji=_(e),E(nn.$$.fragment,e),yi=_(e),E(ka.$$.fragment,e),zi=_(e),qa=o(e,"P",{});var Vu=r(qa);Md=n(Vu,"Maintenant vient la partie amusante. Pour montrer comment la concat\xE9nation fonctionne, prenons quelques commentaires de notre ensemble d\u2019entra\xEEnement et affichons le nombre de "),So=o(Vu,"EM",{});var ch=r(So);Cd=n(ch,"tokens"),ch.forEach(t),Pd=n(Vu," par commentaire :"),Vu.forEach(t),Mi=_(e),E(ln.$$.fragment,e),Ci=_(e),E(on.$$.fragment,e),Pi=_(e),bl=o(e,"P",{});var _h=r(bl);Dd=n(_h,"Nous pouvons ensuite concat\xE9ner tous ces exemples avec une simple compr\xE9hension du dictionnaire, comme suit :"),_h.forEach(t),Di=_(e),E(rn.$$.fragment,e),Ai=_(e),E(un.$$.fragment,e),Si=_(e),Ms=o(e,"P",{});var Lt=r(Ms);Ad=n(Lt,"Super, la longueur totale est correcte. Donc maintenant, nous allons diviser les exemples concat\xE9n\xE9s en morceaux de la taille donn\xE9e par "),To=o(Lt,"CODE",{});var fh=r(To);Sd=n(fh,"block_size"),fh.forEach(t),Td=n(Lt,". Pour ce faire, nous it\xE9rons sur les caract\xE9ristiques de "),No=o(Lt,"CODE",{});var hh=r(No);Nd=n(hh,"concatenated_examples"),hh.forEach(t),Od=n(Lt," et utilisons une compr\xE9hension de liste pour cr\xE9er des "),Oo=o(Lt,"EM",{});var vh=r(Oo);Ld=n(vh,"chunks"),vh.forEach(t),Kd=n(Lt," de chaque caract\xE9ristique. Le r\xE9sultat est un dictionnaire de "),Lo=o(Lt,"EM",{});var gh=r(Lo);Rd=n(gh,"chunks"),gh.forEach(t),Bd=n(Lt," pour chaque caract\xE9ristique :"),Lt.forEach(t),Ti=_(e),E(pn.$$.fragment,e),Ni=_(e),E(dn.$$.fragment,e),Oi=_(e),$a=o(e,"P",{});var Wu=r($a);Fd=n(Wu,"Comme vous pouvez le voir dans cet exemple, le dernier "),Ko=o(Wu,"EM",{});var bh=r(Ko);Hd=n(bh,"chunk"),bh.forEach(t),Id=n(Wu," sera g\xE9n\xE9ralement plus petit que la taille maximale des morceaux. Il y a deux strat\xE9gies principales pour g\xE9rer cela :"),Wu.forEach(t),Li=_(e),wa=o(e,"UL",{});var Ju=r(wa);mn=o(Ju,"LI",{});var Yu=r(mn);Ud=n(Yu,"Abandonner le dernier morceau s\u2019il est plus petit que "),Ro=o(Yu,"CODE",{});var kh=r(Ro);Gd=n(kh,"chunk_size"),kh.forEach(t),Vd=n(Yu,"."),Yu.forEach(t),Wd=_(Ju),cn=o(Ju,"LI",{});var Qu=r(cn);Jd=n(Qu,"Rembourrer le dernier morceau jusqu\u2019\xE0 ce que sa longueur soit \xE9gale \xE0 "),Bo=o(Qu,"CODE",{});var qh=r(Bo);Yd=n(qh,"chunk_size"),qh.forEach(t),Qd=n(Qu,"."),Qu.forEach(t),Ju.forEach(t),Ki=_(e),kl=o(e,"P",{});var $h=r(kl);Xd=n($h,"Nous adopterons la premi\xE8re approche ici, donc nous allons envelopper toute la logique ci-dessus dans une seule fonction que nous pouvons appliquer \xE0 nos jeux de donn\xE9es tokenis\xE9s :"),$h.forEach(t),Ri=_(e),E(_n.$$.fragment,e),Bi=_(e),ns=o(e,"P",{});var ot=r(ns);Zd=n(ot,"Notez que dans la derni\xE8re \xE9tape de "),Fo=o(ot,"CODE",{});var wh=r(Fo);em=n(wh,"group_texts()"),wh.forEach(t),sm=n(ot," nous cr\xE9ons une nouvelle colonne "),Ho=o(ot,"CODE",{});var Eh=r(Ho);tm=n(Eh,"labels"),Eh.forEach(t),am=n(ot," qui est une copie de la colonne "),Io=o(ot,"CODE",{});var xh=r(Io);nm=n(xh,"input_ids"),xh.forEach(t),lm=n(ot,". Comme nous le verrons bient\xF4t, c\u2019est parce que dans la mod\xE9lisation du langage masqu\xE9, l\u2019objectif est de pr\xE9dire des "),Uo=o(ot,"EM",{});var jh=r(Uo);om=n(jh,"tokens"),jh.forEach(t),rm=n(ot," masqu\xE9s al\xE9atoirement dans le batch d\u2019entr\xE9e, et en cr\xE9ant une colonne "),Go=o(ot,"CODE",{});var yh=r(Go);im=n(yh,"labels"),yh.forEach(t),um=n(ot,", nous fournissons la v\xE9rit\xE9 de base pour notre mod\xE8le de langage \xE0 apprendre."),ot.forEach(t),Fi=_(e),Nt=o(e,"P",{});var Xl=r(Nt);pm=n(Xl,"Appliquons maintenant "),Vo=o(Xl,"CODE",{});var zh=r(Vo);dm=n(zh,"group_texts()"),zh.forEach(t),mm=n(Xl," \xE0 nos jeux de donn\xE9es tokenis\xE9s en utilisant notre fid\xE8le fonction "),Wo=o(Xl,"CODE",{});var Mh=r(Wo);cm=n(Mh,"Dataset.map()"),Mh.forEach(t),_m=n(Xl," :"),Xl.forEach(t),Hi=_(e),E(fn.$$.fragment,e),Ii=_(e),E(hn.$$.fragment,e),Ui=_(e),Se=o(e,"P",{});var rs=r(Se);fm=n(rs,"Vous pouvez voir que le regroupement puis le d\xE9coupage des textes a produit beaucoup plus d\u2019exemples que nos 25 000 exemples initiaux pour les divisions "),Jo=o(rs,"CODE",{});var Ch=r(Jo);hm=n(Ch,"train"),Ch.forEach(t),vm=n(rs," et "),Yo=o(rs,"CODE",{});var Ph=r(Yo);gm=n(Ph,"test"),Ph.forEach(t),bm=n(rs,". C\u2019est parce que nous avons maintenant des exemples impliquant des "),Qo=o(rs,"EM",{});var Dh=r(Qo);km=n(Dh,"tokens"),Dh.forEach(t),qm=n(rs," contigus qui s\u2019\xE9tendent sur plusieurs exemples du corpus original. Vous pouvez le voir explicitement en cherchant les "),Xo=o(rs,"EM",{});var Ah=r(Xo);$m=n(Ah,"tokens"),Ah.forEach(t),wm=n(rs," sp\xE9ciaux "),Zo=o(rs,"CODE",{});var Sh=r(Zo);Em=n(Sh,"[SEP]"),Sh.forEach(t),xm=n(rs," et "),er=o(rs,"CODE",{});var Th=r(er);jm=n(Th,"[CLS]"),Th.forEach(t),ym=n(rs," dans l\u2019un des "),sr=o(rs,"EM",{});var Nh=r(sr);zm=n(Nh,"chunks"),Nh.forEach(t),Mm=n(rs," :"),rs.forEach(t),Gi=_(e),E(vn.$$.fragment,e),Vi=_(e),E(gn.$$.fragment,e),Wi=_(e),ql=o(e,"P",{});var Oh=r(ql);Cm=n(Oh,"Dans cet exemple, vous pouvez voir deux critiques de films qui se chevauchent, l\u2019une sur un film de lyc\xE9e et l\u2019autre sur les sans-abri. Voyons \xE9galement \xE0 quoi ressemblent les \xE9tiquettes pour la mod\xE9lisation du langage masqu\xE9 :"),Oh.forEach(t),Ji=_(e),E(bn.$$.fragment,e),Yi=_(e),E(kn.$$.fragment,e),Qi=_(e),Cs=o(e,"P",{});var Kt=r(Cs);Pm=n(Kt,"Comme pr\xE9vu par notre fonction "),tr=o(Kt,"CODE",{});var Lh=r(tr);Dm=n(Lh,"group_texts()"),Lh.forEach(t),Am=n(Kt," ci-dessus, cela semble identique aux "),ar=o(Kt,"CODE",{});var Kh=r(ar);Sm=n(Kh,"input_ids"),Kh.forEach(t),Tm=n(Kt," d\xE9cod\xE9s. Mais alors comment notre mod\xE8le peut-il apprendre quoi que ce soit ? Il nous manque une \xE9tape cl\xE9 : ins\xE9rer des "),nr=o(Kt,"EM",{});var Rh=r(nr);Nm=n(Rh,"tokens"),Rh.forEach(t),Om=n(Kt," \xE0 des positions al\xE9atoires dans les entr\xE9es ! Voyons comment nous pouvons le faire \xE0 la vol\xE9e pendant le "),lr=o(Kt,"EM",{});var Bh=r(lr);Lm=n(Bh,"finetuning"),Bh.forEach(t),Km=n(Kt," en utilisant un assembleur de donn\xE9es sp\xE9cial."),Kt.forEach(t),Xi=_(e),Zt=o(e,"H2",{class:!0});var Xu=r(Zt);Ea=o(Xu,"A",{id:!0,class:!0,href:!0});var Fh=r(Ea);or=o(Fh,"SPAN",{});var Hh=r(or);E(qn.$$.fragment,Hh),Hh.forEach(t),Fh.forEach(t),Rm=_(Xu),$n=o(Xu,"SPAN",{});var Zu=r($n);rr=o(Zu,"I",{});var Ih=r(rr);Bm=n(Ih,"Finetuning"),Ih.forEach(t),Fm=n(Zu," de DistilBERT avec l'API "),ir=o(Zu,"CODE",{});var Uh=r(ir);Hm=n(Uh,"Trainer"),Uh.forEach(t),Zu.forEach(t),Xu.forEach(t),Zi=_(e),ce=o(e,"P",{});var Te=r(ce);Im=n(Te,"Le "),ur=o(Te,"EM",{});var Gh=r(ur);Um=n(Gh,"finetuning"),Gh.forEach(t),Gm=n(Te," d\u2019un mod\xE8le de langage masqu\xE9 est presque identique au "),pr=o(Te,"EM",{});var Vh=r(pr);Vm=n(Vh,"finetuning"),Vh.forEach(t),Wm=n(Te," d\u2019un mod\xE8le de classification de s\xE9quences, comme nous l\u2019avons fait dans le "),$l=o(Te,"A",{href:!0});var Wh=r($l);Jm=n(Wh,"chapitre 3"),Wh.forEach(t),Ym=n(Te,". La seule diff\xE9rence est que nous avons besoin d\u2019un collecteur de donn\xE9es sp\xE9cial qui peut masquer de mani\xE8re al\xE9atoire certains des "),dr=o(Te,"EM",{});var Jh=r(dr);Qm=n(Jh,"tokens"),Jh.forEach(t),Xm=n(Te," dans chaque batch de textes. Heureusement, \u{1F917} "),mr=o(Te,"EM",{});var Yh=r(mr);Zm=n(Yh,"Transformers"),Yh.forEach(t),ec=n(Te," est livr\xE9 pr\xE9par\xE9 avec un "),cr=o(Te,"CODE",{});var Qh=r(cr);sc=n(Qh,"DataCollatorForLanguageModeling"),Qh.forEach(t),tc=n(Te," d\xE9di\xE9 \xE0 cette t\xE2che. Nous devons juste lui passer le "),_r=o(Te,"EM",{});var Xh=r(_r);ac=n(Xh,"tokenizer"),Xh.forEach(t),nc=n(Te," et un argument "),fr=o(Te,"CODE",{});var Zh=r(fr);lc=n(Zh,"mlm_probability"),Zh.forEach(t),oc=n(Te," qui sp\xE9cifie quelle fraction des "),hr=o(Te,"EM",{});var ev=r(hr);rc=n(ev,"tokens"),ev.forEach(t),ic=n(Te," \xE0 masquer. Nous choisirons 15%, qui est la quantit\xE9 utilis\xE9e pour BERT et un choix commun dans la litt\xE9rature :"),Te.forEach(t),eu=_(e),E(wn.$$.fragment,e),su=_(e),tt=o(e,"P",{});var Ta=r(tt);uc=n(Ta,"Pour voir comment le masquage al\xE9atoire fonctionne, nous allons donner quelques exemples \xE0 l\u2019assembleur de donn\xE9es. Puisqu\u2019il s\u2019attend \xE0 une liste de "),vr=o(Ta,"CODE",{});var sv=r(vr);pc=n(sv,"dict"),sv.forEach(t),dc=n(Ta," o\xF9 chaque "),gr=o(Ta,"CODE",{});var tv=r(gr);mc=n(tv,"dict"),tv.forEach(t),cc=n(Ta," repr\xE9sente un seul morceau de texte contigu, nous it\xE9rons d\u2019abord sur le jeu de donn\xE9es avant de donner le batch \xE0 l\u2019assembleur. Nous supprimons la cl\xE9 "),br=o(Ta,"CODE",{});var av=r(br);_c=n(av,'"word_ids"'),av.forEach(t),fc=n(Ta," pour cet assembleur de donn\xE9es car il ne l\u2019attend pas :"),Ta.forEach(t),tu=_(e),E(En.$$.fragment,e),au=_(e),E(xn.$$.fragment,e),nu=_(e),Ps=o(e,"P",{});var Rt=r(Ps);hc=n(Rt,"Super, \xE7a a march\xE9 ! Nous pouvons voir que le "),kr=o(Rt,"EM",{});var nv=r(kr);vc=n(nv,"token"),nv.forEach(t),gc=_(Rt),qr=o(Rt,"CODE",{});var lv=r(qr);bc=n(lv,"[MASK]"),lv.forEach(t),kc=n(Rt," a \xE9t\xE9 ins\xE9r\xE9 de fa\xE7on al\xE9atoire \xE0 diff\xE9rents endroits dans notre texte. Ce seront les "),$r=o(Rt,"EM",{});var ov=r($r);qc=n(ov,"tokens"),ov.forEach(t),$c=n(Rt," que notre mod\xE8le devra pr\xE9dire pendant l\u2019entra\xEEnement. Et la beaut\xE9 du collecteur de donn\xE9es est qu\u2019il va rendre al\xE9atoire l\u2019insertion du "),wr=o(Rt,"CODE",{});var rv=r(wr);wc=n(rv,"[MASK]"),rv.forEach(t),Ec=n(Rt," \xE0 chaque batch !"),Rt.forEach(t),lu=_(e),E(xa.$$.fragment,e),ou=_(e),gs&&gs.l(e),wl=_(e),Ds=o(e,"P",{});var Bt=r(Ds);xc=n(Bt,"Lors de l\u2019entra\xEEnement des mod\xE8les pour la mod\xE9lisation du langage masqu\xE9, une technique qui peut \xEAtre utilis\xE9e est de masquer des mots entiers ensemble et pas seulement des "),Er=o(Bt,"EM",{});var iv=r(Er);jc=n(iv,"tokens"),iv.forEach(t),yc=n(Bt," individuels. Cette approche est appel\xE9e "),xr=o(Bt,"EM",{});var uv=r(xr);zc=n(uv,"masquage de mots entiers"),uv.forEach(t),Mc=n(Bt,". Si nous voulons utiliser le masquage de mots entiers, nous devons construire nous-m\xEAmes un assembleur de donn\xE9es. Un assembleur de donn\xE9es est simplement une fonction qui prend une liste d\u2019\xE9chantillons et les convertit en un batch. Faisons-le ! Nous utiliserons les identifiants des mots calcul\xE9s plus t\xF4t pour faire une correspondance entre les indices des mots et les "),jr=o(Bt,"EM",{});var pv=r(jr);Cc=n(pv,"tokens"),pv.forEach(t),Pc=n(Bt,", puis nous d\xE9ciderons al\xE9atoirement quels mots masquer et appliquerons ce masque sur les entr\xE9es. Notez que les \xE9tiquettes sont toutes "),yr=o(Bt,"CODE",{});var dv=r(yr);Dc=n(dv,"-100"),dv.forEach(t),Ac=n(Bt," sauf celles qui correspondent aux mots masqu\xE9s."),Bt.forEach(t),ru=_(e),bt.l(e),El=_(e),xl=o(e,"P",{});var mv=r(xl);Sc=n(mv,"Ensuite, nous pouvons l\u2019essayer sur les m\xEAmes \xE9chantillons que pr\xE9c\xE9demment :"),mv.forEach(t),iu=_(e),E(jn.$$.fragment,e),uu=_(e),E(yn.$$.fragment,e),pu=_(e),E(ja.$$.fragment,e),du=_(e),As=o(e,"P",{});var Ft=r(As);Tc=n(Ft,"Maintenant que nous avons deux assembleurs de donn\xE9es, les \xE9tapes restantes du "),zr=o(Ft,"EM",{});var cv=r(zr);Nc=n(cv,"finetuning"),cv.forEach(t),Oc=n(Ft," sont standards. L\u2019entra\xEEnement peut prendre un certain temps sur Google Colab si vous n\u2019avez pas la chance de tomber sur un mythique GPU P100 \u{1F62D}. Ainsi nous allons d\u2019abord r\xE9duire la taille du jeu d\u2019entra\xEEnement \xE0 quelques milliers d\u2019exemples. Ne vous inqui\xE9tez pas, nous obtiendrons quand m\xEAme un mod\xE8le de langage assez d\xE9cent ! Un moyen rapide de r\xE9duire la taille d\u2019un jeu de donn\xE9es dans \u{1F917} "),Mr=o(Ft,"EM",{});var _v=r(Mr);Lc=n(_v,"Datasets"),_v.forEach(t),Kc=n(Ft," est la fonction "),Cr=o(Ft,"CODE",{});var fv=r(Cr);Rc=n(fv,"Dataset.train_test_split()"),fv.forEach(t),Bc=n(Ft," que nous avons vue au "),jl=o(Ft,"A",{href:!0});var hv=r(jl);Fc=n(hv,"chapitre 5"),hv.forEach(t),Hc=n(Ft," :"),Ft.forEach(t),mu=_(e),E(zn.$$.fragment,e),cu=_(e),E(Mn.$$.fragment,e),_u=_(e),Ss=o(e,"P",{});var Ht=r(Ss);Ic=n(Ht,"Cela a automatiquement cr\xE9\xE9 de nouvelles divisions "),Pr=o(Ht,"CODE",{});var vv=r(Pr);Uc=n(vv,"train"),vv.forEach(t),Gc=n(Ht," et "),Dr=o(Ht,"CODE",{});var gv=r(Dr);Vc=n(gv,"test"),gv.forEach(t),Wc=n(Ht," avec la taille du jeu d\u2019entra\xEEnement fix\xE9e \xE0 10.000 exemples et la validation fix\xE9e \xE0 10% de cela. N\u2019h\xE9sitez pas \xE0 augmenter la taille si vous avez un GPU puissant ! La prochaine chose que nous devons faire est de nous connecter au "),Ar=o(Ht,"EM",{});var bv=r(Ar);Jc=n(bv,"Hub"),bv.forEach(t),Yc=n(Ht,". Si vous ex\xE9cutez ce code dans un "),Sr=o(Ht,"EM",{});var kv=r(Sr);Qc=n(kv,"notebook"),kv.forEach(t),Xc=n(Ht,", vous pouvez le faire avec la fonction suivante :"),Ht.forEach(t),fu=_(e),E(Cn.$$.fragment,e),hu=_(e),ya=o(e,"P",{});var ep=r(ya);Zc=n(ep,"qui affichera un "),Tr=o(ep,"EM",{});var qv=r(Tr);e_=n(qv,"widget"),qv.forEach(t),s_=n(ep," o\xF9 vous pourrez saisir vos informations d\u2019identification. Alternativement, vous pouvez ex\xE9cuter :"),ep.forEach(t),vu=_(e),E(Pn.$$.fragment,e),gu=_(e),yl=o(e,"P",{});var $v=r(yl);t_=n($v,"dans votre terminal pr\xE9f\xE9r\xE9 et connectez-vous l\xE0."),$v.forEach(t),bu=_(e),qt.l(e),zl=_(e),ea=o(e,"H3",{class:!0});var sp=r(ea);za=o(sp,"A",{id:!0,class:!0,href:!0});var wv=r(za);Nr=o(wv,"SPAN",{});var Ev=r(Nr);E(Dn.$$.fragment,Ev),Ev.forEach(t),wv.forEach(t),a_=_(sp),Or=o(sp,"SPAN",{});var xv=r(Or);n_=n(xv,"Perplexit\xE9 pour les mod\xE8les de langage"),xv.forEach(t),sp.forEach(t),ku=_(e),E(An.$$.fragment,e),qu=_(e),Ml=o(e,"P",{});var jv=r(Ml);l_=n(jv,"Contrairement \xE0 d\u2019autres t\xE2ches, comme la classification de textes ou la r\xE9ponse \xE0 des questions, sur lesquelles nous disposons d\u2019un corpus \xE9tiquet\xE9 pour entra\xEEner, la mod\xE9lisation du langage ne s\u2019appuie sur aucune \xE9tiquette explicite. Alors comment d\xE9terminer ce qui fait un bon mod\xE8le de langage ? Comme pour la fonction de correction automatique de votre t\xE9l\xE9phone, un bon mod\xE8le de langage est celui qui attribue des probabilit\xE9s \xE9lev\xE9es aux phrases grammaticalement correctes et des probabilit\xE9s faibles aux phrases absurdes. Pour vous donner une meilleure id\xE9e de ce \xE0 quoi cela ressemble, vous pouvez trouver en ligne des s\xE9ries enti\xE8res de \xAB rat\xE9s d\u2019autocorrection \xBB o\xF9 le mod\xE8le d\u2019un t\xE9l\xE9phone produit des compl\xE9ments plut\xF4t amusants (et souvent inappropri\xE9s) !"),jv.forEach(t),$u=_(e),wt.l(e),Cl=_(e),E(Sn.$$.fragment,e),wu=_(e),Pl=o(e,"P",{});var yv=r(Pl);o_=n(yv,"Un score de perplexit\xE9 faible signifie un meilleur mod\xE8le de langue. Nous pouvons voir ici que notre mod\xE8le de d\xE9part a une valeur assez \xE9lev\xE9e. Voyons si nous pouvons la r\xE9duire en l\u2019affinant ! Pour ce faire, nous commen\xE7ons par ex\xE9cuter la boucle d\u2019entra\xEEnement :"),yv.forEach(t),Eu=_(e),xt.l(e),Dl=_(e),Al=o(e,"P",{});var zv=r(Al);r_=n(zv,"et ensuite calculer la perplexit\xE9 r\xE9sultante sur l\u2019ensemble de test comme pr\xE9c\xE9demment :"),zv.forEach(t),xu=_(e),yt.l(e),Sl=_(e),E(Tn.$$.fragment,e),ju=_(e),Tl=o(e,"P",{});var Mv=r(Tl);i_=n(Mv,"Joli. C\u2019est une r\xE9duction consid\xE9rable de la perplexit\xE9, ce qui nous indique que le mod\xE8le a appris quelque chose sur le domaine des critiques de films !"),Mv.forEach(t),yu=_(e),Ie&&Ie.l(e),Nl=_(e),E(Ma.$$.fragment,e),zu=_(e),Ue&&Ue.l(e),Ol=_(e),sa=o(e,"H3",{class:!0});var tp=r(sa);Ca=o(tp,"A",{id:!0,class:!0,href:!0});var Cv=r(Ca);Lr=o(Cv,"SPAN",{});var Pv=r(Lr);E(Nn.$$.fragment,Pv),Pv.forEach(t),Cv.forEach(t),u_=_(tp),Ll=o(tp,"SPAN",{});var D_=r(Ll);p_=n(D_,"Utilisation de notre mod\xE8le "),Kr=o(D_,"I",{});var Dv=r(Kr);d_=n(Dv,"finetun\xE9"),Dv.forEach(t),D_.forEach(t),tp.forEach(t),Mu=_(e),Qe=o(e,"P",{});var Ts=r(Qe);m_=n(Ts,"Vous pouvez interagir avec votre mod\xE8le "),Rr=o(Ts,"EM",{});var Av=r(Rr);c_=n(Av,"finetun\xE9"),Av.forEach(t),__=n(Ts," soit en utilisant son "),Br=o(Ts,"EM",{});var Sv=r(Br);f_=n(Sv,"widget"),Sv.forEach(t),h_=n(Ts," sur le "),Fr=o(Ts,"EM",{});var Tv=r(Fr);v_=n(Tv,"Hub"),Tv.forEach(t),g_=n(Ts,", soit localement avec le "),Hr=o(Ts,"CODE",{});var Nv=r(Hr);b_=n(Nv,"pipeline"),Nv.forEach(t),k_=n(Ts," de \u{1F917} "),Ir=o(Ts,"EM",{});var Ov=r(Ir);q_=n(Ov,"Transformers"),Ov.forEach(t),$_=n(Ts,". Utilisons ce dernier pour t\xE9l\xE9charger notre mod\xE8le en utilisant le pipeline "),Ur=o(Ts,"CODE",{});var Lv=r(Ur);w_=n(Lv,"fill-mask"),Lv.forEach(t),E_=n(Ts," :"),Ts.forEach(t),Cu=_(e),E(On.$$.fragment,e),Pu=_(e),Kl=o(e,"P",{});var Kv=r(Kl);x_=n(Kv,"Nous pouvons ensuite donner au pipeline notre exemple de texte \xAB this is a great [MASK] \xBB et voir quelles sont les 5 premi\xE8res pr\xE9dictions :"),Kv.forEach(t),Du=_(e),E(Ln.$$.fragment,e),Au=_(e),E(Kn.$$.fragment,e),Su=_(e),Rl=o(e,"P",{});var Rv=r(Rl);j_=n(Rv,"Notre mod\xE8le a clairement adapt\xE9 ses pond\xE9rations pour pr\xE9dire les mots qui sont plus fortement associ\xE9s aux films !"),Rv.forEach(t),Tu=_(e),E(Rn.$$.fragment,e),Nu=_(e),Ot=o(e,"P",{});var Zl=r(Ot);y_=n(Zl,"Ceci conclut notre premi\xE8re exp\xE9rience d\u2019entra\xEEnement d\u2019un mod\xE8le de langage. Dans la "),Bl=o(Zl,"A",{href:!0});var Bv=r(Bl);z_=n(Bv,"section 6"),Bv.forEach(t),M_=n(Zl,", vous apprendrez comment entra\xEEner \xE0 partir de z\xE9ro un mod\xE8le autor\xE9gressif comme GPT-2. Allez-y si vous voulez voir comment vous pouvez pr\xE9-entra\xEEner votre propre "),Gr=o(Zl,"EM",{});var Fv=r(Gr);C_=n(Fv,"transformer"),Fv.forEach(t),P_=n(Zl," !"),Zl.forEach(t),Ou=_(e),E(Pa.$$.fragment,e),this.h()},h(){y(i,"name","hf:doc:metadata"),y(i,"content",JSON.stringify(Eg)),y(q,"id","ifinetuneri-un-modle-de-langage-masqu"),y(q,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),y(q,"href","#ifinetuneri-un-modle-de-langage-masqu"),y(A,"class","relative group"),y(ke,"href","https://arxiv.org/abs/1801.06146"),y(ke,"rel","nofollow"),y(Q,"class","block dark:hidden"),Xr(Q.src,Ve="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/ulmfit.svg")||y(Q,"src",Ve),y(Q,"alt","ULMFiT."),y(Y,"class","hidden dark:block"),Xr(Y.src,$e="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/ulmfit-dark.svg")||y(Y,"src",$e),y(Y,"alt","ULMFiT."),y(B,"class","flex justify-center"),y(We,"href","https://huggingface.co/huggingface-course/distilbert-base-uncased-finetuned-imdb?text=This+is+a+great+%5BMASK%5D."),y(We,"rel","nofollow"),Xr(he.src,Os="https://course-demos-distilbert-base-uncased-finetune-7400b54.hf.space")||y(he,"src",Os),y(he,"frameborder","0"),y(he,"height","300"),y(he,"title","Gradio app"),y(he,"class","block dark:hidden container p-0 flex-grow space-iframe"),y(he,"allow","accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking"),y(he,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),Xr(oe.src,ze="https://course-demos-distilbert-base-uncased-finetuned-imdb-darkmode.hf.space")||y(oe,"src",ze),y(oe,"frameborder","0"),y(oe,"height","300"),y(oe,"title","Gradio app"),y(oe,"class","hidden dark:block container p-0 flex-grow space-iframe"),y(oe,"allow","accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking"),y(oe,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),y(Rs,"id","choix-dun-modle-prentran-pour-la-modlisation-du-langage-masqu"),y(Rs,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),y(Rs,"href","#choix-dun-modle-prentran-pour-la-modlisation-du-langage-masqu"),y(Ks,"class","relative group"),y(hs,"href","https://huggingface.co/models?pipeline_tag=fill-mask&sort=downloads"),y(hs,"rel","nofollow"),Xr(Fs.src,Qn="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/mlm-models.png")||y(Fs,"src",Qn),y(Fs,"alt","Hub models."),y(Fs,"width","80%"),y(pt,"class","flex justify-center"),y(dt,"href","https://huggingface.co/distilbert-base-uncased"),y(dt,"rel","nofollow"),y(Ws,"href","https://en.wikipedia.org/wiki/Knowledge_distillation"),y(Ws,"rel","nofollow"),y(Ys,"href","https://www.oreilly.com/library/view/natural-language-processing/9781098136789/"),y(Ys,"rel","nofollow"),y(Pt,"href","https://huggingface.co/datasets/wikipedia"),y(Pt,"rel","nofollow"),y(At,"href","https://huggingface.co/datasets/bookcorpus"),y(At,"rel","nofollow"),y(_a,"id","le-jeu-de-donnes"),y(_a,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),y(_a,"href","#le-jeu-de-donnes"),y(Qt,"class","relative group"),y(Va,"href","https://huggingface.co/datasets/imdb"),y(Va,"rel","nofollow"),y(hl,"href","/course/fr/chapter3"),y(va,"id","prtraitement-des-donnes"),y(va,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),y(va,"href","#prtraitement-des-donnes"),y(Xt,"class","relative group"),y(vl,"href","/course/fr/chapter6/3"),y(Ea,"id","ifinetuningi-de-distilbert-avec-lapi-trainer"),y(Ea,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),y(Ea,"href","#ifinetuningi-de-distilbert-avec-lapi-trainer"),y(Zt,"class","relative group"),y($l,"href","/course/fr/chapter3"),y(jl,"href","/course/fr/chapter5"),y(za,"id","perplexit-pour-les-modles-de-langage"),y(za,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),y(za,"href","#perplexit-pour-les-modles-de-langage"),y(ea,"class","relative group"),y(Ca,"id","utilisation-de-notre-modle-ifinetuni"),y(Ca,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),y(Ca,"href","#utilisation-de-notre-modle-ifinetuni"),y(sa,"class","relative group"),y(Bl,"href","/course/fr/chapter7/section6")},m(e,u){s(document.head,i),p(e,h,u),x(d,e,u),p(e,$,u),p(e,A,u),s(A,q),s(q,k),x(P,k,null),s(A,f),s(A,C),s(C,O),s(O,M),s(C,T),p(e,U,u),Bn[z].m(e,u),p(e,I,u),p(e,L,u),s(L,v),s(L,N),s(N,W),s(L,G),s(L,J),s(J,se),s(L,ie),s(L,te),s(te,ee),s(L,K),s(L,ue),s(ue,Z),s(L,ae),p(e,de,u),p(e,V,u),s(V,Ee),s(V,ne),s(ne,me),s(V,is),s(V,Ne),s(Ne,Oe),s(V,us),s(V,Le),s(Le,Ke),s(V,ps),s(V,xe),s(xe,Me),s(V,Re),p(e,Xe,u),p(e,X,u),s(X,ge),s(X,Be),s(Be,Fe),s(X,ds),s(X,Ge),s(Ge,be),s(X,Ce),s(X,re),s(re,_e),s(X,je),s(X,ke),s(ke,qe),s(X,Ze),s(X,ye),s(ye,ms),s(X,es),p(e,He,u),p(e,B,u),s(B,Q),s(B,F),s(B,Y),p(e,le,u),p(e,Pe,u),s(Pe,Ns),s(Pe,We),s(We,ss),s(Pe,pe),s(Pe,De),s(De,fe),s(Pe,cs),p(e,ks,u),p(e,he,u),p(e,Je,u),p(e,oe,u),p(e,qs,u),p(e,_s,u),s(_s,$s),p(e,rt,u),x(fs,e,u),p(e,Gs,u),x(Ls,e,u),p(e,it,u),p(e,Ks,u),s(Ks,Rs),s(Rs,Bs),x(Vs,Bs,null),s(Ks,ws),s(Ks,Gt),s(Gt,Vt),p(e,ta,u),p(e,Es,u),s(Es,Wt),s(Es,Jt),s(Jt,La),s(Es,aa),s(Es,hs),s(hs,zt),s(zt,ut),s(Es,na),p(e,vs,u),p(e,pt,u),s(pt,Fs),p(e,la,u),p(e,we,u),s(we,Ka),s(we,dt),s(dt,oa),s(we,mt),s(we,Ws),s(Ws,Js),s(Js,Ra),s(we,ra),s(we,Hs),s(Hs,ia),s(we,ct),s(we,Mt),s(Mt,Ct),s(we,Ba),s(we,Ys),s(Ys,m),s(m,R),s(we,Xn),p(e,Yt,u),Fn[xs].m(e,u),p(e,_t,u),p(e,ft,u),s(ft,Zn),s(ft,ys),s(ys,el),s(ft,sl),p(e,Fa,u),x(Ye,e,u),p(e,Ha,u),p(e,ve,u),s(ve,tl),s(ve,ua),s(ua,pa),s(ve,al),s(ve,zs),s(zs,nl),s(ve,ll),s(ve,Pt),s(Pt,Dt),s(Dt,ol),s(ve,da),s(ve,At),s(At,St),s(St,rl),s(ve,il),s(ve,Qs),s(Qs,ul),s(ve,pl),s(ve,Xs),s(Xs,dl),s(ve,ml),s(ve,ma),s(ma,cl),s(ve,np),p(e,Zr,u),x(Ia,e,u),p(e,ei,u),p(e,ca,u),s(ca,lp),s(ca,eo),s(eo,op),s(ca,rp),p(e,si,u),Hn[ht].m(e,u),p(e,_l,u),x(Ua,e,u),p(e,ti,u),p(e,fl,u),s(fl,ip),p(e,ai,u),p(e,Qt,u),s(Qt,_a),s(_a,so),x(Ga,so,null),s(Qt,up),s(Qt,to),s(to,pp),p(e,ni,u),p(e,ts,u),s(ts,dp),s(ts,Va),s(Va,ao),s(ao,mp),s(ts,cp),s(ts,no),s(no,_p),s(ts,fp),s(ts,lo),s(lo,hp),s(ts,vp),s(ts,oo),s(oo,gp),s(ts,bp),s(ts,ro),s(ro,kp),s(ts,qp),p(e,li,u),x(Wa,e,u),p(e,oi,u),x(Ja,e,u),p(e,ri,u),p(e,as,u),s(as,$p),s(as,io),s(io,wp),s(as,Ep),s(as,uo),s(uo,xp),s(as,jp),s(as,po),s(po,yp),s(as,zp),s(as,mo),s(mo,Mp),s(as,Cp),s(as,co),s(co,Pp),s(as,Dp),p(e,ii,u),x(Ya,e,u),p(e,ui,u),x(Qa,e,u),p(e,pi,u),p(e,Tt,u),s(Tt,Ap),s(Tt,_o),s(_o,Sp),s(Tt,Tp),s(Tt,fo),s(fo,Np),s(Tt,Op),p(e,di,u),x(fa,e,u),p(e,mi,u),p(e,ha,u),s(ha,Lp),s(ha,hl),s(hl,Kp),s(ha,Rp),p(e,ci,u),p(e,Xt,u),s(Xt,va),s(va,ho),x(Xa,ho,null),s(Xt,Bp),s(Xt,vo),s(vo,Fp),p(e,_i,u),x(Za,e,u),p(e,fi,u),p(e,ga,u),s(ga,Hp),s(ga,go),s(go,Ip),s(ga,Up),p(e,hi,u),p(e,Ae,u),s(Ae,Gp),s(Ae,bo),s(bo,Vp),s(Ae,Wp),s(Ae,ko),s(ko,Jp),s(Ae,Yp),s(Ae,qo),s(qo,Qp),s(Ae,Xp),s(Ae,$o),s($o,Zp),s(Ae,ed),s(Ae,vl),s(vl,sd),s(Ae,td),s(Ae,wo),s(wo,ad),s(Ae,nd),s(Ae,Eo),s(Eo,ld),s(Ae,od),p(e,vi,u),x(en,e,u),p(e,gi,u),x(sn,e,u),p(e,bi,u),p(e,Zs,u),s(Zs,rd),s(Zs,xo),s(xo,id),s(Zs,ud),s(Zs,jo),s(jo,pd),s(Zs,dd),s(Zs,yo),s(yo,md),s(Zs,cd),p(e,ki,u),p(e,et,u),s(et,_d),s(et,zo),s(zo,fd),s(et,hd),s(et,Mo),s(Mo,vd),s(et,gd),s(et,Co),s(Co,bd),s(et,kd),p(e,qi,u),x(tn,e,u),p(e,$i,u),x(an,e,u),p(e,wi,u),p(e,st,u),s(st,qd),s(st,Po),s(Po,$d),s(st,wd),s(st,Do),s(Do,Ed),s(st,xd),s(st,Ao),s(Ao,jd),s(st,yd),p(e,Ei,u),x(ba,e,u),p(e,xi,u),p(e,gl,u),s(gl,zd),p(e,ji,u),x(nn,e,u),p(e,yi,u),x(ka,e,u),p(e,zi,u),p(e,qa,u),s(qa,Md),s(qa,So),s(So,Cd),s(qa,Pd),p(e,Mi,u),x(ln,e,u),p(e,Ci,u),x(on,e,u),p(e,Pi,u),p(e,bl,u),s(bl,Dd),p(e,Di,u),x(rn,e,u),p(e,Ai,u),x(un,e,u),p(e,Si,u),p(e,Ms,u),s(Ms,Ad),s(Ms,To),s(To,Sd),s(Ms,Td),s(Ms,No),s(No,Nd),s(Ms,Od),s(Ms,Oo),s(Oo,Ld),s(Ms,Kd),s(Ms,Lo),s(Lo,Rd),s(Ms,Bd),p(e,Ti,u),x(pn,e,u),p(e,Ni,u),x(dn,e,u),p(e,Oi,u),p(e,$a,u),s($a,Fd),s($a,Ko),s(Ko,Hd),s($a,Id),p(e,Li,u),p(e,wa,u),s(wa,mn),s(mn,Ud),s(mn,Ro),s(Ro,Gd),s(mn,Vd),s(wa,Wd),s(wa,cn),s(cn,Jd),s(cn,Bo),s(Bo,Yd),s(cn,Qd),p(e,Ki,u),p(e,kl,u),s(kl,Xd),p(e,Ri,u),x(_n,e,u),p(e,Bi,u),p(e,ns,u),s(ns,Zd),s(ns,Fo),s(Fo,em),s(ns,sm),s(ns,Ho),s(Ho,tm),s(ns,am),s(ns,Io),s(Io,nm),s(ns,lm),s(ns,Uo),s(Uo,om),s(ns,rm),s(ns,Go),s(Go,im),s(ns,um),p(e,Fi,u),p(e,Nt,u),s(Nt,pm),s(Nt,Vo),s(Vo,dm),s(Nt,mm),s(Nt,Wo),s(Wo,cm),s(Nt,_m),p(e,Hi,u),x(fn,e,u),p(e,Ii,u),x(hn,e,u),p(e,Ui,u),p(e,Se,u),s(Se,fm),s(Se,Jo),s(Jo,hm),s(Se,vm),s(Se,Yo),s(Yo,gm),s(Se,bm),s(Se,Qo),s(Qo,km),s(Se,qm),s(Se,Xo),s(Xo,$m),s(Se,wm),s(Se,Zo),s(Zo,Em),s(Se,xm),s(Se,er),s(er,jm),s(Se,ym),s(Se,sr),s(sr,zm),s(Se,Mm),p(e,Gi,u),x(vn,e,u),p(e,Vi,u),x(gn,e,u),p(e,Wi,u),p(e,ql,u),s(ql,Cm),p(e,Ji,u),x(bn,e,u),p(e,Yi,u),x(kn,e,u),p(e,Qi,u),p(e,Cs,u),s(Cs,Pm),s(Cs,tr),s(tr,Dm),s(Cs,Am),s(Cs,ar),s(ar,Sm),s(Cs,Tm),s(Cs,nr),s(nr,Nm),s(Cs,Om),s(Cs,lr),s(lr,Lm),s(Cs,Km),p(e,Xi,u),p(e,Zt,u),s(Zt,Ea),s(Ea,or),x(qn,or,null),s(Zt,Rm),s(Zt,$n),s($n,rr),s(rr,Bm),s($n,Fm),s($n,ir),s(ir,Hm),p(e,Zi,u),p(e,ce,u),s(ce,Im),s(ce,ur),s(ur,Um),s(ce,Gm),s(ce,pr),s(pr,Vm),s(ce,Wm),s(ce,$l),s($l,Jm),s(ce,Ym),s(ce,dr),s(dr,Qm),s(ce,Xm),s(ce,mr),s(mr,Zm),s(ce,ec),s(ce,cr),s(cr,sc),s(ce,tc),s(ce,_r),s(_r,ac),s(ce,nc),s(ce,fr),s(fr,lc),s(ce,oc),s(ce,hr),s(hr,rc),s(ce,ic),p(e,eu,u),x(wn,e,u),p(e,su,u),p(e,tt,u),s(tt,uc),s(tt,vr),s(vr,pc),s(tt,dc),s(tt,gr),s(gr,mc),s(tt,cc),s(tt,br),s(br,_c),s(tt,fc),p(e,tu,u),x(En,e,u),p(e,au,u),x(xn,e,u),p(e,nu,u),p(e,Ps,u),s(Ps,hc),s(Ps,kr),s(kr,vc),s(Ps,gc),s(Ps,qr),s(qr,bc),s(Ps,kc),s(Ps,$r),s($r,qc),s(Ps,$c),s(Ps,wr),s(wr,wc),s(Ps,Ec),p(e,lu,u),x(xa,e,u),p(e,ou,u),gs&&gs.m(e,u),p(e,wl,u),p(e,Ds,u),s(Ds,xc),s(Ds,Er),s(Er,jc),s(Ds,yc),s(Ds,xr),s(xr,zc),s(Ds,Mc),s(Ds,jr),s(jr,Cc),s(Ds,Pc),s(Ds,yr),s(yr,Dc),s(Ds,Ac),p(e,ru,u),In[gt].m(e,u),p(e,El,u),p(e,xl,u),s(xl,Sc),p(e,iu,u),x(jn,e,u),p(e,uu,u),x(yn,e,u),p(e,pu,u),x(ja,e,u),p(e,du,u),p(e,As,u),s(As,Tc),s(As,zr),s(zr,Nc),s(As,Oc),s(As,Mr),s(Mr,Lc),s(As,Kc),s(As,Cr),s(Cr,Rc),s(As,Bc),s(As,jl),s(jl,Fc),s(As,Hc),p(e,mu,u),x(zn,e,u),p(e,cu,u),x(Mn,e,u),p(e,_u,u),p(e,Ss,u),s(Ss,Ic),s(Ss,Pr),s(Pr,Uc),s(Ss,Gc),s(Ss,Dr),s(Dr,Vc),s(Ss,Wc),s(Ss,Ar),s(Ar,Jc),s(Ss,Yc),s(Ss,Sr),s(Sr,Qc),s(Ss,Xc),p(e,fu,u),x(Cn,e,u),p(e,hu,u),p(e,ya,u),s(ya,Zc),s(ya,Tr),s(Tr,e_),s(ya,s_),p(e,vu,u),x(Pn,e,u),p(e,gu,u),p(e,yl,u),s(yl,t_),p(e,bu,u),Un[kt].m(e,u),p(e,zl,u),p(e,ea,u),s(ea,za),s(za,Nr),x(Dn,Nr,null),s(ea,a_),s(ea,Or),s(Or,n_),p(e,ku,u),x(An,e,u),p(e,qu,u),p(e,Ml,u),s(Ml,l_),p(e,$u,u),Gn[$t].m(e,u),p(e,Cl,u),x(Sn,e,u),p(e,wu,u),p(e,Pl,u),s(Pl,o_),p(e,Eu,u),Vn[Et].m(e,u),p(e,Dl,u),p(e,Al,u),s(Al,r_),p(e,xu,u),Wn[jt].m(e,u),p(e,Sl,u),x(Tn,e,u),p(e,ju,u),p(e,Tl,u),s(Tl,i_),p(e,yu,u),Ie&&Ie.m(e,u),p(e,Nl,u),x(Ma,e,u),p(e,zu,u),Ue&&Ue.m(e,u),p(e,Ol,u),p(e,sa,u),s(sa,Ca),s(Ca,Lr),x(Nn,Lr,null),s(sa,u_),s(sa,Ll),s(Ll,p_),s(Ll,Kr),s(Kr,d_),p(e,Mu,u),p(e,Qe,u),s(Qe,m_),s(Qe,Rr),s(Rr,c_),s(Qe,__),s(Qe,Br),s(Br,f_),s(Qe,h_),s(Qe,Fr),s(Fr,v_),s(Qe,g_),s(Qe,Hr),s(Hr,b_),s(Qe,k_),s(Qe,Ir),s(Ir,q_),s(Qe,$_),s(Qe,Ur),s(Ur,w_),s(Qe,E_),p(e,Cu,u),x(On,e,u),p(e,Pu,u),p(e,Kl,u),s(Kl,x_),p(e,Du,u),x(Ln,e,u),p(e,Au,u),x(Kn,e,u),p(e,Su,u),p(e,Rl,u),s(Rl,j_),p(e,Tu,u),x(Rn,e,u),p(e,Nu,u),p(e,Ot,u),s(Ot,y_),s(Ot,Bl),s(Bl,z_),s(Ot,M_),s(Ot,Gr),s(Gr,C_),s(Ot,P_),p(e,Ou,u),x(Pa,e,u),Lu=!0},p(e,[u]){const Jn={};u&1&&(Jn.fw=e[0]),d.$set(Jn);let Fl=z;z=S_(e),z!==Fl&&(Ut(),b(Bn[Fl],1,1,()=>{Bn[Fl]=null}),It(),D=Bn[z],D||(D=Bn[z]=A_[z](e),D.c()),g(D,1),D.m(I.parentNode,I));const Vr={};u&2&&(Vr.$$scope={dirty:u,ctx:e}),Ls.$set(Vr);let Yn=xs;xs=N_(e),xs!==Yn&&(Ut(),b(Fn[Yn],1,1,()=>{Fn[Yn]=null}),It(),js=Fn[xs],js||(js=Fn[xs]=T_[xs](e),js.c()),g(js,1),js.m(_t.parentNode,_t));let Hl=ht;ht=L_(e),ht!==Hl&&(Ut(),b(Hn[Hl],1,1,()=>{Hn[Hl]=null}),It(),vt=Hn[ht],vt||(vt=Hn[ht]=O_[ht](e),vt.c()),g(vt,1),vt.m(_l.parentNode,_l));const Is={};u&2&&(Is.$$scope={dirty:u,ctx:e}),fa.$set(Is);const Wr={};u&2&&(Wr.$$scope={dirty:u,ctx:e}),ba.$set(Wr);const Jr={};u&2&&(Jr.$$scope={dirty:u,ctx:e}),ka.$set(Jr);const Yr={};u&2&&(Yr.$$scope={dirty:u,ctx:e}),xa.$set(Yr),e[0]==="pt"?gs||(gs=Hv(),gs.c(),gs.m(wl.parentNode,wl)):gs&&(gs.d(1),gs=null);let Il=gt;gt=R_(e),gt!==Il&&(Ut(),b(In[Il],1,1,()=>{In[Il]=null}),It(),bt=In[gt],bt||(bt=In[gt]=K_[gt](e),bt.c()),g(bt,1),bt.m(El.parentNode,El));const Us={};u&2&&(Us.$$scope={dirty:u,ctx:e}),ja.$set(Us);let Ul=kt;kt=F_(e),kt!==Ul&&(Ut(),b(Un[Ul],1,1,()=>{Un[Ul]=null}),It(),qt=Un[kt],qt||(qt=Un[kt]=B_[kt](e),qt.c()),g(qt,1),qt.m(zl.parentNode,zl));let Gl=$t;$t=I_(e),$t!==Gl&&(Ut(),b(Gn[Gl],1,1,()=>{Gn[Gl]=null}),It(),wt=Gn[$t],wt||(wt=Gn[$t]=H_[$t](e),wt.c()),g(wt,1),wt.m(Cl.parentNode,Cl));let Vl=Et;Et=G_(e),Et!==Vl&&(Ut(),b(Vn[Vl],1,1,()=>{Vn[Vl]=null}),It(),xt=Vn[Et],xt||(xt=Vn[Et]=U_[Et](e),xt.c()),g(xt,1),xt.m(Dl.parentNode,Dl));let Wl=jt;jt=W_(e),jt!==Wl&&(Ut(),b(Wn[Wl],1,1,()=>{Wn[Wl]=null}),It(),yt=Wn[jt],yt||(yt=Wn[jt]=V_[jt](e),yt.c()),g(yt,1),yt.m(Sl.parentNode,Sl)),e[0]==="pt"?Ie?u&1&&g(Ie,1):(Ie=Iv(),Ie.c(),g(Ie,1),Ie.m(Nl.parentNode,Nl)):Ie&&(Ut(),b(Ie,1,1,()=>{Ie=null}),It());const bs={};u&2&&(bs.$$scope={dirty:u,ctx:e}),Ma.$set(bs),e[0]==="pt"?Ue?u&1&&g(Ue,1):(Ue=Uv(),Ue.c(),g(Ue,1),Ue.m(Ol.parentNode,Ol)):Ue&&(Ut(),b(Ue,1,1,()=>{Ue=null}),It());const Qr={};u&2&&(Qr.$$scope={dirty:u,ctx:e}),Pa.$set(Qr)},i(e){Lu||(g(d.$$.fragment,e),g(P.$$.fragment,e),g(D),g(fs.$$.fragment,e),g(Ls.$$.fragment,e),g(Vs.$$.fragment,e),g(js),g(Ye.$$.fragment,e),g(Ia.$$.fragment,e),g(vt),g(Ua.$$.fragment,e),g(Ga.$$.fragment,e),g(Wa.$$.fragment,e),g(Ja.$$.fragment,e),g(Ya.$$.fragment,e),g(Qa.$$.fragment,e),g(fa.$$.fragment,e),g(Xa.$$.fragment,e),g(Za.$$.fragment,e),g(en.$$.fragment,e),g(sn.$$.fragment,e),g(tn.$$.fragment,e),g(an.$$.fragment,e),g(ba.$$.fragment,e),g(nn.$$.fragment,e),g(ka.$$.fragment,e),g(ln.$$.fragment,e),g(on.$$.fragment,e),g(rn.$$.fragment,e),g(un.$$.fragment,e),g(pn.$$.fragment,e),g(dn.$$.fragment,e),g(_n.$$.fragment,e),g(fn.$$.fragment,e),g(hn.$$.fragment,e),g(vn.$$.fragment,e),g(gn.$$.fragment,e),g(bn.$$.fragment,e),g(kn.$$.fragment,e),g(qn.$$.fragment,e),g(wn.$$.fragment,e),g(En.$$.fragment,e),g(xn.$$.fragment,e),g(xa.$$.fragment,e),g(bt),g(jn.$$.fragment,e),g(yn.$$.fragment,e),g(ja.$$.fragment,e),g(zn.$$.fragment,e),g(Mn.$$.fragment,e),g(Cn.$$.fragment,e),g(Pn.$$.fragment,e),g(qt),g(Dn.$$.fragment,e),g(An.$$.fragment,e),g(wt),g(Sn.$$.fragment,e),g(xt),g(yt),g(Tn.$$.fragment,e),g(Ie),g(Ma.$$.fragment,e),g(Ue),g(Nn.$$.fragment,e),g(On.$$.fragment,e),g(Ln.$$.fragment,e),g(Kn.$$.fragment,e),g(Rn.$$.fragment,e),g(Pa.$$.fragment,e),Lu=!0)},o(e){b(d.$$.fragment,e),b(P.$$.fragment,e),b(D),b(fs.$$.fragment,e),b(Ls.$$.fragment,e),b(Vs.$$.fragment,e),b(js),b(Ye.$$.fragment,e),b(Ia.$$.fragment,e),b(vt),b(Ua.$$.fragment,e),b(Ga.$$.fragment,e),b(Wa.$$.fragment,e),b(Ja.$$.fragment,e),b(Ya.$$.fragment,e),b(Qa.$$.fragment,e),b(fa.$$.fragment,e),b(Xa.$$.fragment,e),b(Za.$$.fragment,e),b(en.$$.fragment,e),b(sn.$$.fragment,e),b(tn.$$.fragment,e),b(an.$$.fragment,e),b(ba.$$.fragment,e),b(nn.$$.fragment,e),b(ka.$$.fragment,e),b(ln.$$.fragment,e),b(on.$$.fragment,e),b(rn.$$.fragment,e),b(un.$$.fragment,e),b(pn.$$.fragment,e),b(dn.$$.fragment,e),b(_n.$$.fragment,e),b(fn.$$.fragment,e),b(hn.$$.fragment,e),b(vn.$$.fragment,e),b(gn.$$.fragment,e),b(bn.$$.fragment,e),b(kn.$$.fragment,e),b(qn.$$.fragment,e),b(wn.$$.fragment,e),b(En.$$.fragment,e),b(xn.$$.fragment,e),b(xa.$$.fragment,e),b(bt),b(jn.$$.fragment,e),b(yn.$$.fragment,e),b(ja.$$.fragment,e),b(zn.$$.fragment,e),b(Mn.$$.fragment,e),b(Cn.$$.fragment,e),b(Pn.$$.fragment,e),b(qt),b(Dn.$$.fragment,e),b(An.$$.fragment,e),b(wt),b(Sn.$$.fragment,e),b(xt),b(yt),b(Tn.$$.fragment,e),b(Ie),b(Ma.$$.fragment,e),b(Ue),b(Nn.$$.fragment,e),b(On.$$.fragment,e),b(Ln.$$.fragment,e),b(Kn.$$.fragment,e),b(Rn.$$.fragment,e),b(Pa.$$.fragment,e),Lu=!1},d(e){t(i),e&&t(h),j(d,e),e&&t($),e&&t(A),j(P),e&&t(U),Bn[z].d(e),e&&t(I),e&&t(L),e&&t(de),e&&t(V),e&&t(Xe),e&&t(X),e&&t(He),e&&t(B),e&&t(le),e&&t(Pe),e&&t(ks),e&&t(he),e&&t(Je),e&&t(oe),e&&t(qs),e&&t(_s),e&&t(rt),j(fs,e),e&&t(Gs),j(Ls,e),e&&t(it),e&&t(Ks),j(Vs),e&&t(ta),e&&t(Es),e&&t(vs),e&&t(pt),e&&t(la),e&&t(we),e&&t(Yt),Fn[xs].d(e),e&&t(_t),e&&t(ft),e&&t(Fa),j(Ye,e),e&&t(Ha),e&&t(ve),e&&t(Zr),j(Ia,e),e&&t(ei),e&&t(ca),e&&t(si),Hn[ht].d(e),e&&t(_l),j(Ua,e),e&&t(ti),e&&t(fl),e&&t(ai),e&&t(Qt),j(Ga),e&&t(ni),e&&t(ts),e&&t(li),j(Wa,e),e&&t(oi),j(Ja,e),e&&t(ri),e&&t(as),e&&t(ii),j(Ya,e),e&&t(ui),j(Qa,e),e&&t(pi),e&&t(Tt),e&&t(di),j(fa,e),e&&t(mi),e&&t(ha),e&&t(ci),e&&t(Xt),j(Xa),e&&t(_i),j(Za,e),e&&t(fi),e&&t(ga),e&&t(hi),e&&t(Ae),e&&t(vi),j(en,e),e&&t(gi),j(sn,e),e&&t(bi),e&&t(Zs),e&&t(ki),e&&t(et),e&&t(qi),j(tn,e),e&&t($i),j(an,e),e&&t(wi),e&&t(st),e&&t(Ei),j(ba,e),e&&t(xi),e&&t(gl),e&&t(ji),j(nn,e),e&&t(yi),j(ka,e),e&&t(zi),e&&t(qa),e&&t(Mi),j(ln,e),e&&t(Ci),j(on,e),e&&t(Pi),e&&t(bl),e&&t(Di),j(rn,e),e&&t(Ai),j(un,e),e&&t(Si),e&&t(Ms),e&&t(Ti),j(pn,e),e&&t(Ni),j(dn,e),e&&t(Oi),e&&t($a),e&&t(Li),e&&t(wa),e&&t(Ki),e&&t(kl),e&&t(Ri),j(_n,e),e&&t(Bi),e&&t(ns),e&&t(Fi),e&&t(Nt),e&&t(Hi),j(fn,e),e&&t(Ii),j(hn,e),e&&t(Ui),e&&t(Se),e&&t(Gi),j(vn,e),e&&t(Vi),j(gn,e),e&&t(Wi),e&&t(ql),e&&t(Ji),j(bn,e),e&&t(Yi),j(kn,e),e&&t(Qi),e&&t(Cs),e&&t(Xi),e&&t(Zt),j(qn),e&&t(Zi),e&&t(ce),e&&t(eu),j(wn,e),e&&t(su),e&&t(tt),e&&t(tu),j(En,e),e&&t(au),j(xn,e),e&&t(nu),e&&t(Ps),e&&t(lu),j(xa,e),e&&t(ou),gs&&gs.d(e),e&&t(wl),e&&t(Ds),e&&t(ru),In[gt].d(e),e&&t(El),e&&t(xl),e&&t(iu),j(jn,e),e&&t(uu),j(yn,e),e&&t(pu),j(ja,e),e&&t(du),e&&t(As),e&&t(mu),j(zn,e),e&&t(cu),j(Mn,e),e&&t(_u),e&&t(Ss),e&&t(fu),j(Cn,e),e&&t(hu),e&&t(ya),e&&t(vu),j(Pn,e),e&&t(gu),e&&t(yl),e&&t(bu),Un[kt].d(e),e&&t(zl),e&&t(ea),j(Dn),e&&t(ku),j(An,e),e&&t(qu),e&&t(Ml),e&&t($u),Gn[$t].d(e),e&&t(Cl),j(Sn,e),e&&t(wu),e&&t(Pl),e&&t(Eu),Vn[Et].d(e),e&&t(Dl),e&&t(Al),e&&t(xu),Wn[jt].d(e),e&&t(Sl),j(Tn,e),e&&t(ju),e&&t(Tl),e&&t(yu),Ie&&Ie.d(e),e&&t(Nl),j(Ma,e),e&&t(zu),Ue&&Ue.d(e),e&&t(Ol),e&&t(sa),j(Nn),e&&t(Mu),e&&t(Qe),e&&t(Cu),j(On,e),e&&t(Pu),e&&t(Kl),e&&t(Du),j(Ln,e),e&&t(Au),j(Kn,e),e&&t(Su),e&&t(Rl),e&&t(Tu),j(Rn,e),e&&t(Nu),e&&t(Ot),e&&t(Ou),j(Pa,e)}}}const Eg={local:"ifinetuneri-un-modle-de-langage-masqu",sections:[{local:"choix-dun-modle-prentran-pour-la-modlisation-du-langage-masqu",title:"Choix d'un mod\xE8le pr\xE9-entra\xEEn\xE9 pour la mod\xE9lisation du langage masqu\xE9"},{local:"le-jeu-de-donnes",title:"Le jeu de donn\xE9es"},{local:"prtraitement-des-donnes",title:"Pr\xE9traitement des donn\xE9es"},{local:"ifinetuningi-de-distilbert-avec-lapi-trainer",sections:[{local:"perplexit-pour-les-modles-de-langage",title:"Perplexit\xE9 pour les mod\xE8les de langage"}],title:"<i>Finetuning</i> de DistilBERT avec l'API `Trainer`"},{local:"ifinetuningi-de-distilbert-avec-iacceleratei",sections:[{local:"utilisation-de-notre-modle-ifinetuni",title:"Utilisation de notre mod\xE8le <i>finetun\xE9</i>"}],title:"<i>Finetuning</i> de DistilBERT avec \u{1F917} <i>Accelerate</i>"}],title:"<i>Finetuner</i> un mod\xE8le de langage masqu\xE9"};function xg(H,i,h){let d="pt";return Qv(()=>{const $=new URLSearchParams(window.location.search);h(0,d=$.get("fw")||"pt")}),[d]}class Ag extends Vv{constructor(i){super();Wv(this,i,xg,wg,Jv,{})}}export{Ag as default,Eg as metadata};
