-یک مزیت بزرگ در مورد توجه چند سر این است که به صورت موازی بسیار قابل محاسبه است. برخلاف RNNها، که سرهای ماژول های توجه چند سر و همه مراحل گام را به طور همزمان محاسبه می کند. یک مشکل محاسبه همزمان همه مراحل زمانی این است که می تواند کلمات آینده را نیز بررسی کند، در حالی که ما فقط می خواهیم به کلمات قبلی شرط بگذاریم. یک راه حل برای آن چیزی است که ** پوشش خود-توجه ای ** نامیده می شود. پوشش یک ماتریس مثلثی فوقانی است که در مثلث پایین صفر و در مثلث بالایی بی نهایت منفی دارد. تأثیر افزودن این پوشش به خروجی ماژول توجه این است که هر کلمه به سمت چپ دارای نمره توجه بسیار بیشتری نسبت به کلمات به سمت راست است، بنابراین مدل در عمل فقط بر روی کلمات قبلی تمرکز دارد. استفاده از پوشش در مدل زبان بسیار مهم است زیرا آن را از نظر ریاضی صحیح می کند، با این حال، در رمزگذارهای متن، متن دو زبانه می تواند مفید باشد.
+یک مزیت بزرگ در مورد توجه چندسر این است که محاسبات آن را به راحتی میتوان به صورت موازی انجام داد برخلاف RNNها، که سرهای ماژول های توجه چند سر و همه مراحل گام را به طور همزمان محاسبه می کند. یک مشکل محاسبه همزمان همه مراحل زمانی این است که می تواند کلمات آینده را نیز بررسی کند، در حالی که ما فقط می خواهیم به کلمات قبلی شرط بگذاریم. یک راه حل برای آن چیزی است که ** پوشش خود-توجه ای ** نامیده می شود. پوشش یک ماتریس مثلثی فوقانی است که در مثلث پایین صفر و در مثلث بالایی بی نهایت منفی دارد. تأثیر افزودن این پوشش به خروجی ماژول توجه این است که هر کلمه به سمت چپ دارای نمره توجه بسیار بیشتری نسبت به کلمات به سمت راست است، بنابراین مدل در عمل فقط بر روی کلمات قبلی تمرکز دارد. استفاده از پوشش در مدل زبان بسیار مهم است زیرا آن را از نظر ریاضی صحیح می کند، با این حال، در رمزگذارهای متن، متن دو زبانه می تواند مفید باشد.
**چرا این مدل خوب است؟**
-۱. ارتباط مستقیمی بین هر جفت کلمه ایجاد می کند. هر کلمه می تواند مستقیماً به حالت های پنهان کلمات قبلی دسترسی پیدا کند و گرادیان های ناپدید شده را کاهش دهد. تابع پرهزینه ای را به راحتی یاد میگیرد.
+۱. ارتباط مستقیمی بین هر جفت کلمه ایجاد می کند. هر کلمه می تواند مستقیماً به حالت های پنهان کلمات قبلی دسترسی پیدا کند و مشکل گرادیانهای ناپدیدشونده را برطرف میکند. تابع پرهزینه ای را به راحتی یاد میگیرد.
۲. تمام گامهای زمانی به صورت موازی محاسبه میشود.
۳. خود-توجهای درجه دوم است (تمام گامهای زمانی می تواند به همه موارد دیگر مربوط شود)، محدود به حداکثر طول دنباله.
@@ -284,7 +283,7 @@ You could see that when transformers were introduced, the performance was greatl
- برای دگرگون ساز بسیار مهم است
-### ترفند ۲: دست گرمی + برنامه زمانی آموزش ریشه مربع معکوس
+### ترفند ۲: دست گرمی + زمان بندی آموزش ریشه مربع معکوس
- از برنامه زمانی نرخ یادگیری استفاده کنید: برای اینکه دگرگون سازها به خوبی کار کنند، باید سرعت یادگیری خود را از صفر تا هزار مرحله به صورت خطی کاهش دهید
@@ -369,7 +368,7 @@ It requires computing all possible sequences and because of the complexity of $O
### رمزگشایی حریص کار نمی کند
-ما محتمل ترین کلمه را در هر مرحله زمان می گیریم. با این وجود، هیچ تضمینی این محتمل ترین توالی ممکن باشد، زیرا اگر مجبور باشید در مرحله ای آن مرحله را انجام دهید، دیگر هیچ راهی برای پیگیری جستجوی خود برای پسگرد سایر نشستهای قبلی ندارید.
+ما محتمل ترین کلمه را در هر مرحله زمان می گیریم. با این وجود،هیچ تضمینی برای اینکه این محتملترین توالی ممکن باشد وجود ندارد، زیرا اگر مجبور باشید در مرحله ای آن مرحله را انجام دهید، دیگر هیچ راهی برای پیگیری جستجوی خود برای پسگرد سایر نشستهای قبلی ندارید.
### جستجوی خسته کننده نیز امکان پذیر نیست
From c6978ffa5524b2cb5b9aae9fb9eeb0a6b0cb8ea3 Mon Sep 17 00:00:00 2001
From: thisistayeb <69354587+thisistayeb@users.noreply.github.com>
Date: Sun, 15 Nov 2020 14:21:24 +0300
Subject: [PATCH 11/12] [FA] Update 12-1.md Persian Translation
---
docs/fa/week12/12-1.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/docs/fa/week12/12-1.md b/docs/fa/week12/12-1.md
index 33b3e9142..9e9dcc268 100644
--- a/docs/fa/week12/12-1.md
+++ b/docs/fa/week12/12-1.md
@@ -7,7 +7,6 @@ authors: Jiayu Qiu, Yuhong Zhu, Lyuang Fu, Ian Leefmans
date: 20 Apr 2020
translator: Tayeb Pourebrahim
---
-
+## [توجه](https://www.youtube.com/watch?v=f01J0Dri-6k&t=69s)
+ما قبل از صحبت در مورد مفهوم دگرگونساز، مفهوم «توجه» را معرفی می کنیم. دو نوع توجه اصلی وجود دارد: «خود توجهای» * در مقابل * «توجه متقاطع»، در این دسته ها، می توانیم توجه سخت * در مقابل * توجه نرم داشته باشیم.
+
+همانطور که بعدا خواهیم دید، دگرگونسازها از ماژول های توجه ساخته شده اند، که به جای توالی، نگاشت بین مجموعه ها هستند، این بدان معناست که ما ترتیب ورودی و خروجی خود را اعمال نمی کنیم.
+
+
+
+### خود توجهای (I)
+
+مجموعهی $t$ را به عنوان ورودی $\boldsymbol{x}$ در نظر بگیرید:
+
+$$
+\lbrace\boldsymbol{x}_i\rbrace_{i=1}^t = \lbrace\boldsymbol{x}_1,\cdots,\boldsymbol{x}_t\rbrace
+$$
+
+که در آن هر $\boldsymbol{x}_i$ یک بردار $n$ بعدی است. از آنجا که مجموعه $t$ عنصر دارد، که هریک از آنها متعلق به $\mathbb{R}^n$ است، ما میتوانیم مجموعه را به عنوان یک ماتریس $\boldsymbol{X}\in\mathbb{R}^{n \times t}$ نشان دهیم.
+
+با خود توجهای، نمایش پنهان $h$ ترکیبی خطی از ورودی ها است:
+
+$$
+\boldsymbol{h} = \alpha_1 \boldsymbol{x}_1 + \alpha_2 \boldsymbol{x}_2 + \cdots + \alpha_t \boldsymbol{x}_t
+$$
+
+با استفاده از نمایش ماتریس توضیح داده شده در بالا، می توانیم لایه پنهان را به عنوان محصول ماتریس بنویسیم:
+
+$$
+\boldsymbol{h} = \boldsymbol{X} \boldsymbol{a}
+$$
+جایی که $\boldsymbol{a} \in \mathbb{R}^n$ یک بردار ستونی با اجزای $\alpha_i$ است.
+
+توجه داشته باشید که این با نمایش پنهانی که تاکنون دیده ایم، متفاوت است، جایی که ورودی ها در یک ماتریس وزن ضرب می شوند.
+
+بسته به محدودیت هایی که به بردار $\vect{a}$ اعمال می کنیم، می توانیم توجه سخت یا نرم را بدست آوریم.
+
+#### توجه سخت
+با توجه سخت، ما محدودیت جدید $\Vert\vect{a}\Vert_0 = 1$ را بر آلفاها اعمال میکنیم. این بدان معنی است که $\vect{a}$ یک بردار one-hot است. بنابراین همه ضرایب موجود در ترکیب خطی ورودیها به جز یکی برابر با صفر است و نمایش پنهان به ورودی $\boldsymbol{x}_i$ مربوط به المان $\alpha_i=1$ تقلیل پیدا میکنید.
+
+
+#### توجه نَرم
+
+با توجه نَرم، ما $\Vert\vect{a}\Vert_1 = 1$ را اعمال میکنیم. نمایشهای پنهان ترکیبی خطی از ورودی هایی است که مجموع ضرایب آنها ۱ است.
+
+
+
+### Self Attention (II)
+
+Where do the $\alpha_i$ come from?
+
+We obtain the vector $\vect{a} \in \mathbb{R}^t$ in the following way:
+
+$$
+\vect{a} = \text{[soft](arg)max}_{\beta} (\boldsymbol{X}^{\top}\boldsymbol{x})
+$$
+
+Where $\beta$ represents the inverse temperature parameter of the $\text{soft(arg)max}(\cdot)$. $\boldsymbol{X}^{\top}\in\mathbb{R}^{t \times n}$ is the transposed matrix representation of the set $\lbrace\boldsymbol{x}_i \rbrace\_{i=1}^t$, and $\boldsymbol{x}$ represents a generic $\boldsymbol{x}_i$ from the set. Note that the $j$-th row of $X^{\top}$ corresponds to an element $\boldsymbol{x}_j\in\mathbb{R}^n$, so the $j$-th row of $\boldsymbol{X}^{\top}\boldsymbol{x}$ is the scalar product of $\boldsymbol{x}_j$ with each $\boldsymbol{x}_i$ in $\lbrace \boldsymbol{x}_i \rbrace\_{i=1}^t$.
+
+The components of the vector $\vect{a}$ are also called "scores" because the scalar product between two vectors tells us how aligned or similar two vectors are. Therefore, the elements of $\vect{a}$ provide information about the similarity of the overall set to a particular $\boldsymbol{x}_i$.
+
+The square brackets represent an optional argument. Note that if $\arg\max(\cdot)$ is used, we get a one-hot vector of alphas, resulting in hard attention. On the other hand, $\text{soft(arg)max}(\cdot)$ leads to soft attention. In each case, the components of the resulting vector $\vect{a}$ sum to 1.
+
+Generating $\vect{a}$ this way gives a set of them, one for each $\boldsymbol{x}_i$. Moreover, each $\vect{a}_i \in \mathbb{R}^t$ so we can stack the alphas in a matrix $\boldsymbol{A}\in \mathbb{R}^{t \times t}$.
+
+Since each hidden state is a linear combination of the inputs $\boldsymbol{X}$ and a vector $\vect{a}$, we obtain a set of $t$ hidden states, which we can stack into a matrix $\boldsymbol{H}\in \mathbb{R}^{n \times t}$.
+
+$$
+\boldsymbol{H}=\boldsymbol{XA}
+$$
+
+### خود توجهای (II)
+
+$\alpha_i$ از کجا آمده است؟
+
+بردار $\vect{a} \in \mathbb{R}^t$ را به روش زیر به دست میآوریم.
+
+$$
+\vect{a} = \text{[soft](arg)max}_{\beta} (\boldsymbol{X}^{\top}\boldsymbol{x})
+$$
+جایی که $\beta$ نشان دهنده پارامتر معکوس دمای $\text{soft(arg)max}(\cdot)$ است. $\boldsymbol{X}^{\top}\in\mathbb{R}^{t \times n}$ نمایش ماتریس ترانهاده مجموعه $\lbrace\boldsymbol{x}_i \rbrace\_{i=1}^t$ است و $\boldsymbol{x}$ نماینده عمومی از مجموعه است. توجه داشته باشید که $j$-امین ردیف از $X^{\top}$ مربوط به عنصر $\boldsymbol{x}_j\in\mathbb{R}^n$ است، پس ردیف $j$-ام از $\boldsymbol{X}^{\top}\boldsymbol{x}$ ضرب اسکالر $\boldsymbol{x}_j$ که هر $\boldsymbol{x}_i$ در $\lbrace \boldsymbol{x}_i \rbrace\_{i=1}^t$ است.
+
+به اجزای بردار $\vect{a}$ «نمره» نیز گفته میشود زیرا ضرب اسکالر بین دو بردار به ما میگوید که دو بردار چقدر همسو یا یکسان هستند. بنابراین، عناصر $\vect{a}$ اطلاعاتی درباره شباهت مجموعه کلی با یک $\boldsymbol{x}_i$ خاص ارائه می دهند.
+
+براکتهای مربع نشان دهنده یک برهان اختیاری است. توجه داشته باشید که اگر از $\arg\max(\cdot)$ استفاده شود، ما یک بردار on-hot از آلفاها را به دست میآوریم که نتیجه آن «توجه سخت» است. از طرف دیگر، $\text{soft(arg)max}(\cdot)$ منجر به «توجه نرم» میشود. در هر حالت، مجموع اجزای بردار حاصل $\vect{a}$ برابر با ۱ میشود.
+
+تولید $\vect{a}$ به این شکل، مجموعهای از آنها میدهد، یکی برای هر $\boldsymbol{x}_i$. علاوه بر این، هر $\vect{a}_i \in \mathbb{R}^t$، پس ما میتوانیم آلفاها را در یک ماتریکس $\boldsymbol{A}\in \mathbb{R}^{t \times t}$ انباشته کنیم.
+
+از آنجا که هر حالت پنهان، یک ترکیب خطی از ورودیهای $\boldsymbol{X}$ و یک بردار $\vect{a}$ است، ما مجموعهای از $t$ حالت پنهان بدست میآوریم که میتوانیم آنها را در یک ماتریس $\boldsymbol{H}\in \mathbb{R}^{n \times t}$ انباشته کنیم.
+
+$$
+\boldsymbol{H}=\boldsymbol{XA}
+$$
+
+
+
+
+
+## [ذخیره کلید-مقدار](https://www.youtube.com/watch?v=f01J0Dri-6k&t=1056s)
+
+ذخیره کلید-مقدار الگویی است که برای ذخیره سازی (ذخیره)، بازیابی (پرسش) و مدیریت آرایه های انجمنی (دیکشنری ها / جداول درهمساز) طراحی شده است.
+
+به عنوان مثال، ما می خواهیم یک دستورالعمل برای تهیه لازانیا پیدا کنیم. ما یک کتاب دستورالعمل آشپزی داریم و در آن «لازانیا» را جستجو می کنیم - این پرسش است. این پرسش در مقابل تمام کلیدهای ممکن در مجموع داده چک شده است - در این مثال، این میتواند تمامی عنوانهای کتاب دستورالعمل آشپزی باشد. بررسی می کنیم که چقدر پرسش با هر عنوان همسو است تا حداکثر امتیاز تطبیق بین پرسش و همه کلیدهای مربوطه را پیدا کنیم. اگر خروجی ما تابع argmax باشد - ما دستور اصلی را با بالاترین امتیاز بازیابی می کنیم. در غیر این صورت، اگر از یک تابع «soft argmax» استفاده کنیم، توزیع احتمالی را بدست می آوریم و می توانیم به ترتیب از مشابه ترین محتوا به دستورالعمل های کمتر و کمتر مرتبط با پرسش بازیابی کنیم.
+
+اساساً «پرسش» سوال است. با توجه به یک «پرسش»، ما این «پرسش» را در برابر هر کلید بررسی می کنیم و تمام محتوای منطبق را بازیابی می کنیم.
+
+
+### پرسشها, کلیدها و مقادیر
+
+
+$$
+\begin{aligned}
+\vect{q} &= \vect{W_q x} \\
+\vect{k} &= \vect{W_k x} \\
+\vect{v} &= \vect{W_v x}
+\end{aligned}
+$$
+
+هر یک از بردارهای $\vect{q}، \vect{k}، \vect{v}$ را می توان به سادگی به عنوان دورانهای ورودی خاص $\vect{x}$ مشاهده کرد. جایی که $\vect{q}$ فقط $\vect{x}$ دوران شده توسط $\vect{W_q}$ است، $\vect{k}$ فقط $\vect{x}$ دوران شده توسط $\vect{W_k}$ و به طور مشابه برای $\vect{v}$. توجه داشته باشید که این اولین بار است که پارامترهای «قابل یادگیری» را معرفی می کنیم. ما همچنین هیچ [ویژگی] غیر خطی را حساب نمیکنیم زیرا توجه کاملاً براساس جهت گیری است.
+
+برای مقایسه پرسش با تمام کلیدهای ممکن، $\vect{q}$ و $\vect{k}$ باید از ابعاد یکسانی برخوردار باشند، * یعنی * $\vect{q}, \vect{k} \in \mathbb{R}^{d'}$.
+
+با این حال، $\vect{v}$ می تواند از هر ابعادی برخوردار باشد. اگر ما به عنوان نمونه دستورالعمل لازانیا خود ادامه دهیم - برای اینکه ابعاد را به عنوان کلید باشیم، باید درخواست پرسش بزنیم، به عنوان مثال به عنوان عناوین دستورالعمل های مختلفی که در جستجوی آنها هستیم. ابعاد دستورالعمل مربوطه به دست آمده، $\vect{v}$، می تواند به صورت دل بخواهی طولانی باشد. بنابراین داریم $\vect{v} \in \mathbb{R}^{d''}$.
+
+برای سادگی، در اینجا فرض را می گیریم که همه چیز دارای ابعاد $d$ است، یعنی:
+$$
+d' = d'' = d
+$$
+
+بنابراین اکنون ما مجموعه ای از $\vect{x}$، مجموعه ای از پرسشها، مجموعه ای از کلیدها و مجموعه ای از مقادیر را داریم. از آنجا که $t$ بردار را انباشتهایم، می توانیم این مجموعه ها را در ماتریس هایی قرار دهیم که هر کدام $t$ ستون دارند و ارتفاع هر بردار $d$ است.
+
+
+$$
+\{ \vect{x}_i \}_{i=1}^t \rightsquigarrow \{ \vect{q}_i \}_{i=1}^t, \, \{ \vect{k}_i \}_{i=1}^t, \, \, \{ \vect{v}_i \}_{i=1}^t \rightsquigarrow \vect{Q}, \vect{K}, \vect{V} \in \mathbb{R}^{d \times t}
+$$
+
+ما یک پرسش $\vect{q}$ را در برابر ماتریس تمام کلیدها $\vect{K}$ مقایسه می کنیم:
+
+$$
+\vect{a} = \text{[soft](arg)max}_{\beta} (\vect{K}^{\top} \vect{q}) \in \mathbb{R}^t
+$$
+
+سپس لایه پنهان به صورت ترکیب خطی از ستونهای $\vect{V}$ با ضرایب وزنی $\vect{a}$ خواهد بود:
+
+$$
+\vect{h} = \vect{V} \vect{a} \in \mathbb{R}^d
+$$
+
+
+از آنجا که $t$ پرسش داریم، $t$ مربوط به $\vect{a}$ وزن دریافت خواهیم کرد و بنابراین یک ماتریس $\vect{A}$ از بعد $t \times t$.
+
+
+$$
+\{ \vect{q}_i \}_{i=1}^t \rightsquigarrow \{ \vect{a}_i \}_{i=1}^t, \rightsquigarrow \vect{A} \in \mathbb{R}^{t \times t}
+$$
+
+بنابراین در علامت گذاری ماتریس:
+
+$$
+\vect{H} = \vect{VA} \in \mathbb{R}^{d \times t}
+$$
+
+بعلاوه، ما معمولاً $\beta$ را به طور زیر در نظر میگیریم:
+
+$$
+\beta = \frac{1}{\sqrt{d}}
+$$
+این کار برای ثابت نگه داشتن دما در بین گزینه های مختلف بعد $d$ انجام می شود و بنابراین ما بر ریشه مربع تعداد ابعاد $d$ تقسیم می کنیم. (فکر کنید طول بردار $\vect{1} \in \R^d$ چقدر است.)
+
+برای پیاده سازی، می توانیم محاسبه را با جمع کردن تمام $\vect{W}$ ها در یک $\vect{W}$ بلند سریع انجام دهیم و سپس $\vect{q}, \vect{k}, \vect{v}$ یک بار محاسبه کنیم:
+
+$$
+\begin{bmatrix}
+\vect{q} \\
+\vect{k} \\
+\vect{v}
+\end{bmatrix} =
+\begin{bmatrix}
+\vect{W_q} \\
+\vect{W_k} \\
+\vect{W_v}
+\end{bmatrix} \vect{x} \in \mathbb{R}^{3d}
+$$
+
+
+
+همچنین مفهومی به نام «سَرها» نیز وجود دارد. در بالا مثالی با یک سر دیده ایم اما می توانیم چندین سر داشته باشیم. به عنوان مثال، مثلاً ما $h$ سر داریم، سپس $h$ $\vect{q}$ها، $h$ $\vect{k}$ها و $h$ $\vect{v}$ داریم و ما در انتها با یک بردار در $\mathbb{R}^{3hd}$ مواجه خواهیم شد:
+
+$$
+\begin{bmatrix}
+\vect{q}^1 \\
+\vect{q}^2 \\
+\vdots \\
+\vect{q}^h \\
+\vect{k}^1 \\
+\vect{k}^2 \\
+\vdots \\
+\vect{k}^h \\
+\vect{v}^1 \\
+\vect{v}^2 \\
+\vdots \\
+\vect{v}^h
+\end{bmatrix} =
+\begin{bmatrix}
+\vect{W_q}^1 \\
+\vect{W_q}^2 \\
+\vdots \\
+\vect{W_q}^h \\
+\vect{W_k}^1 \\
+\vect{W_k}^2 \\
+\vdots \\
+\vect{W_k}^h \\
+\vect{W_v}^1 \\
+\vect{W_v}^2 \\
+\vdots \\
+\vect{W_v}^h
+\end{bmatrix} \vect{x} \in \R^{3hd}
+$$
+
+
+
+با این حال، ما همچنان می توانیم مقادیر چند سر را تغییر دهیم تا بعد اصلی $\R^d$ را با استفاده از $\vect{W_h} \in \mathbb{R}^{d \times hd}$ داشته باشیم. این فقط یکی از راه های ممکن برای پیاده سازی ذخیرهی کلید-ارزش است.
+
+## [دگرگونساز](https://www.youtube.com/watch?v=f01J0Dri-6k&t=2114s)
+
+با افزایش دانش ما در «توجه» به طور خاص، ما اکنون عناصر اساسی ساخت دگرگونساز را تفسیر می کنیم. به طور خاص، ما یک «شبکه مرور به پیش» را از یک دگرگونساز اساسی عبور خواهیم داد، و خواهیم دید که چگونه توجه در الگوی رمزگذار-رمزگشای استاندارد استفاده می شود و با معماریهای متوالی RNN مقایسه می شود.
+
+
+### معماری رمزگذار-رمزگشای
+
+ما باید با این اصطلاحات آشنا باشیم. در اثب ات رمزگذار خودکار به طور برجسته ای نشان داده می شود و درک پیش نیاز آن تا این مرحله است. به طور خلاصه، ورودی از طریق رمزگذار و رمزگشایی تغذیه می شود که نوعی گلوگاه را بر دادهها تحمیل می کند و فقط مهمترین اطلاعات را از این طریق مجبور می کند. این اطلاعات در خروجی بلوک رمزگذار ذخیره می شود و می تواند برای انواع کارهای غیر مرتبط استفاده شود.
+
+
+
+تصویر اول:
+دو مثال از طرح یک خودرمزگذار. مدل در سمت چپ نشان می دهد که چگونه یک رمزگذار خودکار می تواند با دو تبدیل آفرین + فعال سازی طراحی شود ، جایی که تصویر سمت راست این واحد «لایه» را با یک ماژول دلخواه جایگزین می کند.
+
+
+"توجه" ما به طرح خود رمزگذار جلب شده است همانطور که در مدل سمت راست نشان داده شده است و اکنون نگاهی به داخل، در زمینه دگرگونسازها می اندازد.
+
+### ماژول رمزگذار
+
+
+
+تصویر دوم: رمزگذار دگرگونساز که مجموعه ای از ورودی $\vect{x}$, را می پذیرد و مجموعه ای از نمایش های پنهان $\vect{h}^\text{Enc}$ را تولید می کند.
+
+
+ماژول رمزگذار مجموعه ای از ورودی ها را می پذیرد ، که به طور همزمان از طریق بلوک توجه به خود تغذیه می شوند و آن را دور می زنند تا به بلوک ʻAdd، Norm` برسند. در آن زمان، آنها دوباره بطور همزمان از 1D-کانولوشن و یک بلوک دیگر "Add، Norm" عبور می کنند و در نتیجه به عنوان مجموعه نمایش مخفی تولید می شوند. سپس این مجموعه نمایش مخفی یا از طریق تعداد دلخواه ماژول های رمزگذار * یعنی * لایه های بیشتر) ارسال می شود یا به رمزگشای. اکنون باید با جزئیات بیشتری در مورد این بلوک ها بحث کنیم.
+
+### خود توجهای
+
+مدل خود توجه، یک مدل توجه عادی است. پرسش، کلید و مقدار از همان مورد ورودی پی در پی تولید می شوند. در وظایفی که سعی در مدل سازی داده های پی در پی دارند، رمزگذاری موقعیتی قبل از این ورودی اضافه می شود. خروجی این بلوک مقادیر توجه شده است. بلوک توجه به خود مجموعه ای از ورودی ها را از $1, \cdots , t$ و ورودی های $1, \cdots, t$ توجه را که از طریق بقیه رمزگذار تغذیه می شود، می پذیرد.
+
+
+
+تصویر سوم: بلوک توجه به خود. توالی ورودی به صورت مجموعه ای در امتداد بعد سوم نشان داده شده و بهم پیوسته است.
+
+
+
+
+#### جمع و نُرم
+
+بلوک «جمع نُرم» دارای دو جز است. ابتدا بلوک جمع، که یک اتصال باقیمانده است و نرمال سازی لایه است.
+
+#### 1D-کانولوشن
+
+به دنبال این مرحله ، یک کانولوشن-1D (معروف به یک شبکه تغذیه خوراک موقعیتی) اعمال می شود. این بلوک از دو لایه متراکم تشکیل شده است. بسته به اینکه چه مقادیری تنظیم شده است ، این بلوک به شما امکان می دهد ابعاد خروجی $\vect{h}^\text{Enc}$ را تنظیم کنید.
+
+### ماژول رمزگشا
+
+دگرگونساز رمزگشا روشی مشابه رمزگذار را دنبال می کند. با این حال، یک زیر بلوک اضافی وجود دارد که باید در نظر گرفته شود. علاوه بر این، ورودی های این ماژول متفاوت است.
+
+
+
+تصویر چهارم توضیحی دوستانه تر از رمزگشا.
+
+
+#### توجه متقابل
+توجه متقابل از پرسش، کلید و تنظیم مقدار استفاده شده برای بلوکهایخود توجه استفاده می کند. با این وجود ورودی ها کمی پیچیده تر هستند. ورودی رمزگشا یک نقطه داده$\vect{y}\_i$ است که سپس از طریق خود توجه عبور داده می شود و بلوک های نرم به آن اضافه می شود و در نهایت به بلوک توجه متقابل می رسد. این به عنوان پرسش توجه متقابل عمل می کند، جایی که جفت کلید - مقدارها خروجی $\vect{h}^\text{Enc}$ هستند، جایی که این خروجی با تمام ورودی های گذشته $\vect{x}\_1, \cdots, \vect{x}\_{t}$ محاسبه شده است.
+
+
+## خلاصه
+یک مجموعه $\vect{x}\_1$ به $\vect{x}\_{t}$ از طریق رمزگذار تغذیه می شود. با استفاده از خود توجهای و چند بلوک دیگر، خروجی به صورت $\lbrace\vect{h}^\text{Enc}\rbrace_{i=1}^t$ به دست میآید، که رمزگشا را تغذیه میکند. پس از اعمال خود توجه به آن، توجه متقابل اعمال می شود. در این بلوک، پرس و جو مربوط به نمایش نمادی در زبان مقصد $\vect{y}\_i$ است، و کلید و مقادیر از جمله زبان مبدا ($\vect{x}\_1$ به $\vect{x}\_{t}$) هستند. به صورت شهودی، توجه متقابل می یابد که کدام مقادیر در دنباله ورودی بیشترین ارتباط را با ساخت $\vect{y}\_t$ دارند و بنابراین مستحق بالاترین ضرایب توجه هستند.سپس خروجی این توجه متقابل از طریق زیر بلوک 1D-کانولوشن دیگری تأمین می شود،و ما $\vect{h}^\text{Dec}$ داریم. برای زبان هدف مشخص، با مقایسه $\lbrace\vect{h}^\text{Dec}\rbrace_{i=1}^t$ با یک دیتای هدف، ساده است که از اینجا ببنیم که آموزش از کجا شروع میشود.
+
+
+### مدل های زبان کلمه ای
+
+چند واقعیت مهم وجود دارد که ما قبلاً برای توضیح مهمترین ماژولهای دگرگونساز کنار گذاشته ایم، اما اکنون باید در مورد آنها بحث کنیم تا بفهمیم چگونه دگرگونسازها می توانند در کارهای زبان به نتایج پیشرفته برسند.
+
+
+#### رمزگذاری موقعیتی
+
+مکانیسم های توجه به ما امکان می دهد عملیات ها را موازی کنیم و زمان آموزش مدل را بسیار سرعت ببخشیم، اما اطلاعات متوالی را از دست می دهیم. ویژگی رمزگذاری موقعیتی به ما امکان می دهد تا این امکان را بدست بیاوریم.
+
+
+### نمایش های معنایی
+
+در طول آموزش یک دگرگونساز، بسیاری از نمایش های پنهان ایجاد می شود. برای ایجاد یک فضای جاسازی مشابه فضایی که توسط مثال مدل «کلمه-زبان» در PyTorch استفاده شده است، خروجی توجه متقابل، نمایشی معنایی از کلمه $ x_i $ فراهم می کند، که در هر زمان می توان آزمایشات بیشتری را بر روی این مجموعه داده اجرا کرد.
+
+
+
+## خلاصه کد
+
+اکنون بلوک های دگرگونسازها را که در بالا بحث شد با فرمت قابل درک تر، خواهیم دید. کد!
+
+اولین ماژول به بلوک توجه چند سر نگاه خواهیم کرد. بسته به پرسش، کلید و مقادیر وارد شده در این بلوک، می توان از آن برای خود-توجهای یا توجه متقابل استفاده کرد.
+
+```python
+class MultiHeadAttention(nn.Module):
+ def __init__(self, d_model, num_heads, p, d_input=None):
+ super().__init__()
+ self.num_heads = num_heads
+ self.d_model = d_model
+ if d_input is None:
+ d_xq = d_xk = d_xv = d_model
+ else:
+ d_xq, d_xk, d_xv = d_input
+ # Embedding dimension of model is a multiple of number of heads
+ assert d_model % self.num_heads == 0
+ self.d_k = d_model // self.num_heads
+ # These are still of dimension d_model. To split into number of heads
+ self.W_q = nn.Linear(d_xq, d_model, bias=False)
+ self.W_k = nn.Linear(d_xk, d_model, bias=False)
+ self.W_v = nn.Linear(d_xv, d_model, bias=False)
+ # Outputs of all sub-layers need to be of dimension d_model
+ self.W_h = nn.Linear(d_model, d_model)
+```
+کلاس توجه چند سر را شروع میکنیم. اگر `d_input` تامین شده بود، به توجه متقابل تبدیل میشود. در غیر این صورت به خود توجهای تبدیل میشود. تنظیم پرسش، کلید، مقدار به عنوان یک تغییر شکل خطی از ورودی `d_model` ساخته شده است.
+
+```python
+def scaled_dot_product_attention(self, Q, K, V):
+ batch_size = Q.size(0)
+ k_length = K.size(-2)
+
+ # Scaling by d_k so that the soft(arg)max doesnt saturate
+ Q = Q / np.sqrt(self.d_k) # (bs, n_heads, q_length, dim_per_head)
+ scores = torch.matmul(Q, K.transpose(2,3)) # (bs, n_heads, q_length, k_length)
+
+ A = nn_Softargmax(dim=-1)(scores) # (bs, n_heads, q_length, k_length)
+
+ # Get the weighted average of the values
+ H = torch.matmul(A, V) # (bs, n_heads, q_length, dim_per_head)
+
+ return H, A
+```
+
+لایه پنهان مربوط به رمزگذاری مقادیر را پس از مقیاس گذاری توسط بردار توجه برگردانید. برای اهداف نگهداری کتاب (کدام ارزشها در توالی مورد نظر پوشانده شده اند؟) A نیز بازگردانده می شود.
+
+```python
+def split_heads(self, x, batch_size):
+ return x.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
+```
+آخرین بعد را به (`heads` × `depth`) تقسیم کنید. بعد از جابجایی برگردانید تا شکل بگیرد (`batch_size` × `num_heads` × `seq_length` × `d_k`)
+
+
+```python
+def group_heads(self, x, batch_size):
+ return x.transpose(1, 2).contiguous().
+ view(batch_size, -1, self.num_heads * self.d_k)
+```
+سرهای توجه را با هم ترکیب می کند، تا شکل صحیح مطابق با اندازه دسته و طول توالی داشته باشد.
+
+
+```python
+def forward(self, X_q, X_k, X_v):
+ batch_size, seq_length, dim = X_q.size()
+ # After transforming, split into num_heads
+ Q = self.split_heads(self.W_q(X_q), batch_size)
+ K = self.split_heads(self.W_k(X_k), batch_size)
+ V = self.split_heads(self.W_v(X_v), batch_size)
+ # Calculate the attention weights for each of the heads
+ H_cat, A = self.scaled_dot_product_attention(Q, K, V)
+ # Put all the heads back together by concat
+ H_cat = self.group_heads(H_cat, batch_size) # (bs, q_length, dim)
+ # Final linear layer
+ H = self.W_h(H_cat) # (bs, q_length, dim)
+ return H, A
+```
+
+شبکه مرور به پیش توجه چند سر.
+
+با توجه به ورودی به q ،k و v تقسیم می شود، در این مرحله این مقادیر از طریق یک مکانیزم توجه به محصول با مقیاس کوچک تغذیه می شوند، به هم متصل شده و از طریق یک لایه خطی نهایی تغذیه می شوند. آخرین خروجی بلوک توجه، توجه پیدا شده و نمایش مخفی است که از بلوک های باقیمانده عبور می کند.
+
+اگرچه بلوک بعدی نشان داده شده در نرم و تابع add دگرگونسازها / رمزگذار تابعی است که قبلاً در PyTorch تعبیه شده است. به همین ترتیب، این یک اجرای کاملاً ساده است و به کلاس خودش نیازی ندارد. بعدی بلوک کانولوشنی 1-D است. برای جزئیات بیشتر لطفا به بخشهای قبلی مراجعه کنید.
+
+اکنون که همه کلاس های اصلی خود را ساخته ایم (یا برای ما ساخته شده است)، اکنون به یک ماژول رمزگذار روی می آوریم.
+
+```python
+class EncoderLayer(nn.Module):
+ def __init__(self, d_model, num_heads, conv_hidden_dim, p=0.1):
+ self.mha = MultiHeadAttention(d_model, num_heads, p)
+ self.layernorm1 = nn.LayerNorm(normalized_shape=d_model, eps=1e-6)
+ self.layernorm2 = nn.LayerNorm(normalized_shape=d_model, eps=1e-6)
+
+ def forward(self, x):
+ attn_output, _ = self.mha(x, x, x)
+ out1 = self.layernorm1(x + attn_output)
+ cnn_output = self.cnn(out1)
+ out2 = self.layernorm2(out1 + cnn_output)
+ return out2
+```
+
+در قدرتمندترین دگرگون سازها، تعداد زیادی از این رمزگذارها به طور دلخواه روی هم قرار گرفته اند.
+
+یادآوری شود که خود توجهای به خودی خود فاقد بازگشت یا کانولوشن است، اما این همان چیزی است که به آن اجازه می دهد تا خیلی سریع اجرا شود. برای حساس کردن آن به موقعیت، رمزگذاری موقعیتی را ارائه می دهیم. این موارد به شرح زیر محاسبه می شود:
+
+
+
+$$
+\begin{aligned}
+E(p, 2) &= \sin(p / 10000^{2i / d}) \\
+E(p, 2i+1) &= \cos(p / 10000^{2i / d})
+\end{aligned}
+$$
+
+برای اینکه جزییات دقیق تر فضای زیادی را اشغال نکند، برای کد کامل مورد استفاده در اینجا ما شما را به https://github.com/Atcold/pytorch-Deep-Learning/blob/master/15-transformer.ipynb ارجاع می دهیم.
+
+یک رمزگذار کامل، با N لایه های رمزگذار انباشته، و همچنین جاسازی موقعیت، به طور زیر نوشته شده است:
+
+```python
+class Encoder(nn.Module):
+ def __init__(self, num_layers, d_model, num_heads, ff_hidden_dim,
+ input_vocab_size, maximum_position_encoding, p=0.1):
+ self.embedding = Embeddings(d_model, input_vocab_size,
+ maximum_position_encoding, p)
+ self.enc_layers = nn.ModuleList()
+ for _ in range(num_layers):
+ self.enc_layers.append(EncoderLayer(d_model, num_heads,
+ ff_hidden_dim, p))
+ def forward(self, x):
+ x = self.embedding(x) # Transform to (batch_size, input_seq_length, d_model)
+ for i in range(self.num_layers):
+ x = self.enc_layers[i](x)
+ return x # (batch_size, input_seq_len, d_model)
+```
+
+## مثال کاربرد
+
+وظایف زیادی وجود دارد که می توانید فقط برای آنها از رمزگذار استفاده کنید. در نوت بوک همراه، می بینیم که چگونه می توان از رمزگذار برای عقیده کاوی استفاده کرد.
+
+با استفاده از مجموعه داده های بررسی imdb، می توانیم از رمزگذار نمایشی پنهان از دنباله ای از متن را تولید کنیم و این فرایند رمزگذاری را با آنتروپی متقابل باینری، که مربوط به یک بررسی مثبت یا منفی فیلم است ، آموزش دهیم.
+
+ما دوباره کارها و اصول اولیه را کنار گذاشته و شما را به سمت نوت بوک راهنما هدایت می کنیم، اما در اینجا مهمترین اجزای معماری مورد استفاده در دگرگونسازها وجود دارد:
+
+
+```python
+class TransformerClassifier(nn.Module):
+ def forward(self, x):
+ x = Encoder()(x)
+ x = nn.Linear(d_model, num_answers)(x)
+ return torch.max(x, dim=1)
+
+model = TransformerClassifier(num_layers=1, d_model=32, num_heads=2,
+ conv_hidden_dim=128, input_vocab_size=50002, num_answers=2)
+```
+جایی که این مدل به صورت معمولی آموزش دیده است.