From 52b21586130d13e8cff7b7b47878877807ac265f Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 10:04:37 +0200 Subject: [PATCH 001/254] chapter3 - added introduction --- chapters/fa/chapter3/1.mdx | 1 + 1 file changed, 1 insertion(+) create mode 100644 chapters/fa/chapter3/1.mdx diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/chapters/fa/chapter3/1.mdx @@ -0,0 +1 @@ + From 33915ea32f7af0443eea873f3a0f92f68a045c89 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 10:22:54 +0200 Subject: [PATCH 002/254] ch3 - intro - title --- chapters/fa/chapter3/1.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 8b1378917..0cef3bdd6 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1 +1 @@ - +### مقدمه From 6bd93263e69a2442a2fc00519a0e9c63c984f785 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 10:30:21 +0200 Subject: [PATCH 003/254] intro some text added --- chapters/fa/chapter3/1.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 0cef3bdd6..a2f9138f5 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1 +1,3 @@ -### مقدمه +# مقدمه + +در فصل ۲ نحوه استفاده از توکنایزر ها و مدلهای از پیش آموزش داده شده را جهت انجام پیش بینی جدید بررسی کردیم. From 7eae7bbecd0b3dc2424b0e64d1758b3c0d18311a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 21:53:01 +0200 Subject: [PATCH 004/254] url added --- chapters/fa/chapter3/1.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index a2f9138f5..fc77c3c56 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1,3 +1,6 @@ # مقدمه -در فصل ۲ نحوه استفاده از توکنایزر ها و مدلهای از پیش آموزش داده شده را جهت انجام پیش بینی جدید بررسی کردیم. +در (/course/chapter2)[فصل ۲] ۲ نحوه استفاده از توکنایزر ها و مدلهای از پیش آموزش داده شده را جهت انجام پیش بینی جدید بررسی کردیم. اما چگونه میتوانید یک مدل از پیش آموزش داده شده را خودتان فاین تیون کنید؟ + +* چگونه یک داده بزرگ را از هاب تهیه کنید +* From cb090d1bf229796fc91786b6a0a4fa4447e22fe9 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 21:55:06 +0200 Subject: [PATCH 005/254] url added --- chapters/fa/chapter3/1.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index fc77c3c56..869494168 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -4,3 +4,5 @@ * چگونه یک داده بزرگ را از هاب تهیه کنید * + +[url](www.google.com) \ No newline at end of file From b7aee3a6ec8fc72ff03ca59a700fee35047986d8 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 21:55:44 +0200 Subject: [PATCH 006/254] url added --- chapters/fa/chapter3/1.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 869494168..30f4a99cd 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -2,7 +2,7 @@ در (/course/chapter2)[فصل ۲] ۲ نحوه استفاده از توکنایزر ها و مدلهای از پیش آموزش داده شده را جهت انجام پیش بینی جدید بررسی کردیم. اما چگونه میتوانید یک مدل از پیش آموزش داده شده را خودتان فاین تیون کنید؟ -* چگونه یک داده بزرگ را از هاب تهیه کنید +* چگونه [url](www.google.com) یک داده بزرگ را از هاب تهیه کنید * [url](www.google.com) \ No newline at end of file From 8e1e264c7c9ea71ba780d9e6ee1cf8fe866b3555 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 21:56:23 +0200 Subject: [PATCH 007/254] url added --- chapters/fa/chapter3/1.mdx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 30f4a99cd..41dd60266 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -2,7 +2,9 @@ در (/course/chapter2)[فصل ۲] ۲ نحوه استفاده از توکنایزر ها و مدلهای از پیش آموزش داده شده را جهت انجام پیش بینی جدید بررسی کردیم. اما چگونه میتوانید یک مدل از پیش آموزش داده شده را خودتان فاین تیون کنید؟ -* چگونه [url](www.google.com) یک داده بزرگ را از هاب تهیه کنید +* چگونه [لینک](www.google.com) یک داده بزرگ را از هاب تهیه کنید * -[url](www.google.com) \ No newline at end of file +[url](www.google.com) + + From 0c472b689ed91f029c9199431f9ca72fe06b81fc Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 21:57:39 +0200 Subject: [PATCH 008/254] url added --- chapters/fa/chapter3/1.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 41dd60266..9f9d52fbb 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1,6 +1,6 @@ # مقدمه -در (/course/chapter2)[فصل ۲] ۲ نحوه استفاده از توکنایزر ها و مدلهای از پیش آموزش داده شده را جهت انجام پیش بینی جدید بررسی کردیم. اما چگونه میتوانید یک مدل از پیش آموزش داده شده را خودتان فاین تیون کنید؟ +در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزر ها و مدلهای از پیش آموزش داده شده را جهت انجام پیش بینی جدید بررسی کردیم. اما چگونه میتوانید یک مدل از پیش آموزش داده شده را خودتان فاین تیون کنید؟ * چگونه [لینک](www.google.com) یک داده بزرگ را از هاب تهیه کنید * @@ -8,3 +8,4 @@ [url](www.google.com) +/course/chapter2 \ No newline at end of file From ccac309a6dfa8c02bf686fca254711722de65ebc Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 22:05:43 +0200 Subject: [PATCH 009/254] bullets added --- chapters/fa/chapter3/1.mdx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 9f9d52fbb..e37bdd7ac 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -2,10 +2,12 @@ در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزر ها و مدلهای از پیش آموزش داده شده را جهت انجام پیش بینی جدید بررسی کردیم. اما چگونه میتوانید یک مدل از پیش آموزش داده شده را خودتان فاین تیون کنید؟ -* چگونه [لینک](www.google.com) یک داده بزرگ را از هاب تهیه کنید -* +{#if fw === 'pt'} -[url](www.google.com) +* چگونه یک داده بزرگ را از هاب تهیه کنید +* چگونه از ای پی ای آموزش دهنده سطح بالا برای فاین تیون کردن مدل استفاده کنید +* چطور یک لوپ آموزش دهنده شخصی درست کنیم +* چگونه از کتابخانه شتابدهنده استفاده کنیم برای اینکه لوپ آموزش دهنده شخصی را در هر گونه تنظیمات پراکنده اجرا کنیم +{:else} -/course/chapter2 \ No newline at end of file From 9f01f8263cf3a3ea1d0ae24ad71bacad5e0ee0b9 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 19 Apr 2022 22:17:44 +0200 Subject: [PATCH 010/254] bullets added --- chapters/fa/chapter3/1.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index e37bdd7ac..18e7580dd 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -7,7 +7,7 @@ * چگونه یک داده بزرگ را از هاب تهیه کنید * چگونه از ای پی ای آموزش دهنده سطح بالا برای فاین تیون کردن مدل استفاده کنید * چطور یک لوپ آموزش دهنده شخصی درست کنیم -* چگونه از کتابخانه شتابدهنده استفاده کنیم برای اینکه لوپ آموزش دهنده شخصی را در هر گونه تنظیمات پراکنده اجرا کنیم +* چگونه از کتابخانه شتابدهنده 🤗 استفاده کنیم برای اینکه لوپ آموزش دهنده شخصی را در هر گونه تنظیمات پراکنده اجرا کنیم {:else} From 8011d3728b5ae2e517d83e3e2667696cda2126fd Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 08:52:47 +0200 Subject: [PATCH 011/254] introduction - first draft --- chapters/fa/chapter3/1.mdx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 18e7580dd..fca5f8e49 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1,13 +1,21 @@ # مقدمه -در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزر ها و مدلهای از پیش آموزش داده شده را جهت انجام پیش بینی جدید بررسی کردیم. اما چگونه میتوانید یک مدل از پیش آموزش داده شده را خودتان فاین تیون کنید؟ +در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدلهای پیش تعلیم را جهت انجام پیش بینی های جدید بررسی کردیم. اما چگونه میتوانید یک مدل از پیش تعلیم را خودتان بازتنظیم کنید؟ {#if fw === 'pt'} * چگونه یک داده بزرگ را از هاب تهیه کنید -* چگونه از ای پی ای آموزش دهنده سطح بالا برای فاین تیون کردن مدل استفاده کنید -* چطور یک لوپ آموزش دهنده شخصی درست کنیم -* چگونه از کتابخانه شتابدهنده 🤗 استفاده کنیم برای اینکه لوپ آموزش دهنده شخصی را در هر گونه تنظیمات پراکنده اجرا کنیم +* چگونه از API سطح بالای "Trainer" آموزش دهنده برای بازتنظیم مدل استفاده کنید +* چگونه یک چرخه تعلیم دلخواه درست کنید +* چگونه از کتابخانه Accelerate 🤗 برای اجرای چرخه تعلیم دلخواه را در هر تنظیمات غیر متمرکزی استفاده کنید {:else} +* چگونه یک داده بزرگ را از هاب تهیه کنید +* چگونه از کراس برای بازتنظیم مدل استفاده کنید +* چگونه از کراس برای استخراج پیش بینی ها استفاده کنید +* چگونه از یک متریک دلخواه استفاده کنید + +{/if} + +جهت بارگذاری چک پوینت تعلیم دیده خود در هاب هاگینک فیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) \ No newline at end of file From 96a3dc08f3ca648e6647bc923c3e62c964470593 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 08:54:10 +0200 Subject: [PATCH 012/254] fixed minor typo --- chapters/fa/chapter3/1.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index fca5f8e49..8ef01b751 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1,6 +1,6 @@ # مقدمه -در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدلهای پیش تعلیم را جهت انجام پیش بینی های جدید بررسی کردیم. اما چگونه میتوانید یک مدل از پیش تعلیم را خودتان بازتنظیم کنید؟ +در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدلهای پیش تعلیم را جهت انجام پیش بینی های جدید بررسی کردیم. اما چگونه میتوانید یک مدل پیش تعلیم را خودتان بازتنظیم کنید؟ {#if fw === 'pt'} From 7321d7202add8061d348be9014ea69a1969bf12f Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 08:55:55 +0200 Subject: [PATCH 013/254] fixed minor typo --- chapters/fa/chapter3/1.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 8ef01b751..ccb01c2e9 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -5,9 +5,9 @@ {#if fw === 'pt'} * چگونه یک داده بزرگ را از هاب تهیه کنید -* چگونه از API سطح بالای "Trainer" آموزش دهنده برای بازتنظیم مدل استفاده کنید +* چگونه از API سطح بالای "Trainer" برای بازتنظیم مدل استفاده کنید * چگونه یک چرخه تعلیم دلخواه درست کنید -* چگونه از کتابخانه Accelerate 🤗 برای اجرای چرخه تعلیم دلخواه را در هر تنظیمات غیر متمرکزی استفاده کنید +* چگونه از کتابخانه Accelerate 🤗 برای اجرای چرخه تعلیم دلخواه در هر تنظیمات غیر متمرکزی استفاده کنید {:else} From 34eeeda61e79b6473aa4c91f3e58482fe4512229 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 13:39:56 +0200 Subject: [PATCH 014/254] section 2 - process data - file added. --- chapters/fa/chapter3/1.mdx | 2 + chapters/fa/chapter3/2.mdx | 383 +++++++++++++++++++++++++++++++++++++ 2 files changed, 385 insertions(+) create mode 100644 chapters/fa/chapter3/2.mdx diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index ccb01c2e9..b960c3886 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1,3 +1,5 @@ + + # مقدمه در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدلهای پیش تعلیم را جهت انجام پیش بینی های جدید بررسی کردیم. اما چگونه میتوانید یک مدل پیش تعلیم را خودتان بازتنظیم کنید؟ diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx new file mode 100644 index 000000000..4611e8469 --- /dev/null +++ b/chapters/fa/chapter3/2.mdx @@ -0,0 +1,383 @@ + + +#پردازش داده +# Processing the data + +{#if fw === 'pt'} + + + +{:else} + + + +{/if} + +{#if fw === 'pt'} +ادامه از مثال [فصل قبل](/course/chapter2) نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch به شرح زیر میباش: +Continuing with the example from the [previous chapter](/course/chapter2), here is how we would train a sequence classifier on one batch in PyTorch: + +```python +import torch +from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification + +# Same as before +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) +sequences = [ + "I've been waiting for a HuggingFace course my whole life.", + "This course is amazing!", +] +batch = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt") + +# This is new +batch["labels"] = torch.tensor([1, 1]) + +optimizer = AdamW(model.parameters()) +loss = model(**batch).loss +loss.backward() +optimizer.step() +``` +{:else} +Continuing with the example from the [previous chapter](/course/chapter2), here is how we would train a sequence classifier on one batch in TensorFlow: + +```python +import tensorflow as tf +import numpy as np +from transformers import AutoTokenizer, TFAutoModelForSequenceClassification + +# Same as before +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) +sequences = [ + "I've been waiting for a HuggingFace course my whole life.", + "This course is amazing!", +] +batch = dict(tokenizer(sequences, padding=True, truncation=True, return_tensors="tf")) + +# This is new +model.compile(optimizer="adam", loss="sparse_categorical_crossentropy") +labels = tf.convert_to_tensor([1, 1]) +model.train_on_batch(batch, labels) +``` +{/if} + +Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. + +In this section we will use as an example the MRPC (Microsoft Research Paraphrase Corpus) dataset, introduced in a [paper](https://www.aclweb.org/anthology/I05-5002.pdf) by William B. Dolan and Chris Brockett. The dataset consists of 5,801 pairs of sentences, with a label indicating if they are paraphrases or not (i.e., if both sentences mean the same thing). We've selected it for this chapter because it's a small dataset, so it's easy to experiment with training on it. + +### Loading a dataset from the Hub + +{#if fw === 'pt'} + +{:else} + +{/if} + +The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. + +The 🤗 Datasets library provides a very simple command to download and cache a dataset on the Hub. We can download the MRPC dataset like this: + +```py +from datasets import load_dataset + +raw_datasets = load_dataset("glue", "mrpc") +raw_datasets +``` + +```python out +DatasetDict({ + train: Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 3668 + }) + validation: Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 408 + }) + test: Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 1725 + }) +}) +``` + +As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). + +This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. + +We can access each pair of sentences in our `raw_datasets` object by indexing, like with a dictionary: + +```py +raw_train_dataset = raw_datasets["train"] +raw_train_dataset[0] +``` + +```python out +{'idx': 0, + 'label': 1, + 'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', + 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} +``` + +We can see the labels are already integers, so we won't have to do any preprocessing there. To know which integer corresponds to which label, we can inspect the `features` of our `raw_train_dataset`. This will tell us the type of each column: + +```py +raw_train_dataset.features +``` + +```python out +{'sentence1': Value(dtype='string', id=None), + 'sentence2': Value(dtype='string', id=None), + 'label': ClassLabel(num_classes=2, names=['not_equivalent', 'equivalent'], names_file=None, id=None), + 'idx': Value(dtype='int32', id=None)} +``` + +Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers to label name is stored in the *names* folder. `0` corresponds to `not_equivalent`, and `1` corresponds to `equivalent`. + + + +✏️ **Try it out!** Look at element 15 of the training set and element 87 of the validation set. What are their labels? + + + +### Preprocessing a dataset + +{#if fw === 'pt'} + +{:else} + +{/if} + +To preprocess the dataset, we need to convert the text to numbers the model can make sense of. As you saw in the [previous chapter](/course/chapter2), this is done with a tokenizer. We can feed the tokenizer one sentence or a list of sentences, so we can directly tokenize all the first sentences and all the second sentences of each pair like this: + +```py +from transformers import AutoTokenizer + +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +tokenized_sentences_1 = tokenizer(raw_datasets["train"]["sentence1"]) +tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) +``` + +However, we can't just pass two sequences to the model and get a prediction of whether the two sentences are paraphrases or not. We need to handle the two sequences as a pair, and apply the appropriate preprocessing. Fortunately, the tokenizer can also take a pair of sequences and prepare it the way our BERT model expects: + +```py +inputs = tokenizer("This is the first sentence.", "This is the second one.") +inputs +``` + +```python out +{ + 'input_ids': [101, 2023, 2003, 1996, 2034, 6251, 1012, 102, 2023, 2003, 1996, 2117, 2028, 1012, 102], + 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], + 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +} +``` + +We discussed the `input_ids` and `attention_mask` keys in [Chapter 2](/course/chapter2), but we put off talking about `token_type_ids`. In this example, this is what tells the model which part of the input is the first sentence and which is the second sentence. + + + +✏️ **Try it out!** Take element 15 of the training set and tokenize the two sentences separately and as a pair. What's the difference between the two results? + + + +If we decode the IDs inside `input_ids` back to words: + +```py +tokenizer.convert_ids_to_tokens(inputs["input_ids"]) +``` + +we will get: + +```python out +['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] +``` + +So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] sentence2 [SEP]` when there are two sentences. Aligning this with the `token_type_ids` gives us: + +```python out +['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] +[ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] +``` + +As you can see, the parts of the input corresponding to `[CLS] sentence1 [SEP]` all have a token type ID of `0`, while the other parts, corresponding to `sentence2 [SEP]`, all have a token type ID of `1`. + +Note that if you select a different checkpoint, you won't necessarily have the `token_type_ids` in your tokenized inputs (for instance, they're not returned if you use a DistilBERT model). They are only returned when the model will know what to do with them, because it has seen them during its pretraining. + +Here, BERT is pretrained with token type IDs, and on top of the masked language modeling objective we talked about in [Chapter 1](/course/chapter1), it has an additional objective called _next sentence prediction_. The goal with this task is to model the relationship between pairs of sentences. + +With next sentence prediction, the model is provided pairs of sentences (with randomly masked tokens) and asked to predict whether the second sentence follows the first. To make the task non-trivial, half of the time the sentences follow each other in the original document they were extracted from, and the other half of the time the two sentences come from two different documents. + +In general, you don't need to worry about whether or not there are `token_type_ids` in your tokenized inputs: as long as you use the same checkpoint for the tokenizer and the model, everything will be fine as the tokenizer knows what to provide to its model. + +Now that we have seen how our tokenizer can deal with one pair of sentences, we can use it to tokenize our whole dataset: like in the [previous chapter](/course/chapter2), we can feed the tokenizer a list of pairs of sentences by giving it the list of first sentences, then the list of second sentences. This is also compatible with the padding and truncation options we saw in [Chapter 2](/course/chapter2). So, one way to preprocess the training dataset is: + +```py +tokenized_dataset = tokenizer( + raw_datasets["train"]["sentence1"], + raw_datasets["train"]["sentence2"], + padding=True, + truncation=True, +) +``` + +This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). + +To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: + +```py +def tokenize_function(example): + return tokenizer(example["sentence1"], example["sentence2"], truncation=True) +``` + +This function takes a dictionary (like the items of our dataset) and returns a new dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`. Note that it also works if the `example` dictionary contains several samples (each key as a list of sentences) since the `tokenizer` works on lists of pairs of sentences, as seen before. This will allow us to use the option `batched=True` in our call to `map()`, which will greatly speed up the tokenization. The `tokenizer` is backed by a tokenizer written in Rust from the [🤗 Tokenizers](https://github.com/huggingface/tokenizers) library. This tokenizer can be very fast, but only if we give it lots of inputs at once. + +Note that we've left the `padding` argument out in our tokenization function for now. This is because padding all the samples to the maximum length is not efficient: it's better to pad the samples when we're building a batch, as then we only need to pad to the maximum length in that batch, and not the maximum length in the entire dataset. This can save a lot of time and processing power when the inputs have very variable lengths! + +Here is how we apply the tokenization function on all our datasets at once. We're using `batched=True` in our call to `map` so the function is applied to multiple elements of our dataset at once, and not on each element separately. This allows for faster preprocessing. + +```py +tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) +tokenized_datasets +``` + +The way the 🤗 Datasets library applies this processing is by adding new fields to the datasets, one for each key in the dictionary returned by the preprocessing function: + +```python out +DatasetDict({ + train: Dataset({ + features: ['attention_mask', 'idx', 'input_ids', 'label', 'sentence1', 'sentence2', 'token_type_ids'], + num_rows: 3668 + }) + validation: Dataset({ + features: ['attention_mask', 'idx', 'input_ids', 'label', 'sentence1', 'sentence2', 'token_type_ids'], + num_rows: 408 + }) + test: Dataset({ + features: ['attention_mask', 'idx', 'input_ids', 'label', 'sentence1', 'sentence2', 'token_type_ids'], + num_rows: 1725 + }) +}) +``` + +You can even use multiprocessing when applying your preprocessing function with `map()` by passing along a `num_proc` argument. We didn't do this here because the 🤗 Tokenizers library already uses multiple threads to tokenize our samples faster, but if you are not using a fast tokenizer backed by this library, this could speed up your preprocessing. + +Our `tokenize_function` returns a dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`, so those three fields are added to all splits of our dataset. Note that we could also have changed existing fields if our preprocessing function returned a new value for an existing key in the dataset to which we applied `map()`. + +The last thing we will need to do is pad all the examples to the length of the longest element when we batch elements together — a technique we refer to as *dynamic padding*. + +### Dynamic padding + + + +{#if fw === 'pt'} +The function that is responsible for putting together samples inside a batch is called a *collate function*. It's an argument you can pass when you build a `DataLoader`, the default being a function that will just convert your samples to PyTorch tensors and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. + +{:else} + +The function that is responsible for putting together samples inside a batch is called a *collate function*. The default collator is a function that will just convert your samples to tf.Tensor and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. + +{/if} + +To do this in practice, we have to define a collate function that will apply the correct amount of padding to the items of the dataset we want to batch together. Fortunately, the 🤗 Transformers library provides us with such a function via `DataCollatorWithPadding`. It takes a tokenizer when you instantiate it (to know which padding token to use, and whether the model expects padding to be on the left or on the right of the inputs) and will do everything you need: + +{#if fw === 'pt'} +```py +from transformers import DataCollatorWithPadding + +data_collator = DataCollatorWithPadding(tokenizer=tokenizer) +``` +{:else} +```py +from transformers import DataCollatorWithPadding + +data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") +``` +{/if} + +To test this new toy, let's grab a few samples from our training set that we would like to batch together. Here, we remove the columns `idx`, `sentence1`, and `sentence2` as they won't be needed and contain strings (and we can't create tensors with strings) and have a look at the lengths of each entry in the batch: + +```py +samples = tokenized_datasets["train"][:8] +samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "sentence2"]} +[len(x) for x in samples["input_ids"]] +``` + +```python out +[50, 59, 47, 67, 59, 50, 62, 32] +``` + +No surprise, we get samples of varying length, from 32 to 67. Dynamic padding means the samples in this batch should all be padded to a length of 67, the maximum length inside the batch. Without dynamic padding, all of the samples would have to be padded to the maximum length in the whole dataset, or the maximum length the model can accept. Let's double-check that our `data_collator` is dynamically padding the batch properly: + +```py +batch = data_collator(samples) +{k: v.shape for k, v in batch.items()} +``` + +{#if fw === 'tf'} + +```python out +{'attention_mask': TensorShape([8, 67]), + 'input_ids': TensorShape([8, 67]), + 'token_type_ids': TensorShape([8, 67]), + 'labels': TensorShape([8])} +``` + +{:else} + +```python out +{'attention_mask': torch.Size([8, 67]), + 'input_ids': torch.Size([8, 67]), + 'token_type_ids': torch.Size([8, 67]), + 'labels': torch.Size([8])} +``` + +Looking good! Now that we've gone from raw text to batches our model can deal with, we're ready to fine-tune it! + +{/if} + + + +✏️ **Try it out!** Replicate the preprocessing on the GLUE SST-2 dataset. It's a little bit different since it's composed of single sentences instead of pairs, but the rest of what we did should look the same. For a harder challenge, try to write a preprocessing function that works on any of the GLUE tasks. + + + +{#if fw === 'tf'} + +Now that we have our dataset and a data collator, we need to put them together. We could manually load batches and collate them, but that's a lot of work, and probably not very performant either. Instead, there's a simple method that offers a performant solution to this problem: `to_tf_dataset()`. This will wrap a `tf.data.Dataset` around your dataset, with an optional collation function. `tf.data.Dataset` is a native TensorFlow format that Keras can use for `model.fit()`, so this one method immediately converts a 🤗 Dataset to a format that's ready for training. Let's see it in action with our dataset! + +```py +tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=True, + collate_fn=data_collator, + batch_size=8, +) + +tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=False, + collate_fn=data_collator, + batch_size=8, +) +``` + +And that's it! We can take those datasets forward into the next lecture, where training will be pleasantly straightforward after all the hard work of data preprocessing. + +{/if} From 4abbc2a52c44cab2fce0fe339cc5912f253efa09 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 13:40:44 +0200 Subject: [PATCH 015/254] minor fix --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 4611e8469..507f255f4 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -1,6 +1,6 @@ -#پردازش داده +# پردازش داده # Processing the data {#if fw === 'pt'} From 2217041e8b682e894775bccbcd4866c3be575d29 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 13:45:56 +0200 Subject: [PATCH 016/254] minor fix --- chapters/fa/chapter3/2.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 507f255f4..7efd875be 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -24,7 +24,9 @@ {/if} {#if fw === 'pt'} -ادامه از مثال [فصل قبل](/course/chapter2) نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch به شرح زیر میباش: + + در این بخش در ادامه مثال [فصل قبل](/course/chapter2) نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می دهیم: + Continuing with the example from the [previous chapter](/course/chapter2), here is how we would train a sequence classifier on one batch in PyTorch: ```python From 7b4590533776df7fc9e3c03ed6cb6995b02cec7c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 13:46:48 +0200 Subject: [PATCH 017/254] minor fix --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 7efd875be..fc88d8348 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -25,7 +25,7 @@ {#if fw === 'pt'} - در این بخش در ادامه مثال [فصل قبل](/course/chapter2) نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می دهیم: + در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می دهیم: Continuing with the example from the [previous chapter](/course/chapter2), here is how we would train a sequence classifier on one batch in PyTorch: From bf53804b3a176cf46035589d160a7e55a64a28a7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 13:56:52 +0200 Subject: [PATCH 018/254] added new paragraph --- chapters/fa/chapter3/2.mdx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index fc88d8348..c5444dce9 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -27,8 +27,6 @@ در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می دهیم: -Continuing with the example from the [previous chapter](/course/chapter2), here is how we would train a sequence classifier on one batch in PyTorch: - ```python import torch from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification @@ -52,7 +50,8 @@ loss.backward() optimizer.step() ``` {:else} -Continuing with the example from the [previous chapter](/course/chapter2), here is how we would train a sequence classifier on one batch in TensorFlow: + +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می دهیم: ```python import tensorflow as tf @@ -74,8 +73,13 @@ model.compile(optimizer="adam", loss="sparse_categorical_crossentropy") labels = tf.convert_to_tensor([1, 1]) model.train_on_batch(batch, labels) ``` + {/if} +البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی داده بزرگتر خواهید داشت. + +در این بخش ما از داده -- که در مقاله -- معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب میباشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. ما این داده را به این دلیل انتخاب کردیم که داده کوچکیست و تجربه آموزش دادن روی آن آسان است. + Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. In this section we will use as an example the MRPC (Microsoft Research Paraphrase Corpus) dataset, introduced in a [paper](https://www.aclweb.org/anthology/I05-5002.pdf) by William B. Dolan and Chris Brockett. The dataset consists of 5,801 pairs of sentences, with a label indicating if they are paraphrases or not (i.e., if both sentences mean the same thing). We've selected it for this chapter because it's a small dataset, so it's easy to experiment with training on it. From 5b85ac44680b0e94e6dcd86bc85c427a06b6a523 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 18:19:57 +0200 Subject: [PATCH 019/254] urls added --- chapters/fa/chapter3/2.mdx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index c5444dce9..c3127e372 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -78,12 +78,15 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی داده بزرگتر خواهید داشت. -در این بخش ما از داده -- که در مقاله -- معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب میباشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. ما این داده را به این دلیل انتخاب کردیم که داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از داده MRPC (Microsoft Research Paraphrase Corpus) که در [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf) by William B. Dolan and Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب میباشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. ما این داده را به این دلیل انتخاب کردیم که داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. In this section we will use as an example the MRPC (Microsoft Research Paraphrase Corpus) dataset, introduced in a [paper](https://www.aclweb.org/anthology/I05-5002.pdf) by William B. Dolan and Chris Brockett. The dataset consists of 5,801 pairs of sentences, with a label indicating if they are paraphrases or not (i.e., if both sentences mean the same thing). We've selected it for this chapter because it's a small dataset, so it's easy to experiment with training on it. + +### بارگذاری داده از هاب + ### Loading a dataset from the Hub {#if fw === 'pt'} @@ -92,6 +95,8 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras {/if} +هاب تنها شامل مدلها نمیشود؛ بلکه شامل داده های متعدد در بسیاری زبانهای مختلف می باشد. در اینجا شما میتوانید + The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. The 🤗 Datasets library provides a very simple command to download and cache a dataset on the Hub. We can download the MRPC dataset like this: From 18ed2b6c79b034131316e462dd0829dc5ae33d50 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 18:45:33 +0200 Subject: [PATCH 020/254] new paragraph added --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index c3127e372..2332412f9 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -95,7 +95,7 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras {/if} -هاب تنها شامل مدلها نمیشود؛ بلکه شامل داده های متعدد در بسیاری زبانهای مختلف می باشد. در اینجا شما میتوانید +هاب تنها شامل مدلها نمیشود؛ بلکه شامل داده های متعدد در بسیاری زبانهای مختلف می باشد. شما میتوانید داده ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می کنیم پس از اتمام این این بخش یک داده جدید را بارگذاری و پردازش کنید (بخش داکیومنتهای عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) ببنید). اما اجازه بدید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده GLUE benchmark](https://gluebenchmark.com/) است که یک بنچمارک اکادمی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ وظیفه دسته بندی متن مختلف میباشد. The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. From 53af6411071aa8b0cb3da7d908ab55797d4178b7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 18:47:14 +0200 Subject: [PATCH 021/254] typos fixed --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 2332412f9..6ab0537f4 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -95,7 +95,7 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras {/if} -هاب تنها شامل مدلها نمیشود؛ بلکه شامل داده های متعدد در بسیاری زبانهای مختلف می باشد. شما میتوانید داده ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می کنیم پس از اتمام این این بخش یک داده جدید را بارگذاری و پردازش کنید (بخش داکیومنتهای عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) ببنید). اما اجازه بدید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده GLUE benchmark](https://gluebenchmark.com/) است که یک بنچمارک اکادمی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ وظیفه دسته بندی متن مختلف میباشد. +هاب تنها شامل مدلها نمیشود؛ بلکه شامل داده های متعدد در بسیاری زبانهای مختلف می باشد. شما میتوانید داده ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می کنیم پس از اتمام این بخش یک داده جدید را بارگذاری و پردازش کنید (بخش داکیومنتهای عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) ببنید). اما اجازه بدید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک بنچمارک اکادمی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ وظیفه دسته بندی متن مختلف میباشد. The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. From 8d386faa31f2cf8b53fbcf47d0a82de46b9efd3a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 18:48:44 +0200 Subject: [PATCH 022/254] writing improved --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 6ab0537f4..33b9a4462 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -95,7 +95,7 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras {/if} -هاب تنها شامل مدلها نمیشود؛ بلکه شامل داده های متعدد در بسیاری زبانهای مختلف می باشد. شما میتوانید داده ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می کنیم پس از اتمام این بخش یک داده جدید را بارگذاری و پردازش کنید (بخش داکیومنتهای عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) ببنید). اما اجازه بدید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک بنچمارک اکادمی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ وظیفه دسته بندی متن مختلف میباشد. +هاب تنها شامل مدلها نمیشود؛ بلکه شامل داده های متعدد در بسیاری زبانهای مختلف می باشد. شما میتوانید داده ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می کنیم پس از اتمام این بخش یک داده جدید را بارگذاری و پردازش کنید (بخش متون عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک بنچمارک اکادمی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ وظیفه دسته بندی متن مختلف میباشد. The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. From 991055c0471f15148c8dd1299b1cd6346e0bac2a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 18:56:11 +0200 Subject: [PATCH 023/254] synch with glossary --- chapters/fa/chapter3/2.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 33b9a4462..e207d93ce 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -99,6 +99,8 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. +کتابخانه داده 🤗 یک دستور بسیار ساده جهت دانلود و بارگذاری یک داده در هاب ارائه میکند. ما میتوانیم داده MRPC را به صورت زیر دانلود کنیم. + The 🤗 Datasets library provides a very simple command to download and cache a dataset on the Hub. We can download the MRPC dataset like this: ```py From 9a6023e81ac6dfad278a3c8e672e06ee71690206 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 19:05:51 +0200 Subject: [PATCH 024/254] new paragraph added --- chapters/fa/chapter3/2.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index e207d93ce..6ad194308 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -99,7 +99,7 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. -کتابخانه داده 🤗 یک دستور بسیار ساده جهت دانلود و بارگذاری یک داده در هاب ارائه میکند. ما میتوانیم داده MRPC را به صورت زیر دانلود کنیم. +کتابخانه داده 🤗 یک دستور بسیار ساده جهت دانلود و بارگذاری یک داده در هاب ارائه میکند. ما میتوانیم داده MRPC را به روش زیر دانلود کنیم. The 🤗 Datasets library provides a very simple command to download and cache a dataset on the Hub. We can download the MRPC dataset like this: @@ -127,8 +127,12 @@ DatasetDict({ }) ``` +همانطور که می بینید یک ابجکت "DatasetDict" بدست می آوریم که شامل مجموعه داده های Train, Test, و Validation میباشد. هریک از اینها شامل چندین سطون (`sentence1`, `sentence2`, `label`, and `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می دهند میباشد. + As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). +این دستور داده را به صورت پیش فرض در *~/.cache/huggingface/dataset* دانلود و کش میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید دایرکتوری کشتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. We can access each pair of sentences in our `raw_datasets` object by indexing, like with a dictionary: From 4f1d096cfead622d9c9097b653cc0bcc79d30fd6 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 19:08:40 +0200 Subject: [PATCH 025/254] polished sentences --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 6ad194308..3f4372212 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -78,7 +78,7 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی داده بزرگتر خواهید داشت. -در این بخش ما از داده MRPC (Microsoft Research Paraphrase Corpus) که در [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf) by William B. Dolan and Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب میباشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. ما این داده را به این دلیل انتخاب کردیم که داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از داده MRPC (Microsoft Research Paraphrase Corpus) که در [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf) by William B. Dolan and Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب میباشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این داده این است که داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. From 3544c2903a69622ae9309a9d5d99948d14e54f16 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 20 Apr 2022 19:13:24 +0200 Subject: [PATCH 026/254] new sentence added --- chapters/fa/chapter3/2.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 3f4372212..aeca47bff 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک ابجکت "DatasetDict" بدست می آوریم که شامل مجموعه داده های Train, Test, و Validation میباشد. هریک از اینها شامل چندین سطون (`sentence1`, `sentence2`, `label`, and `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می دهند میباشد. +همانطور که می بینید یک ابجکت "DatasetDict" بدست می آوریم که شامل مجموعه داده های Train Test, و Validation میباشد. هریک از اینها شامل چندین سطون (`sentence1`, `sentence2`, `label`, and `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می دهند میباشد. As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). @@ -135,6 +135,8 @@ As you can see, we get a `DatasetDict` object which contains the training set, t This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. +ما می توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از indexing درست مانند یک dictionary دسترسی پیدا کنیم: + We can access each pair of sentences in our `raw_datasets` object by indexing, like with a dictionary: ```py From e297990bbe2c6304d4b006905b9929d4b2abf570 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 08:43:15 +0200 Subject: [PATCH 027/254] new paragraph added --- chapters/fa/chapter3/2.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index aeca47bff..5b6c40429 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -135,7 +135,7 @@ As you can see, we get a `DatasetDict` object which contains the training set, t This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. -ما می توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از indexing درست مانند یک dictionary دسترسی پیدا کنیم: +ما می توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از indexing, مانند یک dictionary دسترسی پیدا کنیم: We can access each pair of sentences in our `raw_datasets` object by indexing, like with a dictionary: @@ -151,6 +151,8 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` +ما می‌توانیم ببینم که برچسبها از پیش مقادیر عددی صحیح هستند، بنابراین نیازی به پیش پردازش آنها نداریم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، ما می‌توانیم ویژگی‌های `raw_train_dataset`‌مان را بررسی کنیم. + We can see the labels are already integers, so we won't have to do any preprocessing there. To know which integer corresponds to which label, we can inspect the `features` of our `raw_train_dataset`. This will tell us the type of each column: ```py From d279e146735c9d338d3adb2b8e3a8fdf43dcdb8b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 09:03:01 +0200 Subject: [PATCH 028/254] new paragraph added --- chapters/fa/chapter3/2.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 5b6c40429..e2247f80d 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -151,7 +151,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -ما می‌توانیم ببینم که برچسبها از پیش مقادیر عددی صحیح هستند، بنابراین نیازی به پیش پردازش آنها نداریم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، ما می‌توانیم ویژگی‌های `raw_train_dataset`‌مان را بررسی کنیم. +می‌توانیم از پیش ببینم که برچسبها مقادیر عددی صحیح هستند، بنابراین نیازی به پیش پردازش آنها نداریم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، ما می‌توانیم ویژگی‌های `raw_train_dataset`‌مان را بررسی کنیم. We can see the labels are already integers, so we won't have to do any preprocessing there. To know which integer corresponds to which label, we can inspect the `features` of our `raw_train_dataset`. This will tell us the type of each column: @@ -166,6 +166,8 @@ raw_train_dataset.features 'idx': Value(dtype='int32', id=None)} ``` +در پیش صحنه، `برچسب` از نوع `برچسب کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent`، و `1` مربوط به `equivalent` می‌باشد،. + Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers to label name is stored in the *names* folder. `0` corresponds to `not_equivalent`, and `1` corresponds to `equivalent`. From 104acb966821eb857141dd801717c4b5ebc0c9c2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 18:15:46 +0200 Subject: [PATCH 029/254] new paragraph added --- chapters/fa/chapter3/2.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index e2247f80d..e8590aa97 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -166,12 +166,14 @@ raw_train_dataset.features 'idx': Value(dtype='int32', id=None)} ``` -در پیش صحنه، `برچسب` از نوع `برچسب کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent`، و `1` مربوط به `equivalent` می‌باشد،. +در پشت صحنه، `برچسب` از نوع `برچسب کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent`، و `1` مربوط به `equivalent` می‌باشد،. Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers to label name is stored in the *names* folder. `0` corresponds to `not_equivalent`, and `1` corresponds to `equivalent`. +✏️ **خودتان امتحان کنید!** عنصر شماره ۱۵ از داده --- و عنصر شماره ۸۷ از داده --- را مشاهده کنید. برچسبهای آنها چیست؟ + ✏️ **Try it out!** Look at element 15 of the training set and element 87 of the validation set. What are their labels? From cc15095fb9df63d99e82687b75b8a6f09d851bb2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 18:22:21 +0200 Subject: [PATCH 030/254] new paragraph added --- chapters/fa/chapter3/2.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index e8590aa97..3301a3a9f 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -174,6 +174,12 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers ✏️ **خودتان امتحان کنید!** عنصر شماره ۱۵ از داده --- و عنصر شماره ۸۷ از داده --- را مشاهده کنید. برچسبهای آنها چیست؟ + + + + +✏️ **خودتان امتحان کنید!** عنصر شماره ۱۵ از داده --- و عنصر شماره ۸۷ از داده --- را مشاهده کنید. برچسبهای آنها چیست؟ + ✏️ **Try it out!** Look at element 15 of the training set and element 87 of the validation set. What are their labels? From e9e9250b63f884ec319ce34388e6bbe3244d759e Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 18:23:12 +0200 Subject: [PATCH 031/254] new paragraph added --- chapters/fa/chapter3/2.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 3301a3a9f..ad80ef599 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -172,14 +172,12 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers -✏️ **خودتان امتحان کنید!** عنصر شماره ۱۵ از داده --- و عنصر شماره ۸۷ از داده --- را مشاهده کنید. برچسبهای آنها چیست؟ +✏️ **خودتان امتحان کنید!** عنصر شماره ۱۵ از داده training و عنصر شماره ۸۷ از داده validation را مشاهده کنید. برچسبهای آنها چیست؟ -✏️ **خودتان امتحان کنید!** عنصر شماره ۱۵ از داده --- و عنصر شماره ۸۷ از داده --- را مشاهده کنید. برچسبهای آنها چیست؟ - ✏️ **Try it out!** Look at element 15 of the training set and element 87 of the validation set. What are their labels? From a98899d93f7ce919764dd91c9ad0b87654901927 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 18:29:19 +0200 Subject: [PATCH 032/254] new paragraph added --- chapters/fa/chapter3/2.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index ad80ef599..0e763c406 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -182,6 +182,8 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers +### پیش پردازشِ یک داده + ### Preprocessing a dataset {#if fw === 'pt'} @@ -190,6 +192,8 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers {/if} +به منظور پیش بردازش داد، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در فصل قبل مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم را به صورت زیر توکنایز کنیم: + To preprocess the dataset, we need to convert the text to numbers the model can make sense of. As you saw in the [previous chapter](/course/chapter2), this is done with a tokenizer. We can feed the tokenizer one sentence or a list of sentences, so we can directly tokenize all the first sentences and all the second sentences of each pair like this: ```py From 3c7526d27cb365d2c09fa4e4e7eb400b580cd146 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 18:39:46 +0200 Subject: [PATCH 033/254] new paragraph added --- chapters/fa/chapter3/2.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 0e763c406..fa5c5b229 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -192,7 +192,7 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers {/if} -به منظور پیش بردازش داد، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در فصل قبل مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم را به صورت زیر توکنایز کنیم: +به منظور پیش بردازش داد، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2), مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: To preprocess the dataset, we need to convert the text to numbers the model can make sense of. As you saw in the [previous chapter](/course/chapter2), this is done with a tokenizer. We can feed the tokenizer one sentence or a list of sentences, so we can directly tokenize all the first sentences and all the second sentences of each pair like this: @@ -205,6 +205,8 @@ tokenized_sentences_1 = tokenizer(raw_datasets["train"]["sentence1"]) tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) ``` +با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیشبینی کند متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکنایز می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده سازی کند: + However, we can't just pass two sequences to the model and get a prediction of whether the two sentences are paraphrases or not. We need to handle the two sequences as a pair, and apply the appropriate preprocessing. Fortunately, the tokenizer can also take a pair of sequences and prepare it the way our BERT model expects: ```py From f1ed412a35c288766bd4d5bfbb31119ed2fb007a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 18:40:59 +0200 Subject: [PATCH 034/254] fixed typo --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index fa5c5b229..a3be1e26d 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -192,7 +192,7 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers {/if} -به منظور پیش بردازش داد، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2), مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: +به منظور پیش بردازش داد، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: To preprocess the dataset, we need to convert the text to numbers the model can make sense of. As you saw in the [previous chapter](/course/chapter2), this is done with a tokenizer. We can feed the tokenizer one sentence or a list of sentences, so we can directly tokenize all the first sentences and all the second sentences of each pair like this: From 7b758748e3a0f5b075130912d066569cd300ac26 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 19:28:48 +0200 Subject: [PATCH 035/254] multiple paragraphs first draft added --- chapters/fa/chapter3/2.mdx | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index a3be1e26d..399588ba2 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -172,7 +172,7 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers -✏️ **خودتان امتحان کنید!** عنصر شماره ۱۵ از داده training و عنصر شماره ۸۷ از داده validation را مشاهده کنید. برچسبهای آنها چیست؟ +✏️ **امتحان کنید!** عنصر شماره ۱۵ از داده training و عنصر شماره ۸۷ از داده validation را مشاهده کنید. برچسبهای آنها چیست؟ @@ -222,26 +222,36 @@ inputs } ``` +در فصل ۲ ما در مورد `input_ids` شری `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی جمله اول و کدام بخش جمله دوم است. + We discussed the `input_ids` and `attention_mask` keys in [Chapter 2](/course/chapter2), but we put off talking about `token_type_ids`. In this example, this is what tells the model which part of the input is the first sentence and which is the second sentence. +✏️ **امتحان کنید!** عنصر شماره ۱۵ داده را بردارید و دو جمله را به صورت جداگانه و جفت توکنایز کنید. تفاوت دو نتیجه چیست؟ + ✏️ **Try it out!** Take element 15 of the training set and tokenize the two sentences separately and as a pair. What's the difference between the two results? +اگر آیدی های داخل `input_ids` را رمزگشایی کنیم: + If we decode the IDs inside `input_ids` back to words: ```py tokenizer.convert_ids_to_tokens(inputs["input_ids"]) ``` +خواهیم داشت: + we will get: ```python out ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` +بنابر این می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. + So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] sentence2 [SEP]` when there are two sentences. Aligning this with the `token_type_ids` gives us: ```python out @@ -249,16 +259,28 @@ So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] ``` +همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` میباشند همگی دارای آیدی نوع توکن `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند همگی دارای آیدی نوع توکن `1` میباشند. + As you can see, the parts of the input corresponding to `[CLS] sentence1 [SEP]` all have a token type ID of `0`, while the other parts, corresponding to `sentence2 [SEP]`, all have a token type ID of `1`. +توجه داشته باشید که اگر چکپوینت دیگری را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل میداند با آنها چکار کند، به این خاطر که آنها را در زمان پیش تعلیم دیده است. + Note that if you select a different checkpoint, you won't necessarily have the `token_type_ids` in your tokenized inputs (for instance, they're not returned if you use a DistilBERT model). They are only returned when the model will know what to do with them, because it has seen them during its pretraining. +در اینجا، --- با آیدی های نوع توکن پیش‌تعلیم شده، و در بالای هدف مدل زبانی ماسکی که در فصل --- در مورد آن صحبت کردیم، این مدل یک وظیفه دیگ تحت عنوان ---- دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد،. + Here, BERT is pretrained with token type IDs, and on top of the masked language modeling objective we talked about in [Chapter 1](/course/chapter1), it has an additional objective called _next sentence prediction_. The goal with this task is to model the relationship between pairs of sentences. + در روش پیش بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده اند) به مدل داده می‌شود و از آن خواسته می‌شود که پیش بینی کند که آیا جمله دوم در ادامه جمله اول قرار دارد یا خیر.برای خارج کردن وظیفه از حالت بدیهی، در نیمی از حالتها جمله‌ها در متن اصلی به دنبال هم آمده‌اند، و در نیمی دیگر دو جمله از دو متن متفاوت می‌آیند. + With next sentence prediction, the model is provided pairs of sentences (with randomly masked tokens) and asked to predict whether the second sentence follows the first. To make the task non-trivial, half of the time the sentences follow each other in the original document they were extracted from, and the other half of the time the two sentences come from two different documents. +در مجموع، نیازی نیست نگران وجود یا عدم وجود --- در ورودی های توکنیزه شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چراکه توکنایزر میداند چه چیزی برای مدل تهیه کند. + In general, you don't need to worry about whether or not there are `token_type_ids` in your tokenized inputs: as long as you use the same checkpoint for the tokenizer and the model, everything will be fine as the tokenizer knows what to provide to its model. +اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت از جملات برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک راه برای پیش پردازشِ داده training اینگونه می‌باشد: + Now that we have seen how our tokenizer can deal with one pair of sentences, we can use it to tokenize our whole dataset: like in the [previous chapter](/course/chapter2), we can feed the tokenizer a list of pairs of sentences by giving it the list of first sentences, then the list of second sentences. This is also compatible with the padding and truncation options we saw in [Chapter 2](/course/chapter2). So, one way to preprocess the training dataset is: ```py From 5f09dc4ecdff84c1f2dfaf435032cbb21a58da33 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 21 Apr 2022 22:05:36 +0200 Subject: [PATCH 036/254] polish --- chapters/fa/chapter3/2.mdx | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 399588ba2..f79bafe58 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -25,7 +25,7 @@ {#if fw === 'pt'} - در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می دهیم: + در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می‌دهیم: ```python import torch @@ -51,7 +51,7 @@ optimizer.step() ``` {:else} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می‌دهیم: ```python import tensorflow as tf @@ -76,9 +76,9 @@ model.train_on_batch(batch, labels) {/if} -البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی داده بزرگتر خواهید داشت. +البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. -در این بخش ما از داده MRPC (Microsoft Research Paraphrase Corpus) که در [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf) by William B. Dolan and Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب میباشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این داده این است که داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf) نوشته William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. @@ -95,11 +95,11 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras {/if} -هاب تنها شامل مدلها نمیشود؛ بلکه شامل داده های متعدد در بسیاری زبانهای مختلف می باشد. شما میتوانید داده ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می کنیم پس از اتمام این بخش یک داده جدید را بارگذاری و پردازش کنید (بخش متون عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک بنچمارک اکادمی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ وظیفه دسته بندی متن مختلف میباشد. +هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه داده های متعدد در بسیاری زبانهای مختلف می‌باشد. شما می‌توانید مجموعه داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می کنیم پس از اتمام این بخش یک مجموعه داده جدید را دریافت و پردازش کنید (بخش متون عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. -کتابخانه داده 🤗 یک دستور بسیار ساده جهت دانلود و بارگذاری یک داده در هاب ارائه میکند. ما میتوانیم داده MRPC را به روش زیر دانلود کنیم. +کتابخانه مجموعه داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه داده در هاب ارائه میکند. ما میتوانیم مجموعه داده MRPC را به روش زیر دانلود کنیم. The 🤗 Datasets library provides a very simple command to download and cache a dataset on the Hub. We can download the MRPC dataset like this: @@ -131,7 +131,7 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). -این دستور داده را به صورت پیش فرض در *~/.cache/huggingface/dataset* دانلود و کش میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید دایرکتوری کشتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه داده را به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* دانلود و ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. @@ -182,7 +182,7 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers -### پیش پردازشِ یک داده +### پیش پردازشِ یک مجموعه داده ### Preprocessing a dataset @@ -192,7 +192,7 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers {/if} -به منظور پیش بردازش داد، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: +به منظور پیش بردازش مجموعه داده، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: To preprocess the dataset, we need to convert the text to numbers the model can make sense of. As you saw in the [previous chapter](/course/chapter2), this is done with a tokenizer. We can feed the tokenizer one sentence or a list of sentences, so we can directly tokenize all the first sentences and all the second sentences of each pair like this: @@ -222,7 +222,7 @@ inputs } ``` -در فصل ۲ ما در مورد `input_ids` شری `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی جمله اول و کدام بخش جمله دوم است. +در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی جمله اول و کدام بخش جمله دوم است. We discussed the `input_ids` and `attention_mask` keys in [Chapter 2](/course/chapter2), but we put off talking about `token_type_ids`. In this example, this is what tells the model which part of the input is the first sentence and which is the second sentence. @@ -259,27 +259,27 @@ So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] ``` -همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` میباشند همگی دارای آیدی نوع توکن `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند همگی دارای آیدی نوع توکن `1` میباشند. +همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` می‌باشند همگی دارای آیدی نوع توکن `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند همگی دارای آیدی نوع توکن `1` می‌باشند. As you can see, the parts of the input corresponding to `[CLS] sentence1 [SEP]` all have a token type ID of `0`, while the other parts, corresponding to `sentence2 [SEP]`, all have a token type ID of `1`. -توجه داشته باشید که اگر چکپوینت دیگری را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل میداند با آنها چکار کند، به این خاطر که آنها را در زمان پیش تعلیم دیده است. +توجه داشته باشید که اگر چکپوینت دیگری را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. Note that if you select a different checkpoint, you won't necessarily have the `token_type_ids` in your tokenized inputs (for instance, they're not returned if you use a DistilBERT model). They are only returned when the model will know what to do with them, because it has seen them during its pretraining. -در اینجا، --- با آیدی های نوع توکن پیش‌تعلیم شده، و در بالای هدف مدل زبانی ماسکی که در فصل --- در مورد آن صحبت کردیم، این مدل یک وظیفه دیگ تحت عنوان ---- دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد،. +در اینجا، BERT با آیدی های نوع توکن پیش‌تعلیم شده، و در بالای هدف مدل زبانی ماسکی که در فصل --- در مورد آن صحبت کردیم، این مدل یک وظیفه دیگر تحت عنوان _next sentence prediction_ دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. Here, BERT is pretrained with token type IDs, and on top of the masked language modeling objective we talked about in [Chapter 1](/course/chapter1), it has an additional objective called _next sentence prediction_. The goal with this task is to model the relationship between pairs of sentences. - در روش پیش بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده اند) به مدل داده می‌شود و از آن خواسته می‌شود که پیش بینی کند که آیا جمله دوم در ادامه جمله اول قرار دارد یا خیر.برای خارج کردن وظیفه از حالت بدیهی، در نیمی از حالتها جمله‌ها در متن اصلی به دنبال هم آمده‌اند، و در نیمی دیگر دو جمله از دو متن متفاوت می‌آیند. + در روش پیش‌ بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شود و از آن خواسته می‌شود که پیش بینی کند آیا جمله دوم در ادامه جمله اول قرار دارد یا خیر.برای خارج کردن وظیفه از حالت بدیهی، در نیمی از حالتها جمله‌ها در متن اصلی به دنبال هم آمده‌اند، و در نیمی دیگر دو جمله از دو متن متفاوت می‌آیند. With next sentence prediction, the model is provided pairs of sentences (with randomly masked tokens) and asked to predict whether the second sentence follows the first. To make the task non-trivial, half of the time the sentences follow each other in the original document they were extracted from, and the other half of the time the two sentences come from two different documents. -در مجموع، نیازی نیست نگران وجود یا عدم وجود --- در ورودی های توکنیزه شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چراکه توکنایزر میداند چه چیزی برای مدل تهیه کند. +در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی های توکنیزه شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چراکه توکنایزر میداند چه چیزی برای مدل تهیه کند. In general, you don't need to worry about whether or not there are `token_type_ids` in your tokenized inputs: as long as you use the same checkpoint for the tokenizer and the model, everything will be fine as the tokenizer knows what to provide to its model. -اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت از جملات برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک راه برای پیش پردازشِ داده training اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل مجموعه داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک راه برای پیش پردازشِ مجموعه داده training اینگونه می‌باشد: Now that we have seen how our tokenizer can deal with one pair of sentences, we can use it to tokenize our whole dataset: like in the [previous chapter](/course/chapter2), we can feed the tokenizer a list of pairs of sentences by giving it the list of first sentences, then the list of second sentences. This is also compatible with the padding and truncation options we saw in [Chapter 2](/course/chapter2). So, one way to preprocess the training dataset is: @@ -291,9 +291,12 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` +این به خوبی کار میکند، اما مشکلش این است که یک dictionary برمیگرداند (شامل کلیدها، `input_ids`, `attention_mask`, and `token_type_ids`, و مقادیری که مجموعه ای از مجموعه ها هستند). همچنین این روش فقط زمانی کار میکند که حافظه موقت کافی جهت ذخیره سازی کل مجموعه داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه داده‌های موجود در پایگاه مجموعه داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره سازی در حافظه درخواست کردید نگه میدارید. ) This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). + + To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: ```py From cb38ccb54b3073bd4ade7167434528e5d0ab01d7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 22 Apr 2022 08:49:51 +0200 Subject: [PATCH 037/254] new paragraphs added --- chapters/fa/chapter3/2.mdx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index f79bafe58..8e48007c1 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -291,11 +291,11 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` -این به خوبی کار میکند، اما مشکلش این است که یک dictionary برمیگرداند (شامل کلیدها، `input_ids`, `attention_mask`, and `token_type_ids`, و مقادیری که مجموعه ای از مجموعه ها هستند). همچنین این روش فقط زمانی کار میکند که حافظه موقت کافی جهت ذخیره سازی کل مجموعه داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه داده‌های موجود در پایگاه مجموعه داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره سازی در حافظه درخواست کردید نگه میدارید. ) +این به خوبی کار میکند، اما مشکلش این است که یک dictionary برمیگرداند (شامل کلیدها، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیری که مجموعه ای از مجموعه ها هستند). همچنین این روش فقط زمانی کار میکند که حافظه موقت کافی جهت ذخیره سازی کل مجموعه داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه داده‌های موجود در پایگاه مجموعه داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره سازی در حافظه درخواست کردید نگه میدارید. ) This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). - +به منظور نگه داشتن داده به صورت یک مجموعه داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. این روش همچنین به ما انعطافپذیری می‌دهد چنانچه به پیش پردازشهای بیشتری نیاز داشته باشیم. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: @@ -304,8 +304,12 @@ def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` +این تابع یک دیکشنری (مثل اقلام داخل مجموعه داده) دریافت میکند و دیکشنری دیگری بازمی‌گرداند با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`. توجه داشته باشید از انجایی که توکنایزر بر روی لیستهایی از جفت جمله ها کار میکند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار میکند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. + This function takes a dictionary (like the items of our dataset) and returns a new dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`. Note that it also works if the `example` dictionary contains several samples (each key as a list of sentences) since the `tokenizer` works on lists of pairs of sentences, as seen before. This will allow us to use the option `batched=True` in our call to `map()`, which will greatly speed up the tokenization. The `tokenizer` is backed by a tokenizer written in Rust from the [🤗 Tokenizers](https://github.com/huggingface/tokenizers) library. This tokenizer can be very fast, but only if we give it lots of inputs at once. + + Note that we've left the `padding` argument out in our tokenization function for now. This is because padding all the samples to the maximum length is not efficient: it's better to pad the samples when we're building a batch, as then we only need to pad to the maximum length in that batch, and not the maximum length in the entire dataset. This can save a lot of time and processing power when the inputs have very variable lengths! Here is how we apply the tokenization function on all our datasets at once. We're using `batched=True` in our call to `map` so the function is applied to multiple elements of our dataset at once, and not on each element separately. This allows for faster preprocessing. From ec10da95c14601b7fafefa2cb1ad73dfd3054f20 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 22 Apr 2022 09:16:09 +0200 Subject: [PATCH 038/254] new paragraphs added --- chapters/fa/chapter3/2.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 8e48007c1..af458dce3 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -308,16 +308,19 @@ def tokenize_function(example): This function takes a dictionary (like the items of our dataset) and returns a new dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`. Note that it also works if the `example` dictionary contains several samples (each key as a list of sentences) since the `tokenizer` works on lists of pairs of sentences, as seen before. This will allow us to use the option `batched=True` in our call to `map()`, which will greatly speed up the tokenization. The `tokenizer` is backed by a tokenizer written in Rust from the [🤗 Tokenizers](https://github.com/huggingface/tokenizers) library. This tokenizer can be very fast, but only if we give it lots of inputs at once. - +توجه داشته باشید ما مبحث `padding` را در حال حاضر کنار گذاشته ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` روی نمونه‌ها را زمانی که در حال ساختن بتچ هستیم انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بتچ انجام دهیم، و نه بیشترین طول در سرتاسر مجموعه داده. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متقیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. Note that we've left the `padding` argument out in our tokenization function for now. This is because padding all the samples to the maximum length is not efficient: it's better to pad the samples when we're building a batch, as then we only need to pad to the maximum length in that batch, and not the maximum length in the entire dataset. This can save a lot of time and processing power when the inputs have very variable lengths! +در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل مجموعه داده به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابر این تابع بر روی چندین عنصر از مجموعه داده ما به یکباره عمل می‌کند، نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش پردازش سریعتر انجام گیرد: + Here is how we apply the tokenization function on all our datasets at once. We're using `batched=True` in our call to `map` so the function is applied to multiple elements of our dataset at once, and not on each element separately. This allows for faster preprocessing. ```py tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` +کتابخانه مجموعه داده 🤗 این پیش پردازش را با افزودن -فیلدهای- جدید به مجموعه داده‌ها، یکی به ازای هر کلید در -دیکشنری- که توسط تابع پیش پردازش باز گردانده می‌شود اعمال می‌کند، The way the 🤗 Datasets library applies this processing is by adding new fields to the datasets, one for each key in the dictionary returned by the preprocessing function: From 06fc68f5b608cec259c02e6a1689fb6708cdf899 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 22 Apr 2022 10:56:35 +0200 Subject: [PATCH 039/254] new paragraphs added --- chapters/fa/chapter3/2.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index af458dce3..c7fe4f65e 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -341,10 +341,16 @@ DatasetDict({ }) ``` +شما حتی می‌توانید زمانی که تابع پیش پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایز سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش پردازش شما را سریعتر کند. + You can even use multiprocessing when applying your preprocessing function with `map()` by passing along a `num_proc` argument. We didn't do this here because the 🤗 Tokenizers library already uses multiple threads to tokenize our samples faster, but if you are not using a fast tokenizer backed by this library, this could speed up your preprocessing. +تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخشهای مجموعه داده افزوده گردند. توجه داشته باشید که اگر تابع پیش پردازش ما برای یک کلید موجود در مجموعه داده که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گرداند همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. + Our `tokenize_function` returns a dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`, so those three fields are added to all splits of our dataset. Note that we could also have changed existing fields if our preprocessing function returned a new value for an existing key in the dataset to which we applied `map()`. +آخرین چیزی که نیاز داریم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر پَد کنیم - تکنیکی که ما به آن *dynamic padding* می‌گوییم. + The last thing we will need to do is pad all the examples to the length of the longest element when we batch elements together — a technique we refer to as *dynamic padding*. ### Dynamic padding From f61f8b7cf6b565fbfc08f2b481667a808c9a6829 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 22 Apr 2022 16:05:06 +0200 Subject: [PATCH 040/254] new paragraphs added --- chapters/fa/chapter3/2.mdx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index c7fe4f65e..8524392aa 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -349,19 +349,26 @@ You can even use multiprocessing when applying your preprocessing function with Our `tokenize_function` returns a dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`, so those three fields are added to all splits of our dataset. Note that we could also have changed existing fields if our preprocessing function returned a new value for an existing key in the dataset to which we applied `map()`. -آخرین چیزی که نیاز داریم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر پَد کنیم - تکنیکی که ما به آن *dynamic padding* می‌گوییم. +آخرین چیزی که نیاز داریم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر پَد کنیم - تکنیکی که ما به آن *dynamic padding* (هم طول کردن پویا) می‌گوییم. The last thing we will need to do is pad all the examples to the length of the longest element when we batch elements together — a technique we refer to as *dynamic padding*. +### هم طول کردن پویا + ### Dynamic padding {#if fw === 'pt'} + +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم طول سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم طول سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم طول سازی اضافه داشته باشد. + The function that is responsible for putting together samples inside a batch is called a *collate function*. It's an argument you can pass when you build a `DataLoader`, the default being a function that will just convert your samples to PyTorch tensors and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. {:else} +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. collator پیش فرض تابعی است که فقط نمونه‌های شما را به tf.Tensor تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم طول سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم طول سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم طول سازی اضافه داشته باشد. + The function that is responsible for putting together samples inside a batch is called a *collate function*. The default collator is a function that will just convert your samples to tf.Tensor and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. {/if} From 7f2a8bbb24659506a89f01e6989c73d8aef56ffc Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 22 Apr 2022 17:14:41 +0200 Subject: [PATCH 041/254] first draft done. --- chapters/fa/chapter3/2.mdx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 8524392aa..51c2598f2 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -349,7 +349,7 @@ You can even use multiprocessing when applying your preprocessing function with Our `tokenize_function` returns a dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`, so those three fields are added to all splits of our dataset. Note that we could also have changed existing fields if our preprocessing function returned a new value for an existing key in the dataset to which we applied `map()`. -آخرین چیزی که نیاز داریم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر پَد کنیم - تکنیکی که ما به آن *dynamic padding* (هم طول کردن پویا) می‌گوییم. +آخرین چیزی که نیاز داریم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر پَد کنیم - تکنیکی که ما به آن *dynamic padding* (همطول سازی پویا) می‌گوییم. The last thing we will need to do is pad all the examples to the length of the longest element when we batch elements together — a technique we refer to as *dynamic padding*. @@ -373,6 +373,8 @@ The function that is responsible for putting together samples inside a batch is {/if} +برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم طول سازی را به آیتمهای مجموعه داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا معرفی کنید (که چه توکنی برای همطول سازی استفاده کند، و اینکه مدل انتظار همطول سازی از سمت چپ ورودی‌ها را دارد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: + To do this in practice, we have to define a collate function that will apply the correct amount of padding to the items of the dataset we want to batch together. Fortunately, the 🤗 Transformers library provides us with such a function via `DataCollatorWithPadding`. It takes a tokenizer when you instantiate it (to know which padding token to use, and whether the model expects padding to be on the left or on the right of the inputs) and will do everything you need: {#if fw === 'pt'} @@ -389,6 +391,8 @@ data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf" ``` {/if} +اجازه دهید چند نمونه از مجموعه training مان، که می‌خواهیم باهم بَتچ کنیم، برداریم تا این ابزار جدید را امتحان کنیم. در اینجا سطون‌های -، --، و --- را خذف می‌کنیم چراکه احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (و ما نمی‌توانیم تنسورهایی با رشته های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: + To test this new toy, let's grab a few samples from our training set that we would like to batch together. Here, we remove the columns `idx`, `sentence1`, and `sentence2` as they won't be needed and contain strings (and we can't create tensors with strings) and have a look at the lengths of each entry in the batch: ```py @@ -401,6 +405,8 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se [50, 59, 47, 67, 59, 50, 62, 32] ``` +تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. همطول سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، همطول شده باشند. بدون همطول سازی پویا، همه نمونه‌ها در کل مجموعه داده باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، همطول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی همطول می‌کند: + No surprise, we get samples of varying length, from 32 to 67. Dynamic padding means the samples in this batch should all be padded to a length of 67, the maximum length inside the batch. Without dynamic padding, all of the samples would have to be padded to the maximum length in the whole dataset, or the maximum length the model can accept. Let's double-check that our `data_collator` is dynamically padding the batch properly: ```py @@ -426,18 +432,24 @@ batch = data_collator(samples) 'labels': torch.Size([8])} ``` +به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل مان می‌تواند با آنها کار کند، آماده هستیم برای انجام بازتنظیم مدل: + Looking good! Now that we've gone from raw text to batches our model can deal with, we're ready to fine-tune it! {/if} +✏️ **امتحان کنید!** پروسه پیش بردازش را روی مجموعه داده GLUE SST-2 باز تکرار کنید. این یک مقدار متفاوت است از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد، اما بقیه کارهایی که انجام دادیم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. + ✏️ **Try it out!** Replicate the preprocessing on the GLUE SST-2 dataset. It's a little bit different since it's composed of single sentences instead of pairs, but the rest of what we did should look the same. For a harder challenge, try to write a preprocessing function that works on any of the GLUE tasks. {#if fw === 'tf'} +توجه داشته باشید که ما مجموعه‌ داده مان و یک collator داریم، حال نیاز داریم که آنها را بهم وصل کنیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این کار زیادی می‌برد و احتمالا خیلی بهینه هم نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور مجموعه داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه داده‌مان مشاهده کنیم! + Now that we have our dataset and a data collator, we need to put them together. We could manually load batches and collate them, but that's a lot of work, and probably not very performant either. Instead, there's a simple method that offers a performant solution to this problem: `to_tf_dataset()`. This will wrap a `tf.data.Dataset` around your dataset, with an optional collation function. `tf.data.Dataset` is a native TensorFlow format that Keras can use for `model.fit()`, so this one method immediately converts a 🤗 Dataset to a format that's ready for training. Let's see it in action with our dataset! ```py @@ -458,6 +470,8 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` +این هم از این! ما می‌توانی آن مجموعه داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختیهای پروسه پیش پردازش به طرز خوشایندی سرراست خواهد بود. + And that's it! We can take those datasets forward into the next lecture, where training will be pleasantly straightforward after all the hard work of data preprocessing. {/if} From f5aa7689d0c6f25d0ccfc49c6f32f1a31c47362d Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 09:56:44 +0200 Subject: [PATCH 042/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 51c2598f2..07112d48c 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -25,7 +25,7 @@ {#if fw === 'pt'} - در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بَتچ توسط pytorch را شرح می‌دهیم: ```python import torch @@ -78,7 +78,7 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf) نوشته William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه داده (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، MRPC نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. From a93d7a20555992a33cfb9228a6ea85bd3f53ee8c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 09:57:52 +0200 Subject: [PATCH 043/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 07112d48c..ee1fb467c 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -78,7 +78,7 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه داده (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، MRPC نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه داده (Microsoft Research Paraphrase Corpus) MRPC که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. From ede676eeff9ef15dd011c1b572ea9132e01de84f Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 09:58:49 +0200 Subject: [PATCH 044/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index ee1fb467c..5252a0ea9 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -78,7 +78,7 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه داده (Microsoft Research Paraphrase Corpus) MRPC که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. From 113d77aa2d118ee72a17716059df2731bf7a0ae9 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 09:59:48 +0200 Subject: [PATCH 045/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 5252a0ea9..ee1fb467c 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -78,7 +78,7 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه داده (Microsoft Research Paraphrase Corpus) MRPC که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. From 2f4a662264bfd44bcaeab89546ac96d1f7341a76 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:00:58 +0200 Subject: [PATCH 046/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index ee1fb467c..c22ac970a 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -78,7 +78,7 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه داده (Microsoft Research Paraphrase Corpus) MRPC که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه داده MRPC یا (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. From 4dd8c5def92ab4a50326f259c45f0c4bfa872887 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:01:46 +0200 Subject: [PATCH 047/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index c22ac970a..5252a0ea9 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -78,7 +78,7 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه داده MRPC یا (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. From 33c8b39612aa7960d903ad0c2be854d1b6f45739 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:02:26 +0200 Subject: [PATCH 048/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 5252a0ea9..bd9e9d859 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -78,7 +78,7 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett. معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. From 54a7614bd287cf60c7c3f2c6bfd63eb8cd12927c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:15:46 +0200 Subject: [PATCH 049/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index bd9e9d859..d90da1c68 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -78,14 +78,14 @@ model.train_on_batch(batch, labels) البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) است. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. In this section we will use as an example the MRPC (Microsoft Research Paraphrase Corpus) dataset, introduced in a [paper](https://www.aclweb.org/anthology/I05-5002.pdf) by William B. Dolan and Chris Brockett. The dataset consists of 5,801 pairs of sentences, with a label indicating if they are paraphrases or not (i.e., if both sentences mean the same thing). We've selected it for this chapter because it's a small dataset, so it's easy to experiment with training on it. -### بارگذاری داده از هاب +### بارگذاری یک داده از هاب ### Loading a dataset from the Hub @@ -95,11 +95,11 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras {/if} -هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه داده های متعدد در بسیاری زبانهای مختلف می‌باشد. شما می‌توانید مجموعه داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می کنیم پس از اتمام این بخش یک مجموعه داده جدید را دریافت و پردازش کنید (بخش متون عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. +هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه داده‌های متعدد در بسیاری زبانهای مختلف می‌باشد. شما می‌توانید مجموعه داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. -کتابخانه مجموعه داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه داده در هاب ارائه میکند. ما میتوانیم مجموعه داده MRPC را به روش زیر دانلود کنیم. +کتابخانه مجموعه داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه داده در هاب ارائه میکند. ما میتوانیم مجموعه داده MRPC را به روش زیر دانلود کنیم: The 🤗 Datasets library provides a very simple command to download and cache a dataset on the Hub. We can download the MRPC dataset like this: @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک ابجکت "DatasetDict" بدست می آوریم که شامل مجموعه داده های Train Test, و Validation میباشد. هریک از اینها شامل چندین سطون (`sentence1`, `sentence2`, `label`, and `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می دهند میباشد. +همانطور که می بینید یک شیء "DatasetDict" بدست می آوریم که شامل مجموعه داده‌های Train، Test، و Validation می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، `sentence2`، `label`، and `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). From 56ed2ea801feb76650b7616583993cad49879cb2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:18:21 +0200 Subject: [PATCH 050/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index d90da1c68..72cabfe2f 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک شیء "DatasetDict" بدست می آوریم که شامل مجموعه داده‌های Train، Test، و Validation می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، `sentence2`، `label`، and `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). +همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه داده‌های Train، Test، و Validation می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، `sentence2`، `label`، و `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). From e342854b21f64b794d5f83369727947eedb86db7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:21:33 +0200 Subject: [PATCH 051/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 72cabfe2f..f131ded76 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه داده‌های Train، Test، و Validation می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، `sentence2`، `label`، و `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). +همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، `sentence2`، `label`، و `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). From c28091e7ba787e8307c02536bb7dc37fa5a82d45 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:24:44 +0200 Subject: [PATCH 052/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index f131ded76..717195c66 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، `sentence2`، `label`، و `idx`) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). +همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (-، --، ---، و ----) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). From da86f2a9f47b51d6732939789692aec946ebb7a0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:25:54 +0200 Subject: [PATCH 053/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 717195c66..428486c49 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (-، --، ---، و ----) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). +همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، --، ---، و ----) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). From c9680ebe411ca411459e676d85bba820ebdbef5b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:26:34 +0200 Subject: [PATCH 054/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 428486c49..5d225f4ad 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، --، ---، و ----) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). +همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، `sentence2`، ---، و ----) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). From a27f1ba4737e88263b14007a1faa4c2314ad7a6b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:28:59 +0200 Subject: [PATCH 055/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 5d225f4ad..45f0c1efe 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`sentence1`، `sentence2`، ---، و ----) و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). +همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx` و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). From 66efcf3ae8c8ebb5bd40aac2eaa128c02afc8d18 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 24 Apr 2022 10:30:42 +0200 Subject: [PATCH 056/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 45f0c1efe..51f17ed03 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx` و تعداد متغیری ردیف داده که تعداد عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test وجود دارند.). +همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx`) و تعداد متغیری ردیف داده که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training وجود دارد، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test.). As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). From 2b0e4a600fc82bae81e6a0cafb511c0d2ea30819 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 08:33:08 +0200 Subject: [PATCH 057/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 51f17ed03..cc3984948 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -127,7 +127,7 @@ DatasetDict({ }) ``` -همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx`) و تعداد متغیری ردیف داده که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training وجود دارد، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test.). +همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx`) و تعداد متغیری ردیف داده که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training وجود دارد، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test). As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). From af4de38f6010f2b9190cec718bc2a6ec05a2bd82 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 08:40:27 +0200 Subject: [PATCH 058/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index cc3984948..21fd54fd6 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -131,7 +131,7 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه داده را به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* دانلود و ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. From 9c1276fa0be704d32dd9cb42df26a88a9f33df0b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 08:42:07 +0200 Subject: [PATCH 059/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 21fd54fd6..d5a4a7694 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -131,7 +131,7 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. From 5b79da9a816b76515ed150550c4a1b3e1b79d16c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 08:43:26 +0200 Subject: [PATCH 060/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index d5a4a7694..cf18eba9f 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -131,7 +131,7 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *dataset/huggingface/.cache/~* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. From b0fd16396b9c73cac21335c6f31d5b54cea24c3e Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 08:45:00 +0200 Subject: [PATCH 061/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index cf18eba9f..1b0f22ed1 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -131,7 +131,7 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *dataset/huggingface/.cache/~* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. From 217073a21d55f37b286bf5fd1a09d68e99788ddb Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 08:46:11 +0200 Subject: [PATCH 062/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 1b0f22ed1..294372d99 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -131,7 +131,7 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی */.cache/huggingface/dataset~* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. From 1a6bd700a16e245a09fe66eff10c6c97c0f64f22 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 08:49:20 +0200 Subject: [PATCH 063/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 294372d99..0e46cdf29 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -131,7 +131,7 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی */.cache/huggingface/dataset~* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *`~/.cache/huggingface/dataset`* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. From 15f7f953fbdd9688edccb9b6ed0f64eb90736ddf Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 08:50:51 +0200 Subject: [PATCH 064/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 0e46cdf29..1b0f22ed1 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -131,7 +131,7 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *`~/.cache/huggingface/dataset`* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. From a4c9c1782fdaace56b71588b18f6747d6e3fd4a6 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 08:58:33 +0200 Subject: [PATCH 065/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 1b0f22ed1..b588825e3 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -131,11 +131,11 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که شما میتوانید زیرشاخه‌ی ذخیره سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. -ما می توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از indexing, مانند یک dictionary دسترسی پیدا کنیم: +ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از شماره‌گذاری, مانند یک dictionary دسترسی پیدا کنیم: We can access each pair of sentences in our `raw_datasets` object by indexing, like with a dictionary: From 868402c2e1f6f3604eed056903b00e1c196b26b1 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 09:06:12 +0200 Subject: [PATCH 066/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index b588825e3..494bc9957 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -99,7 +99,7 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. -کتابخانه مجموعه داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه داده در هاب ارائه میکند. ما میتوانیم مجموعه داده MRPC را به روش زیر دانلود کنیم: +کتابخانه مجموعه داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه داده در هاب ارائه می‌کند. ما می‌توانیم مجموعه داده MRPC را به روش زیر دانلود کنیم: The 🤗 Datasets library provides a very simple command to download and cache a dataset on the Hub. We can download the MRPC dataset like this: @@ -151,7 +151,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌توانیم از پیش ببینم که برچسبها مقادیر عددی صحیح هستند، بنابراین نیازی به پیش پردازش آنها نداریم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، ما می‌توانیم ویژگی‌های `raw_train_dataset`‌مان را بررسی کنیم. +می‌توانیم از پیش ببینم که برچسبها مقادیر عددی صحیح هستند، بنابراین نیازی به پیش پردازش آنها نداریم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. We can see the labels are already integers, so we won't have to do any preprocessing there. To know which integer corresponds to which label, we can inspect the `features` of our `raw_train_dataset`. This will tell us the type of each column: From 4598b69bf80829b16e14702303024b55798d29a7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 09:12:19 +0200 Subject: [PATCH 067/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 494bc9957..a26f3c77c 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -151,7 +151,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌توانیم از پیش ببینم که برچسبها مقادیر عددی صحیح هستند، بنابراین نیازی به پیش پردازش آنها نداریم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. +می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی در آنجا انجام دهیم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. We can see the labels are already integers, so we won't have to do any preprocessing there. To know which integer corresponds to which label, we can inspect the `features` of our `raw_train_dataset`. This will tell us the type of each column: From 87942d6c092ffbf519b13637fffcc63f7b3b7242 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 09:18:30 +0200 Subject: [PATCH 068/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index a26f3c77c..50f50c9fc 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -234,7 +234,7 @@ We discussed the `input_ids` and `attention_mask` keys in [Chapter 2](/course/ch -اگر آیدی های داخل `input_ids` را رمزگشایی کنیم: +اگر آیدی های داخل `input_ids` را به کلمات رمزگشایی کنیم: If we decode the IDs inside `input_ids` back to words: @@ -250,7 +250,7 @@ we will get: ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` -بنابر این می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. +بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `sentence1 [SEP] sentence2 [SEP] [CLS]` باشند. So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] sentence2 [SEP]` when there are two sentences. Aligning this with the `token_type_ids` gives us: From 1971f779f972ac80b3cb47ffcbfe7e5dd2ed4609 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 09:19:24 +0200 Subject: [PATCH 069/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 50f50c9fc..bbbff15b5 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -250,7 +250,7 @@ we will get: ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` -بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `sentence1 [SEP] sentence2 [SEP] [CLS]` باشند. +بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] sentence2 [SEP]` when there are two sentences. Aligning this with the `token_type_ids` gives us: From a1d8859afcb8ad6b8aace09b3f611521e1306333 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 09:20:54 +0200 Subject: [PATCH 070/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index bbbff15b5..50f50c9fc 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -250,7 +250,7 @@ we will get: ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` -بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. +بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `sentence1 [SEP] sentence2 [SEP] [CLS]` باشند. So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] sentence2 [SEP]` when there are two sentences. Aligning this with the `token_type_ids` gives us: From b5ebbc96095b4336c2551e58e041c76ae6c0ea2d Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 09:23:12 +0200 Subject: [PATCH 071/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 50f50c9fc..b622527cb 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -250,7 +250,7 @@ we will get: ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` -بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `sentence1 [SEP] sentence2 [SEP] [CLS]` باشند. +بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `a [CLS] sentence1 [SEP] sentence2 [SEP]` باشند. So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] sentence2 [SEP]` when there are two sentences. Aligning this with the `token_type_ids` gives us: From 4811b944bf166d551c229ae33c2a2f022d243dc5 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 11:30:20 +0200 Subject: [PATCH 072/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index b622527cb..c606aa67f 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -250,7 +250,7 @@ we will get: ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` -بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `a [CLS] sentence1 [SEP] sentence2 [SEP]` باشند. +بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] sentence2 [SEP]` when there are two sentences. Aligning this with the `token_type_ids` gives us: @@ -259,7 +259,7 @@ So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] ``` -همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` می‌باشند همگی دارای آیدی نوع توکن `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند همگی دارای آیدی نوع توکن `1` می‌باشند. +همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` می‌باشند آیدی نشاندهنده نوع توکِن آنها `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند آیدی نشاندهنده نوع توکِن آنها `1` می‌باشند. As you can see, the parts of the input corresponding to `[CLS] sentence1 [SEP]` all have a token type ID of `0`, while the other parts, corresponding to `sentence2 [SEP]`, all have a token type ID of `1`. @@ -267,7 +267,7 @@ As you can see, the parts of the input corresponding to `[CLS] sentence1 [SEP]` Note that if you select a different checkpoint, you won't necessarily have the `token_type_ids` in your tokenized inputs (for instance, they're not returned if you use a DistilBERT model). They are only returned when the model will know what to do with them, because it has seen them during its pretraining. -در اینجا، BERT با آیدی های نوع توکن پیش‌تعلیم شده، و در بالای هدف مدل زبانی ماسکی که در فصل --- در مورد آن صحبت کردیم، این مدل یک وظیفه دیگر تحت عنوان _next sentence prediction_ دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. +در اینجا، BERT با آیدی های نوع توکن پیش‌تعلیم شده، و در بالای هدف مدل زبانی ماسکی که در [فصل 1](/course/chapter1) در مورد آن صحبت کردیم، این مدل یک وظیفه دیگر تحت عنوان _next sentence prediction_ دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. Here, BERT is pretrained with token type IDs, and on top of the masked language modeling objective we talked about in [Chapter 1](/course/chapter1), it has an additional objective called _next sentence prediction_. The goal with this task is to model the relationship between pairs of sentences. From cc392b970a97ae8e9cd6555d570e4163a766654a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 11:31:39 +0200 Subject: [PATCH 073/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index c606aa67f..bb6406e07 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -151,7 +151,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی در آنجا انجام دهیم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. +می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. We can see the labels are already integers, so we won't have to do any preprocessing there. To know which integer corresponds to which label, we can inspect the `features` of our `raw_train_dataset`. This will tell us the type of each column: From a6b5e07ffcf274cefd28384864298a3a4bc97683 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 11:52:39 +0200 Subject: [PATCH 074/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index bb6406e07..e154869c3 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -151,7 +151,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. +می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. We can see the labels are already integers, so we won't have to do any preprocessing there. To know which integer corresponds to which label, we can inspect the `features` of our `raw_train_dataset`. This will tell us the type of each column: @@ -166,7 +166,7 @@ raw_train_dataset.features 'idx': Value(dtype='int32', id=None)} ``` -در پشت صحنه، `برچسب` از نوع `برچسب کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent`، و `1` مربوط به `equivalent` می‌باشد،. +در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent`، و `1` مربوط به `equivalent` می‌باشد،. Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers to label name is stored in the *names* folder. `0` corresponds to `not_equivalent`, and `1` corresponds to `equivalent`. @@ -182,7 +182,7 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers -### پیش پردازشِ یک مجموعه داده +### پیش‌پردازشِ یک مجموعه داده ### Preprocessing a dataset @@ -192,7 +192,7 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers {/if} -به منظور پیش بردازش مجموعه داده، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: +به منظور پیش‌پردازش مجموعه داده، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: To preprocess the dataset, we need to convert the text to numbers the model can make sense of. As you saw in the [previous chapter](/course/chapter2), this is done with a tokenizer. We can feed the tokenizer one sentence or a list of sentences, so we can directly tokenize all the first sentences and all the second sentences of each pair like this: @@ -205,7 +205,7 @@ tokenized_sentences_1 = tokenizer(raw_datasets["train"]["sentence1"]) tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) ``` -با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیشبینی کند متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکنایز می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده سازی کند: +با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده سازی کند: However, we can't just pass two sequences to the model and get a prediction of whether the two sentences are paraphrases or not. We need to handle the two sequences as a pair, and apply the appropriate preprocessing. Fortunately, the tokenizer can also take a pair of sequences and prepare it the way our BERT model expects: @@ -222,7 +222,7 @@ inputs } ``` -در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی جمله اول و کدام بخش جمله دوم است. +در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی، جمله اول و کدام بخش جمله دوم است. We discussed the `input_ids` and `attention_mask` keys in [Chapter 2](/course/chapter2), but we put off talking about `token_type_ids`. In this example, this is what tells the model which part of the input is the first sentence and which is the second sentence. @@ -259,15 +259,15 @@ So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] ``` -همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` می‌باشند آیدی نشاندهنده نوع توکِن آنها `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند آیدی نشاندهنده نوع توکِن آنها `1` می‌باشند. +همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند آیدی نشاندهنده نوع توکِن آنها `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند آیدی نشاندهنده نوع توکِن‌شان `1` می‌باشد. As you can see, the parts of the input corresponding to `[CLS] sentence1 [SEP]` all have a token type ID of `0`, while the other parts, corresponding to `sentence2 [SEP]`, all have a token type ID of `1`. -توجه داشته باشید که اگر چکپوینت دیگری را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. +توجه داشته باشید که اگر چکپوینت متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. Note that if you select a different checkpoint, you won't necessarily have the `token_type_ids` in your tokenized inputs (for instance, they're not returned if you use a DistilBERT model). They are only returned when the model will know what to do with them, because it has seen them during its pretraining. -در اینجا، BERT با آیدی های نوع توکن پیش‌تعلیم شده، و در بالای هدف مدل زبانی ماسکی که در [فصل 1](/course/chapter1) در مورد آن صحبت کردیم، این مدل یک وظیفه دیگر تحت عنوان _next sentence prediction_ دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. +در اینجا، مدل BERT با آیدی‌هایی که نشاندهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف masked language modeling که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنان _next sentence prediction_ برعهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. Here, BERT is pretrained with token type IDs, and on top of the masked language modeling objective we talked about in [Chapter 1](/course/chapter1), it has an additional objective called _next sentence prediction_. The goal with this task is to model the relationship between pairs of sentences. From 0bcc2f6c0ef3c3a39113053b2792aa8fc7819c36 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:01:57 +0200 Subject: [PATCH 075/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index e154869c3..0378e831d 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -267,11 +267,11 @@ As you can see, the parts of the input corresponding to `[CLS] sentence1 [SEP]` Note that if you select a different checkpoint, you won't necessarily have the `token_type_ids` in your tokenized inputs (for instance, they're not returned if you use a DistilBERT model). They are only returned when the model will know what to do with them, because it has seen them during its pretraining. -در اینجا، مدل BERT با آیدی‌هایی که نشاندهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف masked language modeling که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنان _next sentence prediction_ برعهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. +در اینجا، مدل BERT با آیدی‌هایی که نشاندهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبان ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ برعهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. Here, BERT is pretrained with token type IDs, and on top of the masked language modeling objective we talked about in [Chapter 1](/course/chapter1), it has an additional objective called _next sentence prediction_. The goal with this task is to model the relationship between pairs of sentences. - در روش پیش‌ بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شود و از آن خواسته می‌شود که پیش بینی کند آیا جمله دوم در ادامه جمله اول قرار دارد یا خیر.برای خارج کردن وظیفه از حالت بدیهی، در نیمی از حالتها جمله‌ها در متن اصلی به دنبال هم آمده‌اند، و در نیمی دیگر دو جمله از دو متن متفاوت می‌آیند. + در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ی جمله‌ی اول قرار دارد یا خیر. برای خارج کردن وظیفه از حالت بدیهی، در نیمی از حالتها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. With next sentence prediction, the model is provided pairs of sentences (with randomly masked tokens) and asked to predict whether the second sentence follows the first. To make the task non-trivial, half of the time the sentences follow each other in the original document they were extracted from, and the other half of the time the two sentences come from two different documents. From edc0f359608a8bb02567624d6a9d2dc2cbf43077 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:08:51 +0200 Subject: [PATCH 076/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 0378e831d..786a5355f 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -271,15 +271,15 @@ Note that if you select a different checkpoint, you won't necessarily have the ` Here, BERT is pretrained with token type IDs, and on top of the masked language modeling objective we talked about in [Chapter 1](/course/chapter1), it has an additional objective called _next sentence prediction_. The goal with this task is to model the relationship between pairs of sentences. - در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ی جمله‌ی اول قرار دارد یا خیر. برای خارج کردن وظیفه از حالت بدیهی، در نیمی از حالتها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. + در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ی جمله‌ی اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالتها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. With next sentence prediction, the model is provided pairs of sentences (with randomly masked tokens) and asked to predict whether the second sentence follows the first. To make the task non-trivial, half of the time the sentences follow each other in the original document they were extracted from, and the other half of the time the two sentences come from two different documents. -در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی های توکنیزه شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چراکه توکنایزر میداند چه چیزی برای مدل تهیه کند. +در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی های توکنیزه شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکنایزر می‌داند چه چیزی برای مدل فراهم کند. In general, you don't need to worry about whether or not there are `token_type_ids` in your tokenized inputs: as long as you use the same checkpoint for the tokenizer and the model, everything will be fine as the tokenizer knows what to provide to its model. -اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل مجموعه داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک راه برای پیش پردازشِ مجموعه داده training اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل مجموعه داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک راه برای پیش پردازشِ مجموعه داده‌ی training اینگونه می‌باشد: Now that we have seen how our tokenizer can deal with one pair of sentences, we can use it to tokenize our whole dataset: like in the [previous chapter](/course/chapter2), we can feed the tokenizer a list of pairs of sentences by giving it the list of first sentences, then the list of second sentences. This is also compatible with the padding and truncation options we saw in [Chapter 2](/course/chapter2). So, one way to preprocess the training dataset is: @@ -291,7 +291,7 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` -این به خوبی کار میکند، اما مشکلش این است که یک dictionary برمیگرداند (شامل کلیدها، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیری که مجموعه ای از مجموعه ها هستند). همچنین این روش فقط زمانی کار میکند که حافظه موقت کافی جهت ذخیره سازی کل مجموعه داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه داده‌های موجود در پایگاه مجموعه داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره سازی در حافظه درخواست کردید نگه میدارید. ) +این به خوبی کار میکند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقدار‌ها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل مجموعه داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه داده‌های موجود در پایگاه مجموعه داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره سازی در حافظه درخواست کرده‌اید نگه می‌دارید. ) This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). From c3cf4e79cc853446d35a1ffe327139ac7ca9ddd2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:16:08 +0200 Subject: [PATCH 077/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 786a5355f..bf35fb0e9 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -95,7 +95,7 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras {/if} -هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه داده‌های متعدد در بسیاری زبانهای مختلف می‌باشد. شما می‌توانید مجموعه داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. +هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه‌داده‌های متعدد در بسیاری زبانهای مختلف می‌باشد. شما می‌توانید مجموعه‌داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. @@ -151,7 +151,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. +می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه‌داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. We can see the labels are already integers, so we won't have to do any preprocessing there. To know which integer corresponds to which label, we can inspect the `features` of our `raw_train_dataset`. This will tell us the type of each column: @@ -267,19 +267,19 @@ As you can see, the parts of the input corresponding to `[CLS] sentence1 [SEP]` Note that if you select a different checkpoint, you won't necessarily have the `token_type_ids` in your tokenized inputs (for instance, they're not returned if you use a DistilBERT model). They are only returned when the model will know what to do with them, because it has seen them during its pretraining. -در اینجا، مدل BERT با آیدی‌هایی که نشاندهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبان ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ برعهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. +در اینجا، مدل BERT با آیدی‌هایی که نشاندهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبانِ ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ برعهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. Here, BERT is pretrained with token type IDs, and on top of the masked language modeling objective we talked about in [Chapter 1](/course/chapter1), it has an additional objective called _next sentence prediction_. The goal with this task is to model the relationship between pairs of sentences. - در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ی جمله‌ی اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالتها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. + در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالتها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. With next sentence prediction, the model is provided pairs of sentences (with randomly masked tokens) and asked to predict whether the second sentence follows the first. To make the task non-trivial, half of the time the sentences follow each other in the original document they were extracted from, and the other half of the time the two sentences come from two different documents. -در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی های توکنیزه شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکنایزر می‌داند چه چیزی برای مدل فراهم کند. +در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکنایز شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکنایزر می‌داند چه چیزی برای مدل فراهم کند. In general, you don't need to worry about whether or not there are `token_type_ids` in your tokenized inputs: as long as you use the same checkpoint for the tokenizer and the model, everything will be fine as the tokenizer knows what to provide to its model. -اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل مجموعه داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک راه برای پیش پردازشِ مجموعه داده‌ی training اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل مجموعه‌داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ مجموعه‌داده‌ی training اینگونه می‌باشد: Now that we have seen how our tokenizer can deal with one pair of sentences, we can use it to tokenize our whole dataset: like in the [previous chapter](/course/chapter2), we can feed the tokenizer a list of pairs of sentences by giving it the list of first sentences, then the list of second sentences. This is also compatible with the padding and truncation options we saw in [Chapter 2](/course/chapter2). So, one way to preprocess the training dataset is: @@ -291,7 +291,7 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` -این به خوبی کار میکند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقدار‌ها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل مجموعه داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه داده‌های موجود در پایگاه مجموعه داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره سازی در حافظه درخواست کرده‌اید نگه می‌دارید. ) +این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل مجموعه‌داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه‌داده‌های موجود در پایگاه مجموعه‌داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره سازی در حافظه درخواست کرده‌اید نگه می‌دارید. ) This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). @@ -320,7 +320,7 @@ Here is how we apply the tokenization function on all our datasets at once. We'r tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` -کتابخانه مجموعه داده 🤗 این پیش پردازش را با افزودن -فیلدهای- جدید به مجموعه داده‌ها، یکی به ازای هر کلید در -دیکشنری- که توسط تابع پیش پردازش باز گردانده می‌شود اعمال می‌کند، +کتابخانه مجموعه داده 🤗 این پیش پردازش را با افزودن -فیلدهای- جدید به مجموعه‌داده‌ها، یکی به ازای هر کلید در -دیکشنری- که توسط تابع پیش پردازش باز گردانده می‌شود اعمال می‌کند، The way the 🤗 Datasets library applies this processing is by adding new fields to the datasets, one for each key in the dictionary returned by the preprocessing function: @@ -373,7 +373,7 @@ The function that is responsible for putting together samples inside a batch is {/if} -برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم طول سازی را به آیتمهای مجموعه داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا معرفی کنید (که چه توکنی برای همطول سازی استفاده کند، و اینکه مدل انتظار همطول سازی از سمت چپ ورودی‌ها را دارد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم طول سازی را به آیتمهای مجموعه‌داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا معرفی کنید (که چه توکنی برای همطول سازی استفاده کند، و اینکه مدل انتظار همطول سازی از سمت چپ ورودی‌ها را دارد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: To do this in practice, we have to define a collate function that will apply the correct amount of padding to the items of the dataset we want to batch together. Fortunately, the 🤗 Transformers library provides us with such a function via `DataCollatorWithPadding`. It takes a tokenizer when you instantiate it (to know which padding token to use, and whether the model expects padding to be on the left or on the right of the inputs) and will do everything you need: @@ -448,7 +448,7 @@ Looking good! Now that we've gone from raw text to batches our model can deal wi {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌ داده مان و یک collator داریم، حال نیاز داریم که آنها را بهم وصل کنیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این کار زیادی می‌برد و احتمالا خیلی بهینه هم نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور مجموعه داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه داده‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌ داده مان و یک collator داریم، حال نیاز داریم که آنها را بهم وصل کنیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این کار زیادی می‌برد و احتمالا خیلی بهینه هم نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! Now that we have our dataset and a data collator, we need to put them together. We could manually load batches and collate them, but that's a lot of work, and probably not very performant either. Instead, there's a simple method that offers a performant solution to this problem: `to_tf_dataset()`. This will wrap a `tf.data.Dataset` around your dataset, with an optional collation function. `tf.data.Dataset` is a native TensorFlow format that Keras can use for `model.fit()`, so this one method immediately converts a 🤗 Dataset to a format that's ready for training. Let's see it in action with our dataset! @@ -470,7 +470,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` -این هم از این! ما می‌توانی آن مجموعه داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختیهای پروسه پیش پردازش به طرز خوشایندی سرراست خواهد بود. +این هم از این! ما می‌توانی آن مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختیهای پروسه پیش پردازش به طرز خوشایندی سرراست خواهد بود. And that's it! We can take those datasets forward into the next lecture, where training will be pleasantly straightforward after all the hard work of data preprocessing. From c0a6bd929e47d601032d6a7afdf5a7d208b2c8a0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:19:50 +0200 Subject: [PATCH 078/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index bf35fb0e9..cd3792401 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -295,7 +295,7 @@ tokenized_dataset = tokenizer( This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). -به منظور نگه داشتن داده به صورت یک مجموعه داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. این روش همچنین به ما انعطافپذیری می‌دهد چنانچه به پیش پردازشهای بیشتری نیاز داشته باشیم. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: +به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازشهای بیشتری علاوه‌بر توکنیزشن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: From 234ef87bd387f687a0e48d968ac12acc4bf01df4 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:22:25 +0200 Subject: [PATCH 079/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index cd3792401..715f933c7 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -295,7 +295,7 @@ tokenized_dataset = tokenizer( This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). -به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازشهای بیشتری علاوه‌بر توکنیزشن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: +به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map()` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: From 1e5ecfe24511502343e7ff09b0c7376f88b0db66 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:22:55 +0200 Subject: [PATCH 080/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 715f933c7..32c6a4a73 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -295,7 +295,7 @@ tokenized_dataset = tokenizer( This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). -به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map()` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: +به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.()map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: From b9080795c3ebcbdb4ecd71c79fa3d4e956922fd2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:23:20 +0200 Subject: [PATCH 081/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 32c6a4a73..06bfbc9e2 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -295,7 +295,7 @@ tokenized_dataset = tokenizer( This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). -به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.()map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: +به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: From 28e160db630268daa2f918b29325edfdaa483fc0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:24:13 +0200 Subject: [PATCH 082/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 06bfbc9e2..587078b0f 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -295,7 +295,7 @@ tokenized_dataset = tokenizer( This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). -به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: +به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: From d6aa6d632878da889deed1d3156bfb4da10027e8 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:25:04 +0200 Subject: [PATCH 083/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 587078b0f..c600f9f8d 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -295,7 +295,7 @@ tokenized_dataset = tokenizer( This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). -به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: +به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: @@ -304,7 +304,7 @@ def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` -این تابع یک دیکشنری (مثل اقلام داخل مجموعه داده) دریافت میکند و دیکشنری دیگری بازمی‌گرداند با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`. توجه داشته باشید از انجایی که توکنایزر بر روی لیستهایی از جفت جمله ها کار میکند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار میکند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. +این تابع یک دیکشنری (مثل اقلام داخل مجموعه داده) دریافت میکند و دیکشنری دیگری بازمی‌گرداند با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`. توجه داشته باشید از انجایی که توکنایزر بر روی لیستهایی از جفت جمله ها کار میکند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار میکند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. This function takes a dictionary (like the items of our dataset) and returns a new dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`. Note that it also works if the `example` dictionary contains several samples (each key as a list of sentences) since the `tokenizer` works on lists of pairs of sentences, as seen before. This will allow us to use the option `batched=True` in our call to `map()`, which will greatly speed up the tokenization. The `tokenizer` is backed by a tokenizer written in Rust from the [🤗 Tokenizers](https://github.com/huggingface/tokenizers) library. This tokenizer can be very fast, but only if we give it lots of inputs at once. From 5b852113c6e97784f61206ad13a15c942aba74a7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:37:26 +0200 Subject: [PATCH 084/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index c600f9f8d..cf5e0cdb5 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -76,9 +76,9 @@ model.train_on_batch(batch, labels) {/if} -البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه داده بزرگتر خواهید داشت. +البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه‌داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این مجموعه داده این است که مجموعه داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه‌داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این مجموعه‌داده این است که مجموعه‌داده کوچکیست و تجربه آموزش دادن روی آن آسان است. Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. @@ -95,11 +95,11 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras {/if} -هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه‌داده‌های متعدد در بسیاری زبانهای مختلف می‌باشد. شما می‌توانید مجموعه‌داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. +هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه‌داده‌های متعدد در بسیاری زبانهای مختلف می‌باشد. شما می‌توانید مجموعه‌داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه‌داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. -کتابخانه مجموعه داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه داده در هاب ارائه می‌کند. ما می‌توانیم مجموعه داده MRPC را به روش زیر دانلود کنیم: +کتابخانه مجموعه‌داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه‌داده در هاب ارائه می‌کند. ما می‌توانیم مجموعه‌داده MRPC را به روش زیر دانلود کنیم: The 🤗 Datasets library provides a very simple command to download and cache a dataset on the Hub. We can download the MRPC dataset like this: @@ -131,7 +131,7 @@ DatasetDict({ As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور مجموعه‌داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. @@ -182,7 +182,7 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers -### پیش‌پردازشِ یک مجموعه داده +### پیش‌پردازشِ یک مجموعه‌داده ### Preprocessing a dataset @@ -192,7 +192,7 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers {/if} -به منظور پیش‌پردازش مجموعه داده، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: +به منظور پیش‌پردازش مجموعه‌داده، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: To preprocess the dataset, we need to convert the text to numbers the model can make sense of. As you saw in the [previous chapter](/course/chapter2), this is done with a tokenizer. We can feed the tokenizer one sentence or a list of sentences, so we can directly tokenize all the first sentences and all the second sentences of each pair like this: @@ -295,7 +295,7 @@ tokenized_dataset = tokenizer( This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). -به منظور نگه داشتن داده به صورت یک مجموعه‌داده از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه داده عمل میکند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی ها را توکنایز کند: +به منظور نگه داشتن داده به صورت یک مجموعه‌داده، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه‌داده عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکنایز کند: To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: @@ -304,15 +304,15 @@ def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` -این تابع یک دیکشنری (مثل اقلام داخل مجموعه داده) دریافت میکند و دیکشنری دیگری بازمی‌گرداند با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`. توجه داشته باشید از انجایی که توکنایزر بر روی لیستهایی از جفت جمله ها کار میکند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار میکند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. +این تابع یک دیکشنری (مثل اقلام داخل مجموعه‌داده) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. This function takes a dictionary (like the items of our dataset) and returns a new dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`. Note that it also works if the `example` dictionary contains several samples (each key as a list of sentences) since the `tokenizer` works on lists of pairs of sentences, as seen before. This will allow us to use the option `batched=True` in our call to `map()`, which will greatly speed up the tokenization. The `tokenizer` is backed by a tokenizer written in Rust from the [🤗 Tokenizers](https://github.com/huggingface/tokenizers) library. This tokenizer can be very fast, but only if we give it lots of inputs at once. -توجه داشته باشید ما مبحث `padding` را در حال حاضر کنار گذاشته ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` روی نمونه‌ها را زمانی که در حال ساختن بتچ هستیم انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بتچ انجام دهیم، و نه بیشترین طول در سرتاسر مجموعه داده. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متقیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. +توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر مجموعه‌داده. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. Note that we've left the `padding` argument out in our tokenization function for now. This is because padding all the samples to the maximum length is not efficient: it's better to pad the samples when we're building a batch, as then we only need to pad to the maximum length in that batch, and not the maximum length in the entire dataset. This can save a lot of time and processing power when the inputs have very variable lengths! -در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل مجموعه داده به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابر این تابع بر روی چندین عنصر از مجموعه داده ما به یکباره عمل می‌کند، نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش پردازش سریعتر انجام گیرد: +در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل مجموعه‌داده به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از مجموعه‌داده ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریعتر انجام گیرد: Here is how we apply the tokenization function on all our datasets at once. We're using `batched=True` in our call to `map` so the function is applied to multiple elements of our dataset at once, and not on each element separately. This allows for faster preprocessing. @@ -320,7 +320,7 @@ Here is how we apply the tokenization function on all our datasets at once. We'r tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` -کتابخانه مجموعه داده 🤗 این پیش پردازش را با افزودن -فیلدهای- جدید به مجموعه‌داده‌ها، یکی به ازای هر کلید در -دیکشنری- که توسط تابع پیش پردازش باز گردانده می‌شود اعمال می‌کند، +کتابخانه مجموعه‌داده 🤗 این پیش‌پردازش را با افزودن -فیلدهای- جدید به مجموعه‌داده‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شود اعمال می‌کند، The way the 🤗 Datasets library applies this processing is by adding new fields to the datasets, one for each key in the dictionary returned by the preprocessing function: @@ -341,11 +341,11 @@ DatasetDict({ }) ``` -شما حتی می‌توانید زمانی که تابع پیش پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایز سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش پردازش شما را سریعتر کند. +شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایز سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. You can even use multiprocessing when applying your preprocessing function with `map()` by passing along a `num_proc` argument. We didn't do this here because the 🤗 Tokenizers library already uses multiple threads to tokenize our samples faster, but if you are not using a fast tokenizer backed by this library, this could speed up your preprocessing. -تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخشهای مجموعه داده افزوده گردند. توجه داشته باشید که اگر تابع پیش پردازش ما برای یک کلید موجود در مجموعه داده که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گرداند همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. +تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخشهای مجموعه‌داده افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در مجموعه‌داده که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گرداند همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. Our `tokenize_function` returns a dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`, so those three fields are added to all splits of our dataset. Note that we could also have changed existing fields if our preprocessing function returned a new value for an existing key in the dataset to which we applied `map()`. @@ -405,7 +405,7 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se [50, 59, 47, 67, 59, 50, 62, 32] ``` -تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. همطول سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، همطول شده باشند. بدون همطول سازی پویا، همه نمونه‌ها در کل مجموعه داده باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، همطول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی همطول می‌کند: +تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. همطول سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، همطول شده باشند. بدون همطول سازی پویا، همه نمونه‌ها در کل مجموعه‌داده باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، همطول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی همطول می‌کند: No surprise, we get samples of varying length, from 32 to 67. Dynamic padding means the samples in this batch should all be padded to a length of 67, the maximum length inside the batch. Without dynamic padding, all of the samples would have to be padded to the maximum length in the whole dataset, or the maximum length the model can accept. Let's double-check that our `data_collator` is dynamically padding the batch properly: @@ -440,7 +440,7 @@ Looking good! Now that we've gone from raw text to batches our model can deal wi -✏️ **امتحان کنید!** پروسه پیش بردازش را روی مجموعه داده GLUE SST-2 باز تکرار کنید. این یک مقدار متفاوت است از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد، اما بقیه کارهایی که انجام دادیم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. +✏️ **امتحان کنید!** پروسه پیش بردازش را روی مجموعه‌داده GLUE SST-2 باز تکرار کنید. این یک مقدار متفاوت است از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد، اما بقیه کارهایی که انجام دادیم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. ✏️ **Try it out!** Replicate the preprocessing on the GLUE SST-2 dataset. It's a little bit different since it's composed of single sentences instead of pairs, but the rest of what we did should look the same. For a harder challenge, try to write a preprocessing function that works on any of the GLUE tasks. @@ -448,7 +448,7 @@ Looking good! Now that we've gone from raw text to batches our model can deal wi {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌ داده مان و یک collator داریم، حال نیاز داریم که آنها را بهم وصل کنیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این کار زیادی می‌برد و احتمالا خیلی بهینه هم نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌ داده مان و یک collator داریم، حال نیاز داریم که آنها را بهم وصل کنیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این کار زیادی می‌برد و احتمالا خیلی بهینه هم نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه‌داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! Now that we have our dataset and a data collator, we need to put them together. We could manually load batches and collate them, but that's a lot of work, and probably not very performant either. Instead, there's a simple method that offers a performant solution to this problem: `to_tf_dataset()`. This will wrap a `tf.data.Dataset` around your dataset, with an optional collation function. `tf.data.Dataset` is a native TensorFlow format that Keras can use for `model.fit()`, so this one method immediately converts a 🤗 Dataset to a format that's ready for training. Let's see it in action with our dataset! @@ -470,7 +470,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` -این هم از این! ما می‌توانی آن مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختیهای پروسه پیش پردازش به طرز خوشایندی سرراست خواهد بود. +این هم از این! ما می‌توانی آن مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختیهای پروسه پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. And that's it! We can take those datasets forward into the next lecture, where training will be pleasantly straightforward after all the hard work of data preprocessing. From 4848b6126eec9489613d4887bf2551d3111ba559 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 12:48:07 +0200 Subject: [PATCH 085/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index cf5e0cdb5..f94b59f58 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -320,7 +320,7 @@ Here is how we apply the tokenization function on all our datasets at once. We'r tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` -کتابخانه مجموعه‌داده 🤗 این پیش‌پردازش را با افزودن -فیلدهای- جدید به مجموعه‌داده‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شود اعمال می‌کند، +روشی که کتابخانه مجموعه‌داده 🤗 این پیش‌پردازش را اعمال می‌کند، با افزودن -فیلدهای- جدید به مجموعه‌داده‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، می‌باشد:، The way the 🤗 Datasets library applies this processing is by adding new fields to the datasets, one for each key in the dictionary returned by the preprocessing function: @@ -341,19 +341,19 @@ DatasetDict({ }) ``` -شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایز سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. +شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `()map` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایزر سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. You can even use multiprocessing when applying your preprocessing function with `map()` by passing along a `num_proc` argument. We didn't do this here because the 🤗 Tokenizers library already uses multiple threads to tokenize our samples faster, but if you are not using a fast tokenizer backed by this library, this could speed up your preprocessing. -تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخشهای مجموعه‌داده افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در مجموعه‌داده که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گرداند همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. +تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخش‌های مجموعه‌داده افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در مجموعه‌داده که تابع `()map` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. Our `tokenize_function` returns a dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`, so those three fields are added to all splits of our dataset. Note that we could also have changed existing fields if our preprocessing function returned a new value for an existing key in the dataset to which we applied `map()`. -آخرین چیزی که نیاز داریم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر پَد کنیم - تکنیکی که ما به آن *dynamic padding* (همطول سازی پویا) می‌گوییم. +آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر همطول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. The last thing we will need to do is pad all the examples to the length of the longest element when we batch elements together — a technique we refer to as *dynamic padding*. -### هم طول کردن پویا +### هم‌طول‌سازی پویا ### Dynamic padding @@ -361,19 +361,19 @@ The last thing we will need to do is pad all the examples to the length of the l {#if fw === 'pt'} -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم طول سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم طول سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم طول سازی اضافه داشته باشد. +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. The function that is responsible for putting together samples inside a batch is called a *collate function*. It's an argument you can pass when you build a `DataLoader`, the default being a function that will just convert your samples to PyTorch tensors and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. {:else} -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. collator پیش فرض تابعی است که فقط نمونه‌های شما را به tf.Tensor تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم طول سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم طول سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم طول سازی اضافه داشته باشد. +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. collator پیش فرض تابعی است که فقط نمونه‌های شما را به tf.Tensor تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. The function that is responsible for putting together samples inside a batch is called a *collate function*. The default collator is a function that will just convert your samples to tf.Tensor and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. {/if} -برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم طول سازی را به آیتمهای مجموعه‌داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا معرفی کنید (که چه توکنی برای همطول سازی استفاده کند، و اینکه مدل انتظار همطول سازی از سمت چپ ورودی‌ها را دارد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتمهای مجموعه‌داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا معرفی کنید (که چه توکنی برای همطول سازی استفاده کند، و اینکه مدل انتظار همطول سازی از سمت چپ ورودی‌ها را دارد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: To do this in practice, we have to define a collate function that will apply the correct amount of padding to the items of the dataset we want to batch together. Fortunately, the 🤗 Transformers library provides us with such a function via `DataCollatorWithPadding`. It takes a tokenizer when you instantiate it (to know which padding token to use, and whether the model expects padding to be on the left or on the right of the inputs) and will do everything you need: From d4eb913cbff9d286396d5bc61f14a42cff94df15 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 13:01:06 +0200 Subject: [PATCH 086/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index f94b59f58..c9887c2e5 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -349,7 +349,7 @@ You can even use multiprocessing when applying your preprocessing function with Our `tokenize_function` returns a dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`, so those three fields are added to all splits of our dataset. Note that we could also have changed existing fields if our preprocessing function returned a new value for an existing key in the dataset to which we applied `map()`. -آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر همطول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. +آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. The last thing we will need to do is pad all the examples to the length of the longest element when we batch elements together — a technique we refer to as *dynamic padding*. @@ -361,7 +361,7 @@ The last thing we will need to do is pad all the examples to the length of the l {#if fw === 'pt'} -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU ها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. The function that is responsible for putting together samples inside a batch is called a *collate function*. It's an argument you can pass when you build a `DataLoader`, the default being a function that will just convert your samples to PyTorch tensors and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. @@ -373,7 +373,7 @@ The function that is responsible for putting together samples inside a batch is {/if} -برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتمهای مجموعه‌داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا معرفی کنید (که چه توکنی برای همطول سازی استفاده کند، و اینکه مدل انتظار همطول سازی از سمت چپ ورودی‌ها را دارد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های مجموعه‌داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند، و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: To do this in practice, we have to define a collate function that will apply the correct amount of padding to the items of the dataset we want to batch together. Fortunately, the 🤗 Transformers library provides us with such a function via `DataCollatorWithPadding`. It takes a tokenizer when you instantiate it (to know which padding token to use, and whether the model expects padding to be on the left or on the right of the inputs) and will do everything you need: @@ -391,7 +391,7 @@ data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf" ``` {/if} -اجازه دهید چند نمونه از مجموعه training مان، که می‌خواهیم باهم بَتچ کنیم، برداریم تا این ابزار جدید را امتحان کنیم. در اینجا سطون‌های -، --، و --- را خذف می‌کنیم چراکه احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (و ما نمی‌توانیم تنسورهایی با رشته های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: +اجازه دهید چند نمونه از مجموعه training مان، که می‌خواهیم باهم بَتچ کنیم، برداریم تا این ابزار جدید را امتحان کنیم. در اینجا سطون‌های `idx`، `sentence1`، و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: To test this new toy, let's grab a few samples from our training set that we would like to batch together. Here, we remove the columns `idx`, `sentence1`, and `sentence2` as they won't be needed and contain strings (and we can't create tensors with strings) and have a look at the lengths of each entry in the batch: @@ -405,7 +405,7 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se [50, 59, 47, 67, 59, 50, 62, 32] ``` -تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. همطول سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، همطول شده باشند. بدون همطول سازی پویا، همه نمونه‌ها در کل مجموعه‌داده باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، همطول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی همطول می‌کند: +تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل مجموعه‌داده باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: No surprise, we get samples of varying length, from 32 to 67. Dynamic padding means the samples in this batch should all be padded to a length of 67, the maximum length inside the batch. Without dynamic padding, all of the samples would have to be padded to the maximum length in the whole dataset, or the maximum length the model can accept. Let's double-check that our `data_collator` is dynamically padding the batch properly: From ddf951a3121defedc202fbbf056cc3e8e339c532 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 13:08:39 +0200 Subject: [PATCH 087/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index c9887c2e5..cd0a19be3 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -440,7 +440,7 @@ Looking good! Now that we've gone from raw text to batches our model can deal wi -✏️ **امتحان کنید!** پروسه پیش بردازش را روی مجموعه‌داده GLUE SST-2 باز تکرار کنید. این یک مقدار متفاوت است از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد، اما بقیه کارهایی که انجام دادیم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. +✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی مجموعه‌داده GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. ✏️ **Try it out!** Replicate the preprocessing on the GLUE SST-2 dataset. It's a little bit different since it's composed of single sentences instead of pairs, but the rest of what we did should look the same. For a harder challenge, try to write a preprocessing function that works on any of the GLUE tasks. @@ -448,7 +448,7 @@ Looking good! Now that we've gone from raw text to batches our model can deal wi {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌ داده مان و یک collator داریم، حال نیاز داریم که آنها را بهم وصل کنیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این کار زیادی می‌برد و احتمالا خیلی بهینه هم نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه‌داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه‌داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! Now that we have our dataset and a data collator, we need to put them together. We could manually load batches and collate them, but that's a lot of work, and probably not very performant either. Instead, there's a simple method that offers a performant solution to this problem: `to_tf_dataset()`. This will wrap a `tf.data.Dataset` around your dataset, with an optional collation function. `tf.data.Dataset` is a native TensorFlow format that Keras can use for `model.fit()`, so this one method immediately converts a 🤗 Dataset to a format that's ready for training. Let's see it in action with our dataset! From f65bf3e03409cdc40b8caedf52c4c09fd2f62d30 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 13:10:31 +0200 Subject: [PATCH 088/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index cd0a19be3..604af7b95 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -448,7 +448,7 @@ Looking good! Now that we've gone from raw text to batches our model can deal wi {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه‌داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `()model.fit` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه‌داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! Now that we have our dataset and a data collator, we need to put them together. We could manually load batches and collate them, but that's a lot of work, and probably not very performant either. Instead, there's a simple method that offers a performant solution to this problem: `to_tf_dataset()`. This will wrap a `tf.data.Dataset` around your dataset, with an optional collation function. `tf.data.Dataset` is a native TensorFlow format that Keras can use for `model.fit()`, so this one method immediately converts a 🤗 Dataset to a format that's ready for training. Let's see it in action with our dataset! From 3253b83e187dd435fd928d7769598b9d2decab39 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 13:11:23 +0200 Subject: [PATCH 089/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 604af7b95..8e2ef1c79 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -448,7 +448,7 @@ Looking good! Now that we've gone from raw text to batches our model can deal wi {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `()model.fit` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `tf.data.Dataset` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه‌داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه‌داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! Now that we have our dataset and a data collator, we need to put them together. We could manually load batches and collate them, but that's a lot of work, and probably not very performant either. Instead, there's a simple method that offers a performant solution to this problem: `to_tf_dataset()`. This will wrap a `tf.data.Dataset` around your dataset, with an optional collation function. `tf.data.Dataset` is a native TensorFlow format that Keras can use for `model.fit()`, so this one method immediately converts a 🤗 Dataset to a format that's ready for training. Let's see it in action with our dataset! From b9e4251a81fa4758e9d345f6b991bef981c6c9ad Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 13:13:48 +0200 Subject: [PATCH 090/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 8e2ef1c79..8027786c4 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -448,7 +448,7 @@ Looking good! Now that we've gone from raw text to batches our model can deal wi {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه این یک تابع به سرعت یک مجموعه‌داده 🤗 را به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک مجموعه‌داده 🤗 را به سرعت به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! Now that we have our dataset and a data collator, we need to put them together. We could manually load batches and collate them, but that's a lot of work, and probably not very performant either. Instead, there's a simple method that offers a performant solution to this problem: `to_tf_dataset()`. This will wrap a `tf.data.Dataset` around your dataset, with an optional collation function. `tf.data.Dataset` is a native TensorFlow format that Keras can use for `model.fit()`, so this one method immediately converts a 🤗 Dataset to a format that's ready for training. Let's see it in action with our dataset! @@ -470,7 +470,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` -این هم از این! ما می‌توانی آن مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختیهای پروسه پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. +این هم از این! حالا می‌توانیم این مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. And that's it! We can take those datasets forward into the next lecture, where training will be pleasantly straightforward after all the hard work of data preprocessing. From 21a79479c5a0c7c1fa9f670cc30e234d7e0eb777 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 13:23:37 +0200 Subject: [PATCH 091/254] minor fixes and polish --- chapters/fa/chapter3/2.mdx | 93 ++------------------------------------ 1 file changed, 3 insertions(+), 90 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 8027786c4..486aefcda 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -80,11 +80,6 @@ model.train_on_batch(batch, labels) در این بخش ما از مجموعه‌داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این مجموعه‌داده این است که مجموعه‌داده کوچکیست و تجربه آموزش دادن روی آن آسان است. -Of course, just training the model on two sentences is not going to yield very good results. To get better results, you will need to prepare a bigger dataset. - -In this section we will use as an example the MRPC (Microsoft Research Paraphrase Corpus) dataset, introduced in a [paper](https://www.aclweb.org/anthology/I05-5002.pdf) by William B. Dolan and Chris Brockett. The dataset consists of 5,801 pairs of sentences, with a label indicating if they are paraphrases or not (i.e., if both sentences mean the same thing). We've selected it for this chapter because it's a small dataset, so it's easy to experiment with training on it. - - ### بارگذاری یک داده از هاب ### Loading a dataset from the Hub @@ -97,12 +92,8 @@ In this section we will use as an example the MRPC (Microsoft Research Paraphras هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه‌داده‌های متعدد در بسیاری زبانهای مختلف می‌باشد. شما می‌توانید مجموعه‌داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه‌داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. -The Hub doesn't just contain models; it also has multiple datasets in lots of different languages. You can browse the datasets [here](https://huggingface.co/datasets), and we recommend you try to load and process a new dataset once you have gone through this section (see the general documentation [here](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub)). But for now, let's focus on the MRPC dataset! This is one of the 10 datasets composing the [GLUE benchmark](https://gluebenchmark.com/), which is an academic benchmark that is used to measure the performance of ML models across 10 different text classification tasks. - کتابخانه مجموعه‌داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه‌داده در هاب ارائه می‌کند. ما می‌توانیم مجموعه‌داده MRPC را به روش زیر دانلود کنیم: -The 🤗 Datasets library provides a very simple command to download and cache a dataset on the Hub. We can download the MRPC dataset like this: - ```py from datasets import load_dataset @@ -129,16 +120,10 @@ DatasetDict({ همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx`) و تعداد متغیری ردیف داده که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training وجود دارد، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test). -As you can see, we get a `DatasetDict` object which contains the training set, the validation set, and the test set. Each of those contains several columns (`sentence1`, `sentence2`, `label`, and `idx`) and a variable number of rows, which are the number of elements in each set (so, there are 3,668 pairs of sentences in the training set, 408 in the validation set, and 1,725 in the test set). - این دستور مجموعه‌داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. -This command downloads and caches the dataset, by default in *~/.cache/huggingface/dataset*. Recall from Chapter 2 that you can customize your cache folder by setting the `HF_HOME` environment variable. - ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از شماره‌گذاری, مانند یک dictionary دسترسی پیدا کنیم: -We can access each pair of sentences in our `raw_datasets` object by indexing, like with a dictionary: - ```py raw_train_dataset = raw_datasets["train"] raw_train_dataset[0] @@ -153,8 +138,6 @@ raw_train_dataset[0] می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه‌داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. -We can see the labels are already integers, so we won't have to do any preprocessing there. To know which integer corresponds to which label, we can inspect the `features` of our `raw_train_dataset`. This will tell us the type of each column: - ```py raw_train_dataset.features ``` @@ -168,24 +151,12 @@ raw_train_dataset.features در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent`، و `1` مربوط به `equivalent` می‌باشد،. -Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers to label name is stored in the *names* folder. `0` corresponds to `not_equivalent`, and `1` corresponds to `equivalent`. - - ✏️ **امتحان کنید!** عنصر شماره ۱۵ از داده training و عنصر شماره ۸۷ از داده validation را مشاهده کنید. برچسبهای آنها چیست؟ - - - - - -✏️ **Try it out!** Look at element 15 of the training set and element 87 of the validation set. What are their labels? - ### پیش‌پردازشِ یک مجموعه‌داده -### Preprocessing a dataset - {#if fw === 'pt'} {:else} @@ -194,8 +165,6 @@ Behind the scenes, `label` is of type `ClassLabel`, and the mapping of integers به منظور پیش‌پردازش مجموعه‌داده، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: -To preprocess the dataset, we need to convert the text to numbers the model can make sense of. As you saw in the [previous chapter](/course/chapter2), this is done with a tokenizer. We can feed the tokenizer one sentence or a list of sentences, so we can directly tokenize all the first sentences and all the second sentences of each pair like this: - ```py from transformers import AutoTokenizer @@ -207,8 +176,6 @@ tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده سازی کند: -However, we can't just pass two sequences to the model and get a prediction of whether the two sentences are paraphrases or not. We need to handle the two sequences as a pair, and apply the appropriate preprocessing. Fortunately, the tokenizer can also take a pair of sequences and prepare it the way our BERT model expects: - ```py inputs = tokenizer("This is the first sentence.", "This is the second one.") inputs @@ -224,19 +191,13 @@ inputs در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی، جمله اول و کدام بخش جمله دوم است. -We discussed the `input_ids` and `attention_mask` keys in [Chapter 2](/course/chapter2), but we put off talking about `token_type_ids`. In this example, this is what tells the model which part of the input is the first sentence and which is the second sentence. - ✏️ **امتحان کنید!** عنصر شماره ۱۵ داده را بردارید و دو جمله را به صورت جداگانه و جفت توکنایز کنید. تفاوت دو نتیجه چیست؟ -✏️ **Try it out!** Take element 15 of the training set and tokenize the two sentences separately and as a pair. What's the difference between the two results? - -اگر آیدی های داخل `input_ids` را به کلمات رمزگشایی کنیم: - -If we decode the IDs inside `input_ids` back to words: +اگر آیدی‌های داخل `input_ids` را به کلمات رمزگشایی کنیم: ```py tokenizer.convert_ids_to_tokens(inputs["input_ids"]) @@ -252,8 +213,6 @@ we will get: بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. -So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] sentence2 [SEP]` when there are two sentences. Aligning this with the `token_type_ids` gives us: - ```python out ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] @@ -261,28 +220,16 @@ So we see the model expects the inputs to be of the form `[CLS] sentence1 [SEP] همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند آیدی نشاندهنده نوع توکِن آنها `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند آیدی نشاندهنده نوع توکِن‌شان `1` می‌باشد. -As you can see, the parts of the input corresponding to `[CLS] sentence1 [SEP]` all have a token type ID of `0`, while the other parts, corresponding to `sentence2 [SEP]`, all have a token type ID of `1`. - توجه داشته باشید که اگر چکپوینت متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. -Note that if you select a different checkpoint, you won't necessarily have the `token_type_ids` in your tokenized inputs (for instance, they're not returned if you use a DistilBERT model). They are only returned when the model will know what to do with them, because it has seen them during its pretraining. - در اینجا، مدل BERT با آیدی‌هایی که نشاندهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبانِ ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ برعهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. -Here, BERT is pretrained with token type IDs, and on top of the masked language modeling objective we talked about in [Chapter 1](/course/chapter1), it has an additional objective called _next sentence prediction_. The goal with this task is to model the relationship between pairs of sentences. - در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالتها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. -With next sentence prediction, the model is provided pairs of sentences (with randomly masked tokens) and asked to predict whether the second sentence follows the first. To make the task non-trivial, half of the time the sentences follow each other in the original document they were extracted from, and the other half of the time the two sentences come from two different documents. - در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکنایز شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکنایزر می‌داند چه چیزی برای مدل فراهم کند. -In general, you don't need to worry about whether or not there are `token_type_ids` in your tokenized inputs: as long as you use the same checkpoint for the tokenizer and the model, everything will be fine as the tokenizer knows what to provide to its model. - اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل مجموعه‌داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ مجموعه‌داده‌ی training اینگونه می‌باشد: -Now that we have seen how our tokenizer can deal with one pair of sentences, we can use it to tokenize our whole dataset: like in the [previous chapter](/course/chapter2), we can feed the tokenizer a list of pairs of sentences by giving it the list of first sentences, then the list of second sentences. This is also compatible with the padding and truncation options we saw in [Chapter 2](/course/chapter2). So, one way to preprocess the training dataset is: - ```py tokenized_dataset = tokenizer( raw_datasets["train"]["sentence1"], @@ -291,39 +238,27 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` -این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل مجموعه‌داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه‌داده‌های موجود در پایگاه مجموعه‌داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره سازی در حافظه درخواست کرده‌اید نگه می‌دارید. ) - -This works well, but it has the disadvantage of returning a dictionary (with our keys, `input_ids`, `attention_mask`, and `token_type_ids`, and values that are lists of lists). It will also only work if you have enough RAM to store your whole dataset during the tokenization (whereas the datasets from the 🤗 Datasets library are [Apache Arrow](https://arrow.apache.org/) files stored on the disk, so you only keep the samples you ask for loaded in memory). +این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل مجموعه‌داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه‌داده‌های موجود در پایگاه مجموعه‌داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه می‌دارید). به منظور نگه داشتن داده به صورت یک مجموعه‌داده، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه‌داده عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکنایز کند: -To keep the data as a dataset, we will use the [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) method. This also allows us some extra flexibility, if we need more preprocessing done than just tokenization. The `map()` method works by applying a function on each element of the dataset, so let's define a function that tokenizes our inputs: - ```py def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` -این تابع یک دیکشنری (مثل اقلام داخل مجموعه‌داده) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. - -This function takes a dictionary (like the items of our dataset) and returns a new dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`. Note that it also works if the `example` dictionary contains several samples (each key as a list of sentences) since the `tokenizer` works on lists of pairs of sentences, as seen before. This will allow us to use the option `batched=True` in our call to `map()`, which will greatly speed up the tokenization. The `tokenizer` is backed by a tokenizer written in Rust from the [🤗 Tokenizers](https://github.com/huggingface/tokenizers) library. This tokenizer can be very fast, but only if we give it lots of inputs at once. +این تابع یک دیکشنری (مثل اقلام داخل مجموعه‌داده) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. این توکنایزر با توکنایزری در کتابخانه [🤗 Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر مجموعه‌داده. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. -Note that we've left the `padding` argument out in our tokenization function for now. This is because padding all the samples to the maximum length is not efficient: it's better to pad the samples when we're building a batch, as then we only need to pad to the maximum length in that batch, and not the maximum length in the entire dataset. This can save a lot of time and processing power when the inputs have very variable lengths! - در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل مجموعه‌داده به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از مجموعه‌داده ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریعتر انجام گیرد: -Here is how we apply the tokenization function on all our datasets at once. We're using `batched=True` in our call to `map` so the function is applied to multiple elements of our dataset at once, and not on each element separately. This allows for faster preprocessing. - ```py tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` روشی که کتابخانه مجموعه‌داده 🤗 این پیش‌پردازش را اعمال می‌کند، با افزودن -فیلدهای- جدید به مجموعه‌داده‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، می‌باشد:، -The way the 🤗 Datasets library applies this processing is by adding new fields to the datasets, one for each key in the dictionary returned by the preprocessing function: - ```python out DatasetDict({ train: Dataset({ @@ -343,15 +278,11 @@ DatasetDict({ شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `()map` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایزر سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. -You can even use multiprocessing when applying your preprocessing function with `map()` by passing along a `num_proc` argument. We didn't do this here because the 🤗 Tokenizers library already uses multiple threads to tokenize our samples faster, but if you are not using a fast tokenizer backed by this library, this could speed up your preprocessing. تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخش‌های مجموعه‌داده افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در مجموعه‌داده که تابع `()map` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. -Our `tokenize_function` returns a dictionary with the keys `input_ids`, `attention_mask`, and `token_type_ids`, so those three fields are added to all splits of our dataset. Note that we could also have changed existing fields if our preprocessing function returned a new value for an existing key in the dataset to which we applied `map()`. - آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. -The last thing we will need to do is pad all the examples to the length of the longest element when we batch elements together — a technique we refer to as *dynamic padding*. ### هم‌طول‌سازی پویا @@ -363,20 +294,14 @@ The last thing we will need to do is pad all the examples to the length of the l تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU ها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. -The function that is responsible for putting together samples inside a batch is called a *collate function*. It's an argument you can pass when you build a `DataLoader`, the default being a function that will just convert your samples to PyTorch tensors and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. - {:else} تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. collator پیش فرض تابعی است که فقط نمونه‌های شما را به tf.Tensor تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. -The function that is responsible for putting together samples inside a batch is called a *collate function*. The default collator is a function that will just convert your samples to tf.Tensor and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. - {/if} برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های مجموعه‌داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند، و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: -To do this in practice, we have to define a collate function that will apply the correct amount of padding to the items of the dataset we want to batch together. Fortunately, the 🤗 Transformers library provides us with such a function via `DataCollatorWithPadding`. It takes a tokenizer when you instantiate it (to know which padding token to use, and whether the model expects padding to be on the left or on the right of the inputs) and will do everything you need: - {#if fw === 'pt'} ```py from transformers import DataCollatorWithPadding @@ -393,8 +318,6 @@ data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf" اجازه دهید چند نمونه از مجموعه training مان، که می‌خواهیم باهم بَتچ کنیم، برداریم تا این ابزار جدید را امتحان کنیم. در اینجا سطون‌های `idx`، `sentence1`، و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: -To test this new toy, let's grab a few samples from our training set that we would like to batch together. Here, we remove the columns `idx`, `sentence1`, and `sentence2` as they won't be needed and contain strings (and we can't create tensors with strings) and have a look at the lengths of each entry in the batch: - ```py samples = tokenized_datasets["train"][:8] samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "sentence2"]} @@ -407,8 +330,6 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل مجموعه‌داده باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: -No surprise, we get samples of varying length, from 32 to 67. Dynamic padding means the samples in this batch should all be padded to a length of 67, the maximum length inside the batch. Without dynamic padding, all of the samples would have to be padded to the maximum length in the whole dataset, or the maximum length the model can accept. Let's double-check that our `data_collator` is dynamically padding the batch properly: - ```py batch = data_collator(samples) {k: v.shape for k, v in batch.items()} @@ -434,24 +355,18 @@ batch = data_collator(samples) به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل مان می‌تواند با آنها کار کند، آماده هستیم برای انجام بازتنظیم مدل: -Looking good! Now that we've gone from raw text to batches our model can deal with, we're ready to fine-tune it! - {/if} ✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی مجموعه‌داده GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. -✏️ **Try it out!** Replicate the preprocessing on the GLUE SST-2 dataset. It's a little bit different since it's composed of single sentences instead of pairs, but the rest of what we did should look the same. For a harder challenge, try to write a preprocessing function that works on any of the GLUE tasks. - {#if fw === 'tf'} توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک مجموعه‌داده 🤗 را به سرعت به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! -Now that we have our dataset and a data collator, we need to put them together. We could manually load batches and collate them, but that's a lot of work, and probably not very performant either. Instead, there's a simple method that offers a performant solution to this problem: `to_tf_dataset()`. This will wrap a `tf.data.Dataset` around your dataset, with an optional collation function. `tf.data.Dataset` is a native TensorFlow format that Keras can use for `model.fit()`, so this one method immediately converts a 🤗 Dataset to a format that's ready for training. Let's see it in action with our dataset! - ```py tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( columns=["attention_mask", "input_ids", "token_type_ids"], @@ -472,6 +387,4 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( این هم از این! حالا می‌توانیم این مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. -And that's it! We can take those datasets forward into the next lecture, where training will be pleasantly straightforward after all the hard work of data preprocessing. - {/if} From 1dd88fe6373dc3406b5c276048fc43b6cf1945a0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 13:24:26 +0200 Subject: [PATCH 092/254] minor fix --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 486aefcda..e1cef18a8 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -51,7 +51,7 @@ optimizer.step() ``` {:else} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بتچ توسط pytorch را شرح می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بَتچ توسط pytorch را شرح می‌دهیم: ```python import tensorflow as tf From 1ab29f4e3bee3c5914b8692ce8fc315b9abf61ff Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 13:28:28 +0200 Subject: [PATCH 093/254] Ch3 - 1 and 2 funal draft. --- chapters/fa/chapter3/1.mdx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index b960c3886..6cfa5d3ee 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -2,22 +2,22 @@ # مقدمه -در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدلهای پیش تعلیم را جهت انجام پیش بینی های جدید بررسی کردیم. اما چگونه میتوانید یک مدل پیش تعلیم را خودتان بازتنظیم کنید؟ +در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدل‌های پیش‌تعلیم را جهت انجام پیش‌بینی‌های جدید بررسی کردیم. اما چگونه می‌توانید یک مدل پیش‌تعلیم را خودتان بازتنظیم کنید؟ {#if fw === 'pt'} -* چگونه یک داده بزرگ را از هاب تهیه کنید +* چگونه یک مجموعه‌داده بزرگ را از هاب تهیه کنید * چگونه از API سطح بالای "Trainer" برای بازتنظیم مدل استفاده کنید -* چگونه یک چرخه تعلیم دلخواه درست کنید -* چگونه از کتابخانه Accelerate 🤗 برای اجرای چرخه تعلیم دلخواه در هر تنظیمات غیر متمرکزی استفاده کنید +* چگونه یک چرخه‌تعلیم دلخواه درست کنید +* چگونه از کتابخانه Accelerate 🤗 برای اجرای چرخه‌تعلیم دلخواه در هر تنظیمات غیر متمرکزی استفاده کنید {:else} -* چگونه یک داده بزرگ را از هاب تهیه کنید -* چگونه از کراس برای بازتنظیم مدل استفاده کنید -* چگونه از کراس برای استخراج پیش بینی ها استفاده کنید +* چگونه یک مجموعه‌داده بزرگ را از هاب تهیه کنید +* چگونه از کِراس برای بازتنظیم مدل استفاده کنید +* چگونه از کِراس برای استخراج پیش بینی‌ها استفاده کنید * چگونه از یک متریک دلخواه استفاده کنید {/if} -جهت بارگذاری چک پوینت تعلیم دیده خود در هاب هاگینک فیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) \ No newline at end of file +جهت بارگذاری چکپوینت تعلیم دیده خود در هاب هاگینگ‌فیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) \ No newline at end of file From e1fdabc51fdfb206d67ac67da5c41d6242a4986f Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 13:34:47 +0200 Subject: [PATCH 094/254] Ch3 - 1 and 2 funal draft. --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index e1cef18a8..2a683ac84 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -90,7 +90,7 @@ model.train_on_batch(batch, labels) {/if} -هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه‌داده‌های متعدد در بسیاری زبانهای مختلف می‌باشد. شما می‌توانید مجموعه‌داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه‌داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. +هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه‌داده‌های متعدد در بسیاری زبان‌های مختلف می‌باشد. شما می‌توانید مجموعه‌داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه‌داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. کتابخانه مجموعه‌داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه‌داده در هاب ارائه می‌کند. ما می‌توانیم مجموعه‌داده MRPC را به روش زیر دانلود کنیم: From cfc8ba62688a8b5536f228185ab477e80a53eae9 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 25 Apr 2022 21:40:50 +0200 Subject: [PATCH 095/254] Ch3 - 1 and 2 final draft. --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 2a683ac84..5be25d104 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -365,7 +365,7 @@ batch = data_collator(samples) {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک مجموعه‌داده 🤗 را به سرعت به فرمت آماده برای آموزش تبدیل می‌کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک مجموعه‌داده 🤗 را به سرعت به فرمت آماده برای آموزش تبدیل کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! ```py tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( From fe1fdd20dbd35bce042a60e34de90e992a8fd526 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 27 Apr 2022 10:57:37 +0200 Subject: [PATCH 096/254] Ch3-P3 - first push --- chapters/fa/chapter3/3.mdx | 172 ++++++++++++++++ chapters/fa/chapter3/3_tf.mdx | 203 +++++++++++++++++++ chapters/fa/chapter3/4.mdx | 359 ++++++++++++++++++++++++++++++++++ chapters/fa/chapter3/5.mdx | 20 ++ chapters/fa/chapter3/6.mdx | 296 ++++++++++++++++++++++++++++ 5 files changed, 1050 insertions(+) create mode 100644 chapters/fa/chapter3/3.mdx create mode 100644 chapters/fa/chapter3/3_tf.mdx create mode 100644 chapters/fa/chapter3/4.mdx create mode 100644 chapters/fa/chapter3/5.mdx create mode 100644 chapters/fa/chapter3/6.mdx diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx new file mode 100644 index 000000000..749cfd511 --- /dev/null +++ b/chapters/fa/chapter3/3.mdx @@ -0,0 +1,172 @@ + + +# Fine-tuning a model with the Trainer API + + + + + +🤗 Transformers provides a `Trainer` class to help you fine-tune any of the pretrained models it provides on your dataset. Once you've done all the data preprocessing work in the last section, you have just a few steps left to define the `Trainer`. The hardest part is likely to be preparing the environment to run `Trainer.train()`, as it will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). + +The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: + +```py +from datasets import load_dataset +from transformers import AutoTokenizer, DataCollatorWithPadding + +raw_datasets = load_dataset("glue", "mrpc") +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) + + +def tokenize_function(example): + return tokenizer(example["sentence1"], example["sentence2"], truncation=True) + + +tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) +data_collator = DataCollatorWithPadding(tokenizer=tokenizer) +``` + +### Training + +The first step before we can define our `Trainer` is to define a `TrainingArguments` class that will contain all the hyperparameters the `Trainer` will use for training and evaluation. The only argument you have to provide is a directory where the trained model will be saved, as well as the checkpoints along the way. For all the rest, you can leave the defaults, which should work pretty well for a basic fine-tuning. + +```py +from transformers import TrainingArguments + +training_args = TrainingArguments("test-trainer") +``` + + + +💡 If you want to automatically upload your model to the Hub during training, pass along `push_to_hub=True` in the `TrainingArguments`. We will learn more about this in [Chapter 4](/course/chapter4/3) + + + +The second step is to define our model. As in the [previous chapter](/course/chapter2), we will use the `AutoModelForSequenceClassification` class, with two labels: + +```py +from transformers import AutoModelForSequenceClassification + +model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +``` + +You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. + +Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: + +```py +from transformers import Trainer + +trainer = Trainer( + model, + training_args, + train_dataset=tokenized_datasets["train"], + eval_dataset=tokenized_datasets["validation"], + data_collator=data_collator, + tokenizer=tokenizer, +) +``` + +Note that when you pass the `tokenizer` as we did here, the default `data_collator` used by the `Trainer` will be a `DataCollatorWithPadding` as defined previously, so you can skip the line `data_collator=data_collator` in this call. It was still important to show you this part of the processing in section 2! + +To fine-tune the model on our dataset, we just have to call the `train()` method of our `Trainer`: + +```py +trainer.train() +``` + +This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: + +1. We didn't tell the `Trainer` to evaluate during training by setting `evaluation_strategy` to either `"steps"` (evaluate every `eval_steps`) or `"epoch"` (evaluate at the end of each epoch). +2. We didn't provide the `Trainer` with a `compute_metrics()` function to calculate a metric during said evaluation (otherwise the evaluation would just have printed the loss, which is not a very intuitive number). + + +### Evaluation + +Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command: + +```py +predictions = trainer.predict(tokenized_datasets["validation"]) +print(predictions.predictions.shape, predictions.label_ids.shape) +``` + +```python out +(408, 2) (408,) +``` + +The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. + +As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: + +```py +import numpy as np + +preds = np.argmax(predictions.predictions, axis=-1) +``` + +We can now compare those `preds` to the labels. To build our `compute_metric()` function, we will rely on the metrics from the 🤗 Datasets library. We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: + +```py +from datasets import load_metric + +metric = load_metric("glue", "mrpc") +metric.compute(predictions=preds, references=predictions.label_ids) +``` + +```python out +{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} +``` + +The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. + +Wrapping everything together, we get our `compute_metrics()` function: + +```py +def compute_metrics(eval_preds): + metric = load_metric("glue", "mrpc") + logits, labels = eval_preds + predictions = np.argmax(logits, axis=-1) + return metric.compute(predictions=predictions, references=labels) +``` + +And to see it used in action to report metrics at the end of each epoch, here is how we define a new `Trainer` with this `compute_metrics()` function: + +```py +training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch") +model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) + +trainer = Trainer( + model, + training_args, + train_dataset=tokenized_datasets["train"], + eval_dataset=tokenized_datasets["validation"], + data_collator=data_collator, + tokenizer=tokenizer, + compute_metrics=compute_metrics, +) +``` + +Note that we create a new `TrainingArguments` with its `evaluation_strategy` set to `"epoch"` and a new model — otherwise, we would just be continuing the training of the model we have already trained. To launch a new training run, we execute: + +``` +trainer.train() +``` + +This time, it will report the validation loss and metrics at the end of each epoch on top of the training loss. Again, the exact accuracy/F1 score you reach might be a bit different from what we found, because of the random head initialization of the model, but it should be in the same ballpark. + +The `Trainer` will work out of the box on multiple GPUs or TPUs and provides lots of options, like mixed-precision training (use `fp16 = True` in your training arguments). We will go over everything it supports in Chapter 10. + +This concludes the introduction to fine-tuning using the `Trainer` API. An example of doing this for most common NLP tasks will be given in Chapter 7, but for now let's look at how to do the same thing in pure PyTorch. + + + +✏️ **Try it out!** Fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. + + + diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx new file mode 100644 index 000000000..85a4626dd --- /dev/null +++ b/chapters/fa/chapter3/3_tf.mdx @@ -0,0 +1,203 @@ + + +# باز‌تنظیم یک مدل با استفاده از کِراس + +# Fine-tuning a model with Keras + + + +وقتی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا آموزشِ مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر تنظیمات GPU را انجام نداده‌اید، می‌توانید به GPUها یا TPUها مجانی روی [Google Colab](https://colab.research.google.com/) دسترسی داشته باشید. + +Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). + +The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: + +```py +from datasets import load_dataset +from transformers import AutoTokenizer, DataCollatorWithPadding +import numpy as np + +raw_datasets = load_dataset("glue", "mrpc") +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) + + +def tokenize_function(example): + return tokenizer(example["sentence1"], example["sentence2"], truncation=True) + + +tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) + +data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") + +tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=True, + collate_fn=data_collator, + batch_size=8, +) + +tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=False, + collate_fn=data_collator, + batch_size=8, +) +``` + +### Training + +TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. + + + +That means that once we have our data, very little work is required to begin training on it. + + + +As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: + +```py +from transformers import TFAutoModelForSequenceClassification + +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +``` + +You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. + +To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. + + + +Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. + + + +```py +from tensorflow.keras.losses import SparseCategoricalCrossentropy + +model.compile( + optimizer="adam", + loss=SparseCategoricalCrossentropy(from_logits=True), + metrics=["accuracy"], +) +model.fit( + tf_train_dataset, + validation_data=tf_validation_dataset, +) +``` + + + +Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. + + + + +### Improving training performance + + + +If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause +is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes +that optimizer with default values for all parameters, including learning rate. From long experience, though, we know +that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written +as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. + +In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate +over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* +the learning rate. In Keras, the best way to do this is to use a *learning rate scheduler*. A good one to use is +`PolynomialDecay` — despite the name, with default settings it simply linearly decays the learning rate from the initial +value to the final value over the course of training, which is exactly what we want. In order to use a scheduler correctly, +though, we need to tell it how long training is going to be. We compute that as `num_train_steps` below. + +```py +from tensorflow.keras.optimizers.schedules import PolynomialDecay + +batch_size = 8 +num_epochs = 3 +# The number of training steps is the number of samples in the dataset, divided by the batch size then multiplied +# by the total number of epochs. Note that the tf_train_dataset here is a batched tf.data.Dataset, +# not the original Hugging Face Dataset, so its len() is already num_samples // batch_size. +num_train_steps = len(tf_train_dataset) * num_epochs +lr_scheduler = PolynomialDecay( + initial_learning_rate=5e-5, end_learning_rate=0.0, decay_steps=num_train_steps +) +from tensorflow.keras.optimizers import Adam + +opt = Adam(learning_rate=lr_scheduler) +``` + + + +The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. + + + +Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: + +```py +import tensorflow as tf + +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) +model.compile(optimizer=opt, loss=loss, metrics=["accuracy"]) +``` + +Now, we fit again: + +```py +model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) +``` + + + +💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) + + + +### Model predictions + + + + +Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. + +```py +preds = model.predict(tf_validation_dataset)["logits"] +``` + +We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: + +```py +class_preds = np.argmax(preds, axis=1) +print(preds.shape, class_preds.shape) +``` + +```python out +(408, 2) (408,) +``` + +Now, let's use those `preds` to compute some metrics! We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: + +```py +from datasets import load_metric + +metric = load_metric("glue", "mrpc") +metric.compute(predictions=class_preds, references=raw_datasets["validation"]["label"]) +``` + +```python out +{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} +``` + +The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. + +This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in Chapter 7. If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. diff --git a/chapters/fa/chapter3/4.mdx b/chapters/fa/chapter3/4.mdx new file mode 100644 index 000000000..54563ea7c --- /dev/null +++ b/chapters/fa/chapter3/4.mdx @@ -0,0 +1,359 @@ +# A full training + + + + + +Now we'll see how to achieve the same results as we did in the last section without using the `Trainer` class. Again, we assume you have done the data processing in section 2. Here is a short summary covering everything you will need: + +```py +from datasets import load_dataset +from transformers import AutoTokenizer, DataCollatorWithPadding + +raw_datasets = load_dataset("glue", "mrpc") +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) + + +def tokenize_function(example): + return tokenizer(example["sentence1"], example["sentence2"], truncation=True) + + +tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) +data_collator = DataCollatorWithPadding(tokenizer=tokenizer) +``` + +### Prepare for training + +Before actually writing our training loop, we will need to define a few objects. The first ones are the dataloaders we will use to iterate over batches. But before we can define those dataloaders, we need to apply a bit of postprocessing to our `tokenized_datasets`, to take care of some things that the `Trainer` did for us automatically. Specifically, we need to: + +- Remove the columns corresponding to values the model does not expect (like the `sentence1` and `sentence2` columns). +- Rename the column `label` to `labels` (because the model expects the argument to be named `labels`). +- Set the format of the datasets so they return PyTorch tensors instead of lists. + +Our `tokenized_datasets` has one method for each of those steps: + +```py +tokenized_datasets = tokenized_datasets.remove_columns(["sentence1", "sentence2", "idx"]) +tokenized_datasets = tokenized_datasets.rename_column("label", "labels") +tokenized_datasets.set_format("torch") +tokenized_datasets["train"].column_names +``` + +We can then check that the result only has columns that our model will accept: + +```python +["attention_mask", "input_ids", "labels", "token_type_ids"] +``` + +Now that this is done, we can easily define our dataloaders: + +```py +from torch.utils.data import DataLoader + +train_dataloader = DataLoader( + tokenized_datasets["train"], shuffle=True, batch_size=8, collate_fn=data_collator +) +eval_dataloader = DataLoader( + tokenized_datasets["validation"], batch_size=8, collate_fn=data_collator +) +``` + +To quickly check there is no mistake in the data processing, we can inspect a batch like this: + +```py +for batch in train_dataloader: + break +{k: v.shape for k, v in batch.items()} +``` + +```python out +{'attention_mask': torch.Size([8, 65]), + 'input_ids': torch.Size([8, 65]), + 'labels': torch.Size([8]), + 'token_type_ids': torch.Size([8, 65])} +``` + +Note that the actual shapes will probably be slightly different for you since we set `shuffle=True` for the training dataloader and we are padding to the maximum length inside the batch. + +Now that we're completely finished with data preprocessing (a satisfying yet elusive goal for any ML practitioner), let's turn to the model. We instantiate it exactly as we did in the previous section: + +```py +from transformers import AutoModelForSequenceClassification + +model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +``` + +To make sure that everything will go smoothly during training, we pass our batch to this model: + +```py +outputs = model(**batch) +print(outputs.loss, outputs.logits.shape) +``` + +```python out +tensor(0.5441, grad_fn=) torch.Size([8, 2]) +``` + +All 🤗 Transformers models will return the loss when `labels` are provided, and we also get the logits (two for each input in our batch, so a tensor of size 8 x 2). + +We're almost ready to write our training loop! We're just missing two things: an optimizer and a learning rate scheduler. Since we are trying to replicate what the `Trainer` was doing by hand, we will use the same defaults. The optimizer used by the `Trainer` is `AdamW`, which is the same as Adam, but with a twist for weight decay regularization (see ["Decoupled Weight Decay Regularization"](https://arxiv.org/abs/1711.05101) by Ilya Loshchilov and Frank Hutter): + +```py +from transformers import AdamW + +optimizer = AdamW(model.parameters(), lr=5e-5) +``` + +Finally, the learning rate scheduler used by default is just a linear decay from the maximum value (5e-5) to 0. To properly define it, we need to know the number of training steps we will take, which is the number of epochs we want to run multiplied by the number of training batches (which is the length of our training dataloader). The `Trainer` uses three epochs by default, so we will follow that: + +```py +from transformers import get_scheduler + +num_epochs = 3 +num_training_steps = num_epochs * len(train_dataloader) +lr_scheduler = get_scheduler( + "linear", + optimizer=optimizer, + num_warmup_steps=0, + num_training_steps=num_training_steps, +) +print(num_training_steps) +``` + +```python out +1377 +``` + +### The training loop + +One last thing: we will want to use the GPU if we have access to one (on a CPU, training might take several hours instead of a couple of minutes). To do this, we define a `device` we will put our model and our batches on: + +```py +import torch + +device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") +model.to(device) +device +``` + +```python out +device(type='cuda') +``` + +We are now ready to train! To get some sense of when training will be finished, we add a progress bar over our number of training steps, using the `tqdm` library: + +```py +from tqdm.auto import tqdm + +progress_bar = tqdm(range(num_training_steps)) + +model.train() +for epoch in range(num_epochs): + for batch in train_dataloader: + batch = {k: v.to(device) for k, v in batch.items()} + outputs = model(**batch) + loss = outputs.loss + loss.backward() + + optimizer.step() + lr_scheduler.step() + optimizer.zero_grad() + progress_bar.update(1) +``` + +You can see that the core of the training loop looks a lot like the one in the introduction. We didn't ask for any reporting, so this training loop will not tell us anything about how the model fares. We need to add an evaluation loop for that. + + +### The evaluation loop + +As we did earlier, we will use a metric provided by the 🤗 Datasets library. We've already seen the `metric.compute()` method, but metrics can actually accumulate batches for us as we go over the prediction loop with the method `add_batch()`. Once we have accumulated all the batches, we can get the final result with `metric.compute()`. Here's how to implement all of this in an evaluation loop: + +```py +from datasets import load_metric + +metric = load_metric("glue", "mrpc") +model.eval() +for batch in eval_dataloader: + batch = {k: v.to(device) for k, v in batch.items()} + with torch.no_grad(): + outputs = model(**batch) + + logits = outputs.logits + predictions = torch.argmax(logits, dim=-1) + metric.add_batch(predictions=predictions, references=batch["labels"]) + +metric.compute() +``` + +```python out +{'accuracy': 0.8431372549019608, 'f1': 0.8907849829351535} +``` + +Again, your results will be slightly different because of the randomness in the model head initialization and the data shuffling, but they should be in the same ballpark. + + + +✏️ **Try it out!** Modify the previous training loop to fine-tune your model on the SST-2 dataset. + + + +### Supercharge your training loop with 🤗 Accelerate + + + +The training loop we defined earlier works fine on a single CPU or GPU. But using the [🤗 Accelerate](https://github.com/huggingface/accelerate) library, with just a few adjustments we can enable distributed training on multiple GPUs or TPUs. Starting from the creation of the training and validation dataloaders, here is what our manual training loop looks like: + +```py +from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler + +model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +optimizer = AdamW(model.parameters(), lr=3e-5) + +device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") +model.to(device) + +num_epochs = 3 +num_training_steps = num_epochs * len(train_dataloader) +lr_scheduler = get_scheduler( + "linear", + optimizer=optimizer, + num_warmup_steps=0, + num_training_steps=num_training_steps, +) + +progress_bar = tqdm(range(num_training_steps)) + +model.train() +for epoch in range(num_epochs): + for batch in train_dataloader: + batch = {k: v.to(device) for k, v in batch.items()} + outputs = model(**batch) + loss = outputs.loss + loss.backward() + + optimizer.step() + lr_scheduler.step() + optimizer.zero_grad() + progress_bar.update(1) +``` + +And here are the changes: + +```diff ++ from accelerate import Accelerator + from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler + ++ accelerator = Accelerator() + + model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) + optimizer = AdamW(model.parameters(), lr=3e-5) + +- device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") +- model.to(device) + ++ train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare( ++ train_dataloader, eval_dataloader, model, optimizer ++ ) + + num_epochs = 3 + num_training_steps = num_epochs * len(train_dataloader) + lr_scheduler = get_scheduler( + "linear", + optimizer=optimizer, + num_warmup_steps=0, + num_training_steps=num_training_steps + ) + + progress_bar = tqdm(range(num_training_steps)) + + model.train() + for epoch in range(num_epochs): + for batch in train_dataloader: +- batch = {k: v.to(device) for k, v in batch.items()} + outputs = model(**batch) + loss = outputs.loss +- loss.backward() ++ accelerator.backward(loss) + + optimizer.step() + lr_scheduler.step() + optimizer.zero_grad() + progress_bar.update(1) +``` + +The first line to add is the import line. The second line instantiates an `Accelerator` object that will look at the environment and initialize the proper distributed setup. 🤗 Accelerate handles the device placement for you, so you can remove the lines that put the model on the device (or, if you prefer, change them to use `accelerator.device` instead of `device`). + +Then the main bulk of the work is done in the line that sends the dataloaders, the model, and the optimizer to `accelerator.prepare()`. This will wrap those objects in the proper container to make sure your distributed training works as intended. The remaining changes to make are removing the line that puts the batch on the `device` (again, if you want to keep this you can just change it to use `accelerator.device`) and replacing `loss.backward()` with `accelerator.backward(loss)`. + + +⚠️ In order to benefit from the speed-up offered by Cloud TPUs, we recommend padding your samples to a fixed length with the `padding="max_length"` and `max_length` arguments of the tokenizer. + + +If you'd like to copy and paste it to play around, here's what the complete training loop looks like with 🤗 Accelerate: + +```py +from accelerate import Accelerator +from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler + +accelerator = Accelerator() + +model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +optimizer = AdamW(model.parameters(), lr=3e-5) + +train_dl, eval_dl, model, optimizer = accelerator.prepare( + train_dataloader, eval_dataloader, model, optimizer +) + +num_epochs = 3 +num_training_steps = num_epochs * len(train_dl) +lr_scheduler = get_scheduler( + "linear", + optimizer=optimizer, + num_warmup_steps=0, + num_training_steps=num_training_steps, +) + +progress_bar = tqdm(range(num_training_steps)) + +model.train() +for epoch in range(num_epochs): + for batch in train_dl: + outputs = model(**batch) + loss = outputs.loss + accelerator.backward(loss) + + optimizer.step() + lr_scheduler.step() + optimizer.zero_grad() + progress_bar.update(1) +``` + +Putting this in a `train.py` script will make that script runnable on any kind of distributed setup. To try it out in your distributed setup, run the command: + +```bash +accelerate config +``` + +which will prompt you to answer a few questions and dump your answers in a configuration file used by this command: + +``` +accelerate launch train.py +``` + +which will launch the distributed training. + +If you want to try this in a Notebook (for instance, to test it with TPUs on Colab), just paste the code in a `training_function()` and run a last cell with: + +```python +from accelerate import notebook_launcher + +notebook_launcher(training_function) +``` + +You can find more examples in the [🤗 Accelerate repo](https://github.com/huggingface/accelerate/tree/main/examples). diff --git a/chapters/fa/chapter3/5.mdx b/chapters/fa/chapter3/5.mdx new file mode 100644 index 000000000..dda8cb7fe --- /dev/null +++ b/chapters/fa/chapter3/5.mdx @@ -0,0 +1,20 @@ + + +# Fine-tuning, Check! + +That was fun! In the first two chapters you learned about models and tokenizers, and now you know how to fine-tune them for your own data. To recap, in this chapter you: + +{#if fw === 'pt'} +* Learned about datasets in the [Hub](https://huggingface.co/datasets) +* Learned how to load and preprocess datasets, including using dynamic padding and collators +* Implemented your own fine-tuning and evaluation of a model +* Implemented a lower-level training loop +* Used 🤗 Accelerate to easily adapt your training loop so it works for multiple GPUs or TPUs + +{:else} +* Learned about datasets in the [Hub](https://huggingface.co/datasets) +* Learned how to load and preprocess datasets +* Learned how to fine-tune and evaluate a model with Keras +* Implemented a custom metric + +{/if} diff --git a/chapters/fa/chapter3/6.mdx b/chapters/fa/chapter3/6.mdx new file mode 100644 index 000000000..94d02da24 --- /dev/null +++ b/chapters/fa/chapter3/6.mdx @@ -0,0 +1,296 @@ + + + + +# End-of-chapter quiz + +Test what you learned in this chapter! + +### 1. The `emotion` dataset contains Twitter messages labeled with emotions. Search for it in the [Hub](https://huggingface.co/datasets), and read the dataset card. Which of these is not one of its basic emotions? + + + +### 2. Search for the `ar_sarcasm` dataset in the [Hub](https://huggingface.co/datasets). Which task does it support? + +dataset card!" + }, + { + text: "Named entity recognition", + explain: "That's not it — take another look at the dataset card!" + }, + { + text: "Question answering", + explain: "Alas, this question was not answered correctly. Try again!" + } + ]} +/> + +### 3. How does the BERT model expect a pair of sentences to be processed? + +[SEP] special token is needed to separate the two sentences, but that's not the only thing!" + }, + { + text: "[CLS] Tokens_of_sentence_1 Tokens_of_sentence_2", + explain: "A [CLS] special token is required at the beginning, but that's not the only thing!" + }, + { + text: "[CLS] Tokens_of_sentence_1 [SEP] Tokens_of_sentence_2 [SEP]", + explain: "That's correct!", + correct: true + }, + { + text: "[CLS] Tokens_of_sentence_1 [SEP] Tokens_of_sentence_2", + explain: "A [CLS] special token is needed at the beginning as well as a [SEP] special token to separate the two sentences, but that's not all!" + } + ]} +/> + +{#if fw === 'pt'} +### 4. What are the benefits of the `Dataset.map()` method? + + + +### 5. What does dynamic padding mean? + + + +### 6. What is the purpose of a collate function? + +DataCollatorWithPadding specifically." + }, + { + text: "It puts together all the samples in a batch.", + explain: "Correct! You can pass the collate function as an argument of a DataLoader. We used the DataCollatorWithPadding function, which pads all items in a batch so they have the same length.", + correct: true + }, + { + text: "It preprocesses the whole dataset.", + explain: "That would be a preprocessing function, not a collate function." + }, + { + text: "It truncates the sequences in the dataset.", + explain: "A collate function is involved in handling individual batches, not the whole dataset. If you're interested in truncating, you can use the truncate argument of tokenizer." + } + ]} +/> + +### 7. What happens when you instantiate one of the `AutoModelForXxx` classes with a pretrained language model (such as `bert-base-uncased`) that corresponds to a different task than the one for which it was trained? + +AutoModelForSequenceClassification with bert-base-uncased, we got warnings when instantiating the model. The pretrained head is not used for the sequence classification task, so it's discarded and a new head is instantiated with random weights.", + correct: true + }, + { + text: "The head of the pretrained model is discarded.", + explain: "Something else needs to happen. Try again!" + }, + { + text: "Nothing, since the model can still be fine-tuned for the different task.", + explain: "The head of the pretrained model was not trained to solve this task, so we should discard the head!" + } + ]} +/> + +### 8. What's the purpose of `TrainingArguments`? + +Trainer.", + explain: "Correct!", + correct: true + }, + { + text: "It specifies the size of the model.", + explain: "The model size is defined by the model configuration, not the class TrainingArguments." + }, + { + text: "It just contains the hyperparameters used for evaluation.", + explain: "In the example, we specified where the model and its checkpoints will be saved. Try again!" + }, + { + text: "It just contains the hyperparameters used for training.", + explain: "In the example, we used an evaluation_strategy as well, so this impacts evaluation. Try again!" + } + ]} +/> + +### 9. Why should you use the 🤗 Accelerate library? + +Trainer, not the 🤗 Accelerate library. Try again!" + }, + { + text: "It makes our training loops work on distributed strategies", + explain: "Correct! With 🤗 Accelerate, your training loops will work for multiple GPUs and TPUs.", + correct: true + }, + { + text: "It provides more optimization functions.", + explain: "No, the 🤗 Accelerate library does not provide any optimization functions." + } + ]} +/> + +{:else} +### 4. What happens when you instantiate one of the `TFAutoModelForXxx` classes with a pretrained language model (such as `bert-base-uncased`) that corresponds to a different task than the one for which it was trained? + +TFAutoModelForSequenceClassification with bert-base-uncased, we got warnings when instantiating the model. The pretrained head is not used for the sequence classification task, so it's discarded and a new head is instantiated with random weights.", + correct: true + }, + { + text: "The head of the pretrained model is discarded.", + explain: "Something else needs to happen. Try again!" + }, + { + text: "Nothing, since the model can still be fine-tuned for the different task.", + explain: "The head of the pretrained model was not trained to solve this task, so we should discard the head!" + } + ]} +/> + +### 5. The TensorFlow models from `transformers` are already Keras models. What benefit does this offer? + +TPUStrategy scope, including the initialization of the model." + }, + { + text: "You can leverage existing methods such as compile(), fit(), and predict().", + explain: "Correct! Once you have the data, training on it requires very little work.", + correct: true + }, + { + text: "You get to learn Keras as well as transformers.", + explain: "Correct, but we're looking for something else :)", + correct: true + }, + { + text: "You can easily compute metrics related to the dataset.", + explain: "Keras helps us with training and evaluating the model, not computing dataset-related metrics." + } + ]} +/> + +### 6. How can you define your own custom metric? + +tf.keras.metrics.Metric.", + explain: "Great!", + correct: true + }, + { + text: "Using the Keras functional API.", + explain: "Try again!" + }, + { + text: "By using a callable with signature metric_fn(y_true, y_pred).", + explain: "Correct!", + correct: true + }, + { + text: "By Googling it.", + explain: "That's not the answer we're looking for, but it should help you find it.", + correct: true + } + ]} +/> + +{/if} \ No newline at end of file From f38ca66c13074f325e241c133dd3e803b55b6675 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sat, 30 Apr 2022 08:48:35 +0200 Subject: [PATCH 097/254] file removed --- chapters/fa/chapter3/2.mdx | 390 ---------------------------------- chapters/fa/chapter3/3.mdx | 172 --------------- chapters/fa/chapter3/3_tf.mdx | 203 ------------------ 3 files changed, 765 deletions(-) delete mode 100644 chapters/fa/chapter3/2.mdx delete mode 100644 chapters/fa/chapter3/3.mdx delete mode 100644 chapters/fa/chapter3/3_tf.mdx diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx deleted file mode 100644 index 5be25d104..000000000 --- a/chapters/fa/chapter3/2.mdx +++ /dev/null @@ -1,390 +0,0 @@ - - -# پردازش داده -# Processing the data - -{#if fw === 'pt'} - - - -{:else} - - - -{/if} - -{#if fw === 'pt'} - -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بَتچ توسط pytorch را شرح می‌دهیم: - -```python -import torch -from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification - -# Same as before -checkpoint = "bert-base-uncased" -tokenizer = AutoTokenizer.from_pretrained(checkpoint) -model = AutoModelForSequenceClassification.from_pretrained(checkpoint) -sequences = [ - "I've been waiting for a HuggingFace course my whole life.", - "This course is amazing!", -] -batch = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt") - -# This is new -batch["labels"] = torch.tensor([1, 1]) - -optimizer = AdamW(model.parameters()) -loss = model(**batch).loss -loss.backward() -optimizer.step() -``` -{:else} - -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بَتچ توسط pytorch را شرح می‌دهیم: - -```python -import tensorflow as tf -import numpy as np -from transformers import AutoTokenizer, TFAutoModelForSequenceClassification - -# Same as before -checkpoint = "bert-base-uncased" -tokenizer = AutoTokenizer.from_pretrained(checkpoint) -model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) -sequences = [ - "I've been waiting for a HuggingFace course my whole life.", - "This course is amazing!", -] -batch = dict(tokenizer(sequences, padding=True, truncation=True, return_tensors="tf")) - -# This is new -model.compile(optimizer="adam", loss="sparse_categorical_crossentropy") -labels = tf.convert_to_tensor([1, 1]) -model.train_on_batch(batch, labels) -``` - -{/if} - -البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه‌داده بزرگتر خواهید داشت. - -در این بخش ما از مجموعه‌داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این مجموعه‌داده این است که مجموعه‌داده کوچکیست و تجربه آموزش دادن روی آن آسان است. - -### بارگذاری یک داده از هاب - -### Loading a dataset from the Hub - -{#if fw === 'pt'} - -{:else} - -{/if} - -هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه‌داده‌های متعدد در بسیاری زبان‌های مختلف می‌باشد. شما می‌توانید مجموعه‌داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه‌داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. - -کتابخانه مجموعه‌داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه‌داده در هاب ارائه می‌کند. ما می‌توانیم مجموعه‌داده MRPC را به روش زیر دانلود کنیم: - -```py -from datasets import load_dataset - -raw_datasets = load_dataset("glue", "mrpc") -raw_datasets -``` - -```python out -DatasetDict({ - train: Dataset({ - features: ['sentence1', 'sentence2', 'label', 'idx'], - num_rows: 3668 - }) - validation: Dataset({ - features: ['sentence1', 'sentence2', 'label', 'idx'], - num_rows: 408 - }) - test: Dataset({ - features: ['sentence1', 'sentence2', 'label', 'idx'], - num_rows: 1725 - }) -}) -``` - -همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx`) و تعداد متغیری ردیف داده که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training وجود دارد، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test). - - این دستور مجموعه‌داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. - -ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از شماره‌گذاری, مانند یک dictionary دسترسی پیدا کنیم: - -```py -raw_train_dataset = raw_datasets["train"] -raw_train_dataset[0] -``` - -```python out -{'idx': 0, - 'label': 1, - 'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', - 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} -``` - -می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه‌داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. - -```py -raw_train_dataset.features -``` - -```python out -{'sentence1': Value(dtype='string', id=None), - 'sentence2': Value(dtype='string', id=None), - 'label': ClassLabel(num_classes=2, names=['not_equivalent', 'equivalent'], names_file=None, id=None), - 'idx': Value(dtype='int32', id=None)} -``` - -در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent`، و `1` مربوط به `equivalent` می‌باشد،. - - -✏️ **امتحان کنید!** عنصر شماره ۱۵ از داده training و عنصر شماره ۸۷ از داده validation را مشاهده کنید. برچسبهای آنها چیست؟ - - -### پیش‌پردازشِ یک مجموعه‌داده - -{#if fw === 'pt'} - -{:else} - -{/if} - -به منظور پیش‌پردازش مجموعه‌داده، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: - -```py -from transformers import AutoTokenizer - -checkpoint = "bert-base-uncased" -tokenizer = AutoTokenizer.from_pretrained(checkpoint) -tokenized_sentences_1 = tokenizer(raw_datasets["train"]["sentence1"]) -tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) -``` - -با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده سازی کند: - -```py -inputs = tokenizer("This is the first sentence.", "This is the second one.") -inputs -``` - -```python out -{ - 'input_ids': [101, 2023, 2003, 1996, 2034, 6251, 1012, 102, 2023, 2003, 1996, 2117, 2028, 1012, 102], - 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], - 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -} -``` - -در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی، جمله اول و کدام بخش جمله دوم است. - - - -✏️ **امتحان کنید!** عنصر شماره ۱۵ داده را بردارید و دو جمله را به صورت جداگانه و جفت توکنایز کنید. تفاوت دو نتیجه چیست؟ - - - -اگر آیدی‌های داخل `input_ids` را به کلمات رمزگشایی کنیم: - -```py -tokenizer.convert_ids_to_tokens(inputs["input_ids"]) -``` - -خواهیم داشت: - -we will get: - -```python out -['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] -``` - -بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. - -```python out -['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] -[ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] -``` - -همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند آیدی نشاندهنده نوع توکِن آنها `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند آیدی نشاندهنده نوع توکِن‌شان `1` می‌باشد. - -توجه داشته باشید که اگر چکپوینت متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. - -در اینجا، مدل BERT با آیدی‌هایی که نشاندهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبانِ ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ برعهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. - - در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالتها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. - -در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکنایز شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکنایزر می‌داند چه چیزی برای مدل فراهم کند. - -اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل مجموعه‌داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ مجموعه‌داده‌ی training اینگونه می‌باشد: - -```py -tokenized_dataset = tokenizer( - raw_datasets["train"]["sentence1"], - raw_datasets["train"]["sentence2"], - padding=True, - truncation=True, -) -``` -این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل مجموعه‌داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه‌داده‌های موجود در پایگاه مجموعه‌داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه می‌دارید). - -به منظور نگه داشتن داده به صورت یک مجموعه‌داده، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه‌داده عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکنایز کند: - -```py -def tokenize_function(example): - return tokenizer(example["sentence1"], example["sentence2"], truncation=True) -``` - -این تابع یک دیکشنری (مثل اقلام داخل مجموعه‌داده) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. این توکنایزر با توکنایزری در کتابخانه [🤗 Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. - -توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر مجموعه‌داده. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. - -در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل مجموعه‌داده به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از مجموعه‌داده ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریعتر انجام گیرد: - -```py -tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) -tokenized_datasets -``` -روشی که کتابخانه مجموعه‌داده 🤗 این پیش‌پردازش را اعمال می‌کند، با افزودن -فیلدهای- جدید به مجموعه‌داده‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، می‌باشد:، - -```python out -DatasetDict({ - train: Dataset({ - features: ['attention_mask', 'idx', 'input_ids', 'label', 'sentence1', 'sentence2', 'token_type_ids'], - num_rows: 3668 - }) - validation: Dataset({ - features: ['attention_mask', 'idx', 'input_ids', 'label', 'sentence1', 'sentence2', 'token_type_ids'], - num_rows: 408 - }) - test: Dataset({ - features: ['attention_mask', 'idx', 'input_ids', 'label', 'sentence1', 'sentence2', 'token_type_ids'], - num_rows: 1725 - }) -}) -``` - -شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `()map` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایزر سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. - - -تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخش‌های مجموعه‌داده افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در مجموعه‌داده که تابع `()map` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. - -آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. - - -### هم‌طول‌سازی پویا - -### Dynamic padding - - - -{#if fw === 'pt'} - -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU ها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. - -{:else} - -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. collator پیش فرض تابعی است که فقط نمونه‌های شما را به tf.Tensor تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. - -{/if} - -برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های مجموعه‌داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند، و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: - -{#if fw === 'pt'} -```py -from transformers import DataCollatorWithPadding - -data_collator = DataCollatorWithPadding(tokenizer=tokenizer) -``` -{:else} -```py -from transformers import DataCollatorWithPadding - -data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") -``` -{/if} - -اجازه دهید چند نمونه از مجموعه training مان، که می‌خواهیم باهم بَتچ کنیم، برداریم تا این ابزار جدید را امتحان کنیم. در اینجا سطون‌های `idx`، `sentence1`، و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: - -```py -samples = tokenized_datasets["train"][:8] -samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "sentence2"]} -[len(x) for x in samples["input_ids"]] -``` - -```python out -[50, 59, 47, 67, 59, 50, 62, 32] -``` - -تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل مجموعه‌داده باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: - -```py -batch = data_collator(samples) -{k: v.shape for k, v in batch.items()} -``` - -{#if fw === 'tf'} - -```python out -{'attention_mask': TensorShape([8, 67]), - 'input_ids': TensorShape([8, 67]), - 'token_type_ids': TensorShape([8, 67]), - 'labels': TensorShape([8])} -``` - -{:else} - -```python out -{'attention_mask': torch.Size([8, 67]), - 'input_ids': torch.Size([8, 67]), - 'token_type_ids': torch.Size([8, 67]), - 'labels': torch.Size([8])} -``` - -به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل مان می‌تواند با آنها کار کند، آماده هستیم برای انجام بازتنظیم مدل: - -{/if} - - - -✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی مجموعه‌داده GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. - - - -{#if fw === 'tf'} - -توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک مجموعه‌داده 🤗 را به سرعت به فرمت آماده برای آموزش تبدیل کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! - -```py -tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( - columns=["attention_mask", "input_ids", "token_type_ids"], - label_cols=["labels"], - shuffle=True, - collate_fn=data_collator, - batch_size=8, -) - -tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( - columns=["attention_mask", "input_ids", "token_type_ids"], - label_cols=["labels"], - shuffle=False, - collate_fn=data_collator, - batch_size=8, -) -``` - -این هم از این! حالا می‌توانیم این مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. - -{/if} diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx deleted file mode 100644 index 749cfd511..000000000 --- a/chapters/fa/chapter3/3.mdx +++ /dev/null @@ -1,172 +0,0 @@ - - -# Fine-tuning a model with the Trainer API - - - - - -🤗 Transformers provides a `Trainer` class to help you fine-tune any of the pretrained models it provides on your dataset. Once you've done all the data preprocessing work in the last section, you have just a few steps left to define the `Trainer`. The hardest part is likely to be preparing the environment to run `Trainer.train()`, as it will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). - -The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: - -```py -from datasets import load_dataset -from transformers import AutoTokenizer, DataCollatorWithPadding - -raw_datasets = load_dataset("glue", "mrpc") -checkpoint = "bert-base-uncased" -tokenizer = AutoTokenizer.from_pretrained(checkpoint) - - -def tokenize_function(example): - return tokenizer(example["sentence1"], example["sentence2"], truncation=True) - - -tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) -data_collator = DataCollatorWithPadding(tokenizer=tokenizer) -``` - -### Training - -The first step before we can define our `Trainer` is to define a `TrainingArguments` class that will contain all the hyperparameters the `Trainer` will use for training and evaluation. The only argument you have to provide is a directory where the trained model will be saved, as well as the checkpoints along the way. For all the rest, you can leave the defaults, which should work pretty well for a basic fine-tuning. - -```py -from transformers import TrainingArguments - -training_args = TrainingArguments("test-trainer") -``` - - - -💡 If you want to automatically upload your model to the Hub during training, pass along `push_to_hub=True` in the `TrainingArguments`. We will learn more about this in [Chapter 4](/course/chapter4/3) - - - -The second step is to define our model. As in the [previous chapter](/course/chapter2), we will use the `AutoModelForSequenceClassification` class, with two labels: - -```py -from transformers import AutoModelForSequenceClassification - -model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) -``` - -You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. - -Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: - -```py -from transformers import Trainer - -trainer = Trainer( - model, - training_args, - train_dataset=tokenized_datasets["train"], - eval_dataset=tokenized_datasets["validation"], - data_collator=data_collator, - tokenizer=tokenizer, -) -``` - -Note that when you pass the `tokenizer` as we did here, the default `data_collator` used by the `Trainer` will be a `DataCollatorWithPadding` as defined previously, so you can skip the line `data_collator=data_collator` in this call. It was still important to show you this part of the processing in section 2! - -To fine-tune the model on our dataset, we just have to call the `train()` method of our `Trainer`: - -```py -trainer.train() -``` - -This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: - -1. We didn't tell the `Trainer` to evaluate during training by setting `evaluation_strategy` to either `"steps"` (evaluate every `eval_steps`) or `"epoch"` (evaluate at the end of each epoch). -2. We didn't provide the `Trainer` with a `compute_metrics()` function to calculate a metric during said evaluation (otherwise the evaluation would just have printed the loss, which is not a very intuitive number). - - -### Evaluation - -Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command: - -```py -predictions = trainer.predict(tokenized_datasets["validation"]) -print(predictions.predictions.shape, predictions.label_ids.shape) -``` - -```python out -(408, 2) (408,) -``` - -The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. - -As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: - -```py -import numpy as np - -preds = np.argmax(predictions.predictions, axis=-1) -``` - -We can now compare those `preds` to the labels. To build our `compute_metric()` function, we will rely on the metrics from the 🤗 Datasets library. We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: - -```py -from datasets import load_metric - -metric = load_metric("glue", "mrpc") -metric.compute(predictions=preds, references=predictions.label_ids) -``` - -```python out -{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} -``` - -The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. - -Wrapping everything together, we get our `compute_metrics()` function: - -```py -def compute_metrics(eval_preds): - metric = load_metric("glue", "mrpc") - logits, labels = eval_preds - predictions = np.argmax(logits, axis=-1) - return metric.compute(predictions=predictions, references=labels) -``` - -And to see it used in action to report metrics at the end of each epoch, here is how we define a new `Trainer` with this `compute_metrics()` function: - -```py -training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch") -model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) - -trainer = Trainer( - model, - training_args, - train_dataset=tokenized_datasets["train"], - eval_dataset=tokenized_datasets["validation"], - data_collator=data_collator, - tokenizer=tokenizer, - compute_metrics=compute_metrics, -) -``` - -Note that we create a new `TrainingArguments` with its `evaluation_strategy` set to `"epoch"` and a new model — otherwise, we would just be continuing the training of the model we have already trained. To launch a new training run, we execute: - -``` -trainer.train() -``` - -This time, it will report the validation loss and metrics at the end of each epoch on top of the training loss. Again, the exact accuracy/F1 score you reach might be a bit different from what we found, because of the random head initialization of the model, but it should be in the same ballpark. - -The `Trainer` will work out of the box on multiple GPUs or TPUs and provides lots of options, like mixed-precision training (use `fp16 = True` in your training arguments). We will go over everything it supports in Chapter 10. - -This concludes the introduction to fine-tuning using the `Trainer` API. An example of doing this for most common NLP tasks will be given in Chapter 7, but for now let's look at how to do the same thing in pure PyTorch. - - - -✏️ **Try it out!** Fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. - - - diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx deleted file mode 100644 index 85a4626dd..000000000 --- a/chapters/fa/chapter3/3_tf.mdx +++ /dev/null @@ -1,203 +0,0 @@ - - -# باز‌تنظیم یک مدل با استفاده از کِراس - -# Fine-tuning a model with Keras - - - -وقتی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا آموزشِ مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر تنظیمات GPU را انجام نداده‌اید، می‌توانید به GPUها یا TPUها مجانی روی [Google Colab](https://colab.research.google.com/) دسترسی داشته باشید. - -Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). - -The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: - -```py -from datasets import load_dataset -from transformers import AutoTokenizer, DataCollatorWithPadding -import numpy as np - -raw_datasets = load_dataset("glue", "mrpc") -checkpoint = "bert-base-uncased" -tokenizer = AutoTokenizer.from_pretrained(checkpoint) - - -def tokenize_function(example): - return tokenizer(example["sentence1"], example["sentence2"], truncation=True) - - -tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) - -data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") - -tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( - columns=["attention_mask", "input_ids", "token_type_ids"], - label_cols=["labels"], - shuffle=True, - collate_fn=data_collator, - batch_size=8, -) - -tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( - columns=["attention_mask", "input_ids", "token_type_ids"], - label_cols=["labels"], - shuffle=False, - collate_fn=data_collator, - batch_size=8, -) -``` - -### Training - -TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. - - - -That means that once we have our data, very little work is required to begin training on it. - - - -As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: - -```py -from transformers import TFAutoModelForSequenceClassification - -model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) -``` - -You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. - -To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. - - - -Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. - - - -```py -from tensorflow.keras.losses import SparseCategoricalCrossentropy - -model.compile( - optimizer="adam", - loss=SparseCategoricalCrossentropy(from_logits=True), - metrics=["accuracy"], -) -model.fit( - tf_train_dataset, - validation_data=tf_validation_dataset, -) -``` - - - -Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. - - - - -### Improving training performance - - - -If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause -is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes -that optimizer with default values for all parameters, including learning rate. From long experience, though, we know -that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written -as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. - -In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate -over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* -the learning rate. In Keras, the best way to do this is to use a *learning rate scheduler*. A good one to use is -`PolynomialDecay` — despite the name, with default settings it simply linearly decays the learning rate from the initial -value to the final value over the course of training, which is exactly what we want. In order to use a scheduler correctly, -though, we need to tell it how long training is going to be. We compute that as `num_train_steps` below. - -```py -from tensorflow.keras.optimizers.schedules import PolynomialDecay - -batch_size = 8 -num_epochs = 3 -# The number of training steps is the number of samples in the dataset, divided by the batch size then multiplied -# by the total number of epochs. Note that the tf_train_dataset here is a batched tf.data.Dataset, -# not the original Hugging Face Dataset, so its len() is already num_samples // batch_size. -num_train_steps = len(tf_train_dataset) * num_epochs -lr_scheduler = PolynomialDecay( - initial_learning_rate=5e-5, end_learning_rate=0.0, decay_steps=num_train_steps -) -from tensorflow.keras.optimizers import Adam - -opt = Adam(learning_rate=lr_scheduler) -``` - - - -The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. - - - -Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: - -```py -import tensorflow as tf - -model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) -loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) -model.compile(optimizer=opt, loss=loss, metrics=["accuracy"]) -``` - -Now, we fit again: - -```py -model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -``` - - - -💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) - - - -### Model predictions - - - - -Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. - -```py -preds = model.predict(tf_validation_dataset)["logits"] -``` - -We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: - -```py -class_preds = np.argmax(preds, axis=1) -print(preds.shape, class_preds.shape) -``` - -```python out -(408, 2) (408,) -``` - -Now, let's use those `preds` to compute some metrics! We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: - -```py -from datasets import load_metric - -metric = load_metric("glue", "mrpc") -metric.compute(predictions=class_preds, references=raw_datasets["validation"]["label"]) -``` - -```python out -{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} -``` - -The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. - -This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in Chapter 7. If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. From bf5bf0f4c43b5374bded2ef20296d425f51214e2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sat, 30 Apr 2022 08:51:38 +0200 Subject: [PATCH 098/254] mistake fixed --- chapters/fa/chapter3/2.mdx | 390 +++++++++++++++++++++++++++++++++++++ chapters/fa/chapter3/4.mdx | 359 ---------------------------------- chapters/fa/chapter3/5.mdx | 20 -- chapters/fa/chapter3/6.mdx | 296 ---------------------------- 4 files changed, 390 insertions(+), 675 deletions(-) create mode 100644 chapters/fa/chapter3/2.mdx delete mode 100644 chapters/fa/chapter3/4.mdx delete mode 100644 chapters/fa/chapter3/5.mdx delete mode 100644 chapters/fa/chapter3/6.mdx diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx new file mode 100644 index 000000000..5be25d104 --- /dev/null +++ b/chapters/fa/chapter3/2.mdx @@ -0,0 +1,390 @@ + + +# پردازش داده +# Processing the data + +{#if fw === 'pt'} + + + +{:else} + + + +{/if} + +{#if fw === 'pt'} + +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بَتچ توسط pytorch را شرح می‌دهیم: + +```python +import torch +from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification + +# Same as before +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) +sequences = [ + "I've been waiting for a HuggingFace course my whole life.", + "This course is amazing!", +] +batch = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt") + +# This is new +batch["labels"] = torch.tensor([1, 1]) + +optimizer = AdamW(model.parameters()) +loss = model(**batch).loss +loss.backward() +optimizer.step() +``` +{:else} + +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بَتچ توسط pytorch را شرح می‌دهیم: + +```python +import tensorflow as tf +import numpy as np +from transformers import AutoTokenizer, TFAutoModelForSequenceClassification + +# Same as before +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) +sequences = [ + "I've been waiting for a HuggingFace course my whole life.", + "This course is amazing!", +] +batch = dict(tokenizer(sequences, padding=True, truncation=True, return_tensors="tf")) + +# This is new +model.compile(optimizer="adam", loss="sparse_categorical_crossentropy") +labels = tf.convert_to_tensor([1, 1]) +model.train_on_batch(batch, labels) +``` + +{/if} + +البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه‌داده بزرگتر خواهید داشت. + +در این بخش ما از مجموعه‌داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این مجموعه‌داده این است که مجموعه‌داده کوچکیست و تجربه آموزش دادن روی آن آسان است. + +### بارگذاری یک داده از هاب + +### Loading a dataset from the Hub + +{#if fw === 'pt'} + +{:else} + +{/if} + +هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه‌داده‌های متعدد در بسیاری زبان‌های مختلف می‌باشد. شما می‌توانید مجموعه‌داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه‌داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. + +کتابخانه مجموعه‌داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه‌داده در هاب ارائه می‌کند. ما می‌توانیم مجموعه‌داده MRPC را به روش زیر دانلود کنیم: + +```py +from datasets import load_dataset + +raw_datasets = load_dataset("glue", "mrpc") +raw_datasets +``` + +```python out +DatasetDict({ + train: Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 3668 + }) + validation: Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 408 + }) + test: Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 1725 + }) +}) +``` + +همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx`) و تعداد متغیری ردیف داده که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training وجود دارد، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test). + + این دستور مجموعه‌داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + +ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از شماره‌گذاری, مانند یک dictionary دسترسی پیدا کنیم: + +```py +raw_train_dataset = raw_datasets["train"] +raw_train_dataset[0] +``` + +```python out +{'idx': 0, + 'label': 1, + 'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', + 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} +``` + +می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه‌داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. + +```py +raw_train_dataset.features +``` + +```python out +{'sentence1': Value(dtype='string', id=None), + 'sentence2': Value(dtype='string', id=None), + 'label': ClassLabel(num_classes=2, names=['not_equivalent', 'equivalent'], names_file=None, id=None), + 'idx': Value(dtype='int32', id=None)} +``` + +در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent`، و `1` مربوط به `equivalent` می‌باشد،. + + +✏️ **امتحان کنید!** عنصر شماره ۱۵ از داده training و عنصر شماره ۸۷ از داده validation را مشاهده کنید. برچسبهای آنها چیست؟ + + +### پیش‌پردازشِ یک مجموعه‌داده + +{#if fw === 'pt'} + +{:else} + +{/if} + +به منظور پیش‌پردازش مجموعه‌داده، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: + +```py +from transformers import AutoTokenizer + +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +tokenized_sentences_1 = tokenizer(raw_datasets["train"]["sentence1"]) +tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) +``` + +با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده سازی کند: + +```py +inputs = tokenizer("This is the first sentence.", "This is the second one.") +inputs +``` + +```python out +{ + 'input_ids': [101, 2023, 2003, 1996, 2034, 6251, 1012, 102, 2023, 2003, 1996, 2117, 2028, 1012, 102], + 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], + 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +} +``` + +در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی، جمله اول و کدام بخش جمله دوم است. + + + +✏️ **امتحان کنید!** عنصر شماره ۱۵ داده را بردارید و دو جمله را به صورت جداگانه و جفت توکنایز کنید. تفاوت دو نتیجه چیست؟ + + + +اگر آیدی‌های داخل `input_ids` را به کلمات رمزگشایی کنیم: + +```py +tokenizer.convert_ids_to_tokens(inputs["input_ids"]) +``` + +خواهیم داشت: + +we will get: + +```python out +['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] +``` + +بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. + +```python out +['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] +[ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] +``` + +همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند آیدی نشاندهنده نوع توکِن آنها `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند آیدی نشاندهنده نوع توکِن‌شان `1` می‌باشد. + +توجه داشته باشید که اگر چکپوینت متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. + +در اینجا، مدل BERT با آیدی‌هایی که نشاندهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبانِ ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ برعهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. + + در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالتها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. + +در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکنایز شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکنایزر می‌داند چه چیزی برای مدل فراهم کند. + +اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل مجموعه‌داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ مجموعه‌داده‌ی training اینگونه می‌باشد: + +```py +tokenized_dataset = tokenizer( + raw_datasets["train"]["sentence1"], + raw_datasets["train"]["sentence2"], + padding=True, + truncation=True, +) +``` +این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل مجموعه‌داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه‌داده‌های موجود در پایگاه مجموعه‌داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه می‌دارید). + +به منظور نگه داشتن داده به صورت یک مجموعه‌داده، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه‌داده عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکنایز کند: + +```py +def tokenize_function(example): + return tokenizer(example["sentence1"], example["sentence2"], truncation=True) +``` + +این تابع یک دیکشنری (مثل اقلام داخل مجموعه‌داده) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. این توکنایزر با توکنایزری در کتابخانه [🤗 Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. + +توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر مجموعه‌داده. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. + +در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل مجموعه‌داده به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از مجموعه‌داده ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریعتر انجام گیرد: + +```py +tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) +tokenized_datasets +``` +روشی که کتابخانه مجموعه‌داده 🤗 این پیش‌پردازش را اعمال می‌کند، با افزودن -فیلدهای- جدید به مجموعه‌داده‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، می‌باشد:، + +```python out +DatasetDict({ + train: Dataset({ + features: ['attention_mask', 'idx', 'input_ids', 'label', 'sentence1', 'sentence2', 'token_type_ids'], + num_rows: 3668 + }) + validation: Dataset({ + features: ['attention_mask', 'idx', 'input_ids', 'label', 'sentence1', 'sentence2', 'token_type_ids'], + num_rows: 408 + }) + test: Dataset({ + features: ['attention_mask', 'idx', 'input_ids', 'label', 'sentence1', 'sentence2', 'token_type_ids'], + num_rows: 1725 + }) +}) +``` + +شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `()map` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایزر سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. + + +تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخش‌های مجموعه‌داده افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در مجموعه‌داده که تابع `()map` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. + +آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. + + +### هم‌طول‌سازی پویا + +### Dynamic padding + + + +{#if fw === 'pt'} + +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU ها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. + +{:else} + +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. collator پیش فرض تابعی است که فقط نمونه‌های شما را به tf.Tensor تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. + +{/if} + +برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های مجموعه‌داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند، و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: + +{#if fw === 'pt'} +```py +from transformers import DataCollatorWithPadding + +data_collator = DataCollatorWithPadding(tokenizer=tokenizer) +``` +{:else} +```py +from transformers import DataCollatorWithPadding + +data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") +``` +{/if} + +اجازه دهید چند نمونه از مجموعه training مان، که می‌خواهیم باهم بَتچ کنیم، برداریم تا این ابزار جدید را امتحان کنیم. در اینجا سطون‌های `idx`، `sentence1`، و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: + +```py +samples = tokenized_datasets["train"][:8] +samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "sentence2"]} +[len(x) for x in samples["input_ids"]] +``` + +```python out +[50, 59, 47, 67, 59, 50, 62, 32] +``` + +تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل مجموعه‌داده باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: + +```py +batch = data_collator(samples) +{k: v.shape for k, v in batch.items()} +``` + +{#if fw === 'tf'} + +```python out +{'attention_mask': TensorShape([8, 67]), + 'input_ids': TensorShape([8, 67]), + 'token_type_ids': TensorShape([8, 67]), + 'labels': TensorShape([8])} +``` + +{:else} + +```python out +{'attention_mask': torch.Size([8, 67]), + 'input_ids': torch.Size([8, 67]), + 'token_type_ids': torch.Size([8, 67]), + 'labels': torch.Size([8])} +``` + +به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل مان می‌تواند با آنها کار کند، آماده هستیم برای انجام بازتنظیم مدل: + +{/if} + + + +✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی مجموعه‌داده GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. + + + +{#if fw === 'tf'} + +توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک مجموعه‌داده 🤗 را به سرعت به فرمت آماده برای آموزش تبدیل کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! + +```py +tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=True, + collate_fn=data_collator, + batch_size=8, +) + +tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=False, + collate_fn=data_collator, + batch_size=8, +) +``` + +این هم از این! حالا می‌توانیم این مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. + +{/if} diff --git a/chapters/fa/chapter3/4.mdx b/chapters/fa/chapter3/4.mdx deleted file mode 100644 index 54563ea7c..000000000 --- a/chapters/fa/chapter3/4.mdx +++ /dev/null @@ -1,359 +0,0 @@ -# A full training - - - - - -Now we'll see how to achieve the same results as we did in the last section without using the `Trainer` class. Again, we assume you have done the data processing in section 2. Here is a short summary covering everything you will need: - -```py -from datasets import load_dataset -from transformers import AutoTokenizer, DataCollatorWithPadding - -raw_datasets = load_dataset("glue", "mrpc") -checkpoint = "bert-base-uncased" -tokenizer = AutoTokenizer.from_pretrained(checkpoint) - - -def tokenize_function(example): - return tokenizer(example["sentence1"], example["sentence2"], truncation=True) - - -tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) -data_collator = DataCollatorWithPadding(tokenizer=tokenizer) -``` - -### Prepare for training - -Before actually writing our training loop, we will need to define a few objects. The first ones are the dataloaders we will use to iterate over batches. But before we can define those dataloaders, we need to apply a bit of postprocessing to our `tokenized_datasets`, to take care of some things that the `Trainer` did for us automatically. Specifically, we need to: - -- Remove the columns corresponding to values the model does not expect (like the `sentence1` and `sentence2` columns). -- Rename the column `label` to `labels` (because the model expects the argument to be named `labels`). -- Set the format of the datasets so they return PyTorch tensors instead of lists. - -Our `tokenized_datasets` has one method for each of those steps: - -```py -tokenized_datasets = tokenized_datasets.remove_columns(["sentence1", "sentence2", "idx"]) -tokenized_datasets = tokenized_datasets.rename_column("label", "labels") -tokenized_datasets.set_format("torch") -tokenized_datasets["train"].column_names -``` - -We can then check that the result only has columns that our model will accept: - -```python -["attention_mask", "input_ids", "labels", "token_type_ids"] -``` - -Now that this is done, we can easily define our dataloaders: - -```py -from torch.utils.data import DataLoader - -train_dataloader = DataLoader( - tokenized_datasets["train"], shuffle=True, batch_size=8, collate_fn=data_collator -) -eval_dataloader = DataLoader( - tokenized_datasets["validation"], batch_size=8, collate_fn=data_collator -) -``` - -To quickly check there is no mistake in the data processing, we can inspect a batch like this: - -```py -for batch in train_dataloader: - break -{k: v.shape for k, v in batch.items()} -``` - -```python out -{'attention_mask': torch.Size([8, 65]), - 'input_ids': torch.Size([8, 65]), - 'labels': torch.Size([8]), - 'token_type_ids': torch.Size([8, 65])} -``` - -Note that the actual shapes will probably be slightly different for you since we set `shuffle=True` for the training dataloader and we are padding to the maximum length inside the batch. - -Now that we're completely finished with data preprocessing (a satisfying yet elusive goal for any ML practitioner), let's turn to the model. We instantiate it exactly as we did in the previous section: - -```py -from transformers import AutoModelForSequenceClassification - -model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) -``` - -To make sure that everything will go smoothly during training, we pass our batch to this model: - -```py -outputs = model(**batch) -print(outputs.loss, outputs.logits.shape) -``` - -```python out -tensor(0.5441, grad_fn=) torch.Size([8, 2]) -``` - -All 🤗 Transformers models will return the loss when `labels` are provided, and we also get the logits (two for each input in our batch, so a tensor of size 8 x 2). - -We're almost ready to write our training loop! We're just missing two things: an optimizer and a learning rate scheduler. Since we are trying to replicate what the `Trainer` was doing by hand, we will use the same defaults. The optimizer used by the `Trainer` is `AdamW`, which is the same as Adam, but with a twist for weight decay regularization (see ["Decoupled Weight Decay Regularization"](https://arxiv.org/abs/1711.05101) by Ilya Loshchilov and Frank Hutter): - -```py -from transformers import AdamW - -optimizer = AdamW(model.parameters(), lr=5e-5) -``` - -Finally, the learning rate scheduler used by default is just a linear decay from the maximum value (5e-5) to 0. To properly define it, we need to know the number of training steps we will take, which is the number of epochs we want to run multiplied by the number of training batches (which is the length of our training dataloader). The `Trainer` uses three epochs by default, so we will follow that: - -```py -from transformers import get_scheduler - -num_epochs = 3 -num_training_steps = num_epochs * len(train_dataloader) -lr_scheduler = get_scheduler( - "linear", - optimizer=optimizer, - num_warmup_steps=0, - num_training_steps=num_training_steps, -) -print(num_training_steps) -``` - -```python out -1377 -``` - -### The training loop - -One last thing: we will want to use the GPU if we have access to one (on a CPU, training might take several hours instead of a couple of minutes). To do this, we define a `device` we will put our model and our batches on: - -```py -import torch - -device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") -model.to(device) -device -``` - -```python out -device(type='cuda') -``` - -We are now ready to train! To get some sense of when training will be finished, we add a progress bar over our number of training steps, using the `tqdm` library: - -```py -from tqdm.auto import tqdm - -progress_bar = tqdm(range(num_training_steps)) - -model.train() -for epoch in range(num_epochs): - for batch in train_dataloader: - batch = {k: v.to(device) for k, v in batch.items()} - outputs = model(**batch) - loss = outputs.loss - loss.backward() - - optimizer.step() - lr_scheduler.step() - optimizer.zero_grad() - progress_bar.update(1) -``` - -You can see that the core of the training loop looks a lot like the one in the introduction. We didn't ask for any reporting, so this training loop will not tell us anything about how the model fares. We need to add an evaluation loop for that. - - -### The evaluation loop - -As we did earlier, we will use a metric provided by the 🤗 Datasets library. We've already seen the `metric.compute()` method, but metrics can actually accumulate batches for us as we go over the prediction loop with the method `add_batch()`. Once we have accumulated all the batches, we can get the final result with `metric.compute()`. Here's how to implement all of this in an evaluation loop: - -```py -from datasets import load_metric - -metric = load_metric("glue", "mrpc") -model.eval() -for batch in eval_dataloader: - batch = {k: v.to(device) for k, v in batch.items()} - with torch.no_grad(): - outputs = model(**batch) - - logits = outputs.logits - predictions = torch.argmax(logits, dim=-1) - metric.add_batch(predictions=predictions, references=batch["labels"]) - -metric.compute() -``` - -```python out -{'accuracy': 0.8431372549019608, 'f1': 0.8907849829351535} -``` - -Again, your results will be slightly different because of the randomness in the model head initialization and the data shuffling, but they should be in the same ballpark. - - - -✏️ **Try it out!** Modify the previous training loop to fine-tune your model on the SST-2 dataset. - - - -### Supercharge your training loop with 🤗 Accelerate - - - -The training loop we defined earlier works fine on a single CPU or GPU. But using the [🤗 Accelerate](https://github.com/huggingface/accelerate) library, with just a few adjustments we can enable distributed training on multiple GPUs or TPUs. Starting from the creation of the training and validation dataloaders, here is what our manual training loop looks like: - -```py -from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler - -model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) -optimizer = AdamW(model.parameters(), lr=3e-5) - -device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") -model.to(device) - -num_epochs = 3 -num_training_steps = num_epochs * len(train_dataloader) -lr_scheduler = get_scheduler( - "linear", - optimizer=optimizer, - num_warmup_steps=0, - num_training_steps=num_training_steps, -) - -progress_bar = tqdm(range(num_training_steps)) - -model.train() -for epoch in range(num_epochs): - for batch in train_dataloader: - batch = {k: v.to(device) for k, v in batch.items()} - outputs = model(**batch) - loss = outputs.loss - loss.backward() - - optimizer.step() - lr_scheduler.step() - optimizer.zero_grad() - progress_bar.update(1) -``` - -And here are the changes: - -```diff -+ from accelerate import Accelerator - from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler - -+ accelerator = Accelerator() - - model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) - optimizer = AdamW(model.parameters(), lr=3e-5) - -- device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") -- model.to(device) - -+ train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare( -+ train_dataloader, eval_dataloader, model, optimizer -+ ) - - num_epochs = 3 - num_training_steps = num_epochs * len(train_dataloader) - lr_scheduler = get_scheduler( - "linear", - optimizer=optimizer, - num_warmup_steps=0, - num_training_steps=num_training_steps - ) - - progress_bar = tqdm(range(num_training_steps)) - - model.train() - for epoch in range(num_epochs): - for batch in train_dataloader: -- batch = {k: v.to(device) for k, v in batch.items()} - outputs = model(**batch) - loss = outputs.loss -- loss.backward() -+ accelerator.backward(loss) - - optimizer.step() - lr_scheduler.step() - optimizer.zero_grad() - progress_bar.update(1) -``` - -The first line to add is the import line. The second line instantiates an `Accelerator` object that will look at the environment and initialize the proper distributed setup. 🤗 Accelerate handles the device placement for you, so you can remove the lines that put the model on the device (or, if you prefer, change them to use `accelerator.device` instead of `device`). - -Then the main bulk of the work is done in the line that sends the dataloaders, the model, and the optimizer to `accelerator.prepare()`. This will wrap those objects in the proper container to make sure your distributed training works as intended. The remaining changes to make are removing the line that puts the batch on the `device` (again, if you want to keep this you can just change it to use `accelerator.device`) and replacing `loss.backward()` with `accelerator.backward(loss)`. - - -⚠️ In order to benefit from the speed-up offered by Cloud TPUs, we recommend padding your samples to a fixed length with the `padding="max_length"` and `max_length` arguments of the tokenizer. - - -If you'd like to copy and paste it to play around, here's what the complete training loop looks like with 🤗 Accelerate: - -```py -from accelerate import Accelerator -from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler - -accelerator = Accelerator() - -model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) -optimizer = AdamW(model.parameters(), lr=3e-5) - -train_dl, eval_dl, model, optimizer = accelerator.prepare( - train_dataloader, eval_dataloader, model, optimizer -) - -num_epochs = 3 -num_training_steps = num_epochs * len(train_dl) -lr_scheduler = get_scheduler( - "linear", - optimizer=optimizer, - num_warmup_steps=0, - num_training_steps=num_training_steps, -) - -progress_bar = tqdm(range(num_training_steps)) - -model.train() -for epoch in range(num_epochs): - for batch in train_dl: - outputs = model(**batch) - loss = outputs.loss - accelerator.backward(loss) - - optimizer.step() - lr_scheduler.step() - optimizer.zero_grad() - progress_bar.update(1) -``` - -Putting this in a `train.py` script will make that script runnable on any kind of distributed setup. To try it out in your distributed setup, run the command: - -```bash -accelerate config -``` - -which will prompt you to answer a few questions and dump your answers in a configuration file used by this command: - -``` -accelerate launch train.py -``` - -which will launch the distributed training. - -If you want to try this in a Notebook (for instance, to test it with TPUs on Colab), just paste the code in a `training_function()` and run a last cell with: - -```python -from accelerate import notebook_launcher - -notebook_launcher(training_function) -``` - -You can find more examples in the [🤗 Accelerate repo](https://github.com/huggingface/accelerate/tree/main/examples). diff --git a/chapters/fa/chapter3/5.mdx b/chapters/fa/chapter3/5.mdx deleted file mode 100644 index dda8cb7fe..000000000 --- a/chapters/fa/chapter3/5.mdx +++ /dev/null @@ -1,20 +0,0 @@ - - -# Fine-tuning, Check! - -That was fun! In the first two chapters you learned about models and tokenizers, and now you know how to fine-tune them for your own data. To recap, in this chapter you: - -{#if fw === 'pt'} -* Learned about datasets in the [Hub](https://huggingface.co/datasets) -* Learned how to load and preprocess datasets, including using dynamic padding and collators -* Implemented your own fine-tuning and evaluation of a model -* Implemented a lower-level training loop -* Used 🤗 Accelerate to easily adapt your training loop so it works for multiple GPUs or TPUs - -{:else} -* Learned about datasets in the [Hub](https://huggingface.co/datasets) -* Learned how to load and preprocess datasets -* Learned how to fine-tune and evaluate a model with Keras -* Implemented a custom metric - -{/if} diff --git a/chapters/fa/chapter3/6.mdx b/chapters/fa/chapter3/6.mdx deleted file mode 100644 index 94d02da24..000000000 --- a/chapters/fa/chapter3/6.mdx +++ /dev/null @@ -1,296 +0,0 @@ - - - - -# End-of-chapter quiz - -Test what you learned in this chapter! - -### 1. The `emotion` dataset contains Twitter messages labeled with emotions. Search for it in the [Hub](https://huggingface.co/datasets), and read the dataset card. Which of these is not one of its basic emotions? - - - -### 2. Search for the `ar_sarcasm` dataset in the [Hub](https://huggingface.co/datasets). Which task does it support? - -dataset card!" - }, - { - text: "Named entity recognition", - explain: "That's not it — take another look at the dataset card!" - }, - { - text: "Question answering", - explain: "Alas, this question was not answered correctly. Try again!" - } - ]} -/> - -### 3. How does the BERT model expect a pair of sentences to be processed? - -[SEP] special token is needed to separate the two sentences, but that's not the only thing!" - }, - { - text: "[CLS] Tokens_of_sentence_1 Tokens_of_sentence_2", - explain: "A [CLS] special token is required at the beginning, but that's not the only thing!" - }, - { - text: "[CLS] Tokens_of_sentence_1 [SEP] Tokens_of_sentence_2 [SEP]", - explain: "That's correct!", - correct: true - }, - { - text: "[CLS] Tokens_of_sentence_1 [SEP] Tokens_of_sentence_2", - explain: "A [CLS] special token is needed at the beginning as well as a [SEP] special token to separate the two sentences, but that's not all!" - } - ]} -/> - -{#if fw === 'pt'} -### 4. What are the benefits of the `Dataset.map()` method? - - - -### 5. What does dynamic padding mean? - - - -### 6. What is the purpose of a collate function? - -DataCollatorWithPadding specifically." - }, - { - text: "It puts together all the samples in a batch.", - explain: "Correct! You can pass the collate function as an argument of a DataLoader. We used the DataCollatorWithPadding function, which pads all items in a batch so they have the same length.", - correct: true - }, - { - text: "It preprocesses the whole dataset.", - explain: "That would be a preprocessing function, not a collate function." - }, - { - text: "It truncates the sequences in the dataset.", - explain: "A collate function is involved in handling individual batches, not the whole dataset. If you're interested in truncating, you can use the truncate argument of tokenizer." - } - ]} -/> - -### 7. What happens when you instantiate one of the `AutoModelForXxx` classes with a pretrained language model (such as `bert-base-uncased`) that corresponds to a different task than the one for which it was trained? - -AutoModelForSequenceClassification with bert-base-uncased, we got warnings when instantiating the model. The pretrained head is not used for the sequence classification task, so it's discarded and a new head is instantiated with random weights.", - correct: true - }, - { - text: "The head of the pretrained model is discarded.", - explain: "Something else needs to happen. Try again!" - }, - { - text: "Nothing, since the model can still be fine-tuned for the different task.", - explain: "The head of the pretrained model was not trained to solve this task, so we should discard the head!" - } - ]} -/> - -### 8. What's the purpose of `TrainingArguments`? - -Trainer.", - explain: "Correct!", - correct: true - }, - { - text: "It specifies the size of the model.", - explain: "The model size is defined by the model configuration, not the class TrainingArguments." - }, - { - text: "It just contains the hyperparameters used for evaluation.", - explain: "In the example, we specified where the model and its checkpoints will be saved. Try again!" - }, - { - text: "It just contains the hyperparameters used for training.", - explain: "In the example, we used an evaluation_strategy as well, so this impacts evaluation. Try again!" - } - ]} -/> - -### 9. Why should you use the 🤗 Accelerate library? - -Trainer, not the 🤗 Accelerate library. Try again!" - }, - { - text: "It makes our training loops work on distributed strategies", - explain: "Correct! With 🤗 Accelerate, your training loops will work for multiple GPUs and TPUs.", - correct: true - }, - { - text: "It provides more optimization functions.", - explain: "No, the 🤗 Accelerate library does not provide any optimization functions." - } - ]} -/> - -{:else} -### 4. What happens when you instantiate one of the `TFAutoModelForXxx` classes with a pretrained language model (such as `bert-base-uncased`) that corresponds to a different task than the one for which it was trained? - -TFAutoModelForSequenceClassification with bert-base-uncased, we got warnings when instantiating the model. The pretrained head is not used for the sequence classification task, so it's discarded and a new head is instantiated with random weights.", - correct: true - }, - { - text: "The head of the pretrained model is discarded.", - explain: "Something else needs to happen. Try again!" - }, - { - text: "Nothing, since the model can still be fine-tuned for the different task.", - explain: "The head of the pretrained model was not trained to solve this task, so we should discard the head!" - } - ]} -/> - -### 5. The TensorFlow models from `transformers` are already Keras models. What benefit does this offer? - -TPUStrategy scope, including the initialization of the model." - }, - { - text: "You can leverage existing methods such as compile(), fit(), and predict().", - explain: "Correct! Once you have the data, training on it requires very little work.", - correct: true - }, - { - text: "You get to learn Keras as well as transformers.", - explain: "Correct, but we're looking for something else :)", - correct: true - }, - { - text: "You can easily compute metrics related to the dataset.", - explain: "Keras helps us with training and evaluating the model, not computing dataset-related metrics." - } - ]} -/> - -### 6. How can you define your own custom metric? - -tf.keras.metrics.Metric.", - explain: "Great!", - correct: true - }, - { - text: "Using the Keras functional API.", - explain: "Try again!" - }, - { - text: "By using a callable with signature metric_fn(y_true, y_pred).", - explain: "Correct!", - correct: true - }, - { - text: "By Googling it.", - explain: "That's not the answer we're looking for, but it should help you find it.", - correct: true - } - ]} -/> - -{/if} \ No newline at end of file From 2847e0c39fd9e8973e77d030eba210393052ecf2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 1 May 2022 07:51:39 +0200 Subject: [PATCH 099/254] new file added --- chapters/fa/chapter3/3_tf.mdx | 205 ++++++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 chapters/fa/chapter3/3_tf.mdx diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx new file mode 100644 index 000000000..a6d0f70bb --- /dev/null +++ b/chapters/fa/chapter3/3_tf.mdx @@ -0,0 +1,205 @@ + + +# باز‌تنظیم یک مدل با استفاده از کِراس + +# Fine-tuning a model with Keras + + + +وقتی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا آموزشِ مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر تنظیمات GPU ندارید، می‌توانید به GPUها یا TPUها مجانی روی [Google Colab](https://colab.research.google.com/) دسترسی داشته باشید. + +Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). + +نمونه کدِ‌های زیر فرض می‌کنند شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه جهت یادآوری آنچه نیاز دارید: + +The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: + +```py +from datasets import load_dataset +from transformers import AutoTokenizer, DataCollatorWithPadding +import numpy as np + +raw_datasets = load_dataset("glue", "mrpc") +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) + + +def tokenize_function(example): + return tokenizer(example["sentence1"], example["sentence2"], truncation=True) + + +tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) + +data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") + +tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=True, + collate_fn=data_collator, + batch_size=8, +) + +tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=False, + collate_fn=data_collator, + batch_size=8, +) +``` + +### Training + +TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. + + + +That means that once we have our data, very little work is required to begin training on it. + + + +As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: + +```py +from transformers import TFAutoModelForSequenceClassification + +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +``` + +You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. + +To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. + + + +Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. + + + +```py +from tensorflow.keras.losses import SparseCategoricalCrossentropy + +model.compile( + optimizer="adam", + loss=SparseCategoricalCrossentropy(from_logits=True), + metrics=["accuracy"], +) +model.fit( + tf_train_dataset, + validation_data=tf_validation_dataset, +) +``` + + + +Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. + + + + +### Improving training performance + + + +If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause +is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes +that optimizer with default values for all parameters, including learning rate. From long experience, though, we know +that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written +as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. + +In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate +over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* +the learning rate. In Keras, the best way to do this is to use a *learning rate scheduler*. A good one to use is +`PolynomialDecay` — despite the name, with default settings it simply linearly decays the learning rate from the initial +value to the final value over the course of training, which is exactly what we want. In order to use a scheduler correctly, +though, we need to tell it how long training is going to be. We compute that as `num_train_steps` below. + +```py +from tensorflow.keras.optimizers.schedules import PolynomialDecay + +batch_size = 8 +num_epochs = 3 +# The number of training steps is the number of samples in the dataset, divided by the batch size then multiplied +# by the total number of epochs. Note that the tf_train_dataset here is a batched tf.data.Dataset, +# not the original Hugging Face Dataset, so its len() is already num_samples // batch_size. +num_train_steps = len(tf_train_dataset) * num_epochs +lr_scheduler = PolynomialDecay( + initial_learning_rate=5e-5, end_learning_rate=0.0, decay_steps=num_train_steps +) +from tensorflow.keras.optimizers import Adam + +opt = Adam(learning_rate=lr_scheduler) +``` + + + +The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. + + + +Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: + +```py +import tensorflow as tf + +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) +model.compile(optimizer=opt, loss=loss, metrics=["accuracy"]) +``` + +Now, we fit again: + +```py +model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) +``` + + + +💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) + + + +### Model predictions + + + + +Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. + +```py +preds = model.predict(tf_validation_dataset)["logits"] +``` + +We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: + +```py +class_preds = np.argmax(preds, axis=1) +print(preds.shape, class_preds.shape) +``` + +```python out +(408, 2) (408,) +``` + +Now, let's use those `preds` to compute some metrics! We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: + +```py +from datasets import load_metric + +metric = load_metric("glue", "mrpc") +metric.compute(predictions=class_preds, references=raw_datasets["validation"]["label"]) +``` + +```python out +{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} +``` + +The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. + +This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in Chapter 7. If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. From 86af017ce8e3a97a2499ce87ac167e3024c2edc8 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 1 May 2022 08:10:39 +0200 Subject: [PATCH 100/254] multiple new paragraph added to the translation --- chapters/fa/chapter3/3_tf.mdx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index a6d0f70bb..bd943fd2e 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -54,16 +54,24 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` +### آموزش + ### Training +مدل‌های تِنسورفلو که از ترَنسفورمِرهای 🤗 وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. + TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. +آن به این معنی است که به محض اینکه در اختیار داشته باشیم، کار خیلی کمی لازم است تا آموزش را روی آن شروع کنیم. + That means that once we have our data, very little work is required to begin training on it. +مانند [previous chapter](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب استفاده خواهیم کرد: + As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: ```py From e01d74c356516b1a0c0b102e3b419a7114f16dcc Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 1 May 2022 08:14:47 +0200 Subject: [PATCH 101/254] minor update --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index bd943fd2e..df60da40a 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -64,7 +64,7 @@ TensorFlow models imported from 🤗 Transformers are already Keras models. Here -آن به این معنی است که به محض اینکه در اختیار داشته باشیم، کار خیلی کمی لازم است تا آموزش را روی آن شروع کنیم. +آن به این معنی است که به محض اینکه داده‌مان در اختیار بگیریم، کار خیلی کمی لازم است تا آموزش را روی آن شروع کنیم. That means that once we have our data, very little work is required to begin training on it. From e8cbf4a2cbec6a8576df46ccb2ee9e6eca5c2efd Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 3 May 2022 10:04:37 +0200 Subject: [PATCH 102/254] new paragraphs added. --- chapters/fa/chapter3/3_tf.mdx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index df60da40a..e85917338 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -64,13 +64,13 @@ TensorFlow models imported from 🤗 Transformers are already Keras models. Here -آن به این معنی است که به محض اینکه داده‌مان در اختیار بگیریم، کار خیلی کمی لازم است تا آموزش را روی آن شروع کنیم. +آن به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار خیلی کمی لازم است تا آموزش را روی آن شروع کنیم. That means that once we have our data, very little work is required to begin training on it. -مانند [previous chapter](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب استفاده خواهیم کرد: +مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب استفاده خواهیم کرد: As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: @@ -80,12 +80,18 @@ from transformers import TFAutoModelForSequenceClassification model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) ``` +شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از نمونه‌سازیِ این مدل پیش‌تعلیم شما یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی جفت جمله‌ها پیش‌تعلیم نشده، بنابراین لایه-سر مدل پیش‌تعلیم حذف شده و یک لایه-سر مناسب جهت دسته بندی رشته‌‌ای به جای آن اضافه شده. هشدارها نشان می‌دهند که برخی از وزنها استفاده نشده‌اند (آنهایی که مربوط به لایه-سر جدید هستند) و برخی دیگر به صورت تصادفی مقدار‌دهی شده‌ند. (آنهایی که مربوط به لایه-سر پیش‌تعلیم حذف شده هستند). در نتیجه این شما را تشویق به آموزش مدل می‌کند، که دقیقا همان چیزی است که می‌خواهیم اکنون انجام دهیم. + You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. +برای باز‌تنظیم مدل روی مجموعه‌داده مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند باز‌تنظیم را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای آموزش را گزارش دهد، بعلاوه‌ی خطای تایید در انتهای هر epoch. + To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. +توجه داشته باشید که مدل‌های ترَنسفورمِر 🤗 قابلیت ویژه‌ای دارند که بسیاری از مدل‌های Keras ندارند - آنها به صورت خودکار یک تابع خطای مناسب استفاده می‌کنند که آنرا به صورت داخلی محاسبه می‌کنند. اگر آرگومانی برای تابع خطا در زمان `compile()` تعیین نکنید آنها از این تابع خطا به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع خطای داخلی شما نیاز خواهید داشت که برچسب‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب مجزا، که روش معمول استفاده از برچسب‌ها در مدل‌های Keras می‌باشد. شما مثال‌هایی از این را در بخش ۲ این آموزش خواهید دید، جایی که تعیین تابع خطای درست می‌تواند تا اندازه‌ای گول‌زننده باشد. به هر حال، برای دسته‌بندی رشته‌‌ای، یک تابع خطای استانداد Keras به خوبی کار می‌کند، بنابراین آن چیزی است که ما در اینجا استفاده خواهیم کرد. + Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. From bc24213a642611042a3ed191d622201638eb3f33 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 4 May 2022 16:48:54 +0200 Subject: [PATCH 103/254] toc_tree updated --- chapters/fa/_toctree.yml | 10 ++++++++++ chapters/fa/chapter3/3_tf.mdx | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/chapters/fa/_toctree.yml b/chapters/fa/_toctree.yml index 179c9d87a..6a1b81a92 100644 --- a/chapters/fa/_toctree.yml +++ b/chapters/fa/_toctree.yml @@ -13,6 +13,16 @@ - local: chapter2/1 title: مقدمه +- title: 3. بازتنظیمِ یک مدل از پیش‌تعلیم دیده # Translate this! + sections: + - local: chapter3/1 + title: مقدمه # Translate this! + - local: chapter3/2 + title: پردازش داده # Translate this! + - local: chapter3/3 + title: باز‌تنظیم یک مدل با استفاده از Trainer-API یا کِراس # Translate this! + local_fw: { pt: chapter3/3, tf: chapter3/3_tf } + - title: واژه‌نامه sections: - local: glossary/1 diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index e85917338..f13f71740 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -116,7 +116,6 @@ Note a very common pitfall here — you *can* just pass the name of the loss as - ### Improving training performance From cca41c13ac6f7d2ed64c6555451c4b8d34e00055 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 15:10:49 +0200 Subject: [PATCH 104/254] rtl div added --- chapters/fa/chapter3/1.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 6cfa5d3ee..3869ae26f 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1,3 +1,4 @@ +
# مقدمه @@ -20,4 +21,6 @@ {/if} -جهت بارگذاری چکپوینت تعلیم دیده خود در هاب هاگینگ‌فیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) \ No newline at end of file +جهت بارگذاری چکپوینت تعلیم دیده خود در هاب هاگینگ‌فیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) + +
\ No newline at end of file From 7d0e787d13a71761dc79b3149eb8dd9332a9df96 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 15:12:22 +0200 Subject: [PATCH 105/254] rtl div added --- chapters/fa/chapter3/2.mdx | 3 +++ chapters/fa/chapter3/3_tf.mdx | 3 +++ 2 files changed, 6 insertions(+) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 5be25d104..f8d35c49a 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -1,3 +1,5 @@ +
+ # پردازش داده @@ -388,3 +390,4 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( این هم از این! حالا می‌توانیم این مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. {/if} +
\ No newline at end of file diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index f13f71740..77df31ef0 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -1,3 +1,4 @@ +
# باز‌تنظیم یک مدل با استفاده از کِراس @@ -216,3 +217,5 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in Chapter 7. If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. + +
\ No newline at end of file From b94b45719caa3013d5f5cb30ee124ec24cea4119 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 15:29:05 +0200 Subject: [PATCH 106/254] Applied reviews to chapters part 1 and 2. New phrases added to G --- chapters/fa/chapter3/1.mdx | 10 +++++----- chapters/fa/chapter3/2.mdx | 32 ++++++++++++++++---------------- chapters/fa/chapter3/3_tf.mdx | 2 +- chapters/fa/glossary/1.mdx | 2 ++ 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 3869ae26f..ce767c60b 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -3,18 +3,18 @@ # مقدمه -در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدل‌های پیش‌تعلیم را جهت انجام پیش‌بینی‌های جدید بررسی کردیم. اما چگونه می‌توانید یک مدل پیش‌تعلیم را خودتان بازتنظیم کنید؟ +در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدل‌های پیش‌تعلیم را جهت انجام پیش‌بینی‌های جدید بررسی کردیم. اما چگونه می‌توانید یک مدل از پیش‌ تعلیم دیده را خودتان بازتنظیم کنید؟ {#if fw === 'pt'} -* چگونه یک مجموعه‌داده بزرگ را از هاب تهیه کنید -* چگونه از API سطح بالای "Trainer" برای بازتنظیم مدل استفاده کنید +* چگونه یک دیتاسِت بزرگ را از هاب تهیه کنید +* چگونه از `API` سطح بالای `Trainer` برای کوک کردن مدل استفاده کنید * چگونه یک چرخه‌تعلیم دلخواه درست کنید -* چگونه از کتابخانه Accelerate 🤗 برای اجرای چرخه‌تعلیم دلخواه در هر تنظیمات غیر متمرکزی استفاده کنید +* چگونه از کتابخانه `Accelerate` 🤗 برای اجرای چرخه‌تعلیم دلخواه در هر تنظیمات غیر متمرکزی استفاده کنید {:else} -* چگونه یک مجموعه‌داده بزرگ را از هاب تهیه کنید +* چگونه یک دیتاسِت بزرگ را از هاب تهیه کنید * چگونه از کِراس برای بازتنظیم مدل استفاده کنید * چگونه از کِراس برای استخراج پیش بینی‌ها استفاده کنید * چگونه از یک متریک دلخواه استفاده کنید diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index f8d35c49a..e9b393752 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -138,7 +138,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` مجموعه‌داده‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. +می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` دیتاسِت‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. ```py raw_train_dataset.features @@ -157,7 +157,7 @@ raw_train_dataset.features ✏️ **امتحان کنید!** عنصر شماره ۱۵ از داده training و عنصر شماره ۸۷ از داده validation را مشاهده کنید. برچسبهای آنها چیست؟
-### پیش‌پردازشِ یک مجموعه‌داده +### پیش‌پردازشِ یک دیتاسِت {#if fw === 'pt'} @@ -165,7 +165,7 @@ raw_train_dataset.features {/if} -به منظور پیش‌پردازش مجموعه‌داده، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: +به منظور پیش‌پردازش دیتاسِت، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: ```py from transformers import AutoTokenizer @@ -230,7 +230,7 @@ we will get: در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکنایز شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکنایزر می‌داند چه چیزی برای مدل فراهم کند. -اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل مجموعه‌داده‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ مجموعه‌داده‌ی training اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل دیتاسِتمان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دیتاسِت training اینگونه می‌باشد: ```py tokenized_dataset = tokenizer( @@ -240,26 +240,26 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` -این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل مجموعه‌داده در حین توکنایز کردن داشته باشید (در حالی که مجموعه‌داده‌های موجود در پایگاه مجموعه‌داده‌‌ی 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه می‌دارید). +این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دیتاسِت در حین توکنایز کردن داشته باشید (در حالی که دیتاسِت‌های موجود در پایگاه دیتاسِت 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه می‌دارید). -به منظور نگه داشتن داده به صورت یک مجموعه‌داده، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر مجموعه‌داده عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکنایز کند: +به منظور نگه داشتن داده به صورت یک دیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر دیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکنایز کند: ```py def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` -این تابع یک دیکشنری (مثل اقلام داخل مجموعه‌داده) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. این توکنایزر با توکنایزری در کتابخانه [🤗 Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. +این تابع یک دیکشنری (مثل اقلام داخل دیتاسِت) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. این توکنایزر با توکنایزری در کتابخانه [🤗 Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. -توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر مجموعه‌داده. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. +توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. -در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل مجموعه‌داده به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از مجموعه‌داده ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریعتر انجام گیرد: +در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل دیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریعتر انجام گیرد: ```py tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` -روشی که کتابخانه مجموعه‌داده 🤗 این پیش‌پردازش را اعمال می‌کند، با افزودن -فیلدهای- جدید به مجموعه‌داده‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، می‌باشد:، +روشی که کتابخانه دیتاسِت 🤗 این پیش‌پردازش را اعمال می‌کند، با افزودن -فیلدهای- جدید به دیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، می‌باشد:، ```python out DatasetDict({ @@ -281,7 +281,7 @@ DatasetDict({ شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `()map` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایزر سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. -تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخش‌های مجموعه‌داده افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در مجموعه‌داده که تابع `()map` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. +تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخش‌های دیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دیتاسِت که تابع `()map` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. @@ -302,7 +302,7 @@ DatasetDict({ {/if} -برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های مجموعه‌داده‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند، و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند، و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} ```py @@ -330,7 +330,7 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se [50, 59, 47, 67, 59, 50, 62, 32] ``` -تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل مجموعه‌داده باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: +تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دیتاسِت باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: ```py batch = data_collator(samples) @@ -361,13 +361,13 @@ batch = data_collator(samples) -✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی مجموعه‌داده GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. +✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی دیتاسِت GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور مجموعه‌داده‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک مجموعه‌داده 🤗 را به سرعت به فرمت آماده برای آموزش تبدیل کند. اجازه دهید آنرا در عمل با مجموعه‌داده‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور دیتاسِت‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دیتاسِت 🤗 را به سرعت به فرمت آماده برای آموزش تبدیل کند. اجازه دهید آنرا در عمل با دیتاسِت‌مان مشاهده کنیم! ```py tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( @@ -387,7 +387,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` -این هم از این! حالا می‌توانیم این مجموعه‌داده‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. +این هم از این! حالا می‌توانیم این دیتاسِت‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. {/if} \ No newline at end of file diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 77df31ef0..0db366978 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -85,7 +85,7 @@ model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_lab You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -برای باز‌تنظیم مدل روی مجموعه‌داده مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند باز‌تنظیم را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای آموزش را گزارش دهد، بعلاوه‌ی خطای تایید در انتهای هر epoch. +برای کوک‌ کردن مدل روی دیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای آموزش را گزارش دهد، بعلاوه‌ی خطای تایید در انتهای هر epoch. To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. diff --git a/chapters/fa/glossary/1.mdx b/chapters/fa/glossary/1.mdx index 8587b671b..81979861d 100644 --- a/chapters/fa/glossary/1.mdx +++ b/chapters/fa/glossary/1.mdx @@ -54,6 +54,8 @@ | Script | اسکریپت‌ | | Feature | قابلیت | | Folder | پوشه | +|fine-tune|کوک کردن| +|dataset|دیتاسِت| معادل‌هایی که استفاده نمی‌کنیم: From d764628ee96bcf9eca1a5428aeba396407a2ab5b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 15:30:28 +0200 Subject: [PATCH 107/254] test remove rtl div --- chapters/fa/chapter3/1.mdx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index ce767c60b..340b8de5b 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1,9 +1,9 @@ -
+ # مقدمه -در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدل‌های پیش‌تعلیم را جهت انجام پیش‌بینی‌های جدید بررسی کردیم. اما چگونه می‌توانید یک مدل از پیش‌ تعلیم دیده را خودتان بازتنظیم کنید؟ +در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدل‌های پیش‌تعلیم را جهت انجام پیش‌بینی‌های جدید بررسی کردیم. اما چگونه می‌توانید یک مدل از پیش‌ تعلیم دیده را خودتان کوک‌ کردن کنید؟ {#if fw === 'pt'} @@ -15,7 +15,7 @@ {:else} * چگونه یک دیتاسِت بزرگ را از هاب تهیه کنید -* چگونه از کِراس برای بازتنظیم مدل استفاده کنید +* چگونه از کِراس برای کوک‌ کردن مدل استفاده کنید * چگونه از کِراس برای استخراج پیش بینی‌ها استفاده کنید * چگونه از یک متریک دلخواه استفاده کنید @@ -23,4 +23,3 @@ جهت بارگذاری چکپوینت تعلیم دیده خود در هاب هاگینگ‌فیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) -
\ No newline at end of file From 59a6274313947db36af6ec314d64be128a56c4aa Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 15:31:27 +0200 Subject: [PATCH 108/254] test remove rtl div --- chapters/fa/chapter3/1.mdx | 3 ++- chapters/fa/chapter3/2.mdx | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 340b8de5b..55406ebd7 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1,4 +1,4 @@ - +
# مقدمه @@ -23,3 +23,4 @@ جهت بارگذاری چکپوینت تعلیم دیده خود در هاب هاگینگ‌فیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) +
\ No newline at end of file diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index e9b393752..614c54dd9 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -1,4 +1,4 @@ -
+ @@ -355,7 +355,7 @@ batch = data_collator(samples) 'labels': torch.Size([8])} ``` -به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل مان می‌تواند با آنها کار کند، آماده هستیم برای انجام بازتنظیم مدل: +به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل مان می‌تواند با آنها کار کند، آماده هستیم برای انجام کوک‌ کردن مدل: {/if} @@ -390,4 +390,3 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( این هم از این! حالا می‌توانیم این دیتاسِت‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. {/if} -
\ No newline at end of file From 0349df6e50521bb1d8fb57aff8b41945cee655b2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 15:42:30 +0200 Subject: [PATCH 109/254] comment applies --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 614c54dd9..844654825 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -124,7 +124,7 @@ DatasetDict({ این دستور مجموعه‌داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. -ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از شماره‌گذاری, مانند یک dictionary دسترسی پیدا کنیم: +ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک dictionary دسترسی پیدا کنیم: ```py raw_train_dataset = raw_datasets["train"] @@ -138,7 +138,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌بینم که برچسبها از پیش مقادیر صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم تابع `features` دیتاسِت‌مان `raw_train_dataset`‌ را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. +می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. ```py raw_train_dataset.features From 8bdfb66d9c19b3974c8e79b9aa325563ed94a3f0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 15:55:36 +0200 Subject: [PATCH 110/254] all comment applied --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 844654825..efe4edc0e 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -138,7 +138,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این تابع نوع هر سطون را به ما خواهد گفت. +می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر سطون را به ما خواهد گفت. ```py raw_train_dataset.features From f651342d62f98414c7c15d11803a05369757772b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 19:46:18 +0200 Subject: [PATCH 111/254] comments applies --- chapters/fa/chapter3/1.mdx | 12 ++++++------ chapters/fa/chapter3/3_tf.mdx | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 55406ebd7..140a34482 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -3,24 +3,24 @@ # مقدمه -در [فصل ۲](/course/chapter2) نحوه استفاده از توکنایزرها و مدل‌های پیش‌تعلیم را جهت انجام پیش‌بینی‌های جدید بررسی کردیم. اما چگونه می‌توانید یک مدل از پیش‌ تعلیم دیده را خودتان کوک‌ کردن کنید؟ +در [فصل ۲](/course/chapter2) نحوه استفاده از توکِنایزرها و مدل‌های از پیش تعلیم دیده را جهت انجام پیش‌بینی‌های جدید بررسی کردیم. اما چگونه می‌توانید یک مدل از پیش‌ تعلیم دیده را خودتان کوک‌ کنید؟ {#if fw === 'pt'} * چگونه یک دیتاسِت بزرگ را از هاب تهیه کنید * چگونه از `API` سطح بالای `Trainer` برای کوک کردن مدل استفاده کنید -* چگونه یک چرخه‌تعلیم دلخواه درست کنید -* چگونه از کتابخانه `Accelerate` 🤗 برای اجرای چرخه‌تعلیم دلخواه در هر تنظیمات غیر متمرکزی استفاده کنید +* چگونه یک چرخه‌ تعلیم دلخواه درست کنید +* چگونه از کتابخانه `Accelerate` هاگینگ‌فِیس برای اجرای چرخه‌ تعلیم دلخواه در هر نوع تنظیمات غیر متمرکزی استفاده کنید {:else} * چگونه یک دیتاسِت بزرگ را از هاب تهیه کنید * چگونه از کِراس برای کوک‌ کردن مدل استفاده کنید -* چگونه از کِراس برای استخراج پیش بینی‌ها استفاده کنید -* چگونه از یک متریک دلخواه استفاده کنید +* چگونه از کِراس برای استخراج پیش‌بینی‌ها استفاده کنید +* چگونه از یک مِتریک دلخواه استفاده کنید {/if} -جهت بارگذاری چکپوینت تعلیم دیده خود در هاب هاگینگ‌فیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) +جهت بارگذاری چکپوینت تعلیم دیده خود در هاب هاگینگ‌فِیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) \ No newline at end of file diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 0db366978..5adede6a0 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -59,7 +59,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ### Training -مدل‌های تِنسورفلو که از ترَنسفورمِرهای 🤗 وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. +مدل‌های تِنسورفلو که از ترَنسفورمِرهای هاگینگ‌فِیس وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. @@ -91,7 +91,7 @@ To fine-tune the model on our dataset, we just have to `compile()` our model and -توجه داشته باشید که مدل‌های ترَنسفورمِر 🤗 قابلیت ویژه‌ای دارند که بسیاری از مدل‌های Keras ندارند - آنها به صورت خودکار یک تابع خطای مناسب استفاده می‌کنند که آنرا به صورت داخلی محاسبه می‌کنند. اگر آرگومانی برای تابع خطا در زمان `compile()` تعیین نکنید آنها از این تابع خطا به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع خطای داخلی شما نیاز خواهید داشت که برچسب‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب مجزا، که روش معمول استفاده از برچسب‌ها در مدل‌های Keras می‌باشد. شما مثال‌هایی از این را در بخش ۲ این آموزش خواهید دید، جایی که تعیین تابع خطای درست می‌تواند تا اندازه‌ای گول‌زننده باشد. به هر حال، برای دسته‌بندی رشته‌‌ای، یک تابع خطای استانداد Keras به خوبی کار می‌کند، بنابراین آن چیزی است که ما در اینجا استفاده خواهیم کرد. +توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های Keras ندارند - آنها به صورت خودکار یک تابع خطای مناسب استفاده می‌کنند که آنرا به صورت داخلی محاسبه می‌کنند. اگر آرگومانی برای تابع خطا در زمان `compile()` تعیین نکنید آنها از این تابع خطا به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع خطای داخلی شما نیاز خواهید داشت که برچسب‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب مجزا، که روش معمول استفاده از برچسب‌ها در مدل‌های Keras می‌باشد. شما مثال‌هایی از این را در بخش ۲ این آموزش خواهید دید، جایی که تعیین تابع خطای درست می‌تواند تا اندازه‌ای گول‌زننده باشد. به هر حال، برای دسته‌بندی رشته‌‌ای، یک تابع خطای استانداد Keras به خوبی کار می‌کند، بنابراین آن چیزی است که ما در اینجا استفاده خواهیم کرد. Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. From 1c9dbd52b1c7e7e2eeb1567b6bb3d63d5fb951d0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 20:01:32 +0200 Subject: [PATCH 112/254] some comments applied --- chapters/fa/chapter3/1.mdx | 8 ++++---- chapters/fa/glossary/1.mdx | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 140a34482..e3c8ac49d 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -7,17 +7,17 @@ {#if fw === 'pt'} -* چگونه یک دیتاسِت بزرگ را از هاب تهیه کنید +* چگونه دیتاسِت‌های بزرگ را از هاب تهیه کنید * چگونه از `API` سطح بالای `Trainer` برای کوک کردن مدل استفاده کنید * چگونه یک چرخه‌ تعلیم دلخواه درست کنید -* چگونه از کتابخانه `Accelerate` هاگینگ‌فِیس برای اجرای چرخه‌ تعلیم دلخواه در هر نوع تنظیمات غیر متمرکزی استفاده کنید +* چگونه از کتابخانه `Accelerate` هاگینگ‌فِیس برای اجرای چرخه‌ تعلیم دلخواه در هر نوع تنظیمات توزیع شده‌ای استفاده کنید {:else} -* چگونه یک دیتاسِت بزرگ را از هاب تهیه کنید +* چگونه دیتاسِت‌های بزرگ را از هاب تهیه کنید * چگونه از کِراس برای کوک‌ کردن مدل استفاده کنید * چگونه از کِراس برای استخراج پیش‌بینی‌ها استفاده کنید -* چگونه از یک مِتریک دلخواه استفاده کنید +* چگونه از مِتریک دلخواه استفاده کنید {/if} diff --git a/chapters/fa/glossary/1.mdx b/chapters/fa/glossary/1.mdx index 81979861d..a5ba8475e 100644 --- a/chapters/fa/glossary/1.mdx +++ b/chapters/fa/glossary/1.mdx @@ -40,6 +40,7 @@ | Windows | ویندوز | | macOS | سیستم‌عامل مک | | Distribution | توزیع | +| Distributed | توزیع شده | | Linux | لینوکس | | Workload | محاسبه، محاسبات | | Package Manager | پکیج‌منیجر | From 7bb86f1f52d6287ae3b3be4b1e58d2b714323116 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 20:18:24 +0200 Subject: [PATCH 113/254] comments applied --- chapters/fa/chapter3/1.mdx | 6 +++--- chapters/fa/chapter3/2.mdx | 32 ++++++++++++++++---------------- chapters/fa/chapter3/3_tf.mdx | 2 +- chapters/fa/glossary/1.mdx | 6 +++--- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index e3c8ac49d..6b3879845 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -7,20 +7,20 @@ {#if fw === 'pt'} -* چگونه دیتاسِت‌های بزرگ را از هاب تهیه کنید +* چگونه دِیتاسِت‌های بزرگ را از هاب تهیه کنید * چگونه از `API` سطح بالای `Trainer` برای کوک کردن مدل استفاده کنید * چگونه یک چرخه‌ تعلیم دلخواه درست کنید * چگونه از کتابخانه `Accelerate` هاگینگ‌فِیس برای اجرای چرخه‌ تعلیم دلخواه در هر نوع تنظیمات توزیع شده‌ای استفاده کنید {:else} -* چگونه دیتاسِت‌های بزرگ را از هاب تهیه کنید +* چگونه دِیتاسِت‌های بزرگ را از هاب تهیه کنید * چگونه از کِراس برای کوک‌ کردن مدل استفاده کنید * چگونه از کِراس برای استخراج پیش‌بینی‌ها استفاده کنید * چگونه از مِتریک دلخواه استفاده کنید {/if} -جهت بارگذاری چکپوینت تعلیم دیده خود در هاب هاگینگ‌فِیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) +جهت آپلود نقطه تعلیم خود در هاب هاگینگ‌فِیس، احتیاج به یک حساب کاربری در huggingface.co خواهید داشت: [ایجاد حساب کاربری](https://huggingface.co/join) \ No newline at end of file diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index efe4edc0e..3fc081e0e 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -157,7 +157,7 @@ raw_train_dataset.features ✏️ **امتحان کنید!** عنصر شماره ۱۵ از داده training و عنصر شماره ۸۷ از داده validation را مشاهده کنید. برچسبهای آنها چیست؟ -### پیش‌پردازشِ یک دیتاسِت +### پیش‌پردازشِ یک دِیتاسِت‌ {#if fw === 'pt'} @@ -165,7 +165,7 @@ raw_train_dataset.features {/if} -به منظور پیش‌پردازش دیتاسِت، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: +به منظور پیش‌پردازش دِیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: ```py from transformers import AutoTokenizer @@ -230,7 +230,7 @@ we will get: در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکنایز شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکنایزر می‌داند چه چیزی برای مدل فراهم کند. -اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل دیتاسِتمان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دیتاسِت training اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل دِیتاسِتمان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دِیتاسِت training اینگونه می‌باشد: ```py tokenized_dataset = tokenizer( @@ -240,26 +240,26 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` -این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دیتاسِت در حین توکنایز کردن داشته باشید (در حالی که دیتاسِت‌های موجود در پایگاه دیتاسِت 🤗 فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه می‌دارید). +این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دِیتاسِت در حین توکنایز کردن داشته باشید (در حالی که دِیتاسِت‌های موجود در پایگاه دِیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه می‌دارید). -به منظور نگه داشتن داده به صورت یک دیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر دیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکنایز کند: +به منظور نگه داشتن داده به صورت یک دِیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر دِیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکنایز کند: ```py def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` -این تابع یک دیکشنری (مثل اقلام داخل دیتاسِت) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. این توکنایزر با توکنایزری در کتابخانه [🤗 Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. +این تابع یک دیکشنری (مثل اقلام داخل دِیتاسِت) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. این توکنایزر با توکنایزری در کتابخانه [هاگینگ‌فِیس Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. -توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. +توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دِیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. -در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل دیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریعتر انجام گیرد: +در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل دِیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دِیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریعتر انجام گیرد: ```py tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` -روشی که کتابخانه دیتاسِت 🤗 این پیش‌پردازش را اعمال می‌کند، با افزودن -فیلدهای- جدید به دیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، می‌باشد:، +روشی که کتابخانه دِیتاسِت هاگینگ‌فِیس این پیش‌پردازش را اعمال می‌کند، با افزودن -فیلدهای- جدید به دِیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، می‌باشد:، ```python out DatasetDict({ @@ -278,10 +278,10 @@ DatasetDict({ }) ``` -شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `()map` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر 🤗 از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایزر سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. +شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `()map` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایزر سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. -تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخش‌های دیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دیتاسِت که تابع `()map` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. +تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخش‌های دِیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دِیتاسِت که تابع `()map` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. @@ -302,7 +302,7 @@ DatasetDict({ {/if} -برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای 🤗 چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند، و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دِیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند، و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} ```py @@ -330,7 +330,7 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se [50, 59, 47, 67, 59, 50, 62, 32] ``` -تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دیتاسِت باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: +تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دِیتاسِت باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: ```py batch = data_collator(samples) @@ -361,13 +361,13 @@ batch = data_collator(samples) -✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی دیتاسِت GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. +✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی دِیتاسِت GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور دیتاسِت‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دیتاسِت 🤗 را به سرعت به فرمت آماده برای آموزش تبدیل کند. اجازه دهید آنرا در عمل با دیتاسِت‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور دِیتاسِت‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دِیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای آموزش تبدیل کند. اجازه دهید آنرا در عمل با دِیتاسِت‌مان مشاهده کنیم! ```py tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( @@ -387,6 +387,6 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` -این هم از این! حالا می‌توانیم این دیتاسِت‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. +این هم از این! حالا می‌توانیم این دِیتاسِت‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. {/if} diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 5adede6a0..ca62b27ca 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -85,7 +85,7 @@ model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_lab You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -برای کوک‌ کردن مدل روی دیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای آموزش را گزارش دهد، بعلاوه‌ی خطای تایید در انتهای هر epoch. +برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای آموزش را گزارش دهد، بعلاوه‌ی خطای تایید در انتهای هر epoch. To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. diff --git a/chapters/fa/glossary/1.mdx b/chapters/fa/glossary/1.mdx index a5ba8475e..e8642a8bc 100644 --- a/chapters/fa/glossary/1.mdx +++ b/chapters/fa/glossary/1.mdx @@ -55,9 +55,9 @@ | Script | اسکریپت‌ | | Feature | قابلیت | | Folder | پوشه | -|fine-tune|کوک کردن| -|dataset|دیتاسِت| - +| Fine-tune | کوک کردن | +| Dataset | دِیتاسِت | +| Upload | آپلود | معادل‌هایی که استفاده نمی‌کنیم: From 6551eb89262ba181baae56b0c2b250725808b1da Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 21:01:21 +0200 Subject: [PATCH 114/254] new fixes applied --- chapters/fa/chapter3/2.mdx | 9 ++++----- chapters/fa/glossary/1.mdx | 2 ++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 3fc081e0e..0e656dc9b 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -2,15 +2,14 @@ -# پردازش داده -# Processing the data +# پردازش داده {#if fw === 'pt'} @@ -19,7 +18,7 @@ @@ -27,7 +26,7 @@ {#if fw === 'pt'} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بَتچ توسط pytorch را شرح می‌دهیم: +در ادامه مثال [فصل قبل](/course/chapter2)،نشان می‌دهیم چگونه مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ در PyTorch آموزش می‌دهیم: ```python import torch diff --git a/chapters/fa/glossary/1.mdx b/chapters/fa/glossary/1.mdx index e8642a8bc..b6ef6e20a 100644 --- a/chapters/fa/glossary/1.mdx +++ b/chapters/fa/glossary/1.mdx @@ -58,6 +58,8 @@ | Fine-tune | کوک کردن | | Dataset | دِیتاسِت | | Upload | آپلود | +| Batch | بَتچ | + معادل‌هایی که استفاده نمی‌کنیم: From e9664af0de71095986f5b828255b4c8deb93db40 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 21:09:13 +0200 Subject: [PATCH 115/254] new fixes applied --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 0e656dc9b..ce08a8254 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -26,7 +26,7 @@ {#if fw === 'pt'} -در ادامه مثال [فصل قبل](/course/chapter2)،نشان می‌دهیم چگونه مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ در PyTorch آموزش می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط pytorch شرح می‌دهیم: ```python import torch @@ -52,7 +52,7 @@ optimizer.step() ``` {:else} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش یک مدل ترتیبی در یک بَتچ توسط pytorch را شرح می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط pytorch شرح می‌دهیم: ```python import tensorflow as tf From a4311f544a95904185a3b81908fefcf3cdd5930c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 21:09:53 +0200 Subject: [PATCH 116/254] new fixes applied --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index ce08a8254..00b5e9807 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -26,7 +26,7 @@ {#if fw === 'pt'} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط pytorch شرح می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط PyTorch شرح می‌دهیم: ```python import torch @@ -52,7 +52,7 @@ optimizer.step() ``` {:else} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط pytorch شرح می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط PyTorch شرح می‌دهیم: ```python import tensorflow as tf From 1474c43ecb28a9ccf682af0f2225d125bd3c3268 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 21:17:07 +0200 Subject: [PATCH 117/254] new fixes applied --- chapters/fa/chapter3/2.mdx | 16 ++++++++-------- chapters/fa/chapter3/3_tf.mdx | 14 ++++++-------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 00b5e9807..e083ba8ff 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -26,7 +26,7 @@ {#if fw === 'pt'} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط PyTorch شرح می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط پایتورچ شرح می‌دهیم: ```python import torch @@ -52,7 +52,7 @@ optimizer.step() ``` {:else} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه آموزش مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط PyTorch شرح می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط پایتورچ شرح می‌دهیم: ```python import tensorflow as tf @@ -77,9 +77,9 @@ model.train_on_batch(batch, labels) {/if} -البته آموزش با استفاده از دو جمله به نتایج چشمگیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه‌داده بزرگتر خواهید داشت. +البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه‌داده بزرگتر خواهید داشت. -در این بخش ما از مجموعه‌داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این مجموعه‌داده این است که مجموعه‌داده کوچکیست و تجربه آموزش دادن روی آن آسان است. +در این بخش ما از مجموعه‌داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این مجموعه‌داده این است که مجموعه‌داده کوچکیست و تجربه تعلیم روی آن آسان است. ### بارگذاری یک داده از هاب @@ -293,11 +293,11 @@ DatasetDict({ {#if fw === 'pt'} -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU ها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPU ها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. {:else} -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. collator پیش فرض تابعی است که فقط نمونه‌های شما را به tf.Tensor تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه آموزش را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال آموزش روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. collator پیش فرض تابعی است که فقط نمونه‌های شما را به tf.Tensor تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. {/if} @@ -366,7 +366,7 @@ batch = data_collator(samples) {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور دِیتاسِت‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دِیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای آموزش تبدیل کند. اجازه دهید آنرا در عمل با دِیتاسِت‌مان مشاهده کنیم! +توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور دِیتاسِت‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دِیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دِیتاسِت‌مان مشاهده کنیم! ```py tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( @@ -386,6 +386,6 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` -این هم از این! حالا می‌توانیم این دِیتاسِت‌ها را به درس بعدی ببریم، جایی که آموزش پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. +این هم از این! حالا می‌توانیم این دِیتاسِت‌ها را به درس بعدی ببریم، جایی که تعلیم پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. {/if} diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index ca62b27ca..9f0da034b 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -12,7 +12,7 @@ {label: "Aws Studio", value: "https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/chapter3/section3_tf.ipynb"}, ]} /> -وقتی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا آموزشِ مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر تنظیمات GPU ندارید، می‌توانید به GPUها یا TPUها مجانی روی [Google Colab](https://colab.research.google.com/) دسترسی داشته باشید. +وقتی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر تنظیمات GPU ندارید، می‌توانید به GPUها یا TPUها مجانی روی [Google Colab](https://colab.research.google.com/) دسترسی داشته باشید. Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). @@ -55,9 +55,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` -### آموزش - -### Training +### تعلیم مدل‌های تِنسورفلو که از ترَنسفورمِرهای هاگینگ‌فِیس وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. @@ -65,7 +63,7 @@ TensorFlow models imported from 🤗 Transformers are already Keras models. Here -آن به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار خیلی کمی لازم است تا آموزش را روی آن شروع کنیم. +آن به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار خیلی کمی لازم است تا تعلیم را روی آن شروع کنیم. That means that once we have our data, very little work is required to begin training on it. @@ -81,17 +79,17 @@ from transformers import TFAutoModelForSequenceClassification model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) ``` -شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از نمونه‌سازیِ این مدل پیش‌تعلیم شما یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی جفت جمله‌ها پیش‌تعلیم نشده، بنابراین لایه-سر مدل پیش‌تعلیم حذف شده و یک لایه-سر مناسب جهت دسته بندی رشته‌‌ای به جای آن اضافه شده. هشدارها نشان می‌دهند که برخی از وزنها استفاده نشده‌اند (آنهایی که مربوط به لایه-سر جدید هستند) و برخی دیگر به صورت تصادفی مقدار‌دهی شده‌ند. (آنهایی که مربوط به لایه-سر پیش‌تعلیم حذف شده هستند). در نتیجه این شما را تشویق به آموزش مدل می‌کند، که دقیقا همان چیزی است که می‌خواهیم اکنون انجام دهیم. +شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از نمونه‌سازیِ این مدل پیش‌تعلیم شما یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی جفت جمله‌ها پیش‌تعلیم نشده، بنابراین لایه-سر مدل پیش‌تعلیم حذف شده و یک لایه-سر مناسب جهت دسته بندی رشته‌‌ای به جای آن اضافه شده. هشدارها نشان می‌دهند که برخی از وزنها استفاده نشده‌اند (آنهایی که مربوط به لایه-سر جدید هستند) و برخی دیگر به صورت تصادفی مقدار‌دهی شده‌ند. (آنهایی که مربوط به لایه-سر پیش‌تعلیم حذف شده هستند). در نتیجه این شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان چیزی است که می‌خواهیم اکنون انجام دهیم. You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای آموزش را گزارش دهد، بعلاوه‌ی خطای تایید در انتهای هر epoch. +برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای تعلیم را گزارش دهد، بعلاوه‌ی خطای تایید در انتهای هر epoch. To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. -توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های Keras ندارند - آنها به صورت خودکار یک تابع خطای مناسب استفاده می‌کنند که آنرا به صورت داخلی محاسبه می‌کنند. اگر آرگومانی برای تابع خطا در زمان `compile()` تعیین نکنید آنها از این تابع خطا به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع خطای داخلی شما نیاز خواهید داشت که برچسب‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب مجزا، که روش معمول استفاده از برچسب‌ها در مدل‌های Keras می‌باشد. شما مثال‌هایی از این را در بخش ۲ این آموزش خواهید دید، جایی که تعیین تابع خطای درست می‌تواند تا اندازه‌ای گول‌زننده باشد. به هر حال، برای دسته‌بندی رشته‌‌ای، یک تابع خطای استانداد Keras به خوبی کار می‌کند، بنابراین آن چیزی است که ما در اینجا استفاده خواهیم کرد. +توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های Keras ندارند - آنها به صورت خودکار یک تابع خطای مناسب استفاده می‌کنند که آنرا به صورت داخلی محاسبه می‌کنند. اگر آرگومانی برای تابع خطا در زمان `compile()` تعیین نکنید آنها از این تابع خطا به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع خطای داخلی شما نیاز خواهید داشت که برچسب‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب مجزا، که روش معمول استفاده از برچسب‌ها در مدل‌های Keras می‌باشد. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع خطای درست می‌تواند تا اندازه‌ای گول‌زننده باشد. به هر حال، برای دسته‌بندی رشته‌‌ای، یک تابع خطای استانداد Keras به خوبی کار می‌کند، بنابراین آن چیزی است که ما در اینجا استفاده خواهیم کرد. Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. From 42c55ff31a9f4846ea25a5740df3a79579259832 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 21:52:02 +0200 Subject: [PATCH 118/254] new fixes applied --- chapters/fa/chapter3/2.mdx | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index e083ba8ff..54940b668 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -26,7 +26,7 @@ {#if fw === 'pt'} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط پایتورچ شرح می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از پایتورچ شرح می‌دهیم: ```python import torch @@ -52,7 +52,7 @@ optimizer.step() ``` {:else} -در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ توسط پایتورچ شرح می‌دهیم: +در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از تِنسورفلو شرح می‌دهیم: ```python import tensorflow as tf @@ -77,23 +77,21 @@ model.train_on_batch(batch, labels) {/if} -البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای بدست آوردن نتایج بهتر نیاز به آماده سازی مجموعه‌داده بزرگتر خواهید داشت. +البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای به دست آوردن نتایج بهتر نیاز به آماده‌سازی دِیتاسِت بزرگتری خواهید داشت. -در این بخش ما از مجموعه‌داده MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی William B. Dolan و Chris Brockett.، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این مجموعه‌داده این است که مجموعه‌داده کوچکیست و تجربه تعلیم روی آن آسان است. +در این بخش ما از دِیتاسِت MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این دِیتاسِت این است که دِیتاسِت کوچکیست و تجربه تعلیم روی آن آسان است. ### بارگذاری یک داده از هاب -### Loading a dataset from the Hub - {#if fw === 'pt'} {:else} {/if} -هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل مجموعه‌داده‌های متعدد در بسیاری زبان‌های مختلف می‌باشد. شما می‌توانید مجموعه‌داده‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک مجموعه‌داده جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. +هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل دِیتاسِت‌های متعدد در بسیاری زبان‌های مختلف می‌باشد. شما می‌توانید دِیتاسِت‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک دِیتاسِت جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. -کتابخانه مجموعه‌داده 🤗 یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک مجموعه‌داده در هاب ارائه می‌کند. ما می‌توانیم مجموعه‌داده MRPC را به روش زیر دانلود کنیم: +کتابخانه دِیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک دِیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دِیتاسِت MRPC را به روش زیر دانلود کنیم: ```py from datasets import load_dataset @@ -121,7 +119,7 @@ DatasetDict({ همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx`) و تعداد متغیری ردیف داده که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training وجود دارد، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test). - این دستور مجموعه‌داده را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور دِیتاسِت را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک dictionary دسترسی پیدا کنیم: From 258b9828883c60df8d681dba89e4e9b81619605d Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 22:37:06 +0200 Subject: [PATCH 119/254] new fixes applied --- chapters/fa/chapter3/2.mdx | 18 +++++++++--------- chapters/fa/glossary/1.mdx | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 54940b668..d33ba0c76 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -79,9 +79,9 @@ model.train_on_batch(batch, labels) البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای به دست آوردن نتایج بهتر نیاز به آماده‌سازی دِیتاسِت بزرگتری خواهید داشت. -در این بخش ما از دِیتاسِت MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این داده شامل ۵،۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشاندهنده متناظر بودن جملات (به عنوان مثال، آیا دو جمله معنی یکسانی دارند یا خیر) می‌باشد. علت انتخاب این دِیتاسِت این است که دِیتاسِت کوچکیست و تجربه تعلیم روی آن آسان است. +در این بخش ما از دِیتاسِت MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دِیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دِیتاسِت این است که دِیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. -### بارگذاری یک داده از هاب +### بارگذاری دِیتاسِت‌ها از هاب {#if fw === 'pt'} @@ -89,9 +89,9 @@ model.train_on_batch(batch, labels) {/if} -هاب تنها شامل مدلها نمی‌باشد؛ بلکه شامل دِیتاسِت‌های متعدد در بسیاری زبان‌های مختلف می‌باشد. شما می‌توانید دِیتاسِت‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک دِیتاسِت جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی داده MRPC تمرکز کنیم! این داده یکی از ۱۰ داده [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدلهای یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. +هاب تنها شامل مدل‌ها نمی‌باشد؛ بلکه شامل دِیتاسِت‌های متعدد در بسیاری از زبان‌های مختلف می‌باشد. شما می‌توانید دِیتاسِت‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک دِیتاسِت جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی دِیتاسِت MRPC تمرکز کنیم! این یکی از ۱۰ دِیتاسِت [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدل‌های یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. -کتابخانه دِیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و ذخیره سازی یک دِیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دِیتاسِت MRPC را به روش زیر دانلود کنیم: +کتابخانه دِیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و ذخیره‌سازی یک دِیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دِیتاسِت MRPC را به روش زیر دانلود کنیم: ```py from datasets import load_dataset @@ -117,11 +117,11 @@ DatasetDict({ }) ``` -همانطور که می بینید یک شیء "DatasetDict" بدست می‌آوریم که شامل مجموعه training، مجموعه validation، و مجموعه test می‌باشد. هریک از اینها شامل چندین سطون (`label`، `sentence2`، `sentence1`، و `idx`) و تعداد متغیری ردیف داده که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳،۶۶۸ جفت جمله در مجموعه training وجود دارد، ۴۰۸ تا در مجموعه validation، و ۱،۷۲۵ تا در مجموعه test). +همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). - این دستور دِیتاسِت را دانلود و به صورت پیش فرض در زیرشاخه‌ی *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازیتان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور دِیتاسِت را دانلود و به صورت پیش فرض در پوشه‌ي
*~/.cache/huggingface/dataset*
ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. -ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک dictionary دسترسی پیدا کنیم: +ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک `dictionary` دسترسی پیدا کنیم: ```py raw_train_dataset = raw_datasets["train"] @@ -135,7 +135,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر سطون را به ما خواهد گفت. +می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت. ```py raw_train_dataset.features @@ -315,7 +315,7 @@ data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf" ``` {/if} -اجازه دهید چند نمونه از مجموعه training مان، که می‌خواهیم باهم بَتچ کنیم، برداریم تا این ابزار جدید را امتحان کنیم. در اینجا سطون‌های `idx`، `sentence1`، و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: +اجازه دهید چند نمونه از مجموعه training مان، که می‌خواهیم باهم بَتچ کنیم، برداریم تا این ابزار جدید را امتحان کنیم. در اینجا ستون‌های `idx`، `sentence1`، و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: ```py samples = tokenized_datasets["train"][:8] diff --git a/chapters/fa/glossary/1.mdx b/chapters/fa/glossary/1.mdx index b6ef6e20a..4950f5558 100644 --- a/chapters/fa/glossary/1.mdx +++ b/chapters/fa/glossary/1.mdx @@ -59,7 +59,7 @@ | Dataset | دِیتاسِت | | Upload | آپلود | | Batch | بَتچ | - +| Label | برچسب | معادل‌هایی که استفاده نمی‌کنیم: From c93fe7e7e006d11c781b1f17512b67acec5c77d8 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 22:51:29 +0200 Subject: [PATCH 120/254] new fixes applied --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index d33ba0c76..5511c7c7f 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -119,7 +119,7 @@ DatasetDict({ همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). - این دستور دِیتاسِت را دانلود و به صورت پیش فرض در پوشه‌ي
*~/.cache/huggingface/dataset*
ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور دِیتاسِت را دانلود و به صورت پیش فرض در پوشه‌ي *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک `dictionary` دسترسی پیدا کنیم: From e08e7cd52399475e786b003040225a2789a37f31 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 5 May 2022 23:01:32 +0200 Subject: [PATCH 121/254] Finally, all fixes applied --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 5511c7c7f..eb0df5e0f 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -119,9 +119,9 @@ DatasetDict({ همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). - این دستور دِیتاسِت را دانلود و به صورت پیش فرض در پوشه‌ي *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید زیرشاخه‌ی ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور دِیتاسِت را دانلود و به صورت پیش فرض در پوشه‌ي *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید پوشه‌ي ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. -ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک `dictionary` دسترسی پیدا کنیم: +ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک دیکشنری دسترسی پیدا کنیم: ```py raw_train_dataset = raw_datasets["train"] From 46f1fca796690d27fb130e5d6ecb312792840017 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:14:00 +0200 Subject: [PATCH 122/254] additional fixes made following the comments in the review --- chapters/fa/chapter3/2.mdx | 64 +++++++++++++++++++------------------- chapters/fa/glossary/1.mdx | 3 ++ 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index eb0df5e0f..9dde9a11e 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -119,7 +119,7 @@ DatasetDict({ همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). - این دستور دِیتاسِت را دانلود و به صورت پیش فرض در پوشه‌ي *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید پوشه‌ي ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور دِیتاسِت را دانلود و به صورت پیش‌فرض در پوشه‌ي *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید پوشه‌ي ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک دیکشنری دسترسی پیدا کنیم: @@ -135,7 +135,7 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای اینکه بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت. +می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت. ```py raw_train_dataset.features @@ -148,13 +148,13 @@ raw_train_dataset.features 'idx': Value(dtype='int32', id=None)} ``` -در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent`، و `1` مربوط به `equivalent` می‌باشد،. +در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent` و `1` مربوط به `equivalent` می‌باشد. -✏️ **امتحان کنید!** عنصر شماره ۱۵ از داده training و عنصر شماره ۸۷ از داده validation را مشاهده کنید. برچسبهای آنها چیست؟ +✏️ **امتحان کنید!** عنصر شماره ۱۵ از مجموعه `training` و عنصر شماره ۸۷ از مجموعه `validation` را مشاهده کنید. برچسب‌های آنها چیست؟ -### پیش‌پردازشِ یک دِیتاسِت‌ +### پیش‌پردازشِ دِیتاسِت‌‌ها {#if fw === 'pt'} @@ -162,7 +162,7 @@ raw_train_dataset.features {/if} -به منظور پیش‌پردازش دِیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنایزر بدهیم، در نتیجه می‌توانیم مستقیما تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکنایز کنیم: +به منظور پیش‌پردازش دِیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکِنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنِایزر بدهیم، در نتیجه می‌توانیم به طور مستقیم تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکِنایز کنیم: ```py from transformers import AutoTokenizer @@ -173,7 +173,7 @@ tokenized_sentences_1 = tokenizer(raw_datasets["train"]["sentence1"]) tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) ``` -با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده سازی کند: +با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند که متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکِنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده‌سازی کند: ```py inputs = tokenizer("This is the first sentence.", "This is the second one.") @@ -188,15 +188,15 @@ inputs } ``` -در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی، جمله اول و کدام بخش جمله دوم است. +در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی جمله اول و کدام بخش جمله دوم است. -✏️ **امتحان کنید!** عنصر شماره ۱۵ داده را بردارید و دو جمله را به صورت جداگانه و جفت توکنایز کنید. تفاوت دو نتیجه چیست؟ +✏️ **امتحان کنید!** عنصر شماره ۱۵ از مجموعه `training` را بردارید و دو جمله را به صورت جداگانه و جفت توکِنایز کنید. تفاوت دو نتیجه چیست؟ -اگر آیدی‌های داخل `input_ids` را به کلمات رمزگشایی کنیم: +اگر شناسه‌های داخل `input_ids` را به کلمات رمزگشایی کنیم: ```py tokenizer.convert_ids_to_tokens(inputs["input_ids"]) @@ -210,24 +210,24 @@ we will get: ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` -بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. +بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. ```python out ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] ``` -همانطور که می‌بینید، بخشهایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند آیدی نشاندهنده نوع توکِن آنها `0` و بخشهایی که مربوط به `sentence2 [SEP]` هستند آیدی نشاندهنده نوع توکِن‌شان `1` می‌باشد. +همانطور که می‌بینید، بخش‌هایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند اندیسِ نشان دهنده نوع توکِن آنها `0` و بخش‌هایی که مربوط به `sentence2 [SEP]` هستند اندیس نشان دهنده نوع توکِن‌شان `1` می‌باشد. -توجه داشته باشید که اگر چکپوینت متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. +توجه داشته باشید که اگر نقطه تعلیمِ متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. -در اینجا، مدل BERT با آیدی‌هایی که نشاندهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبانِ ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ برعهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. +در اینجا، مدل BERT با آیدی‌هایی که نشان دهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبانِ ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ بر عهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. - در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالتها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. + در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالت‌ها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. -در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکنایز شده خود باشید: مادامی که از چکپوینت یکسان برای توکنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکنایزر می‌داند چه چیزی برای مدل فراهم کند. +در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکِنایز شده خود باشید: مادامی که از نقطه تعلیم یکسان برای توکِنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکِنایزر می‌داند چه چیزی برای مدل فراهم کند. -اکنون که مشاهده کردیم چگونه توکنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکنایز کردن کل دِیتاسِتمان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم نوکنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های padding و truncation که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دِیتاسِت training اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکِنایز کردن کلِ دِیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دِیتاسِت `training` اینگونه می‌باشد: ```py tokenized_dataset = tokenizer( @@ -237,26 +237,26 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` -این روش به خوبی کار می‌کند، اما مشکلش این است که یک dictionary برمیگرداند (از کلیدهای ما شامل، `input_ids`, `attention_mask`, و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند). همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دِیتاسِت در حین توکنایز کردن داشته باشید (در حالی که دِیتاسِت‌های موجود در پایگاه دِیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه می‌دارید). +این روش به خوبی کار می‌کند، اما مشکل‌اش این است که یک دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کلِ دِیتاسِت در حین توکِنایز کردن داشته باشید (در حالی که دِیتاسِت‌های موجود در پایگاه دِیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌می‌دارید). -به منظور نگه داشتن داده به صورت یک دِیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده میکنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `()map` با اعمال کردن یک عملیات روی هر عنصر دِیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکنایز کند: +به منظور نگهداشتن داده به صورت یک دِیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیش‌تری علاوه‌بر توکِنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دِیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِنایز کند: ```py def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` -این تابع یک دیکشنری (مثل اقلام داخل دِیتاسِت) دریافت میکند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask`، و `token_type_ids` بازمی‌گرداند. توجه داشته باشید از آنجایی که توکنایزر روی لیستهایی از جفت جمله‌ها کار می‌کند، همانطور که قبلا مشاهده کردیم، این تابع نیز درصورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `()map` استفاده کنیم که توکنایزر را به میزان زیادی سریعتر خواهد کرد. این توکنایزر با توکنایزری در کتابخانه [هاگینگ‌فِیس Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. +این تابع یک دیکشنری (مثل اقلام داخل دِیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از جفت جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [هاگینگ‌فِیس Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. -توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دِیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه جویی خواهد کرد. +توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` را زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دِیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. -در اینجا نشان می‌دهیم چگونه تابع توکنایزیشن را روی کل دِیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دِیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریعتر انجام گیرد: +در اینجا نشان می‌دهیم چگونه تابع توکِنایزیشن را روی کل دِیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دِیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد: ```py tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` -روشی که کتابخانه دِیتاسِت هاگینگ‌فِیس این پیش‌پردازش را اعمال می‌کند، با افزودن -فیلدهای- جدید به دِیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، می‌باشد:، +کتابخانه دِیتاسِت هاگینگ‌فِیس این پیش‌پردازش را با افزودن -فیلدهای- جدید به دِیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، اعمال می‌کند: ```python out DatasetDict({ @@ -275,10 +275,10 @@ DatasetDict({ }) ``` -شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `()map` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکنایز کردن سریعتر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکنایزر سریع که با این کتابخانه پشتیبانی میشود استفاده نمی‌کنید، این روش میتواند پیش‌پردازش شما را سریعتر کند. +شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکِنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکِنایز کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. -تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask`، و `token_type_ids`، برمیگرداند به گونه‌ای که این سه فیلد به همه بخش‌های دِیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دِیتاسِت که تابع `()map` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. +تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask` و `token_type_ids`، برمی‌گرداند به گونه‌ای که این سه فیلد به همه بخش‌های دِیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دِیتاسِت که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. @@ -291,15 +291,15 @@ DatasetDict({ {#if fw === 'pt'} -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش فرض تابعی است که نمونه‌های شما را به ماتریس PyTorch تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPU ها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش‌ فرض تابعی است که نمونه‌های شما را به ماتریس پایتورچ تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان‌پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPUها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. {:else} -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. collator پیش فرض تابعی است که فقط نمونه‌های شما را به tf.Tensor تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل، یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیشگیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPU اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. +تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. `collator` پیش‌فرض تابعی است که فقط نمونه‌های شما را به `tf.Tensor` تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPUها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. {/if} -برای انجام اینکار در عمل، ما باید یک تابع collate تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دِیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند، و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام این کار در عمل، ما باید یک تابع `collate` تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دِیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهند. این تابع به محض اینکه آنرا تعریف کنیم (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} ```py @@ -315,7 +315,7 @@ data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf" ``` {/if} -اجازه دهید چند نمونه از مجموعه training مان، که می‌خواهیم باهم بَتچ کنیم، برداریم تا این ابزار جدید را امتحان کنیم. در اینجا ستون‌های `idx`، `sentence1`، و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: +اجازه دهید چند نمونه از مجموعه `training`مان را که می‌خواهیم باهم بَتچ کنیم برداریم تا این ابزار جدید را امتحان کنیم. در اینجا ستون‌های `idx`، `sentence1` و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: ```py samples = tokenized_datasets["train"][:8] @@ -327,7 +327,7 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se [50, 59, 47, 67, 59, 50, 62, 32] ``` -تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دِیتاسِت باید به اندازه بزرگترین طول یا بزرگترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: +تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دِیتاسِت باید به اندازه بزرگ‌ترین طول یا بزرگ‌ترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: ```py batch = data_collator(samples) @@ -352,7 +352,7 @@ batch = data_collator(samples) 'labels': torch.Size([8])} ``` -به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل مان می‌تواند با آنها کار کند، آماده هستیم برای انجام کوک‌ کردن مدل: +به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل‌مان می‌تواند با آنها کار کند، آماده هستیم برای کوک‌ کردن مدل: {/if} @@ -364,7 +364,7 @@ batch = data_collator(samples) {#if fw === 'tf'} -توجه داشته باشید که ما مجموعه‌‌داده مان و یک collator داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را collate کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه میکند: `()to_tf_dataset`. این روش یک `tf.data.Dataset` را دور دِیتاسِت‌تان می‌پیچد، با یک تابع collation دلخواه. `tf.data.Dataset` یک فرمت بومی تنسورفلو است که کِراس می‌تواند برای `()model.fit` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دِیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دِیتاسِت‌مان مشاهده کنیم! +توجه داشته باشید که ما دِیتاسِت‌مان و یک `collator` داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور دِیتاسِت‌تان می‌پیچد، با یک تابع `collation` دلخواه. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دِیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دِیتاسِت‌مان مشاهده کنیم! ```py tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( diff --git a/chapters/fa/glossary/1.mdx b/chapters/fa/glossary/1.mdx index 4950f5558..bde5aae82 100644 --- a/chapters/fa/glossary/1.mdx +++ b/chapters/fa/glossary/1.mdx @@ -60,6 +60,9 @@ | Upload | آپلود | | Batch | بَتچ | | Label | برچسب | +| Padding | هم‌طول‌سازی | +| Dynamic padding | هم‌طول‌سازی پویا | + معادل‌هایی که استفاده نمی‌کنیم: From cb33b96fce6d091a09386b709a2aa92b72852c68 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:24:30 +0200 Subject: [PATCH 123/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 66 +++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 9dde9a11e..f68698102 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -1,5 +1,4 @@ - - +
# پردازش داده @@ -28,6 +27,7 @@ در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از پایتورچ شرح می‌دهیم: +
```python import torch from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification @@ -50,10 +50,13 @@ loss = model(**batch).loss loss.backward() optimizer.step() ``` +
+ {:else} در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از تِنسورفلو شرح می‌دهیم: +
```python import tensorflow as tf import numpy as np @@ -74,6 +77,7 @@ model.compile(optimizer="adam", loss="sparse_categorical_crossentropy") labels = tf.convert_to_tensor([1, 1]) model.train_on_batch(batch, labels) ``` +
{/if} @@ -93,13 +97,16 @@ model.train_on_batch(batch, labels) کتابخانه دِیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و ذخیره‌سازی یک دِیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دِیتاسِت MRPC را به روش زیر دانلود کنیم: +
```py from datasets import load_dataset raw_datasets = load_dataset("glue", "mrpc") raw_datasets ``` +
+
```python out DatasetDict({ train: Dataset({ @@ -116,6 +123,7 @@ DatasetDict({ }) }) ``` +
همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). @@ -123,30 +131,38 @@ DatasetDict({ ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک دیکشنری دسترسی پیدا کنیم: +
```py raw_train_dataset = raw_datasets["train"] raw_train_dataset[0] ``` +
+
```python out {'idx': 0, 'label': 1, 'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` +
می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت. +
```py raw_train_dataset.features ``` +
+
```python out {'sentence1': Value(dtype='string', id=None), 'sentence2': Value(dtype='string', id=None), 'label': ClassLabel(num_classes=2, names=['not_equivalent', 'equivalent'], names_file=None, id=None), 'idx': Value(dtype='int32', id=None)} ``` +
در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent` و `1` مربوط به `equivalent` می‌باشد. @@ -164,6 +180,7 @@ raw_train_dataset.features به منظور پیش‌پردازش دِیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکِنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنِایزر بدهیم، در نتیجه می‌توانیم به طور مستقیم تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکِنایز کنیم: +
```py from transformers import AutoTokenizer @@ -172,14 +189,18 @@ tokenizer = AutoTokenizer.from_pretrained(checkpoint) tokenized_sentences_1 = tokenizer(raw_datasets["train"]["sentence1"]) tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) ``` +
با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند که متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکِنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده‌سازی کند: +
```py inputs = tokenizer("This is the first sentence.", "This is the second one.") inputs ``` +
+
```python out { 'input_ids': [101, 2023, 2003, 1996, 2034, 6251, 1012, 102, 2023, 2003, 1996, 2117, 2028, 1012, 102], @@ -187,6 +208,7 @@ inputs 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] } ``` +
در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی جمله اول و کدام بخش جمله دوم است. @@ -198,24 +220,30 @@ inputs اگر شناسه‌های داخل `input_ids` را به کلمات رمزگشایی کنیم: +
```py tokenizer.convert_ids_to_tokens(inputs["input_ids"]) ``` +
خواهیم داشت: we will get: +
```python out ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` +
بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. +
```python out ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] ``` +
همانطور که می‌بینید، بخش‌هایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند اندیسِ نشان دهنده نوع توکِن آنها `0` و بخش‌هایی که مربوط به `sentence2 [SEP]` هستند اندیس نشان دهنده نوع توکِن‌شان `1` می‌باشد. @@ -229,6 +257,7 @@ we will get: اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکِنایز کردن کلِ دِیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دِیتاسِت `training` اینگونه می‌باشد: +
```py tokenized_dataset = tokenizer( raw_datasets["train"]["sentence1"], @@ -237,14 +266,18 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` +
+ این روش به خوبی کار می‌کند، اما مشکل‌اش این است که یک دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کلِ دِیتاسِت در حین توکِنایز کردن داشته باشید (در حالی که دِیتاسِت‌های موجود در پایگاه دِیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌می‌دارید). به منظور نگهداشتن داده به صورت یک دِیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیش‌تری علاوه‌بر توکِنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دِیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِنایز کند: +
```py def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` +
این تابع یک دیکشنری (مثل اقلام داخل دِیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از جفت جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [هاگینگ‌فِیس Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. @@ -252,12 +285,16 @@ def tokenize_function(example): در اینجا نشان می‌دهیم چگونه تابع توکِنایزیشن را روی کل دِیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دِیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد: +
```py tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` +
+ کتابخانه دِیتاسِت هاگینگ‌فِیس این پیش‌پردازش را با افزودن -فیلدهای- جدید به دِیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، اعمال می‌کند: +
```python out DatasetDict({ train: Dataset({ @@ -274,6 +311,7 @@ DatasetDict({ }) }) ``` +
شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکِنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکِنایز کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. @@ -285,8 +323,6 @@ DatasetDict({ ### هم‌طول‌سازی پویا -### Dynamic padding - {#if fw === 'pt'} @@ -302,55 +338,73 @@ DatasetDict({ برای انجام این کار در عمل، ما باید یک تابع `collate` تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دِیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهند. این تابع به محض اینکه آنرا تعریف کنیم (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} + +
```py from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer) ``` +
+ {:else} + +
```py from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") ``` +
+ {/if} اجازه دهید چند نمونه از مجموعه `training`مان را که می‌خواهیم باهم بَتچ کنیم برداریم تا این ابزار جدید را امتحان کنیم. در اینجا ستون‌های `idx`، `sentence1` و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: +
```py samples = tokenized_datasets["train"][:8] samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "sentence2"]} [len(x) for x in samples["input_ids"]] ``` +
+
```python out [50, 59, 47, 67, 59, 50, 62, 32] ``` +
تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دِیتاسِت باید به اندازه بزرگ‌ترین طول یا بزرگ‌ترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: +
```py batch = data_collator(samples) {k: v.shape for k, v in batch.items()} ``` +
{#if fw === 'tf'} +
```python out {'attention_mask': TensorShape([8, 67]), 'input_ids': TensorShape([8, 67]), 'token_type_ids': TensorShape([8, 67]), 'labels': TensorShape([8])} ``` +
{:else} +
```python out {'attention_mask': torch.Size([8, 67]), 'input_ids': torch.Size([8, 67]), 'token_type_ids': torch.Size([8, 67]), 'labels': torch.Size([8])} ``` +
به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل‌مان می‌تواند با آنها کار کند، آماده هستیم برای کوک‌ کردن مدل: @@ -366,6 +420,7 @@ batch = data_collator(samples) توجه داشته باشید که ما دِیتاسِت‌مان و یک `collator` داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور دِیتاسِت‌تان می‌پیچد، با یک تابع `collation` دلخواه. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دِیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دِیتاسِت‌مان مشاهده کنیم! +
```py tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( columns=["attention_mask", "input_ids", "token_type_ids"], @@ -383,7 +438,10 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( batch_size=8, ) ``` +
این هم از این! حالا می‌توانیم این دِیتاسِت‌ها را به درس بعدی ببریم، جایی که تعلیم پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. {/if} + +
\ No newline at end of file From cf3fcc2b7ee9c0cb6dd09a6722dbfd8413d1b3f8 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:27:24 +0200 Subject: [PATCH 124/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index f68698102..f0e93879e 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -27,7 +27,7 @@ در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از پایتورچ شرح می‌دهیم: -
+ ```python import torch from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification @@ -50,7 +50,7 @@ loss = model(**batch).loss loss.backward() optimizer.step() ``` -
+<\span> {:else} From 67bf22ad6c4007914b9b12e06e502f185c821cc2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:28:03 +0200 Subject: [PATCH 125/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index f0e93879e..6bbdc795a 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -27,7 +27,7 @@ در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از پایتورچ شرح می‌دهیم: - + ```python import torch from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification @@ -50,7 +50,7 @@ loss = model(**batch).loss loss.backward() optimizer.step() ``` -<\span> + {:else} From 52a06715f01a771a810ba548adaf24640e8d2db2 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:31:48 +0200 Subject: [PATCH 126/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 6bbdc795a..bca43a80b 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -1,6 +1,6 @@ -
+
# پردازش داده {#if fw === 'pt'} @@ -27,7 +27,7 @@ در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از پایتورچ شرح می‌دهیم: - +
```python import torch from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification @@ -50,7 +50,7 @@ loss = model(**batch).loss loss.backward() optimizer.step() ``` - +
{:else} From 59313b6f8bda471206c96e9e38660a29dd995d72 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:35:25 +0200 Subject: [PATCH 127/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 88 ++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 52 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index bca43a80b..af3e07f89 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -27,7 +27,7 @@ در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از پایتورچ شرح می‌دهیم: -
+ ```python import torch from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification @@ -50,13 +50,12 @@ loss = model(**batch).loss loss.backward() optimizer.step() ``` -
{:else} در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از تِنسورفلو شرح می‌دهیم: -
+ ```python import tensorflow as tf import numpy as np @@ -77,7 +76,6 @@ model.compile(optimizer="adam", loss="sparse_categorical_crossentropy") labels = tf.convert_to_tensor([1, 1]) model.train_on_batch(batch, labels) ``` -
{/if} @@ -97,16 +95,14 @@ model.train_on_batch(batch, labels) کتابخانه دِیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و ذخیره‌سازی یک دِیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دِیتاسِت MRPC را به روش زیر دانلود کنیم: -
+ ```py from datasets import load_dataset raw_datasets = load_dataset("glue", "mrpc") raw_datasets ``` -
-
```python out DatasetDict({ train: Dataset({ @@ -123,7 +119,6 @@ DatasetDict({ }) }) ``` -
همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). @@ -131,38 +126,34 @@ DatasetDict({ ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک دیکشنری دسترسی پیدا کنیم: -
+ ```py raw_train_dataset = raw_datasets["train"] raw_train_dataset[0] ``` -
-
```python out {'idx': 0, 'label': 1, 'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` -
+ می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت. -
+ ```py raw_train_dataset.features ``` -
-
```python out {'sentence1': Value(dtype='string', id=None), 'sentence2': Value(dtype='string', id=None), 'label': ClassLabel(num_classes=2, names=['not_equivalent', 'equivalent'], names_file=None, id=None), 'idx': Value(dtype='int32', id=None)} ``` -
+ در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent` و `1` مربوط به `equivalent` می‌باشد. @@ -180,7 +171,7 @@ raw_train_dataset.features به منظور پیش‌پردازش دِیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکِنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنِایزر بدهیم، در نتیجه می‌توانیم به طور مستقیم تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکِنایز کنیم: -
+ ```py from transformers import AutoTokenizer @@ -189,18 +180,15 @@ tokenizer = AutoTokenizer.from_pretrained(checkpoint) tokenized_sentences_1 = tokenizer(raw_datasets["train"]["sentence1"]) tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) ``` -
با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند که متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکِنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده‌سازی کند: -
+ ```py inputs = tokenizer("This is the first sentence.", "This is the second one.") inputs ``` -
-
```python out { 'input_ids': [101, 2023, 2003, 1996, 2034, 6251, 1012, 102, 2023, 2003, 1996, 2117, 2028, 1012, 102], @@ -208,7 +196,7 @@ inputs 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] } ``` -
+ در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی جمله اول و کدام بخش جمله دوم است. @@ -220,30 +208,29 @@ inputs اگر شناسه‌های داخل `input_ids` را به کلمات رمزگشایی کنیم: -
+ ```py tokenizer.convert_ids_to_tokens(inputs["input_ids"]) ``` -
+ خواهیم داشت: we will get: -
+ ```python out ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` -
بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. -
+ ```python out ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] ``` -
+ همانطور که می‌بینید، بخش‌هایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند اندیسِ نشان دهنده نوع توکِن آنها `0` و بخش‌هایی که مربوط به `sentence2 [SEP]` هستند اندیس نشان دهنده نوع توکِن‌شان `1` می‌باشد. @@ -257,7 +244,7 @@ we will get: اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکِنایز کردن کلِ دِیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دِیتاسِت `training` اینگونه می‌باشد: -
+ ```py tokenized_dataset = tokenizer( raw_datasets["train"]["sentence1"], @@ -266,18 +253,18 @@ tokenized_dataset = tokenizer( truncation=True, ) ``` -
+ این روش به خوبی کار می‌کند، اما مشکل‌اش این است که یک دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کلِ دِیتاسِت در حین توکِنایز کردن داشته باشید (در حالی که دِیتاسِت‌های موجود در پایگاه دِیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌می‌دارید). به منظور نگهداشتن داده به صورت یک دِیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیش‌تری علاوه‌بر توکِنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دِیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِنایز کند: -
+ ```py def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` -
+ این تابع یک دیکشنری (مثل اقلام داخل دِیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از جفت جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [هاگینگ‌فِیس Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. @@ -285,16 +272,16 @@ def tokenize_function(example): در اینجا نشان می‌دهیم چگونه تابع توکِنایزیشن را روی کل دِیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دِیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد: -
+ ```py tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` -
+ کتابخانه دِیتاسِت هاگینگ‌فِیس این پیش‌پردازش را با افزودن -فیلدهای- جدید به دِیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، اعمال می‌کند: -
+ ```python out DatasetDict({ train: Dataset({ @@ -311,7 +298,6 @@ DatasetDict({ }) }) ``` -
شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکِنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکِنایز کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. @@ -339,72 +325,70 @@ DatasetDict({ {#if fw === 'pt'} -
+ ```py from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer) ``` -
+ {:else} -
+ ```py from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") ``` -
+ {/if} اجازه دهید چند نمونه از مجموعه `training`مان را که می‌خواهیم باهم بَتچ کنیم برداریم تا این ابزار جدید را امتحان کنیم. در اینجا ستون‌های `idx`، `sentence1` و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: -
+ ```py samples = tokenized_datasets["train"][:8] samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "sentence2"]} [len(x) for x in samples["input_ids"]] ``` -
-
```python out [50, 59, 47, 67, 59, 50, 62, 32] ``` -
+ تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دِیتاسِت باید به اندازه بزرگ‌ترین طول یا بزرگ‌ترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: -
+ ```py batch = data_collator(samples) {k: v.shape for k, v in batch.items()} ``` -
+ {#if fw === 'tf'} -
+ ```python out {'attention_mask': TensorShape([8, 67]), 'input_ids': TensorShape([8, 67]), 'token_type_ids': TensorShape([8, 67]), 'labels': TensorShape([8])} ``` -
+ {:else} -
+ ```python out {'attention_mask': torch.Size([8, 67]), 'input_ids': torch.Size([8, 67]), 'token_type_ids': torch.Size([8, 67]), 'labels': torch.Size([8])} ``` -
+ به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل‌مان می‌تواند با آنها کار کند، آماده هستیم برای کوک‌ کردن مدل: @@ -420,7 +404,7 @@ batch = data_collator(samples) توجه داشته باشید که ما دِیتاسِت‌مان و یک `collator` داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور دِیتاسِت‌تان می‌پیچد، با یک تابع `collation` دلخواه. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دِیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دِیتاسِت‌مان مشاهده کنیم! -
+ ```py tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( columns=["attention_mask", "input_ids", "token_type_ids"], @@ -438,7 +422,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( batch_size=8, ) ``` -
+ این هم از این! حالا می‌توانیم این دِیتاسِت‌ها را به درس بعدی ببریم، جایی که تعلیم پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. From 2a3502c398ab1f2b84f2f6f91627e84f50be62f8 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:37:48 +0200 Subject: [PATCH 128/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index af3e07f89..bfacbb3f9 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -27,7 +27,7 @@ در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از پایتورچ شرح می‌دهیم: - +
```python import torch from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification @@ -50,6 +50,7 @@ loss = model(**batch).loss loss.backward() optimizer.step() ``` +<\div> {:else} From 39696feab64cef2a3ae5e80c23e7bdbee31e137e Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:39:02 +0200 Subject: [PATCH 129/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index bfacbb3f9..23d71cb34 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -27,7 +27,24 @@ در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از پایتورچ شرح می‌دهیم: +
+ +```python +from transformers import pipeline + +classifier = pipeline("sentiment-analysis") +classifier( + [ + "I've been waiting for a HuggingFace course my whole life.", + "I hate this so much!", + ] +) +``` + +
+ + ```python import torch from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification @@ -50,7 +67,7 @@ loss = model(**batch).loss loss.backward() optimizer.step() ``` -<\div> + {:else} From 62dedb1bf74f52650263ca63a5a995ef54ded25b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:39:39 +0200 Subject: [PATCH 130/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 23d71cb34..0fc1ae1fa 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -30,21 +30,6 @@
-```python -from transformers import pipeline - -classifier = pipeline("sentiment-analysis") -classifier( - [ - "I've been waiting for a HuggingFace course my whole life.", - "I hate this so much!", - ] -) -``` - -
- - ```python import torch from transformers import AdamW, AutoTokenizer, AutoModelForSequenceClassification @@ -68,6 +53,7 @@ loss.backward() optimizer.step() ``` +<\div> {:else} From f588f85c9843c2ecc10d213f2b9266a3ba12c9e8 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:40:51 +0200 Subject: [PATCH 131/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 0fc1ae1fa..3b80ceb7e 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -53,12 +53,13 @@ loss.backward() optimizer.step() ``` -<\div> +
{:else} در این بخش در ادامه مثال [فصل قبل](/course/chapter2)، نحوه تعلیم مدل‌های دسته‌بندی کننده رشته‌ها را در یک بَتچ با استفاده از تِنسورفلو شرح می‌دهیم: +
```python import tensorflow as tf @@ -81,6 +82,8 @@ labels = tf.convert_to_tensor([1, 1]) model.train_on_batch(batch, labels) ``` +
+ {/if} البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای به دست آوردن نتایج بهتر نیاز به آماده‌سازی دِیتاسِت بزرگتری خواهید داشت. From de26443cfb5c2f6200706294a29c962c191be720 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 00:45:54 +0200 Subject: [PATCH 132/254] lrt and rtl divisions added --- chapters/fa/chapter3/2.mdx | 63 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 3b80ceb7e..2d97fbcdf 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -102,6 +102,7 @@ model.train_on_batch(batch, labels) کتابخانه دِیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و ذخیره‌سازی یک دِیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دِیتاسِت MRPC را به روش زیر دانلود کنیم: +
```py from datasets import load_dataset @@ -110,6 +111,10 @@ raw_datasets = load_dataset("glue", "mrpc") raw_datasets ``` +
+ +
+ ```python out DatasetDict({ train: Dataset({ @@ -127,18 +132,25 @@ DatasetDict({ }) ``` +
+ همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). این دستور دِیتاسِت را دانلود و به صورت پیش‌فرض در پوشه‌ي *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید پوشه‌ي ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک دیکشنری دسترسی پیدا کنیم: +
```py raw_train_dataset = raw_datasets["train"] raw_train_dataset[0] ``` +
+ +
+ ```python out {'idx': 0, 'label': 1, @@ -146,14 +158,20 @@ raw_train_dataset[0] 'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'} ``` +
می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت. +
```py raw_train_dataset.features ``` +
+ +
+ ```python out {'sentence1': Value(dtype='string', id=None), 'sentence2': Value(dtype='string', id=None), @@ -161,6 +179,7 @@ raw_train_dataset.features 'idx': Value(dtype='int32', id=None)} ``` +
در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent` و `1` مربوط به `equivalent` می‌باشد. @@ -178,6 +197,7 @@ raw_train_dataset.features به منظور پیش‌پردازش دِیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکِنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنِایزر بدهیم، در نتیجه می‌توانیم به طور مستقیم تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکِنایز کنیم: +
```py from transformers import AutoTokenizer @@ -188,14 +208,21 @@ tokenized_sentences_1 = tokenizer(raw_datasets["train"]["sentence1"]) tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"]) ``` +
+ با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند که متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکِنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده‌سازی کند: +
```py inputs = tokenizer("This is the first sentence.", "This is the second one.") inputs ``` +
+ +
+ ```python out { 'input_ids': [101, 2023, 2003, 1996, 2034, 6251, 1012, 102, 2023, 2003, 1996, 2117, 2028, 1012, 102], @@ -204,6 +231,7 @@ inputs } ``` +
در [فصل ۲](/course/chapter2) در مورد کلیدهای `input_ids` و `attention_mask` بحث کردیم، اما از گفتگو در مورد `token_type_ids` اجتناب کردیم. در این مثال این همان چیزی است که به مدل می‌گوید کدام بخش از ورودی جمله اول و کدام بخش جمله دوم است. @@ -215,29 +243,37 @@ inputs اگر شناسه‌های داخل `input_ids` را به کلمات رمزگشایی کنیم: +
```py tokenizer.convert_ids_to_tokens(inputs["input_ids"]) ``` +
خواهیم داشت: we will get: +
+ ```python out ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] ``` +
+ بنابراین می‌بینیم که مدل انتظار دارد وقتی که دو جمله داریم ورودی‌ها به صورت `[CLS] sentence1 [SEP] sentence2 [SEP]` باشند. +
```python out ['[CLS]', 'this', 'is', 'the', 'first', 'sentence', '.', '[SEP]', 'this', 'is', 'the', 'second', 'one', '.', '[SEP]'] [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1] ``` +
همانطور که می‌بینید، بخش‌هایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند اندیسِ نشان دهنده نوع توکِن آنها `0` و بخش‌هایی که مربوط به `sentence2 [SEP]` هستند اندیس نشان دهنده نوع توکِن‌شان `1` می‌باشد. @@ -251,6 +287,7 @@ we will get: اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکِنایز کردن کلِ دِیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دِیتاسِت `training` اینگونه می‌باشد: +
```py tokenized_dataset = tokenizer( @@ -261,17 +298,20 @@ tokenized_dataset = tokenizer( ) ``` +
این روش به خوبی کار می‌کند، اما مشکل‌اش این است که یک دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کلِ دِیتاسِت در حین توکِنایز کردن داشته باشید (در حالی که دِیتاسِت‌های موجود در پایگاه دِیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌می‌دارید). به منظور نگهداشتن داده به صورت یک دِیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیش‌تری علاوه‌بر توکِنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دِیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِنایز کند: +
```py def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) ``` +
این تابع یک دیکشنری (مثل اقلام داخل دِیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از جفت جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [هاگینگ‌فِیس Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. @@ -279,15 +319,18 @@ def tokenize_function(example): در اینجا نشان می‌دهیم چگونه تابع توکِنایزیشن را روی کل دِیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دِیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد: +
```py tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) tokenized_datasets ``` +
کتابخانه دِیتاسِت هاگینگ‌فِیس این پیش‌پردازش را با افزودن -فیلدهای- جدید به دِیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، اعمال می‌کند: +
```python out DatasetDict({ @@ -306,6 +349,8 @@ DatasetDict({ }) ``` +
+ شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکِنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکِنایز کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. @@ -332,6 +377,7 @@ DatasetDict({ {#if fw === 'pt'} +
```py from transformers import DataCollatorWithPadding @@ -339,9 +385,11 @@ from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer) ``` +
{:else} +
```py from transformers import DataCollatorWithPadding @@ -349,11 +397,13 @@ from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") ``` +
{/if} اجازه دهید چند نمونه از مجموعه `training`مان را که می‌خواهیم باهم بَتچ کنیم برداریم تا این ابزار جدید را امتحان کنیم. در اینجا ستون‌های `idx`، `sentence1` و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: +
```py samples = tokenized_datasets["train"][:8] @@ -361,22 +411,30 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se [len(x) for x in samples["input_ids"]] ``` +
+ +
+ ```python out [50, 59, 47, 67, 59, 50, 62, 32] ``` +
تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دِیتاسِت باید به اندازه بزرگ‌ترین طول یا بزرگ‌ترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: +
```py batch = data_collator(samples) {k: v.shape for k, v in batch.items()} ``` +
{#if fw === 'tf'} +
```python out {'attention_mask': TensorShape([8, 67]), @@ -385,9 +443,11 @@ batch = data_collator(samples) 'labels': TensorShape([8])} ``` +
{:else} +
```python out {'attention_mask': torch.Size([8, 67]), @@ -396,6 +456,7 @@ batch = data_collator(samples) 'labels': torch.Size([8])} ``` +
به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل‌مان می‌تواند با آنها کار کند، آماده هستیم برای کوک‌ کردن مدل: @@ -411,6 +472,7 @@ batch = data_collator(samples) توجه داشته باشید که ما دِیتاسِت‌مان و یک `collator` داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور دِیتاسِت‌تان می‌پیچد، با یک تابع `collation` دلخواه. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دِیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دِیتاسِت‌مان مشاهده کنیم! +
```py tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( @@ -430,6 +492,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` +
این هم از این! حالا می‌توانیم این دِیتاسِت‌ها را به درس بعدی ببریم، جایی که تعلیم پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. From 5753b150e81f824edf863d53cbc8baf21cc05ad7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 6 May 2022 13:20:34 +0200 Subject: [PATCH 133/254] remove unfinished translation from merge --- chapters/fa/chapter3/3_tf.mdx | 219 ---------------------------------- 1 file changed, 219 deletions(-) delete mode 100644 chapters/fa/chapter3/3_tf.mdx diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx deleted file mode 100644 index 9f0da034b..000000000 --- a/chapters/fa/chapter3/3_tf.mdx +++ /dev/null @@ -1,219 +0,0 @@ -
- - -# باز‌تنظیم یک مدل با استفاده از کِراس - -# Fine-tuning a model with Keras - - - -وقتی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر تنظیمات GPU ندارید، می‌توانید به GPUها یا TPUها مجانی روی [Google Colab](https://colab.research.google.com/) دسترسی داشته باشید. - -Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). - -نمونه کدِ‌های زیر فرض می‌کنند شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه جهت یادآوری آنچه نیاز دارید: - -The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: - -```py -from datasets import load_dataset -from transformers import AutoTokenizer, DataCollatorWithPadding -import numpy as np - -raw_datasets = load_dataset("glue", "mrpc") -checkpoint = "bert-base-uncased" -tokenizer = AutoTokenizer.from_pretrained(checkpoint) - - -def tokenize_function(example): - return tokenizer(example["sentence1"], example["sentence2"], truncation=True) - - -tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) - -data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") - -tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( - columns=["attention_mask", "input_ids", "token_type_ids"], - label_cols=["labels"], - shuffle=True, - collate_fn=data_collator, - batch_size=8, -) - -tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( - columns=["attention_mask", "input_ids", "token_type_ids"], - label_cols=["labels"], - shuffle=False, - collate_fn=data_collator, - batch_size=8, -) -``` - -### تعلیم - -مدل‌های تِنسورفلو که از ترَنسفورمِرهای هاگینگ‌فِیس وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. - -TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. - - - -آن به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار خیلی کمی لازم است تا تعلیم را روی آن شروع کنیم. - -That means that once we have our data, very little work is required to begin training on it. - - - -مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب استفاده خواهیم کرد: - -As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: - -```py -from transformers import TFAutoModelForSequenceClassification - -model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) -``` - -شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از نمونه‌سازیِ این مدل پیش‌تعلیم شما یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی جفت جمله‌ها پیش‌تعلیم نشده، بنابراین لایه-سر مدل پیش‌تعلیم حذف شده و یک لایه-سر مناسب جهت دسته بندی رشته‌‌ای به جای آن اضافه شده. هشدارها نشان می‌دهند که برخی از وزنها استفاده نشده‌اند (آنهایی که مربوط به لایه-سر جدید هستند) و برخی دیگر به صورت تصادفی مقدار‌دهی شده‌ند. (آنهایی که مربوط به لایه-سر پیش‌تعلیم حذف شده هستند). در نتیجه این شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان چیزی است که می‌خواهیم اکنون انجام دهیم. - -You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. - -برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای تعلیم را گزارش دهد، بعلاوه‌ی خطای تایید در انتهای هر epoch. - -To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. - - - -توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های Keras ندارند - آنها به صورت خودکار یک تابع خطای مناسب استفاده می‌کنند که آنرا به صورت داخلی محاسبه می‌کنند. اگر آرگومانی برای تابع خطا در زمان `compile()` تعیین نکنید آنها از این تابع خطا به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع خطای داخلی شما نیاز خواهید داشت که برچسب‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب مجزا، که روش معمول استفاده از برچسب‌ها در مدل‌های Keras می‌باشد. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع خطای درست می‌تواند تا اندازه‌ای گول‌زننده باشد. به هر حال، برای دسته‌بندی رشته‌‌ای، یک تابع خطای استانداد Keras به خوبی کار می‌کند، بنابراین آن چیزی است که ما در اینجا استفاده خواهیم کرد. - -Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. - - - -```py -from tensorflow.keras.losses import SparseCategoricalCrossentropy - -model.compile( - optimizer="adam", - loss=SparseCategoricalCrossentropy(from_logits=True), - metrics=["accuracy"], -) -model.fit( - tf_train_dataset, - validation_data=tf_validation_dataset, -) -``` - - - -Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. - - - -### Improving training performance - - - -If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause -is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes -that optimizer with default values for all parameters, including learning rate. From long experience, though, we know -that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written -as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. - -In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate -over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* -the learning rate. In Keras, the best way to do this is to use a *learning rate scheduler*. A good one to use is -`PolynomialDecay` — despite the name, with default settings it simply linearly decays the learning rate from the initial -value to the final value over the course of training, which is exactly what we want. In order to use a scheduler correctly, -though, we need to tell it how long training is going to be. We compute that as `num_train_steps` below. - -```py -from tensorflow.keras.optimizers.schedules import PolynomialDecay - -batch_size = 8 -num_epochs = 3 -# The number of training steps is the number of samples in the dataset, divided by the batch size then multiplied -# by the total number of epochs. Note that the tf_train_dataset here is a batched tf.data.Dataset, -# not the original Hugging Face Dataset, so its len() is already num_samples // batch_size. -num_train_steps = len(tf_train_dataset) * num_epochs -lr_scheduler = PolynomialDecay( - initial_learning_rate=5e-5, end_learning_rate=0.0, decay_steps=num_train_steps -) -from tensorflow.keras.optimizers import Adam - -opt = Adam(learning_rate=lr_scheduler) -``` - - - -The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. - - - -Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: - -```py -import tensorflow as tf - -model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) -loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) -model.compile(optimizer=opt, loss=loss, metrics=["accuracy"]) -``` - -Now, we fit again: - -```py -model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -``` - - - -💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) - - - -### Model predictions - - - - -Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. - -```py -preds = model.predict(tf_validation_dataset)["logits"] -``` - -We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: - -```py -class_preds = np.argmax(preds, axis=1) -print(preds.shape, class_preds.shape) -``` - -```python out -(408, 2) (408,) -``` - -Now, let's use those `preds` to compute some metrics! We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: - -```py -from datasets import load_metric - -metric = load_metric("glue", "mrpc") -metric.compute(predictions=class_preds, references=raw_datasets["validation"]["label"]) -``` - -```python out -{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} -``` - -The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. - -This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in Chapter 7. If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. - -
\ No newline at end of file From 42b81a4fec56db0d1579485b1b67325c3267b0c0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 8 May 2022 22:26:43 +0200 Subject: [PATCH 134/254] pulled G from upstream. --- chapters/fa/glossary/1.mdx | 63 +++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/chapters/fa/glossary/1.mdx b/chapters/fa/glossary/1.mdx index d2a216617..fe42e4885 100644 --- a/chapters/fa/glossary/1.mdx +++ b/chapters/fa/glossary/1.mdx @@ -54,7 +54,6 @@ | Windows | ویندوز | | macOS | سیستم‌عامل مک | | Distribution | توزیع | -| Distributed | توزیع شده | | Linux | لینوکس | | Workload | محاسبه، محاسبات | | Package Manager | پکیج‌منیجر | @@ -74,6 +73,68 @@ | Self-Contained | خودکفا | | Script | اسکریپت‌ | | Folder | پوشه | +| Neural Network | شبکه عصبی | +| Text | نوشته | +| Pipeline | خط تولید | +| Word | کلمه | +| Subword | زیرکلمه | +| Punctuation | علائم نگارشی | +| Symbol | علامت‌‌، علامت‌ها | +| Token | توکِن | +| Preprocess | پیش‌پردازش | +| Postprocess | پس‌پردازش | +| Method, as in code | تابع | +| Checkpoint | نقطه تعلیم؟ | +| Model Card | صفحه توضیحات مدل | +| Sentiment Analysis | تحلیل احساسات | +| Dictionary, as in Python | دیکشنری | +| List, as in code | لیست | +| Tensor | تِنسور | +| Framework | فریمورک | +| Flax | فلَکس | +| NumPy | NumPy | +| Scalar | عددی | +| Vector, as in math | برداری | +| Matrix | ماتریس | +| Instantiate | ساختن (یا ایجاد) نمونه | +| Argument, as in code | آرگومان | +| Key, as in Python dictionary | کلید | +| Row | ردیف | +| Integer | عدد صحیح | +| ID | شناسه | +| Unique ID | شناسه منحصر به فرد | +| Code Snippet | قطعه کد | +| Widget | ویجت | +| Hidden State | وضعیت پنهان | +| Feature, as in model | فیچر | +| High-Dimensional | بُعد بالا | +| Multi-Dimensional | چند بُعدی | +| Vector, as in Python | وِکتور | +| Sequence | رشته | +| Index, as in an array or list | اندیس | +| Project, as in math | پروجکت؟ | +| Embedding | embedding? | +| Tokenized | توکِن‌شده | +| Mask Filling | پر کردن جاهای خالی متن | +| Attention Mechanism | مکانیزم توجه | +| Classification | دسته‌بندی | +| Attribute, as for a class in code | ویژگی؟ | +| Label, as in classification | عنوان دسته | +| Prediction, as in nn model | پیش‌بینی | +| Bias | سوگیری | +| Logit, as in math and also in Pytorch | لوجیت؟ | +| SoftMax | سافت‌مکس | +| Loss Function | تابع هزینه | +| Activation Layer | لایه فعال‌سازی | +| Cross Entropy | آنتروپی متقابل | +| Head, as in model | سَر | +| Weight, as in model | وزن | +| Weights, as in model | وزن‌ها | +| Set, as for variable | تخصیص مقدار | +| Environment Variable | متغیر محیطی | +| Metadata | متادیتا | +| Encode, not as in cypher | کد شده؟، کد گذاری؟ | +| Cache | انبار کردن | معادل‌هایی که استفاده نمی‌کنیم: From db01f41ee41f14b45cf6bcb8677f3b67e7ef96f0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 9 May 2022 08:19:05 +0200 Subject: [PATCH 135/254] some comments applied --- chapters/fa/_toctree.yml | 4 +-- chapters/fa/chapter3/1.mdx | 7 +++--- chapters/fa/chapter3/2.mdx | 50 ++++++++++++++++++++------------------ 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/chapters/fa/_toctree.yml b/chapters/fa/_toctree.yml index 454df675c..f785fe42c 100644 --- a/chapters/fa/_toctree.yml +++ b/chapters/fa/_toctree.yml @@ -24,14 +24,12 @@ - local: chapter4/2 title: بکارگیری مدل‌های از پیش تعلیم دیده -- title: 3. بازتنظیمِ یک مدل از پیش‌تعلیم دیده # Translate this! +- title: 3. کوک کردن یک مدل از پیش تعلیم دیده # Translate this! sections: - local: chapter3/1 title: مقدمه # Translate this! - local: chapter3/2 title: پردازش داده # Translate this! - - local: chapter3/3 - title: باز‌تنظیم یک مدل با استفاده از Trainer-API یا کِراس # Translate this! local_fw: { pt: chapter3/3, tf: chapter3/3_tf } - title: واژه‌نامه diff --git a/chapters/fa/chapter3/1.mdx b/chapters/fa/chapter3/1.mdx index 6b3879845..b3f520423 100644 --- a/chapters/fa/chapter3/1.mdx +++ b/chapters/fa/chapter3/1.mdx @@ -1,20 +1,21 @@ -
+
+ # مقدمه در [فصل ۲](/course/chapter2) نحوه استفاده از توکِنایزرها و مدل‌های از پیش تعلیم دیده را جهت انجام پیش‌بینی‌های جدید بررسی کردیم. اما چگونه می‌توانید یک مدل از پیش‌ تعلیم دیده را خودتان کوک‌ کنید؟ {#if fw === 'pt'} -* چگونه دِیتاسِت‌های بزرگ را از هاب تهیه کنید +* چگونه دیتاسِت‌های بزرگ را از هاب تهیه کنید * چگونه از `API` سطح بالای `Trainer` برای کوک کردن مدل استفاده کنید * چگونه یک چرخه‌ تعلیم دلخواه درست کنید * چگونه از کتابخانه `Accelerate` هاگینگ‌فِیس برای اجرای چرخه‌ تعلیم دلخواه در هر نوع تنظیمات توزیع شده‌ای استفاده کنید {:else} -* چگونه دِیتاسِت‌های بزرگ را از هاب تهیه کنید +* چگونه دیتاسِت‌های بزرگ را از هاب تهیه کنید * چگونه از کِراس برای کوک‌ کردن مدل استفاده کنید * چگونه از کِراس برای استخراج پیش‌بینی‌ها استفاده کنید * چگونه از مِتریک دلخواه استفاده کنید diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 2d97fbcdf..d0fec0593 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -86,11 +86,11 @@ model.train_on_batch(batch, labels) {/if} -البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای به دست آوردن نتایج بهتر نیاز به آماده‌سازی دِیتاسِت بزرگتری خواهید داشت. +البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای به دست آوردن نتایج بهتر نیاز به آماده‌سازی دیتاسِت بزرگتری خواهید داشت. -در این بخش ما از دِیتاسِت MRPC (Microsoft Research Paraphrase Corpus) که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دِیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دِیتاسِت این است که دِیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. +در این بخش ما از دیتاسِت MRPC[1^] که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دیتاسِت این است که دیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. -### بارگذاری دِیتاسِت‌ها از هاب +### بارگذاری دیتاسِت‌ها از هاب {#if fw === 'pt'} @@ -98,9 +98,9 @@ model.train_on_batch(batch, labels) {/if} -هاب تنها شامل مدل‌ها نمی‌باشد؛ بلکه شامل دِیتاسِت‌های متعدد در بسیاری از زبان‌های مختلف می‌باشد. شما می‌توانید دِیتاسِت‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک دِیتاسِت جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی دِیتاسِت MRPC تمرکز کنیم! این یکی از ۱۰ دِیتاسِت [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدل‌های یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. +هاب تنها شامل مدل‌ها نمی‌باشد؛ بلکه شامل دیتاسِت‌های متعدد در بسیاری از زبان‌های مختلف می‌باشد. شما می‌توانید دیتاسِت‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک دیتاسِت جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی دیتاسِت MRPC تمرکز کنیم! این یکی از ۱۰ دیتاسِت [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدل‌های یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. -کتابخانه دِیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و ذخیره‌سازی یک دِیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دِیتاسِت MRPC را به روش زیر دانلود کنیم: +کتابخانه دیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و ذخیره‌سازی یک دیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دیتاسِت MRPC را به روش زیر دانلود کنیم:
@@ -136,9 +136,9 @@ DatasetDict({ همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). - این دستور دِیتاسِت را دانلود و به صورت پیش‌فرض در پوشه‌ي *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید پوشه‌ي ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور دیتاسِت را دانلود و به صورت پیش‌فرض در پوشه‌ *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید پوشه‌ ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. -ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس گذاری, مانند یک دیکشنری دسترسی پیدا کنیم: +ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس, مانند یک دیکشنری دسترسی پیدا کنیم:
@@ -160,7 +160,7 @@ raw_train_dataset[0]
-می‌بینم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت. +می‌بینیم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت.
@@ -181,13 +181,13 @@ raw_train_dataset.features
-در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ي *names* ذخیره شده است. `0` مربوط به `not_equivalent` و `1` مربوط به `equivalent` می‌باشد. +در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ *names* ذخیره شده است. `0` مربوط به `not_equivalent` و `1` مربوط به `equivalent` می‌باشد. ✏️ **امتحان کنید!** عنصر شماره ۱۵ از مجموعه `training` و عنصر شماره ۸۷ از مجموعه `validation` را مشاهده کنید. برچسب‌های آنها چیست؟ -### پیش‌پردازشِ دِیتاسِت‌‌ها +### پیش‌پردازشِ دیتاسِت‌‌ها {#if fw === 'pt'} @@ -195,7 +195,7 @@ raw_train_dataset.features {/if} -به منظور پیش‌پردازش دِیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکِنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنِایزر بدهیم، در نتیجه می‌توانیم به طور مستقیم تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکِنایز کنیم: +به منظور پیش‌پردازش دیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکِنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنِایزر بدهیم، در نتیجه می‌توانیم به طور مستقیم تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکِنایز کنیم:
@@ -285,7 +285,7 @@ we will get: در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکِنایز شده خود باشید: مادامی که از نقطه تعلیم یکسان برای توکِنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکِنایزر می‌داند چه چیزی برای مدل فراهم کند. -اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکِنایز کردن کلِ دِیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دِیتاسِت `training` اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکِنایز کردن کلِ دیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دیتاسِت `training` اینگونه می‌باشد:
@@ -300,9 +300,9 @@ tokenized_dataset = tokenizer(
-این روش به خوبی کار می‌کند، اما مشکل‌اش این است که یک دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کلِ دِیتاسِت در حین توکِنایز کردن داشته باشید (در حالی که دِیتاسِت‌های موجود در پایگاه دِیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌می‌دارید). +این روش به خوبی کار می‌کند، اما مشکل‌اش این است که یک دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کلِ دیتاسِت در حین توکِنایز کردن داشته باشید (در حالی که دیتاسِت‌های موجود در پایگاه دیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌می‌دارید). -به منظور نگهداشتن داده به صورت یک دِیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیش‌تری علاوه‌بر توکِنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دِیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِنایز کند: +به منظور نگهداشتن داده به صورت یک دیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیش‌تری علاوه‌بر توکِنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِنایز کند:
@@ -313,11 +313,11 @@ def tokenize_function(example):
-این تابع یک دیکشنری (مثل اقلام داخل دِیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از جفت جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [هاگینگ‌فِیس Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. +این تابع یک دیکشنری (مثل اقلام داخل دیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از جفت جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [هاگینگ‌فِیس Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. -توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` را زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دِیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. +توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` را زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. -در اینجا نشان می‌دهیم چگونه تابع توکِنایزیشن را روی کل دِیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دِیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد: +در اینجا نشان می‌دهیم چگونه تابع توکِنایزیشن را روی کل دیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد:
@@ -328,7 +328,7 @@ tokenized_datasets
-کتابخانه دِیتاسِت هاگینگ‌فِیس این پیش‌پردازش را با افزودن -فیلدهای- جدید به دِیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، اعمال می‌کند: +کتابخانه دیتاسِت هاگینگ‌فِیس این پیش‌پردازش را با افزودن -فیلدهای- جدید به دیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، اعمال می‌کند:
@@ -354,7 +354,7 @@ DatasetDict({ شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکِنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکِنایز کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. -تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask` و `token_type_ids`، برمی‌گرداند به گونه‌ای که این سه فیلد به همه بخش‌های دِیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دِیتاسِت که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. +تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask` و `token_type_ids`، برمی‌گرداند به گونه‌ای که این سه فیلد به همه بخش‌های دیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دیتاسِت که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. @@ -373,7 +373,7 @@ DatasetDict({ {/if} -برای انجام این کار در عمل، ما باید یک تابع `collate` تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دِیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهند. این تابع به محض اینکه آنرا تعریف کنیم (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام این کار در عمل، ما باید یک تابع `collate` تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهند. این تابع به محض اینکه آنرا تعریف کنیم (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} @@ -421,7 +421,7 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se
-تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دِیتاسِت باید به اندازه بزرگ‌ترین طول یا بزرگ‌ترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: +تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دیتاسِت باید به اندازه بزرگ‌ترین طول یا بزرگ‌ترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند:
@@ -464,13 +464,13 @@ batch = data_collator(samples) -✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی دِیتاسِت GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. +✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی دیتاسِت GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. {#if fw === 'tf'} -توجه داشته باشید که ما دِیتاسِت‌مان و یک `collator` داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور دِیتاسِت‌تان می‌پیچد، با یک تابع `collation` دلخواه. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دِیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دِیتاسِت‌مان مشاهده کنیم! +توجه داشته باشید که ما دیتاسِت‌مان و یک `collator` داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور دیتاسِت‌تان می‌پیچد، با یک تابع `collation` دلخواه. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دیتاسِت‌مان مشاهده کنیم!
@@ -494,8 +494,10 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset(
-این هم از این! حالا می‌توانیم این دِیتاسِت‌ها را به درس بعدی ببریم، جایی که تعلیم پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. +این هم از این! حالا می‌توانیم این دیتاسِت‌ها را به درس بعدی ببریم، جایی که تعلیم پس از همه سختی‌های پیش‌پردازش به طرز خوشایندی سرراست خواهد بود. {/if} +[^1]: Microsoft Research Paraphrase Corpus +
\ No newline at end of file From 888da94645609a100afc212947367022ffa69c22 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 9 May 2022 08:23:39 +0200 Subject: [PATCH 136/254] some comments applied --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index d0fec0593..3b1102fe1 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -88,7 +88,7 @@ model.train_on_batch(batch, labels) البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای به دست آوردن نتایج بهتر نیاز به آماده‌سازی دیتاسِت بزرگتری خواهید داشت. -در این بخش ما از دیتاسِت MRPC[1^] که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دیتاسِت این است که دیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. +در این بخش ما از دیتاسِت MRPC[^1] که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دیتاسِت این است که دیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. ### بارگذاری دیتاسِت‌ها از هاب From f405cff611cb0b02a5ed73c0c553903e26664d63 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 9 May 2022 08:24:42 +0200 Subject: [PATCH 137/254] some comments applied --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 3b1102fe1..dd49018e0 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -88,7 +88,7 @@ model.train_on_batch(batch, labels) البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای به دست آوردن نتایج بهتر نیاز به آماده‌سازی دیتاسِت بزرگتری خواهید داشت. -در این بخش ما از دیتاسِت MRPC[^1] که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دیتاسِت این است که دیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. +در این بخش ما از دیتاسِت [^1]MRPC که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دیتاسِت این است که دیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. ### بارگذاری دیتاسِت‌ها از هاب From 7c0eee286262358c38540b4f51e7e270ed776a13 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 9 May 2022 08:25:38 +0200 Subject: [PATCH 138/254] some comments applied --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index dd49018e0..d98c3646c 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -88,7 +88,7 @@ model.train_on_batch(batch, labels) البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای به دست آوردن نتایج بهتر نیاز به آماده‌سازی دیتاسِت بزرگتری خواهید داشت. -در این بخش ما از دیتاسِت [^1]MRPC که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دیتاسِت این است که دیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. +در این بخش ما از دیتاسِت MRPC [^1]که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دیتاسِت این است که دیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. ### بارگذاری دیتاسِت‌ها از هاب From 5189d1aa03f4f58f93ec40b78e179e2147530a6f Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 9 May 2022 08:26:01 +0200 Subject: [PATCH 139/254] some comments applied --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index d98c3646c..3b1102fe1 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -88,7 +88,7 @@ model.train_on_batch(batch, labels) البته تعلیم با استفاده از دو جمله به نتایج چشم‌گیری منتهی نخواهد شد. برای به دست آوردن نتایج بهتر نیاز به آماده‌سازی دیتاسِت بزرگتری خواهید داشت. -در این بخش ما از دیتاسِت MRPC [^1]که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دیتاسِت این است که دیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. +در این بخش ما از دیتاسِت MRPC[^1] که در یک [مقاله](https://www.aclweb.org/anthology/I05-5002.pdf)، نوشته‌ی ویلیام بی دالن و کریس براکت، معرفی شده به عنوان یک مثال استفاده خواهیم کرد. این دیتاسِت شامل ۵۸۰۱ جفت جمله و یک برچسب می‌باشد که برچسب نشان دهنده متناظر بودن جملات می‌باشد (به عنوان مثال اینکه آیا دو جمله معنی یکسانی دارند یا خیر). علت انتخاب این دیتاسِت این است که دیتاسِت کوچکی است و تجربه تعلیم روی آن آسان است. ### بارگذاری دیتاسِت‌ها از هاب From 73c5ddee04e059a89023c61c3a135912a22c469e Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 9 May 2022 12:39:51 +0200 Subject: [PATCH 140/254] multiple comments applied --- chapters/fa/chapter3/2.mdx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 3b1102fe1..69b7e6b3e 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -160,7 +160,7 @@ raw_train_dataset[0]
-می‌بینیم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین مجبور نیستیم هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدارِ عددیِ صحیح به کدام برچسب مربوط می‌شود، می‌توانیم ویژگی‌های ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت. +می‌بینیم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین لازم نیست هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، می‌توانیم قابلیت‌های ‌`raw_train_dataset`‌ را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت.
@@ -181,13 +181,13 @@ raw_train_dataset.features
-در پشت صحنه، `برچسب` از نوع `برچسبِ کلاس` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ *names* ذخیره شده است. `0` مربوط به `not_equivalent` و `1` مربوط به `equivalent` می‌باشد. +در پشت صحنه، `label` از نوع `ClassLabel` می‌باشد، و نگاشت اعداد صحیح به نام برچسب در پوشه‌ *names* ذخیره شده است. `0` مربوط به `not_equivalent` و `1` مربوط به `equivalent` می‌باشد. ✏️ **امتحان کنید!** عنصر شماره ۱۵ از مجموعه `training` و عنصر شماره ۸۷ از مجموعه `validation` را مشاهده کنید. برچسب‌های آنها چیست؟ -### پیش‌پردازشِ دیتاسِت‌‌ها +### پیش‌پردازش دیتاسِت‌‌ها {#if fw === 'pt'} @@ -275,17 +275,17 @@ we will get:
-همانطور که می‌بینید، بخش‌هایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند اندیسِ نشان دهنده نوع توکِن آنها `0` و بخش‌هایی که مربوط به `sentence2 [SEP]` هستند اندیس نشان دهنده نوع توکِن‌شان `1` می‌باشد. +همانطور که می‌بینید، بخش‌هایی از ورودی که مربوط به `[CLS] sentence1 [SEP]` هستند اندیس نشان دهنده نوع توکِن آنها `0` و بخش‌هایی که مربوط به `sentence2 [SEP]` هستند اندیس نشان دهنده نوع توکِن‌شان `1` می‌باشد. -توجه داشته باشید که اگر نقطه تعلیمِ متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. +توجه داشته باشید که اگر نقطه تعلیم متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. -در اینجا، مدل BERT با آیدی‌هایی که نشان دهنده نوعِ توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبانِ ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ بر عهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. +در اینجا، مدل BERT با آیدی‌هایی که نشان دهنده نوع توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبان ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ بر عهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالت‌ها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکِنایز شده خود باشید: مادامی که از نقطه تعلیم یکسان برای توکِنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکِنایزر می‌داند چه چیزی برای مدل فراهم کند. -اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکِنایز کردن کلِ دیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازشِ دیتاسِت `training` اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکِنایز کردن کل دیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازش دیتاسِت `training` اینگونه می‌باشد:
@@ -300,7 +300,7 @@ tokenized_dataset = tokenizer(
-این روش به خوبی کار می‌کند، اما مشکل‌اش این است که یک دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کلِ دیتاسِت در حین توکِنایز کردن داشته باشید (در حالی که دیتاسِت‌های موجود در پایگاه دیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌می‌دارید). +این روش به خوبی کار می‌کند، اما مشکل‌اش این است که یک دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دیتاسِت در حین توکِنایز کردن داشته باشید (در حالی که دیتاسِت‌های موجود در پایگاه دیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌می‌دارید). به منظور نگهداشتن داده به صورت یک دیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیش‌تری علاوه‌بر توکِنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِنایز کند: @@ -421,7 +421,7 @@ samples = {k: v for k, v in samples.items() if k not in ["idx", "sentence1", "se
-تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دیتاسِت باید به اندازه بزرگ‌ترین طول یا بزرگ‌ترین طولِ قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند: +تعجبی ندارد که نمونه‌هایی با طول‌های متغییر، از ۳۲ تا ۶۷ بدست می‌آوریم. هم‌طول‌سازی پویا به این معنی است که نمونه‌های موجود در این بَتچ باید همگی با طول ۶۷، که بزرگترین طول داخل بَتچ می‌باشد، هم‌طول شده باشند. بدون هم‌طول‌سازی پویا، همه نمونه‌ها در کل دیتاسِت باید به اندازه بزرگ‌ترین طول یا بزرگ‌ترین طول قابل پذیرش برای مدل، هم‌طول شوند. اجازه دهید بررسی کنیم آیا `data_collator` ما بَتچ را به درستی هم‌طول می‌کند:
From 840c8e43760b7d187e8783aa5b3ae149267bc787 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 12 May 2022 23:33:49 +0200 Subject: [PATCH 141/254] multiple review comments applied --- chapters/fa/chapter3/2.mdx | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 69b7e6b3e..fd134ebe6 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -195,7 +195,7 @@ raw_train_dataset.features {/if} -به منظور پیش‌پردازش دیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکِنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکنِایزر بدهیم، در نتیجه می‌توانیم به طور مستقیم تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکِنایز کنیم: +به منظور پیش‌پردازش دیتاسِت‌، لازم است متن را به اعدادی قابل پردازش برای مدل تبدیل کنیم. همانطور که در[فصل قبل](/course/chapter2) مشاهده کردید، این کار با استفاده از یک توکِنایزر انجام می‌شود. ما می‌توانیم یک یا چند جمله را به توکِنایزر بدهیم، در نتیجه می‌توانیم به طور مستقیم تمام جملات اول و دوم هر جفت جمله را به صورت زیر توکِن کنیم:
@@ -210,7 +210,7 @@ tokenized_sentences_2 = tokenizer(raw_datasets["train"]["sentence2"])
-با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند که متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم، و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکِنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده‌سازی کند: +با این حال، نمی‌توانیم دو جمله را به مدل ارسال کنیم تا پیش‌بینی کند که متناظر هستند یا خیر. ما نیاز داریم با دو رشته به صورت یک جفت برخورد کنیم و پیش‌پردازش مناسب را به آن اعمال کنیم. خوشبختانه، توکِنایزر می‌تواند یک جفت رشته را دریافت کند و آنرا به گونه‌ای که مدل BERT ما انتظار دارد آماده‌سازی کند:
@@ -237,11 +237,11 @@ inputs -✏️ **امتحان کنید!** عنصر شماره ۱۵ از مجموعه `training` را بردارید و دو جمله را به صورت جداگانه و جفت توکِنایز کنید. تفاوت دو نتیجه چیست؟ +✏️ **امتحان کنید!** عنصر شماره ۱۵ از مجموعه `training` را بردارید و دو جمله را به صورت جداگانه و جفت توکِن کنید. تفاوت دو نتیجه چیست؟ -اگر شناسه‌های داخل `input_ids` را به کلمات رمزگشایی کنیم: +اگر شناسه‌های داخل `input_ids` را به کلمات کدگشایی کنیم:
@@ -253,9 +253,6 @@ tokenizer.convert_ids_to_tokens(inputs["input_ids"]) خواهیم داشت: -we will get: - -
```python out @@ -279,13 +276,13 @@ we will get: توجه داشته باشید که اگر نقطه تعلیم متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. -در اینجا، مدل BERT با آیدی‌هایی که نشان دهنده نوع توکن هستند پیش‌تعلیم شده، و علاوه بر هدف مدل سازی زبان ماسکی که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ی دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ بر عهده دارد. هدف از این وظیفه مدل کردن رابطه بین جفت جمله‌ها می‌باشد. +در اینجا، مدل BERT با شناسه‌هایی که نشان دهنده نوع توکِن هستند از پیش‌ تعلیم دیده و علاوه بر هدف تکمیل جاهای خالی متن که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ بر عهده دارد. هدف از این وظیفه مدل کردن رابطه بین دو جمله می‌باشد. - در روش پیش‌بینی جمله بعدی، جفت جملاتی (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای خارج کردن مسئله از حالت بدیهی، در نیمی از حالت‌ها دوجمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. + در پیش‌بینی جمله بعدی، لیستی از جمله‌های جفت شده (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای سخت‌تر کردن مسئله، در نیمی از حالت‌ها دو جمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. -در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکِنایز شده خود باشید: مادامی که از نقطه تعلیم یکسان برای توکِنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکِنایزر می‌داند چه چیزی برای مدل فراهم کند. +در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکِن شده خود باشید: مادامی که از نقطه تعلیم یکسان برای توکِنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکِنایزر می‌داند چه چیزی برای مدل فراهم کند. -اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با یک جفت جمله برخورد کند، می‌توانیم آنرا برای توکِنایز کردن کل دیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازش دیتاسِت `training` اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با دو جمله برخورد کند، می‌توانیم آن را برای توکِن کردن کل دیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازش دیتاسِت `training` اینگونه می‌باشد:
@@ -300,9 +297,9 @@ tokenized_dataset = tokenizer(
-این روش به خوبی کار می‌کند، اما مشکل‌اش این است که یک دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids`, و مقادیر آنها که مجموعه‌ای از مجموعه‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دیتاسِت در حین توکِنایز کردن داشته باشید (در حالی که دیتاسِت‌های موجود در پایگاه دیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌می‌دارید). +این روش به خوبی کار می‌کند، اما مشکل‌اش این است که دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids` و مقادیر آنها که لیست‌هایی از لیست‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دیتاسِت در حین توکِن کردن داشته باشید (در حالی که دیتاسِت‌های موجود در پایگاه دیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌ می‌دارید). -به منظور نگهداشتن داده به صورت یک دیتاسِت، از تابع [`()Dataset.map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیش‌تری علاوه‌بر توکِنایز کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِنایز کند: +به منظور نگه داشتن داده به صورت یک دیتاسِت، از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکِن کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِن کند:
@@ -313,9 +310,9 @@ def tokenize_function(example):
-این تابع یک دیکشنری (مثل اقلام داخل دیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از جفت جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان مجموعه‌ای از جملات) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [هاگینگ‌فِیس Tokenizers](https://github.com/huggingface/tokenizers) که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. +این تابع دیکشنری (مثل اقلام داخل دیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از دو جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان لیستی از جمله‌ها) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [Tokenizers](https://github.com/huggingface/tokenizers) از هاگینگ‌فِیس که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. -توجه داشته باشید که ما مبحث `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام `padding` روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که `padding` را زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. +توجه داشته باشید که ما آرگومان `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام padding روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که padding را زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. در اینجا نشان می‌دهیم چگونه تابع توکِنایزیشن را روی کل دیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد: @@ -351,7 +348,7 @@ DatasetDict({
-شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکِنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکِنایز کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. +شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکِنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکِن کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask` و `token_type_ids`، برمی‌گرداند به گونه‌ای که این سه فیلد به همه بخش‌های دیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دیتاسِت که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. From a1e7c0804d78a176314004984eaf9108f3afcade Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 17 May 2022 08:58:49 +0200 Subject: [PATCH 142/254] review changes applied --- chapters/fa/chapter3/2.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index fd134ebe6..564fff30d 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -312,7 +312,7 @@ def tokenize_function(example): این تابع دیکشنری (مثل اقلام داخل دیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از دو جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان لیستی از جمله‌ها) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [Tokenizers](https://github.com/huggingface/tokenizers) از هاگینگ‌فِیس که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. -توجه داشته باشید که ما آرگومان `padding` را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که انجام padding روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که padding را زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم که `padding` را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. +توجه داشته باشید که ما آرگومان هم‌طول‌سازی را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که هم‌طول‌سازی روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که آن را زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم هم‌طول‌سازی را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. در اینجا نشان می‌دهیم چگونه تابع توکِنایزیشن را روی کل دیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد: @@ -362,7 +362,7 @@ DatasetDict({ {#if fw === 'pt'} -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش‌ فرض تابعی است که نمونه‌های شما را به ماتریس پایتورچ تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان‌پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPUها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. +تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش‌ فرض تابعی است که نمونه‌های شما را به ماتریس پایتورچ تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان‌پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPUها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. {:else} @@ -370,7 +370,7 @@ DatasetDict({ {/if} -برای انجام این کار در عمل، ما باید یک تابع `collate` تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهند. این تابع به محض اینکه آنرا تعریف کنیم (یعنی تعیین کنیم چه توکنی برای هم‌طول‌سازی استفاده کند و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام این کار در عمل، ما باید یک تابع `collate` تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} @@ -467,7 +467,7 @@ batch = data_collator(samples) {#if fw === 'tf'} -توجه داشته باشید که ما دیتاسِت‌مان و یک `collator` داده در اختیار داریم، حال نیاز داریم که آنها را کنار هم قرار دهیم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، یک روش ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این روش یک `tf.data.Dataset` را دور دیتاسِت‌تان می‌پیچد، با یک تابع `collation` دلخواه. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دیتاسِت‌مان مشاهده کنیم! +اکنون که دیتاسِت‌مان و یک `collator` داده در اختیار داریم، حال نیاز داریم که آنها را باهم بکار ببریم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، تابعی ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این تابع یک `tf.data.Dataset` شامل پارامتری اختیاری برای تابع `collation` را دور دیتاسِت‌تان می‌پیچد. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دیتاسِت‌مان مشاهده کنیم!
From e9d680915fb35607f8e2fa951354badfcfe595cc Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 18 May 2022 08:21:35 +0200 Subject: [PATCH 143/254] review coments applied --- chapters/fa/chapter3/2.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 564fff30d..b0746be86 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -312,9 +312,9 @@ def tokenize_function(example): این تابع دیکشنری (مثل اقلام داخل دیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از دو جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان لیستی از جمله‌ها) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [Tokenizers](https://github.com/huggingface/tokenizers) از هاگینگ‌فِیس که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. -توجه داشته باشید که ما آرگومان هم‌طول‌سازی را در حال حاضر کنار گذاشته‌ایم. این به این خاطر است که هم‌طول‌سازی روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که آن را زمانی که در حال ساختن بَتچ هستیم روی نمونه‌ها انجام دهیم، چرا که آنوقت فقط نیاز داریم هم‌طول‌سازی را روی همان بَتچ انجام دهیم، و نه بیشترین طول در سرتاسر دیتاسِت. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. +توجه داشته باشید که ما آرگومان هم‌طول‌سازی را در تابع توکِن کننده‌مان نادیده گرفته‌ایم. این به این خاطر است که هم‌طول‌سازی روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که نمونه‌ها را زمانی که در حال ساختن بَتچ هستیم هم‌طول کنیم، در این صورت فقط نیاز داریم نمونه‌ها را به اندازه بزرگترین طول همان بَتچ و نه بیشترین طول در سرتاسر دیتاسِت‌ هم‌طول کنیم. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. -در اینجا نشان می‌دهیم چگونه تابع توکِنایزیشن را روی کل دیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد: +در اینجا نشان می‌دهیم چگونه تابع تولید توکِن را روی کل دیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد:
@@ -353,7 +353,7 @@ DatasetDict({ تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask` و `token_type_ids`، برمی‌گرداند به گونه‌ای که این سه فیلد به همه بخش‌های دیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دیتاسِت که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. -آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را باهم بَتچ می‌کنیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. +آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را با هم در یک بَتچ قرار می‌دهیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. ### هم‌طول‌سازی پویا @@ -366,11 +366,11 @@ DatasetDict({ {:else} -تابعی که مسئول کنارهم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. `collator` پیش‌فرض تابعی است که فقط نمونه‌های شما را به `tf.Tensor` تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌ها ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPUها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. +تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. `collator` پیش‌فرض تابعی است که فقط نمونه‌های شما را به `tf.Tensor` تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما فرایند هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آن را روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش، فرایند تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید این کار می‌تواند مشکل ساز باشد چرا که TPU اشکال معین را ترجیح می‌دهد، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. {/if} -برای انجام این کار در عمل، ما باید یک تابع `collate` تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم بَتچ کنیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار میدهد. این تابع به محض اینکه آنرا تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و اینکه مدل انتظار هم‌طول‌سازی از سمت چپ ورودی‌ها را داشته باشد یا از سمت راست آنها) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام این کار در عمل، ما باید یک تابع مرتب کننده تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم در یک بَتچ قرار دهیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار می‌دهد. این تابع به محض این که آن را تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و مدل انتظار هم‌طول‌سازی از سمت چپ یا راست ورودی‌ها را داشته باشد) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} @@ -398,7 +398,7 @@ data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf" {/if} -اجازه دهید چند نمونه از مجموعه `training`مان را که می‌خواهیم باهم بَتچ کنیم برداریم تا این ابزار جدید را امتحان کنیم. در اینجا ستون‌های `idx`، `sentence1` و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ: +اجازه دهید چند نمونه از مجموعه `training` را که می‌خواهیم باهم در یک بَتچ قرار دهیم برداریم تا این ابزار جدید را امتحان کنیم. در اینجا ستون‌های `idx`، `sentence1` و `sentence2` را حذف می‌کنیم چرا که احتیاج نخواهند شد و شامل رشته‌های متنی می‌شوند (که ما نمی‌توانیم تنسورهایی از رشته‌های متنی ایجاد کنیم) و سپس نگاهی می‌اندازیم به طول هر ورودی در هر بَتچ:
From 58f52079c6decb876235700b638620a09c827222 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 19 May 2022 09:22:01 +0200 Subject: [PATCH 144/254] review coments applied --- chapters/fa/chapter3/2.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index b0746be86..c9601b3e1 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -276,13 +276,13 @@ tokenizer.convert_ids_to_tokens(inputs["input_ids"]) توجه داشته باشید که اگر نقطه تعلیم متفاوتی را انتخاب کنید، در ورودی‌ها لزوما `token_type_ids` نخواهید داشت (به عنوان مثال، اگر از یک DistilBERT استفاده کنید آنها بازگردانده نخواهند شد). آنها فقط زمانی بازگردانده می‌شوند که مدل می‌داند با آنها چکار کند، به این خاطر که آنها را در زمان پیش‌تعلیم دیده است. -در اینجا، مدل BERT با شناسه‌هایی که نشان دهنده نوع توکِن هستند از پیش‌ تعلیم دیده و علاوه بر هدف تکمیل جاهای خالی متن که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ دیگری تحت عنوان _پیش‌بینی جمله‌ی بعدی_ بر عهده دارد. هدف از این وظیفه مدل کردن رابطه بین دو جمله می‌باشد. +در اینجا، مدل BERT با شناسه‌هایی که نشان دهنده نوع توکِن هستند از پیش‌ تعلیم دیده و علاوه بر هدف تکمیل جاهای خالی متن که در [فصل ۱](/course/chapter1) در مورد آن صحبت کردیم وظیفه‌ دیگری تحت عنوان _پیش‌بینی جمله‌ بعدی_ بر عهده دارد. هدف از این وظیفه مدل کردن رابطه بین جملات جفتی می‌باشد. در پیش‌بینی جمله بعدی، لیستی از جمله‌های جفت شده (با کلماتی که به طور تصادفی پنهان شده‌اند) به مدل داده می‌شوند و از مدل خواسته می‌شود پیش‌بینی کند که آیا جمله دوم در ادامه‌ جمله‌ اول قرار دارد یا خیر. برای سخت‌تر کردن مسئله، در نیمی از حالت‌ها دو جمله در متن اصلی به دنبال هم آمده‌، و در نیمی دیگر از دو متن متفاوت می‌آیند. در مجموع، نیازی نیست نگران وجود یا عدم وجود `token_type_ids` در ورودی‌های توکِن شده خود باشید: مادامی که از نقطه تعلیم یکسان برای توکِنایزر و مدل استفاده کنید، همه چیز خوب پیش خواهد رفت چرا که توکِنایزر می‌داند چه چیزی برای مدل فراهم کند. -اکنون که مشاهده کردیم چگونه توکِنایزر ما می‌تواند با دو جمله برخورد کند، می‌توانیم آن را برای توکِن کردن کل دیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازش دیتاسِت `training` اینگونه می‌باشد: +اکنون که مشاهده کردیم چگونه توکِن کننده ما می‌تواند با دو جمله برخورد کند، می‌توانیم آن را برای توکِن کردن کل دیتاسِت‌مان به کار ببریم: مانند [فصل قبل](/course/chapter2)، ما می‌توانیم توکِنایزر را با لیستی از جفت جمله‌ها، با دادن لیست جملات اول و سپس لیست جملات دوم، تغذیه کنیم. این روش همچنین با گزینه‌های `padding` و `truncation` که در [فصل ۲](/course/chapter2) مشاهده کردیم سازگاری دارد. بنابراین، یک روش برای پیش‌پردازش دیتاسِت `training` اینگونه می‌باشد:
@@ -310,11 +310,11 @@ def tokenize_function(example):
-این تابع دیکشنری (مثل اقلام داخل دیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از دو جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان لیستی از جمله‌ها) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این توکِنایزر با توکِنایزری در کتابخانه [Tokenizers](https://github.com/huggingface/tokenizers) از هاگینگ‌فِیس که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. +این تابع دیکشنری (مثل اقلام داخل دیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از دو جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان لیستی از جمله‌ها) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این `tokenizer` با توکِنایزری در کتابخانه [Tokenizers](https://github.com/huggingface/tokenizers) از هاگینگ‌فِیس که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. توجه داشته باشید که ما آرگومان هم‌طول‌سازی را در تابع توکِن کننده‌مان نادیده گرفته‌ایم. این به این خاطر است که هم‌طول‌سازی روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که نمونه‌ها را زمانی که در حال ساختن بَتچ هستیم هم‌طول کنیم، در این صورت فقط نیاز داریم نمونه‌ها را به اندازه بزرگترین طول همان بَتچ و نه بیشترین طول در سرتاسر دیتاسِت‌ هم‌طول کنیم. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. -در اینجا نشان می‌دهیم چگونه تابع تولید توکِن را روی کل دیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابراین تابع روی چندین عنصر از دیتاسِت ما به یکباره عمل می‌کند نه روی هر عنصر به صورت جداگانه. این اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد: +در اینجا نشان می‌دهیم چگونه تابع تولید توکِن را روی کل دیتاسِت به یکباره اعمال می‌کنیم. ما از `batched=True` در فراخوانی تابع `map` استفاده می‌کنیم بنابر این تابع ما به جای اینکه روی هر عنصر به صورت جداگانه عمل کند روی چندین عنصر از دیتاسِت به یکباره عمل می‌کند. این کار اجازه می‌دهد که پیش‌پردازش سریع‌تر انجام گیرد:
From c90ad2a08d25570d9d4bbb52f359c707ad9dbfb0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 19 May 2022 13:40:09 +0200 Subject: [PATCH 145/254] review coments applied --- chapters/fa/chapter3/2.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index c9601b3e1..872792503 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -297,7 +297,7 @@ tokenized_dataset = tokenizer(
-این روش به خوبی کار می‌کند، اما مشکل‌اش این است که دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids` و مقادیر آنها که لیست‌هایی از لیست‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دیتاسِت در حین توکِن کردن داشته باشید (در حالی که دیتاسِت‌های موجود در پایگاه دیتاسِت هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌ می‌دارید). +این روش به خوبی کار می‌کند، اما مشکل‌اش این است که دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids` و مقادیر آنها که لیست‌هایی از لیست‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دیتاسِت در حین توکِن کردن داشته باشید (در حالی که دیتاسِت‌های موجود در کتابخانه `Datatasets` از هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌ می‌دارید). به منظور نگه داشتن داده به صورت یک دیتاسِت، از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکِن کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِن کند: @@ -325,7 +325,7 @@ tokenized_datasets
-کتابخانه دیتاسِت هاگینگ‌فِیس این پیش‌پردازش را با افزودن -فیلدهای- جدید به دیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، اعمال می‌کند: +کتابخانه `Datasets` از هاگینگ‌فِیس این پیش‌پردازش را با افزودن -فیلدهای- جدید به دیتاسِت‌ها، یکی به اِزای هر کلید در -دیکشنری- که توسط تابع پیش‌پردازش بازگردانده می‌شوند، اعمال می‌کند:
@@ -348,7 +348,7 @@ DatasetDict({
-شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه توکِنایزر هاگینگ‌فِیس از پیش از چندین رشته پردازنده برای توکِن کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. +شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه `Tokenizers` هاگینگ‌فِیس از پیش، از چندین رشته پردازنده برای توکِن کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask` و `token_type_ids`، برمی‌گرداند به گونه‌ای که این سه فیلد به همه بخش‌های دیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دیتاسِت که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. From 0423a4229a447e88ca219577d19dd9367d82fb5c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 20 May 2022 09:08:39 +0200 Subject: [PATCH 146/254] review changes applied --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 872792503..c82b29e72 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -348,7 +348,7 @@ DatasetDict({
-شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از پردازش موازی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه `Tokenizers` هاگینگ‌فِیس از پیش، از چندین رشته پردازنده برای توکِن کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. +شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از چندپردازشی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه `Tokenizers` هاگینگ‌فِیس از پیش، از چندین رشته پردازشی برای توکِن کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask` و `token_type_ids`، برمی‌گرداند به گونه‌ای که این سه فیلد به همه بخش‌های دیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دیتاسِت که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. From fe3df6d824a3b16dc4fdd4199f47ff70c694714b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 20 May 2022 12:56:09 +0200 Subject: [PATCH 147/254] finish applying review comments --- chapters/fa/chapter3/2.mdx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index c82b29e72..6759d50c9 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -348,12 +348,12 @@ DatasetDict({
-شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از چندپردازشی استفاده کنید. ما آن را در اینجا استفاده نکردیم به این خاطر که کتابخانه `Tokenizers` هاگینگ‌فِیس از پیش، از چندین رشته پردازشی برای توکِن کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما در صورتی که از یک توکِنایزر سریع که با این کتابخانه پشتیبانی می‌شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. +شما حتی می‌توانید زمانی که تابع پیش‌پردازش خود را اعمال می‌کنید، با ارسال آرگومان `num_proc` در تابع `map()` از چندپردازشی استفاده کنید. در اینجا ما این کار را انجام ندادیم چرا که کتابخانه `Tokenizers` هاگینگ‌فِیس از پیش، از چندین رشته پردازشی برای توکِن کردن سریع‌تر نمونه‌های ما استفاده می‌کند، اما اگر شما از یک توکِنایزر سریع که با این کتابخانه پشتیبانی شود استفاده نمی‌کنید، این روش می‌تواند پیش‌پردازش شما را سریع‌تر کند. -تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask` و `token_type_ids`، برمی‌گرداند به گونه‌ای که این سه فیلد به همه بخش‌های دیتاسِت افزوده گردند. توجه داشته باشید که اگر تابع پیش‌پردازش ما برای یک کلید موجود در دیتاسِت که تابع `map()` به آن اعمال شده یک مقدار جدید بازمی‌گردانید همچنین می‌توانستیم فیلدهای موجود را تغییر دهیم. +تابع `tokenize_function` ما یک دیکشنری شامل کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند به گونه‌ای که این کلیدها به صورت سه فیلد جدید به همه بخش‌های دیتاسِت افزوده گردند. توجه داشته باشید اگر تابع پیش‌پردازش ما برای یک کلید موجود در دیتاسِت مقدار جدیدی بازمی‌گرداند ما می‌توانستیم فیلدهای موجود در دیتاسِتی که تابع `map()` به آن اعمال می‌شود را نیز تغییر دهیم. -آخرین چیزی که نیاز داریم انجام دهیم این است که هنگامی که عناصر را با هم در یک بَتچ قرار می‌دهیم، همه نمونه‌ها را به اندازه طول بلندترین عنصر هم‌طول کنیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. +آخرین کاری که باید انجام دهیم این است که هنگامی که عناصر را با هم در یک بَتچ قرار می‌دهیم، طول همه عناصر را به اندازه بلندترین عنصر برسانیم - تکنیکی که ما به آن *هم‌طول‌سازی پویا* می‌گوییم. ### هم‌طول‌سازی پویا @@ -362,11 +362,14 @@ DatasetDict({ {#if fw === 'pt'} -تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. این تابع آرگومانی است که شما می‌توانید هنگام ساختن یک `DataLoader` به داخل آن ارسال کنید، که در حالت پیش‌ فرض تابعی است که نمونه‌های شما را به ماتریس پایتورچ تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان‌پذیر نیست. ما پروسه هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آنرا روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش پروسه تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید می‌تواند مشکل ساز باشد - TPUها اشکال معین را ترجیح می‌دهند، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. +تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *تابع مرتب کننده* خوانده می‌شود. شما می‌توانید این تابع را که در حالت پیش‌ فرض نمونه‌های شما را به تِنسور پایتورچ تبدیل کرده و به هم الحاق می‌کند (اگر عناصر شما لیست، تاپِل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد) هنگام ساختن `DataLoader` به داخل آن ارسال کنید. از آنجایی که ورودی‌های ما هم‌طول نخواهند بود استفاده از این تابع برای ما امکان‌پذیر نیست. ناهم‌طولی ورودی‌ها به این خاطر است که ما فرایند هم‌طول‌سازی را عمدا به تعویق انداختیم تا فقط در زمان نیاز آن را روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با مقدار زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش، فرایند تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید این کار می‌تواند مشکل ساز باشد چرا که TPU اشکال معین را ترجیح می‌دهد، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. + {:else} -تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *collate function* خوانده می‌شود. `collator` پیش‌فرض تابعی است که فقط نمونه‌های شما را به `tf.Tensor` تبدیل کرده و آنها را بهم الحاق می‌کند (اگر عناصر شما لیست، تاپل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما همه به یک اندازه نیستند این کار برای ما امکان پذیر نیست. ما فرایند هم‌طول‌سازی را عمدا به تعویق انداختیم، تا فقط در زمان نیاز آن را روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با تعداد زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش، فرایند تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید این کار می‌تواند مشکل ساز باشد چرا که TPU اشکال معین را ترجیح می‌دهد، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. +تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *تابع مرتب کننده* خوانده می‌شود. تابع مرتب کننده پیش‌فرض تابعی است که فقط نمونه‌های شما را به `tf.Tensor` تبدیل کرده و آنها را به هم الحاق می‌کند (اگر عناصر شما لیست، تاپِل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما هم‌طول نخواهند بود استفاده از این تابع برای ما امکان پذیر نیست. ناهم‌طولی ورودی‌ها به این خاطر است که ما فرایند هم‌طول‌سازی را عمدا به تعویق انداختیم تا فقط در زمان نیاز آن را روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با مقدار زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش، فرایند تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید این کار می‌تواند مشکل ساز باشد چرا که TPU اشکال معین را ترجیح می‌دهد، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. + +The function that is responsible for putting together samples inside a batch is called a *collate function*. The default collator is a function that will just convert your samples to tf.Tensor and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. {/if} From b748da27d9dc94215549ca5260d9327cba7776eb Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 20 May 2022 13:21:26 +0200 Subject: [PATCH 148/254] PR failure resolved --- chapters/fa/_toctree.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/chapters/fa/_toctree.yml b/chapters/fa/_toctree.yml index 9853f9d85..d45d23d0e 100644 --- a/chapters/fa/_toctree.yml +++ b/chapters/fa/_toctree.yml @@ -32,7 +32,6 @@ title: مقدمه # Translate this! - local: chapter3/2 title: پردازش داده # Translate this! - local_fw: { pt: chapter3/3, tf: chapter3/3_tf } - title: واژه‌نامه sections: From dc51a8cf322330d4a4dbcb9636d2ce7cea121ed3 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sat, 21 May 2022 18:40:37 +0200 Subject: [PATCH 149/254] minot typo --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 6759d50c9..92dc1c469 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -1,7 +1,7 @@
-# پردازش داده +#پردازش داده {#if fw === 'pt'} From 9708bc9c6df532b812562f148ecbd98a5144a973 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sat, 21 May 2022 18:41:41 +0200 Subject: [PATCH 150/254] minot typo --- chapters/fa/chapter3/2.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 92dc1c469..cf9a9e1de 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -1,7 +1,8 @@
-#پردازش داده + +# پردازش داده {#if fw === 'pt'} From 8a5894fc0695cf47ca8ca691c6911dbef6ec3c1e Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 22 May 2022 13:00:03 +0200 Subject: [PATCH 151/254] new phrases added to G --- chapters/fa/glossary/1.mdx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/chapters/fa/glossary/1.mdx b/chapters/fa/glossary/1.mdx index 6e0ef2dba..4813de422 100644 --- a/chapters/fa/glossary/1.mdx +++ b/chapters/fa/glossary/1.mdx @@ -145,6 +145,17 @@ | Naive Bayes | بیز ساده | | Collaborative learning | یادگیری مشارکتی | | Demo | نمونه اولیه | +| collate | مرتب کردن | +| mapping | نگاشت | +| element | عنصر | +| tuple | تاپِل | +| object | شیء | +| paraphrases | جملات متناظر | +| benchmark | محک | +| items | اقلام | +| padding | هم‌طول‌سازی | +| sequential model | مدل ترتیبی | +| documentation | مستندات | معادل‌هایی که استفاده نمی‌کنیم: From 8d6f07345ca5ff1c7a38fedd2214c6c24f9061e8 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 23 May 2022 08:29:02 +0200 Subject: [PATCH 152/254] a few changes applied --- chapters/fa/chapter3/2.mdx | 13 +++++-------- chapters/fa/glossary/1.mdx | 3 +-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index cf9a9e1de..cfe504239 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -101,7 +101,7 @@ model.train_on_batch(batch, labels) هاب تنها شامل مدل‌ها نمی‌باشد؛ بلکه شامل دیتاسِت‌های متعدد در بسیاری از زبان‌های مختلف می‌باشد. شما می‌توانید دیتاسِت‌ها را در این [لینک](https://huggingface.co/datasets) جستجو کنید و پیشنهاد می‌کنیم پس از اتمام این بخش یک دیتاسِت جدید را دریافت و پردازش کنید (بخش مستندات عمومی را در [اینجا](https://huggingface.co/docs/datasets/loading_datasets.html#from-the-huggingface-hub) مشاهده کنید). اما اجازه بدهید اکنون روی دیتاسِت MRPC تمرکز کنیم! این یکی از ۱۰ دیتاسِت [GLUE benchmark](https://gluebenchmark.com/) است که یک محک تهیه شده در محیط دانشگاهی جهت اندازه گیری کارکرد مدل‌های یادگیری ماشینی در ۱۰ مسئله دسته‌بندی متن مختلف می‌باشد. -کتابخانه دیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و ذخیره‌سازی یک دیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دیتاسِت MRPC را به روش زیر دانلود کنیم: +کتابخانه دیتاسِت هاگینگ‌فِیس یک دستور بسیار ساده جهت دانلود و انبار کردن یک دیتاسِت در هاب ارائه می‌کند. ما می‌توانیم دیتاسِت MRPC را به روش زیر دانلود کنیم:
@@ -137,7 +137,7 @@ DatasetDict({ همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). - این دستور دیتاسِت را دانلود و به صورت پیش‌فرض در پوشه‌ *~/.cache/huggingface/dataset* ذخیره میکند. از فصل ۲ به یاد داشته باشید که می‌توانید پوشه‌ ذخیره‌سازی‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. + این دستور دیتاسِت را دانلود و به صورت پیش‌فرض در پوشه‌ *~/.cache/huggingface/dataset* انبار می‌کند. از فصل ۲ به یاد داشته باشید که می‌توانید پوشه‌ انبار کردن‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. ما می‌توانیم به هر جفت از جملات در شئ `raw_datasets` با استفاده از اندیس, مانند یک دیکشنری دسترسی پیدا کنیم: @@ -363,18 +363,15 @@ DatasetDict({ {#if fw === 'pt'} -تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *تابع مرتب کننده* خوانده می‌شود. شما می‌توانید این تابع را که در حالت پیش‌ فرض نمونه‌های شما را به تِنسور پایتورچ تبدیل کرده و به هم الحاق می‌کند (اگر عناصر شما لیست، تاپِل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد) هنگام ساختن `DataLoader` به داخل آن ارسال کنید. از آنجایی که ورودی‌های ما هم‌طول نخواهند بود استفاده از این تابع برای ما امکان‌پذیر نیست. ناهم‌طولی ورودی‌ها به این خاطر است که ما فرایند هم‌طول‌سازی را عمدا به تعویق انداختیم تا فقط در زمان نیاز آن را روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با مقدار زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش، فرایند تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید این کار می‌تواند مشکل ساز باشد چرا که TPU اشکال معین را ترجیح می‌دهد، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. - +تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *تابع ترکیب کننده* خوانده می‌شود. شما می‌توانید این تابع را که در حالت پیش‌ فرض نمونه‌های شما را به تِنسور پایتورچ تبدیل کرده و به هم الحاق می‌کند (اگر عناصر شما لیست، تاپِل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد) هنگام ساختن `DataLoader` به داخل آن ارسال کنید. از آنجایی که ورودی‌های ما هم‌طول نخواهند بود استفاده از این تابع برای ما امکان‌پذیر نیست. ناهم‌طولی ورودی‌ها به این خاطر است که ما فرایند هم‌طول‌سازی را عمدا به تعویق انداختیم تا فقط در زمان نیاز آن را روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با مقدار زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش، فرایند تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید این کار می‌تواند مشکل ساز باشد چرا که TPU اشکال معین را ترجیح می‌دهد، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. {:else} -تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *تابع مرتب کننده* خوانده می‌شود. تابع مرتب کننده پیش‌فرض تابعی است که فقط نمونه‌های شما را به `tf.Tensor` تبدیل کرده و آنها را به هم الحاق می‌کند (اگر عناصر شما لیست، تاپِل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما هم‌طول نخواهند بود استفاده از این تابع برای ما امکان پذیر نیست. ناهم‌طولی ورودی‌ها به این خاطر است که ما فرایند هم‌طول‌سازی را عمدا به تعویق انداختیم تا فقط در زمان نیاز آن را روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با مقدار زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش، فرایند تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید این کار می‌تواند مشکل ساز باشد چرا که TPU اشکال معین را ترجیح می‌دهد، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. - -The function that is responsible for putting together samples inside a batch is called a *collate function*. The default collator is a function that will just convert your samples to tf.Tensor and concatenate them (recursively if your elements are lists, tuples, or dictionaries). This won't be possible in our case since the inputs we have won't all be of the same size. We have deliberately postponed the padding, to only apply it as necessary on each batch and avoid having over-long inputs with a lot of padding. This will speed up training by quite a bit, but note that if you're training on a TPU it can cause problems — TPUs prefer fixed shapes, even when that requires extra padding. +تابعی که مسئول کنار هم گذاشتن نمونه‌ها در یک بَتچ می‌باشد *تابع ترکیب کننده* خوانده می‌شود. تابع ترکیب کننده پیش‌فرض تابعی است که فقط نمونه‌های شما را به `tf.Tensor` تبدیل کرده و آنها را به هم الحاق می‌کند (اگر عناصر شما لیست، تاپِل یا دیکشنری باشند این کار به صورت بازگشتی انجام می‌گیرد). از آنجایی که ورودی‌های ما هم‌طول نخواهند بود استفاده از این تابع برای ما امکان پذیر نیست. ناهم‌طولی ورودی‌ها به این خاطر است که ما فرایند هم‌طول‌سازی را عمدا به تعویق انداختیم تا فقط در زمان نیاز آن را روی هر بَتچ اجرا کنیم و از داشتن ورودی‌های بیش از اندازه طولانی با مقدار زیادی هم‌طول‌سازی پیش‌گیری کنیم. این روش، فرایند تعلیم را تا اندازه‌ای سرعت می‌بخشد، اما توجه داشته باشید که اگر شما در حال تعلیم روی TPU هستید این کار می‌تواند مشکل ساز باشد چرا که TPU اشکال معین را ترجیح می‌دهد، حتی اگر نیاز به هم‌طول‌سازی اضافه داشته باشد. {/if} -برای انجام این کار در عمل، ما باید یک تابع مرتب کننده تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم در یک بَتچ قرار دهیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین تابعی را تحت عنوان `DataCollatorWithPadding` در اختیار ما قرار می‌دهد. این تابع به محض این که آن را تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و مدل انتظار هم‌طول‌سازی از سمت چپ یا راست ورودی‌ها را داشته باشد) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام این کار در عمل، ما باید یک تابع ترکیب کننده تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم در یک بَتچ قرار دهیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین قابلیتی را توسط شیء `DataCollatorWithPadding` به ما می‌دهد. این تابع به محض این که آن را تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و مدل انتظار هم‌طول‌سازی از سمت چپ یا راست ورودی‌ها را داشته باشد) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} diff --git a/chapters/fa/glossary/1.mdx b/chapters/fa/glossary/1.mdx index 4813de422..d3fedc968 100644 --- a/chapters/fa/glossary/1.mdx +++ b/chapters/fa/glossary/1.mdx @@ -145,7 +145,7 @@ | Naive Bayes | بیز ساده | | Collaborative learning | یادگیری مشارکتی | | Demo | نمونه اولیه | -| collate | مرتب کردن | +| collate | ترکیب کردن | | mapping | نگاشت | | element | عنصر | | tuple | تاپِل | @@ -154,7 +154,6 @@ | benchmark | محک | | items | اقلام | | padding | هم‌طول‌سازی | -| sequential model | مدل ترتیبی | | documentation | مستندات | معادل‌هایی که استفاده نمی‌کنیم: From 494af448ff3e61884de48d6df83d06d4c31c7447 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 23 May 2022 08:53:18 +0200 Subject: [PATCH 153/254] minor updates applied --- chapters/fa/chapter3/2.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index cfe504239..1468d8a9e 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -135,7 +135,7 @@ DatasetDict({
-همانطور که می بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). +همانطور که می‌بینید یک شیء `DatasetDict` بدست می‌آوریم که شامل مجموعه `training`، مجموعه `validation` و مجموعه `test` می‌باشد. هر یک از این‌ها شامل چندین ستون (`label`، `sentence2`، `sentence1` و `idx`) و تعداد متغیری سطر که عناصر هر مجموعه را تشکیل می‌دهند می‌باشد. (بنابراین، ۳۶۶۸ جفت جمله در مجموعه `training` وجود دارد، ۴۰۸ تا در مجموعه `validation` و ۱۷۲۵ تا در مجموعه `test`). این دستور دیتاسِت را دانلود و به صورت پیش‌فرض در پوشه‌ *~/.cache/huggingface/dataset* انبار می‌کند. از فصل ۲ به یاد داشته باشید که می‌توانید پوشه‌ انبار کردن‌تان را با تنظیم متغیر محیطی `HF_HOME` به دلخواه تغییر دهید. @@ -300,7 +300,7 @@ tokenized_dataset = tokenizer( این روش به خوبی کار می‌کند، اما مشکل‌اش این است که دیکشنری (از کلیدهای ما شامل، `input_ids`, `attention_mask` و `token_type_ids` و مقادیر آنها که لیست‌هایی از لیست‌ها هستند) برمی‌گرداند. همچنین این روش فقط زمانی کار می‌کند که حافظه موقت کافی جهت ذخیره‌سازی کل دیتاسِت در حین توکِن کردن داشته باشید (در حالی که دیتاسِت‌های موجود در کتابخانه `Datatasets` از هاگینگ‌فِیس فایل‌هایی از نوع [Apache Arrow](https://arrow.apache.org/) هستند که روی دیسک ذخیره شده‌اند، بنابراین شما فقط نمونه‌هایی را که جهت ذخیره در حافظه درخواست کرده‌اید نگه‌ می‌دارید). -به منظور نگه داشتن داده به صورت یک دیتاسِت، از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌بر توکِن کردن نیاز داشته باشیم این روش انعطاف‌پذری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِن کند: +به منظور نگه داشتن داده به صورت یک دیتاسِت، از تابع [`Dataset.map()`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map) استفاده می‌کنیم. چنانچه به پیش‌پردازش‌های بیشتری علاوه‌ بر توکِن کردن نیاز داشته باشیم این روش انعطاف‌پذیری لازم را به ما می‌دهد. تابع `map()` با اعمال کردن یک عملیات روی هر عنصر دیتاسِت عمل می‌کند، بنابراین اجازه دهید تابعی تعریف کنیم که ورودی‌ها را توکِن کند:
@@ -311,7 +311,7 @@ def tokenize_function(example):
-این تابع دیکشنری (مثل اقلام داخل دیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از دو جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان لیستی از جمله‌ها) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکٍنایزر را به میزان زیادی سریع‌تر خواهد کرد. این `tokenizer` با توکِنایزری در کتابخانه [Tokenizers](https://github.com/huggingface/tokenizers) از هاگینگ‌فِیس که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکٍنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یکجا به آن بدهیم. +این تابع دیکشنری (مثل اقلام داخل دیتاسِت) دریافت می‌کند و دیکشنری دیگری با کلیدهای `input_ids`، `attention_mask` و `token_type_ids` برمی‌گرداند. توجه داشته باشید از آنجایی که توکِنایزر روی لیست‌هایی از دو جمله‌ها کار می‌کند، همان‌طور که قبلا مشاهده کردیم، این تابع نیز در صورتی که دیکشنری `example` شامل چندین نمونه (هر کلید به عنوان لیستی از جمله‌ها) باشد کار می‌کند. این به ما این امکان را خواهد داد که از گزینه `batched=True` در فراخوانی تابع `map()` استفاده کنیم که توکِنایزر را به میزان زیادی سریع‌تر خواهد کرد. این `tokenizer` با توکِنایزری در کتابخانه [Tokenizers](https://github.com/huggingface/tokenizers) از هاگینگ‌فِیس که به زبان برنامه‌‌نویسی Rust نوشته شده پشتیبانی می‌شود. این توکِنایزر می‌تواند بسیار سریع باشد، اما فقط به شرطی که ورودی‌های زیادی را به صورت یک جا به آن بدهیم. توجه داشته باشید که ما آرگومان هم‌طول‌سازی را در تابع توکِن کننده‌مان نادیده گرفته‌ایم. این به این خاطر است که هم‌طول‌سازی روی همه نمونه‌ها برای بیشترین طول به صرفه نیست: بهتر است که نمونه‌ها را زمانی که در حال ساختن بَتچ هستیم هم‌طول کنیم، در این صورت فقط نیاز داریم نمونه‌ها را به اندازه بزرگترین طول همان بَتچ و نه بیشترین طول در سرتاسر دیتاسِت‌ هم‌طول کنیم. این روش زمانی که ورودی‌ها دارای طول‌های بسیار متغیری هستند وقت و انرژی زیادی را صرفه‌جویی خواهد کرد. @@ -371,7 +371,7 @@ DatasetDict({ {/if} -برای انجام این کار در عمل، ما باید یک تابع ترکیب کننده تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم در یک بَتچ قرار دهیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین قابلیتی را توسط شیء `DataCollatorWithPadding` به ما می‌دهد. این تابع به محض این که آن را تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و مدل انتظار هم‌طول‌سازی از سمت چپ یا راست ورودی‌ها را داشته باشد) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام این کار در عمل، ما باید یک تابع ترکیب کننده تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم در یک بَتچ قرار دهیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین قابلیتی را توسط شیء `DataCollatorWithPadding` به ما می‌دهد. این شئ به محض این که آن را تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و مدل انتظار هم‌طول‌سازی از سمت چپ یا راست ورودی‌ها را داشته باشد) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} @@ -456,19 +456,19 @@ batch = data_collator(samples)
-به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل‌مان می‌تواند با آنها کار کند، آماده هستیم برای کوک‌ کردن مدل: +به نظر خوب می‌آید! اکنون که از متن خالص به بَتچ‌هایی رسیده‌ایم که مدل‌مان می‌تواند با آنها کار کند، آماده کوک‌ کردن مدل هستیم: {/if} -✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی دیتاسِت GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای جفت شامل تک جمله‌ها می‌باشد این کار یک مقدار متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. +✏️ **امتحان کنید!** پروسه پیش‌پردازش را روی دیتاسِت GLUE SST-2 باز تکرار کنید. از آنجایی که این مجموعه به جای دو جمله‌ها شامل تک جمله‌ها می‌باشد این کار کمی متفاوت است، اما بقیه کارهایی که انجام داده‌ایم باید یکسان به نظر برسند. برای یک چالش مشکل‌تر، سعی کنید تابع پیش‌پردازشی بنویسید که برای همه مسئله‌های GLUE کار کند. {#if fw === 'tf'} -اکنون که دیتاسِت‌مان و یک `collator` داده در اختیار داریم، حال نیاز داریم که آنها را باهم بکار ببریم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، تابعی ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این تابع یک `tf.data.Dataset` شامل پارامتری اختیاری برای تابع `collation` را دور دیتاسِت‌تان می‌پیچد. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در تنیجه همین یک تابع می‌تواند یک دیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دیتاسِت‌مان مشاهده کنیم! +اکنون که دیتاسِت‌مان و یک `collator` داده در اختیار داریم، نیاز داریم که آنها را باهم بکار ببریم. ما می‌توانستیم بَتچ‌ها را دستی لود کرده و آنها را `collate` کنیم، اما این روش کار زیادی می‌برد و احتمالا خیلی هم بهینه نخواهد بود. در عوض، تابعی ساده وجود دارد که راه حل بهینه‌ای برای این مسئله ارائه می‌کند: `to_tf_dataset()`. این تابع یک `tf.data.Dataset` شامل پارامتری اختیاری برای تابع `collation` را دور دیتاسِت‌تان می‌پیچد. `tf.data.Dataset` یک فرمت بومی تِنسورفلو است که کِراس می‌تواند برای `model.fit()` استفاده کند، در نتیجه همین یک تابع می‌تواند یک دیتاسِت هاگینگ‌فِیس را به سرعت به فرمت آماده برای تعلیم تبدیل کند. اجازه دهید آنرا در عمل با دیتاسِت‌مان مشاهده کنیم!
From 703d1d138069bc0ac6083bee018a7849eed55234 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 23 May 2022 14:21:27 +0200 Subject: [PATCH 154/254] comments applied --- chapters/fa/chapter3/2.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 1468d8a9e..54dc5dedc 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -161,7 +161,7 @@ raw_train_dataset[0]
-می‌بینیم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین لازم نیست هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، می‌توانیم قابلیت‌های ‌`raw_train_dataset`‌ را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت. +می‌بینیم که برچسب‌ها از پیش اعداد صحیح هستند، بنابراین لازم نیست هیچ پیش‌پردازشی روی آنها انجام دهیم. برای این که بدانیم کدام مقدار عددی صحیح به کدام برچسب مربوط می‌شود، می‌توانیم `features` از ‌`raw_train_dataset`‌مان را بررسی کنیم. این کار نوع هر ستون را به ما خواهد گفت.
@@ -371,7 +371,7 @@ DatasetDict({ {/if} -برای انجام این کار در عمل، ما باید یک تابع ترکیب کننده تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم در یک بَتچ قرار دهیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین قابلیتی را توسط شیء `DataCollatorWithPadding` به ما می‌دهد. این شئ به محض این که آن را تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و مدل انتظار هم‌طول‌سازی از سمت چپ یا راست ورودی‌ها را داشته باشد) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام این کار در عمل، ما باید یک تابع ترکیب کننده تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم در یک بَتچ قرار دهیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین قابلیتی را توسط کلاس `DataCollatorWithPadding` به ما می‌دهد. به محض این که این کلاس را تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و مدل انتظار هم‌طول‌سازی از سمت چپ یا راست ورودی‌ها را داشته باشد) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} From 31b55cd9fd543405d0258b5aab511c3044b0a3a8 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 24 May 2022 09:12:13 +0200 Subject: [PATCH 155/254] one last fix --- chapters/fa/chapter3/2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/2.mdx b/chapters/fa/chapter3/2.mdx index 54dc5dedc..092a92b30 100644 --- a/chapters/fa/chapter3/2.mdx +++ b/chapters/fa/chapter3/2.mdx @@ -371,7 +371,7 @@ DatasetDict({ {/if} -برای انجام این کار در عمل، ما باید یک تابع ترکیب کننده تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم در یک بَتچ قرار دهیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین قابلیتی را توسط کلاس `DataCollatorWithPadding` به ما می‌دهد. به محض این که این کلاس را تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و مدل انتظار هم‌طول‌سازی از سمت چپ یا راست ورودی‌ها را داشته باشد) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: +برای انجام این کار در عمل، ما باید یک تابع ترکیب کننده تعریف کنیم که میزان درستی از هم‌طول‌سازی را به آیتم‌های دیتاسِت‌هایی که ما می‌خواهیم باهم در یک بَتچ قرار دهیم اعمال کند. خوشبختانه، کتابخانه ترنسفورمرهای هاگینگ‌فِیس چنین قابلیتی را توسط کلاس `DataCollatorWithPadding` به ما می‌دهد. به محض این که شیء‌ای از این کلاس را تعریف کنیم (یعنی تعیین کنیم چه توکِنی برای هم‌طول‌سازی استفاده کند و مدل انتظار هم‌طول‌سازی از سمت چپ یا راست ورودی‌ها را داشته باشد) یک توکِنایزر را برداشته و هر کاری را که لازم دارید انجام می‌دهد: {#if fw === 'pt'} From 7cead81c2472d881b73265859c51a3ae4ea5dc32 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 30 May 2022 16:06:31 +0200 Subject: [PATCH 156/254] chapter title fixed --- chapters/fa/_toctree.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/chapters/fa/_toctree.yml b/chapters/fa/_toctree.yml index d45d23d0e..4884167eb 100644 --- a/chapters/fa/_toctree.yml +++ b/chapters/fa/_toctree.yml @@ -19,6 +19,13 @@ - local: chapter2/3 title: مدل‌ها +- title: ۳. کوک کردن یک مدل از پیش تعلیم دیده # Translate this! + sections: + - local: chapter3/1 + title: مقدمه # Translate this! + - local: chapter3/2 + title: پردازش داده # Translate this! + - title: ۴- به اشتراک‌گذاری مدل‌ها و توکِنایزرها sections: - local: chapter4/1 @@ -26,13 +33,6 @@ - local: chapter4/2 title: بکارگیری مدل‌های از پیش تعلیم دیده -- title: 3. کوک کردن یک مدل از پیش تعلیم دیده # Translate this! - sections: - - local: chapter3/1 - title: مقدمه # Translate this! - - local: chapter3/2 - title: پردازش داده # Translate this! - - title: واژه‌نامه sections: - local: glossary/1 From 4fd7475da184dd87dbcf1140a5b73ff32025e17b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 30 May 2022 16:09:30 +0200 Subject: [PATCH 157/254] minor fix - chapter title --- chapters/fa/_toctree.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/_toctree.yml b/chapters/fa/_toctree.yml index 5dcfcc83c..021a2c1eb 100644 --- a/chapters/fa/_toctree.yml +++ b/chapters/fa/_toctree.yml @@ -19,7 +19,7 @@ - local: chapter2/3 title: مدل‌ها -- title: ۳. کوک کردن یک مدل از پیش تعلیم دیده # Translate this! +- title: ۳- کوک کردن یک مدل از پیش تعلیم دیده # Translate this! sections: - local: chapter3/1 title: مقدمه # Translate this! From 25c3b71b9c7b235435d14cb7216bc29b2650a34a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 30 May 2022 16:12:01 +0200 Subject: [PATCH 158/254] fixe typos the title of chapter 3 --- chapters/fa/_toctree.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chapters/fa/_toctree.yml b/chapters/fa/_toctree.yml index 021a2c1eb..7336e1e93 100644 --- a/chapters/fa/_toctree.yml +++ b/chapters/fa/_toctree.yml @@ -19,12 +19,12 @@ - local: chapter2/3 title: مدل‌ها -- title: ۳- کوک کردن یک مدل از پیش تعلیم دیده # Translate this! +- title: ۳- کوک کردن یک مدل از پیش تعلیم دیده sections: - local: chapter3/1 - title: مقدمه # Translate this! + title: مقدمه - local: chapter3/2 - title: پردازش داده # Translate this! + title: پردازش داده - title: ۴- به اشتراک‌گذاری مدل‌ها و توکِنایزرها sections: From b66cdef68759f6fab0a08c2e37e5586c489c93df Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 1 Jun 2022 10:04:27 +0200 Subject: [PATCH 159/254] new file added --- chapters/fa/chapter3/3_tf.mdx | 263 ++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 chapters/fa/chapter3/3_tf.mdx diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx new file mode 100644 index 000000000..6e5d2c746 --- /dev/null +++ b/chapters/fa/chapter3/3_tf.mdx @@ -0,0 +1,263 @@ + + +
+ +# کوک کردن مدل‌ها با استفاده از کِراس + +# Fine-tuning a model with Keras + + + +وقتی که شما همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPUها یا TPUهای مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. + +Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). + +نمونه کدهای زیر فرض می‌کنند شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: + +The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: + +
+ +```py +from datasets import load_dataset +from transformers import AutoTokenizer, DataCollatorWithPadding +import numpy as np + +raw_datasets = load_dataset("glue", "mrpc") +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) + + +def tokenize_function(example): + return tokenizer(example["sentence1"], example["sentence2"], truncation=True) + +tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) + +data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") + +tf_train_dataset = tokenized_datasets["train"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=True, + collate_fn=data_collator, + batch_size=8, +) + +tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( + columns=["attention_mask", "input_ids", "token_type_ids"], + label_cols=["labels"], + shuffle=False, + collate_fn=data_collator, + batch_size=8, +) +``` + +
+ +### تعلیم + +مدل‌های تِنسورفِلو که از ترَنسفورمِرهای هاگینگ‌فِیس وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. + +TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. + + + +جمله بالا به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار بسیار کمی لازم است تا تعلیم را روی آن شروع کنیم. + +That means that once we have our data, very little work is required to begin training on it. + + + +مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب دسته استفاده خواهیم کرد: + +As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: + +
+ +```py +from transformers import TFAutoModelForSequenceClassification + +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +``` + +
+ +شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه-سر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه-سر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه-سر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه-سر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان چیزی است که می‌خواهیم اکنون انجام دهیم. + +You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. + +برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای تعلیم و خطای تایید را در انتهای هر epoch گزارش می‌دهد. + +To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. + + + +توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع خطای مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع خطا در زمان `compile()` تعیین نکنید آنها از این تابع خطا به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع خطای داخلی شما نیاز خواهید داشت برچسب‌ دسته‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب دسته مجزا، که روش معمول استفاده از برچسب‌ دسته‌ها در مدل‌های کِراس می‌باشد. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع خطای درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع خطای استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. + +Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. + + + +
+ +```py +from tensorflow.keras.losses import SparseCategoricalCrossentropy + +model.compile( + optimizer="adam", + loss=SparseCategoricalCrossentropy(from_logits=True), + metrics=["accuracy"], +) +model.fit( + tf_train_dataset, + validation_data=tf_validation_dataset, +) +``` + +
+ + + +Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. + + + +### Improving training performance + + + +If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause +is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes +that optimizer with default values for all parameters, including learning rate. From long experience, though, we know +that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written +as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. + +In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate +over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* +the learning rate. In Keras, the best way to do this is to use a *learning rate scheduler*. A good one to use is +`PolynomialDecay` — despite the name, with default settings it simply linearly decays the learning rate from the initial +value to the final value over the course of training, which is exactly what we want. In order to use a scheduler correctly, +though, we need to tell it how long training is going to be. We compute that as `num_train_steps` below. + +
+ +```py +from tensorflow.keras.optimizers.schedules import PolynomialDecay + +batch_size = 8 +num_epochs = 3 +# The number of training steps is the number of samples in the dataset, divided by the batch size then multiplied +# by the total number of epochs. Note that the tf_train_dataset here is a batched tf.data.Dataset, +# not the original Hugging Face Dataset, so its len() is already num_samples // batch_size. +num_train_steps = len(tf_train_dataset) * num_epochs +lr_scheduler = PolynomialDecay( + initial_learning_rate=5e-5, end_learning_rate=0.0, decay_steps=num_train_steps +) +from tensorflow.keras.optimizers import Adam + +opt = Adam(learning_rate=lr_scheduler) +``` + +
+ + + +The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. + + + +Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: + +
+ +```py +import tensorflow as tf + +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) +model.compile(optimizer=opt, loss=loss, metrics=["accuracy"]) +``` + +
+ +Now, we fit again: + +
+ +```py +model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) +``` + +
+ + + +💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) + + + +### Model predictions + + + + +Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. + +
+ +```py +preds = model.predict(tf_validation_dataset)["logits"] +``` + +
+ +We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: + +
+ +```py +class_preds = np.argmax(preds, axis=1) +print(preds.shape, class_preds.shape) +``` + +
+ +
+ +```python out +(408, 2) (408,) +``` + +
+ +Now, let's use those `preds` to compute some metrics! We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: + +
+ +```py +from datasets import load_metric + +metric = load_metric("glue", "mrpc") +metric.compute(predictions=class_preds, references=raw_datasets["validation"]["label"]) +``` + +
+ +
+ +```python out +{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} +``` + +
+ +The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. + +This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in Chapter 7. If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. + +
\ No newline at end of file From d1feca3c9b8548953f79f24dd968956f7b53aaad Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 1 Jun 2022 15:29:18 +0200 Subject: [PATCH 160/254] new paragraphs added --- chapters/fa/chapter3/3_tf.mdx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 6e5d2c746..4a351f66b 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -73,7 +73,7 @@ That means that once we have our data, very little work is required to begin tra -مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب دسته استفاده خواهیم کرد: +مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب‌دسته استفاده خواهیم کرد: As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: @@ -91,13 +91,13 @@ model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_lab You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین خطای تعلیم و خطای تایید را در انتهای هر epoch گزارش می‌دهد. +برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین هزینه تعلیم و هزینه تایید را در انتهای هر epoch گزارش می‌دهد. To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. -توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع خطای مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع خطا در زمان `compile()` تعیین نکنید آنها از این تابع خطا به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع خطای داخلی شما نیاز خواهید داشت برچسب‌ دسته‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب دسته مجزا، که روش معمول استفاده از برچسب‌ دسته‌ها در مدل‌های کِراس می‌باشد. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع خطای درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع خطای استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. +توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع هزینه مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع هزینه در زمان `compile()` تعیین نکنید آنها از این تابع هزینه به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع هزینه داخلی شما نیاز خواهید داشت برچسب‌دسته‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب‌دسته مجزا، که روش معمول استفاده از برچسب‌دسته‌ها در مدل‌های کِراس می‌باشد. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع هزینه درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع هزینه استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. @@ -123,6 +123,8 @@ model.fit( +در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغییر رشته‌ای برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فرض می‌کند که شما از پیش یک لایه softmax به خروجی خودتان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax اعمال شود خروجی می‌دهند، که تحت عنوان *logits* نیز شناخته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم که این چیزی است که مدل ما انجام می‌دهد و تنها راه انجام این کار این است که آن را به صورت مستقیم صدا بزنیم، به جای استفاده از یک نام به صورت یک متغییر رشته‌ای. + Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. From 644599a629f6af92e8b722e7ce7bcb0a7d52fbaa Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 1 Jun 2022 15:42:27 +0200 Subject: [PATCH 161/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 4a351f66b..22587d302 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -91,13 +91,13 @@ model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_lab You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین هزینه تعلیم و هزینه تایید را در انتهای هر epoch گزارش می‌دهد. +برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین هزینه تعلیم و هزینه تایید را در انتهای هر epoch گزارش می‌دهد. To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. -توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع هزینه مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع هزینه در زمان `compile()` تعیین نکنید آنها از این تابع هزینه به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع هزینه داخلی شما نیاز خواهید داشت برچسب‌دسته‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب‌دسته مجزا، که روش معمول استفاده از برچسب‌دسته‌ها در مدل‌های کِراس می‌باشد. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع هزینه درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع هزینه استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. +توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع هزینه مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع هزینه در زمان `compile()` تعیین نکنید آنها از این تابع هزینه به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع هزینه داخلی شما نیاز خواهید داشت برچسب‌دسته‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب‌دسته مجزا، که روش معمول استفاده از برچسب‌دسته‌ها در مدل‌های کِراس می‌باشد. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع هزینه درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع هزینه استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. @@ -129,6 +129,8 @@ Note a very common pitfall here — you *can* just pass the name of the loss as +### بهبود کارایی آموزش + ### Improving training performance From 531f9634c197e8511fcfc1dae26dc7078f5610c4 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 1 Jun 2022 15:48:25 +0200 Subject: [PATCH 162/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 22587d302..db2229019 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -123,7 +123,7 @@ model.fit( -در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغییر رشته‌ای برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فرض می‌کند که شما از پیش یک لایه softmax به خروجی خودتان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax اعمال شود خروجی می‌دهند، که تحت عنوان *logits* نیز شناخته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم که این چیزی است که مدل ما انجام می‌دهد و تنها راه انجام این کار این است که آن را به صورت مستقیم صدا بزنیم، به جای استفاده از یک نام به صورت یک متغییر رشته‌ای. +در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغییر رشته‌ای برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softma از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax اعمال شود خروجی می‌دهند، که تحت عنوان *logits* نیز شناخته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم که این چیزی است که مدل ما انجام می‌دهد و تنها راه انجام این کار این است که آن را به صورت مستقیم صدا بزنیم، به جای استفاده از یک نام به صورت یک متغییر رشته‌ای. Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. From 99b95027dcaa7490e32083caed5f0e784dce955b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 1 Jun 2022 15:54:06 +0200 Subject: [PATCH 163/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index db2229019..b31484642 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -123,7 +123,7 @@ model.fit( -در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغییر رشته‌ای برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softma از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax اعمال شود خروجی می‌دهند، که تحت عنوان *logits* نیز شناخته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم که این چیزی است که مدل ما انجام می‌دهد و تنها راه انجام این کار این است که آن را به صورت مستقیم صدا بزنیم، به جای استفاده از یک نام به صورت یک متغییر رشته‌ای. +در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغییر رشته‌ای برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softmax از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax اعمال شود به خروجی می‌دهند، که به آنها *logits* نیز گفته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم، این کاری است که مدل‌مان انجام می‌دهد و تنها راه گفتن آن این است که به جای استفاده از یک نام به صورت یک متغییر رشته‌ای، آن را به صورت مستقیم صدا بزنیم. Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. From 2f9e9b5c43025d1cb07397a55ec3da77f4fd66b0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 1 Jun 2022 16:17:02 +0200 Subject: [PATCH 164/254] new paragraph added --- chapters/fa/chapter3/3_tf.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index b31484642..3998f4427 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -123,7 +123,7 @@ model.fit( -در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغییر رشته‌ای برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softmax از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax اعمال شود به خروجی می‌دهند، که به آنها *logits* نیز گفته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم، این کاری است که مدل‌مان انجام می‌دهد و تنها راه گفتن آن این است که به جای استفاده از یک نام به صورت یک متغییر رشته‌ای، آن را به صورت مستقیم صدا بزنیم. +در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغیر متنی برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softmax از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax اعمال شود به خروجی می‌دهند، که به آنها *logits* نیز گفته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم، این کاری است که مدل‌مان انجام می‌دهد و تنها راه گفتن آن این است که به جای ارسال نام تابع هزینه به صورت متغیر متنی، آن را به صورت مستقیم صدا بزنیم. Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. @@ -135,6 +135,8 @@ Note a very common pitfall here — you *can* just pass the name of the loss as +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن بهینه‌ساز، شامل نرخ تعلیم، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3، یا 0.001 نیز نوشته میشود. + If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes that optimizer with default values for all parameters, including learning rate. From long experience, though, we know From 9d89e11ac0de394437a4d3aba853ce7b87a03047 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 1 Jun 2022 16:17:59 +0200 Subject: [PATCH 165/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 3998f4427..259835477 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -135,7 +135,7 @@ Note a very common pitfall here — you *can* just pass the name of the loss as -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن بهینه‌ساز، شامل نرخ تعلیم، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3، یا 0.001 نیز نوشته میشود. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ تعلیم، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3، یا 0.001 نیز نوشته میشود. If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes From 9cdff871f5996a7faa2160a9136e1902a096b56b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Wed, 1 Jun 2022 16:42:48 +0200 Subject: [PATCH 166/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 259835477..1984ee463 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -135,7 +135,7 @@ Note a very common pitfall here — you *can* just pass the name of the loss as -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ تعلیم، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3، یا 0.001 نیز نوشته میشود. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ تعلیم، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3، یا 0.001 نیز نوشته میشود. If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes From 2ab6994b8b2f9125f2f692428eaa051bec2146eb Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 08:18:36 +0200 Subject: [PATCH 167/254] new paragraph added --- chapters/fa/chapter3/3_tf.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 1984ee463..999746a06 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -135,7 +135,7 @@ Note a very common pitfall here — you *can* just pass the name of the loss as -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ تعلیم، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3، یا 0.001 نیز نوشته میشود. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3، یا 0.001 نیز نوشته میشود. If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes @@ -143,6 +143,8 @@ that optimizer with default values for all parameters, including learning rate. that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. +علاوه بر کم کردن نرخ یادگیری، ما ترفند دیگری در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. در متون مشابه گاها خواهید دید که از این روش با عنوان نرخ یادگیری *محو شونده* یا *باز پختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمانبند نرخ یادگیری* است.* یک زمانبند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمانبند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمانبند ما نیاز داریم که به آن بگوییم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. + In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* the learning rate. In Keras, the best way to do this is to use a *learning rate scheduler*. A good one to use is From 5b7ca84e56ffb53eb032246b711a11a07685df7d Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 11:25:54 +0200 Subject: [PATCH 168/254] all paragraphs added --- chapters/fa/chapter3/3_tf.mdx | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 999746a06..05e540c15 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -143,7 +143,7 @@ that optimizer with default values for all parameters, including learning rate. that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. -علاوه بر کم کردن نرخ یادگیری، ما ترفند دیگری در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. در متون مشابه گاها خواهید دید که از این روش با عنوان نرخ یادگیری *محو شونده* یا *باز پختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمانبند نرخ یادگیری* است.* یک زمانبند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمانبند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمانبند ما نیاز داریم که به آن بگوییم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. +علاوه بر کم کردن نرخ یادگیری، ما ترفند دیگری در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. در متون مشابه گاها خواهید دید که از این روش با عنوان نرخ یادگیری *محو شونده* یا *بازپختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمانبند نرخ یادگیری* است.* یک زمانبند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمانبند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمانبند ما نیاز داریم که به آن بگوییم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* @@ -175,10 +175,14 @@ opt = Adam(learning_rate=lr_scheduler) +کتابخانه ترنسفورمرهای هاگینگ‌فِیس همچنین یک تابع `create_optimizer()` دارد که یک بهینه‌ساز `AdamW` دارای اندازه کاهش نرخ یادگیری می‌سازد. این یک میانبر مناسب است که آنرا با جزئیات در بخش‌های بعدی این آموزش خواهید دید. + The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. +اکنون بهینه ساز کاملا جدیدمان را در اختار داریم و می‌توانیم آنرا تعلیم دهیم. ابتدا، اجازه دهید مدل را مجددا بارگذاری کنیم تا تغییرات ایجاد شده بر وزنها که در تعلیم قبلی اعمال شده‌اند را به حالت اولیه بازگردانیم، سپس می‌توانیم مدل را با بهینه ساز جدید تدوین کنیم: + Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer:
@@ -205,14 +209,20 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) +اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در این‌باره در [Chapter 4](/course/chapter4/3) بیشتر خواهیم آموخت. + 💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) +# پیش‌بینی‌های مدل + ### Model predictions +تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما چه کار کنیم اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها یا چه برای استفاده در خط تولید، خروجی دریافت کنیم؟ برای انجام این کار می‌توانیم از تابع `predict()` استفاده کنیم. این کار *logits* را از لایه سر خروجی مدل، یکی به ازای هر کلاس، باز می‌گرداند. + Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. @@ -224,6 +234,8 @@ preds = model.predict(tf_validation_dataset)["logits"]
+ما می‌توانیم logitها را با استفاده از `argmax` برای یافتن بزرگترین لاجیت، که نماینده محتمل ترین دسته می‌باشد به پیش‌بینی‌های دسته مدل تبدیل کنیم، + We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class:
@@ -243,6 +255,8 @@ print(preds.shape, class_preds.shape)
+اکنون، اجازه دهید از `preds` برای محاسبه برخی معیارها استفاده کنیم! ما می‌توانیم معیارهای مرتبط با دیتاسِت MRPC را، به همان آسانی که دیتاسِت را بارگذاری کردیم، بارگذاری کنیم اما این بار با استفاده از تابع `load_metric()`. شیء باز گردانده شده تابعی به نام `compute()` دارد که می‌توانیم برای محاسبه معیارها از آن استفاده کنیم: + Now, let's use those `preds` to compute some metrics! We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation:
@@ -264,8 +278,12 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l
+از آنجایی که مقداردهی اولیه تصادفی در لایه‌سر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه آزمون دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT paper](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح میکند. + The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. +به این ترتیب مقدمه بازتعلیم با استفاده از `API` کِراس به پایان می‌رسد. یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` در فصل ۷ ارائه خواهد شد. اگر مایلید خود را روی `API` کِراس کار آزموده کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ای که در بخش ۲ انجام دادید, بازتعلیم دهید + This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in Chapter 7. If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2.
\ No newline at end of file From e4a6674103b4536d5e30c21a2dab9dfcf02badd1 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 11:53:49 +0200 Subject: [PATCH 169/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 05e540c15..934502c11 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -282,7 +282,7 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. -به این ترتیب مقدمه بازتعلیم با استفاده از `API` کِراس به پایان می‌رسد. یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` در فصل ۷ ارائه خواهد شد. اگر مایلید خود را روی `API` کِراس کار آزموده کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ای که در بخش ۲ انجام دادید, بازتعلیم دهید +به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` در فصل ۷ ارائه خواهد شد. اگر مایلید خود را روی `API` کِراس کار آزموده کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ای که در بخش ۲ انجام دادید, کوک کنید. This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in Chapter 7. If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. From 0e1e56f0e7458140b987496e83b34adb2be8a5bd Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 11:55:09 +0200 Subject: [PATCH 170/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 934502c11..183b5ff4b 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -278,7 +278,7 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l
-از آنجایی که مقداردهی اولیه تصادفی در لایه‌سر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه آزمون دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT paper](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح میکند. +از آنجایی که مقداردهی اولیه تصادفی در لایه‌سر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه آزمون دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح میکند. The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. From ecdec2a248b52d7d83d9b97ef46f42a874b4322d Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 12:00:46 +0200 Subject: [PATCH 171/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 183b5ff4b..7b576b0e9 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -91,7 +91,7 @@ model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_lab You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین هزینه تعلیم و هزینه تایید را در انتهای هر epoch گزارش می‌دهد. +برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین هزینه `training` و هزینه `validation` را در انتهای هر epoch گزارش می‌دهد. To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. @@ -278,7 +278,7 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l
-از آنجایی که مقداردهی اولیه تصادفی در لایه‌سر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه آزمون دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح میکند. +از آنجایی که مقداردهی اولیه تصادفی در لایه‌سر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح میکند. The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. From 28bc80663b79d67fcf11c21008e21e30ec1a8973 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 12:09:02 +0200 Subject: [PATCH 172/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 7b576b0e9..0d2d224a3 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -234,7 +234,7 @@ preds = model.predict(tf_validation_dataset)["logits"]
-ما می‌توانیم logitها را با استفاده از `argmax` برای یافتن بزرگترین لاجیت، که نماینده محتمل ترین دسته می‌باشد به پیش‌بینی‌های دسته مدل تبدیل کنیم، +سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگترین `logit`، که نماینده محتمل ترین دسته می‌باشد به پیش‌بینی‌های دسته مدل تبدیل کنیم، We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: @@ -278,7 +278,7 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l
-از آنجایی که مقداردهی اولیه تصادفی در لایه‌سر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح میکند. +از آنجایی که مقداردهی اولیه تصادفی در لایه‌سر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. From 6b361fd2a4e1fd97681b89c6c62b239e14494d08 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 12:16:38 +0200 Subject: [PATCH 173/254] minor paragraph fixes applied --- chapters/fa/chapter3/3_tf.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 0d2d224a3..ddb8b064a 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -135,7 +135,7 @@ Note a very common pitfall here — you *can* just pass the name of the loss as -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3، یا 0.001 نیز نوشته میشود. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3 یا 0.001 نیز نوشته می‌شود. If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes @@ -143,7 +143,7 @@ that optimizer with default values for all parameters, including learning rate. that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. -علاوه بر کم کردن نرخ یادگیری، ما ترفند دیگری در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. در متون مشابه گاها خواهید دید که از این روش با عنوان نرخ یادگیری *محو شونده* یا *بازپختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمانبند نرخ یادگیری* است.* یک زمانبند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمانبند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمانبند ما نیاز داریم که به آن بگوییم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. +علاوه بر کم کردن یکباره نرخ یادگیری ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمانب‌ند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* From 9ee05b2af30c7f7b20e402cd0ec320191f6501e6 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 12:18:52 +0200 Subject: [PATCH 174/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index ddb8b064a..a6ca0d872 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -129,7 +129,9 @@ Note a very common pitfall here — you *can* just pass the name of the loss as -### بهبود کارایی آموزش + +### بهبود کارایی تعلیم + ### Improving training performance @@ -143,7 +145,7 @@ that optimizer with default values for all parameters, including learning rate. that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. -علاوه بر کم کردن یکباره نرخ یادگیری ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمانب‌ند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. +علاوه بر کم کردن یکباره نرخ یادگیری ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* @@ -215,7 +217,7 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -# پیش‌بینی‌های مدل +### پیش‌بینی‌های مدل ### Model predictions From cfcda0ae5c77ee0d8727bcea8446292ccb065fcc Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 12:22:45 +0200 Subject: [PATCH 175/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index a6ca0d872..9990d1f61 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -87,7 +87,7 @@ model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_lab
-شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه-سر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه-سر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه-سر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه-سر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان چیزی است که می‌خواهیم اکنون انجام دهیم. +شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه سَر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه سَر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه‌ سَر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه‌ سَر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان چیزی است که می‌خواهیم اکنون انجام دهیم. You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. @@ -223,7 +223,7 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما چه کار کنیم اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها یا چه برای استفاده در خط تولید، خروجی دریافت کنیم؟ برای انجام این کار می‌توانیم از تابع `predict()` استفاده کنیم. این کار *logits* را از لایه سر خروجی مدل، یکی به ازای هر کلاس، باز می‌گرداند. +تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما چه کار کنیم اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها یا چه برای استفاده در خط تولید، خروجی دریافت کنیم؟ برای انجام این کار می‌توانیم از تابع `predict()` استفاده کنیم. این کار *logits* را از لایه‌ سَر خروجی مدل، یکی به ازای هر کلاس، باز می‌گرداند. Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. @@ -280,7 +280,7 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l
-از آنجایی که مقداردهی اولیه تصادفی در لایه‌سر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. +از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. From 17b37be11f6f7c7b4aabb26ffe8ba6d77f5c05aa Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 12:38:08 +0200 Subject: [PATCH 176/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 9990d1f61..ddaca838b 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -17,7 +17,7 @@ Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). -نمونه کدهای زیر فرض می‌کنند شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: +نمونه کدهای زیر فرض می‌کنند که شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: @@ -73,7 +73,7 @@ That means that once we have our data, very little work is required to begin tra -مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب‌دسته استفاده خواهیم کرد: +مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب دسته استفاده خواهیم کرد: As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: @@ -87,7 +87,7 @@ model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_lab
-شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه سَر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه سَر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه‌ سَر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه‌ سَر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان چیزی است که می‌خواهیم اکنون انجام دهیم. +شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه سَر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه سَر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه‌ سَر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه‌ سَر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان کاری است که می‌خواهیم اکنون انجام دهیم. You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. @@ -97,7 +97,7 @@ To fine-tune the model on our dataset, we just have to `compile()` our model and -توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع هزینه مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع هزینه در زمان `compile()` تعیین نکنید آنها از این تابع هزینه به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع هزینه داخلی شما نیاز خواهید داشت برچسب‌دسته‌های خودتان را به عنوان بخشی از ورودی ارسال کنید، نه به صورت یک برچسب‌دسته مجزا، که روش معمول استفاده از برچسب‌دسته‌ها در مدل‌های کِراس می‌باشد. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع هزینه درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع هزینه استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. +توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع هزینه مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع هزینه در زمان `compile()` تعیین نکنید آنها از این تابع هزینه به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع هزینه داخلی شما نیاز خواهید داشت برچسب دسته‌های خودتان را به عنوان بخشی از ورودی، نه به صورت یک برچسب دسته مجزا که روش معمول استفاده از برچسب دسته‌ها در مدل‌های کِراس می‌باشد، ارسال کنید. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع هزینه‌ی درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع هزینه استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. @@ -123,7 +123,7 @@ model.fit( -در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغیر متنی برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softmax از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax اعمال شود به خروجی می‌دهند، که به آنها *logits* نیز گفته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم، این کاری است که مدل‌مان انجام می‌دهد و تنها راه گفتن آن این است که به جای ارسال نام تابع هزینه به صورت متغیر متنی، آن را به صورت مستقیم صدا بزنیم. +در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغیر متنی برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softmax از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax به آنها اعمال شود به خروجی می‌دهند، که همچنین به عنوان *logits* شناخته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم، این کاری است که مدل‌مان انجام می‌دهد و تنها راه گفتن آن این است که به جای ارسال نام تابع هزینه به صورت متغیر متنی، آن را به صورت مستقیم صدا بزنیم. Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. From a34fb6d344cc2d322619e013882ddd516cbce2b1 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 12:45:14 +0200 Subject: [PATCH 177/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index ddaca838b..aed8bec16 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -137,7 +137,7 @@ Note a very common pitfall here — you *can* just pass the name of the loss as -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و همچنین به صورت 10 به توان -3 یا 0.001 نیز نوشته می‌شود. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد که به صورت‌های 10 به توان -3 یا 0.001 نیز نوشته می‌شود. If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes @@ -145,7 +145,7 @@ that optimizer with default values for all parameters, including learning rate. that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. -علاوه بر کم کردن یکباره نرخ یادگیری ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. +علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* @@ -177,13 +177,13 @@ opt = Adam(learning_rate=lr_scheduler) -کتابخانه ترنسفورمرهای هاگینگ‌فِیس همچنین یک تابع `create_optimizer()` دارد که یک بهینه‌ساز `AdamW` دارای اندازه کاهش نرخ یادگیری می‌سازد. این یک میانبر مناسب است که آنرا با جزئیات در بخش‌های بعدی این آموزش خواهید دید. +کتابخانه ترنسفورمرهای هاگینگ‌فِیس همچنین یک تابع `create_optimizer()` دارد که بهینه‌سازی از نوع `AdamW` دارای میزان کاهش نرخ یادگیری می‌سازد. این یک میان‌بر مناسب است که آن‌ را با جزئیات در بخش‌های بعدی این آموزش خواهید دید. The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. -اکنون بهینه ساز کاملا جدیدمان را در اختار داریم و می‌توانیم آنرا تعلیم دهیم. ابتدا، اجازه دهید مدل را مجددا بارگذاری کنیم تا تغییرات ایجاد شده بر وزنها که در تعلیم قبلی اعمال شده‌اند را به حالت اولیه بازگردانیم، سپس می‌توانیم مدل را با بهینه ساز جدید تدوین کنیم: +اکنون بهینه ساز کاملا جدیدمان را در اختار داریم و می‌توانیم آن را تعلیم دهیم. ابتدا، اجازه دهید مدل را مجددا بارگذاری کنیم تا تغییرات ایجاد شده بر وزنها که در تعلیم قبلی اعمال شده‌اند را به حالت اولیه بازگردانیم، سپس می‌توانیم مدل را با بهینه ساز جدید تدوین کنیم: Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: From 268f7211876abf8faecae948161a91b4e70c2462 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 12:58:09 +0200 Subject: [PATCH 178/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index aed8bec16..980dbeaf7 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -137,7 +137,7 @@ Note a very common pitfall here — you *can* just pass the name of the loss as -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچکتر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد که به صورت‌های 10 به توان -3 یا 0.001 نیز نوشته می‌شود. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد که و صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes @@ -145,7 +145,7 @@ that optimizer with default values for all parameters, including learning rate. that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. -علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی نیز یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. +علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* @@ -177,13 +177,13 @@ opt = Adam(learning_rate=lr_scheduler) -کتابخانه ترنسفورمرهای هاگینگ‌فِیس همچنین یک تابع `create_optimizer()` دارد که بهینه‌سازی از نوع `AdamW` دارای میزان کاهش نرخ یادگیری می‌سازد. این یک میان‌بر مناسب است که آن‌ را با جزئیات در بخش‌های بعدی این آموزش خواهید دید. +کتابخانه ترنسفورمرهای هاگینگ‌فِیس همچنین یک تابع `create_optimizer()` دارد که بهینه‌سازی از نوع `AdamW`، دارای میزان کاهش نرخ یادگیری می‌سازد. این یک میان‌بر مناسب است که آن‌ را با جزئیات در بخش‌های بعدی این آموزش خواهید دید. The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. -اکنون بهینه ساز کاملا جدیدمان را در اختار داریم و می‌توانیم آن را تعلیم دهیم. ابتدا، اجازه دهید مدل را مجددا بارگذاری کنیم تا تغییرات ایجاد شده بر وزنها که در تعلیم قبلی اعمال شده‌اند را به حالت اولیه بازگردانیم، سپس می‌توانیم مدل را با بهینه ساز جدید تدوین کنیم: +اکنون بهینه‌ساز کاملا جدیدمان را در اختیار داریم و می‌توانیم آن را تعلیم دهیم. ابتدا، اجازه دهید مدل را مجددا بارگذاری کنیم تا تغییرات ایجاد شده بر وزنها که در تعلیم قبلی اعمال شده‌اند را به حالت اولیه بازگردانیم، سپس می‌توانیم مدل را با بهینه ساز جدید تدوین کنیم: Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: @@ -199,6 +199,8 @@ model.compile(optimizer=opt, loss=loss, metrics=["accuracy"]) +حالا دوباره مدل را تعلیم می‌دهیم: + Now, we fit again:
@@ -211,7 +213,7 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در این‌باره در [Chapter 4](/course/chapter4/3) بیشتر خواهیم آموخت. +اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در [Chapter 4](/course/chapter4/3) در این مورد بیشتر خواهیم آموخت. 💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) @@ -223,7 +225,7 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما چه کار کنیم اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها یا چه برای استفاده در خط تولید، خروجی دریافت کنیم؟ برای انجام این کار می‌توانیم از تابع `predict()` استفاده کنیم. این کار *logits* را از لایه‌ سَر خروجی مدل، یکی به ازای هر کلاس، باز می‌گرداند. +تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ به برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار به ازای هر دسته یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند. Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. From 56bf11959795e896fe66e982d085b4751a3987f7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 12:59:41 +0200 Subject: [PATCH 179/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 980dbeaf7..0ab11ef6c 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -225,7 +225,7 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ به برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار به ازای هر دسته یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند. +تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ به برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار ازای هر کلاس یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند. Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. From b1c8c1d4e9320daa7842e06b8860476966331457 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:00:09 +0200 Subject: [PATCH 180/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 0ab11ef6c..ac74e527e 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -225,7 +225,7 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ به برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار ازای هر کلاس یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند. +تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ به برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار به ازای هر کلاس یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند. Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. From 4f974d5a1ea14cd5c8276f74cd455564b9b79f49 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:01:16 +0200 Subject: [PATCH 181/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index ac74e527e..e3d60b658 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -238,7 +238,7 @@ preds = model.predict(tf_validation_dataset)["logits"]
-سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگترین `logit`، که نماینده محتمل ترین دسته می‌باشد به پیش‌بینی‌های دسته مدل تبدیل کنیم، +سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگ‌ترین `logit`، که نماینده محتمل ترین دسته می‌باشد، به پیش‌بینی‌های دسته مدل تبدیل کنیم، We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: From 64303ef6c2e96b5d20968680e6c5881b1bbbf938 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:01:59 +0200 Subject: [PATCH 182/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index e3d60b658..cafd7f59e 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -238,7 +238,7 @@ preds = model.predict(tf_validation_dataset)["logits"] -سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگ‌ترین `logit`، که نماینده محتمل ترین دسته می‌باشد، به پیش‌بینی‌های دسته مدل تبدیل کنیم، +سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگ‌ترین `logit`، که نماینده محتمل‌ترین دسته می‌باشد، به پیش‌بینی‌های دسته مدل تبدیل کنیم، We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: From 67f1b0bb8836a85eaad785c7a22e99a337201583 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:04:43 +0200 Subject: [PATCH 183/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index cafd7f59e..91420a328 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -238,7 +238,7 @@ preds = model.predict(tf_validation_dataset)["logits"] -سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگ‌ترین `logit`، که نماینده محتمل‌ترین دسته می‌باشد، به پیش‌بینی‌های دسته مدل تبدیل کنیم، +سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگ‌ترین `logit`، که نماینده محتمل‌ترین دسته می‌باشد، به پیش‌بینی‌های دسته مدل تبدیل کنیم: We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: @@ -282,7 +282,7 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l -از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. +از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. From c0940eaae50098cdec49fc505b1f298fcbf91ddb Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:13:36 +0200 Subject: [PATCH 184/254] prune original text --- chapters/fa/chapter3/3_tf.mdx | 58 ++--------------------------------- 1 file changed, 2 insertions(+), 56 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 91420a328..0d7aea252 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -4,7 +4,6 @@ # کوک کردن مدل‌ها با استفاده از کِراس -# Fine-tuning a model with Keras `model.fit()`
روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPUها یا TPUهای مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. -Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). - نمونه کدهای زیر فرض می‌کنند که شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: -The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: -
```py @@ -63,20 +58,15 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( مدل‌های تِنسورفِلو که از ترَنسفورمِرهای هاگینگ‌فِیس وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. -TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. جمله بالا به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار بسیار کمی لازم است تا تعلیم را روی آن شروع کنیم. -That means that once we have our data, very little work is required to begin training on it. - مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب دسته استفاده خواهیم کرد: -As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: -
```py @@ -89,18 +79,12 @@ model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_lab شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه سَر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه سَر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه‌ سَر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه‌ سَر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان کاری است که می‌خواهیم اکنون انجام دهیم. -You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. - برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین هزینه `training` و هزینه `validation` را در انتهای هر epoch گزارش می‌دهد. -To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. - توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع هزینه مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع هزینه در زمان `compile()` تعیین نکنید آنها از این تابع هزینه به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع هزینه داخلی شما نیاز خواهید داشت برچسب دسته‌های خودتان را به عنوان بخشی از ورودی، نه به صورت یک برچسب دسته مجزا که روش معمول استفاده از برچسب دسته‌ها در مدل‌های کِراس می‌باشد، ارسال کنید. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع هزینه‌ی درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع هزینه استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. -Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. -
@@ -125,35 +109,17 @@ model.fit( در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغیر متنی برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softmax از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax به آنها اعمال شود به خروجی می‌دهند، که همچنین به عنوان *logits* شناخته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم، این کاری است که مدل‌مان انجام می‌دهد و تنها راه گفتن آن این است که به جای ارسال نام تابع هزینه به صورت متغیر متنی، آن را به صورت مستقیم صدا بزنیم. -Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. - ### بهبود کارایی تعلیم - -### Improving training performance - اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد که و صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. -If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause -is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes -that optimizer with default values for all parameters, including learning rate. From long experience, though, we know -that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written -as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. - علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. -In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate -over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* -the learning rate. In Keras, the best way to do this is to use a *learning rate scheduler*. A good one to use is -`PolynomialDecay` — despite the name, with default settings it simply linearly decays the learning rate from the initial -value to the final value over the course of training, which is exactly what we want. In order to use a scheduler correctly, -though, we need to tell it how long training is going to be. We compute that as `num_train_steps` below. -
```py @@ -179,14 +145,10 @@ opt = Adam(learning_rate=lr_scheduler) کتابخانه ترنسفورمرهای هاگینگ‌فِیس همچنین یک تابع `create_optimizer()` دارد که بهینه‌سازی از نوع `AdamW`، دارای میزان کاهش نرخ یادگیری می‌سازد. این یک میان‌بر مناسب است که آن‌ را با جزئیات در بخش‌های بعدی این آموزش خواهید دید. -The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. - اکنون بهینه‌ساز کاملا جدیدمان را در اختیار داریم و می‌توانیم آن را تعلیم دهیم. ابتدا، اجازه دهید مدل را مجددا بارگذاری کنیم تا تغییرات ایجاد شده بر وزنها که در تعلیم قبلی اعمال شده‌اند را به حالت اولیه بازگردانیم، سپس می‌توانیم مدل را با بهینه ساز جدید تدوین کنیم: -Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: -
```py @@ -199,9 +161,7 @@ model.compile(optimizer=opt, loss=loss, metrics=["accuracy"])
-حالا دوباره مدل را تعلیم می‌دهیم: - -Now, we fit again: +حالا دوباره مدل را فیت می‌کنیم:
@@ -213,23 +173,17 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در [Chapter 4](/course/chapter4/3) در این مورد بیشتر خواهیم آموخت. - -💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) +💡 اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در [Chapter 4](/course/chapter4/3) در این مورد بیشتر خواهیم آموخت. ### پیش‌بینی‌های مدل -### Model predictions - تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ به برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار به ازای هر کلاس یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند. -Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. -
```py @@ -240,8 +194,6 @@ preds = model.predict(tf_validation_dataset)["logits"] سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگ‌ترین `logit`، که نماینده محتمل‌ترین دسته می‌باشد، به پیش‌بینی‌های دسته مدل تبدیل کنیم: -We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: -
```py @@ -261,8 +213,6 @@ print(preds.shape, class_preds.shape) اکنون، اجازه دهید از `preds` برای محاسبه برخی معیارها استفاده کنیم! ما می‌توانیم معیارهای مرتبط با دیتاسِت MRPC را، به همان آسانی که دیتاسِت را بارگذاری کردیم، بارگذاری کنیم اما این بار با استفاده از تابع `load_metric()`. شیء باز گردانده شده تابعی به نام `compute()` دارد که می‌توانیم برای محاسبه معیارها از آن استفاده کنیم: -Now, let's use those `preds` to compute some metrics! We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: -
```py @@ -284,10 +234,6 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. -The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. - به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` در فصل ۷ ارائه خواهد شد. اگر مایلید خود را روی `API` کِراس کار آزموده کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ای که در بخش ۲ انجام دادید, کوک کنید. -This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in Chapter 7. If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. -
\ No newline at end of file From 350986fb7a5a1130145aedfcb61c0aad7cf9c85a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:15:07 +0200 Subject: [PATCH 185/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 0d7aea252..bc7a4c0bb 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -234,6 +234,6 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. -به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` در فصل ۷ ارائه خواهد شد. اگر مایلید خود را روی `API` کِراس کار آزموده کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ای که در بخش ۲ انجام دادید, کوک کنید. +به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` در فصل ۷ ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ای که در بخش ۲ انجام دادید, کوک کنید.
\ No newline at end of file From 898295e6915c71b8e269bb497d34082ecf64b83c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:15:53 +0200 Subject: [PATCH 186/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index bc7a4c0bb..f5e1f706f 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -234,6 +234,6 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. -به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` در فصل ۷ ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ای که در بخش ۲ انجام دادید, کوک کنید. +به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. در فصل ۷ یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ای که در بخش ۲ انجام دادید, کوک کنید.
\ No newline at end of file From e2ee265bb828907ab889b9477417ccb3d1949a7b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:16:34 +0200 Subject: [PATCH 187/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index f5e1f706f..fe457123c 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -234,6 +234,6 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. -به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. در فصل ۷ یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ای که در بخش ۲ انجام دادید, کوک کنید. +به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. در فصل ۷ یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ که در بخش ۲ انجام دادید, کوک کنید.
\ No newline at end of file From 4fd6112ffb354db51667bea7d965a89537bf53ee Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:17:09 +0200 Subject: [PATCH 188/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index fe457123c..71d76fc47 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -234,6 +234,6 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. -به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. در فصل ۷ یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`, با استفاده از روش پردازش داده‌ که در بخش ۲ انجام دادید, کوک کنید. +به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. در فصل ۷ یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`، با استفاده از روش پردازش داده‌ که در بخش ۲ انجام دادید، کوک کنید.
\ No newline at end of file From 611b3ca428a4087d7d9361bbf169ac5a75535f17 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:20:03 +0200 Subject: [PATCH 189/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 71d76fc47..c6e573ba7 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -12,7 +12,7 @@ {label: "Aws Studio", value: "https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/chapter3/section3_tf.ipynb"}, ]} /> -وقتی که شما همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPUها یا TPUهای مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. +زمانی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPUها یا TPUهای مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. نمونه کدهای زیر فرض می‌کنند که شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: From e7c671de7e02e3c9cd41055010a6dae390ac7af7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:21:19 +0200 Subject: [PATCH 190/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index c6e573ba7..982679336 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -12,7 +12,7 @@ {label: "Aws Studio", value: "https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/chapter3/section3_tf.ipynb"}, ]} /> -زمانی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPUها یا TPUهای مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. +زمانی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. نمونه کدهای زیر فرض می‌کنند که شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: From 541e0fdbb220b8fc780bf8200c7105f83a00cd84 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:23:02 +0200 Subject: [PATCH 191/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 982679336..0e2fafec3 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -61,7 +61,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( -جمله بالا به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار بسیار کمی لازم است تا تعلیم را روی آن شروع کنیم. +این به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار بسیار کمی لازم است تا تعلیم را روی آن شروع کنیم. From 42d214ad8335351514e9c9ed78f8829ab6f35b9a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:27:07 +0200 Subject: [PATCH 192/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 0e2fafec3..5a5a9f45f 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -116,7 +116,7 @@ model.fit( -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد که و صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد که به صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. From 49985766291d8dd03f8c3aceeaa0e0c725344cc5 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:27:56 +0200 Subject: [PATCH 193/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 5a5a9f45f..5cd98f554 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -116,7 +116,7 @@ model.fit( -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد که به صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و به صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. From 41ecfb1c0e439c639b6605042d7cf7857cf31bfd Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:28:55 +0200 Subject: [PATCH 194/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 5cd98f554..76b0fe996 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -118,7 +118,7 @@ model.fit( اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و به صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. -علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. +علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپُختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم.
From 10c311684e0cca9c042f1f2fc8fd5911344ba493 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Fri, 3 Jun 2022 13:31:33 +0200 Subject: [PATCH 195/254] minor fix --- chapters/fa/chapter3/3_tf.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 76b0fe996..9e1b2be95 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -181,7 +181,7 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ به برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار به ازای هر کلاس یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند. +تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار به ازای هر کلاس یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند.
From ab1f91c50ee65531c6b57c887edd4b01a042f4f0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sat, 11 Jun 2022 18:16:20 +0200 Subject: [PATCH 196/254] new file added --- chapters/fa/chapter3/3.mdx | 176 +++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 chapters/fa/chapter3/3.mdx diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx new file mode 100644 index 000000000..5265697e2 --- /dev/null +++ b/chapters/fa/chapter3/3.mdx @@ -0,0 +1,176 @@ + + +
+ +# کوک کردن مدل‌ها با استفاده API تعلیم + +# Fine-tuning a model with the Trainer API + + + + + +🤗 Transformers provides a `Trainer` class to help you fine-tune any of the pretrained models it provides on your dataset. Once you've done all the data preprocessing work in the last section, you have just a few steps left to define the `Trainer`. The hardest part is likely to be preparing the environment to run `Trainer.train()`, as it will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). + +The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: + +```py +from datasets import load_dataset +from transformers import AutoTokenizer, DataCollatorWithPadding + +raw_datasets = load_dataset("glue", "mrpc") +checkpoint = "bert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) + + +def tokenize_function(example): + return tokenizer(example["sentence1"], example["sentence2"], truncation=True) + + +tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) +data_collator = DataCollatorWithPadding(tokenizer=tokenizer) +``` + +### Training + +The first step before we can define our `Trainer` is to define a `TrainingArguments` class that will contain all the hyperparameters the `Trainer` will use for training and evaluation. The only argument you have to provide is a directory where the trained model will be saved, as well as the checkpoints along the way. For all the rest, you can leave the defaults, which should work pretty well for a basic fine-tuning. + +```py +from transformers import TrainingArguments + +training_args = TrainingArguments("test-trainer") +``` + + + +💡 If you want to automatically upload your model to the Hub during training, pass along `push_to_hub=True` in the `TrainingArguments`. We will learn more about this in [Chapter 4](/course/chapter4/3) + + + +The second step is to define our model. As in the [previous chapter](/course/chapter2), we will use the `AutoModelForSequenceClassification` class, with two labels: + +```py +from transformers import AutoModelForSequenceClassification + +model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) +``` + +You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. + +Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: + +```py +from transformers import Trainer + +trainer = Trainer( + model, + training_args, + train_dataset=tokenized_datasets["train"], + eval_dataset=tokenized_datasets["validation"], + data_collator=data_collator, + tokenizer=tokenizer, +) +``` + +Note that when you pass the `tokenizer` as we did here, the default `data_collator` used by the `Trainer` will be a `DataCollatorWithPadding` as defined previously, so you can skip the line `data_collator=data_collator` in this call. It was still important to show you this part of the processing in section 2! + +To fine-tune the model on our dataset, we just have to call the `train()` method of our `Trainer`: + +```py +trainer.train() +``` + +This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: + +1. We didn't tell the `Trainer` to evaluate during training by setting `evaluation_strategy` to either `"steps"` (evaluate every `eval_steps`) or `"epoch"` (evaluate at the end of each epoch). +2. We didn't provide the `Trainer` with a `compute_metrics()` function to calculate a metric during said evaluation (otherwise the evaluation would just have printed the loss, which is not a very intuitive number). + + +### Evaluation + +Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command: + +```py +predictions = trainer.predict(tokenized_datasets["validation"]) +print(predictions.predictions.shape, predictions.label_ids.shape) +``` + +```python out +(408, 2) (408,) +``` + +The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. + +As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: + +```py +import numpy as np + +preds = np.argmax(predictions.predictions, axis=-1) +``` + +We can now compare those `preds` to the labels. To build our `compute_metric()` function, we will rely on the metrics from the 🤗 Datasets library. We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: + +```py +from datasets import load_metric + +metric = load_metric("glue", "mrpc") +metric.compute(predictions=preds, references=predictions.label_ids) +``` + +```python out +{'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} +``` + +The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. + +Wrapping everything together, we get our `compute_metrics()` function: + +```py +def compute_metrics(eval_preds): + metric = load_metric("glue", "mrpc") + logits, labels = eval_preds + predictions = np.argmax(logits, axis=-1) + return metric.compute(predictions=predictions, references=labels) +``` + +And to see it used in action to report metrics at the end of each epoch, here is how we define a new `Trainer` with this `compute_metrics()` function: + +```py +training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch") +model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) + +trainer = Trainer( + model, + training_args, + train_dataset=tokenized_datasets["train"], + eval_dataset=tokenized_datasets["validation"], + data_collator=data_collator, + tokenizer=tokenizer, + compute_metrics=compute_metrics, +) +``` + +Note that we create a new `TrainingArguments` with its `evaluation_strategy` set to `"epoch"` and a new model — otherwise, we would just be continuing the training of the model we have already trained. To launch a new training run, we execute: + +``` +trainer.train() +``` + +This time, it will report the validation loss and metrics at the end of each epoch on top of the training loss. Again, the exact accuracy/F1 score you reach might be a bit different from what we found, because of the random head initialization of the model, but it should be in the same ballpark. + +The `Trainer` will work out of the box on multiple GPUs or TPUs and provides lots of options, like mixed-precision training (use `fp16 = True` in your training arguments). We will go over everything it supports in Chapter 10. + +This concludes the introduction to fine-tuning using the `Trainer` API. An example of doing this for most common NLP tasks will be given in [Chapter 7](/course/chapter7), but for now let's look at how to do the same thing in pure PyTorch. + + + +✏️ **Try it out!** Fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. + + + From 76da5dc8221c7d6f7d0b3fb4c0d9b5dba392805f Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 13 Jun 2022 10:39:20 +0200 Subject: [PATCH 197/254] new paragraph added --- chapters/fa/chapter3/3.mdx | 6 +++++- chapters/fa/chapter3/3_tf.mdx | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 5265697e2..4ece6177a 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -2,7 +2,7 @@
-# کوک کردن مدل‌ها با استفاده API تعلیم +# کوک کردن مدل‌ها با استفاده از API تعلیم دهنده # Fine-tuning a model with the Trainer API @@ -15,8 +15,12 @@ +ترنسفورمرهای هاگینگ‌فِیس کلاسی به نام `Trainer` دارند که برای کمک به کوک کردن هر مدل از پیش تعلیم دیده‌ای که روی داده شما ارائه می‌دهد به کار می‌رود. به محض اینکه همه کارهای پیش‌پردازش داده در بخش آخر را انجام دادید، فقط چند مرحله باقی‌مانده تا تعریف `Trainer` دارید. سخت ترین قسمت آماده‌سازی محیط جهت اجراي `Trainer.train()` می‌تواند باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود.اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. + 🤗 Transformers provides a `Trainer` class to help you fine-tune any of the pretrained models it provides on your dataset. Once you've done all the data preprocessing work in the last section, you have just a few steps left to define the `Trainer`. The hardest part is likely to be preparing the environment to run `Trainer.train()`, as it will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). +نمونه کدهای زیر فرض می‌کنند که شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: + The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: ```py diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 9e1b2be95..d631cc545 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -12,7 +12,7 @@ {label: "Aws Studio", value: "https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/chapter3/section3_tf.ipynb"}, ]} /> -زمانی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قیمانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. +زمانی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قی‌مانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. نمونه کدهای زیر فرض می‌کنند که شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: From c34e358c7acad82238e8f6045a48516ae4c643ed Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 13 Jun 2022 10:41:10 +0200 Subject: [PATCH 198/254] right to left span --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 4ece6177a..f372f8b14 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -15,7 +15,7 @@ -ترنسفورمرهای هاگینگ‌فِیس کلاسی به نام `Trainer` دارند که برای کمک به کوک کردن هر مدل از پیش تعلیم دیده‌ای که روی داده شما ارائه می‌دهد به کار می‌رود. به محض اینکه همه کارهای پیش‌پردازش داده در بخش آخر را انجام دادید، فقط چند مرحله باقی‌مانده تا تعریف `Trainer` دارید. سخت ترین قسمت آماده‌سازی محیط جهت اجراي `Trainer.train()` می‌تواند باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود.اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. +ترنسفورمرهای هاگینگ‌فِیس کلاسی به نام `Trainer` دارند که برای کمک به کوک کردن هر مدل از پیش تعلیم دیده‌ای که روی داده شما ارائه می‌دهد به کار می‌رود. به محض اینکه همه کارهای پیش‌پردازش داده در بخش آخر را انجام دادید، فقط چند مرحله باقی‌مانده تا تعریف `Trainer` دارید. سخت ترین قسمت آماده‌سازی محیط جهت اجراي `Trainer.train()` می‌تواند باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود.اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. 🤗 Transformers provides a `Trainer` class to help you fine-tune any of the pretrained models it provides on your dataset. Once you've done all the data preprocessing work in the last section, you have just a few steps left to define the `Trainer`. The hardest part is likely to be preparing the environment to run `Trainer.train()`, as it will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). From 8112c47f3955eb42f2db2217a049318ddd15fcb7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 13 Jun 2022 11:10:21 +0200 Subject: [PATCH 199/254] new paragraph added --- chapters/fa/chapter3/3.mdx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index f372f8b14..c6dcecd1d 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -15,7 +15,7 @@ -ترنسفورمرهای هاگینگ‌فِیس کلاسی به نام `Trainer` دارند که برای کمک به کوک کردن هر مدل از پیش تعلیم دیده‌ای که روی داده شما ارائه می‌دهد به کار می‌رود. به محض اینکه همه کارهای پیش‌پردازش داده در بخش آخر را انجام دادید، فقط چند مرحله باقی‌مانده تا تعریف `Trainer` دارید. سخت ترین قسمت آماده‌سازی محیط جهت اجراي `Trainer.train()` می‌تواند باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود.اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. +ترنسفورمرهای هاگینگ‌فِیس کلاسی به نام `Trainer` دارند که برای کمک به کوک کردن هر مدل از پیش تعلیم دیده‌ای که روی داده شما ارائه می‌دهد به کار می‌رود. به محض اینکه همه کارهای پیش‌پردازش داده در بخش آخر را انجام دادید، فقط چند مرحله باقی‌مانده تا تعریف `Trainer` دارید. سخت ترین قسمت آماده‌سازی محیط جهت اجراي `Trainer.train()` می‌تواند باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود. اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. 🤗 Transformers provides a `Trainer` class to help you fine-tune any of the pretrained models it provides on your dataset. Once you've done all the data preprocessing work in the last section, you have just a few steps left to define the `Trainer`. The hardest part is likely to be preparing the environment to run `Trainer.train()`, as it will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). @@ -40,8 +40,12 @@ tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) data_collator = DataCollatorWithPadding(tokenizer=tokenizer) ``` +### تعلیم + ### Training +قبل از این که بتوانیم `Trainer` مان را تعریف کنیم اولین مرحله تعریف کلاس `TrainingArguments` می‌باشد که شامل همه پارامترهای سطح بالایی است که `Trainer` برای `Training` و `Evaluation` استفاده خواهد کرد. تنها آرگومانی که شما باید ارائه کنید آدرسی است که مدل تعلیم دیده به همراه نفاط تعلیم در آن ذخیره خواهند شد. بقیه پارامترها را می‌توانید به حالت پیش‌فرض رها کنید، که برای کوک کردن پایه به خوبی کار خواهد کرد. + The first step before we can define our `Trainer` is to define a `TrainingArguments` class that will contain all the hyperparameters the `Trainer` will use for training and evaluation. The only argument you have to provide is a directory where the trained model will be saved, as well as the checkpoints along the way. For all the rest, you can leave the defaults, which should work pretty well for a basic fine-tuning. ```py @@ -52,10 +56,14 @@ training_args = TrainingArguments("test-trainer") +اگر مایلید مدل‌تان را در حین تعلیم در هاب بارگذاری کنید، پارامتر `push_to_hub=True` را در `TrainingArguments` ارسال کنید. در [فصل ۴](/course/chapter4/3) در این باره بیشتر خواهیم آموخت. + 💡 If you want to automatically upload your model to the Hub during training, pass along `push_to_hub=True` in the `TrainingArguments`. We will learn more about this in [Chapter 4](/course/chapter4/3) +مرحله دوم تعریف مدل‌مان می‌باشد. مانند [فصل قبل](/course/chapter2)، از کلاس `AutoModelForSequenceClassification` با دو برچسب کلاس استفاده خواهیم کرد: + The second step is to define our model. As in the [previous chapter](/course/chapter2), we will use the `AutoModelForSequenceClassification` class, with two labels: ```py From 6e5541763b98650bc1d48baa6a20e36fa47a3e36 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 13 Jun 2022 11:16:44 +0200 Subject: [PATCH 200/254] left to right code sections fixed --- chapters/fa/chapter3/3.mdx | 44 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index c6dcecd1d..af01f33c3 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -23,6 +23,8 @@ The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: +
+ ```py from datasets import load_dataset from transformers import AutoTokenizer, DataCollatorWithPadding @@ -40,6 +42,8 @@ tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) data_collator = DataCollatorWithPadding(tokenizer=tokenizer) ``` +
+ ### تعلیم ### Training @@ -48,12 +52,16 @@ data_collator = DataCollatorWithPadding(tokenizer=tokenizer) The first step before we can define our `Trainer` is to define a `TrainingArguments` class that will contain all the hyperparameters the `Trainer` will use for training and evaluation. The only argument you have to provide is a directory where the trained model will be saved, as well as the checkpoints along the way. For all the rest, you can leave the defaults, which should work pretty well for a basic fine-tuning. +
+ ```py from transformers import TrainingArguments training_args = TrainingArguments("test-trainer") ``` +
+ اگر مایلید مدل‌تان را در حین تعلیم در هاب بارگذاری کنید، پارامتر `push_to_hub=True` را در `TrainingArguments` ارسال کنید. در [فصل ۴](/course/chapter4/3) در این باره بیشتر خواهیم آموخت. @@ -66,16 +74,22 @@ training_args = TrainingArguments("test-trainer") The second step is to define our model. As in the [previous chapter](/course/chapter2), we will use the `AutoModelForSequenceClassification` class, with two labels: +
+ ```py from transformers import AutoModelForSequenceClassification model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) ``` +
+ You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: +
+ ```py from transformers import Trainer @@ -89,14 +103,20 @@ trainer = Trainer( ) ``` +
+ Note that when you pass the `tokenizer` as we did here, the default `data_collator` used by the `Trainer` will be a `DataCollatorWithPadding` as defined previously, so you can skip the line `data_collator=data_collator` in this call. It was still important to show you this part of the processing in section 2! To fine-tune the model on our dataset, we just have to call the `train()` method of our `Trainer`: +
+ ```py trainer.train() ``` +
+ This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: 1. We didn't tell the `Trainer` to evaluate during training by setting `evaluation_strategy` to either `"steps"` (evaluate every `eval_steps`) or `"epoch"` (evaluate at the end of each epoch). @@ -107,6 +127,8 @@ This will start the fine-tuning (which should take a couple of minutes on a GPU) Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command: +
+ ```py predictions = trainer.predict(tokenized_datasets["validation"]) print(predictions.predictions.shape, predictions.label_ids.shape) @@ -116,18 +138,26 @@ print(predictions.predictions.shape, predictions.label_ids.shape) (408, 2) (408,) ``` +
+ The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: +
+ ```py import numpy as np preds = np.argmax(predictions.predictions, axis=-1) ``` +
+ We can now compare those `preds` to the labels. To build our `compute_metric()` function, we will rely on the metrics from the 🤗 Datasets library. We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: +
+ ```py from datasets import load_metric @@ -139,10 +169,14 @@ metric.compute(predictions=preds, references=predictions.label_ids) {'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} ``` +
+ The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. Wrapping everything together, we get our `compute_metrics()` function: +
+ ```py def compute_metrics(eval_preds): metric = load_metric("glue", "mrpc") @@ -151,8 +185,12 @@ def compute_metrics(eval_preds): return metric.compute(predictions=predictions, references=labels) ``` +
+ And to see it used in action to report metrics at the end of each epoch, here is how we define a new `Trainer` with this `compute_metrics()` function: +
+ ```py training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch") model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) @@ -168,12 +206,18 @@ trainer = Trainer( ) ``` +
+ Note that we create a new `TrainingArguments` with its `evaluation_strategy` set to `"epoch"` and a new model — otherwise, we would just be continuing the training of the model we have already trained. To launch a new training run, we execute: +
+ ``` trainer.train() ``` +
+ This time, it will report the validation loss and metrics at the end of each epoch on top of the training loss. Again, the exact accuracy/F1 score you reach might be a bit different from what we found, because of the random head initialization of the model, but it should be in the same ballpark. The `Trainer` will work out of the box on multiple GPUs or TPUs and provides lots of options, like mixed-precision training (use `fp16 = True` in your training arguments). We will go over everything it supports in Chapter 10. From b5f9674376ccee15f33e9bdf7955fd58ac0703e0 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 13 Jun 2022 17:39:32 +0200 Subject: [PATCH 201/254] two new paragraphs added --- chapters/fa/chapter3/3.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index af01f33c3..9e85d59ed 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -84,8 +84,13 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label
+ +شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه سَر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه سَر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه‌ سَر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه‌ سَر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان کاری است که می‌خواهیم اکنون انجام دهیم. + You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `model`، training دیتاسِت‌های validation و `data_collator`مان `training_args` و توکِنایزرمان به آن تعریف کنیم: + Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`:
From 33e599477184054277b282d790bf694a6478f2b3 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 13 Jun 2022 17:44:33 +0200 Subject: [PATCH 202/254] minor sentence structure fixed --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 9e85d59ed..65cd3843e 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `model`، training دیتاسِت‌های validation و `data_collator`مان `training_args` و توکِنایزرمان به آن تعریف کنیم: +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `model`، `training_args`، دیتاسِت‌های `training` و `validation`، `data_collator و توکِنایزرمان به آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From 6480710ca8c4d7286454ec736c2efbc627835e2c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 13 Jun 2022 17:46:17 +0200 Subject: [PATCH 203/254] minor sentence structure fixed --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 65cd3843e..56cc6ca10 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `model`، `training_args`، دیتاسِت‌های `training` و `validation`، `data_collator و توکِنایزرمان به آن تعریف کنیم: +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `model`، `training_args`، دیتاسِت‌های `training` و `validation`، `data_collator` و توکِنایزرمان به آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From 631312fe19e30b136edab38ed7b26bb8ee929f35 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Mon, 13 Jun 2022 19:44:05 +0200 Subject: [PATCH 204/254] new paragraphs added --- chapters/fa/chapter3/3.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 56cc6ca10..f585ef1ca 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -110,8 +110,12 @@ trainer = Trainer(
+توجه داشته باشید زمانی که `tokenizer` را ارسال می‌کنید، همانطور که ما در اینجا انجام دادیم، `data_collator` پیش‌فرض مورد استفاده `Trainer` `DataCollatorWithPadding` خواهد بود، همانطور که قبلا تعریف کردیم، پس شما می‌توانید خط `data_collator=data_collator` را در این صدا کردن نادیده بگیرید. + Note that when you pass the `tokenizer` as we did here, the default `data_collator` used by the `Trainer` will be a `DataCollatorWithPadding` as defined previously, so you can skip the line `data_collator=data_collator` in this call. It was still important to show you this part of the processing in section 2! +برای کوک کردن مدل روی دیتاسِت‌مان ما فقط باید تابع `train()` از `Trainer`مان را صدا بزنیم: + To fine-tune the model on our dataset, we just have to call the `train()` method of our `Trainer`:
From 04eac7793aff1aa07e52d829f3835275f1e0e66b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 14 Jun 2022 19:16:07 +0200 Subject: [PATCH 205/254] new paragraph added --- chapters/fa/chapter3/3.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index f585ef1ca..97263239a 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -126,8 +126,13 @@ trainer.train()
+این کار کوک کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و خطای تعلیم را هر ۵۰۰ مرحله یکبار گزارش می‌کند. با این حال به شما نمی‌گوید که مدل‌تان چقدر خوب (یا بد) عمل می‌کند. این به این خاطر است که: + This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: +۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با تنظیم پارامتر `evaluation_strategy` به `"steps"` (جهت ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر ایپاک) +۲. ما تابع `compute_metrics()` را جهت محاسبه معیارها در حین اصطلاحا ارزیابی (که در غیر این صورت فقط هزینه، که عدد چندان گویایی هم نیست، را چاپ می‌کرد) برای `Trainer` فراهم نکردیم. + 1. We didn't tell the `Trainer` to evaluate during training by setting `evaluation_strategy` to either `"steps"` (evaluate every `eval_steps`) or `"epoch"` (evaluate at the end of each epoch). 2. We didn't provide the `Trainer` with a `compute_metrics()` function to calculate a metric during said evaluation (otherwise the evaluation would just have printed the loss, which is not a very intuitive number). From 0cd3a2f1dbb98fd9b7b81b743d0a6ff5559a1458 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 14 Jun 2022 19:19:42 +0200 Subject: [PATCH 206/254] fixed typose --- chapters/fa/chapter3/3.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 97263239a..3960428f6 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -126,11 +126,12 @@ trainer.train()
-این کار کوک کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و خطای تعلیم را هر ۵۰۰ مرحله یکبار گزارش می‌کند. با این حال به شما نمی‌گوید که مدل‌تان چقدر خوب (یا بد) عمل می‌کند. این به این خاطر است که: +این کار کوک کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و هزینه تعلیم را هر ۵۰۰ مرحله یکبار گزارش می‌کند. با این حال به شما نمی‌گوید که مدل‌تان چقدر خوب (یا بد) عمل می‌کند. این به این خاطر است که: This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: -۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با تنظیم پارامتر `evaluation_strategy` به `"steps"` (جهت ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر ایپاک) +۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با تنظیم پارامتر `evaluation_strategy` به `"steps"` (جهت ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر ایپاک) انجام دهیم. + ۲. ما تابع `compute_metrics()` را جهت محاسبه معیارها در حین اصطلاحا ارزیابی (که در غیر این صورت فقط هزینه، که عدد چندان گویایی هم نیست، را چاپ می‌کرد) برای `Trainer` فراهم نکردیم. 1. We didn't tell the `Trainer` to evaluate during training by setting `evaluation_strategy` to either `"steps"` (evaluate every `eval_steps`) or `"epoch"` (evaluate at the end of each epoch). From 2e60166a86da6c665d50eec44ec4764566c09435 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 14 Jun 2022 19:28:52 +0200 Subject: [PATCH 207/254] new paragraph added --- chapters/fa/chapter3/3.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 3960428f6..7ad5ca092 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -130,7 +130,7 @@ trainer.train() This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: -۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با تنظیم پارامتر `evaluation_strategy` به `"steps"` (جهت ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر ایپاک) انجام دهیم. +۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با مقداردهی پارامتر `evaluation_strategy` به `"steps"` (جهت ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر ایپاک) انجام دهیم. ۲. ما تابع `compute_metrics()` را جهت محاسبه معیارها در حین اصطلاحا ارزیابی (که در غیر این صورت فقط هزینه، که عدد چندان گویایی هم نیست، را چاپ می‌کرد) برای `Trainer` فراهم نکردیم. @@ -138,8 +138,12 @@ This will start the fine-tuning (which should take a couple of minutes on a GPU) 2. We didn't provide the `Trainer` with a `compute_metrics()` function to calculate a metric during said evaluation (otherwise the evaluation would just have printed the loss, which is not a very intuitive number). +### ارزیابی + ### Evaluation +اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids` و دیکشنری باز می‌گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (که رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آنها می باشند). + Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command:
From 272dcccda470cf7119720831cc804883f4cff0db Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 14 Jun 2022 19:29:37 +0200 Subject: [PATCH 208/254] fixed typose --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 7ad5ca092..2fe856fd3 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -142,7 +142,7 @@ This will start the fine-tuning (which should take a couple of minutes on a GPU) ### Evaluation -اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids` و دیکشنری باز می‌گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (که رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آنها می باشند). +اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids` و دیکشنری باز می‌گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (که رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آنها می باشند). Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command: From e5389cc183b00ff3336dbe1eed50f9b1d161e684 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 14 Jun 2022 19:31:02 +0200 Subject: [PATCH 209/254] fixed typose --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 2fe856fd3..e4b979802 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -142,7 +142,7 @@ This will start the fine-tuning (which should take a couple of minutes on a GPU) ### Evaluation -اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids` و دیکشنری باز می‌گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (که رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آنها می باشند). +اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids`) و دیکشنری باز گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (که رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آنها می باشند). Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command: From cfe895878adaa2b7ed2afb69dd19a2b925535084 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 14 Jun 2022 19:33:45 +0200 Subject: [PATCH 210/254] fixed typose --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index e4b979802..1f12e86c2 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -142,7 +142,7 @@ This will start the fine-tuning (which should take a couple of minutes on a GPU) ### Evaluation -اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids`) و دیکشنری باز گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (که رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آنها می باشند). +اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids`) و دیکشنری باز گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (که رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آنها می باشند). برای استخراج چند پیش‌بینی‌ از مدل‌مان، می‌توانیم از دستور `Trainer.predict()` استفاده کنیم: Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command: From 0e614ca0258a04e633f3bdf4e4f14ff4b8833633 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 14 Jun 2022 19:40:28 +0200 Subject: [PATCH 211/254] new paragraph added --- chapters/fa/chapter3/3.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 1f12e86c2..aaf335232 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -159,6 +159,8 @@ print(predictions.predictions.shape, predictions.label_ids.shape)
+خروجی تابع --- تاپل نام گذاری شده دیگری شامل سه فیلد: `predictions`، `label_ids` و `metrics` می‌باشد. فیلد `metrics` فقط شامل هزینه داده عبور کرده و برخی معیارهای زمان (در مجموع و به طور میانگین پیش‌بینی‌ چقدر طول کشید) می‌باشد. + The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: From b4dad8abb49b1b00c22afe36da9d47a592319de7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 19 Jun 2022 12:48:41 +0200 Subject: [PATCH 212/254] new paragraphs added --- chapters/fa/chapter3/3.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index aaf335232..dc5ce898e 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -159,10 +159,12 @@ print(predictions.predictions.shape, predictions.label_ids.shape)
-خروجی تابع --- تاپل نام گذاری شده دیگری شامل سه فیلد: `predictions`، `label_ids` و `metrics` می‌باشد. فیلد `metrics` فقط شامل هزینه داده عبور کرده و برخی معیارهای زمان (در مجموع و به طور میانگین پیش‌بینی‌ چقدر طول کشید) می‌باشد. +خروجی تابع `predict()` تاپل نام گذاری شده دیگری شامل سه فیلد: `predictions`، `label_ids` و `metrics` می‌باشد. فیلد `metrics` فقط شامل هزینه داده عبور کرده و برخی معیارهای زمان (در مجموع و به طور میانگین پیش‌بینی‌ چقدر طول کشیده) می‌باشد. به محض این که تابع `compute_metrics()` را کامل کرده و آنرا به `Trainer` ارسال کردیم، آن فیلد متریک‌های بازگشتی از `compute_metrics()` را نیز در بر خواهد داشت. The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. +همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مرود استفاده‌مان می‌باشد). این ها لاجیت‌های هر عنصر دیتاسِتی هستند که به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌ها که بتوانیم با برچسب‌هایمان مقایسه کنیم، ما لازم داریم که اندیس مقدار بیشینه رود محور دوم را برداریم: + As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis:
@@ -175,6 +177,8 @@ preds = np.argmax(predictions.predictions, axis=-1)
+اکنون می‌توانیم آن `preds`ها را با برچسب‌ها مقایسه کنیم. برای ساختن تابع `compute_metric()`مان، به متریک‌های کتابخانه داده‌های هاگینگ‌فِیس تکیه خواهیم کرد. ما می‌توانیم متریک های وابسته به دیتاسِت MRPC را به همان راحتی خود دیتاسِت بارگذاری کنیم، این بار با استفاده از تابع `load_metric()`. شیء بازگردانده شده تابعی به نام `compute()` دارد که می‌توانیم برای محاسبه متریک از آن استفاده کنیم: + We can now compare those `preds` to the labels. To build our `compute_metric()` function, we will rely on the metrics from the 🤗 Datasets library. We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation:
From 8ff8d2d82fc4ad9039eccd08787752abba4d2f45 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 19 Jun 2022 12:56:43 +0200 Subject: [PATCH 213/254] fixed typose --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index dc5ce898e..dc9c1086f 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -177,7 +177,7 @@ preds = np.argmax(predictions.predictions, axis=-1)
-اکنون می‌توانیم آن `preds`ها را با برچسب‌ها مقایسه کنیم. برای ساختن تابع `compute_metric()`مان، به متریک‌های کتابخانه داده‌های هاگینگ‌فِیس تکیه خواهیم کرد. ما می‌توانیم متریک های وابسته به دیتاسِت MRPC را به همان راحتی خود دیتاسِت بارگذاری کنیم، این بار با استفاده از تابع `load_metric()`. شیء بازگردانده شده تابعی به نام `compute()` دارد که می‌توانیم برای محاسبه متریک از آن استفاده کنیم: +اکنون می‌توانیم `preds` را با برچسب‌ها مقایسه کنیم. برای ساختن تابع `compute_metric()`، به متریک‌های کتابخانه داده‌های هاگینگ‌فِیس تکیه خواهیم کرد. ما می‌توانیم متریک‌های وابسته به دیتاسِت MRPC را به راحتی خود دیتاسِت، اما این بار با استفاده از تابع `load_metric()`، بارگذاری کنیم. شیء بازگردانده شده تابعی به نام `compute()` دارد که می‌توانیم برای محاسبه متریک از آن استفاده کنیم: We can now compare those `preds` to the labels. To build our `compute_metric()` function, we will rely on the metrics from the 🤗 Datasets library. We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: From 832d5c554d0ef3554311f9de814fba50b7766029 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 19 Jun 2022 13:01:16 +0200 Subject: [PATCH 214/254] fixed typose --- chapters/fa/chapter3/3.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index dc9c1086f..91957bc35 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -159,11 +159,11 @@ print(predictions.predictions.shape, predictions.label_ids.shape)
-خروجی تابع `predict()` تاپل نام گذاری شده دیگری شامل سه فیلد: `predictions`، `label_ids` و `metrics` می‌باشد. فیلد `metrics` فقط شامل هزینه داده عبور کرده و برخی معیارهای زمان (در مجموع و به طور میانگین پیش‌بینی‌ چقدر طول کشیده) می‌باشد. به محض این که تابع `compute_metrics()` را کامل کرده و آنرا به `Trainer` ارسال کردیم، آن فیلد متریک‌های بازگشتی از `compute_metrics()` را نیز در بر خواهد داشت. +خروجی تابع `predict()` تاپل نام گذاری شده دیگری شامل سه فیلد: `predictions`، `label_ids` و `metrics` می‌باشد. فیلد `metrics` فقط شامل هزینه داده عبور کرده و برخی معیارهای زمان (در مجموع و به طور میانگین پیش‌بینی‌ چقدر طول کشیده) می‌باشد. به محض این که تابع `compute_metrics()` را کامل کرده و آنرا به `Trainer` ارسال کنیم، آن فیلد متریک‌های بازگشتی از `compute_metrics()` را نیز در بر خواهد داشت. The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. -همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مرود استفاده‌مان می‌باشد). این ها لاجیت‌های هر عنصر دیتاسِتی هستند که به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌ها که بتوانیم با برچسب‌هایمان مقایسه کنیم، ما لازم داریم که اندیس مقدار بیشینه رود محور دوم را برداریم: +همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مرود استفاده‌مان می‌باشد). این ها لاجیت‌های هر عنصر دیتاسِتی هستند که به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌ها که بتوانیم با برچسب‌هایمان مقایسه کنیم، ما لازم داریم که اندیس مقدار بیشینه رود محور دوم را برداریم: As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: From f4883d80e47a8a2f9966165584037c9c5c211f04 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 19 Jun 2022 13:04:14 +0200 Subject: [PATCH 215/254] fixed typose --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 91957bc35..523d62968 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -163,7 +163,7 @@ print(predictions.predictions.shape, predictions.label_ids.shape) The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. -همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مرود استفاده‌مان می‌باشد). این ها لاجیت‌های هر عنصر دیتاسِتی هستند که به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌ها که بتوانیم با برچسب‌هایمان مقایسه کنیم، ما لازم داریم که اندیس مقدار بیشینه رود محور دوم را برداریم: +همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هر عنصر دیتاسِتی هستند که به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌ها که بتوانیم با برچسب‌هایمان مقایسه کنیم، ما لازم داریم که اندیس مقدار بیشینه رود محور دوم را برداریم: As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: From c38c6296aa7ec7f98bfff355a5bcc4844012e008 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 19 Jun 2022 13:05:06 +0200 Subject: [PATCH 216/254] fixed typose --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 523d62968..c0f513cb8 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -163,7 +163,7 @@ print(predictions.predictions.shape, predictions.label_ids.shape) The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. -همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هر عنصر دیتاسِتی هستند که به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌ها که بتوانیم با برچسب‌هایمان مقایسه کنیم، ما لازم داریم که اندیس مقدار بیشینه رود محور دوم را برداریم: +همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌ها که بتوانیم با برچسب‌هایمان مقایسه کنیم، ما لازم داریم که اندیس مقدار بیشینه رود محور دوم را برداریم: As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: From c43a5c12987ae64338dd67818d65790ea70ccc29 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 19 Jun 2022 13:06:40 +0200 Subject: [PATCH 217/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index c0f513cb8..b3c26e49c 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -163,7 +163,7 @@ print(predictions.predictions.shape, predictions.label_ids.shape) The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. -همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌ها که بتوانیم با برچسب‌هایمان مقایسه کنیم، ما لازم داریم که اندیس مقدار بیشینه رود محور دوم را برداریم: +همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌هایی که بتوانیم با برچسب‌هایمان مقایسه کنیم، نیاز داریم اندیس مقدار بیشینه روی محور دوم را برداریم: As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: From 08fa6b8d6e4a8d998dcc1545706219e1ab6b9b26 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Sun, 19 Jun 2022 13:07:50 +0200 Subject: [PATCH 218/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index b3c26e49c..7b943d1ed 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -163,7 +163,7 @@ print(predictions.predictions.shape, predictions.label_ids.shape) The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. -همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌هایی که بتوانیم با برچسب‌هایمان مقایسه کنیم، نیاز داریم اندیس مقدار بیشینه روی محور دوم را برداریم: +همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌هایی که بتوانیم با برچسب‌هایمان مقایسه کنیم، نیاز داریم اندیس مقدار بیشینه روی بعد دوم را برداریم: As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: From 66ef657d196f1286f1d367b92dace840bcc4baad Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 21 Jun 2022 13:05:18 +0200 Subject: [PATCH 219/254] new paragraphs added --- chapters/fa/chapter3/3.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 7b943d1ed..99a67cba0 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -196,8 +196,12 @@ metric.compute(predictions=preds, references=predictions.label_ids)
+از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا میتوانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` دارد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در [مقاله BERT](https://arxiv.org/pdf/1810.04805.pdf) `F1 Score` معادل ۸۸.۹ را برای مدل پایه گزارش می‌کند. آن مدل `uncased` بود، حال اینکه ما در اینجا از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. + The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. +با قرار دادن همه چیز کنارهم تابع `compute_metrics()` را بدست خواهیم آورد: + Wrapping everything together, we get our `compute_metrics()` function:
@@ -212,6 +216,8 @@ def compute_metrics(eval_preds):
+و در اینجا نشان می‌دهیم که چگونه یک `Trainer` جدید با استفاده از تابع `compute_metrics()` تعریف می‌کنیم، که ببینیم چگونه در عمل برای گزارش متریک‌های در پایان هر epoch مورد استفاده قرار می‌گیرد: + And to see it used in action to report metrics at the end of each epoch, here is how we define a new `Trainer` with this `compute_metrics()` function:
From 5fa39b32d1a7184e7fe3b1534154671f5ce90c16 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 21 Jun 2022 13:11:42 +0200 Subject: [PATCH 220/254] fixed wording --- chapters/fa/chapter3/3.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 99a67cba0..f39c7d3a5 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -196,11 +196,11 @@ metric.compute(predictions=preds, references=predictions.label_ids)
-از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا میتوانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` دارد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در [مقاله BERT](https://arxiv.org/pdf/1810.04805.pdf) `F1 Score` معادل ۸۸.۹ را برای مدل پایه گزارش می‌کند. آن مدل `uncased` بود، حال اینکه ما در اینجا از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. +از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا می‌توانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` بدست می‌آورد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf) `F1 Score` معادل ۸۸.۹ را برای مدل پایه گزارش می‌کند. توجه داشته باشید که آن مدل `uncased` بود، حال این که در اینجا ما از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. -با قرار دادن همه چیز کنارهم تابع `compute_metrics()` را بدست خواهیم آورد: +اکنون با قرار دادن همه چیز کنارهم تابع `compute_metrics()` را بدست خواهیم آورد: Wrapping everything together, we get our `compute_metrics()` function: @@ -216,7 +216,7 @@ def compute_metrics(eval_preds):
-و در اینجا نشان می‌دهیم که چگونه یک `Trainer` جدید با استفاده از تابع `compute_metrics()` تعریف می‌کنیم، که ببینیم چگونه در عمل برای گزارش متریک‌های در پایان هر epoch مورد استفاده قرار می‌گیرد: +و در اینجا نشان می‌دهیم که چگونه یک `Trainer` جدید با استفاده از تابع `compute_metrics()` تعریف می‌کنیم تا عملکرد آنرا در حین گزارش متریک‌ها در پایان هر epoch مشاهده کنیم: And to see it used in action to report metrics at the end of each epoch, here is how we define a new `Trainer` with this `compute_metrics()` function: From 6a432e4383061e8cc027cc1f696aacf11b780d3f Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Tue, 21 Jun 2022 13:15:23 +0200 Subject: [PATCH 221/254] fixed ltr --- chapters/fa/chapter3/3.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index f39c7d3a5..f6147f94e 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -196,7 +196,7 @@ metric.compute(predictions=preds, references=predictions.label_ids)
-از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا می‌توانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` بدست می‌آورد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf) `F1 Score` معادل ۸۸.۹ را برای مدل پایه گزارش می‌کند. توجه داشته باشید که آن مدل `uncased` بود، حال این که در اینجا ما از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. +از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا می‌توانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` بدست می‌آورد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، برای مدل پایه `F1 Score` معادل ۸۸.۹ را گزارش می‌کند. توجه داشته باشید که آن مدل `uncased` بود، حال این که در اینجا ما از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. @@ -216,7 +216,7 @@ def compute_metrics(eval_preds): -و در اینجا نشان می‌دهیم که چگونه یک `Trainer` جدید با استفاده از تابع `compute_metrics()` تعریف می‌کنیم تا عملکرد آنرا در حین گزارش متریک‌ها در پایان هر epoch مشاهده کنیم: +و در اینجا نشان می‌دهیم که چگونه یک `Trainer` جدید با استفاده از تابع `compute_metrics()` تعریف می‌کنیم، تا بتوانیم عملکرد آن را در حین گزارش متریک‌ها در پایان هر epoch مشاهده کنیم: And to see it used in action to report metrics at the end of each epoch, here is how we define a new `Trainer` with this `compute_metrics()` function: From df6e86f318eb75b7c0ad3807e4591ee1cf7ee893 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 09:41:18 +0200 Subject: [PATCH 222/254] new paragraphs added --- chapters/fa/chapter3/3.mdx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index f6147f94e..694d64762 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -2,7 +2,7 @@
-# کوک کردن مدل‌ها با استفاده از API تعلیم دهنده +# کوک کردن مدل‌ها با استفاده از API `Trainer` # Fine-tuning a model with the Trainer API @@ -239,6 +239,8 @@ trainer = Trainer(
+توجه داشته باشید که ما مدلی جدید و `TrainingArguments` جدیدی که `evaluation_strategy` آن `"epoch"` ست شده است می‌سازیم - در غیر این صورت فقط تعلیم مدلی را ادامه می‌دادیم که از تعلیم دیده بود. دستور زیر را برای راه‌اندازی دور جدید تعلیم اجرا می‌کنیم: + Note that we create a new `TrainingArguments` with its `evaluation_strategy` set to `"epoch"` and a new model — otherwise, we would just be continuing the training of the model we have already trained. To launch a new training run, we execute:
@@ -249,14 +251,22 @@ trainer.train()
+این بار هزینه validation و متریک‌ها را در پایان هر epoch و در بالای هزینه تعلیم گزارش می‌کنیم. دوباره، به خاطر مقدار دهی تصادفی اولیه لایه سر مدل، مقادیر دقیق accuracy/F1 score که شما بدست می‌آورید ممکن است کمی متفاوت از آنچه ما بدست آورده‌ایم باشد، اما این مقادیر باید در محدوده تخمینی یکسانی باشند. + This time, it will report the validation loss and metrics at the end of each epoch on top of the training loss. Again, the exact accuracy/F1 score you reach might be a bit different from what we found, because of the random head initialization of the model, but it should be in the same ballpark. +`Trainer` به صورت پیش فرض روی چندین GPU یا TPU کار خواهد کرد و گزینه‌های فراوانی، مثل تعلیم mixed-precision (از مقدار `fp16 = True` در آرگومان‌های تعلیم استفاده کنید) فراهم می‌کند. در فصل ۱۰ همه حالت‌هایی که پشتیبانی می‌کند را مرور خواهیم کرد. + The `Trainer` will work out of the box on multiple GPUs or TPUs and provides lots of options, like mixed-precision training (use `fp16 = True` in your training arguments). We will go over everything it supports in Chapter 10. +این پایان مقدمه‌ای بر کوک کردن با استفاده از `Trainer` API می‌باشد. در [فصل ۷](/course/chapter7) مثالی برای نشان دادن چگونگی انجام این کار برای معمول‌ترین مسئله‌های NLP ارائه خواهیم کرد، اما اکنون اجازه دهید ببینیم چگونه همین کار را صرفا با استفاده از PyTorch انجام دهیم. + This concludes the introduction to fine-tuning using the `Trainer` API. An example of doing this for most common NLP tasks will be given in [Chapter 7](/course/chapter7), but for now let's look at how to do the same thing in pure PyTorch. +✏️ **اتحان کنید!** با استفاده از پردازش داده‌ای که در بخش ۲ انجام دادی، مدلی را روی دیتاسِت GLUE SST-2 کوک کنید، + ✏️ **Try it out!** Fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. From 83bb189100dbaebd405037fe8a4a597e31d1c139 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 09:45:05 +0200 Subject: [PATCH 223/254] fixed sentece wording and structure --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 694d64762..ad6f7747d 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -15,7 +15,7 @@ -ترنسفورمرهای هاگینگ‌فِیس کلاسی به نام `Trainer` دارند که برای کمک به کوک کردن هر مدل از پیش تعلیم دیده‌ای که روی داده شما ارائه می‌دهد به کار می‌رود. به محض اینکه همه کارهای پیش‌پردازش داده در بخش آخر را انجام دادید، فقط چند مرحله باقی‌مانده تا تعریف `Trainer` دارید. سخت ترین قسمت آماده‌سازی محیط جهت اجراي `Trainer.train()` می‌تواند باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود. اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. +ترنسفورمرهای هاگینگ‌فِیس کلاسی به نام `Trainer` دارند که برای کمک به کوک کردن هر مدل از پیش تعلیم دیده‌ای که روی داده شما ارائه می‌دهد به کار می‌رود. به محض اینکه همه کارهای پیش‌پردازش داده در بخش آخر را انجام دادید، فقط چند مرحله باقی‌مانده تا تعریف `Trainer` دارید. سخت ترین قسمت، احتمالا آماده‌سازی محیط جهت اجراي `Trainer.train()` باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود. اگر GPU ندارید، می‌توانید از GPU یا TPUهای مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. 🤗 Transformers provides a `Trainer` class to help you fine-tune any of the pretrained models it provides on your dataset. Once you've done all the data preprocessing work in the last section, you have just a few steps left to define the `Trainer`. The hardest part is likely to be preparing the environment to run `Trainer.train()`, as it will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). From b0d38c0aaaad0969d7c3a7980bfdc30e279b610d Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 09:51:54 +0200 Subject: [PATCH 224/254] fixed sentece wording and structure --- chapters/fa/chapter3/3.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index ad6f7747d..926521fd3 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -15,7 +15,7 @@ -ترنسفورمرهای هاگینگ‌فِیس کلاسی به نام `Trainer` دارند که برای کمک به کوک کردن هر مدل از پیش تعلیم دیده‌ای که روی داده شما ارائه می‌دهد به کار می‌رود. به محض اینکه همه کارهای پیش‌پردازش داده در بخش آخر را انجام دادید، فقط چند مرحله باقی‌مانده تا تعریف `Trainer` دارید. سخت ترین قسمت، احتمالا آماده‌سازی محیط جهت اجراي `Trainer.train()` باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود. اگر GPU ندارید، می‌توانید از GPU یا TPUهای مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. +ترنسفورمرهای هاگینگ‌فِیس کلاسی به نام `Trainer` دارند که برای کمک به کوک کردن هر مدل از پیش تعلیم دیده‌ای که روی داده شما ارائه می‌دهد به کار می‌رود. به محض اینکه همه کارهای پیش‌پردازش داده در بخش آخر را انجام دادید، فقط چند مرحله باقی‌مانده تا تعریف `Trainer` دارید. سخت ترین قسمت، احتمالا آماده‌سازی محیط جهت اجراي `Trainer.train()` می‌باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود. اگر GPU ندارید، می‌توانید از GPU یا TPUهای مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. 🤗 Transformers provides a `Trainer` class to help you fine-tune any of the pretrained models it provides on your dataset. Once you've done all the data preprocessing work in the last section, you have just a few steps left to define the `Trainer`. The hardest part is likely to be preparing the environment to run `Trainer.train()`, as it will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). @@ -48,7 +48,7 @@ data_collator = DataCollatorWithPadding(tokenizer=tokenizer) ### Training -قبل از این که بتوانیم `Trainer` مان را تعریف کنیم اولین مرحله تعریف کلاس `TrainingArguments` می‌باشد که شامل همه پارامترهای سطح بالایی است که `Trainer` برای `Training` و `Evaluation` استفاده خواهد کرد. تنها آرگومانی که شما باید ارائه کنید آدرسی است که مدل تعلیم دیده به همراه نفاط تعلیم در آن ذخیره خواهند شد. بقیه پارامترها را می‌توانید به حالت پیش‌فرض رها کنید، که برای کوک کردن پایه به خوبی کار خواهد کرد. +قبل از این که بتوانیم `Trainer` مان را تعریف کنیم اولین مرحله تعریف کلاس `TrainingArguments` می‌باشد که شامل همه پارامترهای سطح بالایی است که `Trainer` برای `Training` و `Evaluation` استفاده خواهد کرد. تنها آرگومانی که شما باید ارائه کنید آدرسی است که مدل تعلیم دیده به همراه نقاط تعلیم در آن ذخیره خواهند شد. بقیه پارامترها را می‌توانید به حالت پیش‌فرض رها کنید، که برای کوک کردن پایه به خوبی کار خواهد کرد. The first step before we can define our `Trainer` is to define a `TrainingArguments` class that will contain all the hyperparameters the `Trainer` will use for training and evaluation. The only argument you have to provide is a directory where the trained model will be saved, as well as the checkpoints along the way. For all the rest, you can leave the defaults, which should work pretty well for a basic fine-tuning. @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `model`، `training_args`، دیتاسِت‌های `training` و `validation`، `data_collator` و توکِنایزرمان به آن تعریف کنیم: +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `training_args`، `model`، دیتاسِت‌های `training` و `validation`، `data_collator` و توکِنایزرمان به آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From 92e0e5ccdba5050474ed1621c999336a6a630b00 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 09:53:44 +0200 Subject: [PATCH 225/254] fixed sentece wording and structure --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 926521fd3..3de86e7d0 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `training_args`، `model`، دیتاسِت‌های `training` و `validation`، `data_collator` و توکِنایزرمان به آن تعریف کنیم: +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `training_args`، `model`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From e130d699017107cb250d5a49ad2f5b50f77a54c9 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 09:55:17 +0200 Subject: [PATCH 226/254] fixed sentece wording and structure --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 3de86e7d0..4fc57e4ef 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `training_args`، `model`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به آن تعریف کنیم: +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `training_args`، `model`، دیتاسِت‌های `training` و `validation`, `data_collator` و `tokenizer` به آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From 4fa5e7e6cdfd92a5cf0b921e1a2a7bb8fb164d0d Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 09:58:02 +0200 Subject: [PATCH 227/254] fixed ltr --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 4fc57e4ef..63725cf2b 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `training_args`، `model`، دیتاسِت‌های `training` و `validation`, `data_collator` و `tokenizer` به آن تعریف کنیم: +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `training_args`، `model`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From 410c43dd2c058eb934aafdd6916223e8f5e7f050 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:00:31 +0200 Subject: [PATCH 228/254] fixed ltr --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 63725cf2b..b016309f8 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند شامل `training_args`، `model`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به آن تعریف کنیم: +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `training_args`، `model`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From fef307f91f10f789080dfbabc4d5ec2ff45c1d05 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:03:39 +0200 Subject: [PATCH 229/254] fixed ltr --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index b016309f8..857851566 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `training_args`، `model`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به آن تعریف کنیم: +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `model`، `training_args`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From 8ff9f08469ca5827d03b3aa44746ba9f5a375365 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:04:43 +0200 Subject: [PATCH 230/254] fixed ltr --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 857851566..a0513d9eb 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `model`، `training_args`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به آن تعریف کنیم: +با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `model`، `training_args`، دیتاسِت‌های `validation` و `training`، `data_collator` و `tokenizer` به آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From 4ca6047aeb55a3c37147546b285da85826d2369b Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:07:28 +0200 Subject: [PATCH 231/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index a0513d9eb..8c2504aaf 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -با داشتن مدل، ما می‌توانیم `Trainer`ای را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `model`، `training_args`، دیتاسِت‌های `validation` و `training`، `data_collator` و `tokenizer` به آن تعریف کنیم: +به محض اینکه مدل‌مان مشخص شد می‌توانیم `Trainer` را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `model`، `training_args`، دیتاسِت‌های `validation` و `training`، `data_collator` و `tokenizer` به داخل آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From 860ed2800d74b085d0f67a8836db40d434442f42 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:09:00 +0200 Subject: [PATCH 232/254] fixed ltr --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 8c2504aaf..5f16244ef 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -89,7 +89,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -به محض اینکه مدل‌مان مشخص شد می‌توانیم `Trainer` را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `model`، `training_args`، دیتاسِت‌های `validation` و `training`، `data_collator` و `tokenizer` به داخل آن تعریف کنیم: +به محض اینکه مدل‌مان مشخص شد می‌توانیم `Trainer` را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `model`، `training_args`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به داخل آن تعریف کنیم: Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: From 87ec5754c044362d79baad9bd8c1bbd93bba8bd9 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:11:40 +0200 Subject: [PATCH 233/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 5f16244ef..c5e878c4a 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -110,7 +110,7 @@ trainer = Trainer( -توجه داشته باشید زمانی که `tokenizer` را ارسال می‌کنید، همانطور که ما در اینجا انجام دادیم، `data_collator` پیش‌فرض مورد استفاده `Trainer` `DataCollatorWithPadding` خواهد بود، همانطور که قبلا تعریف کردیم، پس شما می‌توانید خط `data_collator=data_collator` را در این صدا کردن نادیده بگیرید. +توجه داشته باشید زمانی که `tokenizer` را ارسال می‌کنید، همانطور که ما در اینجا انجام دادیم، `data_collator` پیش‌فرض مورد استفاده `Trainer` `DataCollatorWithPadding` خواهد بود، همانطور که قبلا تعریف کردیم، در تنیجه شما می‌توانید خط `data_collator=data_collator` را در این فراخوانی نادیده بگیرید. Note that when you pass the `tokenizer` as we did here, the default `data_collator` used by the `Trainer` will be a `DataCollatorWithPadding` as defined previously, so you can skip the line `data_collator=data_collator` in this call. It was still important to show you this part of the processing in section 2! From a5729aa3c9fdef6376dbcdbecfd5c51986d3b3c7 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:16:12 +0200 Subject: [PATCH 234/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index c5e878c4a..7800043d0 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -110,7 +110,7 @@ trainer = Trainer( -توجه داشته باشید زمانی که `tokenizer` را ارسال می‌کنید، همانطور که ما در اینجا انجام دادیم، `data_collator` پیش‌فرض مورد استفاده `Trainer` `DataCollatorWithPadding` خواهد بود، همانطور که قبلا تعریف کردیم، در تنیجه شما می‌توانید خط `data_collator=data_collator` را در این فراخوانی نادیده بگیرید. +توجه داشته باشید زمانی که `tokenizer` را ارسال می‌کنید، مثل کاری که ما در اینجا انجام دادیم، `data_collator` پیش‌فرض مورد استفاده `Trainer`، همانطور که قبلا تعریف کردیم، `DataCollatorWithPadding` خواهد بود، در تنیجه شما می‌توانید خط `data_collator=data_collator` را در این فراخوانی نادیده بگیرید. Note that when you pass the `tokenizer` as we did here, the default `data_collator` used by the `Trainer` will be a `DataCollatorWithPadding` as defined previously, so you can skip the line `data_collator=data_collator` in this call. It was still important to show you this part of the processing in section 2! From dfe8a8d19a3b641e802a1c402936919842a41e90 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:18:49 +0200 Subject: [PATCH 235/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 7800043d0..9000da2bf 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -130,7 +130,7 @@ trainer.train() This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: -۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با مقداردهی پارامتر `evaluation_strategy` به `"steps"` (جهت ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر ایپاک) انجام دهیم. +۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با مقداردهی پارامتر `evaluation_strategy` به `"steps"` (جهت ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر epoch) انجام دهیم. ۲. ما تابع `compute_metrics()` را جهت محاسبه معیارها در حین اصطلاحا ارزیابی (که در غیر این صورت فقط هزینه، که عدد چندان گویایی هم نیست، را چاپ می‌کرد) برای `Trainer` فراهم نکردیم. From 9ab029ba4e75333a624e8ec8bd2fa17d97f54366 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:44:17 +0200 Subject: [PATCH 236/254] fixed wording --- chapters/fa/chapter3/3.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 9000da2bf..e4f4067ad 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -126,13 +126,13 @@ trainer.train() -این کار کوک کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و هزینه تعلیم را هر ۵۰۰ مرحله یکبار گزارش می‌کند. با این حال به شما نمی‌گوید که مدل‌تان چقدر خوب (یا بد) عمل می‌کند. این به این خاطر است که: +این کار، کوک کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و هزینه تعلیم را هر ۵۰۰ مرحله یک‌بار گزارش می‌کند. با این حال به شما نمی‌گوید که مدل‌تان چقدر خوب (یا بد) عمل می‌کند. این به این خاطر است که: This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: -۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با مقداردهی پارامتر `evaluation_strategy` به `"steps"` (جهت ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر epoch) انجام دهیم. +۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با مقداردهی پارامتر `evaluation_strategy` به `"steps"` (برای ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر epoch) انجام دهیم. -۲. ما تابع `compute_metrics()` را جهت محاسبه معیارها در حین اصطلاحا ارزیابی (که در غیر این صورت فقط هزینه، که عدد چندان گویایی هم نیست، را چاپ می‌کرد) برای `Trainer` فراهم نکردیم. +۲. ما تابع `compute_metrics()` را برای `Trainer` فراهم نکردیم تا بتواند معیارها را در حین اصطلاحا ارزیابی محاسبه کند (که در غیر این صورت، ارزیابی فقط هزینه را چاپ می‌کند که عدد چندان گویایی هم نیست) . 1. We didn't tell the `Trainer` to evaluate during training by setting `evaluation_strategy` to either `"steps"` (evaluate every `eval_steps`) or `"epoch"` (evaluate at the end of each epoch). 2. We didn't provide the `Trainer` with a `compute_metrics()` function to calculate a metric during said evaluation (otherwise the evaluation would just have printed the loss, which is not a very intuitive number). From 372d8c5e774d3d6d000eb55a4ce8b1efd981dd49 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:48:03 +0200 Subject: [PATCH 237/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index e4f4067ad..34483b46f 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -142,7 +142,7 @@ This will start the fine-tuning (which should take a couple of minutes on a GPU) ### Evaluation -اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids`) و دیکشنری باز گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (که رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آنها می باشند). برای استخراج چند پیش‌بینی‌ از مدل‌مان، می‌توانیم از دستور `Trainer.predict()` استفاده کنیم: +اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids`) و یک دیکشنری باز گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آن‌ها می باشند). برای استخراج چند پیش‌بینی‌ از مدل‌مان، می‌توانیم از دستور `Trainer.predict()` استفاده کنیم: Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command: From 9fafe844a7b71d2202a30ba018d859b49406392a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:55:19 +0200 Subject: [PATCH 238/254] fixed typo --- chapters/fa/chapter3/3.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 34483b46f..c41b896e3 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -159,11 +159,11 @@ print(predictions.predictions.shape, predictions.label_ids.shape) -خروجی تابع `predict()` تاپل نام گذاری شده دیگری شامل سه فیلد: `predictions`، `label_ids` و `metrics` می‌باشد. فیلد `metrics` فقط شامل هزینه داده عبور کرده و برخی معیارهای زمان (در مجموع و به طور میانگین پیش‌بینی‌ چقدر طول کشیده) می‌باشد. به محض این که تابع `compute_metrics()` را کامل کرده و آنرا به `Trainer` ارسال کنیم، آن فیلد متریک‌های بازگشتی از `compute_metrics()` را نیز در بر خواهد داشت. +خروجی تابع `predict()` تاپل نام گذاری شده دیگری شامل سه فیلد: `predictions`، `label_ids` و `metrics` می‌باشد. فیلد `metrics` فقط شامل هزینه داده عبور کرده و برخی معیارهای زمان (پیش‌بینی‌، در مجموع و به طور میانگین، چقدر طول کشیده) می‌باشد. به محض این که تابع `compute_metrics()` را کامل کرده و آن را به `Trainer` ارسال کنیم، آن فیلد متریک‌های بازگشتی از `compute_metrics()` را نیز در بر خواهد داشت. The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. -همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل آنها به پیش‌بینی‌‌هایی که بتوانیم با برچسب‌هایمان مقایسه کنیم، نیاز داریم اندیس مقدار بیشینه روی بعد دوم را برداریم: +همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل لاجیت‌ها به پیش‌بینی‌‌هایی که بتوانیم با برچسب‌هایمان مقایسه کنیم، نیاز داریم اندیس مقدار بیشینه روی بعد دوم را برداریم: As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: @@ -196,7 +196,7 @@ metric.compute(predictions=preds, references=predictions.label_ids) -از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا می‌توانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` بدست می‌آورد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، برای مدل پایه `F1 Score` معادل ۸۸.۹ را گزارش می‌کند. توجه داشته باشید که آن مدل `uncased` بود، حال این که در اینجا ما از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. +از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا می‌توانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` بدست می‌آورد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، برای مدل پایه، `F1 Score` معادل ۸۸.۹ را گزارش می‌کند. توجه داشته باشید که آن مدل `uncased` بود، حال این که در اینجا ما از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. From dec3de9b6ad95f4c573090fb431cb787f1b1fc20 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:56:11 +0200 Subject: [PATCH 239/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index c41b896e3..a361bd759 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -196,7 +196,7 @@ metric.compute(predictions=preds, references=predictions.label_ids) -از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا می‌توانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` بدست می‌آورد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، برای مدل پایه، `F1 Score` معادل ۸۸.۹ را گزارش می‌کند. توجه داشته باشید که آن مدل `uncased` بود، حال این که در اینجا ما از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. +از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا می‌توانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` بدست می‌آورد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، برای مدل پایه، `F1 Score` معادل ۸۸.۹ را گزارش می‌کند. توجه داشته باشید که آن مدل `uncased` بود، حال آن که در اینجا ما از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. From 119853cd7831e5d6f17c2da56148a598e39b4a38 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:58:18 +0200 Subject: [PATCH 240/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index a361bd759..4434b9aa7 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -239,7 +239,7 @@ trainer = Trainer( -توجه داشته باشید که ما مدلی جدید و `TrainingArguments` جدیدی که `evaluation_strategy` آن `"epoch"` ست شده است می‌سازیم - در غیر این صورت فقط تعلیم مدلی را ادامه می‌دادیم که از تعلیم دیده بود. دستور زیر را برای راه‌اندازی دور جدید تعلیم اجرا می‌کنیم: +توجه داشته باشید که ما مدلی جدید و `TrainingArguments` جدیدی که `evaluation_strategy` آن `"epoch"` است می‌سازیم - در غیر این صورت فقط تعلیم مدلی که از پیش تعلیم دیده بود را ادامه می‌دادیم. دستور زیر را برای راه‌اندازی دور جدید تعلیم اجرا می‌کنیم: Note that we create a new `TrainingArguments` with its `evaluation_strategy` set to `"epoch"` and a new model — otherwise, we would just be continuing the training of the model we have already trained. To launch a new training run, we execute: From f4a5b552150846dac0291dabdef69c2f3725a02e Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 10:59:07 +0200 Subject: [PATCH 241/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 4434b9aa7..2f26edd24 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -239,7 +239,7 @@ trainer = Trainer( -توجه داشته باشید که ما مدلی جدید و `TrainingArguments` جدیدی که `evaluation_strategy` آن `"epoch"` است می‌سازیم - در غیر این صورت فقط تعلیم مدلی که از پیش تعلیم دیده بود را ادامه می‌دادیم. دستور زیر را برای راه‌اندازی دور جدید تعلیم اجرا می‌کنیم: +توجه داشته باشید که ما مدلی جدید و `TrainingArguments` جدیدی که `evaluation_strategy` آن `"epoch"` است می‌سازیم - در غیر این صورت فقط تعلیم مدلی که از پیش تعلیم دیده بود را ادامه می‌دادیم. برای راه‌اندازی دور جدید تعلیم، دستور زیر را اجرا می‌کنیم: Note that we create a new `TrainingArguments` with its `evaluation_strategy` set to `"epoch"` and a new model — otherwise, we would just be continuing the training of the model we have already trained. To launch a new training run, we execute: From f45102967290bd18252ab382519fdcaaeb278c6d Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 11:00:42 +0200 Subject: [PATCH 242/254] fixed ltr --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 2f26edd24..2b6ffcb9f 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -251,7 +251,7 @@ trainer.train() -این بار هزینه validation و متریک‌ها را در پایان هر epoch و در بالای هزینه تعلیم گزارش می‌کنیم. دوباره، به خاطر مقدار دهی تصادفی اولیه لایه سر مدل، مقادیر دقیق accuracy/F1 score که شما بدست می‌آورید ممکن است کمی متفاوت از آنچه ما بدست آورده‌ایم باشد، اما این مقادیر باید در محدوده تخمینی یکسانی باشند. +این بار هزینه validation و متریک‌ها را در پایان هر epoch و در بالای هزینه تعلیم گزارش می‌کنیم. دوباره، به خاطر مقدار دهی تصادفی اولیه لایه سر مدل، مقادیر دقیق accuracy/F1 score که شما بدست می‌آورید ممکن است کمی متفاوت از آنچه ما بدست آورده‌ایم باشد، اما این مقادیر باید در محدوده تخمینی یکسانی باشند. This time, it will report the validation loss and metrics at the end of each epoch on top of the training loss. Again, the exact accuracy/F1 score you reach might be a bit different from what we found, because of the random head initialization of the model, but it should be in the same ballpark. From 1b611d8f80bb05c35feb38a4f3f690bedf062f4c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 11:02:30 +0200 Subject: [PATCH 243/254] fixed ltr --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 2b6ffcb9f..0108d519a 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -255,7 +255,7 @@ trainer.train() This time, it will report the validation loss and metrics at the end of each epoch on top of the training loss. Again, the exact accuracy/F1 score you reach might be a bit different from what we found, because of the random head initialization of the model, but it should be in the same ballpark. -`Trainer` به صورت پیش فرض روی چندین GPU یا TPU کار خواهد کرد و گزینه‌های فراوانی، مثل تعلیم mixed-precision (از مقدار `fp16 = True` در آرگومان‌های تعلیم استفاده کنید) فراهم می‌کند. در فصل ۱۰ همه حالت‌هایی که پشتیبانی می‌کند را مرور خواهیم کرد. +به صورت پیش فرض `Trainer` روی چندین GPU یا TPU کار خواهد کرد و گزینه‌های فراوانی، مثل تعلیم mixed-precision (از مقدار `fp16 = True` در آرگومان‌های تعلیم استفاده کنید) فراهم می‌کند. در فصل ۱۰ همه حالت‌هایی که پشتیبانی می‌کند را مرور خواهیم کرد. The `Trainer` will work out of the box on multiple GPUs or TPUs and provides lots of options, like mixed-precision training (use `fp16 = True` in your training arguments). We will go over everything it supports in Chapter 10. From b79139bb40f77878585095becd9fe0ac1c014964 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 11:02:58 +0200 Subject: [PATCH 244/254] fixed wording --- chapters/fa/chapter3/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 0108d519a..a59d19b09 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -255,7 +255,7 @@ trainer.train() This time, it will report the validation loss and metrics at the end of each epoch on top of the training loss. Again, the exact accuracy/F1 score you reach might be a bit different from what we found, because of the random head initialization of the model, but it should be in the same ballpark. -به صورت پیش فرض `Trainer` روی چندین GPU یا TPU کار خواهد کرد و گزینه‌های فراوانی، مثل تعلیم mixed-precision (از مقدار `fp16 = True` در آرگومان‌های تعلیم استفاده کنید) فراهم می‌کند. در فصل ۱۰ همه حالت‌هایی که پشتیبانی می‌کند را مرور خواهیم کرد. +به صورت پیش فرض، `Trainer` روی چندین GPU یا TPU کار خواهد کرد و گزینه‌های فراوانی، مثل تعلیم mixed-precision (از مقدار `fp16 = True` در آرگومان‌های تعلیم استفاده کنید) فراهم می‌کند. در فصل ۱۰ همه حالت‌هایی که پشتیبانی می‌کند را مرور خواهیم کرد. The `Trainer` will work out of the box on multiple GPUs or TPUs and provides lots of options, like mixed-precision training (use `fp16 = True` in your training arguments). We will go over everything it supports in Chapter 10. From d8eba670bc648e9c4e1b3e0a12e86f397efecaac Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 11:08:14 +0200 Subject: [PATCH 245/254] missing icon added --- chapters/fa/chapter3/3.mdx | 47 +++----------------------------------- 1 file changed, 3 insertions(+), 44 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index a59d19b09..296c18bf5 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -64,7 +64,7 @@ training_args = TrainingArguments("test-trainer") -اگر مایلید مدل‌تان را در حین تعلیم در هاب بارگذاری کنید، پارامتر `push_to_hub=True` را در `TrainingArguments` ارسال کنید. در [فصل ۴](/course/chapter4/3) در این باره بیشتر خواهیم آموخت. +💡 اگر مایلید مدل‌تان را در حین تعلیم در هاب بارگذاری کنید، پارامتر `push_to_hub=True` را در `TrainingArguments` ارسال کنید. در [فصل ۴](/course/chapter4/3) در این باره بیشتر خواهیم آموخت. 💡 If you want to automatically upload your model to the Hub during training, pass along `push_to_hub=True` in the `TrainingArguments`. We will learn more about this in [Chapter 4](/course/chapter4/3) @@ -72,7 +72,6 @@ training_args = TrainingArguments("test-trainer") مرحله دوم تعریف مدل‌مان می‌باشد. مانند [فصل قبل](/course/chapter2)، از کلاس `AutoModelForSequenceClassification` با دو برچسب کلاس استفاده خواهیم کرد: -The second step is to define our model. As in the [previous chapter](/course/chapter2), we will use the `AutoModelForSequenceClassification` class, with two labels:
@@ -87,12 +86,8 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه سَر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه سَر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه‌ سَر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه‌ سَر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان کاری است که می‌خواهیم اکنون انجام دهیم. -You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been added instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. - به محض اینکه مدل‌مان مشخص شد می‌توانیم `Trainer` را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `model`، `training_args`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به داخل آن تعریف کنیم: -Once we have our model, we can define a `Trainer` by passing it all the objects constructed up to now — the `model`, the `training_args`, the training and validation datasets, our `data_collator`, and our `tokenizer`: -
```py @@ -110,14 +105,10 @@ trainer = Trainer(
-توجه داشته باشید زمانی که `tokenizer` را ارسال می‌کنید، مثل کاری که ما در اینجا انجام دادیم، `data_collator` پیش‌فرض مورد استفاده `Trainer`، همانطور که قبلا تعریف کردیم، `DataCollatorWithPadding` خواهد بود، در تنیجه شما می‌توانید خط `data_collator=data_collator` را در این فراخوانی نادیده بگیرید. - -Note that when you pass the `tokenizer` as we did here, the default `data_collator` used by the `Trainer` will be a `DataCollatorWithPadding` as defined previously, so you can skip the line `data_collator=data_collator` in this call. It was still important to show you this part of the processing in section 2! +توجه داشته باشید زمانی که `tokenizer` را ارسال می‌کنید، مثل کاری که ما در اینجا انجام دادیم، `data_collator` پیش‌فرض مورد استفاده `Trainer`، همانطور که قبلا تعریف کردیم، `DataCollatorWithPadding` خواهد بود، در تنیجه شما می‌توانید خط `data_collator=data_collator` را در این فراخوانی نادیده بگیرید. این هنوز مهم بود که این بخش از پردازش را در بخش ۲ به شما نشان دهیم! برای کوک کردن مدل روی دیتاسِت‌مان ما فقط باید تابع `train()` از `Trainer`مان را صدا بزنیم: -To fine-tune the model on our dataset, we just have to call the `train()` method of our `Trainer`: -
```py @@ -128,24 +119,14 @@ trainer.train() این کار، کوک کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و هزینه تعلیم را هر ۵۰۰ مرحله یک‌بار گزارش می‌کند. با این حال به شما نمی‌گوید که مدل‌تان چقدر خوب (یا بد) عمل می‌کند. این به این خاطر است که: -This will start the fine-tuning (which should take a couple of minutes on a GPU) and report the training loss every 500 steps. It won't, however, tell you how well (or badly) your model is performing. This is because: - ۱. ما به `Trainer` نگفتیم که در حین تعلیم کیفیت مدل را اندازه‌گیری کند. کاری که می‌توانستیم با مقداردهی پارامتر `evaluation_strategy` به `"steps"` (برای ارزیابی در هر `eval_steps`) یا به `"epoch"` (برای ارزیابی در انتهای هر epoch) انجام دهیم. ۲. ما تابع `compute_metrics()` را برای `Trainer` فراهم نکردیم تا بتواند معیارها را در حین اصطلاحا ارزیابی محاسبه کند (که در غیر این صورت، ارزیابی فقط هزینه را چاپ می‌کند که عدد چندان گویایی هم نیست) . -1. We didn't tell the `Trainer` to evaluate during training by setting `evaluation_strategy` to either `"steps"` (evaluate every `eval_steps`) or `"epoch"` (evaluate at the end of each epoch). -2. We didn't provide the `Trainer` with a `compute_metrics()` function to calculate a metric during said evaluation (otherwise the evaluation would just have printed the loss, which is not a very intuitive number). - - ### ارزیابی -### Evaluation - اجازه دهید ببینیم چگونه می‌توانیم تابع `compute_metrics()` مفیدی بسازیم و در تعلیم بعدی از آن استفاده کنیم. تابع باید یک شیء `EvalPrediction` دریافت کند (که تاپلی است شامل فیلدهای `predictions` و `label_ids`) و یک دیکشنری باز گرداند که رشته‌های متنی را به اعداد حقیقی تبدیل می‌کند (رشته‌های متنی نام معیارهای بازگردانده شونده و اعداد حقیقی مقادیر آن‌ها می باشند). برای استخراج چند پیش‌بینی‌ از مدل‌مان، می‌توانیم از دستور `Trainer.predict()` استفاده کنیم: -Let's see how we can build a useful `compute_metrics()` function and use it the next time we train. The function must take an `EvalPrediction` object (which is a named tuple with a `predictions` field and a `label_ids` field) and will return a dictionary mapping strings to floats (the strings being the names of the metrics returned, and the floats their values). To get some predictions from our model, we can use the `Trainer.predict()` command: -
```py @@ -161,12 +142,8 @@ print(predictions.predictions.shape, predictions.label_ids.shape) خروجی تابع `predict()` تاپل نام گذاری شده دیگری شامل سه فیلد: `predictions`، `label_ids` و `metrics` می‌باشد. فیلد `metrics` فقط شامل هزینه داده عبور کرده و برخی معیارهای زمان (پیش‌بینی‌، در مجموع و به طور میانگین، چقدر طول کشیده) می‌باشد. به محض این که تابع `compute_metrics()` را کامل کرده و آن را به `Trainer` ارسال کنیم، آن فیلد متریک‌های بازگشتی از `compute_metrics()` را نیز در بر خواهد داشت. -The output of the `predict()` method is another named tuple with three fields: `predictions`, `label_ids`, and `metrics`. The `metrics` field will just contain the loss on the dataset passed, as well as some time metrics (how long it took to predict, in total and on average). Once we complete our `compute_metrics()` function and pass it to the `Trainer`, that field will also contain the metrics returned by `compute_metrics()`. - همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل لاجیت‌ها به پیش‌بینی‌‌هایی که بتوانیم با برچسب‌هایمان مقایسه کنیم، نیاز داریم اندیس مقدار بیشینه روی بعد دوم را برداریم: -As you can see, `predictions` is a two-dimensional array with shape 408 x 2 (408 being the number of elements in the dataset we used). Those are the logits for each element of the dataset we passed to `predict()` (as you saw in the [previous chapter](/course/chapter2), all Transformer models return logits). To transform them into predictions that we can compare to our labels, we need to take the index with the maximum value on the second axis: -
```py @@ -179,8 +156,6 @@ preds = np.argmax(predictions.predictions, axis=-1) اکنون می‌توانیم `preds` را با برچسب‌ها مقایسه کنیم. برای ساختن تابع `compute_metric()`، به متریک‌های کتابخانه داده‌های هاگینگ‌فِیس تکیه خواهیم کرد. ما می‌توانیم متریک‌های وابسته به دیتاسِت MRPC را به راحتی خود دیتاسِت، اما این بار با استفاده از تابع `load_metric()`، بارگذاری کنیم. شیء بازگردانده شده تابعی به نام `compute()` دارد که می‌توانیم برای محاسبه متریک از آن استفاده کنیم: -We can now compare those `preds` to the labels. To build our `compute_metric()` function, we will rely on the metrics from the 🤗 Datasets library. We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: -
```py @@ -198,12 +173,8 @@ metric.compute(predictions=preds, references=predictions.label_ids) از آنجایی که مقداردهی تصادفی اولیه مدل می‌تواند متریک‌های نهایی را تغییر دهد، نتایج دقیقی که شما بدست می‌آورید ممکن است متفاوت باشد. در اینجا می‌توانیم ببینیم که مدل ما `accuracy` معادل ۸۵.۷۸٪ و `F1 Score` معادل ۸۹.۹۷٪ روی مجموعه `validation` بدست می‌آورد. آنها دو متریک برای ارزیابی نتایج محک GLUE روی دیتاسِت MRPC هستند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، برای مدل پایه، `F1 Score` معادل ۸۸.۹ را گزارش می‌کند. توجه داشته باشید که آن مدل `uncased` بود، حال آن که در اینجا ما از مدل `cased` استفاده می‌کنیم، که دستیابی به نتایج بهتر را توضیح می‌دهد. -The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. - اکنون با قرار دادن همه چیز کنارهم تابع `compute_metrics()` را بدست خواهیم آورد: -Wrapping everything together, we get our `compute_metrics()` function: -
```py @@ -218,8 +189,6 @@ def compute_metrics(eval_preds): و در اینجا نشان می‌دهیم که چگونه یک `Trainer` جدید با استفاده از تابع `compute_metrics()` تعریف می‌کنیم، تا بتوانیم عملکرد آن را در حین گزارش متریک‌ها در پایان هر epoch مشاهده کنیم: -And to see it used in action to report metrics at the end of each epoch, here is how we define a new `Trainer` with this `compute_metrics()` function: -
```py @@ -241,8 +210,6 @@ trainer = Trainer( توجه داشته باشید که ما مدلی جدید و `TrainingArguments` جدیدی که `evaluation_strategy` آن `"epoch"` است می‌سازیم - در غیر این صورت فقط تعلیم مدلی که از پیش تعلیم دیده بود را ادامه می‌دادیم. برای راه‌اندازی دور جدید تعلیم، دستور زیر را اجرا می‌کنیم: -Note that we create a new `TrainingArguments` with its `evaluation_strategy` set to `"epoch"` and a new model — otherwise, we would just be continuing the training of the model we have already trained. To launch a new training run, we execute: -
``` @@ -253,21 +220,13 @@ trainer.train() این بار هزینه validation و متریک‌ها را در پایان هر epoch و در بالای هزینه تعلیم گزارش می‌کنیم. دوباره، به خاطر مقدار دهی تصادفی اولیه لایه سر مدل، مقادیر دقیق accuracy/F1 score که شما بدست می‌آورید ممکن است کمی متفاوت از آنچه ما بدست آورده‌ایم باشد، اما این مقادیر باید در محدوده تخمینی یکسانی باشند. -This time, it will report the validation loss and metrics at the end of each epoch on top of the training loss. Again, the exact accuracy/F1 score you reach might be a bit different from what we found, because of the random head initialization of the model, but it should be in the same ballpark. - به صورت پیش فرض، `Trainer` روی چندین GPU یا TPU کار خواهد کرد و گزینه‌های فراوانی، مثل تعلیم mixed-precision (از مقدار `fp16 = True` در آرگومان‌های تعلیم استفاده کنید) فراهم می‌کند. در فصل ۱۰ همه حالت‌هایی که پشتیبانی می‌کند را مرور خواهیم کرد. -The `Trainer` will work out of the box on multiple GPUs or TPUs and provides lots of options, like mixed-precision training (use `fp16 = True` in your training arguments). We will go over everything it supports in Chapter 10. - این پایان مقدمه‌ای بر کوک کردن با استفاده از `Trainer` API می‌باشد. در [فصل ۷](/course/chapter7) مثالی برای نشان دادن چگونگی انجام این کار برای معمول‌ترین مسئله‌های NLP ارائه خواهیم کرد، اما اکنون اجازه دهید ببینیم چگونه همین کار را صرفا با استفاده از PyTorch انجام دهیم. -This concludes the introduction to fine-tuning using the `Trainer` API. An example of doing this for most common NLP tasks will be given in [Chapter 7](/course/chapter7), but for now let's look at how to do the same thing in pure PyTorch. - -✏️ **اتحان کنید!** با استفاده از پردازش داده‌ای که در بخش ۲ انجام دادی، مدلی را روی دیتاسِت GLUE SST-2 کوک کنید، - -✏️ **Try it out!** Fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. +✏️ **اتحان کنید!** با استفاده از پردازش داده‌ای که در بخش ۲ انجام دادید، مدلی را روی دیتاسِت GLUE SST-2 کوک کنید. From 8858f2c77361ffc55f0f3b4ca2ee4f08238c8867 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 11:10:15 +0200 Subject: [PATCH 246/254] remove original english text --- chapters/fa/chapter3/3.mdx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 296c18bf5..0e2b50626 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -4,8 +4,6 @@ # کوک کردن مدل‌ها با استفاده از API `Trainer` -# Fine-tuning a model with the Trainer API - `Trainer.train()` می‌باشد، چرا که این تابع روی CPU بسیار کند اجرا می‌شود. اگر GPU ندارید، می‌توانید از GPU یا TPUهای مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. -🤗 Transformers provides a `Trainer` class to help you fine-tune any of the pretrained models it provides on your dataset. Once you've done all the data preprocessing work in the last section, you have just a few steps left to define the `Trainer`. The hardest part is likely to be preparing the environment to run `Trainer.train()`, as it will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). - نمونه کدهای زیر فرض می‌کنند که شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: -The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need:
@@ -46,11 +41,8 @@ data_collator = DataCollatorWithPadding(tokenizer=tokenizer) ### تعلیم -### Training - قبل از این که بتوانیم `Trainer` مان را تعریف کنیم اولین مرحله تعریف کلاس `TrainingArguments` می‌باشد که شامل همه پارامترهای سطح بالایی است که `Trainer` برای `Training` و `Evaluation` استفاده خواهد کرد. تنها آرگومانی که شما باید ارائه کنید آدرسی است که مدل تعلیم دیده به همراه نقاط تعلیم در آن ذخیره خواهند شد. بقیه پارامترها را می‌توانید به حالت پیش‌فرض رها کنید، که برای کوک کردن پایه به خوبی کار خواهد کرد. -The first step before we can define our `Trainer` is to define a `TrainingArguments` class that will contain all the hyperparameters the `Trainer` will use for training and evaluation. The only argument you have to provide is a directory where the trained model will be saved, as well as the checkpoints along the way. For all the rest, you can leave the defaults, which should work pretty well for a basic fine-tuning.
@@ -64,9 +56,7 @@ training_args = TrainingArguments("test-trainer") -💡 اگر مایلید مدل‌تان را در حین تعلیم در هاب بارگذاری کنید، پارامتر `push_to_hub=True` را در `TrainingArguments` ارسال کنید. در [فصل ۴](/course/chapter4/3) در این باره بیشتر خواهیم آموخت. - -💡 If you want to automatically upload your model to the Hub during training, pass along `push_to_hub=True` in the `TrainingArguments`. We will learn more about this in [Chapter 4](/course/chapter4/3) +💡 اگر مایلید مدل‌تان را به صورت خودکار در حین تعلیم در هاب بارگذاری کنید، پارامتر `push_to_hub=True` را در `TrainingArguments` ارسال کنید. در [فصل ۴](/course/chapter4/3) در این باره بیشتر خواهیم آموخت. From 9b9a72cebc0ef0b2ca294c0b0afdca7ddac0495c Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 11:16:59 +0200 Subject: [PATCH 247/254] final commit CH3 P3 --- chapters/fa/_toctree.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/chapters/fa/_toctree.yml b/chapters/fa/_toctree.yml index 7336e1e93..5b7f5151f 100644 --- a/chapters/fa/_toctree.yml +++ b/chapters/fa/_toctree.yml @@ -25,6 +25,9 @@ title: مقدمه - local: chapter3/2 title: پردازش داده + - local: chapter3/3 + title: کوک کردن مدل‌ها با استفاده از Trainer API یا کِراس + local_fw: { pt: chapter3/3, tf: chapter3/3_tf } - title: ۴- به اشتراک‌گذاری مدل‌ها و توکِنایزرها sections: @@ -33,13 +36,6 @@ - local: chapter4/2 title: بکارگیری مدل‌های از پیش تعلیم دیده -- title: 3. کوک کردن یک مدل از پیش تعلیم دیده - sections: - - local: chapter3/1 - title: مقدمه - - local: chapter3/2 - title: پردازش داده - - title: واژه‌نامه sections: - local: glossary/1 From f92b070aefb559b55327cfc1d924bb39903d1fa4 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 12:40:35 +0200 Subject: [PATCH 248/254] formatting fixed - section ending was missing --- chapters/fa/chapter3/3.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 0e2b50626..aa3928b75 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -220,3 +220,4 @@ trainer.train() +
\ No newline at end of file From 00e876ee7032dca06c0d921b2bf705224195d81a Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 12:47:06 +0200 Subject: [PATCH 249/254] fixed formatting --- chapters/fa/chapter3/3.mdx | 2 -- chapters/fa/chapter3/3_tf.mdx | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index aa3928b75..7880d346a 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -62,7 +62,6 @@ training_args = TrainingArguments("test-trainer") مرحله دوم تعریف مدل‌مان می‌باشد. مانند [فصل قبل](/course/chapter2)، از کلاس `AutoModelForSequenceClassification` با دو برچسب کلاس استفاده خواهیم کرد: -
```py @@ -73,7 +72,6 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_label
- شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه سَر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه سَر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه‌ سَر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه‌ سَر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان کاری است که می‌خواهیم اکنون انجام دهیم. به محض اینکه مدل‌مان مشخص شد می‌توانیم `Trainer` را با ارسال همه اشیائی که تا کنون ساخته شده‌اند - `model`، `training_args`، دیتاسِت‌های `training` و `validation`، `data_collator` و `tokenizer` به داخل آن تعریف کنیم: diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index d631cc545..1bed20661 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -4,7 +4,6 @@ # کوک کردن مدل‌ها با استفاده از کِراس - این به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار بسیار کمی لازم است تا تعلیم را روی آن شروع کنیم. @@ -111,7 +109,6 @@ model.fit( - ### بهبود کارایی تعلیم @@ -171,6 +168,7 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3)
+ 💡 اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در [Chapter 4](/course/chapter4/3) در این مورد بیشتر خواهیم آموخت. From 8d30cdd97a9c4af9ffcb331d914405f1cd6c9387 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 12:58:42 +0200 Subject: [PATCH 250/254] test 3_tf for formatting --- chapters/fa/chapter3/3_tf.mdx | 108 +++++++++++----------------------- 1 file changed, 35 insertions(+), 73 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 1bed20661..2252a9613 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -1,8 +1,6 @@ -
- -# کوک کردن مدل‌ها با استفاده از کِراس +# Fine-tuning a model with Keras -زمانی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قی‌مانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. - -نمونه کدهای زیر فرض می‌کنند که شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: +Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). -
+The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: ```py from datasets import load_dataset @@ -30,6 +26,7 @@ tokenizer = AutoTokenizer.from_pretrained(checkpoint) def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) + tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") @@ -51,21 +48,17 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` -
- -### تعلیم +### Training -مدل‌های تِنسورفِلو که از ترَنسفورمِرهای هاگینگ‌فِیس وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. +TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. -این به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار بسیار کمی لازم است تا تعلیم را روی آن شروع کنیم. +That means that once we have our data, very little work is required to begin training on it. -مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب دسته استفاده خواهیم کرد: - -
+As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: ```py from transformers import TFAutoModelForSequenceClassification @@ -73,20 +66,16 @@ from transformers import TFAutoModelForSequenceClassification model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) ``` -
- -شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه سَر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه سَر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه‌ سَر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه‌ سَر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان کاری است که می‌خواهیم اکنون انجام دهیم. +You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. -برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین هزینه `training` و هزینه `validation` را در انتهای هر epoch گزارش می‌دهد. +To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. -توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع هزینه مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع هزینه در زمان `compile()` تعیین نکنید آنها از این تابع هزینه به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع هزینه داخلی شما نیاز خواهید داشت برچسب دسته‌های خودتان را به عنوان بخشی از ورودی، نه به صورت یک برچسب دسته مجزا که روش معمول استفاده از برچسب دسته‌ها در مدل‌های کِراس می‌باشد، ارسال کنید. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع هزینه‌ی درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع هزینه استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. +Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. -
- ```py from tensorflow.keras.losses import SparseCategoricalCrossentropy @@ -101,23 +90,29 @@ model.fit( ) ``` -
- -در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغیر متنی برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softmax از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax به آنها اعمال شود به خروجی می‌دهند، که همچنین به عنوان *logits* شناخته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم، این کاری است که مدل‌مان انجام می‌دهد و تنها راه گفتن آن این است که به جای ارسال نام تابع هزینه به صورت متغیر متنی، آن را به صورت مستقیم صدا بزنیم. +Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. -### بهبود کارایی تعلیم - +### Improving training performance -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و به صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. + -علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپُختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. +If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause +is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes +that optimizer with default values for all parameters, including learning rate. From long experience, though, we know +that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written +as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. -
+In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate +over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* +the learning rate. In Keras, the best way to do this is to use a *learning rate scheduler*. A good one to use is +`PolynomialDecay` — despite the name, with default settings it simply linearly decays the learning rate from the initial +value to the final value over the course of training, which is exactly what we want. In order to use a scheduler correctly, +though, we need to tell it how long training is going to be. We compute that as `num_train_steps` below. ```py from tensorflow.keras.optimizers.schedules import PolynomialDecay @@ -136,17 +131,13 @@ from tensorflow.keras.optimizers import Adam opt = Adam(learning_rate=lr_scheduler) ``` -
- -کتابخانه ترنسفورمرهای هاگینگ‌فِیس همچنین یک تابع `create_optimizer()` دارد که بهینه‌سازی از نوع `AdamW`، دارای میزان کاهش نرخ یادگیری می‌سازد. این یک میان‌بر مناسب است که آن‌ را با جزئیات در بخش‌های بعدی این آموزش خواهید دید. +The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. -اکنون بهینه‌ساز کاملا جدیدمان را در اختیار داریم و می‌توانیم آن را تعلیم دهیم. ابتدا، اجازه دهید مدل را مجددا بارگذاری کنیم تا تغییرات ایجاد شده بر وزنها که در تعلیم قبلی اعمال شده‌اند را به حالت اولیه بازگردانیم، سپس می‌توانیم مدل را با بهینه ساز جدید تدوین کنیم: - -
+Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: ```py import tensorflow as tf @@ -156,62 +147,41 @@ loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) model.compile(optimizer=opt, loss=loss, metrics=["accuracy"]) ``` -
- -حالا دوباره مدل را فیت می‌کنیم: - -
+Now, we fit again: ```py model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) ``` -
- - -💡 اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در [Chapter 4](/course/chapter4/3) در این مورد بیشتر خواهیم آموخت. +💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) -### پیش‌بینی‌های مدل +### Model predictions -تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار به ازای هر کلاس یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند. - -
+Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. ```py preds = model.predict(tf_validation_dataset)["logits"] ``` -
- -سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگ‌ترین `logit`، که نماینده محتمل‌ترین دسته می‌باشد، به پیش‌بینی‌های دسته مدل تبدیل کنیم: - -
+We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: ```py class_preds = np.argmax(preds, axis=1) print(preds.shape, class_preds.shape) ``` -
- -
- ```python out (408, 2) (408,) ``` -
- -اکنون، اجازه دهید از `preds` برای محاسبه برخی معیارها استفاده کنیم! ما می‌توانیم معیارهای مرتبط با دیتاسِت MRPC را، به همان آسانی که دیتاسِت را بارگذاری کردیم، بارگذاری کنیم اما این بار با استفاده از تابع `load_metric()`. شیء باز گردانده شده تابعی به نام `compute()` دارد که می‌توانیم برای محاسبه معیارها از آن استفاده کنیم: - -
+Now, let's use those `preds` to compute some metrics! We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: ```py from datasets import load_metric @@ -220,18 +190,10 @@ metric = load_metric("glue", "mrpc") metric.compute(predictions=class_preds, references=raw_datasets["validation"]["label"]) ``` -
- -
- ```python out {'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} ``` -
- -از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. - -به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. در فصل ۷ یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`، با استفاده از روش پردازش داده‌ که در بخش ۲ انجام دادید، کوک کنید. +The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. -
\ No newline at end of file +This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in [Chapter 7](/course/chapter7). If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. From 14f0b6cc15f2a6c78eb7954013a04fa839838db1 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 13:02:48 +0200 Subject: [PATCH 251/254] test 3_tf for formatting - put back --- chapters/fa/chapter3/3_tf.mdx | 108 +++++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 35 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 2252a9613..1bed20661 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -1,6 +1,8 @@ -# Fine-tuning a model with Keras +
+ +# کوک کردن مدل‌ها با استفاده از کِراس -Once you've done all the data preprocessing work in the last section, you have just a few steps left to train the model. Note, however, that the `model.fit()` command will run very slowly on a CPU. If you don't have a GPU set up, you can get access to free GPUs or TPUs on [Google Colab](https://colab.research.google.com/). +زمانی که همه کارهای پیش‌پردازش در بخش قبل را انجام دادید، فقط چند مرحله با‌قی‌مانده تا تعلیم مدل دارید. با این حال، توجه داشته باشید که دستور `model.fit()` روی CPU بسیار آهسته اجرا خواهد شد. اگر GPU ندارید، می‌توانید از GPU یا TPU مجانی روی [گوگل کولَب](https://colab.research.google.com/) استفاده کنید. + +نمونه کدهای زیر فرض می‌کنند که شما مثال‌های بخش قبل را از پیش اجرا کرده‌اید. این یک خلاصه کوتاه است جهت یادآوری آنچه نیاز دارید: -The code examples below assume you have already executed the examples in the previous section. Here is a short summary recapping what you need: +
```py from datasets import load_dataset @@ -26,7 +30,6 @@ tokenizer = AutoTokenizer.from_pretrained(checkpoint) def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) - tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") @@ -48,17 +51,21 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset( ) ``` -### Training +
+ +### تعلیم -TensorFlow models imported from 🤗 Transformers are already Keras models. Here is a short introduction to Keras. +مدل‌های تِنسورفِلو که از ترَنسفورمِرهای هاگینگ‌فِیس وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. -That means that once we have our data, very little work is required to begin training on it. +این به این معنی است که به محض اینکه داده‌مان را در اختیار بگیریم، کار بسیار کمی لازم است تا تعلیم را روی آن شروع کنیم. -As in the [previous chapter](/course/chapter2), we will use the `TFAutoModelForSequenceClassification` class, with two labels: +مانند [فصل قبل](/course/chapter2)، ما از کلاس `TFAutoModelForSequenceClassification` با دو برچسب دسته استفاده خواهیم کرد: + +
```py from transformers import TFAutoModelForSequenceClassification @@ -66,16 +73,20 @@ from transformers import TFAutoModelForSequenceClassification model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) ``` -You will notice that unlike in [Chapter 2](/course/chapter2), you get a warning after instantiating this pretrained model. This is because BERT has not been pretrained on classifying pairs of sentences, so the head of the pretrained model has been discarded and a new head suitable for sequence classification has been inserted instead. The warnings indicate that some weights were not used (the ones corresponding to the dropped pretraining head) and that some others were randomly initialized (the ones for the new head). It concludes by encouraging you to train the model, which is exactly what we are going to do now. +
+ +شما متوجه خواهید شد که برخلاف [فصل ۲](/course/chapter2)، بعد از ساختن این مدل از پیش‌ تعلیم دیده یک هشدار دریافت می‌کنید. این به این خاطر است که BERT برای دسته‌بندی دو جمله‌ها از پیش‌ تعلیم ندیده است، بنابراین لایه سَر مدل از پیش‌ تعلیم دیده حذف شده و یک لایه سَر مناسب جهت دسته بندی رشته‌‌‌ها به جای آن قرار گرفته است. هشدارها نشان می‌دهند که برخی از وزن‌های مدل استفاده نشده‌اند (آنهایی که مربوط به لایه‌ سَر حذف شده مدل از پیش تعلیم دیده هستند) و برخی دیگر به صورت تصادفی مقدار‌ دهی شده‌‌اند (آنهایی که مربوط به لایه‌ سَر جدید هستند). در نتیجه این امر شما را تشویق به تعلیم مدل می‌کند، که دقیقا همان کاری است که می‌خواهیم اکنون انجام دهیم. -To fine-tune the model on our dataset, we just have to `compile()` our model and then pass our data to the `fit()` method. This will start the fine-tuning process (which should take a couple of minutes on a GPU) and report training loss as it goes, plus the validation loss at the end of each epoch. +برای کوک‌ کردن مدل روی دِیتاسِت‌مان، ما فقط باید مدل را `compile()` کنیم و سپس داده‌مان را به تابع `fit()` ارسال کنیم. این کار فرایند کوک‌ کردن را شروع می‌کند (که باید چند دقیقه روی GPU طول بکشد) و در همین حین هزینه `training` و هزینه `validation` را در انتهای هر epoch گزارش می‌دهد. -Note that 🤗 Transformers models have a special ability that most Keras models don't - they can automatically use an appropriate loss which they compute internally. They will use this loss by default if you don't set a loss argument in `compile()`. Note that to use the internal loss you'll need to pass your labels as part of the input, not as a separate label, which is the normal way to use labels with Keras models. You'll see examples of this in Part 2 of the course, where defining the correct loss function can be tricky. For sequence classification, however, a standard Keras loss function works fine, so that's what we'll use here. +توجه داشته باشید که مدل‌های ترَنسفورمِر هاگینگ‌فِیس قابلیت ویژه‌ای دارند که بسیاری از مدل‌های کِراس ندارند - آنها می‌توانند به صورت خودکار از یک تابع هزینه مناسب که به صورت داخلی محاسبه می‌کنند استفاده کنند. در صورتی که شما آرگومانی برای تابع هزینه در زمان `compile()` تعیین نکنید آنها از این تابع هزینه به صورت پیش‌فرض استفاده خواهند کرد. توجه داشته باشید که جهت استفاده از تابع هزینه داخلی شما نیاز خواهید داشت برچسب دسته‌های خودتان را به عنوان بخشی از ورودی، نه به صورت یک برچسب دسته مجزا که روش معمول استفاده از برچسب دسته‌ها در مدل‌های کِراس می‌باشد، ارسال کنید. شما مثال‌هایی از این را در بخش ۲ این درس خواهید دید، جایی که تعیین تابع هزینه‌ی درست می‌تواند تا اندازه‌ای پیچیده باشد. به هر حال، برای دسته‌بندی رشته‌‌‌ها، یک تابع هزینه استانداد کِراس به خوبی کار می‌کند، چیزی که ما در اینجا استفاده خواهیم کرد. +
+ ```py from tensorflow.keras.losses import SparseCategoricalCrossentropy @@ -90,29 +101,23 @@ model.fit( ) ``` +
+ -Note a very common pitfall here — you *can* just pass the name of the loss as a string to Keras, but by default Keras will assume that you have already applied a softmax to your outputs. Many models, however, output the values right before the softmax is applied, which are also known as the *logits*. We need to tell the loss function that that's what our model does, and the only way to do that is to call it directly, rather than by name with a string. +در اینجا توجه شما را به یک مسئله عام جلب می‌کنیم - شما *می‌توانید* فقط نام تابع هزینه را به صورت یک متغیر متنی برای کِراس ارسال کنید، اما کِراس به صورت پیش‌فرض فکر می‌کند شما یک لایه softmax از پیش به خروجی‌تان اعمال کرده‌اید. با این حال، بسیاری از مدل‌ها مقادیر را درست قبل از اینکه softmax به آنها اعمال شود به خروجی می‌دهند، که همچنین به عنوان *logits* شناخته می‌شوند. ما نیاز داریم که به تابع هزینه بگوییم، این کاری است که مدل‌مان انجام می‌دهد و تنها راه گفتن آن این است که به جای ارسال نام تابع هزینه به صورت متغیر متنی، آن را به صورت مستقیم صدا بزنیم. - -### Improving training performance +### بهبود کارایی تعلیم -If you try the above code, it certainly runs, but you'll find that the loss declines only slowly or sporadically. The primary cause -is the *learning rate*. As with the loss, when we pass Keras the name of an optimizer as a string, Keras initializes -that optimizer with default values for all parameters, including learning rate. From long experience, though, we know -that transformer models benefit from a much lower learning rate than the default for Adam, which is 1e-3, also written -as 10 to the power of -3, or 0.001. 5e-5 (0.00005), which is some twenty times lower, is a much better starting point. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و به صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. -In addition to lowering the learning rate, we have a second trick up our sleeve: We can slowly reduce the learning rate -over the course of training. In the literature, you will sometimes see this referred to as *decaying* or *annealing* -the learning rate. In Keras, the best way to do this is to use a *learning rate scheduler*. A good one to use is -`PolynomialDecay` — despite the name, with default settings it simply linearly decays the learning rate from the initial -value to the final value over the course of training, which is exactly what we want. In order to use a scheduler correctly, -though, we need to tell it how long training is going to be. We compute that as `num_train_steps` below. +علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپُختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. + +
```py from tensorflow.keras.optimizers.schedules import PolynomialDecay @@ -131,13 +136,17 @@ from tensorflow.keras.optimizers import Adam opt = Adam(learning_rate=lr_scheduler) ``` +
+ -The 🤗 Transformers library also has a `create_optimizer()` function that will create an `AdamW` optimizer with learning rate decay. This is a convenient shortcut that you'll see in detail in future sections of the course. +کتابخانه ترنسفورمرهای هاگینگ‌فِیس همچنین یک تابع `create_optimizer()` دارد که بهینه‌سازی از نوع `AdamW`، دارای میزان کاهش نرخ یادگیری می‌سازد. این یک میان‌بر مناسب است که آن‌ را با جزئیات در بخش‌های بعدی این آموزش خواهید دید. -Now we have our all-new optimizer, and we can try training with it. First, let's reload the model, to reset the changes to the weights from the training run we just did, and then we can compile it with the new optimizer: +اکنون بهینه‌ساز کاملا جدیدمان را در اختیار داریم و می‌توانیم آن را تعلیم دهیم. ابتدا، اجازه دهید مدل را مجددا بارگذاری کنیم تا تغییرات ایجاد شده بر وزنها که در تعلیم قبلی اعمال شده‌اند را به حالت اولیه بازگردانیم، سپس می‌توانیم مدل را با بهینه ساز جدید تدوین کنیم: + +
```py import tensorflow as tf @@ -147,41 +156,62 @@ loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) model.compile(optimizer=opt, loss=loss, metrics=["accuracy"]) ``` -Now, we fit again: +
+ +حالا دوباره مدل را فیت می‌کنیم: + +
```py model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) ``` +
+ + -💡 If you want to automatically upload your model to the Hub during training, you can pass along a `PushToHubCallback` in the `model.fit()` method. We will learn more about this in [Chapter 4](/course/chapter4/3) +💡 اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در [Chapter 4](/course/chapter4/3) در این مورد بیشتر خواهیم آموخت. -### Model predictions +### پیش‌بینی‌های مدل +تعلیم و تماشای پایین رفتن هزینه خیلی خوب است، اما اگر واقعا بخواهیم از مدل تعلیم دیده‌مان، چه برای محاسبه برخی معیار‌ها و چه برای استفاده در خط تولید، خروجی دریافت کنیم باید چه کار کنیم؟ برای این منظور می‌توانیم از تابع `predict()` استفاده کنیم. این کار به ازای هر کلاس یک *logits* از لایه‌ سَر خروجی مدل باز می‌گرداند. -Training and watching the loss go down is all very nice, but what if we want to actually get outputs from the trained model, either to compute some metrics, or to use the model in production? To do that, we can just use the `predict()` method. This will return the *logits* from the output head of the model, one per class. + +
```py preds = model.predict(tf_validation_dataset)["logits"] ``` -We can convert these logits into the model's class predictions by using `argmax` to find the highest logit, which corresponds to the most likely class: +
+ +سپس می‌توانیم `logits` را با استفاده از `argmax` برای یافتن بزرگ‌ترین `logit`، که نماینده محتمل‌ترین دسته می‌باشد، به پیش‌بینی‌های دسته مدل تبدیل کنیم: + +
```py class_preds = np.argmax(preds, axis=1) print(preds.shape, class_preds.shape) ``` +
+ +
+ ```python out (408, 2) (408,) ``` -Now, let's use those `preds` to compute some metrics! We can load the metrics associated with the MRPC dataset as easily as we loaded the dataset, this time with the `load_metric()` function. The object returned has a `compute()` method we can use to do the metric calculation: +
+ +اکنون، اجازه دهید از `preds` برای محاسبه برخی معیارها استفاده کنیم! ما می‌توانیم معیارهای مرتبط با دیتاسِت MRPC را، به همان آسانی که دیتاسِت را بارگذاری کردیم، بارگذاری کنیم اما این بار با استفاده از تابع `load_metric()`. شیء باز گردانده شده تابعی به نام `compute()` دارد که می‌توانیم برای محاسبه معیارها از آن استفاده کنیم: + +
```py from datasets import load_metric @@ -190,10 +220,18 @@ metric = load_metric("glue", "mrpc") metric.compute(predictions=class_preds, references=raw_datasets["validation"]["label"]) ``` +
+ +
+ ```python out {'accuracy': 0.8578431372549019, 'f1': 0.8996539792387542} ``` -The exact results you get may vary, as the random initialization of the model head might change the metrics it achieved. Here, we can see our model has an accuracy of 85.78% on the validation set and an F1 score of 89.97. Those are the two metrics used to evaluate results on the MRPC dataset for the GLUE benchmark. The table in the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) reported an F1 score of 88.9 for the base model. That was the `uncased` model while we are currently using the `cased` model, which explains the better result. +
+ +از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. + +به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. در فصل ۷ یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`، با استفاده از روش پردازش داده‌ که در بخش ۲ انجام دادید، کوک کنید. -This concludes the introduction to fine-tuning using the Keras API. An example of doing this for most common NLP tasks will be given in [Chapter 7](/course/chapter7). If you would like to hone your skills on the Keras API, try to fine-tune a model on the GLUE SST-2 dataset, using the data processing you did in section 2. +
\ No newline at end of file From bda0cc13628432f54ef5410e60133c572b70cc02 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 13:09:14 +0200 Subject: [PATCH 252/254] text formatting --- chapters/fa/chapter3/3_tf.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 1bed20661..1b5806d69 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -30,6 +30,7 @@ tokenizer = AutoTokenizer.from_pretrained(checkpoint) def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) + tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") @@ -53,6 +54,7 @@ tf_validation_dataset = tokenized_datasets["validation"].to_tf_dataset(
+ ### تعلیم مدل‌های تِنسورفِلو که از ترَنسفورمِرهای هاگینگ‌فِیس وارد شده‌اند از پیش مدل‌های کِراس هستند. این هم مقدمه‌ای کوتاه به کِراس. @@ -113,7 +115,7 @@ model.fit( -اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که 1e-3 می‌باشد و به صورت‌ 10 به توان -3 یا 0.001 نیز نوشته می‌شود. +اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که ۱e-۳ می‌باشد و به صورت‌ ۱۰ به توان یا ۰،۰۰۱ نیز نوشته می‌شود. علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپُختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. From 7e9ef4f019d4f2217ce6ee75af81d54baac03158 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 13:15:18 +0200 Subject: [PATCH 253/254] text formatting --- chapters/fa/chapter3/3.mdx | 2 +- chapters/fa/chapter3/3_tf.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chapters/fa/chapter3/3.mdx b/chapters/fa/chapter3/3.mdx index 7880d346a..aa64dc157 100644 --- a/chapters/fa/chapter3/3.mdx +++ b/chapters/fa/chapter3/3.mdx @@ -130,7 +130,7 @@ print(predictions.predictions.shape, predictions.label_ids.shape) خروجی تابع `predict()` تاپل نام گذاری شده دیگری شامل سه فیلد: `predictions`، `label_ids` و `metrics` می‌باشد. فیلد `metrics` فقط شامل هزینه داده عبور کرده و برخی معیارهای زمان (پیش‌بینی‌، در مجموع و به طور میانگین، چقدر طول کشیده) می‌باشد. به محض این که تابع `compute_metrics()` را کامل کرده و آن را به `Trainer` ارسال کنیم، آن فیلد متریک‌های بازگشتی از `compute_metrics()` را نیز در بر خواهد داشت. -همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها لاجیت‌های هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر لاجیت‌ها را باز می‌گردانند). برای تبدیل لاجیت‌ها به پیش‌بینی‌‌هایی که بتوانیم با برچسب‌هایمان مقایسه کنیم، نیاز داریم اندیس مقدار بیشینه روی بعد دوم را برداریم: +همانطور که می‌بینید، `predictions` آرایه‌ای دو بعدی است با شکل ۴۰۸ x ۲ (که ۴۰۸ تعداد عناصر در دیتاسِت مورد استفاده‌ ما می‌باشد). این ها logits مربوط به هریک از عناصر دیتاسِتی هستند که ما به تابع `predict()` ارسال کردیم (همانطور که در [فصل قبل](/course/chapter2) دیدید، همه مدل‌های ترَنسفورمِر logits را باز می‌گردانند). برای تبدیل logits به پیش‌بینی‌‌هایی که بتوانیم با برچسب‌هایمان مقایسه کنیم، نیاز داریم اندیس مقدار بیشینه روی بعد دوم را برداریم:
diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index 1b5806d69..ecb3d4b08 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -173,7 +173,7 @@ model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3) -💡 اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در [Chapter 4](/course/chapter4/3) در این مورد بیشتر خواهیم آموخت. +💡 اگر مایلید مدلتان را در حین تعلیم به صورت خودکار در هاب بارگذاری کنید، می‌توانید پارامتر `PushToHubCallback` را در تابع `model.fit()` ارسال کنید. در [فصل ۴](/course/chapter4/3) در این مورد بیشتر خواهیم آموخت. From 985fd5f9261d3e0ba38d68f63c39f3ba07d81345 Mon Sep 17 00:00:00 2001 From: gitkamyah Date: Thu, 23 Jun 2022 13:26:48 +0200 Subject: [PATCH 254/254] text formatting error fixe --- chapters/fa/chapter3/3_tf.mdx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/chapters/fa/chapter3/3_tf.mdx b/chapters/fa/chapter3/3_tf.mdx index ecb3d4b08..fb49d492f 100644 --- a/chapters/fa/chapter3/3_tf.mdx +++ b/chapters/fa/chapter3/3_tf.mdx @@ -117,7 +117,7 @@ model.fit( اگر کد بالا را امتحان کنید، قطعا اجرا خواهد شد، اما متوجه خواهید شد که هزینه بسیار آهسته یا به صورت گاه و بیگاه کاهش می‌یابد. علت اصلی این امر *نرخ یادگیری* می‌باشد. مانند تابع هزینه، وقتی که ما نام بهینه‌ساز را به صورت یک متغیر متنی به کِراس ارسال می‌کنیم، کِراس همه پارامترهای آن، شامل نرخ یادگیری، را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. به تجربه طولانی، ما می‌دانیم که مدل‌های ترَنسفورمِر از نرخ‌های یادگیری بسیار کوچک‌تر بهره بیشتری می‌برند تا مقدار پیش‌فرض برای بهینه‌ساز Adam، که ۱e-۳ می‌باشد و به صورت‌ ۱۰ به توان یا ۰،۰۰۱ نیز نوشته می‌شود. -علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپُختی یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از *زمان‌بند نرخ یادگیری* است.* یک زمان‌بند خوب برای استفاده زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم. +علاوه بر کم کردن یکباره نرخ یادگیری، ترفند دیگری نیز در آستین داریم: ما می‌توانیم نرخ یادگیری را به آهستگی در طول دوره تعلیم کاهش دهیم. گاها خواهید دید که از این روش در متون مشابه با عنوان نرخ یادگیری *محو شونده* یا *بازپُختی* یاد می‌شود. بهترین روش برای انجام این کار در کِراس استفاده از زمان‌بند نرخ یادگیری است. یک زمان‌بند خوب برای استفاده، زمان‌بند `PolynomialDecay` می‌باشد - این زمان‌بند برخلاف نامش نرخ یادگیری را در حالت پیش‌فرض به صورت خطی از مقدار اولیه تا مقدار نهایی در طول دوره تعلیم کاهش می‌دهد که دقیقا همان چیزی است که ما می‌خواهیم. به منظور استفاده درست از زمان‌بند ما نیاز داریم که به آن بگویم طول زمان تعلیم چقدر خواهد بود. در زیر ما آن را به عنوان `num_train_steps` محاسبه می‌کنیم.
@@ -232,8 +232,9 @@ metric.compute(predictions=class_preds, references=raw_datasets["validation"]["l
-از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل 85.78% و F1 score معادل 89.97 روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با 88.9 برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. +از آنجایی که مقداردهی اولیه تصادفی در لایه‌ سَر مدل ممکن است مقادیر معیارهای حاصل را تغییر دهد، نتایج دریافتی شما می‌توانند متفاوت باشند. در اینجا می‌بینیم که مدل ما دقتی معادل ۸۵.۷۸٪ و F1 score معادل ۸۹.۹۷٪ روی مجموعه `validation` دارد. این‌‌ها دو معیاری هستند که جهت سنجش نتایج روی داده MRPC در محک GLUE به کار رفته‌اند. جدول نتایج در مقاله [BERT](https://arxiv.org/pdf/1810.04805.pdf)، F1 score برابر با ۸۸.۹ برای مدل پایه گزارش کرده است. توجه داشته باشید که آن مدل `uncased` بود در حالی که اکنون ما از مدل `cased` استفاده می‌کنیم، که نتایج بهتر را توجیح می‌کند. + +به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. در فصل ۷ یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`، با استفاده از روش پردازش داده‌ که در بخش ۲ انجام دادید، کوک کنید. -به این ترتیب مقدمه کوک کردن با استفاده از `API` کِراس به پایان می‌رسد. در فصل ۷ یک مثال از انجام این کار برای معمول‌ترین مسئله‌های `NLP` ارائه خواهد شد. اگر مایلید مهارت‌های خود را روی `API` کِراس تقویت کنید، سعی کنید مدلی را روی مسئله `GLUE SST-2`، با استفاده از روش پردازش داده‌ که در بخش ۲ انجام دادید، کوک کنید.
\ No newline at end of file