۱. مقدمه
این وبلاگ به جزئیات دقیق معماری ترانسفورمر میپردازد. هر بخش از این مجموعه شامل بینش نظری و همچنین بینشی از نقطه نظر کدگذاری در هر واحد/مفهومی است که معماری ترانسفورماتور را در بر میگیرد، همانطور که در زیر نشان داده شده است. هر بخش مربوطه به جزئیات موارد زیر خواهد رفت:
· نشانهگذاری جمله و تعبیه ورودی
· رمزگذاری موقعیتی
· نرمالسازی لایهها
· Self-Attention
· Multi-Head Attention
· و غیره
با این حال، قبل از غوطهوری در مواد تشکیل دهنده فوق، من احساس کردم که مستند کردن موارد زیر ضروری است:
o اولا - اصول اساسی یادگیری عمیق
o ثانیا - تکامل مدلهای زبان
با بررسی مجدد 2 مبحث فوق با جزئیات (مقداری) مطالب مربوط به ترانسفورماتور بهتر درک میشود. از این رو، من احساس کردم که قطعاً مفید است که قبل از فرو رفتن در کار ترانسفورمرز، زمان و تلاش خود را برای موضوعات فوق صرف کنم. این مقاله به جزئیات اصول اساسی یادگیری عمیق میپردازد و جنبههای زیر را پوشش میدهد:
· بخش 2 تعاریف هوش مصنوعی، یادگیری ماشینی و یادگیری عمیق را بازبینی میکند.
· بخش 3 اثربخشی/اهمیت یادگیری عمیق را تشریح میکند
· بخش 4 مفهوم پرسپترون را که به تصویر شبکه عصبی منتهی میشود بازبینی میکند.
· بخش 5 در مورد مفهوم پرسپترون، شبکههای عصبی صحبت میکند
· بخش 6 به آموزش شبکه عصبی، تابع هزینه/تابع هدف/ضرر تجربی و بهینهسازی ضرر میپردازد.
· بخش 7 پسانتشار را نشان میدهد که تکنیکی برای محاسبه گرادیان با استفاده از قانون زنجیرهای تفاضلی است.
· منظمسازی در بخش 8 مورد بحث قرار گرفته است.
نیازی به ذکر نیست، تمام محتوای مورد بحث در زیر مجموعهای از یادداشتهای من از دورههای مختلفی است که تاکنون گذراندهام، ویدیوهای YouTube که تماشا کردهام و پستهای وبلاگ دیگران که بهعنوان منبع باز موجود است. این برای مرجع آینده مستند شده است، با این حال، اگر خواندن این محتوا برای کسی مفید باشد، واضح است که خوشحال خوشحال خواهم بود.
2. هوش مصنوعی، یادگیری ماشینی و یادگیری عمیق
هوش مصنوعی:
صحبت از هوش، یعنی پردازش اطلاعات به گونهای که بتوانیم از آن برای استنباط برخی تصمیمات و اقدامات آینده استفاده کنیم. حوزه هوش مصنوعی شامل ساخت الگوریتمهای رایانهای است که دقیقاً همان کار را انجام میدهند: پردازش اطلاعات برای استنتاج برخی تصمیمات آینده.
یادگیری ماشینی:
یادگیری ماشینی زیرمجموعهای از هوش مصنوعی است که بهویژه بر یادگیری ماشینها بر اساس برخی تجربیات انسانی/واقعی تمرکز دارد. تکنیکهای آماری برای توانمند ساختن ماشینها برای بهبود با تجربه استفاده میشود.
یادگیری عمیق:
یادگیری عمیق زیرمجموعهای از یادگیری ماشینی است که از شبکههای عصبی چندلایه برای استخراج الگوهای موجود در دادهها استفاده میکند تا شبکه یاد بگیرد وظایفی را که در غیر این صورت به هوش انسانی نیاز دارد، انجام دهد.
این مقاله به جنبههای اساسی یادگیری عمیق میپردازد که بر روی یادگیری مستقیم وظایف مختلف رایانه از دادههای خام تمرکز دارد.
شکل: تصویری از هوش مصنوعی، یادگیری ماشینی و یادگیری عمیق
3. یادگیری عمیق چه چیزی برای ارائه دارد؟
الگوریتمهای یادگیری ماشین سنتی معمولاً ویژگیها (الگوها) را در دادهها تعریف میکنند و معمولاً یک انسان با دانش تخصصی این ویژگیها را کشف میکند – ایده کلیدی یادگیری عمیق این است که به جای اینکه انسان این ویژگیها را تعریف کند، ماشین الگوهایی را در دادهها استخراج میکند. که میتواند از آنها برای تصمیمگیری استفاده کند.
به عنوان مثال، برای یک الگوریتم تشخیص چهره، یک شبکه عصبی عمیق یاد میگیرد که برای تشخیص چهره، ابتدا خط، لبههایی را شناسایی میکند که میتوان آنها را با هم ترکیب کرد تا ویژگیهای سطح متوسط مانند گوشهها و منحنیها را به دست آورد که به نوبه خود میتوان آنها را با هم ترکیب کرد. در لایههای عمیقتر شبکه عصبی، ویژگیهای سطح بالایی مانند چشم، گوش، گره و غیره را تشکیل میدهند و سپس همه اینها با هم قادر به تشخیص چهره خواهند بود.
همانطور که در شکل زیر نشان داده شده است، تمام یادگیریها به صورت سلسله مراتبی از لایههای پایین شبکه شروع میشود.
شکل: یادگیری سلسله مراتبی ویژگیها در شبکههای عصبی عمیق
4. بلوک ساختمانی یادگیری عمیق: پرسپترون
اجازه دهید اکنون با بلوک ساختمانی اساسی هر شبکه عصبی که ممکن است ایجاد شود - که یک نورون واحد است، شروع کنیم. در زبان یادگیری عمیق، یک نورون منفرد پرسپترون نامیده میشود. پرسپترون یک نورون منفرد است و حالت داخلی آن با مجموعهای از ورودیهای x1 تا xn نشان داده میشود که در وزنهای مربوطه ضرب میشوند و با هم جمع میشوند - همچنین یک عبارت بایاس که به عنوان w0 نشان داده شده است، همانطور که در شکل زیر نشان داده شده است اضافه میکنیم.
حالت داخلی یک نورون منفرد (پرسپترون)
سپس، عدد واحد را پس از جمع میگیریم و آن را از یک تابع فعالسازی غیر خطی عبور میدهیم و خروجی نهایی پرسپترون را تولید میکنیم که ممکن است مطابق شکل زیر y_bar نامیده شود.
خروجی نهایی پرسپترون
این فرآیند به صورت ریاضی با معادله زیر نشان داده می شود:
نمایش ریاضی فرآیند فوق
هدف از عملکرد فعالسازی:
هدف تابع فعالسازی غیرخطی، معرفی غیرخطیها به دادهها است/ تقریباً تمام دادههای دنیای واقعی ماهیت خطی دارند، بنابراین، اگر بخواهیم با آن مجموعههای داده سروکار داشته باشیم، به مدلهایی نیاز داریم که غیرخطی نیز باشند تا مدلها میتوانند انواع الگوها را در دادهها ثبت کنند. برای درک بهتر این موضوع، اجازه دهید بگوییم که یک مجموعه داده داریم که در شکل زیر نشان داده شده است:
مجموعه داده غیر خطی
فرض کنید با توجه به این مجموعه داده، باید یک مرز تصمیم بسازیم، یعنی مرزی که نقاط قرمز و سبز را در شکل بالا جدا میکند. حال، اگر از یک خط مستقیم برای جدا کردن نقاط سبز و قرمز استفاده کنیم، بهترین کاری که میتوانیم انجام دهیم این است که مانند شکل زیر از هم جدا کنیم:
خط مستقیم (رویکرد خطی) برای ساختن مرز تصمیم.
بنابراین، مسئله را نمیتوان به طور موثر با استفاده از یک رویکرد خطی حل کرد و ما باید به غیرخطی بودن متوسل شویم که به مقابله با چنین مسائلی کمک میکند. توابع فعالسازی غیرخطی به ما امکان میدهند با دادههای غیرخطی مقابله کنیم که شبکههای عصبی را بسیار قدرتمند میکند.
مرز تصمیمگیری پس از استفاده از توابع فعالسازی خطی
علاوه بر این، ممکن است تاکید شود که از آنجایی که ما فقط ورودیها را با وزنهای مربوطه ضرب میکنیم و آنها را با هم جمع میکنیم، تا زمانی که با استفاده از توابع فعالسازی غیرخطی، غیرخطیها را معرفی نکنیم، مسئله به صورت یک مسئله خطی باقی میماند.
انواع توابع فعالسازی غیر خطی:
برخی از انواع توابع فعال سازی عبارتند از
· تابع فعالسازی سیگموئید
· تابع فعالسازی Tan hyperbolic/ Hyperbolic Tangent
· تابع فعالسازی ReLu
این موارد در شکل زیر نشان داده شده است:
توابع فعالسازی
5. پرسپترون به شبکه عصبی
در ادامه بحث بالا: حالا، بیایید پرسپترون (تک) را بگیریم و چیزی قابل توجهتر بسازیم!
حال فرض کنید 2 خروجی از تابع میخواهیم. ما به سادگی یک پرسپترون دیگر اضافه میکنیم - این پرسپترون اضافه شده / دوم مجموعه وزنهای خاص خود را خواهد داشت. هر پرسپترون خروجی قطعه مرتبط خود را کنترل میکند.
شبکه عصبی تک لایه با 2 پرسپترون
علاوه بر این، چنین پرسپترونهایی را میتوان برای تشکیل یک شبکه عصبی تک لایه مانند زیر روی هم قرار داد:
شبکه عصبی تک لایه
یک شبکه عصبی عمیق را میتوان با انباشتن لایههای متوالی بیشتر همانطور که در شکلهای زیر نشان داده شده است، ساخت:
شبکه عصبی عمیق با 3 لایه پنهان
با این تصویر، میتوانیم تصور/تفسیر[1] کنیم که ورودیهای دادهشده (در ابتدا) به یک فضای بعدی جدید با مقادیر نزدیکتر به آنچه میخواهیم (یعنی نزدیکتر به خروجی مورد نظر ما) تبدیل میشوند و این تبدیل باید آموخته شود. و این در بخش بعدی که مربوط به تابع ضرر (یا تابع هدف[2]) است، توضیح داده شده است.
6. آموزش شبکه عصبی
تابع ضرر:
پس از ساختن شبکه عصبی (تک/چند لایه) و اگر تازه شروع به استفاده از شبکه - با مقادیر تصادفی وزن - برای پیشبینی خروجی کنیم، شبکه به درستی پیشبینی نمیکند زیرا هنوز آموزش ندیده است. این شبکه اطلاعات در مورد مسئله را ندارد!
برای آموزش شبکه، باید تابع ضرر را بسازیم که به ما میگوید خروجی پیشبینی شده چقدر از خروجی واقعی فاصله دارد. از دست دادن شبکه هزینههای ناشی از پیشبینی نادرست را اندازهگیری میکند. تابع ضرر به عنوان تابع هدف یا تابع هزینه یا ضرر تجربی[3] نیز نامیده میشود و معیاری از ضرر کل در کل مجموعه داده است. از نظر ریاضی، تابع ضرر به صورت زیر بیان میشود:
تابع هدف / ضرر
همانطور که ممکن است از معادله بالا متوجه شود، تابع ضرر تابعی از ورودیها و وزنها است - یعنی خروجی پیشبینی شده و خروجی واقعی.
به حداقل رساندن ضرر:
آموزش شبکه عصبی نه تنها مستلزم تعیین فاصله خروجی پیشبینیشده از خروجی واقعی است، بلکه کاهش تلفات را نیز شامل میشود. بنابراین، از نظر ریاضی میخواهیم وزنهای شبکه را پیدا کنیم که منجر به کمترین ضرر ممکن در کل مجموعه داده شود. معادله ریاضی به صورت زیر نمایش داده می شود:
تصویر ریاضی به حداقل رساندن ضرر
ضرر آنتروپی متقاطع
برای یک مسئله دستهبندی دودویی، تابع ضرر به کار رفته ضرر آنتروپی متقاطع است که به صورت زیر نشان داده میشود:
تصویر ریاضی ضرر آنتروپی متقاطع
میانگین ضرر مربعات خطا:
ضرر میانگین مربعات خطا میتواند برای مدلهای رگرسیونی استفاده شود که میتوانند اعداد حقیقی پیوسته را که به صورت زیر نشان داده شدهاند، تولید کنند:
تصویر ریاضی میانگین ضرر مربعات خطا
بهینهسازی ضرر: چگونه ضرر را به حداقل برسانیم؟
تابع ضرر تابع وزنها خواهد بود - برای یک مسئله دو بعدی، این تابع ضرر را میتوان به صورت زیر تجسم کرد:
تغییر تابع ضرر برای مقادیر مختلف وزن
در منظر فوق میخواهیم کمترین ضرر را پیدا کنیم که با کمترین نقطه مطابقت دارد.
این کار به صورت ریاضی از طریق مراحل زیر انجام میشود:
۱. ابتدا از یک فضای تصادفی شروع میکنیم و ضرر را در مکان خاص محاسبه میکنیم.
۲. سپس محاسبه میکنیم که ضرر چگونه تغییر میکند - به عنوان مثال، گرادیان ضرر را محاسبه میکنیم. فرآیند محاسبه گرادیان به عنوان "پسانتشار[4]" شناخته میشود.
۳. گرادیان به ما میگوید که چگونه ضرر به عنوان تابعی از وزنها تغییر میکند.
۴. وزنها را در جهت مخالف شیب به روز میکنیم.
۵. روند بالا را ادامه میدهیم تا به پایینترین نقطه برسیم.
الگوریتم فوق به طور رسمی به عنوان نزول گرادیان نامیده میشود. به طور رسمی، مراحل در الگوریتم Gradient Descent ممکن است به صورت زیر برجسته شوند:
· وزن های شبکه را به صورت تصادفی مقداردهی کنید.
· حلقه بزنید تا موارد زیر همگرا شوند:
1) گرادیان را محاسبه کنید
2) وزن ها را در جهت مخالف شیب به روز کنید
نمایش ریاضی شیب و به روز رسانی وزن
وزنها در جهت مخالف شیب به روز میشوند. پارامتر η گام کوچکی است که در جهت مخالف شیب برمیداریم و معمولاً به آن «نرخ یادگیری[5]» میگویند.
3) وزنهها را برگردانید.
7. پس انتشار:
فرآیند محاسبه گرادیان به عنوان پس انتشار نامیده میشود. از نظر ریاضی، برای یک شبکه عصبی تک لایه با دو نورون همانطور که در زیر نشان داده شده است، گرادیان با استفاده از قانون زنجیره تفاضلی - به عقب از تابع ضرر در سراسر خروجی - به شرح زیر محاسبه میشود:
بازنمایی حرکت به سمت عقب از تابع ضرر به محاسبه گرادیان با استفاده از قانون زنجیره تفاضلی (پسانتشار)
ریاضیات محاسبات گرادیان
الگوریتم پس انتشار ده ها سال قدمت دارد و مقاله (1986) را می توانید در اینجا پیدا کنید:
https://www.iro.umontreal.ca/~vincentp/ift3395/lectures/backprop_old.pdf
باید تاکید کرد که چشمانداز تابع هزینه درگیر در یک شبکه عصبی عمیق بسیار پیچیده از آنچه در بالا نشان داده شده است!
تابع ضرر در یک شبکه عصبی عمیق
تنظیم میزان یادگیری: η
تنظیم نرخ یادگیری میتواند عواقب بسیار بزرگی در هنگام ساخت شبکه عصبی داشته باشد، داشتن نرخ یادگیری بسیار کم باعث میشود که سفر به پایینترین نقطه در چشمانداز بسیار کند شود (همگرایی کند است[6]) در حالی که اگر نرخ یادگیری بالا باشد، محاسبه ممکن است دور بزند. نقطه حداقل سراسری همانطور که به طور مستقیم در زیر نشان داده شده است.
نرخ یادگیری بیش از حد
در عمل یک فرآیند تطبیقی دنبال میشود که در آن "نرخ یادگیری" با چشم انداز "تطبیق" مییابد. وقتی میگوییم "تطبیق"، به این معنی است که میزان یادگیری را میتوان کوچکتر یا بزرگتر کرد بسته به موارد زیر:
· شیب چقدر بزرگ است
· یادگیری چقدر سریع اتفاق میافتد.
· اندازه وزنهها
· و غیره
جزئیات بیشتر را می توانید در اینجا پیدا کنید: https://www.ruder.io/optimizing-gradient-descent/
8. منظمسازی[7]:
در مورد شبکههای عصبی، منظمسازی معمولاً با استفاده از “Dropouts” انجام می شود. در Dropouts، در حین آموزش، اساساً به طور تصادفی تعدادی زیرمجموعه از نورونها را در شبکه عصبی انتخاب میکنیم و با احتمال کمی این نورونها را هرس میکنیم. ما به طور تصادفی این نورونها را در تکرارهای مختلف در طول تمرین روشن و خاموش میکنیم.
این اساساً شبکه عصبی را مجبور میکند تا مجموعهای از مدلهای مختلف را بیاموزد. این یک تکنیک بسیار قدرتمند است و به تعمیم بهتر کمک میکند.
Dropouts - هرس نورونها در طول تکرار تمرین