import{s as Mn,f as an,o as nn,n as Yl}from"../chunks/scheduler.37c15a92.js";import{S as Jn,i as Un,g as d,s as n,r,A as pn,h as m,f as e,c as J,j as NM,u as T,x as C,k as hl,y as yn,a as t,v as c,t as i,b as Vl,d as p,w as o,p as _l}from"../chunks/index.2bf4358c.js";import{T as vl}from"../chunks/Tip.363c041f.js";import{Y as ZM}from"../chunks/Youtube.1e50a667.js";import{C as h}from"../chunks/CodeBlock.4e987730.js";import{C as tn}from"../chunks/CourseFloatingBanner.9ff4c771.js";import{F as wn}from"../chunks/FrameworkSwitchCourse.8d4d4ab6.js";import{H as Fl,E as rn}from"../chunks/getInferenceSnippets.24b50994.js";function Tn(I){let M,w;return M=new tn({props:{chapter:7,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter7/section3_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section3_tf.ipynb"}]}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function cn(I){let M,w;return M=new tn({props:{chapter:7,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter7/section3_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section3_pt.ipynb"}]}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function on(I){let M,w='🙋 Если термины “маскированное моделирование языка (masked language modeling)” и “предварительно обученная модель (pretrained model)” кажутся вам незнакомыми, загляните в <a href="../chapter1/1">Главу 1</a>, где мы объясняем все эти основные понятия, сопровождая их видеороликами!';return{c(){M=d("p"),M.innerHTML=w},l(a){M=m(a,"P",{"data-svelte-h":!0}),C(M)!=="svelte-1s77cuc"&&(M.innerHTML=w)},m(a,y){t(a,M,y)},p:Yl,d(a){a&&e(M)}}}function dn(I){let M,w="Давайте загрузим DistilBERT, используя класс <code>AutoModelForMaskedLM</code>:",a,y,_,j,B="Мы можем узнать, сколько параметров имеет эта модель, вызвав метод <code>summary()</code>:",Z,V,k,g,G;return y=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRGQXV0b01vZGVsRm9yTWFza2VkTE0lMEElMEFtb2RlbF9jaGVja3BvaW50JTIwJTNEJTIwJTIyZGlzdGlsYmVydC1iYXNlLXVuY2FzZWQlMjIlMEFtb2RlbCUyMCUzRCUyMFRGQXV0b01vZGVsRm9yTWFza2VkTE0uZnJvbV9wcmV0cmFpbmVkKG1vZGVsX2NoZWNrcG9pbnQp",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)`,wrap:!1}}),V=new h({props:{code:"bW9kZWwuc3VtbWFyeSgp",highlighted:"model.summary()",wrap:!1}}),g=new h({props:{code:"TW9kZWwlM0ElMjAlMjJ0Zl9kaXN0aWxfYmVydF9mb3JfbWFza2VkX2xtJTIyJTBBX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18lMEFMYXllciUyMCh0eXBlKSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyME91dHB1dCUyMFNoYXBlJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUGFyYW0lMjAlMjMlMjAlMjAlMjAlMEElM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlMEFkaXN0aWxiZXJ0JTIwKFRGRGlzdGlsQmVydE1haW4lMjBtdWx0aXBsZSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDY2MzYyODgwJTIwJTIwJTBBX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18lMEF2b2NhYl90cmFuc2Zvcm0lMjAoRGVuc2UpJTIwJTIwJTIwJTIwJTIwJTIwbXVsdGlwbGUlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA1OTA1OTIlMjAlMjAlMjAlMjAlMEFfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyUwQXZvY2FiX2xheWVyX25vcm0lMjAoTGF5ZXJOb3JtYSUyMG11bHRpcGxlJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMTUzNiUyMCUyMCUyMCUyMCUyMCUyMCUwQV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fJTBBdm9jYWJfcHJvamVjdG9yJTIwKFRGRGlzdGlsQmVyJTIwbXVsdGlwbGUlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAyMzg2NjE3MCUyMCUyMCUwQSUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUwQVRvdGFsJTIwcGFyYW1zJTNBJTIwNjYlMkM5ODUlMkM1MzAlMEFUcmFpbmFibGUlMjBwYXJhbXMlM0ElMjA2NiUyQzk4NSUyQzUzMCUwQU5vbi10cmFpbmFibGUlMjBwYXJhbXMlM0ElMjAwJTBBX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18=",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>
_________________________________________________________________`,wrap:!1}}),{c(){M=d("p"),M.innerHTML=w,a=n(),r(y.$$.fragment),_=n(),j=d("p"),j.innerHTML=B,Z=n(),r(V.$$.fragment),k=n(),r(g.$$.fragment)},l(u){M=m(u,"P",{"data-svelte-h":!0}),C(M)!=="svelte-jyixx5"&&(M.innerHTML=w),a=J(u),T(y.$$.fragment,u),_=J(u),j=m(u,"P",{"data-svelte-h":!0}),C(j)!=="svelte-7764nf"&&(j.innerHTML=B),Z=J(u),T(V.$$.fragment,u),k=J(u),T(g.$$.fragment,u)},m(u,Q){t(u,M,Q),t(u,a,Q),c(y,u,Q),t(u,_,Q),t(u,j,Q),t(u,Z,Q),c(V,u,Q),t(u,k,Q),c(g,u,Q),G=!0},i(u){G||(p(y.$$.fragment,u),p(V.$$.fragment,u),p(g.$$.fragment,u),G=!0)},o(u){i(y.$$.fragment,u),i(V.$$.fragment,u),i(g.$$.fragment,u),G=!1},d(u){u&&(e(M),e(a),e(_),e(j),e(Z),e(k)),o(y,u),o(V,u),o(g,u)}}}function mn(I){let M,w="Давайте перейдем к загрузке DistilBERT с помощью класса <code>AutoModelForMaskedLM</code>:",a,y,_,j,B="Мы можем узнать, сколько параметров имеет эта модель, вызвав метод <code>num_parameters()</code>:",Z,V,k,g,G;return y=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Nb2RlbEZvck1hc2tlZExNJTBBJTBBbW9kZWxfY2hlY2twb2ludCUyMCUzRCUyMCUyMmRpc3RpbGJlcnQtYmFzZS11bmNhc2VkJTIyJTBBbW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JNYXNrZWRMTS5mcm9tX3ByZXRyYWluZWQobW9kZWxfY2hlY2twb2ludCk=",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)`,wrap:!1}}),V=new h({props:{code:"ZGlzdGlsYmVydF9udW1fcGFyYW1ldGVycyUyMCUzRCUyMG1vZGVsLm51bV9wYXJhbWV0ZXJzKCklMjAlMkYlMjAxXzAwMF8wMDAlMEFwcmludChmJTIyJyUzRSUzRSUzRSUyMERpc3RpbEJFUlQlMjBudW1iZXIlMjBvZiUyMHBhcmFtZXRlcnMlM0ElMjAlN0Jyb3VuZChkaXN0aWxiZXJ0X251bV9wYXJhbWV0ZXJzKSU3RE0nJTIyKSUwQXByaW50KGYlMjInJTNFJTNFJTNFJTIwQkVSVCUyMG51bWJlciUyMG9mJTIwcGFyYW1ldGVycyUzQSUyMDExME0nJTIyKQ==",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 number of parameters: <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 number of parameters: 110M&#x27;&quot;</span>)`,wrap:!1}}),g=new h({props:{code:"JyUzRSUzRSUzRSUyMERpc3RpbEJFUlQlMjBudW1iZXIlMjBvZiUyMHBhcmFtZXRlcnMlM0ElMjA2N00nJTBBJyUzRSUzRSUzRSUyMEJFUlQlMjBudW1iZXIlMjBvZiUyMHBhcmFtZXRlcnMlM0ElMjAxMTBNJw==",highlighted:`<span class="hljs-string">&#x27;&gt;&gt;&gt; DistilBERT number of parameters: 67M&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; BERT number of parameters: 110M&#x27;</span>`,wrap:!1}}),{c(){M=d("p"),M.innerHTML=w,a=n(),r(y.$$.fragment),_=n(),j=d("p"),j.innerHTML=B,Z=n(),r(V.$$.fragment),k=n(),r(g.$$.fragment)},l(u){M=m(u,"P",{"data-svelte-h":!0}),C(M)!=="svelte-1hihosi"&&(M.innerHTML=w),a=J(u),T(y.$$.fragment,u),_=J(u),j=m(u,"P",{"data-svelte-h":!0}),C(j)!=="svelte-rpw3q8"&&(j.innerHTML=B),Z=J(u),T(V.$$.fragment,u),k=J(u),T(g.$$.fragment,u)},m(u,Q){t(u,M,Q),t(u,a,Q),c(y,u,Q),t(u,_,Q),t(u,j,Q),t(u,Z,Q),c(V,u,Q),t(u,k,Q),c(g,u,Q),G=!0},i(u){G||(p(y.$$.fragment,u),p(V.$$.fragment,u),p(g.$$.fragment,u),G=!0)},o(u){i(y.$$.fragment,u),i(V.$$.fragment,u),i(g.$$.fragment,u),G=!1},d(u){u&&(e(M),e(a),e(_),e(j),e(Z),e(k)),o(y,u),o(V,u),o(g,u)}}}function jn(I){let M,w;return M=new h({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBaW1wb3J0JTIwdGVuc29yZmxvdyUyMGFzJTIwdGYlMEElMEFpbnB1dHMlMjAlM0QlMjB0b2tlbml6ZXIodGV4dCUyQyUyMHJldHVybl90ZW5zb3JzJTNEJTIybnAlMjIpJTBBdG9rZW5fbG9naXRzJTIwJTNEJTIwbW9kZWwoKippbnB1dHMpLmxvZ2l0cyUwQSUyMyUyMCVEMCU5RSVEMCVCRiVEMSU4MCVEMCVCNSVEMCVCNCVEMCVCNSVEMCVCQiVEMCVCNSVEMCVCRCVEMCVCOCVEMCVCQyUyMCVEMCVCQyVEMCVCNSVEMSU4MSVEMSU4MiVEMCVCRSVEMCVCRiVEMCVCRSVEMCVCQiVEMCVCRSVEMCVCNiVEMCVCNSVEMCVCRCVEMCVCOCVEMSU4RiUyMCU1Qk1BU0slNUQlMjAlRDAlQjglMjAlRDAlQjglRDAlQjclRDAlQjIlRDAlQkIlRDAlQjUlRDElODclRDAlQjUlRDAlQkMlMjAlRDAlQjUlRDAlQjMlRDAlQkUlMjAlRDAlQkIlRDAlQkUlRDAlQjMlRDAlQjglRDElODIlRDElOEIlMEFtYXNrX3Rva2VuX2luZGV4JTIwJTNEJTIwbnAuYXJnd2hlcmUoaW5wdXRzJTVCJTIyaW5wdXRfaWRzJTIyJTVEJTIwJTNEJTNEJTIwdG9rZW5pemVyLm1hc2tfdG9rZW5faWQpJTVCMCUyQyUyMDElNUQlMEFtYXNrX3Rva2VuX2xvZ2l0cyUyMCUzRCUyMHRva2VuX2xvZ2l0cyU1QjAlMkMlMjBtYXNrX3Rva2VuX2luZGV4JTJDJTIwJTNBJTVEJTBBJTIzJTIwJUQwJTkyJUQxJThCJUQwJUIxJUQwJUI1JUQxJTgwJUQwJUI1JUQwJUJDJTIwJUQwJUJBJUQwJUIwJUQwJUJEJUQwJUI0JUQwJUI4JUQwJUI0JUQwJUIwJUQxJTgyJUQwJUJFJUQwJUIyJTIwJTVCTUFTSyU1RCUyMCVEMSU4MSUyMCVEMCVCRCVEMCVCMCVEMCVCOCVEMCVCMSVEMCVCRSVEMCVCQiVEMSU4QyVEMSU4OCVEMCVCOCVEMCVCQyVEMCVCOCUyMCVEMCVCQiVEMCVCRSVEMCVCMyVEMCVCOCVEMSU4MiVEMCVCMCVEMCVCQyVEMCVCOCUwQSUyMyUyMCVEMCU5QyVEMSU4QiUyMCVEMCVCMiVEMSU4QiVEMCVCRiVEMCVCRSVEMCVCQiVEMCVCRCVEMSU4RiVEMCVCNSVEMCVCQyUyMCVEMCVCRSVEMSU4MiVEMSU4MCVEMCVCOCVEMSU4NiVEMCVCMCVEMCVCRCVEMCVCOCVEMCVCNSUyMCVEMCVCQyVEMCVCMCVEMSU4MSVEMSU4MSVEMCVCOCVEMCVCMiVEMCVCMCUyMCVEMCVCRiVEMCVCNSVEMSU4MCVEMCVCNSVEMCVCNCUyMGFyZ3NvcnQlMkMlMjAlRDElODclRDElODIlRDAlQkUlRDAlQjElRDElOEIlMjAlRDAlQkYlRDAlQkUlRDAlQkIlRDElODMlRDElODclRDAlQjglRDElODIlRDElOEMlMjAlRDElODElRDAlQjAlRDAlQkMlRDElOEIlRDAlQjUlMjAlRDAlQjElRDAlQkUlRDAlQkIlRDElOEMlRDElODglRDAlQjglRDAlQjUlMkMlMjAlRDAlQjAlMjAlRDAlQkQlRDAlQjUlMjAlRDElODElRDAlQjAlRDAlQkMlRDElOEIlRDAlQjUlMjAlRDAlQkMlRDAlQjAlRDAlQkIlRDAlQjUlRDAlQkQlRDElOEMlRDAlQkElRDAlQjglRDAlQjUlMjAlRDAlQkIlRDAlQkUlRDAlQjMlRDAlQjglRDElODIlRDElOEIlMEF0b3BfNV90b2tlbnMlMjAlM0QlMjBucC5hcmdzb3J0KC1tYXNrX3Rva2VuX2xvZ2l0cyklNUIlM0E1JTVELnRvbGlzdCgpJTBBJTBBZm9yJTIwdG9rZW4lMjBpbiUyMHRvcF81X3Rva2VucyUzQSUwQSUyMCUyMCUyMCUyMHByaW50KGYlMjIlM0UlM0UlM0UlMjAlN0J0ZXh0LnJlcGxhY2UodG9rZW5pemVyLm1hc2tfdG9rZW4lMkMlMjB0b2tlbml6ZXIuZGVjb2RlKCU1QnRva2VuJTVEKSklN0QlMjIp",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"># Определеним местоположения [MASK] и извлечем его логиты</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"># Выберем кандидатов [MASK] с наибольшими логитами</span>
<span class="hljs-comment"># Мы выполняем отрицание массива перед argsort, чтобы получить самые большие, а не самые маленькие логиты</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>)`,wrap:!1}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function Cn(I){let M,w;return M=new h({props:{code:"aW1wb3J0JTIwdG9yY2glMEElMEFpbnB1dHMlMjAlM0QlMjB0b2tlbml6ZXIodGV4dCUyQyUyMHJldHVybl90ZW5zb3JzJTNEJTIycHQlMjIpJTBBdG9rZW5fbG9naXRzJTIwJTNEJTIwbW9kZWwoKippbnB1dHMpLmxvZ2l0cyUwQSUyMyUyMCVEMCU5RSVEMCVCRiVEMSU4MCVEMCVCNSVEMCVCNCVEMCVCNSVEMCVCQiVEMCVCNSVEMCVCRCVEMCVCOCVEMCVCQyUyMCVEMCVCQyVEMCVCNSVEMSU4MSVEMSU4MiVEMCVCRSVEMCVCRiVEMCVCRSVEMCVCQiVEMCVCRSVEMCVCNiVEMCVCNSVEMCVCRCVEMCVCOCVEMSU4RiUyMCU1Qk1BU0slNUQlMjAlRDAlQjglMjAlRDAlQjglRDAlQjclRDAlQjIlRDAlQkIlRDAlQjUlRDElODclRDAlQjUlRDAlQkMlMjAlRDAlQjUlRDAlQjMlRDAlQkUlMjAlRDAlQkIlRDAlQkUlRDAlQjMlRDAlQjglRDElODIlRDElOEIlMEFtYXNrX3Rva2VuX2luZGV4JTIwJTNEJTIwdG9yY2gud2hlcmUoaW5wdXRzJTVCJTIyaW5wdXRfaWRzJTIyJTVEJTIwJTNEJTNEJTIwdG9rZW5pemVyLm1hc2tfdG9rZW5faWQpJTVCMSU1RCUwQW1hc2tfdG9rZW5fbG9naXRzJTIwJTNEJTIwdG9rZW5fbG9naXRzJTVCMCUyQyUyMG1hc2tfdG9rZW5faW5kZXglMkMlMjAlM0ElNUQlMEElMjMlMjAlRDAlOTIlRDElOEIlRDAlQjElRDAlQjUlRDElODAlRDAlQjUlRDAlQkMlMjAlRDAlQkElRDAlQjAlRDAlQkQlRDAlQjQlRDAlQjglRDAlQjQlRDAlQjAlRDElODIlRDAlQkUlRDAlQjIlMjAlNUJNQVNLJTVEJTIwJUQxJTgxJTIwJUQwJUJEJUQwJUIwJUQwJUI4JUQwJUIxJUQwJUJFJUQwJUJCJUQxJThDJUQxJTg4JUQwJUI4JUQwJUJDJUQwJUI4JTIwJUQwJUJCJUQwJUJFJUQwJUIzJUQwJUI4JUQxJTgyJUQwJUIwJUQwJUJDJUQwJUI4JTBBdG9wXzVfdG9rZW5zJTIwJTNEJTIwdG9yY2gudG9wayhtYXNrX3Rva2VuX2xvZ2l0cyUyQyUyMDUlMkMlMjBkaW0lM0QxKS5pbmRpY2VzJTVCMCU1RC50b2xpc3QoKSUwQSUwQWZvciUyMHRva2VuJTIwaW4lMjB0b3BfNV90b2tlbnMlM0ElMEElMjAlMjAlMjAlMjBwcmludChmJTIyJyUzRSUzRSUzRSUyMCU3QnRleHQucmVwbGFjZSh0b2tlbml6ZXIubWFza190b2tlbiUyQyUyMHRva2VuaXplci5kZWNvZGUoJTVCdG9rZW4lNUQpKSU3RCclMjIp",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"># Определеним местоположения [MASK] и извлечем его логиты</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"># Выберем кандидатов [MASK] с наибольшими логитами</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>)`,wrap:!1}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function un(I){let M,w="✏️ <strong>Попробуйте!</strong> Создайте случайную выборку из части <code>unsupervised</code> и проверьте, что метки не являются ни <code>0</code>, ни <code>1</code>. В процессе работы вы также можете проверить, что метки в частях <code>train</code> и <code>test</code> действительно равны <code>0</code> или <code>1</code> - это полезная проверка здравомыслия, которую каждый практикующий NLP должен выполнять в начале нового проекта!";return{c(){M=d("p"),M.innerHTML=w},l(a){M=m(a,"P",{"data-svelte-h":!0}),C(M)!=="svelte-6nqyqs"&&(M.innerHTML=w)},m(a,y){t(a,M,y)},p:Yl,d(a){a&&e(M)}}}function hn(I){let M,w='✏️ <strong>Попробуйте!</strong> Некоторые модели трансформеров, например <a href="https://huggingface.co/google/bigbird-roberta-base" rel="nofollow">BigBird</a> и <a href="hf.co/allenai/longformer-base-4096">Longformer</a>, имеют гораздо большую длину контекста, чем BERT и другие ранние модели трансформеров. Инстанцируйте токенизатор для одной из этих контрольных точек и проверьте, что <code>model_max_length</code> согласуется с тем, что указано в описании модели.';return{c(){M=d("p"),M.innerHTML=w},l(a){M=m(a,"P",{"data-svelte-h":!0}),C(M)!=="svelte-1czdppo"&&(M.innerHTML=w)},m(a,y){t(a,M,y)},p:Yl,d(a){a&&e(M)}}}function bn(I){let M,w="Обратите внимание, что использование небольшого размера фрагмента может быть вредным в реальных сценариях, поэтому следует использовать размер, соответствующий сценарию использования, к которому вы будете применять вашу модель.";return{c(){M=d("p"),M.textContent=w},l(a){M=m(a,"P",{"data-svelte-h":!0}),C(M)!=="svelte-wc81wg"&&(M.textContent=w)},m(a,y){t(a,M,y)},p:Yl,d(a){a&&e(M)}}}function In(I){let M,w="✏️ <strong>Попробуйте!</strong> Запустите приведенный выше фрагмент кода несколько раз, чтобы увидеть, как случайное маскирование происходит на ваших глазах! Также замените метод <code>tokenizer.decode()</code> на <code>tokenizer.convert_ids_to_tokens()</code>, чтобы увидеть, что иногда маскируется один токен из данного слова, а не все остальные.";return{c(){M=d("p"),M.innerHTML=w},l(a){M=m(a,"P",{"data-svelte-h":!0}),C(M)!=="svelte-10edhjm"&&(M.innerHTML=w)},m(a,y){t(a,M,y)},p:Yl,d(a){a&&e(M)}}}function ln(I){let M,w="Одним из побочных эффектов случайного маскирования является то, что наши метрики оценки не будут детерминированными при использовании <code>Trainer</code>, поскольку мы используем один и тот же коллатор данных для обучающего и тестового наборов. Позже, когда мы рассмотрим дообучение с помощью 🤗 Accelerate, мы увидим, как можно использовать гибкость пользовательского цикла оценки, чтобы заморозить случайность.";return{c(){M=d("p"),M.innerHTML=w},l(a){M=m(a,"P",{"data-svelte-h":!0}),C(M)!=="svelte-w4nd80"&&(M.innerHTML=w)},m(a,y){t(a,M,y)},d(a){a&&e(M)}}}function fn(I){let M,w;return M=new h({props:{code:"aW1wb3J0JTIwY29sbGVjdGlvbnMlMEFpbXBvcnQlMjBudW1weSUyMGFzJTIwbnAlMEElMEFmcm9tJTIwdHJhbnNmb3JtZXJzLmRhdGEuZGF0YV9jb2xsYXRvciUyMGltcG9ydCUyMHRmX2RlZmF1bHRfZGF0YV9jb2xsYXRvciUwQSUwQXd3bV9wcm9iYWJpbGl0eSUyMCUzRCUyMDAuMiUwQSUwQSUwQWRlZiUyMHdob2xlX3dvcmRfbWFza2luZ19kYXRhX2NvbGxhdG9yKGZlYXR1cmVzKSUzQSUwQSUyMCUyMCUyMCUyMGZvciUyMGZlYXR1cmUlMjBpbiUyMGZlYXR1cmVzJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd29yZF9pZHMlMjAlM0QlMjBmZWF0dXJlLnBvcCglMjJ3b3JkX2lkcyUyMiklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAlRDAlQTElRDAlQkUlRDAlQjclRDAlQjQlRDAlQjAlRDAlQjUlRDAlQkMlMjAlRDAlQkUlRDElODIlRDAlQkUlRDAlQjElRDElODAlRDAlQjAlRDAlQjYlRDAlQjUlRDAlQkQlRDAlQjglRDAlQjUlMjAlRDAlQkMlRDAlQjUlRDAlQjYlRDAlQjQlRDElODMlMjAlRDElODElRDAlQkIlRDAlQkUlRDAlQjIlRDAlQjAlRDAlQkMlRDAlQjglMjAlRDAlQjglMjAlRDElODElRDAlQkUlRDAlQkUlRDElODIlRDAlQjIlRDAlQjUlRDElODIlRDElODElRDElODIlRDAlQjIlRDElODMlRDElOEUlRDElODklRDAlQjglRDAlQkMlRDAlQjglMjAlRDAlQjglRDAlQkQlRDAlQjQlRDAlQjUlRDAlQkElRDElODElRDAlQjAlRDAlQkMlRDAlQjglMjAlRDElODIlRDAlQkUlRDAlQkElRDAlQjUlRDAlQkQlRDAlQkUlRDAlQjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtYXBwaW5nJTIwJTNEJTIwY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGlzdCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjdXJyZW50X3dvcmRfaW5kZXglMjAlM0QlMjAtMSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGN1cnJlbnRfd29yZCUyMCUzRCUyME5vbmUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBpZHglMkMlMjB3b3JkX2lkJTIwaW4lMjBlbnVtZXJhdGUod29yZF9pZHMpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjB3b3JkX2lkJTIwaXMlMjBub3QlMjBOb25lJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjB3b3JkX2lkJTIwISUzRCUyMGN1cnJlbnRfd29yZCUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGN1cnJlbnRfd29yZCUyMCUzRCUyMHdvcmRfaWQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjdXJyZW50X3dvcmRfaW5kZXglMjAlMkIlM0QlMjAxJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFwcGluZyU1QmN1cnJlbnRfd29yZF9pbmRleCU1RC5hcHBlbmQoaWR4KSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMCVEMCVBMSVEMCVCQiVEMSU4MyVEMSU4NyVEMCVCMCVEMCVCOSVEMCVCRCVEMCVCRSUyMCVEMCVCQyVEMCVCMCVEMSU4MSVEMCVCQSVEMCVCOCVEMSU4MCVEMSU4MyVEMCVCNSVEMCVCQyUyMCVEMSU4MSVEMCVCQiVEMCVCRSVEMCVCMiVEMCVCMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG1hc2slMjAlM0QlMjBucC5yYW5kb20uYmlub21pYWwoMSUyQyUyMHd3bV9wcm9iYWJpbGl0eSUyQyUyMChsZW4obWFwcGluZyklMkMpKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlucHV0X2lkcyUyMCUzRCUyMGZlYXR1cmUlNUIlMjJpbnB1dF9pZHMlMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsYWJlbHMlMjAlM0QlMjBmZWF0dXJlJTVCJTIybGFiZWxzJTIyJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbmV3X2xhYmVscyUyMCUzRCUyMCU1Qi0xMDAlNUQlMjAqJTIwbGVuKGxhYmVscyklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjB3b3JkX2lkJTIwaW4lMjBucC53aGVyZShtYXNrKSU1QjAlNUQlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3b3JkX2lkJTIwJTNEJTIwd29yZF9pZC5pdGVtKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBpZHglMjBpbiUyMG1hcHBpbmclNUJ3b3JkX2lkJTVEJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbmV3X2xhYmVscyU1QmlkeCU1RCUyMCUzRCUyMGxhYmVscyU1QmlkeCU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlucHV0X2lkcyU1QmlkeCU1RCUyMCUzRCUyMHRva2VuaXplci5tYXNrX3Rva2VuX2lkJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZmVhdHVyZSU1QiUyMmxhYmVscyUyMiU1RCUyMCUzRCUyMG5ld19sYWJlbHMlMEElMEElMjAlMjAlMjAlMjByZXR1cm4lMjB0Zl9kZWZhdWx0X2RhdGFfY29sbGF0b3IoZmVhdHVyZXMp",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"># Создаем отображение между словами и соответствующими индексами токенов</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"># Случайно маскируем слова</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)`,wrap:!1}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function Vn(I){let M,w;return M=new h({props:{code:"aW1wb3J0JTIwY29sbGVjdGlvbnMlMEFpbXBvcnQlMjBudW1weSUyMGFzJTIwbnAlMEElMEFmcm9tJTIwdHJhbnNmb3JtZXJzJTIwaW1wb3J0JTIwZGVmYXVsdF9kYXRhX2NvbGxhdG9yJTBBJTBBd3dtX3Byb2JhYmlsaXR5JTIwJTNEJTIwMC4yJTBBJTBBJTBBZGVmJTIwd2hvbGVfd29yZF9tYXNraW5nX2RhdGFfY29sbGF0b3IoZmVhdHVyZXMpJTNBJTBBJTIwJTIwJTIwJTIwZm9yJTIwZmVhdHVyZSUyMGluJTIwZmVhdHVyZXMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3b3JkX2lkcyUyMCUzRCUyMGZlYXR1cmUucG9wKCUyMndvcmRfaWRzJTIyKSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMCVEMCVBMSVEMCVCRSVEMCVCNyVEMCVCNCVEMCVCMCVEMCVCNSVEMCVCQyUyMCVEMCVCRSVEMSU4MiVEMCVCRSVEMCVCMSVEMSU4MCVEMCVCMCVEMCVCNiVEMCVCNSVEMCVCRCVEMCVCOCVEMCVCNSUyMCVEMCVCQyVEMCVCNSVEMCVCNiVEMCVCNCVEMSU4MyUyMCVEMSU4MSVEMCVCQiVEMCVCRSVEMCVCMiVEMCVCMCVEMCVCQyVEMCVCOCUyMCVEMCVCOCUyMCVEMSU4MSVEMCVCRSVEMCVCRSVEMSU4MiVEMCVCMiVEMCVCNSVEMSU4MiVEMSU4MSVEMSU4MiVEMCVCMiVEMSU4MyVEMSU4RSVEMSU4OSVEMCVCOCVEMCVCQyVEMCVCOCUyMCVEMCVCOCVEMCVCRCVEMCVCNCVEMCVCNSVEMCVCQSVEMSU4MSVEMCVCMCVEMCVCQyVEMCVCOCUyMCVEMSU4MiVEMCVCRSVEMCVCQSVEMCVCNSVEMCVCRCVEMCVCRSVEMCVCMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG1hcHBpbmclMjAlM0QlMjBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsaXN0KSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGN1cnJlbnRfd29yZF9pbmRleCUyMCUzRCUyMC0xJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY3VycmVudF93b3JkJTIwJTNEJTIwTm9uZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMGlkeCUyQyUyMHdvcmRfaWQlMjBpbiUyMGVudW1lcmF0ZSh3b3JkX2lkcyklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHdvcmRfaWQlMjBpcyUyMG5vdCUyME5vbmUlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHdvcmRfaWQlMjAhJTNEJTIwY3VycmVudF93b3JkJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY3VycmVudF93b3JkJTIwJTNEJTIwd29yZF9pZCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGN1cnJlbnRfd29yZF9pbmRleCUyMCUyQiUzRCUyMDElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtYXBwaW5nJTVCY3VycmVudF93b3JkX2luZGV4JTVELmFwcGVuZChpZHgpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJUQwJUExJUQwJUJCJUQxJTgzJUQxJTg3JUQwJUIwJUQwJUI5JUQwJUJEJUQwJUJFJTIwJUQwJUJDJUQwJUIwJUQxJTgxJUQwJUJBJUQwJUI4JUQxJTgwJUQxJTgzJUQwJUI1JUQwJUJDJTIwJUQxJTgxJUQwJUJCJUQwJUJFJUQwJUIyJUQwJUIwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFzayUyMCUzRCUyMG5wLnJhbmRvbS5iaW5vbWlhbCgxJTJDJTIwd3dtX3Byb2JhYmlsaXR5JTJDJTIwKGxlbihtYXBwaW5nKSUyQykpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaW5wdXRfaWRzJTIwJTNEJTIwZmVhdHVyZSU1QiUyMmlucHV0X2lkcyUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMGZlYXR1cmUlNUIlMjJsYWJlbHMlMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBuZXdfbGFiZWxzJTIwJTNEJTIwJTVCLTEwMCU1RCUyMColMjBsZW4obGFiZWxzKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMHdvcmRfaWQlMjBpbiUyMG5wLndoZXJlKG1hc2spJTVCMCU1RCUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHdvcmRfaWQlMjAlM0QlMjB3b3JkX2lkLml0ZW0oKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMGlkeCUyMGluJTIwbWFwcGluZyU1QndvcmRfaWQlNUQlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBuZXdfbGFiZWxzJTVCaWR4JTVEJTIwJTNEJTIwbGFiZWxzJTVCaWR4JTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaW5wdXRfaWRzJTVCaWR4JTVEJTIwJTNEJTIwdG9rZW5pemVyLm1hc2tfdG9rZW5faWQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlJTVCJTIybGFiZWxzJTIyJTVEJTIwJTNEJTIwbmV3X2xhYmVscyUwQSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMGRlZmF1bHRfZGF0YV9jb2xsYXRvcihmZWF0dXJlcyk=",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"># Создаем отображение между словами и соответствующими индексами токенов</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"># Случайно маскируем слова</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)`,wrap:!1}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function _n(I){let M,w="✏️ <strong>Попробуйте!</strong> Запустите приведенный выше фрагмент кода несколько раз, чтобы увидеть, как случайное маскирование происходит на ваших глазах! Также замените метод <code>tokenizer.decode()</code> на <code>tokenizer.convert_ids_to_tokens()</code>, чтобы увидеть, что токены из данного слова всегда маскируются вместе.";return{c(){M=d("p"),M.innerHTML=w},l(a){M=m(a,"P",{"data-svelte-h":!0}),C(M)!=="svelte-1hxwyak"&&(M.innerHTML=w)},m(a,y){t(a,M,y)},p:Yl,d(a){a&&e(M)}}}function Qn(I){let M,w="После того как мы авторизовались, мы можем указать аргументы для <code>Trainer</code>:",a,y,_,j,B="Здесь мы изменили несколько параметров по умолчанию, включая <code>logging_steps</code>, чтобы обеспечить отслеживание потерь при обучении в каждой эпохе. Мы также использовали <code>fp16=True</code>, чтобы включить обучение со смешанной точностью, что дает нам еще большее улучшение скорости. По умолчанию <code>Trainer</code> удаляет все столбцы, которые не являются частью метода <code>forward()</code> модели. Это означает, что если вы используете коллатор для маскировки слов целиком, вам также нужно установить <code>remove_unused_columns=False</code>, чтобы не потерять колонку <code>word_ids</code> во время обучения.",Z,V,k='Обратите внимание, что с помощью аргумента <code>hub_model_id</code> можно указать имя репозитория, в который вы хотите отправить модель (в частности, этот аргумент нужно использовать, чтобы отправить модель в ырепозиторий организации). Например, когда мы отправили модель в репозиторий организации <a href="https://huggingface.co/huggingface-course" rel="nofollow"><code>huggingface-course</code></a>, мы добавили <code>hub_model_id=&quot;huggingface-course/distilbert-finetuned-imdb&quot;</code> в <code>TrainingArguments</code>. По умолчанию используемый репозиторий будет находиться в вашем пространстве имен и называться в соответствии с заданной вами выходной директорией, так что в нашем случае это будет <code>&quot;lewtun/distilbert-finetuned-imdb&quot;</code>.',g,G,u="Теперь у нас есть все компоненты для создания <code>Trainer</code>. Здесь мы просто используем стандартный <code>data_collator</code>, но вы можете попробовать коллатор для маскирования слов целиком и сравнить результаты в качестве упражнения:",Q,A,z,f,E="Теперь мы готовы запустить <code>trainer.train()</code>, но перед этим давайте вкратце рассмотрим _перплексию (perplexity), которая является общей метрикой для оценки качества языковых моделей.",Y;return y=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRyYWluaW5nQXJndW1lbnRzJTBBJTBBYmF0Y2hfc2l6ZSUyMCUzRCUyMDY0JTBBJTIzJTIwJUQwJTlGJUQwJUJFJUQwJUJBJUQwJUIwJUQwJUI3JUQxJThCJUQwJUIyJUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQwJUJGJUQwJUJFJUQxJTgyJUQwJUI1JUQxJTgwJUQwJUI4JTIwJUQwJUJGJUQxJTgwJUQwJUI4JTIwJUQwJUJFJUQwJUIxJUQxJTgzJUQxJTg3JUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI4JTIwJUQwJUI0JUQwJUJCJUQxJThGJTIwJUQwJUJBJUQwJUIwJUQwJUI2JUQwJUI0JUQwJUJFJUQwJUI5JTIwJUQxJThEJUQwJUJGJUQwJUJFJUQxJTg1JUQwJUI4JTBBbG9nZ2luZ19zdGVwcyUyMCUzRCUyMGxlbihkb3duc2FtcGxlZF9kYXRhc2V0JTVCJTIydHJhaW4lMjIlNUQpJTIwJTJGJTJGJTIwYmF0Y2hfc2l6ZSUwQW1vZGVsX25hbWUlMjAlM0QlMjBtb2RlbF9jaGVja3BvaW50LnNwbGl0KCUyMiUyRiUyMiklNUItMSU1RCUwQSUwQXRyYWluaW5nX2FyZ3MlMjAlM0QlMjBUcmFpbmluZ0FyZ3VtZW50cyglMEElMjAlMjAlMjAlMjBvdXRwdXRfZGlyJTNEZiUyMiU3Qm1vZGVsX25hbWUlN0QtZmluZXR1bmVkLWltZGIlMjIlMkMlMEElMjAlMjAlMjAlMjBvdmVyd3JpdGVfb3V0cHV0X2RpciUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjBldmFsdWF0aW9uX3N0cmF0ZWd5JTNEJTIyZXBvY2glMjIlMkMlMEElMjAlMjAlMjAlMjBsZWFybmluZ19yYXRlJTNEMmUtNSUyQyUwQSUyMCUyMCUyMCUyMHdlaWdodF9kZWNheSUzRDAuMDElMkMlMEElMjAlMjAlMjAlMjBwZXJfZGV2aWNlX3RyYWluX2JhdGNoX3NpemUlM0RiYXRjaF9zaXplJTJDJTBBJTIwJTIwJTIwJTIwcGVyX2RldmljZV9ldmFsX2JhdGNoX3NpemUlM0RiYXRjaF9zaXplJTJDJTBBJTIwJTIwJTIwJTIwcHVzaF90b19odWIlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwZnAxNiUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjBsb2dnaW5nX3N0ZXBzJTNEbG9nZ2luZ19zdGVwcyUyQyUwQSk=",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"># Показываем потери при обучении для каждой эпохи</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,
)`,wrap:!1}}),A=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRyYWluZXIlMEElMEF0cmFpbmVyJTIwJTNEJTIwVHJhaW5lciglMEElMjAlMjAlMjAlMjBtb2RlbCUzRG1vZGVsJTJDJTBBJTIwJTIwJTIwJTIwYXJncyUzRHRyYWluaW5nX2FyZ3MlMkMlMEElMjAlMjAlMjAlMjB0cmFpbl9kYXRhc2V0JTNEZG93bnNhbXBsZWRfZGF0YXNldCU1QiUyMnRyYWluJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwZXZhbF9kYXRhc2V0JTNEZG93bnNhbXBsZWRfZGF0YXNldCU1QiUyMnRlc3QlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBkYXRhX2NvbGxhdG9yJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMHRva2VuaXplciUzRHRva2VuaXplciUyQyUwQSk=",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,
)`,wrap:!1}}),{c(){M=d("p"),M.innerHTML=w,a=n(),r(y.$$.fragment),_=n(),j=d("p"),j.innerHTML=B,Z=n(),V=d("p"),V.innerHTML=k,g=n(),G=d("p"),G.innerHTML=u,Q=n(),r(A.$$.fragment),z=n(),f=d("p"),f.innerHTML=E},l(R){M=m(R,"P",{"data-svelte-h":!0}),C(M)!=="svelte-1g9hygo"&&(M.innerHTML=w),a=J(R),T(y.$$.fragment,R),_=J(R),j=m(R,"P",{"data-svelte-h":!0}),C(j)!=="svelte-p77bjo"&&(j.innerHTML=B),Z=J(R),V=m(R,"P",{"data-svelte-h":!0}),C(V)!=="svelte-e2ifwj"&&(V.innerHTML=k),g=J(R),G=m(R,"P",{"data-svelte-h":!0}),C(G)!=="svelte-1lrd89"&&(G.innerHTML=u),Q=J(R),T(A.$$.fragment,R),z=J(R),f=m(R,"P",{"data-svelte-h":!0}),C(f)!=="svelte-7b3owm"&&(f.innerHTML=E)},m(R,X){t(R,M,X),t(R,a,X),c(y,R,X),t(R,_,X),t(R,j,X),t(R,Z,X),t(R,V,X),t(R,g,X),t(R,G,X),t(R,Q,X),c(A,R,X),t(R,z,X),t(R,f,X),Y=!0},i(R){Y||(p(y.$$.fragment,R),p(A.$$.fragment,R),Y=!0)},o(R){i(y.$$.fragment,R),i(A.$$.fragment,R),Y=!1},d(R){R&&(e(M),e(a),e(_),e(j),e(Z),e(V),e(g),e(G),e(Q),e(z),e(f)),o(y,R),o(A,R)}}}function Rn(I){let M,w="После того как мы авторизовались, мы можем создавать наши датасеты <code>tf.data</code>. Для этого мы воспользуемся методом <code>prepare_tf_dataset()</code>, который использует нашу модель для автоматического инференса того, какие столбцы должны войти в датасет. Если вы хотите контролировать, какие именно столбцы будут использоваться, вы можете использовать метод <code>Dataset.to_tf_dataset()</code> вместо этого. Для простоты мы будем использовать стандартный коллатор данных, но вы также можете попробовать коллатор для маскировки слов целиком и сравнить результаты в качестве упражнения:",a,y,_,j,B="Далее мы задаем гиперпараметры обучения и компилируем нашу модель. Мы используем функцию <code>create_optimizer()</code> из библиотеки 🤗 Transformers, которая возвращает нам оптимизатор <code>AdamW</code> с линейным затуханием скорости обучения. Мы также используем встроенные потери модели, которые используются по умолчанию, если в качестве аргумента <code>compile()</code> не указаны потери, и устанавливаем точность обучения на <code>&quot;mixed_float16&quot;</code>. Обратите внимание, что если вы используете Colab GPU или другой GPU, который не имеет поддержки ускорения float16, вам, вероятно, следует закомментировать эту строку.",Z,V,k='Кроме того, мы настроили <code>PushToHubCallback</code>, который будет сохранять модель в Hub после каждой эпохи. Вы можете указать имя репозитория, в который хотите отправить модель, с помощью аргумента <code>hub_model_id</code> (в частности, этот аргумент нужно использовать, чтобы отправить модель в организацию). Например, чтобы отправить модель в организацию <a href="https://huggingface.co/huggingface-course" rel="nofollow"><code>huggingface-course</code></a>, мы добавили <code>hub_model_id=&quot;huggingface-course/distilbert-finetuned-imdb&quot;</code>. По умолчанию используемый репозиторий будет находиться в вашем пространстве имен и называться в соответствии с заданным вами выходным каталогом, так что в нашем случае это будет <code>&quot;lewtun/distilbert-finetuned-imdb&quot;</code>.',g,G,u,Q,A="Теперь мы готовы запустить <code>model.fit()</code>, но перед этим давайте вкратце рассмотрим <em>перплексию (perplexity)</em>, которая является общей метрикой для оценки качества работы языковых моделей.",z;return y=new h({props:{code:"dGZfdHJhaW5fZGF0YXNldCUyMCUzRCUyMG1vZGVsLnByZXBhcmVfdGZfZGF0YXNldCglMEElMjAlMjAlMjAlMjBkb3duc2FtcGxlZF9kYXRhc2V0JTVCJTIydHJhaW4lMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBjb2xsYXRlX2ZuJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMHNodWZmbGUlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDMyJTJDJTBBKSUwQSUwQXRmX2V2YWxfZGF0YXNldCUyMCUzRCUyMG1vZGVsLnByZXBhcmVfdGZfZGF0YXNldCglMEElMjAlMjAlMjAlMjBkb3duc2FtcGxlZF9kYXRhc2V0JTVCJTIydGVzdCUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwc2h1ZmZsZSUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDMyJTJDJTBBKQ==",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>,
)`,wrap:!1}}),G=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGNyZWF0ZV9vcHRpbWl6ZXIlMEFmcm9tJTIwdHJhbnNmb3JtZXJzLmtlcmFzX2NhbGxiYWNrcyUyMGltcG9ydCUyMFB1c2hUb0h1YkNhbGxiYWNrJTBBaW1wb3J0JTIwdGVuc29yZmxvdyUyMGFzJTIwdGYlMEElMEFudW1fdHJhaW5fc3RlcHMlMjAlM0QlMjBsZW4odGZfdHJhaW5fZGF0YXNldCklMEFvcHRpbWl6ZXIlMkMlMjBzY2hlZHVsZSUyMCUzRCUyMGNyZWF0ZV9vcHRpbWl6ZXIoJTBBJTIwJTIwJTIwJTIwaW5pdF9sciUzRDJlLTUlMkMlMEElMjAlMjAlMjAlMjBudW1fd2FybXVwX3N0ZXBzJTNEMV8wMDAlMkMlMEElMjAlMjAlMjAlMjBudW1fdHJhaW5fc3RlcHMlM0RudW1fdHJhaW5fc3RlcHMlMkMlMEElMjAlMjAlMjAlMjB3ZWlnaHRfZGVjYXlfcmF0ZSUzRDAuMDElMkMlMEEpJTBBbW9kZWwuY29tcGlsZShvcHRpbWl6ZXIlM0RvcHRpbWl6ZXIpJTBBJTBBJTIzJTIwJUQwJTlFJUQwJUIxJUQxJTgzJUQxJTg3JUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI1JTIwJUQxJTgxJUQwJUJFJTIwJUQxJTgxJUQwJUJDJUQwJUI1JUQxJTg4JUQwJUIwJUQwJUJEJUQwJUJEJUQwJUJFJUQwJUI5JTIwJUQxJTgyJUQwJUJFJUQxJTg3JUQwJUJEJUQwJUJFJUQxJTgxJUQxJTgyJUQxJThDJUQxJThFJTIwZmxvYXQxNiUwQXRmLmtlcmFzLm1peGVkX3ByZWNpc2lvbi5zZXRfZ2xvYmFsX3BvbGljeSglMjJtaXhlZF9mbG9hdDE2JTIyKSUwQSUwQW1vZGVsX25hbWUlMjAlM0QlMjBtb2RlbF9jaGVja3BvaW50LnNwbGl0KCUyMiUyRiUyMiklNUItMSU1RCUwQWNhbGxiYWNrJTIwJTNEJTIwUHVzaFRvSHViQ2FsbGJhY2soJTBBJTIwJTIwJTIwJTIwb3V0cHV0X2RpciUzRGYlMjIlN0Jtb2RlbF9uYW1lJTdELWZpbmV0dW5lZC1pbWRiJTIyJTJDJTIwdG9rZW5pemVyJTNEdG9rZW5pemVyJTBBKQ==",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"># Обучение со смешанной точностью 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
)`,wrap:!1}}),{c(){M=d("p"),M.innerHTML=w,a=n(),r(y.$$.fragment),_=n(),j=d("p"),j.innerHTML=B,Z=n(),V=d("p"),V.innerHTML=k,g=n(),r(G.$$.fragment),u=n(),Q=d("p"),Q.innerHTML=A},l(f){M=m(f,"P",{"data-svelte-h":!0}),C(M)!=="svelte-m4xczw"&&(M.innerHTML=w),a=J(f),T(y.$$.fragment,f),_=J(f),j=m(f,"P",{"data-svelte-h":!0}),C(j)!=="svelte-1y0cs2t"&&(j.innerHTML=B),Z=J(f),V=m(f,"P",{"data-svelte-h":!0}),C(V)!=="svelte-av7kt1"&&(V.innerHTML=k),g=J(f),T(G.$$.fragment,f),u=J(f),Q=m(f,"P",{"data-svelte-h":!0}),C(Q)!=="svelte-qmwnep"&&(Q.innerHTML=A)},m(f,E){t(f,M,E),t(f,a,E),c(y,f,E),t(f,_,E),t(f,j,E),t(f,Z,E),t(f,V,E),t(f,g,E),c(G,f,E),t(f,u,E),t(f,Q,E),z=!0},i(f){z||(p(y.$$.fragment,f),p(G.$$.fragment,f),z=!0)},o(f){i(y.$$.fragment,f),i(G.$$.fragment,f),z=!1},d(f){f&&(e(M),e(a),e(_),e(j),e(Z),e(V),e(g),e(u),e(Q)),o(y,f),o(G,f)}}}function Gn(I){let M,w="Если предположить, что наш тестовый набор состоит в основном из грамматически правильных предложений, то одним из способов измерения качества нашей языковой модели является подсчет вероятностей, которые она присваивает следующему слову во всех предложениях тестового набора. Высокие вероятности указывают на то, что модель не “удивлена” или не “перплексирована” не виденными ранее примерами, и предполагают, что она выучила основные грамматические закономерности языка. Существуют различные математические определения перплексии, но то, которое мы будем использовать, определяет ее как экспоненту потери перекрестной энтропии. Таким образом, мы можем вычислить перплексию нашей предварительно обученной модели, используя метод <code>model.evaluate()</code> для вычисления потери кросс-энтропии на тестовом наборе, а затем взяв экспоненту результата:",a,y,_;return y=new h({props:{code:"aW1wb3J0JTIwbWF0aCUwQSUwQWV2YWxfbG9zcyUyMCUzRCUyMG1vZGVsLmV2YWx1YXRlKHRmX2V2YWxfZGF0YXNldCklMEFwcmludChmJTIyUGVycGxleGl0eSUzQSUyMCU3Qm1hdGguZXhwKGV2YWxfbG9zcyklM0EuMmYlN0QlMjIp",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;Perplexity: <span class="hljs-subst">{math.exp(eval_loss):<span class="hljs-number">.2</span>f}</span>&quot;</span>)`,wrap:!1}}),{c(){M=d("p"),M.innerHTML=w,a=n(),r(y.$$.fragment)},l(j){M=m(j,"P",{"data-svelte-h":!0}),C(M)!=="svelte-b8jsw9"&&(M.innerHTML=w),a=J(j),T(y.$$.fragment,j)},m(j,B){t(j,M,B),t(j,a,B),c(y,j,B),_=!0},i(j){_||(p(y.$$.fragment,j),_=!0)},o(j){i(y.$$.fragment,j),_=!1},d(j){j&&(e(M),e(a)),o(y,j)}}}function gn(I){let M,w="Если предположить, что наш тестовый набор состоит в основном из грамматически правильных предложений, то одним из способов измерения качества нашей языковой модели является подсчет вероятностей, которые она присваивает следующему слову во всех предложениях тестового набора. Высокие вероятности указывают на то, что модель не “удивлена” и не “перплексирована” не виденными ранее примерами, и предполагают, что она усвоила основные грамматические закономерности языка. Существуют различные математические определения перплексии, но то, которое мы будем использовать, определяет ее как экспоненту потери перекрестной энтропии. Таким образом, мы можем вычислить перплексию нашей предварительно обученной модели, используя функцию <code>Trainer.evaluate()</code> для вычисления потерь кросс-энтропии на тестовом наборе, а затем взяв экспоненту результата:",a,y,_;return y=new h({props:{code:"aW1wb3J0JTIwbWF0aCUwQSUwQWV2YWxfcmVzdWx0cyUyMCUzRCUyMHRyYWluZXIuZXZhbHVhdGUoKSUwQXByaW50KGYlMjIlM0UlM0UlM0UlMjBQZXJwbGV4aXR5JTNBJTIwJTdCbWF0aC5leHAoZXZhbF9yZXN1bHRzJTVCJ2V2YWxfbG9zcyclNUQpJTNBLjJmJTdEJTIyKQ==",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>)`,wrap:!1}}),{c(){M=d("p"),M.innerHTML=w,a=n(),r(y.$$.fragment)},l(j){M=m(j,"P",{"data-svelte-h":!0}),C(M)!=="svelte-916l5a"&&(M.innerHTML=w),a=J(j),T(y.$$.fragment,j)},m(j,B){t(j,M,B),t(j,a,B),c(y,j,B),_=!0},i(j){_||(p(y.$$.fragment,j),_=!0)},o(j){i(y.$$.fragment,j),_=!1},d(j){j&&(e(M),e(a)),o(y,j)}}}function Bn(I){let M,w;return M=new h({props:{code:"bW9kZWwuZml0KHRmX3RyYWluX2RhdGFzZXQlMkMlMjB2YWxpZGF0aW9uX2RhdGElM0R0Zl9ldmFsX2RhdGFzZXQlMkMlMjBjYWxsYmFja3MlM0QlNUJjYWxsYmFjayU1RCk=",highlighted:"model.fit(tf_train_dataset, validation_data=tf_eval_dataset, callbacks=[callback])",wrap:!1}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function kn(I){let M,w;return M=new h({props:{code:"dHJhaW5lci50cmFpbigp",highlighted:"trainer.train()",wrap:!1}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function Zn(I){let M,w;return M=new h({props:{code:"ZXZhbF9sb3NzJTIwJTNEJTIwbW9kZWwuZXZhbHVhdGUodGZfZXZhbF9kYXRhc2V0KSUwQXByaW50KGYlMjJQZXJwbGV4aXR5JTNBJTIwJTdCbWF0aC5leHAoZXZhbF9sb3NzKSUzQS4yZiU3RCUyMik=",highlighted:`eval_loss = model.evaluate(tf_eval_dataset)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Perplexity: <span class="hljs-subst">{math.exp(eval_loss):<span class="hljs-number">.2</span>f}</span>&quot;</span>)`,wrap:!1}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function En(I){let M,w;return M=new h({props:{code:"ZXZhbF9yZXN1bHRzJTIwJTNEJTIwdHJhaW5lci5ldmFsdWF0ZSgpJTBBcHJpbnQoZiUyMiUzRSUzRSUzRSUyMFBlcnBsZXhpdHklM0ElMjAlN0JtYXRoLmV4cChldmFsX3Jlc3VsdHMlNUInZXZhbF9sb3NzJyU1RCklM0EuMmYlN0QlMjIp",highlighted:`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>)`,wrap:!1}}),{c(){r(M.$$.fragment)},l(a){T(M.$$.fragment,a)},m(a,y){c(M,a,y),w=!0},i(a){w||(p(M.$$.fragment,a),w=!0)},o(a){i(M.$$.fragment,a),w=!1},d(a){o(M,a)}}}function sn(I){let M,w="После завершения обучения мы можем отправить карточку модели с информацией об обучении в Hub (контрольные точки сохраняются во время самого обучения):",a,y,_;return y=new h({props:{code:"dHJhaW5lci5wdXNoX3RvX2h1Yigp",highlighted:"trainer.push_to_hub()",wrap:!1}}),{c(){M=d("p"),M.textContent=w,a=n(),r(y.$$.fragment)},l(j){M=m(j,"P",{"data-svelte-h":!0}),C(M)!=="svelte-1ka55v0"&&(M.textContent=w),a=J(j),T(y.$$.fragment,j)},m(j,B){t(j,M,B),t(j,a,B),c(y,j,B),_=!0},i(j){_||(p(y.$$.fragment,j),_=!0)},o(j){i(y.$$.fragment,j),_=!1},d(j){j&&(e(M),e(a)),o(y,j)}}}function Xn(I){let M,w="✏️ <strong>Попробуйте!</strong> Запустите обучение, описанное выше, после замены коллатора данных на коллатор маскирующий все слово. Получили ли вы лучшие результаты?";return{c(){M=d("p"),M.innerHTML=w},l(a){M=m(a,"P",{"data-svelte-h":!0}),C(M)!=="svelte-1fxdlt0"&&(M.innerHTML=w)},m(a,y){t(a,M,y)},p:Yl,d(a){a&&e(M)}}}function en(I){let M,w="В нашем случае нам не нужно было делать ничего особенного с циклом обучения, но в некоторых случаях вам может понадобиться реализовать некоторую пользовательскую логику. Для таких случаев вы можете использовать 🤗 Accelerate - давайте посмотрим!",a,y,_,j,B='Как мы видели на примере <code>Trainer</code>, дообучение модели маскированного языкового моделирования очень похоже на пример классификации текста из <a href="../chapter3/1">Главы 3</a>. Фактически, единственной особенностью является использование специального коллатора данных, о котором мы уже рассказывали ранее в этом разделе!',Z,V,k="Однако мы видели, что <code>DataCollatorForLanguageModeling</code> также применяет случайное маскирование при каждой оценке, поэтому мы увидим некоторые колебания в наших оценках перплексии при каждом цикле обучения. Один из способов устранить этот источник случайности - применить маскирование <em>один раз</em> ко всему тестовому набору, а затем использовать стандартный коллатор данных в 🤗 Transformers для сбора батчей во время оценки. Чтобы увидеть, как это работает, давайте реализуем простую функцию, которая применяет маскирование к батчу, подобно нашей первой работе с <code>DataCollatorForLanguageModeling</code>:",g,G,u,Q,A="Далее мы применим эту функцию к нашему тестовому набору и удалим столбцы без маскирования, чтобы заменить их столбцами с маскированием. Вы можете использовать маскирование целых слов, заменив <code>data_collator</code> выше на соответствующий, в этом случае вам следует удалить первую строку здесь:",z,f,E,Y,R="Затем мы можем настроить загрузчики данных как обычно, но для оценочного набора мы будем использовать <code>default_data_collator</code> из 🤗 Transformers:",X,bl,Ql,H,ve="Здесь мы следуем стандартным шагам 🤗 Accelerate. Первым делом загружаем свежую версию предварительно обученной модели:",Rl,$,Hl,tl,Il="Затем нужно указать оптимизатор; мы будем использовать стандартный <code>AdamW</code>:",Dl,Ml,al,nl,il="Теперь, имея эти объекты, мы можем подготовить все для обучения с помощью объекта <code>Accelerator</code>:",Gl,D,gl,L,Fe="Теперь, когда наша модель, оптимизатор и загрузчики данных настроены, мы можем задать планировщик скорости обучения следующим образом:",Bl,N,Ll,Jl,fl="Осталось сделать еще одну последнюю вещь перед обучением: создать репозиторий модели на Hugging Face Hub! Мы можем использовать библиотеку 🤗 Hub, чтобы сначала сгенерировать полное имя нашего репозитория:",ql,Ul,v,W,yl,q,Ye="затем создадим и клонируем репозиторий, используя класс <code>Repository</code> из 🤗 Hub:",kl,K,Zl,P,He="После этого остается только написать полный цикл обучения и оценки:",El,O,Xl,ll,Kl,pl,el="Круто, мы смогли оценить перплексию для каждой эпохи и обеспечить воспроизводимость нескольких циклов обучения!",F;return y=new Fl({props:{title:"Дообучение DistilBERT с помощью 🤗 Accelerate",local:"fine-tuning-distilbert-with-accelerate",headingTag:"h2"}}),G=new h({props:{code:"ZGVmJTIwaW5zZXJ0X3JhbmRvbV9tYXNrKGJhdGNoKSUzQSUwQSUyMCUyMCUyMCUyMGZlYXR1cmVzJTIwJTNEJTIwJTVCZGljdCh6aXAoYmF0Y2glMkMlMjB0KSklMjBmb3IlMjB0JTIwaW4lMjB6aXAoKmJhdGNoLnZhbHVlcygpKSU1RCUwQSUyMCUyMCUyMCUyMG1hc2tlZF9pbnB1dHMlMjAlM0QlMjBkYXRhX2NvbGxhdG9yKGZlYXR1cmVzKSUwQSUyMCUyMCUyMCUyMCUyMyUyMCVEMCVBMSVEMCVCRSVEMCVCNyVEMCVCNCVEMCVCMCVEMCVCNSVEMCVCQyUyMCVEMCVCRCVEMCVCRSVEMCVCMiVEMSU4QiVEMCVCOSUyMCUyMiVEMCVCQyVEMCVCMCVEMSU4MSVEMCVCQSVEMCVCOCVEMSU4MCVEMCVCRSVEMCVCMiVEMCVCMCVEMCVCRCVEMCVCRCVEMSU4QiVEMCVCOSUyMiUyMCVEMSU4MSVEMSU4MiVEMCVCRSVEMCVCQiVEMCVCMSVEMCVCNSVEMSU4NiUyMCVEMCVCNCVEMCVCQiVEMSU4RiUyMCVEMCVCQSVEMCVCMCVEMCVCNiVEMCVCNCVEMCVCRSVEMCVCMyVEMCVCRSUyMCVEMSU4MSVEMSU4MiVEMCVCRSVEMCVCQiVEMCVCMSVEMSU4NiVEMCVCMCUyMCVEMCVCMiUyMCVEMCVCNCVEMCVCMCVEMSU4MiVEMCVCMCVEMSU4MSVEMCVCNSVEMSU4MiVEMCVCNSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMCU3QiUyMm1hc2tlZF8lMjIlMjAlMkIlMjBrJTNBJTIwdi5udW1weSgpJTIwZm9yJTIwayUyQyUyMHYlMjBpbiUyMG1hc2tlZF9pbnB1dHMuaXRlbXMoKSU3RA==",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"># Создаем новый &quot;маскированный&quot; столбец для каждого столбца в датасете</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()}`,wrap:!1}}),f=new h({props:{code:"ZG93bnNhbXBsZWRfZGF0YXNldCUyMCUzRCUyMGRvd25zYW1wbGVkX2RhdGFzZXQucmVtb3ZlX2NvbHVtbnMoJTVCJTIyd29yZF9pZHMlMjIlNUQpJTBBZXZhbF9kYXRhc2V0JTIwJTNEJTIwZG93bnNhbXBsZWRfZGF0YXNldCU1QiUyMnRlc3QlMjIlNUQubWFwKCUwQSUyMCUyMCUyMCUyMGluc2VydF9yYW5kb21fbWFzayUyQyUwQSUyMCUyMCUyMCUyMGJhdGNoZWQlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwcmVtb3ZlX2NvbHVtbnMlM0Rkb3duc2FtcGxlZF9kYXRhc2V0JTVCJTIydGVzdCUyMiU1RC5jb2x1bW5fbmFtZXMlMkMlMEEpJTBBZXZhbF9kYXRhc2V0JTIwJTNEJTIwZXZhbF9kYXRhc2V0LnJlbmFtZV9jb2x1bW5zKCUwQSUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1hc2tlZF9pbnB1dF9pZHMlMjIlM0ElMjAlMjJpbnB1dF9pZHMlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJtYXNrZWRfYXR0ZW50aW9uX21hc2slMjIlM0ElMjAlMjJhdHRlbnRpb25fbWFzayUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1hc2tlZF9sYWJlbHMlMjIlM0ElMjAlMjJsYWJlbHMlMjIlMkMlMEElMjAlMjAlMjAlMjAlN0QlMEEp",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>,
    }
)`,wrap:!1}}),bl=new h({props:{code:"ZnJvbSUyMHRvcmNoLnV0aWxzLmRhdGElMjBpbXBvcnQlMjBEYXRhTG9hZGVyJTBBZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGRlZmF1bHRfZGF0YV9jb2xsYXRvciUwQSUwQWJhdGNoX3NpemUlMjAlM0QlMjA2NCUwQXRyYWluX2RhdGFsb2FkZXIlMjAlM0QlMjBEYXRhTG9hZGVyKCUwQSUyMCUyMCUyMCUyMGRvd25zYW1wbGVkX2RhdGFzZXQlNUIlMjJ0cmFpbiUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMHNodWZmbGUlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRGJhdGNoX3NpemUlMkMlMEElMjAlMjAlMjAlMjBjb2xsYXRlX2ZuJTNEZGF0YV9jb2xsYXRvciUyQyUwQSklMEFldmFsX2RhdGFsb2FkZXIlMjAlM0QlMjBEYXRhTG9hZGVyKCUwQSUyMCUyMCUyMCUyMGV2YWxfZGF0YXNldCUyQyUyMGJhdGNoX3NpemUlM0RiYXRjaF9zaXplJTJDJTIwY29sbGF0ZV9mbiUzRGRlZmF1bHRfZGF0YV9jb2xsYXRvciUwQSk=",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
)`,wrap:!1}}),$=new h({props:{code:"bW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JNYXNrZWRMTS5mcm9tX3ByZXRyYWluZWQobW9kZWxfY2hlY2twb2ludCk=",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>',wrap:!1}}),Ml=new h({props:{code:"ZnJvbSUyMHRvcmNoLm9wdGltJTIwaW1wb3J0JTIwQWRhbVclMEElMEFvcHRpbWl6ZXIlMjAlM0QlMjBBZGFtVyhtb2RlbC5wYXJhbWV0ZXJzKCklMkMlMjBsciUzRDVlLTUp",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>)`,wrap:!1}}),D=new h({props:{code:"ZnJvbSUyMGFjY2VsZXJhdGUlMjBpbXBvcnQlMjBBY2NlbGVyYXRvciUwQSUwQWFjY2VsZXJhdG9yJTIwJTNEJTIwQWNjZWxlcmF0b3IoKSUwQW1vZGVsJTJDJTIwb3B0aW1pemVyJTJDJTIwdHJhaW5fZGF0YWxvYWRlciUyQyUyMGV2YWxfZGF0YWxvYWRlciUyMCUzRCUyMGFjY2VsZXJhdG9yLnByZXBhcmUoJTBBJTIwJTIwJTIwJTIwbW9kZWwlMkMlMjBvcHRpbWl6ZXIlMkMlMjB0cmFpbl9kYXRhbG9hZGVyJTJDJTIwZXZhbF9kYXRhbG9hZGVyJTBBKQ==",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
)`,wrap:!1}}),N=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGdldF9zY2hlZHVsZXIlMEElMEFudW1fdHJhaW5fZXBvY2hzJTIwJTNEJTIwMyUwQW51bV91cGRhdGVfc3RlcHNfcGVyX2Vwb2NoJTIwJTNEJTIwbGVuKHRyYWluX2RhdGFsb2FkZXIpJTBBbnVtX3RyYWluaW5nX3N0ZXBzJTIwJTNEJTIwbnVtX3RyYWluX2Vwb2NocyUyMColMjBudW1fdXBkYXRlX3N0ZXBzX3Blcl9lcG9jaCUwQSUwQWxyX3NjaGVkdWxlciUyMCUzRCUyMGdldF9zY2hlZHVsZXIoJTBBJTIwJTIwJTIwJTIwJTIybGluZWFyJTIyJTJDJTBBJTIwJTIwJTIwJTIwb3B0aW1pemVyJTNEb3B0aW1pemVyJTJDJTBBJTIwJTIwJTIwJTIwbnVtX3dhcm11cF9zdGVwcyUzRDAlMkMlMEElMjAlMjAlMjAlMjBudW1fdHJhaW5pbmdfc3RlcHMlM0RudW1fdHJhaW5pbmdfc3RlcHMlMkMlMEEp",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,
)`,wrap:!1}}),Ul=new h({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMGdldF9mdWxsX3JlcG9fbmFtZSUwQSUwQW1vZGVsX25hbWUlMjAlM0QlMjAlMjJkaXN0aWxiZXJ0LWJhc2UtdW5jYXNlZC1maW5ldHVuZWQtaW1kYi1hY2NlbGVyYXRlJTIyJTBBcmVwb19uYW1lJTIwJTNEJTIwZ2V0X2Z1bGxfcmVwb19uYW1lKG1vZGVsX25hbWUpJTBBcmVwb19uYW1l",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`,wrap:!1}}),W=new h({props:{code:"J2xld3R1biUyRmRpc3RpbGJlcnQtYmFzZS11bmNhc2VkLWZpbmV0dW5lZC1pbWRiLWFjY2VsZXJhdGUn",highlighted:'<span class="hljs-string">&#x27;lewtun/distilbert-base-uncased-finetuned-imdb-accelerate&#x27;</span>',wrap:!1}}),K=new h({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMFJlcG9zaXRvcnklMEElMEFvdXRwdXRfZGlyJTIwJTNEJTIwbW9kZWxfbmFtZSUwQXJlcG8lMjAlM0QlMjBSZXBvc2l0b3J5KG91dHB1dF9kaXIlMkMlMjBjbG9uZV9mcm9tJTNEcmVwb19uYW1lKQ==",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)`,wrap:!1}}),O=new h({props:{code:"ZnJvbSUyMHRxZG0uYXV0byUyMGltcG9ydCUyMHRxZG0lMEFpbXBvcnQlMjB0b3JjaCUwQWltcG9ydCUyMG1hdGglMEElMEFwcm9ncmVzc19iYXIlMjAlM0QlMjB0cWRtKHJhbmdlKG51bV90cmFpbmluZ19zdGVwcykpJTBBJTBBZm9yJTIwZXBvY2glMjBpbiUyMHJhbmdlKG51bV90cmFpbl9lcG9jaHMpJTNBJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTlFJUQwJUIxJUQxJTgzJUQxJTg3JUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI1JTBBJTIwJTIwJTIwJTIwbW9kZWwudHJhaW4oKSUwQSUyMCUyMCUyMCUyMGZvciUyMGJhdGNoJTIwaW4lMjB0cmFpbl9kYXRhbG9hZGVyJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3V0cHV0cyUyMCUzRCUyMG1vZGVsKCoqYmF0Y2gpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbG9zcyUyMCUzRCUyMG91dHB1dHMubG9zcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGFjY2VsZXJhdG9yLmJhY2t3YXJkKGxvc3MpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3B0aW1pemVyLnN0ZXAoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxyX3NjaGVkdWxlci5zdGVwKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcHRpbWl6ZXIuemVyb19ncmFkKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcm9ncmVzc19iYXIudXBkYXRlKDEpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTlFJUQxJTg2JUQwJUI1JUQwJUJEJUQwJUJBJUQwJUIwJTBBJTIwJTIwJTIwJTIwbW9kZWwuZXZhbCgpJTBBJTIwJTIwJTIwJTIwbG9zc2VzJTIwJTNEJTIwJTVCJTVEJTBBJTIwJTIwJTIwJTIwZm9yJTIwc3RlcCUyQyUyMGJhdGNoJTIwaW4lMjBlbnVtZXJhdGUoZXZhbF9kYXRhbG9hZGVyKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHdpdGglMjB0b3JjaC5ub19ncmFkKCklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvdXRwdXRzJTIwJTNEJTIwbW9kZWwoKipiYXRjaCklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsb3NzJTIwJTNEJTIwb3V0cHV0cy5sb3NzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbG9zc2VzLmFwcGVuZChhY2NlbGVyYXRvci5nYXRoZXIobG9zcy5yZXBlYXQoYmF0Y2hfc2l6ZSkpKSUwQSUwQSUyMCUyMCUyMCUyMGxvc3NlcyUyMCUzRCUyMHRvcmNoLmNhdChsb3NzZXMpJTBBJTIwJTIwJTIwJTIwbG9zc2VzJTIwJTNEJTIwbG9zc2VzJTVCJTNBJTIwbGVuKGV2YWxfZGF0YXNldCklNUQlMEElMjAlMjAlMjAlMjB0cnklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwZXJwbGV4aXR5JTIwJTNEJTIwbWF0aC5leHAodG9yY2gubWVhbihsb3NzZXMpKSUwQSUyMCUyMCUyMCUyMGV4Y2VwdCUyME92ZXJmbG93RXJyb3IlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwZXJwbGV4aXR5JTIwJTNEJTIwZmxvYXQoJTIyaW5mJTIyKSUwQSUwQSUyMCUyMCUyMCUyMHByaW50KGYlMjIlM0UlM0UlM0UlMjBFcG9jaCUyMCU3QmVwb2NoJTdEJTNBJTIwUGVycGxleGl0eSUzQSUyMCU3QnBlcnBsZXhpdHklN0QlMjIpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJUExJUQwJUJFJUQxJTg1JUQxJTgwJUQwJUIwJUQwJUJEJUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI1JTIwJUQwJUI4JTIwJUQwJUI3JUQwJUIwJUQwJUIzJUQxJTgwJUQxJTgzJUQwJUI3JUQwJUJBJUQwJUIwJTBBJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3Iud2FpdF9mb3JfZXZlcnlvbmUoKSUwQSUyMCUyMCUyMCUyMHVud3JhcHBlZF9tb2RlbCUyMCUzRCUyMGFjY2VsZXJhdG9yLnVud3JhcF9tb2RlbChtb2RlbCklMEElMjAlMjAlMjAlMjB1bndyYXBwZWRfbW9kZWwuc2F2ZV9wcmV0cmFpbmVkKG91dHB1dF9kaXIlMkMlMjBzYXZlX2Z1bmN0aW9uJTNEYWNjZWxlcmF0b3Iuc2F2ZSklMEElMjAlMjAlMjAlMjBpZiUyMGFjY2VsZXJhdG9yLmlzX21haW5fcHJvY2VzcyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRva2VuaXplci5zYXZlX3ByZXRyYWluZWQob3V0cHV0X2RpciklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXBvLnB1c2hfdG9faHViKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbW1pdF9tZXNzYWdlJTNEZiUyMlRyYWluaW5nJTIwaW4lMjBwcm9ncmVzcyUyMGVwb2NoJTIwJTdCZXBvY2glN0QlMjIlMkMlMjBibG9ja2luZyUzREZhbHNlJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKQ==",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"># Обучение</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"># Оценка</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"># Сохранение и загрузка</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>
        )`,wrap:!1}}),ll=new h({props:{code:"RXBvY2glMjAwJTNBJTIwUGVycGxleGl0eSUzQSUyMDExLjM5NzU0NTMwNzkwMDQ3MiUwQUVwb2NoJTIwMSUzQSUyMFBlcnBsZXhpdHklM0ElMjAxMC45MDQ5MDkzMzA5ODMwOTIlMEFFcG9jaCUyMDIlM0ElMjBQZXJwbGV4aXR5JTNBJTIwMTAuNzI5NTAzNTA1MzQwNDA5",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>`,wrap:!1}}),{c(){M=d("p"),M.textContent=w,a=n(),r(y.$$.fragment),_=n(),j=d("p"),j.innerHTML=B,Z=n(),V=d("p"),V.innerHTML=k,g=n(),r(G.$$.fragment),u=n(),Q=d("p"),Q.innerHTML=A,z=n(),r(f.$$.fragment),E=n(),Y=d("p"),Y.innerHTML=R,X=n(),r(bl.$$.fragment),Ql=n(),H=d("p"),H.textContent=ve,Rl=n(),r($.$$.fragment),Hl=n(),tl=d("p"),tl.innerHTML=Il,Dl=n(),r(Ml.$$.fragment),al=n(),nl=d("p"),nl.innerHTML=il,Gl=n(),r(D.$$.fragment),gl=n(),L=d("p"),L.textContent=Fe,Bl=n(),r(N.$$.fragment),Ll=n(),Jl=d("p"),Jl.textContent=fl,ql=n(),r(Ul.$$.fragment),v=n(),r(W.$$.fragment),yl=n(),q=d("p"),q.innerHTML=Ye,kl=n(),r(K.$$.fragment),Zl=n(),P=d("p"),P.textContent=He,El=n(),r(O.$$.fragment),Xl=n(),r(ll.$$.fragment),Kl=n(),pl=d("p"),pl.textContent=el},l(U){M=m(U,"P",{"data-svelte-h":!0}),C(M)!=="svelte-1w2bemw"&&(M.textContent=w),a=J(U),T(y.$$.fragment,U),_=J(U),j=m(U,"P",{"data-svelte-h":!0}),C(j)!=="svelte-1o3yvw5"&&(j.innerHTML=B),Z=J(U),V=m(U,"P",{"data-svelte-h":!0}),C(V)!=="svelte-72anzr"&&(V.innerHTML=k),g=J(U),T(G.$$.fragment,U),u=J(U),Q=m(U,"P",{"data-svelte-h":!0}),C(Q)!=="svelte-1hxofdx"&&(Q.innerHTML=A),z=J(U),T(f.$$.fragment,U),E=J(U),Y=m(U,"P",{"data-svelte-h":!0}),C(Y)!=="svelte-17ag0gt"&&(Y.innerHTML=R),X=J(U),T(bl.$$.fragment,U),Ql=J(U),H=m(U,"P",{"data-svelte-h":!0}),C(H)!=="svelte-navuyg"&&(H.textContent=ve),Rl=J(U),T($.$$.fragment,U),Hl=J(U),tl=m(U,"P",{"data-svelte-h":!0}),C(tl)!=="svelte-wg6r8q"&&(tl.innerHTML=Il),Dl=J(U),T(Ml.$$.fragment,U),al=J(U),nl=m(U,"P",{"data-svelte-h":!0}),C(nl)!=="svelte-jq6ilk"&&(nl.innerHTML=il),Gl=J(U),T(D.$$.fragment,U),gl=J(U),L=m(U,"P",{"data-svelte-h":!0}),C(L)!=="svelte-16tyqll"&&(L.textContent=Fe),Bl=J(U),T(N.$$.fragment,U),Ll=J(U),Jl=m(U,"P",{"data-svelte-h":!0}),C(Jl)!=="svelte-140jpoz"&&(Jl.textContent=fl),ql=J(U),T(Ul.$$.fragment,U),v=J(U),T(W.$$.fragment,U),yl=J(U),q=m(U,"P",{"data-svelte-h":!0}),C(q)!=="svelte-y6za8f"&&(q.innerHTML=Ye),kl=J(U),T(K.$$.fragment,U),Zl=J(U),P=m(U,"P",{"data-svelte-h":!0}),C(P)!=="svelte-1336uuu"&&(P.textContent=He),El=J(U),T(O.$$.fragment,U),Xl=J(U),T(ll.$$.fragment,U),Kl=J(U),pl=m(U,"P",{"data-svelte-h":!0}),C(pl)!=="svelte-snlwvs"&&(pl.textContent=el)},m(U,b){t(U,M,b),t(U,a,b),c(y,U,b),t(U,_,b),t(U,j,b),t(U,Z,b),t(U,V,b),t(U,g,b),c(G,U,b),t(U,u,b),t(U,Q,b),t(U,z,b),c(f,U,b),t(U,E,b),t(U,Y,b),t(U,X,b),c(bl,U,b),t(U,Ql,b),t(U,H,b),t(U,Rl,b),c($,U,b),t(U,Hl,b),t(U,tl,b),t(U,Dl,b),c(Ml,U,b),t(U,al,b),t(U,nl,b),t(U,Gl,b),c(D,U,b),t(U,gl,b),t(U,L,b),t(U,Bl,b),c(N,U,b),t(U,Ll,b),t(U,Jl,b),t(U,ql,b),c(Ul,U,b),t(U,v,b),c(W,U,b),t(U,yl,b),t(U,q,b),t(U,kl,b),c(K,U,b),t(U,Zl,b),t(U,P,b),t(U,El,b),c(O,U,b),t(U,Xl,b),c(ll,U,b),t(U,Kl,b),t(U,pl,b),F=!0},i(U){F||(p(y.$$.fragment,U),p(G.$$.fragment,U),p(f.$$.fragment,U),p(bl.$$.fragment,U),p($.$$.fragment,U),p(Ml.$$.fragment,U),p(D.$$.fragment,U),p(N.$$.fragment,U),p(Ul.$$.fragment,U),p(W.$$.fragment,U),p(K.$$.fragment,U),p(O.$$.fragment,U),p(ll.$$.fragment,U),F=!0)},o(U){i(y.$$.fragment,U),i(G.$$.fragment,U),i(f.$$.fragment,U),i(bl.$$.fragment,U),i($.$$.fragment,U),i(Ml.$$.fragment,U),i(D.$$.fragment,U),i(N.$$.fragment,U),i(Ul.$$.fragment,U),i(W.$$.fragment,U),i(K.$$.fragment,U),i(O.$$.fragment,U),i(ll.$$.fragment,U),F=!1},d(U){U&&(e(M),e(a),e(_),e(j),e(Z),e(V),e(g),e(u),e(Q),e(z),e(E),e(Y),e(X),e(Ql),e(H),e(Rl),e(Hl),e(tl),e(Dl),e(al),e(nl),e(Gl),e(gl),e(L),e(Bl),e(Ll),e(Jl),e(ql),e(v),e(yl),e(q),e(kl),e(Zl),e(P),e(El),e(Xl),e(Kl),e(pl)),o(y,U),o(G,U),o(f,U),o(bl,U),o($,U),o(Ml,U),o(D,U),o(N,U),o(Ul,U),o(W,U),o(K,U),o(O,U),o(ll,U)}}}function An(I){let M,w='✏️ <strong>Попробуйте!</strong> Чтобы оценить преимущества адаптации к домену, дообучите классификатор на метках IMDb как для предварительно обученных, так и для дообученных контрольных точек DistilBERT. Если вам нужно освежить в памяти классификацию текстов, ознакомьтесь с <a href="../chapter3/1">Главой 3</a>.';return{c(){M=d("p"),M.innerHTML=w},l(a){M=m(a,"P",{"data-svelte-h":!0}),C(M)!=="svelte-17s1rnv"&&(M.innerHTML=w)},m(a,y){t(a,M,y)},p:Yl,d(a){a&&e(M)}}}function $n(I){let M,w,a,y,_,j,B,Z,V,k,g,G,u="Для многих приложений NLP, в которых используются модели-трансформеры, можно просто взять предварительно обученную модель из Hugging Face Hub и дообучить ее непосредственно на ваших данных для решения поставленной задачи. При условии, что корпус, использованный для предварительного обучения, не слишком отличается от корпуса, используемого для дообучения, трансферное обучение обычно дает хорошие результаты.",Q,A,z="Однако есть несколько случаев, когда перед обучением специфичной для конкретной задачи головы необходимо дообучить языковые модели на ваших данных. Например, если ваш датасет содержит юридические контракты или научные статьи, ванильная модель трансформер, такая как BERT, обычно рассматривает специфические для области слова в вашем корпусе как редкие токены, и результирующее качество может быть менее чем удовлетворительным. Дообучив языковую модель на данных из домена, вы сможете повысить качество работы во многих последующих задачах, а это значит, что обычно этот шаг нужно выполнить только один раз!",f,E,Y='Этот процесс дообучить предварительно обученную языковую модель на данных из домена обычно называют <em>доменной адаптацией (domain adaptation)</em>. Он был популяризирован в 2018 году благодаря <a href="https://arxiv.org/abs/1801.06146" rel="nofollow">ULMFiT</a>, которая стала одной из первых нейронных архитектур (основанных на LSTM), заставивших трансферное обучение действительно работать в NLP. Пример доменной адаптации с помощью ULMFiT показан на изображении ниже; в этом разделе мы сделаем нечто подобное, но с трансформером вместо LSTM!',R,X,bl='<img class="block dark:hidden" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/ulmfit.svg" alt="ULMFiT."/> <img class="hidden dark:block" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/ulmfit-dark.svg" alt="ULMFiT."/>',Ql,H,ve='К концу этого раздела у вас будет <a href="https://huggingface.co/huggingface-course/distilbert-base-uncased-finetuned-imdb?text=This+is+a+great+%5BMASK%5D." rel="nofollow">модель маскированного языкового моделирования</a> на Hub, которая позволяет автоматически дописывать предложения, как показано ниже:',Rl,$,Hl,tl,Il,Dl="Давайте погрузимся в работу!",Ml,al,nl,il,Gl,D,gl,L,Fe='Для начала давайте выберем подходящую предварительно обученную модель для маскированного языкового моделирования. Как показано на следующем скриншоте, вы можете найти список кандидатов, применив фильтр “Fill-Mask” на <a href="https://huggingface.co/models?pipeline_tag=fill-mask&amp;sort=downloads" rel="nofollow">Hugging Face Hub</a>:',Bl,N,Ll='<img src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/mlm-models.png" alt="Hub models." width="80%"/>',Jl,fl,ql=`Хотя модели семейства BERT и RoBERTa являются наиболее загружаемыми, мы будем использовать модель под названием <a href="https://huggingface.co/distilbert-base-uncased" rel="nofollow">DistilBERT</a>
которая может быть обучена гораздо быстрее и практически без потерь в качестве. Эта модель была обучена с помощью специальной техники, называемой <a href="https://en.wikipedia.org/wiki/Knowledge_distillation" rel="nofollow"><em>дистилляцией знаний (knowledge distillation)</em></a>, когда большая “модель-учитель”, такая как BERT, используется для обучения “модели-ученика”, имеющей гораздо меньше параметров. Объяснение деталей дистилляции знаний завело бы нас слишком далеко в этом разделе, но если вам интересно, вы можете прочитать об этом в <a href="https://www.oreilly.com/library/view/natural-language-processing/9781098136789/" rel="nofollow"><em>Natural Language Processing with Transformers</em></a> (в просторечии известном как учебник по Трансформерам).`,Ul,v,W,yl,q,Ye="Имея около 67 миллионов параметров, DistilBERT примерно в два раза меньше, чем базовая модель BERT, что примерно соответствует двукратному ускорению обучения - неплохо! Теперь посмотрим, какие виды токенов эта модель предсказывает как наиболее вероятные завершения небольшого образца текста:",kl,K,Zl,P,He='Как люди, мы можем представить множество вариантов использования токена <code>[MASK]</code>, например “day (день)”, “ride (поездка)” или “painting (картина)“. Для предварительно обученных моделей прогнозы зависят от корпуса, на котором обучалась модель, поскольку она учится улавливать статистические закономерности, присутствующие в данных. Как и BERT, DistilBERT был предварительно обучен на датасетах <a href="https://huggingface.co/datasets/wikipedia" rel="nofollow">English Wikipedia</a> и <a href="https://huggingface.co/datasets/bookcorpus" rel="nofollow">BookCorpus</a>, поэтому мы ожидаем, что прогнозы для <code>[MASK]</code> будут отражать эти домены. Для прогнозирования маски нам нужен токенизатор DistilBERT для создания входных данных для модели, поэтому давайте загрузим и его с хаба:',El,O,Xl,ll,Kl="Теперь, имея токенизатор и модель, мы можем передать наш текстовый пример в модель, извлечь логиты и вывести 5 лучших кандидатов:",pl,el,F,U,b,Le,Pl,vM="Из результатов видно, что предсказания модели относятся к повседневным терминам, что, пожалуй, неудивительно, учитывая основу английской Википедии. Давайте посмотрим, как мы можем изменить эту область на что-то более нишевое - сильно поляризованные обзоры фильмов!",qe,Ol,Ke,ls,FM='Для демонстрации адаптации к домену мы используем знаменитый <a href="https://huggingface.co/datasets/imdb" rel="nofollow">Large Movie Review Dataset</a> (или сокращенно IMDb) - корпус кинорецензий, который часто используется для тестирования моделей анализа настроения. Дообучив DistilBERT на этом корпусе, мы ожидаем, что языковая модель адаптирует свой словарный запас от фактических данных Википедии, на которых она была предварительно обучена, к более субъективным элементам кинорецензий. Мы можем получить данные из Hugging Face Hub с помощью функции <code>load_dataset()</code> из 🤗 Datasets:',Pe,ss,Oe,es,lt,ts,YM="Мы видим, что части <code>train</code> и <code>test</code> состоят из 25 000 отзывов каждая, а часть без меток, называемая <code>unsupervised</code>, содержит 50 000 отзывов. Давайте посмотрим на несколько примеров, чтобы получить представление о том, с каким текстом мы имеем дело. Как мы уже делали в предыдущих главах курса, мы используем функции <code>Dataset.shuffle()</code> и <code>Dataset.select()</code> для создания случайной выборки:",st,Ms,et,as,tt,ns,HM="Да, это точно рецензии на фильмы, и если вы родились до 1990х, вам будет лучше понятен комментарий в последней рецензии о VHS-версии. 😜! Хотя нам не понадобятся эти метки для языкового моделирования, мы уже видим, что <code>0</code> обозначает отрицательный отзыв, а <code>1</code> - положительный.",Mt,Al,at,Js,DM='Теперь, когда мы вкратце ознакомились с данными, давайте перейдем к их подготовке к моделированию языка по маске. Как мы увидим, есть несколько дополнительных шагов, которые необходимо сделать по сравнению с задачами классификации последовательностей, которые мы рассматривали в <a href="../chapter3/1">Главе 3</a>. Поехали!',nt,Us,Jt,ps,Ut,is,LM="Как для авторегрессивного, так и для масочного моделирования языка общим шагом предварительной обработки является объединение всех примеров, а затем разбиение всего корпуса на части одинакового размера. Это сильно отличается от нашего обычного подхода, когда мы просто проводим токенизацию отдельных примеров. Зачем конкатенируем все вместе? Причина в том, что отдельные примеры могут быть обрезаны, если они слишком длинные, и это приведет к потере информации, которая может быть полезна для задачи языкового моделирования!",pt,ys,qM='Итак, для начала мы проведем обычную токенизацию нашего корпуса, но <em>без</em> задания параметра <code>truncation=True</code> в нашем токенизаторе. Мы также возьмем идентификаторы слов, если они доступны (а они будут доступны, если мы используем быстрый токенизатор, как описано в <a href="../chapter6/3">Главе 6</a>), поскольку они понадобятся нам позже для маскирования целых слов. Мы обернем это в простую функцию, а пока удалим столбцы <code>text</code> и <code>label</code>, поскольку они нам больше не нужны:',it,ws,yt,rs,wt,Ts,KM="Поскольку DistilBERT - это BERT-подобная модель, мы видим, что закодированные тексты состоят из <code>input_ids</code> и <code>attention_mask</code>, которые мы уже видели в других главах, а также из <code>word_ids</code>, которые мы добавили.",rt,cs,PM="Теперь, когда мы провели токенизацию рецензий на фильмы, следующий шаг - сгруппировать их вместе и разбить результат на части. Но какого размера должны быть эти части? В конечном итоге это будет зависеть от объема доступной памяти GPU, но хорошей отправной точкой будет узнать, каков максимальный размер контекста модели. Это можно сделать путем проверки атрибута <code>model_max_length</code> токенизатора:",Tt,os,ct,ds,ot,ms,OM="Это значение берется из файла <em>tokenizer_config.json</em>, связанного с контрольной точкой; в данном случае мы видим, что размер контекста составляет 512 токенов, как и в случае с BERT.",dt,$l,mt,js,la="Поэтому для проведения экспериментов на GPU, подобных тем, что стоят в Google Colab, мы выберем что-нибудь поменьше, что может поместиться в памяти:",jt,Cs,Ct,Wl,ut,us,sa="Теперь наступает самое интересное. Чтобы показать, как работает конкатенация, давайте возьмем несколько отзывов из нашего обучающего набора с токенизацией и выведем количество токенов в отзыве:",ht,hs,bt,bs,It,Is,ea="Затем мы можем объединить все эти примеры с помощью простого dictionary comprehension, как показано ниже:",ft,fs,Vt,Vs,_t,_s,ta="Отлично, общая длина подтвердилась - теперь давайте разобьем конкатенированные обзоры на части размером <code>chunk_size</code>. Для этого мы перебираем признаки в <code>concatenated_examples</code> и используем list comprehension для создания срезов каждого признака. В результате мы получаем словарь фрагментов для каждого признака:",Qt,Qs,Rt,Rs,Gt,Gs,Ma="Как видно из этого примера, последний фрагмент, как правило, будет меньше максимального размера фрагмента. Существует две основные стратегии решения этой проблемы:",gt,gs,aa="<li>Отбросить последний фрагмент, если он меньше <code>chunk_size</code>.</li> <li>Дополнить последний фрагмент до длины, равной <code>chunk_size</code>.</li>",Bt,Bs,na="Мы воспользуемся первым подходом, поэтому обернем всю описанную выше логику в одну функцию, которую можно применить к нашим токенизированным датасетам:",kt,ks,Zt,Zs,Ja="Обратите внимание, что на последнем шаге <code>group_texts()</code> мы создаем новый столбец <code>labels</code>, который является копией столбца <code>input_ids</code>. Как мы вскоре увидим, это связано с тем, что при моделировании языка по маске цель состоит в прогнозировании случайно замаскированных токенов во входном батче, и, создавая столбец <code>labels</code>, мы предоставляем базовую истину для нашей языковой модели, на которой она будет учиться.",Et,Es,Ua="Теперь давайте применим <code>group_texts()</code> к нашим токенизированным датасетам, используя нашу надежную функцию <code>Dataset.map()</code>:",Xt,Xs,At,As,$t,$s,pa="Вы можете видеть, что группировка и последующее разбиение текстов на фрагменты позволили получить гораздо больше примеров, чем наши первоначальные 25 000 примеров для частей <code>train</code> и <code>test</code>. Это потому, что теперь у нас есть примеры с <em>непрерывными токенами (contiguous tokens)</em>, которые охватывают несколько примеров из исходного корпуса. В этом можно убедиться, поискав специальные токены <code>[SEP]</code> и <code>[CLS]</code> в одном из фрагментов:",Wt,Ws,xt,xs,St,Ss,ia="В этом примере вы можете увидеть два перекрывающихся обзора фильмов: один - о старшей школе, другой - о бездомности. Давайте также посмотрим, как выглядят метки при моделировании языка по маске:",zt,zs,Nt,Ns,vt,vs,ya="Как и ожидалось от нашей функции <code>group_texts()</code> выше, это выглядит идентично декодированным <code>input_ids</code> - но как тогда наша модель может чему-то научиться? Нам не хватает ключевого шага: вставки токенов <code>[MASK]</code> в случайные позиции во входных данных! Давайте посмотрим, как это можно сделать на лету во время дообучения с помощью специального коллатора данных.",Ft,Fs,Yt,Ys,wa='Дообучить модель моделирования языка по маске почти то же самое, что и дообучить модель классификации последовательностей, как мы делали в <a href="../chapter3/1">Главе 3</a>. Единственное отличие заключается в том, что нам нужен специальный коллатор данных, который может случайным образом маскировать некоторые токены в каждом батче текстов. К счастью, 🤗 Transformers поставляется со специальным <code>DataCollatorForLanguageModeling</code>, предназначенным именно для этой задачи. Нам нужно только передать ему токенизатор и аргумент <code>mlm_probability</code>, который указывает, какую долю токенов нужно маскировать. Мы выберем 15 % - это количество используется для BERT и является распространенным выбором в литературе:',Ht,Hs,Dt,Ds,ra="Чтобы увидеть, как работает случайное маскирование, давайте отправим несколько примеров в коллатор данных. Поскольку он ожидает список <code>dict</code>, где каждый <code>dict</code> представляет собой один фрагмент непрерывного текста, мы сначала выполняем итерацию над датасетом, прежде чем отправить батч коллатору. Мы удаляем ключ <code>&quot;word_ids&quot;</code> для этого коллатора данных, поскольку он его не ожидает:",Lt,Ls,qt,qs,Kt,Ks,Ta="Отлично, сработало! Мы видим, что токен <code>[MASK]</code> был случайным образом вставлен в различные места нашего текста. Это будут токены, которые наша модель должна будет предсказать в процессе обучения - и прелесть коллатора данных в том, что он будет случайным образом вставлять <code>[MASK]</code> в каждом батче!",Pt,xl,Ot,Xe,Ps,ca="При обучении моделей для моделирования языка с маской можно использовать один из методов - маскировать целые слова, а не только отдельные токены. Такой подход называется <em>маскированием целых слов (whole word masking)</em>. Если мы хотим использовать маскирование целых слов, нам нужно будет самостоятельно создать коллатор данных. Коллатор данных - это просто функция, которая берет список примеров и преобразует их в батч, так что давайте сделаем это прямо сейчас! Мы будем использовать идентификаторы слов, вычисленные ранее, для создания карты между индексами слов и соответствующими токенами, затем случайным образом определим, какие слова нужно маскировать, и применим эту маску к входным данным. Обратите внимание, что все метки - <code>-100</code>, кроме тех, что соответствуют словам-маскам.",lM,wl,rl,Ae,Os,oa="Далее мы можем опробовать ее на тех же примерах, что и раньше:",sM,le,eM,se,tM,Sl,MM,ee,da='Теперь, когда у нас есть два колатора данных, остальные шаги по дообучению стандартны. Обучение может занять много времени в Google Colab, если вам не посчастливилось получить мифический GPU P100 😭, поэтому мы сначала уменьшим размер обучающего набора до нескольких тысяч примеров. Не волнуйтесь, мы все равно получим довольно приличную языковую модель! Быстрый способ уменьшить размер датасета в 🤗 Datasets - это функция <code>Dataset.train_test_split()</code>, которую мы рассматривали в <a href="../chapter5/1">Главе 5</a>:',aM,te,nM,Me,JM,ae,ma="Это автоматически создаст новые части <code>train</code> и <code>test</code>, с размером обучающего набора в 10 000 примеров и валидацией в 10 % от этого количества - не стесняйтесь увеличить это значение, если у вас мощный GPU! Следующее, что нам нужно сделать, это авторизоваться на Hugging Face Hub. Если вы выполняете этот код в блокноте, вы можете сделать это с помощью следующей служебной функции:",UM,ne,pM,Je,ja="которая отобразит виджет, где вы можете ввести свои учетные данные. В качестве альтернативы можно выполнить команду:",iM,Ue,yM,pe,Ca="в вашем любимом терминале и авторизуйтесь там.",wM,Tl,cl,$e,ie,rM,ye,TM,we,ua="В отличие от других задач, таких как классификация текстов или ответов на вопросы, где для обучения нам дается помеченный корпус, при языковом моделировании у нас нет никаких явных меток. Как же определить, какая языковая модель является хорошей? Как и в случае с функцией автокоррекции в вашем телефоне, хорошая языковая модель - это та, которая присваивает высокую вероятность грамматически правильным предложениям и низкую вероятность бессмысленным предложениям. Чтобы лучше представить себе, как это выглядит, вы можете найти в Интернете целые подборки “неудач автокоррекции”, где модель в телефоне человека выдает довольно забавные (и часто неуместные) завершения!",cM,ol,dl,We,re,oM,Te,ha="Более низкий показатель перплексии означает лучшую языковую модель, и мы видим, что наша начальная модель имеет несколько большое значение. Давайте посмотрим, сможем ли мы снизить его, дообучив модель! Для этого сначала запустим цикл обучения:",dM,ml,jl,xe,ce,ba="и затем вычислить результирующую перплексию на тестовом наборе, как и раньше:",mM,Cl,ul,Se,oe,jM,de,Ia="Неплохо - это довольно значительное уменьшение перплексии, что говорит о том, что модель узнала что-то новое об области рецензий на фильмы!",CM,ze,zl,uM,Ne,me,hM,je,fa="Вы можете взаимодействовать с дообученной моделью либо с помощью ее виджета на Hub, либо локально с помощью <code>pipeline</code> из 🤗 Transformers. Давайте воспользуемся последним вариантом, чтобы загрузить нашу модель с помощью конвейера <code>fill-mask</code>:",bM,Ce,IM,ue,Va="Затем мы можем передать конвейеру наш пример текста ” This is a great [MASK]” и посмотреть, каковы 5 лучших прогнозов:",fM,he,VM,be,_M,Ie,_a="Отлично - наша модель явно адаптировала свои веса, чтобы прогнозировать слова, которые сильнее ассоциируются с фильмами!",QM,fe,RM,Ve,Qa='На этом мы завершаем наш первый эксперимент по обучению языковой модели. В <a href="../chapter7/6">разделе 6</a> вы узнаете, как обучить авторегрессионную модель типа GPT-2 с нуля; загляните туда, если хотите посмотреть, как можно предварительно обучить свою собственную модель трансформера!',GM,Nl,gM,_e,BM,De,kM;_=new wn({props:{fw:I[0]}}),B=new Fl({props:{title:"Дообучение модели маскированного языкового моделирования",local:"fine-tuning-a-masked-language-model",headingTag:"h1"}});const Ra=[cn,Tn],Qe=[];function Ga(l,s){return l[0]==="pt"?0:1}V=Ga(I),k=Qe[V]=Ra[V](I),al=new ZM({props:{id:"mqElG5QJWUg"}}),il=new vl({props:{$$slots:{default:[on]},$$scope:{ctx:I}}}),D=new Fl({props:{title:"Выбор предварительно обученной модели для маскированного моделирования языка",local:"picking-a-pretrained-model-for-masked-language-modeling",headingTag:"h2"}});const ga=[mn,dn],Re=[];function Ba(l,s){return l[0]==="pt"?0:1}v=Ba(I),W=Re[v]=ga[v](I),K=new h({props:{code:"dGV4dCUyMCUzRCUyMCUyMlRoaXMlMjBpcyUyMGElMjBncmVhdCUyMCU1Qk1BU0slNUQuJTIy",highlighted:'text = <span class="hljs-string">&quot;This is a great [MASK].&quot;</span>',wrap:!1}}),O=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEElMEF0b2tlbml6ZXIlMjAlM0QlMjBBdXRvVG9rZW5pemVyLmZyb21fcHJldHJhaW5lZChtb2RlbF9jaGVja3BvaW50KQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)`,wrap:!1}});const ka=[Cn,jn],Ge=[];function Za(l,s){return l[0]==="pt"?0:1}el=Za(I),F=Ge[el]=ka[el](I),b=new h({props:{code:"JyUzRSUzRSUzRSUyMFRoaXMlMjBpcyUyMGElMjBncmVhdCUyMGRlYWwuJyUwQSclM0UlM0UlM0UlMjBUaGlzJTIwaXMlMjBhJTIwZ3JlYXQlMjBzdWNjZXNzLiclMEEnJTNFJTNFJTNFJTIwVGhpcyUyMGlzJTIwYSUyMGdyZWF0JTIwYWR2ZW50dXJlLiclMEEnJTNFJTNFJTNFJTIwVGhpcyUyMGlzJTIwYSUyMGdyZWF0JTIwaWRlYS4nJTBBJyUzRSUzRSUzRSUyMFRoaXMlMjBpcyUyMGElMjBncmVhdCUyMGZlYXQuJw==",highlighted:`<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great deal.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great success.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great adventure.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great idea.&#x27;</span>
<span class="hljs-string">&#x27;&gt;&gt;&gt; This is a great feat.&#x27;</span>`,wrap:!1}}),Ol=new Fl({props:{title:"Датасет",local:"the-dataset",headingTag:"h2"}}),ss=new h({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwbG9hZF9kYXRhc2V0JTBBJTBBaW1kYl9kYXRhc2V0JTIwJTNEJTIwbG9hZF9kYXRhc2V0KCUyMmltZGIlMjIpJTBBaW1kYl9kYXRhc2V0",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`,wrap:!1}}),es=new h({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ3RleHQnJTJDJTIwJ2xhYmVsJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMjUwMDAlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTIwJTIwJTIwJTIwdGVzdCUzQSUyMERhdGFzZXQoJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZmVhdHVyZXMlM0ElMjAlNUIndGV4dCclMkMlMjAnbGFiZWwnJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX3Jvd3MlM0ElMjAyNTAwMCUwQSUyMCUyMCUyMCUyMCU3RCklMEElMjAlMjAlMjAlMjB1bnN1cGVydmlzZWQlM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ3RleHQnJTJDJTIwJ2xhYmVsJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwNTAwMDAlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTdEKQ==",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>
    })
})`,wrap:!1}}),Ms=new h({props:{code:"c2FtcGxlJTIwJTNEJTIwaW1kYl9kYXRhc2V0JTVCJTIydHJhaW4lMjIlNUQuc2h1ZmZsZShzZWVkJTNENDIpLnNlbGVjdChyYW5nZSgzKSklMEElMEFmb3IlMjByb3clMjBpbiUyMHNhbXBsZSUzQSUwQSUyMCUyMCUyMCUyMHByaW50KGYlMjIlNUNuJyUzRSUzRSUzRSUyMFJldmlldyUzQSUyMCU3QnJvdyU1Qid0ZXh0JyU1RCU3RCclMjIpJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMiclM0UlM0UlM0UlMjBMYWJlbCUzQSUyMCU3QnJvdyU1QidsYWJlbCclNUQlN0QnJTIyKQ==",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>)`,wrap:!1}}),as=new h({props:{code:" ",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éd 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>`,wrap:!1}}),Al=new vl({props:{$$slots:{default:[un]},$$scope:{ctx:I}}}),Us=new Fl({props:{title:"Предварительная обработка данных",local:"preprocessing-the-data",headingTag:"h2"}}),ps=new ZM({props:{id:"8PmhEIXhBvI"}}),ws=new h({props:{code:"ZGVmJTIwdG9rZW5pemVfZnVuY3Rpb24oZXhhbXBsZXMpJTNBJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwdG9rZW5pemVyKGV4YW1wbGVzJTVCJTIydGV4dCUyMiU1RCklMEElMjAlMjAlMjAlMjBpZiUyMHRva2VuaXplci5pc19mYXN0JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzdWx0JTVCJTIyd29yZF9pZHMlMjIlNUQlMjAlM0QlMjAlNUJyZXN1bHQud29yZF9pZHMoaSklMjBmb3IlMjBpJTIwaW4lMjByYW5nZShsZW4ocmVzdWx0JTVCJTIyaW5wdXRfaWRzJTIyJTVEKSklNUQlMEElMjAlMjAlMjAlMjByZXR1cm4lMjByZXN1bHQlMEElMEElMEElMjMlMjAlRDAlOTglRDElODElRDAlQkYlRDAlQkUlRDAlQkIlRDElOEMlRDAlQjclRDElODMlRDAlQjklRDElODIlRDAlQjUlMjBiYXRjaGVkJTNEVHJ1ZSUyMCVEMCVCNCVEMCVCQiVEMSU4RiUyMCVEMCVCMCVEMCVCQSVEMSU4MiVEMCVCOCVEMCVCMiVEMCVCMCVEMSU4NiVEMCVCOCVEMCVCOCUyMCVEMCVCMSVEMSU4QiVEMSU4MSVEMSU4MiVEMSU4MCVEMCVCRSVEMCVCOSUyMCVEMCVCQyVEMCVCRCVEMCVCRSVEMCVCMyVEMCVCRSVEMCVCRiVEMCVCRSVEMSU4MiVEMCVCRSVEMSU4NyVEMCVCRCVEMCVCRSVEMSU4MSVEMSU4MiVEMCVCOCElMEF0b2tlbml6ZWRfZGF0YXNldHMlMjAlM0QlMjBpbWRiX2RhdGFzZXQubWFwKCUwQSUyMCUyMCUyMCUyMHRva2VuaXplX2Z1bmN0aW9uJTJDJTIwYmF0Y2hlZCUzRFRydWUlMkMlMjByZW1vdmVfY29sdW1ucyUzRCU1QiUyMnRleHQlMjIlMkMlMjAlMjJsYWJlbCUyMiU1RCUwQSklMEF0b2tlbml6ZWRfZGF0YXNldHM=",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"># Используйте batched=True для активации быстрой многопоточности!</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`,wrap:!1}}),rs=new h({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdpbnB1dF9pZHMnJTJDJTIwJ3dvcmRfaWRzJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMjUwMDAlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTIwJTIwJTIwJTIwdGVzdCUzQSUyMERhdGFzZXQoJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZmVhdHVyZXMlM0ElMjAlNUInYXR0ZW50aW9uX21hc2snJTJDJTIwJ2lucHV0X2lkcyclMkMlMjAnd29yZF9pZHMnJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX3Jvd3MlM0ElMjAyNTAwMCUwQSUyMCUyMCUyMCUyMCU3RCklMEElMjAlMjAlMjAlMjB1bnN1cGVydmlzZWQlM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdpbnB1dF9pZHMnJTJDJTIwJ3dvcmRfaWRzJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwNTAwMDAlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTdEKQ==",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>
    })
})`,wrap:!1}}),os=new h({props:{code:"dG9rZW5pemVyLm1vZGVsX21heF9sZW5ndGg=",highlighted:"tokenizer.model_max_length",wrap:!1}}),ds=new h({props:{code:"NTEy",highlighted:'<span class="hljs-number">512</span>',wrap:!1}}),$l=new vl({props:{$$slots:{default:[hn]},$$scope:{ctx:I}}}),Cs=new h({props:{code:"Y2h1bmtfc2l6ZSUyMCUzRCUyMDEyOA==",highlighted:'chunk_size = <span class="hljs-number">128</span>',wrap:!1}}),Wl=new vl({props:{warning:!0,$$slots:{default:[bn]},$$scope:{ctx:I}}}),hs=new h({props:{code:"JTIzJTIwJUQwJUExJTIwJUQwJUJGJUQwJUJFJUQwJUJDJUQwJUJFJUQxJTg5JUQxJThDJUQxJThFJTIwJUQxJTgxJUQxJTgwJUQwJUI1JUQwJUI3JUQwJUIwJTIwJUQwJUJGJUQwJUJFJUQwJUJCJUQxJTgzJUQxJTg3JUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQxJTgxJUQwJUJGJUQwJUI4JUQxJTgxJUQwJUJFJUQwJUJBJTIwJUQxJTgxJUQwJUJGJUQwJUI4JUQxJTgxJUQwJUJBJUQwJUJFJUQwJUIyJTIwJUQwJUI0JUQwJUJCJUQxJThGJTIwJUQwJUJBJUQwJUIwJUQwJUI2JUQwJUI0JUQwJUJFJUQwJUIzJUQwJUJFJTIwJUQwJUJGJUQxJTgwJUQwJUI4JUQwJUI3JUQwJUJEJUQwJUIwJUQwJUJBJUQwJUIwJTBBdG9rZW5pemVkX3NhbXBsZXMlMjAlM0QlMjB0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QiUzQTMlNUQlMEElMEFmb3IlMjBpZHglMkMlMjBzYW1wbGUlMjBpbiUyMGVudW1lcmF0ZSh0b2tlbml6ZWRfc2FtcGxlcyU1QiUyMmlucHV0X2lkcyUyMiU1RCklM0ElMEElMjAlMjAlMjAlMjBwcmludChmJTIyJyUzRSUzRSUzRSUyMFJldmlldyUyMCU3QmlkeCU3RCUyMGxlbmd0aCUzQSUyMCU3QmxlbihzYW1wbGUpJTdEJyUyMik=",highlighted:`<span class="hljs-comment"># С помощью среза получаем список списков для каждого признака</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>)`,wrap:!1}}),bs=new h({props:{code:"JyUzRSUzRSUzRSUyMFJldmlldyUyMDAlMjBsZW5ndGglM0ElMjAyMDAnJTBBJyUzRSUzRSUzRSUyMFJldmlldyUyMDElMjBsZW5ndGglM0ElMjA1NTknJTBBJyUzRSUzRSUzRSUyMFJldmlldyUyMDIlMjBsZW5ndGglM0ElMjAxOTIn",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>`,wrap:!1}}),fs=new h({props:{code:"Y29uY2F0ZW5hdGVkX2V4YW1wbGVzJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwayUzQSUyMHN1bSh0b2tlbml6ZWRfc2FtcGxlcyU1QmslNUQlMkMlMjAlNUIlNUQpJTIwZm9yJTIwayUyMGluJTIwdG9rZW5pemVkX3NhbXBsZXMua2V5cygpJTBBJTdEJTBBdG90YWxfbGVuZ3RoJTIwJTNEJTIwbGVuKGNvbmNhdGVuYXRlZF9leGFtcGxlcyU1QiUyMmlucHV0X2lkcyUyMiU1RCklMEFwcmludChmJTIyJyUzRSUzRSUzRSUyMENvbmNhdGVuYXRlZCUyMHJldmlld3MlMjBsZW5ndGglM0ElMjAlN0J0b3RhbF9sZW5ndGglN0QnJTIyKQ==",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; Concatenated reviews length: <span class="hljs-subst">{total_length}</span>&#x27;&quot;</span>)`,wrap:!1}}),Vs=new h({props:{code:"JyUzRSUzRSUzRSUyMENvbmNhdGVuYXRlZCUyMHJldmlld3MlMjBsZW5ndGglM0ElMjA5NTEn",highlighted:'<span class="hljs-string">&#x27;&gt;&gt;&gt; Concatenated reviews length: 951&#x27;</span>',wrap:!1}}),Qs=new h({props:{code:"Y2h1bmtzJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwayUzQSUyMCU1QnQlNUJpJTIwJTNBJTIwaSUyMCUyQiUyMGNodW5rX3NpemUlNUQlMjBmb3IlMjBpJTIwaW4lMjByYW5nZSgwJTJDJTIwdG90YWxfbGVuZ3RoJTJDJTIwY2h1bmtfc2l6ZSklNUQlMEElMjAlMjAlMjAlMjBmb3IlMjBrJTJDJTIwdCUyMGluJTIwY29uY2F0ZW5hdGVkX2V4YW1wbGVzLml0ZW1zKCklMEElN0QlMEElMEFmb3IlMjBjaHVuayUyMGluJTIwY2h1bmtzJTVCJTIyaW5wdXRfaWRzJTIyJTVEJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMiclM0UlM0UlM0UlMjBDaHVuayUyMGxlbmd0aCUzQSUyMCU3QmxlbihjaHVuayklN0QnJTIyKQ==",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>)`,wrap:!1}}),Rs=new h({props:{code:"JyUzRSUzRSUzRSUyMENodW5rJTIwbGVuZ3RoJTNBJTIwMTI4JyUwQSclM0UlM0UlM0UlMjBDaHVuayUyMGxlbmd0aCUzQSUyMDEyOCclMEEnJTNFJTNFJTNFJTIwQ2h1bmslMjBsZW5ndGglM0ElMjAxMjgnJTBBJyUzRSUzRSUzRSUyMENodW5rJTIwbGVuZ3RoJTNBJTIwMTI4JyUwQSclM0UlM0UlM0UlMjBDaHVuayUyMGxlbmd0aCUzQSUyMDEyOCclMEEnJTNFJTNFJTNFJTIwQ2h1bmslMjBsZW5ndGglM0ElMjAxMjgnJTBBJyUzRSUzRSUzRSUyMENodW5rJTIwbGVuZ3RoJTNBJTIwMTI4JyUwQSclM0UlM0UlM0UlMjBDaHVuayUyMGxlbmd0aCUzQSUyMDU1Jw==",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>`,wrap:!1}}),ks=new h({props:{code:"ZGVmJTIwZ3JvdXBfdGV4dHMoZXhhbXBsZXMpJTNBJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTlBJUQwJUJFJUQwJUJEJUQwJUJBJUQwJUIwJUQxJTgyJUQwJUI1JUQwJUJEJUQwJUI4JUQxJTgwJUQxJTgzJUQwJUI1JUQwJUJDJTIwJUQwJUIyJUQxJTgxJUQwJUI1JTIwJUQxJTgyJUQwJUI1JUQwJUJBJUQxJTgxJUQxJTgyJUQxJThCJTBBJTIwJTIwJTIwJTIwY29uY2F0ZW5hdGVkX2V4YW1wbGVzJTIwJTNEJTIwJTdCayUzQSUyMHN1bShleGFtcGxlcyU1QmslNUQlMkMlMjAlNUIlNUQpJTIwZm9yJTIwayUyMGluJTIwZXhhbXBsZXMua2V5cygpJTdEJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTkyJUQxJThCJUQxJTg3JUQwJUI4JUQxJTgxJUQwJUJCJUQxJThGJUQwJUI1JUQwJUJDJTIwJUQwJUI0JUQwJUJCJUQwJUI4JUQwJUJEJUQxJTgzJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQwJUJBJUQwJUIwJUQxJTgyJUQwJUI1JUQwJUJEJUQwJUI4JUQxJTgwJUQwJUJFJUQwJUIyJUQwJUIwJUQwJUJEJUQwJUJEJUQxJThCJUQxJTg1JTIwJUQxJTgyJUQwJUI1JUQwJUJBJUQxJTgxJUQxJTgyJUQwJUJFJUQwJUIyJTBBJTIwJTIwJTIwJTIwdG90YWxfbGVuZ3RoJTIwJTNEJTIwbGVuKGNvbmNhdGVuYXRlZF9leGFtcGxlcyU1Qmxpc3QoZXhhbXBsZXMua2V5cygpKSU1QjAlNUQlNUQpJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTlFJUQxJTgyJUQwJUIxJUQxJTgwJUQwJUIwJUQxJTgxJUQxJThCJUQwJUIyJUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQwJUJGJUQwJUJFJUQxJTgxJUQwJUJCJUQwJUI1JUQwJUI0JUQwJUJEJUQwJUI4JUQwJUI5JTIwJUQxJTg0JUQxJTgwJUQwJUIwJUQwJUIzJUQwJUJDJUQwJUI1JUQwJUJEJUQxJTgyJTJDJTIwJUQwJUI1JUQxJTgxJUQwJUJCJUQwJUI4JTIwJUQwJUJFJUQwJUJEJTIwJUQwJUJDJUQwJUI1JUQwJUJEJUQxJThDJUQxJTg4JUQwJUI1JTIwY2h1bmtfc2l6ZSUwQSUyMCUyMCUyMCUyMHRvdGFsX2xlbmd0aCUyMCUzRCUyMCh0b3RhbF9sZW5ndGglMjAlMkYlMkYlMjBjaHVua19zaXplKSUyMColMjBjaHVua19zaXplJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJUEwJUQwJUIwJUQwJUI3JUQwJUIxJUQwJUI4JUQwJUIyJUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQwJUJEJUQwJUIwJTIwJUQxJTg0JUQxJTgwJUQwJUIwJUQwJUIzJUQwJUJDJUQwJUI1JUQwJUJEJUQxJTgyJUQxJThCJTIwJUQwJUI0JUQwJUJCJUQwJUI4JUQwJUJEJUQwJUJFJUQwJUI5JTIwbWF4X2xlbiUwQSUyMCUyMCUyMCUyMHJlc3VsdCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGslM0ElMjAlNUJ0JTVCaSUyMCUzQSUyMGklMjAlMkIlMjBjaHVua19zaXplJTVEJTIwZm9yJTIwaSUyMGluJTIwcmFuZ2UoMCUyQyUyMHRvdGFsX2xlbmd0aCUyQyUyMGNodW5rX3NpemUpJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZm9yJTIwayUyQyUyMHQlMjBpbiUyMGNvbmNhdGVuYXRlZF9leGFtcGxlcy5pdGVtcygpJTBBJTIwJTIwJTIwJTIwJTdEJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJUExJUQwJUJFJUQwJUI3JUQwJUI0JUQwJUIwJUQwJUI1JUQwJUJDJTIwJUQwJUJEJUQwJUJFJUQwJUIyJUQxJThCJUQwJUI5JTIwJUQxJTgxJUQxJTgyJUQwJUJFJUQwJUJCJUQwJUIxJUQwJUI1JUQxJTg2JTIwJUQwJUJDJUQwJUI1JUQxJTgyJUQwJUJFJUQwJUJBJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTVCJTIybGFiZWxzJTIyJTVEJTIwJTNEJTIwcmVzdWx0JTVCJTIyaW5wdXRfaWRzJTIyJTVELmNvcHkoKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMHJlc3VsdA==",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"># Конкатенируем все тексты</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"># Вычисляем длину конкатенированных текстов</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"># Отбрасываем последний фрагмент, если он меньше chunk_size</span>
    total_length = (total_length // chunk_size) * chunk_size
    <span class="hljs-comment"># Разбиваем на фрагменты длиной 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"># Создаем новый столбец меток</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`,wrap:!1}}),Xs=new h({props:{code:"bG1fZGF0YXNldHMlMjAlM0QlMjB0b2tlbml6ZWRfZGF0YXNldHMubWFwKGdyb3VwX3RleHRzJTJDJTIwYmF0Y2hlZCUzRFRydWUpJTBBbG1fZGF0YXNldHM=",highlighted:`lm_datasets = tokenized_datasets.<span class="hljs-built_in">map</span>(group_texts, batched=<span class="hljs-literal">True</span>)
lm_datasets`,wrap:!1}}),As=new h({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdpbnB1dF9pZHMnJTJDJTIwJ2xhYmVscyclMkMlMjAnd29yZF9pZHMnJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX3Jvd3MlM0ElMjA2MTI4OSUwQSUyMCUyMCUyMCUyMCU3RCklMEElMjAlMjAlMjAlMjB0ZXN0JTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidhdHRlbnRpb25fbWFzayclMkMlMjAnaW5wdXRfaWRzJyUyQyUyMCdsYWJlbHMnJTJDJTIwJ3dvcmRfaWRzJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwNTk5MDUlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTIwJTIwJTIwJTIwdW5zdXBlcnZpc2VkJTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidhdHRlbnRpb25fbWFzayclMkMlMjAnaW5wdXRfaWRzJyUyQyUyMCdsYWJlbHMnJTJDJTIwJ3dvcmRfaWRzJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMTIyOTYzJTBBJTIwJTIwJTIwJTIwJTdEKSUwQSU3RCk=",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>
    })
})`,wrap:!1}}),Ws=new h({props:{code:"dG9rZW5pemVyLmRlY29kZShsbV9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCMSU1RCU1QiUyMmlucHV0X2lkcyUyMiU1RCk=",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>])',wrap:!1}}),xs=new h({props:{code:"JTIyLi4uLiUyMGF0Li4uLi4uLi4uLiUyMGhpZ2guJTIwYSUyMGNsYXNzaWMlMjBsaW5lJTIwJTNBJTIwaW5zcGVjdG9yJTIwJTNBJTIwaSdtJTIwaGVyZSUyMHRvJTIwc2FjayUyMG9uZSUyMG9mJTIweW91ciUyMHRlYWNoZXJzLiUyMHN0dWRlbnQlMjAlM0ElMjB3ZWxjb21lJTIwdG8lMjBicm9td2VsbCUyMGhpZ2guJTIwaSUyMGV4cGVjdCUyMHRoYXQlMjBtYW55JTIwYWR1bHRzJTIwb2YlMjBteSUyMGFnZSUyMHRoaW5rJTIwdGhhdCUyMGJyb213ZWxsJTIwaGlnaCUyMGlzJTIwZmFyJTIwZmV0Y2hlZC4lMjB3aGF0JTIwYSUyMHBpdHklMjB0aGF0JTIwaXQlMjBpc24ndCElMjAlNUJTRVAlNUQlMjAlNUJDTFMlNUQlMjBob21lbGVzc25lc3MlMjAoJTIwb3IlMjBob3VzZWxlc3NuZXNzJTIwYXMlMjBnZW9yZ2UlMjBjYXJsaW4lMjBzdGF0ZWQlMjApJTIwaGFzJTIwYmVlbiUyMGFuJTIwaXNzdWUlMjBmb3IlMjB5ZWFycyUyMGJ1dCUyMG5ldmVyJTIwYSUyMHBsYW4lMjB0byUyMGhlbHAlMjB0aG9zZSUyMG9uJTIwdGhlJTIwc3RyZWV0JTIwdGhhdCUyMHdlcmUlMjBvbmNlJTIwY29uc2lkZXJlZCUyMGh1bWFuJTIwd2hvJTIwZGlkJTIwZXZlcnl0aGluZyUyMGZyb20lMjBnb2luZyUyMHRvJTIwc2Nob29sJTJDJTIwd29yayUyQyUyMG9yJTIwdm90ZSUyMGZvciUyMHRoZSUyMG1hdHRlci4lMjBtb3N0JTIwcGVvcGxlJTIwdGhpbmslMjBvZiUyMHRoZSUyMGhvbWVsZXNzJTIy",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>',wrap:!1}}),zs=new h({props:{code:"dG9rZW5pemVyLmRlY29kZShsbV9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCMSU1RCU1QiUyMmxhYmVscyUyMiU1RCk=",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>])',wrap:!1}}),Ns=new h({props:{code:"JTIyLi4uLiUyMGF0Li4uLi4uLi4uLiUyMGhpZ2guJTIwYSUyMGNsYXNzaWMlMjBsaW5lJTIwJTNBJTIwaW5zcGVjdG9yJTIwJTNBJTIwaSdtJTIwaGVyZSUyMHRvJTIwc2FjayUyMG9uZSUyMG9mJTIweW91ciUyMHRlYWNoZXJzLiUyMHN0dWRlbnQlMjAlM0ElMjB3ZWxjb21lJTIwdG8lMjBicm9td2VsbCUyMGhpZ2guJTIwaSUyMGV4cGVjdCUyMHRoYXQlMjBtYW55JTIwYWR1bHRzJTIwb2YlMjBteSUyMGFnZSUyMHRoaW5rJTIwdGhhdCUyMGJyb213ZWxsJTIwaGlnaCUyMGlzJTIwZmFyJTIwZmV0Y2hlZC4lMjB3aGF0JTIwYSUyMHBpdHklMjB0aGF0JTIwaXQlMjBpc24ndCElMjAlNUJTRVAlNUQlMjAlNUJDTFMlNUQlMjBob21lbGVzc25lc3MlMjAoJTIwb3IlMjBob3VzZWxlc3NuZXNzJTIwYXMlMjBnZW9yZ2UlMjBjYXJsaW4lMjBzdGF0ZWQlMjApJTIwaGFzJTIwYmVlbiUyMGFuJTIwaXNzdWUlMjBmb3IlMjB5ZWFycyUyMGJ1dCUyMG5ldmVyJTIwYSUyMHBsYW4lMjB0byUyMGhlbHAlMjB0aG9zZSUyMG9uJTIwdGhlJTIwc3RyZWV0JTIwdGhhdCUyMHdlcmUlMjBvbmNlJTIwY29uc2lkZXJlZCUyMGh1bWFuJTIwd2hvJTIwZGlkJTIwZXZlcnl0aGluZyUyMGZyb20lMjBnb2luZyUyMHRvJTIwc2Nob29sJTJDJTIwd29yayUyQyUyMG9yJTIwdm90ZSUyMGZvciUyMHRoZSUyMG1hdHRlci4lMjBtb3N0JTIwcGVvcGxlJTIwdGhpbmslMjBvZiUyMHRoZSUyMGhvbWVsZXNzJTIy",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>',wrap:!1}}),Fs=new Fl({props:{title:"Дообучение DistilBERT с помощью API Trainer",local:"fine-tuning-distilbert-with-the-trainer-api",headingTag:"h2"}}),Hs=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvckZvckxhbmd1YWdlTW9kZWxpbmclMEElMEFkYXRhX2NvbGxhdG9yJTIwJTNEJTIwRGF0YUNvbGxhdG9yRm9yTGFuZ3VhZ2VNb2RlbGluZyh0b2tlbml6ZXIlM0R0b2tlbml6ZXIlMkMlMjBtbG1fcHJvYmFiaWxpdHklM0QwLjE1KQ==",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>)`,wrap:!1}}),Ls=new h({props:{code:"c2FtcGxlcyUyMCUzRCUyMCU1QmxtX2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUJpJTVEJTIwZm9yJTIwaSUyMGluJTIwcmFuZ2UoMiklNUQlMEFmb3IlMjBzYW1wbGUlMjBpbiUyMHNhbXBsZXMlM0ElMEElMjAlMjAlMjAlMjBfJTIwJTNEJTIwc2FtcGxlLnBvcCglMjJ3b3JkX2lkcyUyMiklMEElMEFmb3IlMjBjaHVuayUyMGluJTIwZGF0YV9jb2xsYXRvcihzYW1wbGVzKSU1QiUyMmlucHV0X2lkcyUyMiU1RCUzQSUwQSUyMCUyMCUyMCUyMHByaW50KGYlMjIlNUNuJyUzRSUzRSUzRSUyMCU3QnRva2VuaXplci5kZWNvZGUoY2h1bmspJTdEJyUyMik=",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>)`,wrap:!1}}),qs=new h({props:{code:"JyUzRSUzRSUzRSUyMCU1QkNMUyU1RCUyMGJyb213ZWxsJTIwJTVCTUFTSyU1RCUyMGlzJTIwYSUyMGNhcnRvb24lMjBjb21lZHkuJTIwaXQlMjByYW4lMjBhdCUyMHRoZSUyMHNhbWUlMjAlNUJNQVNLJTVEJTIwYXMlMjBzb21lJTIwb3RoZXIlMjAlNUJNQVNLJTVEJTIwYWJvdXQlMjBzY2hvb2wlMjBsaWZlJTJDJTIwJTVCTUFTSyU1RCUyMGFzJTIwJTIyJTIwdGVhY2hlcnMlMjAlMjIuJTIwJTVCTUFTSyU1RCUyMCU1Qk1BU0slNUQlMjAlNUJNQVNLJTVEJTIwaW4lMjB0aGUlMjB0ZWFjaGluZyUyMCU1Qk1BU0slNUQlMjBsZWFkJTIwJTVCTUFTSyU1RCUyMHRvJTIwYmVsaWV2ZSUyMHRoYXQlMjBicm9td2VsbCUyMGhpZ2glNUMnJTVCTUFTSyU1RCUyMHNhdGlyZSUyMGlzJTIwbXVjaCUyMGNsb3NlciUyMHRvJTIwcmVhbGl0eSUyMHRoYW4lMjBpcyUyMCUyMiUyMHRlYWNoZXJzJTIwJTIyLiUyMHRoZSUyMHNjcmFtYmxlJTIwJTVCTUFTSyU1RCUyMCU1Qk1BU0slNUQlMjBmaW5hbmNpYWxseSUyQyUyMHRoZSUyMCU1Qk1BU0slNURmdWwlMjBzdHVkZW50cyUyMHdob2duJTIwJTVCTUFTSyU1RCUyMHJpZ2h0JTIwdGhyb3VnaCUyMCU1Qk1BU0slNUQlMjBwYXRoZXRpYyUyMHRlYWNoZXJzJTVDJ3BvbXAlMkMlMjB0aGUlMjBwZXR0aW5lc3MlMjBvZiUyMHRoZSUyMHdob2xlJTIwc2l0dWF0aW9uJTJDJTIwZGlzdGluY3Rpb24lMjByZW1pbmQlMjBtZSUyMG9mJTIwdGhlJTIwc2Nob29scyUyMGklMjBrbmV3JTIwYW5kJTIwdGhlaXIlMjBzdHVkZW50cy4lMjB3aGVuJTIwaSUyMHNhdyUyMCU1Qk1BU0slNUQlMjBlcGlzb2RlJTIwaW4lMjAlNUJNQVNLJTVEJTIwYSUyMHN0dWRlbnQlMjByZXBlYXRlZGx5JTIwdHJpZWQlMjB0byUyMGJ1cm4lMjBkb3duJTIwdGhlJTIwc2Nob29sJTJDJTIwJTVCTUFTSyU1RCUyMGltbWVkaWF0ZWx5JTIwcmVjYWxsZWQuJTIwJTVCTUFTSyU1RC4uLiclMEElMEEnJTNFJTNFJTNFJTIwLi4uLiUyMGF0Li4lMjAlNUJNQVNLJTVELi4uJTIwJTVCTUFTSyU1RC4uLiUyMGhpZ2guJTIwYSUyMGNsYXNzaWMlMjBsaW5lJTIwcGx1Y2tlZCUyMGluc3BlY3RvciUyMCUzQSUyMGklNUMnJTVCTUFTSyU1RCUyMGhlcmUlMjB0byUyMCU1Qk1BU0slNUQlMjBvbmUlMjBvZiUyMHlvdXIlMjAlNUJNQVNLJTVELiUyMHN0dWRlbnQlMjAlM0ElMjB3ZWxjb21lJTIwdG8lMjBicm9td2VsbCUyMCU1Qk1BU0slNUQuJTIwaSUyMGV4cGVjdCUyMHRoYXQlMjBtYW55JTIwYWR1bHRzJTIwb2YlMjBteSUyMGFnZSUyMHRoaW5rJTIwdGhhdCUyMCU1Qk1BU0slNURtd2VsbCUyMCU1Qk1BU0slNUQlMjBpcyUyMCU1Qk1BU0slNUQlMjBmZXRjaGVkLiUyMHdoYXQlMjBhJTIwcGl0eSUyMHRoYXQlMjBpdCUyMGlzbiU1Qyd0ISUyMCU1QlNFUCU1RCUyMCU1QkNMUyU1RCUyMCU1Qk1BU0slNURuZXNzJTIwKCUyMG9yJTIwJTVCTUFTSyU1RGxlc3NuZXNzJTIwYXMlMjBnZW9yZ2UlMjAlRTUlQUUlODdpbiUyMHN0YXRlZCUyMCklRTUlODUlQUMlMjBiZWVuJTIwYW4lMjBpc3N1ZSUyMGZvciUyMHllYXJzJTIwYnV0JTIwbmV2ZXIlMjAlNUJNQVNLJTVEJTIwcGxhbiUyMHRvJTIwaGVscCUyMHRob3NlJTIwb24lMjB0aGUlMjBzdHJlZXQlMjB0aGF0JTIwd2VyZSUyMG9uY2UlMjBjb25zaWRlcmVkJTIwaHVtYW4lMjAlNUJNQVNLJTVEJTIwZGlkJTIwZXZlcnl0aGluZyUyMGZyb20lMjBnb2luZyUyMHRvJTIwc2Nob29sJTJDJTIwJTVCTUFTSyU1RCUyQyUyMCU1Qk1BU0slNUQlMjB2b3RlJTIwZm9yJTIwdGhlJTIwbWF0dGVyLiUyMG1vc3QlMjBwZW9wbGUlMjB0aGluayUyMCU1Qk1BU0slNUQlMjB0aGUlMjBob21lbGVzcyc=",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 宇in stated )公 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>`,wrap:!1}}),xl=new vl({props:{$$slots:{default:[In]},$$scope:{ctx:I}}});let sl=I[0]==="pt"&&ln();const Ea=[Vn,fn],ge=[];function Xa(l,s){return l[0]==="pt"?0:1}wl=Xa(I),rl=ge[wl]=Ea[wl](I),le=new h({props:{code:"c2FtcGxlcyUyMCUzRCUyMCU1QmxtX2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUJpJTVEJTIwZm9yJTIwaSUyMGluJTIwcmFuZ2UoMiklNUQlMEFiYXRjaCUyMCUzRCUyMHdob2xlX3dvcmRfbWFza2luZ19kYXRhX2NvbGxhdG9yKHNhbXBsZXMpJTBBJTBBZm9yJTIwY2h1bmslMjBpbiUyMGJhdGNoJTVCJTIyaW5wdXRfaWRzJTIyJTVEJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMiU1Q24nJTNFJTNFJTNFJTIwJTdCdG9rZW5pemVyLmRlY29kZShjaHVuayklN0QnJTIyKQ==",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>)`,wrap:!1}}),se=new h({props:{code:"JyUzRSUzRSUzRSUyMCU1QkNMUyU1RCUyMGJyb213ZWxsJTIwaGlnaCUyMGlzJTIwYSUyMGNhcnRvb24lMjBjb21lZHklMjAlNUJNQVNLJTVEJTIwaXQlMjByYW4lMjBhdCUyMHRoZSUyMHNhbWUlMjB0aW1lJTIwYXMlMjBzb21lJTIwb3RoZXIlMjBwcm9ncmFtcyUyMGFib3V0JTIwc2Nob29sJTIwbGlmZSUyQyUyMHN1Y2glMjBhcyUyMCUyMiUyMHRlYWNoZXJzJTIwJTIyLiUyMG15JTIwMzUlMjB5ZWFycyUyMGluJTIwdGhlJTIwdGVhY2hpbmclMjBwcm9mZXNzaW9uJTIwbGVhZCUyMG1lJTIwdG8lMjBiZWxpZXZlJTIwdGhhdCUyMGJyb213ZWxsJTIwaGlnaCU1QydzJTIwc2F0aXJlJTIwaXMlMjBtdWNoJTIwY2xvc2VyJTIwdG8lMjByZWFsaXR5JTIwdGhhbiUyMGlzJTIwJTIyJTIwdGVhY2hlcnMlMjAlMjIuJTIwdGhlJTIwc2NyYW1ibGUlMjB0byUyMHN1cnZpdmUlMjBmaW5hbmNpYWxseSUyQyUyMHRoZSUyMGluc2lnaHRmdWwlMjBzdHVkZW50cyUyMHdobyUyMGNhbiUyMHNlZSUyMHJpZ2h0JTIwdGhyb3VnaCUyMHRoZWlyJTIwcGF0aGV0aWMlMjB0ZWFjaGVycyU1Qydwb21wJTJDJTIwdGhlJTIwcGV0dGluZXNzJTIwb2YlMjB0aGUlMjB3aG9sZSUyMHNpdHVhdGlvbiUyQyUyMGFsbCUyMHJlbWluZCUyMG1lJTIwb2YlMjB0aGUlMjBzY2hvb2xzJTIwaSUyMGtuZXclMjBhbmQlMjB0aGVpciUyMHN0dWRlbnRzLiUyMHdoZW4lMjBpJTIwc2F3JTIwdGhlJTIwZXBpc29kZSUyMGluJTIwd2hpY2glMjBhJTIwc3R1ZGVudCUyMHJlcGVhdGVkbHklMjB0cmllZCUyMHRvJTIwYnVybiUyMGRvd24lMjB0aGUlMjBzY2hvb2wlMkMlMjBpJTIwaW1tZWRpYXRlbHklMjByZWNhbGxlZC4uLi4uJyUwQSUwQSclM0UlM0UlM0UlMjAuLi4uJTIwJTVCTUFTSyU1RCUyMCU1Qk1BU0slNUQlMjAlNUJNQVNLJTVEJTIwJTVCTUFTSyU1RC4uLi4uLi4lMjBoaWdoLiUyMGElMjBjbGFzc2ljJTIwbGluZSUyMCUzQSUyMGluc3BlY3RvciUyMCUzQSUyMGklNUMnbSUyMGhlcmUlMjB0byUyMHNhY2slMjBvbmUlMjBvZiUyMHlvdXIlMjB0ZWFjaGVycy4lMjBzdHVkZW50JTIwJTNBJTIwd2VsY29tZSUyMHRvJTIwYnJvbXdlbGwlMjBoaWdoLiUyMGklMjBleHBlY3QlMjB0aGF0JTIwbWFueSUyMGFkdWx0cyUyMG9mJTIwbXklMjBhZ2UlMjB0aGluayUyMHRoYXQlMjBicm9td2VsbCUyMGhpZ2glMjBpcyUyMGZhciUyMGZldGNoZWQuJTIwd2hhdCUyMGElMjBwaXR5JTIwdGhhdCUyMGl0JTIwaXNuJTVDJ3QhJTIwJTVCU0VQJTVEJTIwJTVCQ0xTJTVEJTIwaG9tZWxlc3NuZXNzJTIwKCUyMG9yJTIwaG91c2VsZXNzbmVzcyUyMGFzJTIwZ2VvcmdlJTIwY2FybGluJTIwc3RhdGVkJTIwKSUyMGhhcyUyMGJlZW4lMjBhbiUyMGlzc3VlJTIwZm9yJTIweWVhcnMlMjBidXQlMjBuZXZlciUyMGElMjBwbGFuJTIwdG8lMjBoZWxwJTIwdGhvc2UlMjBvbiUyMHRoZSUyMHN0cmVldCUyMHRoYXQlMjB3ZXJlJTIwb25jZSUyMGNvbnNpZGVyZWQlMjBodW1hbiUyMHdobyUyMGRpZCUyMGV2ZXJ5dGhpbmclMjBmcm9tJTIwZ29pbmclMjB0byUyMHNjaG9vbCUyQyUyMHdvcmslMkMlMjBvciUyMHZvdGUlMjBmb3IlMjB0aGUlMjBtYXR0ZXIuJTIwbW9zdCUyMHBlb3BsZSUyMHRoaW5rJTIwb2YlMjB0aGUlMjBob21lbGVzcyc=",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>`,wrap:!1}}),Sl=new vl({props:{$$slots:{default:[_n]},$$scope:{ctx:I}}}),te=new h({props:{code:"dHJhaW5fc2l6ZSUyMCUzRCUyMDEwXzAwMCUwQXRlc3Rfc2l6ZSUyMCUzRCUyMGludCgwLjElMjAqJTIwdHJhaW5fc2l6ZSklMEElMEFkb3duc2FtcGxlZF9kYXRhc2V0JTIwJTNEJTIwbG1fZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RC50cmFpbl90ZXN0X3NwbGl0KCUwQSUyMCUyMCUyMCUyMHRyYWluX3NpemUlM0R0cmFpbl9zaXplJTJDJTIwdGVzdF9zaXplJTNEdGVzdF9zaXplJTJDJTIwc2VlZCUzRDQyJTBBKSUwQWRvd25zYW1wbGVkX2RhdGFzZXQ=",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`,wrap:!1}}),Me=new h({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdpbnB1dF9pZHMnJTJDJTIwJ2xhYmVscyclMkMlMjAnd29yZF9pZHMnJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX3Jvd3MlM0ElMjAxMDAwMCUwQSUyMCUyMCUyMCUyMCU3RCklMEElMjAlMjAlMjAlMjB0ZXN0JTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidhdHRlbnRpb25fbWFzayclMkMlMjAnaW5wdXRfaWRzJyUyQyUyMCdsYWJlbHMnJTJDJTIwJ3dvcmRfaWRzJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMTAwMCUwQSUyMCUyMCUyMCUyMCU3RCklMEElN0Qp",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>
    })
})`,wrap:!1}}),ne=new h({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMG5vdGVib29rX2xvZ2luJTBBJTBBbm90ZWJvb2tfbG9naW4oKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`,wrap:!1}}),Ue=new h({props:{code:"aHVnZ2luZ2ZhY2UtY2xpJTIwbG9naW4=",highlighted:'huggingface-<span class="hljs-keyword">cli</span> login',wrap:!1}});const Aa=[Rn,Qn],Be=[];function $a(l,s){return l[0]==="tf"?0:1}Tl=$a(I),cl=Be[Tl]=Aa[Tl](I),ie=new Fl({props:{title:"Перплексия языковых моделей",local:"perplexity-for-language-models",headingTag:"h3"}}),ye=new ZM({props:{id:"NURcDHhYe98"}});const Wa=[gn,Gn],ke=[];function xa(l,s){return l[0]==="pt"?0:1}ol=xa(I),dl=ke[ol]=Wa[ol](I),re=new h({props:{code:"UGVycGxleGl0eSUzQSUyMDIxLjc1",highlighted:'<span class="hljs-meta">&gt;&gt;&gt; </span>Perplexity: <span class="hljs-number">21.75</span>',wrap:!1}});const Sa=[kn,Bn],Ze=[];function za(l,s){return l[0]==="pt"?0:1}ml=za(I),jl=Ze[ml]=Sa[ml](I);const Na=[En,Zn],Ee=[];function va(l,s){return l[0]==="pt"?0:1}Cl=va(I),ul=Ee[Cl]=Na[Cl](I),oe=new h({props:{code:"UGVycGxleGl0eSUzQSUyMDExLjMy",highlighted:'<span class="hljs-meta">&gt;&gt;&gt; </span>Perplexity: <span class="hljs-number">11.32</span>',wrap:!1}});let x=I[0]==="pt"&&sn();zl=new vl({props:{$$slots:{default:[Xn]},$$scope:{ctx:I}}});let S=I[0]==="pt"&&en();return me=new Fl({props:{title:"Использование нашей дообученной модели",local:"using-our-fine-tuned-model",headingTag:"h2"}}),Ce=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMHBpcGVsaW5lJTBBJTBBbWFza19maWxsZXIlMjAlM0QlMjBwaXBlbGluZSglMEElMjAlMjAlMjAlMjAlMjJmaWxsLW1hc2slMjIlMkMlMjBtb2RlbCUzRCUyMmh1Z2dpbmdmYWNlLWNvdXJzZSUyRmRpc3RpbGJlcnQtYmFzZS11bmNhc2VkLWZpbmV0dW5lZC1pbWRiJTIyJTBBKQ==",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>
)`,wrap:!1}}),he=new h({props:{code:"cHJlZHMlMjAlM0QlMjBtYXNrX2ZpbGxlcih0ZXh0KSUwQSUwQWZvciUyMHByZWQlMjBpbiUyMHByZWRzJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMiUzRSUzRSUzRSUyMCU3QnByZWQlNUInc2VxdWVuY2UnJTVEJTdEJTIyKQ==",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>)`,wrap:!1}}),be=new h({props:{code:"JyUzRSUzRSUzRSUyMHRoaXMlMjBpcyUyMGElMjBncmVhdCUyMG1vdmllLiclMEEnJTNFJTNFJTNFJTIwdGhpcyUyMGlzJTIwYSUyMGdyZWF0JTIwZmlsbS4nJTBBJyUzRSUzRSUzRSUyMHRoaXMlMjBpcyUyMGElMjBncmVhdCUyMHN0b3J5LiclMEEnJTNFJTNFJTNFJTIwdGhpcyUyMGlzJTIwYSUyMGdyZWF0JTIwbW92aWVzLiclMEEnJTNFJTNFJTNFJTIwdGhpcyUyMGlzJTIwYSUyMGdyZWF0JTIwY2hhcmFjdGVyLic=",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>`,wrap:!1}}),fe=new ZM({props:{id:"0Oxphw4Q9fo"}}),Nl=new vl({props:{$$slots:{default:[An]},$$scope:{ctx:I}}}),_e=new rn({props:{source:"https://github.com/huggingface/course/blob/main/chapters/ru/chapter7/3.mdx"}}),{c(){M=d("meta"),w=n(),a=d("p"),y=n(),r(_.$$.fragment),j=n(),r(B.$$.fragment),Z=n(),k.c(),g=n(),G=d("p"),G.textContent=u,Q=n(),A=d("p"),A.textContent=z,f=n(),E=d("p"),E.innerHTML=Y,R=n(),X=d("div"),X.innerHTML=bl,Ql=n(),H=d("p"),H.innerHTML=ve,Rl=n(),$=d("iframe"),tl=n(),Il=d("p"),Il.textContent=Dl,Ml=n(),r(al.$$.fragment),nl=n(),r(il.$$.fragment),Gl=n(),r(D.$$.fragment),gl=n(),L=d("p"),L.innerHTML=Fe,Bl=n(),N=d("div"),N.innerHTML=Ll,Jl=n(),fl=d("p"),fl.innerHTML=ql,Ul=n(),W.c(),yl=n(),q=d("p"),q.textContent=Ye,kl=n(),r(K.$$.fragment),Zl=n(),P=d("p"),P.innerHTML=He,El=n(),r(O.$$.fragment),Xl=n(),ll=d("p"),ll.textContent=Kl,pl=n(),F.c(),U=n(),r(b.$$.fragment),Le=n(),Pl=d("p"),Pl.textContent=vM,qe=n(),r(Ol.$$.fragment),Ke=n(),ls=d("p"),ls.innerHTML=FM,Pe=n(),r(ss.$$.fragment),Oe=n(),r(es.$$.fragment),lt=n(),ts=d("p"),ts.innerHTML=YM,st=n(),r(Ms.$$.fragment),et=n(),r(as.$$.fragment),tt=n(),ns=d("p"),ns.innerHTML=HM,Mt=n(),r(Al.$$.fragment),at=n(),Js=d("p"),Js.innerHTML=DM,nt=n(),r(Us.$$.fragment),Jt=n(),r(ps.$$.fragment),Ut=n(),is=d("p"),is.textContent=LM,pt=n(),ys=d("p"),ys.innerHTML=qM,it=n(),r(ws.$$.fragment),yt=n(),r(rs.$$.fragment),wt=n(),Ts=d("p"),Ts.innerHTML=KM,rt=n(),cs=d("p"),cs.innerHTML=PM,Tt=n(),r(os.$$.fragment),ct=n(),r(ds.$$.fragment),ot=n(),ms=d("p"),ms.innerHTML=OM,dt=n(),r($l.$$.fragment),mt=n(),js=d("p"),js.textContent=la,jt=n(),r(Cs.$$.fragment),Ct=n(),r(Wl.$$.fragment),ut=n(),us=d("p"),us.textContent=sa,ht=n(),r(hs.$$.fragment),bt=n(),r(bs.$$.fragment),It=n(),Is=d("p"),Is.textContent=ea,ft=n(),r(fs.$$.fragment),Vt=n(),r(Vs.$$.fragment),_t=n(),_s=d("p"),_s.innerHTML=ta,Qt=n(),r(Qs.$$.fragment),Rt=n(),r(Rs.$$.fragment),Gt=n(),Gs=d("p"),Gs.textContent=Ma,gt=n(),gs=d("ul"),gs.innerHTML=aa,Bt=n(),Bs=d("p"),Bs.textContent=na,kt=n(),r(ks.$$.fragment),Zt=n(),Zs=d("p"),Zs.innerHTML=Ja,Et=n(),Es=d("p"),Es.innerHTML=Ua,Xt=n(),r(Xs.$$.fragment),At=n(),r(As.$$.fragment),$t=n(),$s=d("p"),$s.innerHTML=pa,Wt=n(),r(Ws.$$.fragment),xt=n(),r(xs.$$.fragment),St=n(),Ss=d("p"),Ss.textContent=ia,zt=n(),r(zs.$$.fragment),Nt=n(),r(Ns.$$.fragment),vt=n(),vs=d("p"),vs.innerHTML=ya,Ft=n(),r(Fs.$$.fragment),Yt=n(),Ys=d("p"),Ys.innerHTML=wa,Ht=n(),r(Hs.$$.fragment),Dt=n(),Ds=d("p"),Ds.innerHTML=ra,Lt=n(),r(Ls.$$.fragment),qt=n(),r(qs.$$.fragment),Kt=n(),Ks=d("p"),Ks.innerHTML=Ta,Pt=n(),r(xl.$$.fragment),Ot=n(),sl&&sl.c(),Xe=n(),Ps=d("p"),Ps.innerHTML=ca,lM=n(),rl.c(),Ae=n(),Os=d("p"),Os.textContent=oa,sM=n(),r(le.$$.fragment),eM=n(),r(se.$$.fragment),tM=n(),r(Sl.$$.fragment),MM=n(),ee=d("p"),ee.innerHTML=da,aM=n(),r(te.$$.fragment),nM=n(),r(Me.$$.fragment),JM=n(),ae=d("p"),ae.innerHTML=ma,UM=n(),r(ne.$$.fragment),pM=n(),Je=d("p"),Je.textContent=ja,iM=n(),r(Ue.$$.fragment),yM=n(),pe=d("p"),pe.textContent=Ca,wM=n(),cl.c(),$e=n(),r(ie.$$.fragment),rM=n(),r(ye.$$.fragment),TM=n(),we=d("p"),we.textContent=ua,cM=n(),dl.c(),We=n(),r(re.$$.fragment),oM=n(),Te=d("p"),Te.textContent=ha,dM=n(),jl.c(),xe=n(),ce=d("p"),ce.textContent=ba,mM=n(),ul.c(),Se=n(),r(oe.$$.fragment),jM=n(),de=d("p"),de.textContent=Ia,CM=n(),x&&x.c(),ze=n(),r(zl.$$.fragment),uM=n(),S&&S.c(),Ne=n(),r(me.$$.fragment),hM=n(),je=d("p"),je.innerHTML=fa,bM=n(),r(Ce.$$.fragment),IM=n(),ue=d("p"),ue.textContent=Va,fM=n(),r(he.$$.fragment),VM=n(),r(be.$$.fragment),_M=n(),Ie=d("p"),Ie.textContent=_a,QM=n(),r(fe.$$.fragment),RM=n(),Ve=d("p"),Ve.innerHTML=Qa,GM=n(),r(Nl.$$.fragment),gM=n(),r(_e.$$.fragment),BM=n(),De=d("p"),this.h()},l(l){const s=pn("svelte-u9bgzb",document.head);M=m(s,"META",{name:!0,content:!0}),s.forEach(e),w=J(l),a=m(l,"P",{}),NM(a).forEach(e),y=J(l),T(_.$$.fragment,l),j=J(l),T(B.$$.fragment,l),Z=J(l),k.l(l),g=J(l),G=m(l,"P",{"data-svelte-h":!0}),C(G)!=="svelte-iqszwe"&&(G.textContent=u),Q=J(l),A=m(l,"P",{"data-svelte-h":!0}),C(A)!=="svelte-ch530"&&(A.textContent=z),f=J(l),E=m(l,"P",{"data-svelte-h":!0}),C(E)!=="svelte-14frpur"&&(E.innerHTML=Y),R=J(l),X=m(l,"DIV",{class:!0,"data-svelte-h":!0}),C(X)!=="svelte-1lvgpuv"&&(X.innerHTML=bl),Ql=J(l),H=m(l,"P",{"data-svelte-h":!0}),C(H)!=="svelte-73lxfi"&&(H.innerHTML=ve),Rl=J(l),$=m(l,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),NM($).forEach(e),tl=J(l),Il=m(l,"P",{"data-svelte-h":!0}),C(Il)!=="svelte-1akavkz"&&(Il.textContent=Dl),Ml=J(l),T(al.$$.fragment,l),nl=J(l),T(il.$$.fragment,l),Gl=J(l),T(D.$$.fragment,l),gl=J(l),L=m(l,"P",{"data-svelte-h":!0}),C(L)!=="svelte-qmyurd"&&(L.innerHTML=Fe),Bl=J(l),N=m(l,"DIV",{class:!0,"data-svelte-h":!0}),C(N)!=="svelte-zc90xi"&&(N.innerHTML=Ll),Jl=J(l),fl=m(l,"P",{"data-svelte-h":!0}),C(fl)!=="svelte-hrfk5a"&&(fl.innerHTML=ql),Ul=J(l),W.l(l),yl=J(l),q=m(l,"P",{"data-svelte-h":!0}),C(q)!=="svelte-15ptjw1"&&(q.textContent=Ye),kl=J(l),T(K.$$.fragment,l),Zl=J(l),P=m(l,"P",{"data-svelte-h":!0}),C(P)!=="svelte-16agke4"&&(P.innerHTML=He),El=J(l),T(O.$$.fragment,l),Xl=J(l),ll=m(l,"P",{"data-svelte-h":!0}),C(ll)!=="svelte-bk5vqi"&&(ll.textContent=Kl),pl=J(l),F.l(l),U=J(l),T(b.$$.fragment,l),Le=J(l),Pl=m(l,"P",{"data-svelte-h":!0}),C(Pl)!=="svelte-wjppje"&&(Pl.textContent=vM),qe=J(l),T(Ol.$$.fragment,l),Ke=J(l),ls=m(l,"P",{"data-svelte-h":!0}),C(ls)!=="svelte-1mewutr"&&(ls.innerHTML=FM),Pe=J(l),T(ss.$$.fragment,l),Oe=J(l),T(es.$$.fragment,l),lt=J(l),ts=m(l,"P",{"data-svelte-h":!0}),C(ts)!=="svelte-1y9ssaf"&&(ts.innerHTML=YM),st=J(l),T(Ms.$$.fragment,l),et=J(l),T(as.$$.fragment,l),tt=J(l),ns=m(l,"P",{"data-svelte-h":!0}),C(ns)!=="svelte-n8begs"&&(ns.innerHTML=HM),Mt=J(l),T(Al.$$.fragment,l),at=J(l),Js=m(l,"P",{"data-svelte-h":!0}),C(Js)!=="svelte-1fb7s1s"&&(Js.innerHTML=DM),nt=J(l),T(Us.$$.fragment,l),Jt=J(l),T(ps.$$.fragment,l),Ut=J(l),is=m(l,"P",{"data-svelte-h":!0}),C(is)!=="svelte-hpmgt2"&&(is.textContent=LM),pt=J(l),ys=m(l,"P",{"data-svelte-h":!0}),C(ys)!=="svelte-zp01tx"&&(ys.innerHTML=qM),it=J(l),T(ws.$$.fragment,l),yt=J(l),T(rs.$$.fragment,l),wt=J(l),Ts=m(l,"P",{"data-svelte-h":!0}),C(Ts)!=="svelte-idzclc"&&(Ts.innerHTML=KM),rt=J(l),cs=m(l,"P",{"data-svelte-h":!0}),C(cs)!=="svelte-6vucye"&&(cs.innerHTML=PM),Tt=J(l),T(os.$$.fragment,l),ct=J(l),T(ds.$$.fragment,l),ot=J(l),ms=m(l,"P",{"data-svelte-h":!0}),C(ms)!=="svelte-1fux5bc"&&(ms.innerHTML=OM),dt=J(l),T($l.$$.fragment,l),mt=J(l),js=m(l,"P",{"data-svelte-h":!0}),C(js)!=="svelte-166e2o3"&&(js.textContent=la),jt=J(l),T(Cs.$$.fragment,l),Ct=J(l),T(Wl.$$.fragment,l),ut=J(l),us=m(l,"P",{"data-svelte-h":!0}),C(us)!=="svelte-nh51zn"&&(us.textContent=sa),ht=J(l),T(hs.$$.fragment,l),bt=J(l),T(bs.$$.fragment,l),It=J(l),Is=m(l,"P",{"data-svelte-h":!0}),C(Is)!=="svelte-1ipt0vw"&&(Is.textContent=ea),ft=J(l),T(fs.$$.fragment,l),Vt=J(l),T(Vs.$$.fragment,l),_t=J(l),_s=m(l,"P",{"data-svelte-h":!0}),C(_s)!=="svelte-1b7ia64"&&(_s.innerHTML=ta),Qt=J(l),T(Qs.$$.fragment,l),Rt=J(l),T(Rs.$$.fragment,l),Gt=J(l),Gs=m(l,"P",{"data-svelte-h":!0}),C(Gs)!=="svelte-19uaq6h"&&(Gs.textContent=Ma),gt=J(l),gs=m(l,"UL",{"data-svelte-h":!0}),C(gs)!=="svelte-3dn5dz"&&(gs.innerHTML=aa),Bt=J(l),Bs=m(l,"P",{"data-svelte-h":!0}),C(Bs)!=="svelte-q2k4r0"&&(Bs.textContent=na),kt=J(l),T(ks.$$.fragment,l),Zt=J(l),Zs=m(l,"P",{"data-svelte-h":!0}),C(Zs)!=="svelte-t25o3l"&&(Zs.innerHTML=Ja),Et=J(l),Es=m(l,"P",{"data-svelte-h":!0}),C(Es)!=="svelte-ifa5r7"&&(Es.innerHTML=Ua),Xt=J(l),T(Xs.$$.fragment,l),At=J(l),T(As.$$.fragment,l),$t=J(l),$s=m(l,"P",{"data-svelte-h":!0}),C($s)!=="svelte-1mg7lr5"&&($s.innerHTML=pa),Wt=J(l),T(Ws.$$.fragment,l),xt=J(l),T(xs.$$.fragment,l),St=J(l),Ss=m(l,"P",{"data-svelte-h":!0}),C(Ss)!=="svelte-11zjuzf"&&(Ss.textContent=ia),zt=J(l),T(zs.$$.fragment,l),Nt=J(l),T(Ns.$$.fragment,l),vt=J(l),vs=m(l,"P",{"data-svelte-h":!0}),C(vs)!=="svelte-y2kbvm"&&(vs.innerHTML=ya),Ft=J(l),T(Fs.$$.fragment,l),Yt=J(l),Ys=m(l,"P",{"data-svelte-h":!0}),C(Ys)!=="svelte-yf2jqq"&&(Ys.innerHTML=wa),Ht=J(l),T(Hs.$$.fragment,l),Dt=J(l),Ds=m(l,"P",{"data-svelte-h":!0}),C(Ds)!=="svelte-13e9r96"&&(Ds.innerHTML=ra),Lt=J(l),T(Ls.$$.fragment,l),qt=J(l),T(qs.$$.fragment,l),Kt=J(l),Ks=m(l,"P",{"data-svelte-h":!0}),C(Ks)!=="svelte-1p2lr0r"&&(Ks.innerHTML=Ta),Pt=J(l),T(xl.$$.fragment,l),Ot=J(l),sl&&sl.l(l),Xe=J(l),Ps=m(l,"P",{"data-svelte-h":!0}),C(Ps)!=="svelte-icnbns"&&(Ps.innerHTML=ca),lM=J(l),rl.l(l),Ae=J(l),Os=m(l,"P",{"data-svelte-h":!0}),C(Os)!=="svelte-rtkopz"&&(Os.textContent=oa),sM=J(l),T(le.$$.fragment,l),eM=J(l),T(se.$$.fragment,l),tM=J(l),T(Sl.$$.fragment,l),MM=J(l),ee=m(l,"P",{"data-svelte-h":!0}),C(ee)!=="svelte-19foedi"&&(ee.innerHTML=da),aM=J(l),T(te.$$.fragment,l),nM=J(l),T(Me.$$.fragment,l),JM=J(l),ae=m(l,"P",{"data-svelte-h":!0}),C(ae)!=="svelte-q8q7d6"&&(ae.innerHTML=ma),UM=J(l),T(ne.$$.fragment,l),pM=J(l),Je=m(l,"P",{"data-svelte-h":!0}),C(Je)!=="svelte-1i8i5bb"&&(Je.textContent=ja),iM=J(l),T(Ue.$$.fragment,l),yM=J(l),pe=m(l,"P",{"data-svelte-h":!0}),C(pe)!=="svelte-8qvh52"&&(pe.textContent=Ca),wM=J(l),cl.l(l),$e=J(l),T(ie.$$.fragment,l),rM=J(l),T(ye.$$.fragment,l),TM=J(l),we=m(l,"P",{"data-svelte-h":!0}),C(we)!=="svelte-95htht"&&(we.textContent=ua),cM=J(l),dl.l(l),We=J(l),T(re.$$.fragment,l),oM=J(l),Te=m(l,"P",{"data-svelte-h":!0}),C(Te)!=="svelte-vs1w8g"&&(Te.textContent=ha),dM=J(l),jl.l(l),xe=J(l),ce=m(l,"P",{"data-svelte-h":!0}),C(ce)!=="svelte-82rs8l"&&(ce.textContent=ba),mM=J(l),ul.l(l),Se=J(l),T(oe.$$.fragment,l),jM=J(l),de=m(l,"P",{"data-svelte-h":!0}),C(de)!=="svelte-1e2ht4"&&(de.textContent=Ia),CM=J(l),x&&x.l(l),ze=J(l),T(zl.$$.fragment,l),uM=J(l),S&&S.l(l),Ne=J(l),T(me.$$.fragment,l),hM=J(l),je=m(l,"P",{"data-svelte-h":!0}),C(je)!=="svelte-1mdm08v"&&(je.innerHTML=fa),bM=J(l),T(Ce.$$.fragment,l),IM=J(l),ue=m(l,"P",{"data-svelte-h":!0}),C(ue)!=="svelte-1rx6fjq"&&(ue.textContent=Va),fM=J(l),T(he.$$.fragment,l),VM=J(l),T(be.$$.fragment,l),_M=J(l),Ie=m(l,"P",{"data-svelte-h":!0}),C(Ie)!=="svelte-18km24e"&&(Ie.textContent=_a),QM=J(l),T(fe.$$.fragment,l),RM=J(l),Ve=m(l,"P",{"data-svelte-h":!0}),C(Ve)!=="svelte-1t497w4"&&(Ve.innerHTML=Qa),GM=J(l),T(Nl.$$.fragment,l),gM=J(l),T(_e.$$.fragment,l),BM=J(l),De=m(l,"P",{}),NM(De).forEach(e),this.h()},h(){hl(M,"name","hf:doc:metadata"),hl(M,"content",Wn),hl(X,"class","flex justify-center"),an($.src,Hl="https://course-demos-distilbert-base-uncased-finetuned-imdb.hf.space")||hl($,"src",Hl),hl($,"frameborder","0"),hl($,"height","300"),hl($,"title","Gradio app"),hl($,"class","block dark:hidden container p-0 flex-grow space-iframe"),hl($,"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"),hl($,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),hl(N,"class","flex justify-center")},m(l,s){yn(document.head,M),t(l,w,s),t(l,a,s),t(l,y,s),c(_,l,s),t(l,j,s),c(B,l,s),t(l,Z,s),Qe[V].m(l,s),t(l,g,s),t(l,G,s),t(l,Q,s),t(l,A,s),t(l,f,s),t(l,E,s),t(l,R,s),t(l,X,s),t(l,Ql,s),t(l,H,s),t(l,Rl,s),t(l,$,s),t(l,tl,s),t(l,Il,s),t(l,Ml,s),c(al,l,s),t(l,nl,s),c(il,l,s),t(l,Gl,s),c(D,l,s),t(l,gl,s),t(l,L,s),t(l,Bl,s),t(l,N,s),t(l,Jl,s),t(l,fl,s),t(l,Ul,s),Re[v].m(l,s),t(l,yl,s),t(l,q,s),t(l,kl,s),c(K,l,s),t(l,Zl,s),t(l,P,s),t(l,El,s),c(O,l,s),t(l,Xl,s),t(l,ll,s),t(l,pl,s),Ge[el].m(l,s),t(l,U,s),c(b,l,s),t(l,Le,s),t(l,Pl,s),t(l,qe,s),c(Ol,l,s),t(l,Ke,s),t(l,ls,s),t(l,Pe,s),c(ss,l,s),t(l,Oe,s),c(es,l,s),t(l,lt,s),t(l,ts,s),t(l,st,s),c(Ms,l,s),t(l,et,s),c(as,l,s),t(l,tt,s),t(l,ns,s),t(l,Mt,s),c(Al,l,s),t(l,at,s),t(l,Js,s),t(l,nt,s),c(Us,l,s),t(l,Jt,s),c(ps,l,s),t(l,Ut,s),t(l,is,s),t(l,pt,s),t(l,ys,s),t(l,it,s),c(ws,l,s),t(l,yt,s),c(rs,l,s),t(l,wt,s),t(l,Ts,s),t(l,rt,s),t(l,cs,s),t(l,Tt,s),c(os,l,s),t(l,ct,s),c(ds,l,s),t(l,ot,s),t(l,ms,s),t(l,dt,s),c($l,l,s),t(l,mt,s),t(l,js,s),t(l,jt,s),c(Cs,l,s),t(l,Ct,s),c(Wl,l,s),t(l,ut,s),t(l,us,s),t(l,ht,s),c(hs,l,s),t(l,bt,s),c(bs,l,s),t(l,It,s),t(l,Is,s),t(l,ft,s),c(fs,l,s),t(l,Vt,s),c(Vs,l,s),t(l,_t,s),t(l,_s,s),t(l,Qt,s),c(Qs,l,s),t(l,Rt,s),c(Rs,l,s),t(l,Gt,s),t(l,Gs,s),t(l,gt,s),t(l,gs,s),t(l,Bt,s),t(l,Bs,s),t(l,kt,s),c(ks,l,s),t(l,Zt,s),t(l,Zs,s),t(l,Et,s),t(l,Es,s),t(l,Xt,s),c(Xs,l,s),t(l,At,s),c(As,l,s),t(l,$t,s),t(l,$s,s),t(l,Wt,s),c(Ws,l,s),t(l,xt,s),c(xs,l,s),t(l,St,s),t(l,Ss,s),t(l,zt,s),c(zs,l,s),t(l,Nt,s),c(Ns,l,s),t(l,vt,s),t(l,vs,s),t(l,Ft,s),c(Fs,l,s),t(l,Yt,s),t(l,Ys,s),t(l,Ht,s),c(Hs,l,s),t(l,Dt,s),t(l,Ds,s),t(l,Lt,s),c(Ls,l,s),t(l,qt,s),c(qs,l,s),t(l,Kt,s),t(l,Ks,s),t(l,Pt,s),c(xl,l,s),t(l,Ot,s),sl&&sl.m(l,s),t(l,Xe,s),t(l,Ps,s),t(l,lM,s),ge[wl].m(l,s),t(l,Ae,s),t(l,Os,s),t(l,sM,s),c(le,l,s),t(l,eM,s),c(se,l,s),t(l,tM,s),c(Sl,l,s),t(l,MM,s),t(l,ee,s),t(l,aM,s),c(te,l,s),t(l,nM,s),c(Me,l,s),t(l,JM,s),t(l,ae,s),t(l,UM,s),c(ne,l,s),t(l,pM,s),t(l,Je,s),t(l,iM,s),c(Ue,l,s),t(l,yM,s),t(l,pe,s),t(l,wM,s),Be[Tl].m(l,s),t(l,$e,s),c(ie,l,s),t(l,rM,s),c(ye,l,s),t(l,TM,s),t(l,we,s),t(l,cM,s),ke[ol].m(l,s),t(l,We,s),c(re,l,s),t(l,oM,s),t(l,Te,s),t(l,dM,s),Ze[ml].m(l,s),t(l,xe,s),t(l,ce,s),t(l,mM,s),Ee[Cl].m(l,s),t(l,Se,s),c(oe,l,s),t(l,jM,s),t(l,de,s),t(l,CM,s),x&&x.m(l,s),t(l,ze,s),c(zl,l,s),t(l,uM,s),S&&S.m(l,s),t(l,Ne,s),c(me,l,s),t(l,hM,s),t(l,je,s),t(l,bM,s),c(Ce,l,s),t(l,IM,s),t(l,ue,s),t(l,fM,s),c(he,l,s),t(l,VM,s),c(be,l,s),t(l,_M,s),t(l,Ie,s),t(l,QM,s),c(fe,l,s),t(l,RM,s),t(l,Ve,s),t(l,GM,s),c(Nl,l,s),t(l,gM,s),c(_e,l,s),t(l,BM,s),t(l,De,s),kM=!0},p(l,[s]){const Fa={};s&1&&(Fa.fw=l[0]),_.$set(Fa);let EM=V;V=Ga(l),V!==EM&&(_l(),i(Qe[EM],1,1,()=>{Qe[EM]=null}),Vl(),k=Qe[V],k||(k=Qe[V]=Ra[V](l),k.c()),p(k,1),k.m(g.parentNode,g));const Ya={};s&2&&(Ya.$$scope={dirty:s,ctx:l}),il.$set(Ya);let XM=v;v=Ba(l),v!==XM&&(_l(),i(Re[XM],1,1,()=>{Re[XM]=null}),Vl(),W=Re[v],W||(W=Re[v]=ga[v](l),W.c()),p(W,1),W.m(yl.parentNode,yl));let AM=el;el=Za(l),el!==AM&&(_l(),i(Ge[AM],1,1,()=>{Ge[AM]=null}),Vl(),F=Ge[el],F||(F=Ge[el]=ka[el](l),F.c()),p(F,1),F.m(U.parentNode,U));const Ha={};s&2&&(Ha.$$scope={dirty:s,ctx:l}),Al.$set(Ha);const Da={};s&2&&(Da.$$scope={dirty:s,ctx:l}),$l.$set(Da);const La={};s&2&&(La.$$scope={dirty:s,ctx:l}),Wl.$set(La);const qa={};s&2&&(qa.$$scope={dirty:s,ctx:l}),xl.$set(qa),l[0]==="pt"?sl||(sl=ln(),sl.c(),sl.m(Xe.parentNode,Xe)):sl&&(sl.d(1),sl=null);let $M=wl;wl=Xa(l),wl!==$M&&(_l(),i(ge[$M],1,1,()=>{ge[$M]=null}),Vl(),rl=ge[wl],rl||(rl=ge[wl]=Ea[wl](l),rl.c()),p(rl,1),rl.m(Ae.parentNode,Ae));const Ka={};s&2&&(Ka.$$scope={dirty:s,ctx:l}),Sl.$set(Ka);let WM=Tl;Tl=$a(l),Tl!==WM&&(_l(),i(Be[WM],1,1,()=>{Be[WM]=null}),Vl(),cl=Be[Tl],cl||(cl=Be[Tl]=Aa[Tl](l),cl.c()),p(cl,1),cl.m($e.parentNode,$e));let xM=ol;ol=xa(l),ol!==xM&&(_l(),i(ke[xM],1,1,()=>{ke[xM]=null}),Vl(),dl=ke[ol],dl||(dl=ke[ol]=Wa[ol](l),dl.c()),p(dl,1),dl.m(We.parentNode,We));let SM=ml;ml=za(l),ml!==SM&&(_l(),i(Ze[SM],1,1,()=>{Ze[SM]=null}),Vl(),jl=Ze[ml],jl||(jl=Ze[ml]=Sa[ml](l),jl.c()),p(jl,1),jl.m(xe.parentNode,xe));let zM=Cl;Cl=va(l),Cl!==zM&&(_l(),i(Ee[zM],1,1,()=>{Ee[zM]=null}),Vl(),ul=Ee[Cl],ul||(ul=Ee[Cl]=Na[Cl](l),ul.c()),p(ul,1),ul.m(Se.parentNode,Se)),l[0]==="pt"?x?s&1&&p(x,1):(x=sn(),x.c(),p(x,1),x.m(ze.parentNode,ze)):x&&(_l(),i(x,1,1,()=>{x=null}),Vl());const Pa={};s&2&&(Pa.$$scope={dirty:s,ctx:l}),zl.$set(Pa),l[0]==="pt"?S?s&1&&p(S,1):(S=en(),S.c(),p(S,1),S.m(Ne.parentNode,Ne)):S&&(_l(),i(S,1,1,()=>{S=null}),Vl());const Oa={};s&2&&(Oa.$$scope={dirty:s,ctx:l}),Nl.$set(Oa)},i(l){kM||(p(_.$$.fragment,l),p(B.$$.fragment,l),p(k),p(al.$$.fragment,l),p(il.$$.fragment,l),p(D.$$.fragment,l),p(W),p(K.$$.fragment,l),p(O.$$.fragment,l),p(F),p(b.$$.fragment,l),p(Ol.$$.fragment,l),p(ss.$$.fragment,l),p(es.$$.fragment,l),p(Ms.$$.fragment,l),p(as.$$.fragment,l),p(Al.$$.fragment,l),p(Us.$$.fragment,l),p(ps.$$.fragment,l),p(ws.$$.fragment,l),p(rs.$$.fragment,l),p(os.$$.fragment,l),p(ds.$$.fragment,l),p($l.$$.fragment,l),p(Cs.$$.fragment,l),p(Wl.$$.fragment,l),p(hs.$$.fragment,l),p(bs.$$.fragment,l),p(fs.$$.fragment,l),p(Vs.$$.fragment,l),p(Qs.$$.fragment,l),p(Rs.$$.fragment,l),p(ks.$$.fragment,l),p(Xs.$$.fragment,l),p(As.$$.fragment,l),p(Ws.$$.fragment,l),p(xs.$$.fragment,l),p(zs.$$.fragment,l),p(Ns.$$.fragment,l),p(Fs.$$.fragment,l),p(Hs.$$.fragment,l),p(Ls.$$.fragment,l),p(qs.$$.fragment,l),p(xl.$$.fragment,l),p(rl),p(le.$$.fragment,l),p(se.$$.fragment,l),p(Sl.$$.fragment,l),p(te.$$.fragment,l),p(Me.$$.fragment,l),p(ne.$$.fragment,l),p(Ue.$$.fragment,l),p(cl),p(ie.$$.fragment,l),p(ye.$$.fragment,l),p(dl),p(re.$$.fragment,l),p(jl),p(ul),p(oe.$$.fragment,l),p(x),p(zl.$$.fragment,l),p(S),p(me.$$.fragment,l),p(Ce.$$.fragment,l),p(he.$$.fragment,l),p(be.$$.fragment,l),p(fe.$$.fragment,l),p(Nl.$$.fragment,l),p(_e.$$.fragment,l),kM=!0)},o(l){i(_.$$.fragment,l),i(B.$$.fragment,l),i(k),i(al.$$.fragment,l),i(il.$$.fragment,l),i(D.$$.fragment,l),i(W),i(K.$$.fragment,l),i(O.$$.fragment,l),i(F),i(b.$$.fragment,l),i(Ol.$$.fragment,l),i(ss.$$.fragment,l),i(es.$$.fragment,l),i(Ms.$$.fragment,l),i(as.$$.fragment,l),i(Al.$$.fragment,l),i(Us.$$.fragment,l),i(ps.$$.fragment,l),i(ws.$$.fragment,l),i(rs.$$.fragment,l),i(os.$$.fragment,l),i(ds.$$.fragment,l),i($l.$$.fragment,l),i(Cs.$$.fragment,l),i(Wl.$$.fragment,l),i(hs.$$.fragment,l),i(bs.$$.fragment,l),i(fs.$$.fragment,l),i(Vs.$$.fragment,l),i(Qs.$$.fragment,l),i(Rs.$$.fragment,l),i(ks.$$.fragment,l),i(Xs.$$.fragment,l),i(As.$$.fragment,l),i(Ws.$$.fragment,l),i(xs.$$.fragment,l),i(zs.$$.fragment,l),i(Ns.$$.fragment,l),i(Fs.$$.fragment,l),i(Hs.$$.fragment,l),i(Ls.$$.fragment,l),i(qs.$$.fragment,l),i(xl.$$.fragment,l),i(rl),i(le.$$.fragment,l),i(se.$$.fragment,l),i(Sl.$$.fragment,l),i(te.$$.fragment,l),i(Me.$$.fragment,l),i(ne.$$.fragment,l),i(Ue.$$.fragment,l),i(cl),i(ie.$$.fragment,l),i(ye.$$.fragment,l),i(dl),i(re.$$.fragment,l),i(jl),i(ul),i(oe.$$.fragment,l),i(x),i(zl.$$.fragment,l),i(S),i(me.$$.fragment,l),i(Ce.$$.fragment,l),i(he.$$.fragment,l),i(be.$$.fragment,l),i(fe.$$.fragment,l),i(Nl.$$.fragment,l),i(_e.$$.fragment,l),kM=!1},d(l){l&&(e(w),e(a),e(y),e(j),e(Z),e(g),e(G),e(Q),e(A),e(f),e(E),e(R),e(X),e(Ql),e(H),e(Rl),e($),e(tl),e(Il),e(Ml),e(nl),e(Gl),e(gl),e(L),e(Bl),e(N),e(Jl),e(fl),e(Ul),e(yl),e(q),e(kl),e(Zl),e(P),e(El),e(Xl),e(ll),e(pl),e(U),e(Le),e(Pl),e(qe),e(Ke),e(ls),e(Pe),e(Oe),e(lt),e(ts),e(st),e(et),e(tt),e(ns),e(Mt),e(at),e(Js),e(nt),e(Jt),e(Ut),e(is),e(pt),e(ys),e(it),e(yt),e(wt),e(Ts),e(rt),e(cs),e(Tt),e(ct),e(ot),e(ms),e(dt),e(mt),e(js),e(jt),e(Ct),e(ut),e(us),e(ht),e(bt),e(It),e(Is),e(ft),e(Vt),e(_t),e(_s),e(Qt),e(Rt),e(Gt),e(Gs),e(gt),e(gs),e(Bt),e(Bs),e(kt),e(Zt),e(Zs),e(Et),e(Es),e(Xt),e(At),e($t),e($s),e(Wt),e(xt),e(St),e(Ss),e(zt),e(Nt),e(vt),e(vs),e(Ft),e(Yt),e(Ys),e(Ht),e(Dt),e(Ds),e(Lt),e(qt),e(Kt),e(Ks),e(Pt),e(Ot),e(Xe),e(Ps),e(lM),e(Ae),e(Os),e(sM),e(eM),e(tM),e(MM),e(ee),e(aM),e(nM),e(JM),e(ae),e(UM),e(pM),e(Je),e(iM),e(yM),e(pe),e(wM),e($e),e(rM),e(TM),e(we),e(cM),e(We),e(oM),e(Te),e(dM),e(xe),e(ce),e(mM),e(Se),e(jM),e(de),e(CM),e(ze),e(uM),e(Ne),e(hM),e(je),e(bM),e(IM),e(ue),e(fM),e(VM),e(_M),e(Ie),e(QM),e(RM),e(Ve),e(GM),e(gM),e(BM),e(De)),e(M),o(_,l),o(B,l),Qe[V].d(l),o(al,l),o(il,l),o(D,l),Re[v].d(l),o(K,l),o(O,l),Ge[el].d(l),o(b,l),o(Ol,l),o(ss,l),o(es,l),o(Ms,l),o(as,l),o(Al,l),o(Us,l),o(ps,l),o(ws,l),o(rs,l),o(os,l),o(ds,l),o($l,l),o(Cs,l),o(Wl,l),o(hs,l),o(bs,l),o(fs,l),o(Vs,l),o(Qs,l),o(Rs,l),o(ks,l),o(Xs,l),o(As,l),o(Ws,l),o(xs,l),o(zs,l),o(Ns,l),o(Fs,l),o(Hs,l),o(Ls,l),o(qs,l),o(xl,l),sl&&sl.d(l),ge[wl].d(l),o(le,l),o(se,l),o(Sl,l),o(te,l),o(Me,l),o(ne,l),o(Ue,l),Be[Tl].d(l),o(ie,l),o(ye,l),ke[ol].d(l),o(re,l),Ze[ml].d(l),Ee[Cl].d(l),o(oe,l),x&&x.d(l),o(zl,l),S&&S.d(l),o(me,l),o(Ce,l),o(he,l),o(be,l),o(fe,l),o(Nl,l),o(_e,l)}}}const Wn='{"title":"Дообучение модели маскированного языкового моделирования","local":"fine-tuning-a-masked-language-model","sections":[{"title":"Выбор предварительно обученной модели для маскированного моделирования языка","local":"picking-a-pretrained-model-for-masked-language-modeling","sections":[],"depth":2},{"title":"Датасет","local":"the-dataset","sections":[],"depth":2},{"title":"Предварительная обработка данных","local":"preprocessing-the-data","sections":[],"depth":2},{"title":"Дообучение DistilBERT с помощью API Trainer","local":"fine-tuning-distilbert-with-the-trainer-api","sections":[{"title":"Перплексия языковых моделей","local":"perplexity-for-language-models","sections":[],"depth":3}],"depth":2},{"title":"Дообучение DistilBERT с помощью 🤗 Accelerate","local":"fine-tuning-distilbert-with-accelerate","sections":[],"depth":2},{"title":"Использование нашей дообученной модели","local":"using-our-fine-tuned-model","sections":[],"depth":2}],"depth":1}';function xn(I,M,w){let a="pt";return nn(()=>{const y=new URLSearchParams(window.location.search);w(0,a=y.get("fw")||"pt")}),[a]}class Ln extends Jn{constructor(M){super(),Un(this,M,xn,$n,Mn,{})}}export{Ln as component};
