diff --git a/docs/_config.yml b/docs/_config.yml index c2fd8a3e5..032ccb16e 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -610,6 +610,7 @@ fa: - path: fa/week12/12.md sections: - path: fa/week12/12-1.md + - path: fa/week12/12-2.md - path: fa/week13/13.md sections: - path: fa/week13/13-1.md diff --git a/docs/fa/week12/12-1.md b/docs/fa/week12/12-1.md index 265a15982..9e9dcc268 100644 --- a/docs/fa/week12/12-1.md +++ b/docs/fa/week12/12-1.md @@ -6,9 +6,7 @@ lecturer: Mike Lewis authors: Jiayu Qiu, Yuhong Zhu, Lyuang Fu, Ian Leefmans date: 20 Apr 2020 translator: Tayeb Pourebrahim -translation-date: 10 Oct 2020 --- - -یک مزیت بزرگ در مورد توجه چند سر این است که به صورت موازی بسیار قابل محاسبه است. برخلاف RNNها، که سرهای ماژول های توجه چند سر و همه مراحل گام را به طور همزمان محاسبه می کند. یک مشکل محاسبه همزمان همه مراحل زمانی این است که می تواند کلمات آینده را نیز بررسی کند، در حالی که ما فقط می خواهیم به کلمات قبلی شرط بگذاریم. یک راه حل برای آن چیزی است که ** پوشش خود-توجه ای ** نامیده می شود. پوشش یک ماتریس مثلثی فوقانی است که در مثلث پایین صفر و در مثلث بالایی بی نهایت منفی دارد. تأثیر افزودن این پوشش به خروجی ماژول توجه این است که هر کلمه به سمت چپ دارای نمره توجه بسیار بیشتری نسبت به کلمات به سمت راست است، بنابراین مدل در عمل فقط بر روی کلمات قبلی تمرکز دارد. استفاده از پوشش در مدل زبان بسیار مهم است زیرا آن را از نظر ریاضی صحیح می کند، با این حال، در رمزگذارهای متن، متن دو زبانه می تواند مفید باشد. +یک مزیت بزرگ در مورد توجه چندسر این است که محاسبات آن را به راحتی می‌توان به صورت موازی انجام داد برخلاف RNNها، که سرهای ماژول های توجه چند سر و همه مراحل گام را به طور همزمان محاسبه می کند. یک مشکل محاسبه همزمان همه مراحل زمانی این است که می تواند کلمات آینده را نیز بررسی کند، در حالی که ما فقط می خواهیم به کلمات قبلی شرط بگذاریم. یک راه حل برای آن چیزی است که ** پوشش خود-توجه ای ** نامیده می شود. پوشش یک ماتریس مثلثی فوقانی است که در مثلث پایین صفر و در مثلث بالایی بی نهایت منفی دارد. تأثیر افزودن این پوشش به خروجی ماژول توجه این است که هر کلمه به سمت چپ دارای نمره توجه بسیار بیشتری نسبت به کلمات به سمت راست است، بنابراین مدل در عمل فقط بر روی کلمات قبلی تمرکز دارد. استفاده از پوشش در مدل زبان بسیار مهم است زیرا آن را از نظر ریاضی صحیح می کند، با این حال، در رمزگذارهای متن، متن دو زبانه می تواند مفید باشد. **چرا این مدل خوب است؟** -۱. ارتباط مستقیمی بین هر جفت کلمه ایجاد می کند. هر کلمه می تواند مستقیماً به حالت های پنهان کلمات قبلی دسترسی پیدا کند و گرادیان های ناپدید شده را کاهش دهد. تابع پرهزینه ای را به راحتی یاد می‌گیرد. +۱. ارتباط مستقیمی بین هر جفت کلمه ایجاد می کند. هر کلمه می تواند مستقیماً به حالت های پنهان کلمات قبلی دسترسی پیدا کند و مشکل گرادیان‌های ناپدیدشونده را برطرف می‌کند. تابع پرهزینه ای را به راحتی یاد می‌گیرد. ۲. تمام گام‌های زمانی به صورت موازی محاسبه می‌شود. ۳. خود-توجه‌ای درجه دوم است (تمام گام‌های زمانی می تواند به همه موارد دیگر مربوط شود)، محدود به حداکثر طول دنباله. @@ -284,7 +282,7 @@ You could see that when transformers were introduced, the performance was greatl - برای دگرگون ساز بسیار مهم است -### ترفند ۲: دست گرمی + برنامه زمانی آموزش ریشه مربع معکوس +### ترفند ۲: دست گرمی + زمان بندی آموزش ریشه مربع معکوس - از برنامه زمانی نرخ یادگیری استفاده کنید: برای اینکه دگرگون سازها به خوبی کار کنند، باید سرعت یادگیری خود را از صفر تا هزار مرحله به صورت خطی کاهش دهید @@ -369,7 +367,7 @@ It requires computing all possible sequences and because of the complexity of $O ### رمزگشایی حریص کار نمی کند -ما محتمل ترین کلمه را در هر مرحله زمان می گیریم. با این وجود، هیچ تضمینی این محتمل ترین توالی ممکن باشد، زیرا اگر مجبور باشید در مرحله ای آن مرحله را انجام دهید، دیگر هیچ راهی برای پیگیری جستجوی خود برای پس‌گرد سایر نشست‌های قبلی ندارید. +ما محتمل ترین کلمه را در هر مرحله زمان می گیریم. با این وجود،هیچ تضمینی برای این‌که این محتمل‌ترین توالی ممکن باشد وجود ندارد، زیرا اگر مجبور باشید در مرحله ای آن مرحله را انجام دهید، دیگر هیچ راهی برای پیگیری جستجوی خود برای پس‌گرد سایر نشست‌های قبلی ندارید. ### جستجوی خسته کننده نیز امکان پذیر نیست diff --git a/docs/fa/week12/12-2.md b/docs/fa/week12/12-2.md new file mode 100644 index 000000000..2a696718b --- /dev/null +++ b/docs/fa/week12/12-2.md @@ -0,0 +1,614 @@ +--- +lang: fa +lang-ref: ch.12-2 +title: مدل های زبان رمزگشا +lecturer: Mike Lewis +authors: Trevor Mitchell, Andrii Dobroshynskyi, Shreyas Chandrakaladharan, Ben Wolfson +date: 20 Apr 2020 +translator: Tayeb Pourebrahim +--- + + + +## [الگوریتم جستجو پرتو محلی](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=2732s) +الگوریتم جستجو پرتو محلی یک تکنیک دیگر برای رمزگشایی از مدل زبانی و ایجاد متن است. در هر مرحله، الگوریتم ردپای مسیر $k$ محتمل‌ترین (بهترین) ترجمه های جزئی(فرضیه‌ها) دنبال می‌کند. امتیاز هر فرضیه برابر با لگاریتم احتمال آن است. +الگوریتم فرضیه های با بالاترین نمره را انتخاب می کند. +
+
+تصویر اول: رمزگشایی پرتو محلی +
+ + + +درخت پرتو تا چه عمقی منشعب می شود؟ + +درخت پرتو تا زمانی که به ژتون انتهای جمله برسد، ادامه می یابد. به محض خروجی ژتون انتهای جمله، فرضیه تمام می شود. + +چرا (در NMT) اندازه های بسیار بزرگ پرتو اغلب منجر به ترجمه های خالی می شود؟ + +در زمان آموزش، الگوریتم اغلب از پرتو استفاده نمی کند، زیرا بسیار گران است. به جای استفاده از فاکتورگیری خودهمبسته (که از خروجی درست پیشبینی $n+1$ کلمه‌ی اول به دست آوردیم). این مدل در هنگام آموزش در معرض اشتباهات خود قرار ندارد، بنابراین ممکن است که «مُهملاتی» در پرتو نشان داده شود. + +خلاصه: جستجوی پرتو را تا زمانی که تمام $K$ فرضیه ژتون پایانی را تولید کنند یا به حد حداکثر رمزگشایی T برسند ادامه پیدا می‌کند. + + + + +### نمونه گیری +ما ممکن است محتمل‌ترین دنباله را نخواهیم. در عوض می توانیم از توزیع مدل نمونه بگیریم. + +با این حال، نمونه گیری از توزیع مدل مشکل خاص خود را ایجاد می کند. هنگامی که از یک انتخاب «بد» نمونه برداری شد، مدل در وضعیتی است که در طول آموزش هرگز با آن روبرو نشده است، احتمال ادامه ارزیابی «بد» افزایش میابد. بنابراین الگوریتم می تواند در حلقه‌های بازخورد وحشتناک گیر کند. + + +### نمونه گیری کی-بالا +یک تکنیک نمونه گیری خالص که توزیع را به $K$ بهترین‌ها کوتاه می‌کنیم و سپس دوباره نرمالایز می‌کنیم و از توزیع نمونه می‌گیریم. +
+
+تصویر دوم: نمونه گیری کی-بالا +
+ + + +### سوال: چرا نمونه گیری کی-بالا به خوبی کار می‌کند؟ + +این تکنیک به این دلیل خوب کار می‌کند که اساساً سعی می شود مانع از افتادن از منیفولد زبان خوب شود وقتی که ما فقط از سر توزیع استفاده کنیم و دم توزیع را حذف می‌کنیم. + +## ارزیابی تولید متن + +ارزیابی مدل زبان به سادگی نیاز به لگاریتم درست نمایی دیتای بیرون نگه داشته (یا دادهای تست) دارد. با این حال، ارزیابی متن دشوار است. معیار های کلمات متداول همپوشانی با الگوریتم‌های مرجع (همانند BLEU، ROUGE و ...) دارد، اما آنها مشکلات خاص خود را دارند. + + + + +## مدل‌های ترتیب به ترتیب + + +### مدل‌های زبان مشروط + +مدل های زبان مشروط برای تولید نمونه های تصادفی انگلیسی مفید نیستند، اما برای تولید متنی با یک ورودی، مفید هستند. + +مثال‌ها: + +- با توجه به یک جمله فرانسه، ترجمه انگلیسی را تولید کنیم. +- با توجه به یک سند، خلاصه را تولید کنیم. +- با توجه به یک دیالوگ، پاسخ بعدی را تولید کنیم. +- با توجه به یک سوال، جواب را تولید کنیم. + + +### مدل‌های ترتیب به ترتیب + +به طور کلی، متن ورودی رمزگذاری شده است. این نتیجه جاسازی شده به عنوان "بردار فکر" شناخته می شود، که سپس به رمزگشای منتقل می شود تا کلمه به کلمه ژوتن‌ها را تولید کند. + +center> +
+تصویر سوم: بردار فکر + + + +### دگرگون ساز ترتیب به ترتیب + +نوع ترتیب به ترتیب دگرگون ساز، دو نوع دارد: + +۱. نوع رمزگذار - خود-توجه‌ای پوشیده نیست بنابراین همه ژتون‌های ورودی می توانند به ژتون‌های دیگر ورودی نگاه کنند + +۲. نوع رمزگشا - جدای استفاده از استفاده «توجه» روی خودش، روی تمام ورودی‌ها هم استفاده می‌شود + +
+
+تصویر چهارم: دگرگون ساز ترتیب به ترتیب +
+ +هر ژتون در خروجی با هر ژتون قبلی در خروجی و همچنین با هر کلمه در ورودی ارتباط مستقیم دارد. اتصالات این مدل ها را بسیار رسا و قدرتمند می کند. این دگرگون‌سازها بهبودهایی در امتیاز ترجمه نسبت به مدل‌های بازگشتی و کانولوشنی ایجاد کردند. + + +## [ترجمه مجدد] (https://www.youtube.com/watch?v=6D4EWKJgNn0&t=3811s) +هنگام آموزش این مدل ها، ما معمولاً به مقدار زیادی متن برچسب خورده وابسته‌ایم. متن اقدامات پارلمان اروپا منبع خوبی از دیتا است - این متن به صورت دستی به زبان‌های مختلفی ترجمه شده است که می‌توانیم به عنوان ورودی‌ها و خروجی‌‌های مدل استفاده کنیم. + + +### مسائل + +- همه زبانها در پارلمان اروپا نمایندگی ندارند، به این معنی که الزاماً برای همه زبان هایی که ممکن است به آنها علاقه داشته باشیم جفت ترجمه نخواهیم داشت. چگونه متنی را برای آموزش به زبانی پیدا کنیم که لزوماً نتوانیم داده ها را برای آن بدست آوریم؟ + +- از آنجا که مدل هایی مانند دگرگون‌سازها با داده های بیشتر عملکرد بهتری دارند، چگونه می‌توان از متن تک زبانه به طور کارآمد استفاده کرد ، * یعنی * بدون جفت ورودی / خروجی؟ + +فرض کنید می خواهیم مدلی را ترجمه کنیم که آلمانی را به انگلیسی ترجمه کند. ایده ترجمه مجدد این است که ابتدا یک مدل معکوس انگلیسی به آلمانی آموزش دهیم + +- با استفاده از برخی داده های دو متنی محدود می توانیم جملات مشابه را به دو زبان مختلف بدست آوریم +- هنگامی که ما مدل انگلیسی به آلمانی را داریم، بسیاری از کلمات یک زبانه را از انگلیسی به آلمانی ترجمه کنید. + +در آخر، آموزش مدل آلمانی به انگلیسی با استفاده از کلماتی که در مراحل قبلی «ترجمه مجدد» شده است، انجام می‌دهیم. ما توجه داریم که: + +- مهم نیست که مدل معکوس چقدر خوب باشد - ما ممکن است ترجمه های آلمانی نویزی داشته باشیم اما در نهایت ترجمه دقیق انگلیسی داشته باشیم. +- ما باید یاد بگیریم که انگلیسی را فراتر از داده های جفت های انگلیسی / آلمانی (قبلاً ترجمه شده) درک کنیم - از مقادیر زیادی [متن] انگلیسی تک زبانه استفاده کنید + + +### ترجمه مجدد تکرار شده + +- ما می توانیم روش ترجمه مجدد را تکرار کنیم تا حتی داده های دو متنی بیشتری تولید کنیم و عملکرد بسیار بهتری داشته باشیم - فقط با استفاده از داده های تک زبانه آموزش را ادامه دهید +- وقتی داده موازی زیادی نباشد، خیلی کمک می کند + +## ترجمه ماشینی چند زبانه عظیم + +
+
+تصویر پنجم: ترجمه ماشینی چند زبانه +
+ + +## یادگیری بدون نظارت پردازش زبان‌های طبیعی + +مقادیر زیادی از متن بدون هیچ برچسب وجود دارد و داده های نظارت شده کمی وجود دارد. چقدر می توان فقط با خواندن متن بدون برچسب در مورد زبان یاد گرفت؟ + + +### `word2vec` + +شهود - اگر کلمات در متن نزدیک به هم ظاهر شوند، احتمالاً با هم مرتبط هستند، بنابراین امیدواریم که فقط با نگاه کردن به متن انگلیسی بدون برچسب، معنی آنها را یاد بگیریم. + +- هدف یادگیری فضای برداری نماینده های کلمات است (یادگیری جاسازی‌ها) + +وظیفه قبل از آموزش - مقداری کلمه را مخفی کنید و از کلمات همسایه برای پر کردن جای خالی استفاده کنید. + +
+
+تصویر هفتم: word2vec پوشاندن بصری +
+ + + + +به عنوان مثال، در اینجا ایده این است که "شاخ" و "موی نقره ای" بیش از برخی حیوانات دیگر در متن "تک شاخ" ظاهر می شوند. + +کلمات را بگیرید و یک برون‌فکنی خطی اعمال کنید +
+
+تصویر هشتم: word2vec جاسازی ها +
+ +می خواهیم بدانیم + +$$ +p(\texttt{unicorn} \mid \texttt{These silver-haired ??? were previously unknown}) +$$ + +$$ +p(x_n \mid x_{-n}) = \text{softmax}(\text{E}f(x_{-n}))) +$$ + +جاسازی کلمه‌ها دارای ساختار است. + +
+
+تصویر نهم: مثالی برای ساختار جاسازی +
+ +- ایده این است که اگر ما جاسازی را برای "پادشاه" پس از آموزش بگیریم و جاسازی را برای "زن" اضافه کنیم ، یک جاسازی بسیار نزدیک به "ملکه" بدست خواهیم آورد +- برخی اختلافات معنی دار بین بردارها را نشان می دهد + + +### سوال: آیا نماینده کلمه مستقل از زمینه است یا وابسته به زمینه است؟ + +مستقل و هیچ ایده ای درباره ارتباط آنها با کلمات دیگر ندارند + + +### سوال: نمونه ای از وضعیتی که این مدل در آن گیر می کند چه خواهد بود؟ + +تفسیر کلمات بستگی زیادی به زمینه دارد. بنابراین در نمونه کلمات مبهم - کلماتی که ممکن است چندین معنی داشته باشند - این مدل با مشکل روبرو خواهد شد زیرا بردارهای جاسازی، زمینه مورد نیاز که برای درک صحیح کلمه را درک نمی کنند. + + + +### GPT + +برای اضافه کردن زمینه به مدل، می توانیم یک مدل زبان مشروط را آموزش دهیم. سپس با توجه به این مدل زبان، که کلمه را در هر مرحله پیش بینی می کند، هر یک از خروجی های مدل را با ویژگی دیگری جایگزین کنید. + +- پیش آموزش- کلمه بعدی را پیش بینی کنید +- تنظیم دقیق - تغییر به یک کار خاص. مثال ها: + - پیش بینی کنید اسم است و یا صفت + - با توجه به برخی از متن های متشکل از بررسی سایت آمازون، امتیاز را برای بررسی پیش بینی کنید + +این روش خوب است زیرا ما می توانیم مدل را مجدداً استفاده کنیم. ما یک مدل بزرگ را از قبل آموزش می دهیم و می توانیم با کارهای دیگر هماهنگ کنیم. + +### ELMo + +GPT فقط زمینه سمت چپ را در نظر می گیرد، این بدان معناست که مدل نمی تواند به هیچ کلمه ای در آینده وابسته باشد - این کاری را که مدل می تواند انجام دهد بسیار محدود می کند. + +در اینجا رویکرد آموزش دو مدل زبان است + +- یکی در متن چپ به راست +- یکی در متن راست به چپ +- برای ارائه دادن کلمه، خروجی دو مدل را بهم میچسبانیم. اکنون می تواند به زمینه راست و چپ بستگی داشته باشد. + +این هنوز یک ترکیب «کم عمق» است و ما می خواهیم تعامل پیچیده تری بین زمینه چپ و راست داشته باشیم. + + + +### BERT + + +مدل BERT از این نظر شبیه word2vec است که ما یک وظیفه «پر کردن جای خالی» داریم. با این حال، در word2vec ما پیش بینی های خطی داشتیم، در حالی که در BERT یک دگرگون‌ساز بزرگ وجود دارد که می تواند زمینه های بیشتری را مشاهده کند. برای آموزش، ما ۱۵٪ از نشانه ها را می پوشانیم و سعی می کنیم جای خالی را پیش بینی کنیم. + +به راحتی در مقیاس بزرگ قابل استفاده است (RoBERTa) + +- هدف BERT را قبل از آموزش ساده کنید +- مقیاس اندازه دسته را افزایش دهید +- روی مقادیر زیادی GPU آموزش دهید +- حتی روی متن بیشتر آموزش دهید + +حتی پیشرفت‌های بزرگتری روی عملکرد BERT - امروزه عملکرد در وظیفه «سوال و پاسخ» فوق انسانی است. + + +## [پیش آموزش برای ‫طبيعی‬ ‫زبان‬ ‫پردازش‬](https://www.youtube.com/watch?v=6D4EWKJgNn0&t=4963s) + +بیایید نگاهی سریع به رویکردهای مختلف پیش از آموزش نظارت بر خود بیندازیم که برای ‫طبيعی‬ ‫زبان‬ ‫پردازش تحقیق شده اند. + +- XLNet: + به جای پیشبینی تمام ژتون‌های پوشیده شده به صورت مشروط مستقل، XLNet به صورت خود همبسته به ترتیب تصادفی ژتون‌های پوشیده شده را پیشبینی می‌کند. + +- SpanBERT + پوشاندن اسپن‌ها (توالی کلمات متوالی) به جای ژتون‌ها +- ELECTRA: + ما به جای پوشاندن کلمات، ژتون‌ها را با کلمات مشابه جایگزین می کنیم. سپس با تلاش برای پیش بینی اینکه آیا نشانه ها جایگزین شده اند یا نه، یک مسئله طبقه بندی باینری را حل می کنیم. +- ALBERT: + مدل سبک‌تر BERT: ما BERT را اصلاح می کنیم و با گره زدن وزنه ها روی لایه ها، آن را سبک تر می کنیم. این پارامترهای مدل و محاسبات مربوطه را کاهش می دهد. جالب اینجاست که نویسندگان ALBERT مجبور نبودند که در «دقت» زیاد مصالحه کنند. + +- XLM: + + + مدل چند زبانه BERT: ما به جای تغذیه یک متن انگلیسی، متن را چند زبان ارائه می دهیم. همانطور که انتظار می رود، ارتباطات بین زبانی را بهتر یاد گرفت. + +مهمترین نقاط کلیدی مدلهای ذکر شده در بالا عبارتند از: + +- اهداف پیش آموزش‌های زیاد و مختلف بسیار خوب کار می‌کنند! + +- ارتباط دوطرفه بین کلمات برای عمق مدل حیاتی است + +- دستاورد های بزرگی از پیش آموزش در مقیاس بزرگ به دست می‌آید، هنوز بدون هیچ محدودیت مشخصی + + +بیشتر مدل هایی که در بالا بحث شد برای حل مسئله طبقه بندی متن مهندسی شده اند. با این حال، برای حل مشکل تولید متن، جایی که ما به ترتیب و مانند مدل «seq2seq» خروجی تولید می کنیم، به روش کمی متفاوت قبل از آموزش نیاز داریم. + + + +### پیش آموزش برای نسل مشروط: BART و T5 + +مدل BART: پیش آموزش مدل های «seq2seq» توسط متن بدون نویز + +در مدل BART، برای پیش آموزش، ما یک جمله را می گیریم و آن را با پوشاندن تصادفی ژتون‌ها خراب می کنیم. به جای پیش بینی ژتون‌های پوشیده شده (مانند هدف BERT)، ما کل توالی خراب را بگیریم و سعی می کنیم کل توالی صحیح را پیش بینی کنیم. + +این رویکرد پیش آموز «seq2seq» به ما انعطاف پذیری در طراحی رویه خراب کردن متن را می دهد. ما می توانیم جملات را بُر بزنیم، عبارات را حذف کنیم، عبارات جدیدی معرفی کنیم، و غیره. + +مدل BART می توانست با RoBERTa در کارهای SQUAD و GLUE مطابقت داشته باشد. با این حال، این روش جدید SOTA در زمینه خلاصه سازی، گفتگو و مجموعه داده های انتزاعی پرسش و پاسخ بود. این نتایج انگیزه ما را برای BART تقویت می کند، که در انجام کارهای تولید متن بهتر از BERT / RoBERTa باشیم. + + + + +### بعضی از سوالات باز در پردازش زبان طبیعی + +- چگونه باید دانش جهانی را با هم ادغام کنیم +- چگونه اسناد طولانی را مدلسازی می کنیم؟ (مدل های بر پایه BERT معمولا ۵۱۲ ژتون دارند) +- چگونه یادگیری چند وظیفه ای را به بهترین وجه انجام می دهیم؟ +- آیا می توانیم با داده کمتری تنظیم دقیق کنیم؟ +- آیا این مدل ها واقعاً زبان را درک می کنند؟ + +### خلاصه + +- مدل های آموزشی بر روی تعداد زیادی از داده ها، مدل سازی صریح ساختار زبانی را به راحتی شکست می دهد. + +از دیدگاه اریبی واریانس، دگرگون‌سازها مدل هایی با اریبی کم (بسیار رسا) هستند. تغذیه متن های متناسب با این مدل ها بهتر از مدل سازی صریح ساختار زبانی (اریبی زیاد) است. معماری ها باید فشرده سازی توالی ها را از طریق گلوگاه ها انجام دهند. + +- مدل ها می توانند با پیش بینی کلمات در متن بدون برچسب، چیزهای زیادی در مورد زبان یاد بگیرند. به نظر می رسد این یک هدف یادگیری بدون نظارت عالی است. تنظیم دقیق برای کارهای خاص پس از آن آسان است + +- متن دو زبانه بسیار مهم است + + + +### بینش بیشتر از سوالات بعد از کلاس: + +چه روش‌هایی برای تعیین کمیت «درک زبان» وجود دارد؟ از کجا می دانیم که این مدل ها واقعاً زبان درک می کنند؟ + +«جایزه در چمدان قرار نگرفت زیرا بسیار بزرگ بود»: حل ارجاع به «آن» در این جمله برای ماشینها مشکل است. انسانها در این کار تبحر دارند. یک مجموعه داده وجود دارد که از چنین مثالهای دشواری تشکیل شده و انسانها عملکرد ۹۵ درصدی در آن مجموعه داده دارند. قبل از انقلابی که توسط دگرگون ساز‌ها ایجاد شده بود، برنامه های رایانه ای عملکردی فقط در حدود ۶۰٪ در این مجموه داده به دست می آوردند. مدلهای مدرن دگرگون‌سازها قادر به دستیابی به بیش از ۹۰٪ ای در آن مجموعه داده هستند. این نشان می دهد که این مدلها فقط داده‌ها را حفظ / استخراج نکرده اند بلکه مفهایم و اشیای زبانی را از طریق الگوهای آماری یادگرفته‌اند. + + +#### Grounded Language + +جالب توجه است که مدرس (مایک لوئیس ، محقق دانشمند ، FAIR) در حال کار بر روی مفهومی به نام «Grounded Language» است. هدف از این زمینه تحقیق ایجاد مکالمه کننده‌ای است که قادر به صحبت دوستانه و کوتاه (چیت چت) یا مذاکره باشد. گفتگو و مذاکره وظایفی انتزاعی با اهداف نامشخص در مقایسه با طبقه بندی متن یا خلاصه متن است. + + +#### آیا می توانیم ارزیابی کنیم که آیا این مدل همین الان دانش جهانی دارد؟ + +«دانش جهانی» مفهومی انتزاعی است. می توانیم با پرسیدن سوالات بسیار ساده در سطوح ابتدایی از موضوعاتی که به آن علاقه مندیم، سطح علم مدل‌های خود را تست کنیم. مدل هایی همانند BERT، RoBERTA و T5 میلیاردها پارامتر دارند و با توجه به اینکه این مدل ها روی مجموعه عظیمی از متن اطلاعاتی مانند ویکی پدیا آموزش دیده اند، آنها حقایق را با استفاده از پارامترهای خود به خاطر می سپارند و می توانند به سوالات ما پاسخ دهند. علاوه بر این، ما همچنین می توانیم آزمایش مشابه دانش را قبل و بعد از تنظیم دقیق یک مدل روی برخی از کارها انجام دهیم. این می تواند به ما درک کند که مدل چه مقدار اطلاعات را «فراموش» کرده است. diff --git a/docs/fa/week12/12-3.md b/docs/fa/week12/12-3.md new file mode 100644 index 000000000..0f78eda86 --- /dev/null +++ b/docs/fa/week12/12-3.md @@ -0,0 +1,862 @@ +--- +lang: fa +lang-ref: ch.12-3 +title: توجه و دگرگون‌ساز +lecturer: Alfredo Canziani +authors: Francesca Guiso, Annika Brundyn, Noah Kasmanoff, and Luke Martin +date: 21 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) +``` +جایی که این مدل به صورت معمولی آموزش دیده است.