ترانسفورماتور مصور

ساخت وبلاگ

در پست قبلی ، ما توجه را مورد توجه قرار دادیم - روشی همه جا در مدلهای یادگیری عمیق مدرن. توجه مفهومی است که به بهبود عملکرد برنامه های ترجمه دستگاه عصبی کمک می کند. در این پست ، ما به ترانسفورماتور نگاه خواهیم کرد - مدلی که از توجه برای تقویت سرعت آموزش این مدل ها استفاده می کند. ترانسفورماتور از مدل ترجمه دستگاه عصبی Google در کارهای خاص بهتر عمل می کند. با این حال ، بزرگترین فایده از چگونگی وام دادن ترانسفورماتور به موازی سازی ناشی می شود. در واقع توصیه Google Cloud است که از ترانسفورماتور به عنوان یک مدل مرجع برای استفاده از Cloud TPU خود استفاده کنید. بنابراین سعی می کنیم مدل را از هم جدا کنیم و به نحوه عملکرد آن نگاه کنیم.

ترانسفورماتور در مقاله پیشنهاد شده است که توجه همه شما نیاز دارید. اجرای TensorFlow از آن به عنوان بخشی از بسته Tensor2Tensor در دسترس است. گروه NLP هاروارد راهنمای حاشیه نویسی مقاله را با اجرای Pytorch ایجاد کرد. در این پست ، ما سعی خواهیم کرد تا کمی چیزها را کمی ساده تر کنیم و مفاهیم را یک به یک معرفی کنیم تا امیدوارم درک افراد بدون دانش عمیق از موضوع را آسان تر کند.

بروزرسانی 2020: من یک فیلم "ترانسفورماتور روایت شده" ایجاد کرده ام که یک رویکرد ملایم تر به موضوع است:

ظاهری سطح بالا

بیایید با نگاه کردن به مدل به عنوان یک جعبه سیاه ، شروع کنیم. در یک برنامه ترجمه ماشین ، یک جمله به یک زبان می گیرد و ترجمه آن را به زبان دیگری خروجی می کند.

با باز شدن آن به خوبی از Optimus Prime ، ما یک مؤلفه رمزگذاری ، یک مؤلفه رمزگشایی و اتصالات بین آنها را می بینیم.

مؤلفه رمزگذاری پشته ای از رمزگذارها است (کاغذ شش مورد از آنها را در بالای یکدیگر قرار می دهد - هیچ چیز جادویی در مورد شماره شش وجود ندارد ، قطعاً می توان با سایر ترتیبات آزمایش کرد). مؤلفه رمزگشایی پشته ای از رمزگشایی ها به همان تعداد است.

رمزگذارها همه از نظر ساختار یکسان هستند (با این حال وزن آنها را به اشتراک نمی گذارند). هرکدام به دو لایه زیر تقسیم می شوند:

ورودی های رمزگذار ابتدا از طریق یک لایه خود به خودی جریان می یابند-لایه ای که به رمزگذار کمک می کند تا به کلمات دیگر در جمله ورودی نگاه کند ، زیرا یک کلمه خاص را رمزگذاری می کند. بعداً در پست خود به خود توجه خواهیم کرد.

خروجی های لایه خود به یک شبکه عصبی به جلو تغذیه می شوند. دقیقاً همان شبکه تغذیه به طور مستقل برای هر موقعیت اعمال می شود.

رمزگشا دارای هر دو لایه است، اما بین آنها یک لایه توجه وجود دارد که به رمزگشا کمک می کند تا روی قسمت های مربوطه جمله ورودی تمرکز کند (همان چیزی که توجه در مدل های seq2seq انجام می دهد).

آوردن تنسورها به تصویر

اکنون که اجزای اصلی مدل را دیدیم، بیایید به بررسی بردارها/تانسورهای مختلف و چگونگی جریان آنها بین این مؤلفه ها برای تبدیل ورودی یک مدل آموزش دیده به خروجی بپردازیم.

همانطور که در برنامه های NLP به طور کلی وجود دارد، ما با تبدیل هر کلمه ورودی به یک بردار با استفاده از یک الگوریتم جاسازی شروع می کنیم.

هر کلمه در یک بردار با اندازه 512 جاسازی شده است. ما آن بردارها را با این کادرهای ساده نشان خواهیم داد.

جاسازی فقط در پایین ترین رمزگذار انجام می شود. انتزاعی که برای همه رمزگذارها مشترک است این است که آنها لیستی از بردارها را در اندازه 512 دریافت می کنند - در رمزگذار پایینی که کلمه embeddings است، اما در رمزگذارهای دیگر، خروجی رمزگذار است که مستقیماً در زیر است.. اندازه این لیست، هایپرپارامتری است که می توانیم تنظیم کنیم - اساساً این طول طولانی ترین جمله در مجموعه داده آموزشی ما خواهد بود.

پس از جاسازی کلمات در دنباله ورودی ما، هر یک از آنها در هر یک از دو لایه رمزگذار جریان می یابد.

در اینجا ما شروع به دیدن یک ویژگی کلیدی ترانسفورماتور می کنیم، و آن این است که کلمه در هر موقعیت از مسیر خود در رمزگذار عبور می کند. بین این مسیرها در لایه توجه به خود وابستگی هایی وجود دارد. با این حال، لایه پیش خور آن وابستگی ها را ندارد و بنابراین مسیرهای مختلف را می توان به صورت موازی در حالی که در لایه پیش خور جریان می یابد اجرا کرد.

در مرحله بعد، مثال را به یک جمله کوتاه تر تغییر می دهیم و به آنچه در هر زیر لایه رمزگذار اتفاق می افتد نگاه می کنیم.

اکنون در حال رمزگذاری هستیم!

همانطور که قبلاً اشاره کردیم، یک رمزگذار لیستی از بردارها را به عنوان ورودی دریافت می کند. این لیست را با انتقال این بردارها به یک لایه «توجه به خود»، سپس به یک شبکه عصبی پیش خور پردازش می کند، سپس خروجی را به سمت بالا به رمزگذار بعدی ارسال می کند.

کلمه در هر موقعیت از یک فرآیند توجه به خود عبور می کند. سپس، هر کدام از آنها از طریق یک شبکه عصبی پیش خور عبور می کنند - دقیقاً همان شبکه که هر بردار به طور جداگانه در آن جریان دارد.

توجه به خود در سطح بالا

گول این را نخورید که من کلمه "توجه به خود" را دور بزنم، انگار این مفهومی است که همه باید با آن آشنا باشند. من شخصاً هرگز با این مفهوم آشنا نشده بودم تا زمانی که مقاله توجه همه آن چیزی است که شما نیاز دارید را مطالعه کردم. اجازه دهید نحوه عملکرد آن را تقطیر کنیم.

بگویید جمله زیر جمله ورودی است که می خواهیم ترجمه کنیم:

"حیوان از خیابان عبور نکرد زیرا خیلی خسته بود"

"این" در این جمله به چه چیزی اشاره دارد؟آیا این به خیابان اشاره دارد یا حیوان؟این یک سوال ساده برای یک انسان است ، اما به راحتی برای یک الگوریتم.

هنگامی که مدل در حال پردازش کلمه "آن" است ، خود توجه به آن اجازه می دهد تا "آن را" با "حیوان" مرتبط کند.

از آنجا که مدل هر کلمه (هر موقعیت در دنباله ورودی) را پردازش می کند ، خود توجه به آن اجازه می دهد تا موقعیت های دیگر را در دنباله ورودی برای سرنخ هایی که می تواند به رمزگذاری بهتر این کلمه کمک کند ، نگاه کند.

اگر با RNN ها آشنا هستید ، به این فکر کنید که چگونه حفظ یک حالت پنهان به RNN اجازه می دهد تا نمایش خود را از کلمات/بردارهای قبلی که پردازش شده است با مورد فعلی که پردازش شده است ، درج کند. خودآگاهی روشی است که ترانسفورماتور برای پخت "درک" سایر کلمات مرتبط با روشی که در حال حاضر پردازش می کنیم ، استفاده می کند.

همانطور که ما کلمه "آن" را در رمزگذار شماره 5 (رمزگذار برتر در پشته) رمزگذاری می کنیم ، بخشی از مکانیسم توجه بر "حیوان" تمرکز داشت و بخشی از بازنمایی آن را در رمزگذاری "آن" پختیم.

حتماً نوت بوک Tensor2Tensor را بررسی کنید که در آن می توانید یک مدل ترانسفورماتور را بارگیری کنید و با استفاده از این تجسم تعاملی آن را بررسی کنید.

خودداری با جزئیات

بیایید ابتدا به چگونگی محاسبه خودآگاهی با استفاده از بردارها بپردازیم ، سپس به بررسی نحوه اجرای آن-با استفاده از ماتریس بپردازیم.

اولین قدم برای محاسبه توجه خود ، ایجاد سه بردار از هر یک از بردارهای ورودی رمزگذار (در این حالت ، تعبیه هر کلمه) است. بنابراین برای هر کلمه ، ما یک بردار پرس و جو ، یک بردار کلیدی و یک بردار ارزش ایجاد می کنیم. این بردارها با ضرب تعبیه توسط سه ماتریس که ما در طی فرایند آموزش آموزش داده ایم ایجاد می شوند.

توجه کنید که این بردارهای جدید از نظر ابعاد کوچکتر از بردار تعبیه هستند. ابعاد آنها 64 است ، در حالی که بردارهای ورودی/خروجی جاسازی و رمزگذار دارای ابعاد 512 هستند. آنها لازم نیست کوچکتر باشند ، این یک انتخاب معماری برای محاسبه توجه چند نفره (بیشتر) ثابت است.

ضرب X1 توسط ماتریس وزن WQ Q1 را تولید می کند ، وکتور "پرس و جو" مرتبط با آن کلمه. ما در نهایت ایجاد "پرس و جو" ، "کلید" و یک طرح "مقدار" هر کلمه در جمله ورودی.

بردارهای "پرس و جو" ، "کلید" و "ارزش" چیست؟

آنها انتزاعی هستند که برای محاسبه و فکر کردن در مورد توجه مفید هستند. پس از خواندن نحوه توجه در زیر ، تقریباً تمام آنچه را که باید در مورد نقشی که هر یک از این بردارها ایفا می کنند ، می دانید.

مرحله دوم در محاسبه توجه به خود محاسبه نمره است. بگویید ما در این مثال "تفکر" خود را برای اولین کلمه محاسبه می کنیم. ما باید هر کلمه از جمله ورودی را در برابر این کلمه کسب کنیم. نمره تعیین می کند که چقدر تمرکز روی سایر قسمتهای جمله ورودی را در هنگام رمزگذاری کلمه در یک موقعیت خاص تعیین می کنیم.

نمره با گرفتن محصول نقطه ای از بردار پرس و جو با بردار کلیدی کلمه مربوطه که به ثمر می رسیم محاسبه می شود. بنابراین اگر ما در حال پردازش خود برای کلمه در موقعیت شماره 1 هستیم ، اولین نمره محصول DOT Q1 و K1 خواهد بود. نمره دوم محصول نقطه Q1 و K2 خواهد بود.

مراحل سوم و چهارم این است که نمرات را به 8 تقسیم کنیم (ریشه مربع ابعاد بردارهای کلیدی مورد استفاده در مقاله - 64پیش فرض) ، سپس نتیجه را از طریق یک عملیات SoftMax منتقل کنید. SoftMax نمرات را عادی می کند تا همه مثبت باشند و حداکثر 1 را اضافه کنند.

این نمره SoftMax تعیین می کند که هر کلمه در این موقعیت چقدر بیان خواهد شد. واضح است که کلمه در این موقعیت بالاترین امتیاز SoftMax را خواهد داشت ، اما گاهی اوقات حضور در کلمه دیگری که مربوط به کلمه فعلی باشد ، مفید است.

مرحله پنجم ضرب هر بردار مقدار با نمره SoftMax (در آماده سازی برای جمع بندی آنها) است. شهود در اینجا این است که مقادیر کلمه (ها) را که می خواهیم روی آن تمرکز کنیم ، و کلمات بی ربط غرق شده را حفظ کنیم (با ضرب آنها توسط اعداد ریز مانند 0. 001 ، به عنوان مثال).

مرحله ششم جمع آوری بردارهای با ارزش وزن است. این تولید لایه خود را در این موقعیت (برای اولین کلمه) تولید می کند.

که محاسبه خودآگاهی را نتیجه می گیرد. وکتور حاصل یکی از مواردی است که می توانیم به شبکه عصبی خوراک پیشرو ارسال کنیم. با این حال ، در اجرای واقعی ، این محاسبه به صورت ماتریس برای پردازش سریعتر انجام می شود. بنابراین اکنون به این موضوع نگاه می کنیم که شهود محاسبه را در سطح کلمه مشاهده کرده ایم.

محاسبه ماتریس توجه خود

مرحله اول محاسبه ماتریس پرس و جو ، کلید و ارزش است. ما این کار را با بسته بندی تعبیه های خود در یک ماتریس X انجام می دهیم و آن را با ماتریس های وزنی که آموزش دیده ایم (WQ ، WK ، WV) ضرب می کنیم.

هر ردیف در ماتریس X با یک کلمه در جمله ورودی مطابقت دارد. ما دوباره تفاوت اندازه بردار تعبیه شده (512 یا 4 جعبه در شکل) و بردارهای Q/K/V (64 یا 3 جعبه در شکل) را می بینیم.

سرانجام ، از آنجا که ما با ماتریس ها سر و کار داریم ، می توانیم مراحل دو تا شش در یک فرمول را برای محاسبه خروجی های لایه خود مورد توجه قرار دهیم.

محاسبه خودآگاهی به شکل ماتریس

جانور با سر بسیاری

این مقاله با افزودن مکانیسمی به نام "چند سر" ، لایه خود را به خودی خود تصحیح کرد. این عملکرد لایه توجه را از دو طریق بهبود می بخشد:

این توانایی مدل را برای تمرکز روی موقعیت های مختلف گسترش می دهد. بله ، در مثال بالا ، Z1 حاوی کمی از هر رمزگذاری دیگر است ، اما می تواند توسط خود کلمه واقعی حاکم باشد. اگر ما در حال ترجمه جمله ای مانند "حیوان از خیابان عبور نکرد زیرا خیلی خسته بود" ، مفید خواهد بود که بدانیم کلمه "آن" به آن اشاره دارد.

این لایه توجه را به چند "زیر فضای بازنمایی" می دهد. همانطور که در مرحله بعدی خواهیم دید ، با توجه چند سر ما نه تنها یک ، بلکه چندین مجموعه از ماتریس های Query/Key/Value Weight (ترانسفورماتور از هشت سر توجه استفاده می کند ، بنابراین ما برای هر رمزگذار/رمزگذار با هشت مجموعه به پایان می رسیم)وادهر یک از این مجموعه ها به طور تصادفی آغاز می شوند. سپس ، پس از آموزش ، از هر مجموعه برای پروژه تعبیه های ورودی (یا بردارهای رمزگذار/رمزگشایی پایین) به یک فضای بازنمایی متفاوت استفاده می شود.

با توجه چند سر ، ماتریس های وزن Q/K/V جداگانه را برای هر سر حفظ می کنیم که منجر به ماتریس های مختلف Q/K/V می شود. همانطور که قبلاً انجام دادیم ، ما X را با ماتریس های WQ/WK/WV ضرب می کنیم تا ماتریس Q/K/V تولید کنیم.

اگر ما همان محاسبه خود را انجام دهیم که در بالا بیان کردیم ، فقط هشت بار مختلف با ماتریس با وزن مختلف ، ما با هشت ماتریس z مختلف به پایان می رسیم

این ما را با یک چالش کمی رها می کند. لایه خوراک به جلو انتظار هشت ماتریس را ندارد-انتظار دارد یک ماتریس واحد (یک بردار برای هر کلمه). بنابراین ما به راهی برای متراکم کردن این هشت به یک ماتریس واحد نیاز داریم.

چگونه ما آن را انجام دهیم؟ما ماتریس ها را جمع می کنیم و سپس آنها را با یک ماتریس وزنه های اضافی ضرب می کنیم.

این تقریباً همه چیز برای خودآگاهی چند سر وجود دارد. من متوجه می شوم که این تعداد انگشت شماری از ماتریس است. بگذارید سعی کنم همه آنها را به صورت تصویری قرار دهم تا بتوانیم در یک مکان به آنها نگاه کنیم

اکنون که ما به توجه به توجه به توجه خود ، اجازه دهید نمونه خود را از قبل دوباره بررسی کنیم تا ببینیم که در هنگام رمزگذاری کلمه "آن" در جمله مثال ما ، سرهای مختلف توجه را متمرکز می کنیم:

همانطور که ما کلمه "آن" را رمزگذاری می کنیم ، یک سر توجه بیشتر روی "حیوان" تمرکز دارد ، در حالی که دیگری روی "خسته" تمرکز می کند - به یک معنا ، بازنمایی مدل از کلمه "it" در برخی از بازنمودها پخته می شوداز هر دو "حیوان" و "خسته".

اگر همه توجه را به تصویر اضافه کنیم ، با این حال ، تفسیر همه چیز می تواند سخت تر باشد:

نمایندگی ترتیب دنباله با استفاده از رمزگذاری موقعیتی

نکته ای که تاکنون از مدل گم شده است ، همانطور که تاکنون توضیح داده ایم ، راهی برای حساب کردن ترتیب کلمات در دنباله ورودی است.

برای پرداختن به این موضوع ، ترانسفورماتور یک بردار را به هر تعبیه شده ورودی اضافه می کند. این بردارها از الگوی خاصی که مدل می آموزد ، پیروی می کنند ، که به تعیین موقعیت هر کلمه یا فاصله بین کلمات مختلف در دنباله کمک می کند. شهود در اینجا این است که اضافه کردن این مقادیر به تعبیه ها ، فاصله های معنی داری بین بردارهای تعبیه شده پس از پیش بینی در بردارهای Q/K/V و در هنگام توجه محصول ، فراهم می کند.

برای اینکه به مدل حس ترتیب کلمات را بدهیم ، بردارهای رمزگذاری موقعیتی را اضافه می کنیم - مقادیر آنها از یک الگوی خاص پیروی می کنند.

اگر فرض کنیم که جاسازی دارای ابعاد 4 است ، رمزگذاری های موقعیتی واقعی به این شکل به نظر می رسند:

یک نمونه واقعی از رمزگذاری موقعیتی با یک اسباب بازی تعبیه شده از 4

این الگوی چگونه ممکن است به نظر برسد؟

در شکل زیر ، هر سطر با رمزگذاری موقعیتی یک بردار مطابقت دارد. بنابراین ردیف اول وکتوری است که ما به تعبیه اولین کلمه در یک دنباله ورودی اضافه می کنیم. هر ردیف حاوی 512 مقدار اس ت-هر کدام دارای مقدار بین 1 ت ا-1 هستند. ما آنها را کدگذاری کرده ایم تا الگوی قابل مشاهده باشد.

یک نمونه واقعی از رمزگذاری موقعیت برای 20 کلمه (ردیف) با اندازه تعبیه 512 (ستون). می بینید که به نظر می رسد در نیمی از مرکز تقسیم می شود. دلیل این امر این است که مقادیر نیمه سمت چپ توسط یک عملکرد (که از SINE استفاده می کند) تولید می شود ، و نیمه سمت راست توسط یک عملکرد دیگر (که از Cosine استفاده می کند) تولید می شود. سپس آنها برای تشکیل هر یک از بردارهای رمزگذاری موقعیتی به هم پیوسته اند.

فرمول رمزگذاری موقعیت در مقاله (بخش 3. 5) شرح داده شده است. می توانید کد تولید رمزگذاری های موقعیتی را در get_timing_signal_1d () مشاهده کنید. این تنها روش ممکن برای رمزگذاری موقعیتی نیست. با این حال ، این مزیت را به این مزیت می دهد که بتوانیم به طول های غیب توالی ها مقیاس بندی کنیم (به عنوان مثال اگر از مدل آموزش دیده ما خواسته شود یک جمله را طولانی تر از هر یک از موارد موجود در مجموعه آموزش ما ترجمه کند).

به روزرسانی ژوئیه 2020: رمزگذاری موقعیتی که در بالا نشان داده شده است از اجرای tranformer2transformer ترانسفورماتور است. روش نشان داده شده در مقاله از این نظر متفاوت است که مستقیماً هماهنگ نمی شود ، اما دو سیگنال را در هم می آمیزد. شکل زیر نشان می دهد که چه چیزی به نظر می رسد. در اینجا کد برای تولید آن وجود دارد:

باقیمانده ها

یکی از جزئیات در معماری رمزگذار که باید قبل از حرکت به آن اشاره کنیم ، این است که هر یک از زیر لایه ها (خود توجه ، FFNN) در هر رمزگذار یک ارتباط باقیمانده در اطراف آن دارد و با یک مرحله عادی سازی لایه ای دنبال می شود.

اگر بخواهیم بردارها و عملکرد لایه ای را که با توجه به خود توجه می کند تجسم کنیم ، به این شکل به نظر می رسد:

این برای زیر لایه های رمزگذار نیز پیش می رود. اگر بخواهیم به یک ترانسفورماتور 2 رمزگذار و رمزگذار انباشته فکر کنیم ، چیزی شبیه به این است:

طرف رمزگشایی

اکنون که بیشتر مفاهیم را از طرف رمزگذار پوشش داده ایم ، اساساً می دانیم که اجزای رمزگشایی نیز چگونه کار می کنند. اما بیایید نگاهی بیندازیم که چگونه آنها با هم کار می کنند.

رمزگذار با پردازش دنباله ورودی شروع می شود. خروجی رمزگذار بالا به مجموعه ای از بردارهای توجه K و V تبدیل می شود. اینها توسط هر رمزگذار در لایه "رمزگذار رمزگذار" خود مورد استفاده قرار می گیرند که به رمزگشایی کمک می کند تا روی مکانهای مناسب در دنباله ورودی تمرکز کند.

پس از اتمام مرحله رمزگذاری ، مرحله رمزگشایی را شروع می کنیم. هر مرحله در مرحله رمزگشایی یک عنصر از دنباله خروجی (جمله ترجمه انگلیسی در این مورد) را خروجی می کند.

مراحل زیر فرآیند را تکرار می کند تا زمانی که به نمادی خاص برسد که نشان می دهد رمزگذار ترانسفورماتور خروجی خود را تکمیل کرده است. خروجی هر مرحله در مرحله بعدی به رمزگشایی پایین تغذیه می شود و رمزگشایی ها نتایج رمزگشایی آنها را دقیقاً مانند رمزگذارها حباب می کنند. و درست مانند آنچه با ورودی های رمزگذار انجام دادیم ، رمزگذاری موقعیتی را به آن ورودی های رمزگشایی تعبیه و اضافه کردیم تا موقعیت هر کلمه را نشان دهیم.

لایه های خود توجه در رمزگذار به روشی کمی متفاوت از نمونه موجود در رمزگذار عمل می کنند:

در رمزگذار ، لایه خودآگاهی فقط مجاز به حضور در موقعیت های قبلی در دنباله خروجی است. این کار با نقاب زدن به موقعیت های آینده (تنظیم آنها د ر-inf) قبل از مرحله SoftMax در محاسبه خود ، انجام می شود.

لایه "Encoder Decoder" دقیقاً مانند خودداری چند نفری کار می کند ، به جز اینکه ماتریس نمایش داده های خود را از لایه زیر آن ایجاد می کند و کلیدها و ماتریس مقادیر را از خروجی پشته رمزگذار می گیرد.

لایه نهایی خطی و SoftMax

پشته رمزگشایی یک بردار شناورها را خروجی می کند. چگونه می توانیم آن را به یک کلمه تبدیل کنیم؟این کار لایه خطی نهایی است که توسط یک لایه softmax دنبال می شود.

لایه خطی یک شبکه عصبی کاملاً متصل است که بردار تولید شده توسط پشته رمزگشایی ها را به یک بردار بسیار بزرگ و بزرگتر به نام وکتور Logits می پردازد.

بیایید فرض کنیم که مدل ما 10،000 کلمه انگلیسی منحصر به فرد ("واژگان خروجی" مدل ما) را می شناسد که از مجموعه داده های آموزشی آن آموخته است. این امر باعث می شود 10،000 سلول وکتور Logits - هر سلول مطابق با نمره یک کلمه منحصر به فرد باشد. اینگونه است که ما خروجی مدل را به دنبال آن لایه خطی تفسیر می کنیم.

سپس لایه SoftMax آن نمرات را به احتمالات تبدیل می کند (همه مثبت ، همه به 1. 0 اضافه می شوند). سلول با بالاترین احتمال انتخاب شده است و کلمه مرتبط با آن به عنوان خروجی برای این مرحله زمانی تولید می شود.

این رقم از پایین با بردار تولید شده به عنوان خروجی پشته رمزگشایی شروع می شود. سپس به یک کلمه خروجی تبدیل می شود.

بازپرداخت آموزش

اکنون که ما کل فرآیند گذر را از طریق یک ترانسفورماتور آموزش دیده پوشش داده ایم ، نگاه کردن به شهود آموزش مدل مفید خواهد بود.

در حین آموزش ، یک مدل آموزش دیده دقیقاً همان پاس رو به جلو را طی می کند. اما از آنجا که ما آن را در یک مجموعه داده آموزشی برچسب زده ایم ، می توانیم خروجی آن را با خروجی صحیح واقعی مقایسه کنیم.

برای تجسم این امر ، فرض کنیم واژگان خروجی ما فقط شامل شش کلمه ("A" ، "AM" ، "من" ، "متشکرم" ، "دانش آموز" و "" (کوتاه برای "پایان جمله") است.

واژگان خروجی مدل ما قبل از شروع آموزش در مرحله پیش پردازش ایجاد می شود.

هنگامی که واژگان خروجی خود را تعریف کردیم ، می توانیم از یک بردار با همان عرض استفاده کنیم تا هر کلمه را در واژگان خود نشان دهیم. این همچنین به عنوان رمزگذاری یک داغ شناخته می شود. به عنوان مثال ، ما می توانیم کلمه "AM" را با استفاده از بردار زیر نشان دهیم:

مثال: رمزگذاری یک داغ واژگان خروجی ما

پس از این مقاله ، بیایید در مورد عملکرد از دست دادن مدل بحث کنیم - متریک ما در مرحله آموزش بهینه می کنیم تا به یک مدل آموزش دیده و امیدوارم که به طرز حیرت انگیزی دقیق باشد.

عملکرد از دست دادن

بگویید ما در حال آموزش مدل خود هستیم. بگویید این اولین قدم ما در مرحله آموزش است ، و ما آن را با یک مثال ساده آموزش می دهیم - ترجمه "Merci" به "تشکر".

این بدان معنی است که ما می خواهیم خروجی یک توزیع احتمال باشد که نشان دهنده کلمه "تشکر" است. اما از آنجا که این مدل هنوز آموزش دیده نیست ، بعید است که هنوز اتفاق بیفتد.

از آنجا که پارامترهای مدل (وزن) همه به طور تصادفی اولیه هستند ، مدل (آموزش نشده) توزیع احتمال با مقادیر دلخواه را برای هر سلول/کلمه تولید می کند. ما می توانیم آن را با خروجی واقعی مقایسه کنیم ، سپس تمام وزن های مدل را با استفاده از backpropagation تغییر دهیم تا خروجی به خروجی مورد نظر نزدیک شود.

چگونه دو توزیع احتمال را مقایسه می کنید؟ما به سادگی یکی را از دیگری تفریق می کنیم. برای اطلاعات بیشتر ، به واگرایی متقاطع و واگرایی Kullback-Leibler نگاه کنید.

اما توجه داشته باشید که این یک نمونه فوق العاده است. واقع بینانه تر ، ما از یک جمله طولانی تر از یک کلمه استفاده خواهیم کرد. به عنوان مثال - ورودی: "Je suis étudiant" و خروجی مورد انتظار: "من دانش آموز هستم". این واقعاً به معنای این است که ما می خواهیم مدل ما به طور پی در پی توزیع های احتمال را در کجا قرار دهد:

  • هر توزیع احتمال توسط یک بردار از عرض Vocab_Size (6 در مثال اسباب بازی ما ، اما واقع بینانه تر به تعداد 30،000 یا 50،000) نشان داده شده است.
  • اولین توزیع احتمال بیشترین احتمال را در سلول مرتبط با کلمه "من" دارد
  • توزیع احتمال دوم بیشترین احتمال را در سلول مرتبط با کلمه "AM" دارد
  • و به همین ترتیب ، تا زمانی که توزیع خروجی پنجم نماد "" را نشان دهد ، که دارای یک سلول در ارتباط با آن از 10،000 واژگان عنصر است.

توزیع احتمال هدفمند ما الگوی خود را در برابر مثال برای یک جمله نمونه در برابر مثال آموزش خواهیم داد.

پس از آموزش مدل برای زمان کافی در یک مجموعه داده بزرگ ، امیدواریم که توزیع احتمال تولید شده به این شکل باشد:

امیدوارم پس از آموزش ، این مدل ترجمه مناسبی را که انتظار داریم تولید کند. البته اگر این عبارت بخشی از مجموعه داده های آموزش باشد ، هیچ نشانه ای واقعی نیست (به: اعتبار سنجی متقاطع مراجعه کنید). توجه کنید که هر موقعیتی حتی اگر بعید باشد خروجی آن مرحله از زمان باشد ، کمی احتمال دارد - این یک ویژگی بسیار مفید از SoftMax است که به روند آموزش کمک می کند.

اکنون ، از آنجا که این مدل خروجی ها را یک بار تولید می کند ، می توان فرض کرد که مدل در حال انتخاب کلمه با بالاترین احتمال از توزیع احتمال و دور انداختن بقیه است. این یک راه برای انجام آن است (به نام رمزگشایی حریص). راه دیگر برای انجام این کار این است که به عنوان مثال ، دو کلمه برتر (مثلاً "من" و "A" را نگه دارید) ، سپس در مرحله بعدی ، مدل را دو بار اجرا کنید: یک بار فرض کنید اولین موقعیت خروجی بودکلمه "من" و بار دیگر با فرض اولین موقعیت خروجی کلمه "A" بود ، و هر نسخه با توجه به هر دو موقعیت شماره 1 و شماره 2 خطای کمتری ایجاد می کند. ما این را برای موقعیت های شماره 2 و #3 و غیره تکرار می کنیم. این روش "جستجوی پرتو" نامیده می شود ، جایی که در مثال ما ، beam_size دو بود (به این معنی که همیشه دو فرضیه جزئی (ترجمه های ناتمام) در حافظه نگهداری می شوند) و Top_beams نیز دو است (به این معنی که ما دو ترجمه را برمی گردانیم). اینها هر دو هیپرپارامتری هستند که می توانید با آنها آزمایش کنید.

برو بیرون و دگرگون

امیدوارم که شما این مکان مفید را برای شروع شکستن یخ با مفاهیم اصلی ترانسفورماتور پیدا کرده باشید. اگر می خواهید عمیق تر بروید ، من این مراحل بعدی را پیشنهاد می کنم:

  • توجه را بخوانید همه چیزهایی است که شما به مقاله نیاز دارید ، پست وبلاگ Transformer (ترانسفورماتور: یک معماری جدید شبکه عصبی برای درک زبان) و اعلامیه Tensor2Tensor.
  • صحبت های łukasz Kaiser را که از طریق مدل و جزئیات آن قدم می زند تماشا کنید
  • با نوت بوک Jupyter که به عنوان بخشی از repo tensor2tensor ارائه شده است بازی کنید
  • repo tensor2tensor را کاوش کنید.

سپاسگزاریها

با تشکر از Illia Polosukhin ، Jakob Uszkoreit ، Llion Jones ، Lukasz Kaiser ، Niki Parmar و Noam Shazeer بخاطر ارائه بازخورد در مورد نسخه های قبلی این پست.

لطفاً برای هرگونه اصلاح یا بازخورد در توییتر به من ضربه بزنید.

این کار تحت مجوز بین المللی Creative Commons Attribution-Noncommercial-Sharealike 4. 0 مجوز است. مثال انتساب: Alammar ، J (2018). ترانسفورماتور مصور [پست وبلاگ]. برگرفته از https://jalammar. github. io/illustrated-transformer/

توجه: اگر هر یک از پست ها را ترجمه می کنید ، به من اطلاع دهید تا بتوانم ترجمه شما را به پست اصلی پیوند دهم. ایمیل من در صفحه About است.

آموزش فارکس برای مبتدی ها...
ما را در سایت آموزش فارکس برای مبتدی ها دنبال می کنید

برچسب : نویسنده : Mihayloo بازدید : <-PostHit-> تاريخ : چهارشنبه 10 اسفند 1401 ساعت: 19:46