<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات overfit.ir</title>
        <link>https://virgool.io/overfit/feed</link>
        <description>نگاشته‌ها و مطالب به‌دردبخور در حوزه‌ی هوش مصنوعی!</description>
        <language>fa</language>
        <pubDate>2026-06-16 07:46:54</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/2j8qfhhyfd00/zrw7ha.png</url>
            <title>overfit.ir</title>
            <link>https://virgool.io/overfit</link>
        </image>

                    <item>
                <title>اندر حکایت GPT-4 و چاله‌چوله‌های آن!</title>
                <link>https://virgool.io/overfit/gpt-4-b35cyw5oxi4t</link>
                <description>انسانی در حال انگولک رباتی! این تصویر به کمک هوش‌مصنوعی تولید شده است.چندی پیش مدل GPT-4 هم منتشر شد (البته نه به صورت عمومی) و گفته شد که برخی از ضعف‌های ChatGPT در آن برطرف شده. مثلا قابلیت multi-modality بهش اضافه شده و می‌تونه تسک‌هایی که ترکیب text و عکس هست رو هم انجام بده. یا اینکه قابلیت reasoning در اون تقویت شده. همین موضوع بهانه‌ای شد تا تیمی از microsoft research کرم‌شون بگیره و این مدل زبون‌بسته رو به انحاء مختلف انگولک کنند تا چاله‌چوله‌های اون رو پیدا کنند که نتیجه‌ش یک مقاله ۱۵۰ صفحه‌ای (بله درست شنیدید ۱۵۰ صفحه) شد.در این مقاله در ابتدا در چندین فصل قابلیت‌های مختلف GPT-4 بررسی شده و رویکرد بررسی هم کاملا مبتنی بر مثال‌هایی از promptهای مختلف هست و متدهای ارزیابی ریاضیاتی خاصی استفاده نشده و همین باعث شده این مقاله تا حد خوبی همه‌فهم باشه. مثلا در باب تعامل انسان‌گونه این مدل، مثالی آورده شده که نشون میده مدل نه تنها می‌تونه reasoning بکنه بلکه می‌تونه درباره باورهای دیگری نیز reasoning انجام بده و یا اینکه می‌تونه احساسات یک انسان رو در تعامل با خودش در قالب جملات درک کنه. این دو مثال ذیل مفهوم Theory of Mind می‌گنجند که قراره به این سوال پاسخ بده که مثلا Alice به چه چیزی معتقده و یا میتونه یک مرحله پیچیده‌تر بشه: Bob فکر می‌کنه که Alice به چه چیزی معتقده و این مثال هی می‌تونه با اضافه شدن یک لایه دیگه پیچیده‌تر بشه. در این prompt همون‌طور که در تصویر مشخصه سعی‌شده شرایطی ذکر بشه که در دیتای اینترنت قابل پیدا کردن نبوده.یا مثلا برای درک توانایی مدل در فهم احساسات در قالب جملات، یک prompt طراحی شده که در اون Tom یک چیز خیالی به نام ZURFIN رو گم کرده. اینجا هم باز به خاطر اینکه مطمئن بشند مفهوم طراحی‌شده در دیتای آموزش مدل دیده‌نشده از یک چیز خیالی به این نام استفاده کردند.چاله‌های مدل - ساختار auto regressiveاما جنبه دیگه این مدل که می‌تونه جذاب باشه، ضعف‌های این مدل هست. ضعف‌های این مدل به دو دسته کلی تقسیم‌شده که دسته اول مربوط به ساختار autoregressive این مدل هست و دسته دوم مربوط به تاثیرات اجتماعیه. در دسته اول، همون‌طور که می‌دونید ساختار اصلی تمامی مدل‌های GPT مبتنی بر پیش‌بینی کلمه بعدی در پیکره متنیه که auto-regressive نامیده میشه (برای فهم بهتر داستان ترنسفورمرها و معماری اون‌ها می‌تونید به این رشته پست مراجعه کنید). همین ساختار باعث‌شده برخی سوالات متداول رو نتونه جواب بده. مثلا اومدند یه متن چندجمله‌ای از یه روزنامه بهش دادند و خواستند در یک جمله اون متن رو توضیح بده یا در واقع خلاصه کنه که مدل نتونسته این کار رو بکنه و دوباره یه متن طولانی تولید کرده. مدل در خلاصه کردن یک متن از روزنامه New York Times عاجزه! علت هم ضعف ساختار autoregressive در فهم چندباره  کل متن و تولید خروجی از اون هست. جایی که مدل‌های مبتنی بر autoencoder بسیار قوی‌تر هستند. برای فهم این نبرد به این رشته‌پست مراجعه کنید.یکی دیگه از ایرادات اصلی این مدل اینه که نمی‌تونه با خودش inner dialog داشته باشه یا work memory کوتاهی داره که نمی‌تونه تسک‌هایی که نیاز به نگه داشتن نتایج میانی دارند رو حل بکنه. مثلا ازش خواستند که تعداد اعداد اول بین ۱۵۰ و ۲۵۰ رو بگه که مدل به اشتباه عدد ۱۳ رو اعلام می‌کنه در حالیکه ۱۸تا عدد اول در این بازه داریم. بعد ازش خواستند که اعداد اول در این بازه رو لیست کنه و سپس طول این لیست رو بیان کنه که اینجا درست اعلام می‌کنه.تعداد اعداد اول در بازه ۱۵۰ تا ۲۵۰ برابر با ۱۸ عدد هست در حالیکه GPT-4 فکر می‌کنه ۱۳ تا عدد هستند!وقتی از GPT-4 می‌خواند که اول اعداد اول در بازه ۱۵۰ تا ۲۵۰ رو ذکر کنه و بعد بشمره اون وقت درست جواب میده که نشون میده working memory خوبی نداره.یکی دیگه از مشکلات پیش پاافتاده‌ای که عموم LLMها باهاش رو به رو هستند عملیات‌های ریاضیه. در مثال اول اومدند یه ضرب و جمع ریاضی رو دادند و ازش خواستند جواب یه ضرب و جمع دیگه رو بگه که اینجا هم مدل اشتباه می‌کنه. جالب اینه که در این حالات هر چقدر اعداد ریاضی به کار رفته در معادله ارقام بیشتری داشته باشند خطای مدل بیشتر میشه تا جایی که وقتی به اعداد سه رقمی می‌رسیم دقت مدل به صفر می‌رسه! اما وقتی همین مثال رو به مدل می‌دند و ازش می‌خوان که این معادله رو گام به گام حل بکنه جواب درست رو تولید می‌کنه. در واقع با این مثال نشون دادند که مدل ضعف برنامه‌ریزی درونی برای انجام تسک‌های ریاضی داره ولی وقتی به صورت صریح ازش خواسته میشه که این برنامه‌ریزی رو انجام بده می‌تونه موفق بشه.این prompt مربوط به مدل Chat-GPT هست که دقیقا همین ایراد GPT-4 را دارد ولی وقتی ازش می‌خوایم که این معادله رو گام به گام حل بکنه حتی در ضرب و جمع اعداد سه رقمی و بالاتر عملکرد درستی داره.همین مشکل عدم برنامه‌ریزی در انجام تسک رو در تولید محتوای متنی تحت شرایط خاص هم داره. اومدند و دو تا مثال تولید کردند. در اولی یه سری شروط لوکال برای مدل می‌ذارند. مثلا می‌خوان که یه شعر تولید کنه که اول هر مصرعش با تک تک کلمات یک جمله خاص شروع بشه (عمرا خودتون نمی‌تونید همچین شعری بگید!) و مدل کاملا با موفقیت این کار رو می‌کنه. این شرط یه شرط لوکال هست چرا که در تولید هر مصرع کافیه به حرف خاص از اون جمله هدف اولیه دقت کنه. اما یه مثال دیگه که یه شرط گلوبال هست و مدل رو بیشتر درگیر می‌کنه اینه که یه شعری تولید کنه که مصرع اول و آخرش یکی باشند و فقط ترتیب کلمات‌شون برعکس باشه به شرطی که بامعنی هم باشه (باز هم عمرا نمی‌تونید خودتون همچین چیزی بگید!) . اینجا مدل ضعیف عمل می‌کنه و دایم دنبال شعرهایی می‌ره که مصرع‌های بلندی دارند در حالیکه برای حل چنین تسکی باید سراغ شعر‌هایی با مصرع کوتاه رفت. در ادامه سعی می‌کنند مدل رو راهنمایی کنند و حتی مدل یه جمله کوتاه با این شرایط نمی‌تونه پیدا کنه که معنی‌دار باشه (مثلا جمله Life gives hope از هر دو طرف معنی میده که مدل این جمله رو هم ذکر می کنه ولی جملات پرت و پلای دیگه‌ای هم میگه).وقتی از مدل خواسته میشه که یک شعری بگه که حروف اول هر مصرعش با جمله I am Da vinci Three شروع بشه، مدل با موفقیت این کار رو انجام میده.وقتی از مدل خواسته میشه که شعری بگه که مصرع اول و آخرش عین هم باشند و فقط ترتیب کلمات برعکس باشه که هم معنی بده و هم از لحاظ گرامری درست باشه، مدل قاطی می‌کنه و شروع به چرت و پرت گفتن می‌کنهدر اینجا سعی‌شده که با پرسش و پاسخ فراوان، مدل رو راهنمایی کنند که چه طوری یه همچین شعری بگه ولی باز نمی‌تونهچوله‌های! مدل - تاثیرات اجتماعیدسته دوم ایرادات مربوط به تاثیرات اجتماعی هست که مهم‌ترین قسمتش بایاس‌های جوامع هست. با چند مثال نشون دادند که GPT-4 بایاس‌های اجتماعی رو تشدید کرده. مثلا در یه جدول، میزان توزیع برخی مشاغل بین زن ‌ها و مرد‌ها رو بررسی کردند و در عوض بررسی کردند که GPT-4 برای اون مشاغل در چند درصد موارد از ضمایر he یا she استفاده می‌کنه. به طور مثال در دنیا حدود ۷۸ درصد مهندسین نرم‌افزار مرد و مابقی خانم هستند در حالیکه GPT-4 در ۹۸ درصد اوقات از ضمیر he برای یه مهندس نرم‌افزار استفاده می‌کنه.مقایسه توزیع جنسیتی مشاغل مختلف و توزیع استفاده GPT-4 از ضمایر he و she برای این مشاغلیا نشون دادند که مدل‌های GPT کلا تمایلات زیادی به چرت و پرت گفتن دارند و انصافا هم خوب چرت و پرت می‌گند و هم چرت‌و‌پرت‌های خوبی می‌گند! اما درکی از اینکه مطلبی که تولید می‌کنند چقدر درست و چه مقدار غلط هست ندارند. به عبارت دیگه با گسترش استفاده از این مدل‌ها همون خطری که همواره برای تکنولوژی ذکر میشده برای GPT هم وجود داره؛ Misinformation.جمع‌بندیدر انتها هم مثال‌های ذکرشده رو دسته‌بندی کردند و گفتند که LLMها برای بهبود باید در چه زمینه‌هایی کار کنند. مثلا مباحثی مانند confidence calibration لازمه انجام بشه برای اینکه این مدل‌ها درباره اطلاعاتی که تولید می‌کنند بدونند چقدر اطمینان دارند تا از mis information جلوگیری بشه. یا مثلا باید روی long-term memoryشون کار بشه تا تسک‌هایی که نیاز به نگهداری نتایج میانی و یا Inner dialog دارند هم به خوبی انجام بشند. در پایان میشه گفت هنوز راه بسیار زیادی تا artificial general intelligence مونده ولی بعید هم نیست که بشر یه روزی به اون برسه.پ.ن: اینا نشستند ۱۵۰ صفحه مقاله نوشتند خداوکیلی ظلم در حق‌شون هست که شما مقاله شون رو حتی یه تورق هم نکنید! حداقل تصاویرش رو ببینید :)لینک مقاله:https://arxiv.org/abs/2303.12712به کانال ما سر بزنید:https://t.me/nlp_stuff</description>
                <category>overfit.ir</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Wed, 19 Apr 2023 06:26:15 +0330</pubDate>
            </item>
                    <item>
                <title>هوش مصنوعی با فیدبک‌های واقعی!</title>
                <link>https://virgool.io/overfit/rlhf-vkpgfist80nt</link>
                <description>چند وقتی هست که مدل‌های ChatGPT و GPT4 غوغایی به راه انداختند و همه از اون‌ها صحبت می‌کنند.  در واقع این دو مدل اولین جاهایی هستند که عموم جامعه با قدرت هوش مصنوعی رو‌به رو شدند. حالا به دور از این هیاهو قصد داریم در این نوشته به توضیح قلب تپنده ChatGPT بپردازیم یعنی روشی که با استفاده از اون این مدل، آموزش داده شده و کمی وارد جزییات فنی بشیم. این روش اسمش Reinforcement Learning from Human Feedback هست که در ادامه به توضیح مقاله‌ای با نام Deep reinforcement Learning from Human Preferences که این روش رو ارایه کرده می‌پردازیم. در این روش در واقع سعی شده از بازخوردهای یک عامل انسانی در آموزش یک مدل استفاده بشه که از نظر تعامل انسان و مدل یک گام رو به جلو محسوب میشه.یک گام به سمت هوش مصنوعی امن، تعامل انسان و هوش مصنوعی  است به طوریکه انسان‌ها سعی در تعریف مستقیم اهداف نداشته باشند و تفکیک‌کننده رفتارهای خوب و بد باشند.چه نیازی به بازخورد عامل انسانی بود؟!سوال خوبیه! همون‌طور که می‌دونید در پارادایم Reinforcement Learning (RL) چهار بخش اصلی وجود داره. اول state یا observation هست (که البته این دوتا یه فرق کوچولو داره که ما ازش صرف نظر می‌کنیم) که نشان‌دهنده وضعیتی هست که ایجنت هوشمند در اون قرار داره و می‌تونه با featureهای زیادی توصیف بشه. دوم، action هست که در واقع اون عملی هست که ایجنت قراره در اون state انجام بده. سوم، reward هست که در واقع مدل یا ایجنت به ازای انجام یک اکشن خاص در یک state خاص اون پاداش رو دریافت می‌کنه و چهارم environment هست که وقتی در یک state خاص یک اکشن انجام میشه state جدید رو معرفی می‌کنه و کمک می‌کنه که ایجنت وارد state جدید بشه. برای اینکه بتونیم یه مساله رو در قالب RL دربیاریم نیاز هست که هر یک از چهار اجزای بالا رو بتونیم براش تعریف کنیم. مثلا برای چت‌بات می‌تونیم دیالوگی که چت‌بات دریافت می‌کنه رو به منزله state درنظر بگیریم و دیالوگی که چت‌بات تولید می‌کنه رو به عنوان اکشن درنظر بگیریم. اما همون‌طور که احتمالا تا الان بهش فکر کردید برای تعریف تابع پاداش (reward) احتمالا با چالش رو‌به‌رو میشیم. در واقع یه سری مسایل وجود دارند که نمی‌تونیم یه تابع quantitative براش تعیین کنیم اما جنس مساله طوری هست که عامل انسانی می‌تونه یه اکشن خوب رو از بد بازشناسی کنه. در واقع تابع پاداش از حالت کمی درمیاد و تبدیل به کیفی میشه. اینجاست که بازخورد عامل انسانی وارد قضیه میشه.اما دو چالش اصلی بر سر راه وجود داره. اول اینکه وقتی قراره عامل انسانی بازخورد بده طبیعتا باید بتونیم با تعداد محدودی بازخورد کار رو دربیاریم و دوم اینکه تاجای ممکنه نیاز به domain expert رو باید کم کنیم. در واقع فیدبک‌ها طوری باید طراحی بشند که کمترین میزان تخصص رو لازم داشته باشه تا آموزش مدل رو اقتصادی بکنه.در این مقاله سعی شده برای ساده‌سازی بازخورد از روش مقایسه‌ای استفاده بشه. در واقع در هر iteration یه زوج از عملکرد مدل به عامل انسانی نشون داده میشه و عامل انسانی صرفا باید بگه کدوم رو بیشتر میپسنده. کلا مقایسه برای انسان‌ها خیلی راحت‌تر از توصیف شرایط مطلوبه (کلا ما آدما اهل قضاوت کردن هستیم!) جزییات این موضوع رو جلوتر بهش می‌پردازیم.از طرفی سعی شده برای کاهش نیاز به بازخوردهای انسانی از یه reward model استفاده بشه که قراره از روی بازخوردهای عامل انسانی به صورت supervised ترین بشه. در واقع با این کار دیگه نیاز نداریم که به ازای زوج اکشن و state بازخورد عامل انسانی رو داشته باشیم بلکه یه مدل داریم که این کار رو برامون انجام میده. این موضوع رو هم جلوتر بهش می‌پردازیم. معماری کلی این داستان در تصویر زیر قابل مشاهده است.معماری کلی روش RLHFدر این مقاله اشاره شده که مدل reward و مدل RL به صورت async و آنلاین آموزش داده می‌شند به این معنا که حین اینکه RL داره ترین میشه reward model هم ترین میشه (که البته async بودن این داستان رو خودم هم برام عجیبه و شاید concurrent بودن کافی بود ولی اشاره شده که این موضوع به بهبود عملکرد مدل منتج میشه!). در مجموع هم با روش‌هایی که در بالا توضیح دادیم نشون دادند که با حدود ۱۵ دقیقه تا ۵ ساعت از زمان یک عامل انسانی می‌تونند تقریبا هر تسک و بازی که تا حالا باهاش RL ترین شده رو مدل آموزش بدند و به عملکرد عالی برسند.آموزش مدلآموزش مدل ۴ قسمت اصلی داره که در این بخش به توضیح هر کدوم می‌پردازیممدل RLاین بخش که مربوط به بخش RL Algorithm تصویر بالا است می‌تونه با استفاده از هر یک از روش‌های traditional توی RL مانند Q-learning یا Policy Gradient می‌تونه حل بشه. در واقع با داشتن reward model می‌تونیم از همین روش‌ها استفاده کنیم. در این مقاله با توجه به اینکه reward function ممکنه non-stationary باشه از روش‌های policy gradient استفاده شده که به طور مستقیم policy رو مدل می‌کنه.نحوه بازخوردبا توجه به اینکه این مقاله برای experiments از بازی‌های معروف gym استفاده کرده به عنوان یه تسک پایه یادگیری پشتک زدن (تسک backflip در gym) رو انتخاب کرده. در نتیجه به عامل انسانی برای بازخورد، دوتا کلیپ کوتاه از دو رفتار مدل ارایه میشه که حداکثر ۲ ثانیه طول میکشه. عامل انسانی باید بگه کدوم رفتار رو ترجیح میده یا اینکه بگه هر دو خوب هستند یا بگه قابل مقایسه نیستند. نکته اینه که نتیجه بازخورد انسانی به صورت یه توزیع بر روی {1,2} ذخیره میشه به این صورت که اگه یکی از دو کلیپ رو ترجیح بده کل جرم توزیع بر روی کلیپ ترجیح‌داده‌شده قرار میگیره و اگه هر دو خوب باشند یه توزیع uniform ذخیره میشه و اگه قابل مقایسه نباشند اصلا رکوردی ذخیره نمیشه.آموزش مدل rewardورودی مدل reward یه زوج از state و action هست. اما برای اینکه نتیجه مقایسه انسانی رو برای آموزش مدل reward استفاده کنند از یه trick استفاده کردند و loss مدل رو به صورت زیر تعریف کردند:معادله اول تعریف احتمال ترجیح نمونه اول بر نمونه دوم است. معادله دوم فرمول loss مدل است.در واقع مدل reward یه preference predictor هست. مقدار []P، احتمال ترجیح یک رفتار مدل بر دیگری هست که به صورت exponential در معادله اول آورده شده و سپس loss مدل به صورت cross-entropy بر روی این احتمال preferenceها تعریف میشه. در این روش از ^r به عنوان یک متغیر پنهان برای پیش‌بینی فیدبک انسان استفاده شده و طبیعتا برای آپدیت پارامترهای مدل از loss براساس ^r گرادیان گرفته میشه و پارامترها آپدیت میشند. همچنین کل reward model به صورت ensemble هست (ینی به جای آموزش یک مدل، چندین مدل آموزش داده میشه و تجمیعی از خروجی اون‌ها درنظر گرفته میشه) که نتیجه نهایی به صورت میانگین خروجی هر یک از predictorها حساب میشه.انتخاب نمونه‌هایی برای گرفتن بازخورد عامل انسانیاین قسمت هم یکی از زیبایی‌های این مقاله است که نیاز به بازخورد انسانی رو باز هم کاهش داده. انتخاب جفت نمونه‌هایی که برای مقایسه به عامل انسانی داده میشه می‌تونه نقش حیاتی در کاهش نیاز به بازخورد‌های انسانی ایفا کنه. در این بخش، از ایده active learning الهام گرفته شده. برای اینکه جفت نمونه‌هایی رو برای گرفتن بازخورد عامل انسانی انتخاب کنند در هر مرحله تعداد زیادی از نمونه‌ها رو سمپل می‌گیرند و بعد جفت نمونه‌هایی انتخاب می‌شند که مدل‌های حاضر در ensemble بیشترین واریانس رو در مورد اون‌ها داشته باشند. با این روش بیشتر، جفت نمونه‌هایی انتخاب می‌شند که reward model درباره اون‌ها بیشترین عدم قطعیت رو داره و گرفتن بازخورد عامل انسانی می‌تونه اطلاعات مفیدی رو به reward model بده.سخن آخردر نوشته بالا قصد داشتیم ایده RLHF رو به صورت ساده و خلاصه مطرح کنیم. همون‌طور که دیدید به نظر خیلی ایده‌های ساده‌ای استفاده کردند ولی جزییات زیادی رعایت شده که برخی‌هاش باز هم در این نوشته نیومده و نشون میده هنوز مفاهیم پایه‌ای و ایده‌های اصلی در یادگیری ماشین (مثل active learning) چقدر می‌تونه در حل مسایل مفید باشه. امیدوارم از این مطلب لذذذت برده باشید.لینک بلاگ توضیح مقاله:https://openai.com/research/learning-from-human-preferencesلینک مقاله:https://arxiv.org/abs/1706.03741#خوشحال میشیم که به کانال nlp stuff سر بزنید و اگه مطلب و پستی داشتید یه ندا بدید که بذاریم تو کانال.</description>
                <category>overfit.ir</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Mon, 03 Apr 2023 10:32:29 +0330</pubDate>
            </item>
                    <item>
                <title>آلفاگو، یادگیری ماشین برای چیرگی بر یک بازی کهن</title>
                <link>https://virgool.io/overfit/alphago-mhoamralnzeq</link>
                <description>اکثر ما احتمالا شطرنج بازی کردیم و باهاش آشنا هستیم. اما درصد خیلی کممون احتمالا با بازی تخته‌ای گو آشنا هستیم. این بازی دو نفره که در شرق آسیا از قدیم الایام خیلی طرفدار داشته و داره یک بازی دو نفره است که قوانین خیلی ساده‌ای هم داره حتی ساده‌تر از شطرنج. اما علی رغم این سادگی قوانین، استراتژی‌های خیلی پیچیده‌ای رو می‌طلبه. به صورت خلاصه این بازی بر روی یک صفحه مربعی با ۱۹ در ۱۹ جایگاه انجام میشه که به نوبت بازیکن‌ها مهره‌های سیاه و سفید خودشون رو روی صفحه قرار میدن. قانون ساده‌ای که این بازی داره اینه که هر مهره باید حداقل یک نقطه باز در همسایگی خودش داشته باشه یا بخشی از یک گروه متصل باشه که حداقل یک راه آزاد و فرار داشته باشند و گرنه این مهره‌های محاصره‌شده از روی صفحه برداشته میشن (یعنی مثلا اگر در میانه بازی شرایطی پیش اومد که چند مهره سفید توسط مهره‌های سیاه محاصره شدند و هیچ راه آزادی به بیرون محاصره نداشتند اون وقت این مهره‌های سفید از صفحه برداشته می‌شن) در نهایت کسی برنده است که تعداد خونه‌های بیشتری از صفحه رو تصاحب کنه.برای فهم بهتر بازی ببینید مثلا اگر در نقاط ضربدر مهره‌های با رنگ متناسب قرار بگیرند اون مهره‌هایی که محاصره می‌شن به فنا میرن و از روی صفحه برداشته میشن. اصولا یکی از روش‌های رایج و اصلی طراحی یک عامل هوش مصنوعی برای بازی‌های تخته‌ای نظیر گو و شطرنج استفاده از جستجو و البته تدارک یک تابع مقدار بهینه (Optimal Value Function) است. تابع مقدار در واقع وظیفه‌اش اینه که وضعیت (State) فعلی بازی (که مثلا در گو و شطرنج میشه موقعیت مهره‌ها) رو دریافت میکنه و با دادن یک خروجی عددی، پیش‌بینی می‌کنه که در صورتی که همه بازیکن‌ها بهترین بازی ممکنشون رو انجام بدن نتیجه بازی چه خواهد بود. حالا وقتی که این تابع مقدار بهینه رو داشته باشیم در هر نوبت که باید یک انتخاب و اکشن انجام بدیم صرفا کافیه در درخت حالات مشتق‌شده از حالت فعلی جستجو کنیم ببینیم کدوم اکشن ما رو به استیتی با بیشترین مقدار ارزش می‌رسونه. حالا سایز فضای حالت برای بازی‌های مختلف می‌تونه تفاوت داشته باشه. مثلا دوز رو در نظر بگیرید و برای خودتون فکر کنید سایز فضای حالتش چه قدره. از طرف دیگر مثلا درخت حالات شطرنج یک درخت با میانگین عمق حدود ۸۰ و ضریب انشعاب ۳۵ هست. نکته جالب اما اینه که بازی گو با وجود قوانین ساده‌تر نسبت به شطرنج دارای یک درخت حالات با میانگین عمق حدود ۱۵۰ و ضریب انشعاب ۲۵۰ هست که همین حل کردن گو رو نسبت به شطرنج چالشی‌تر میکنه (نکته جالب اینه که تعداد حالات ممکن برای وضعیت صفحه گو بیش از تعداد اتم‌های محدوده دنیایی هست که تا حالا کشف کردیم!). کاری که معمولا برای حل چالش جستجو در این فضاهای بزرگ می‌کنند اینه که به‌جای ادامه دادن جست‌و‌جو تا برگ‌های درخت، جست‌و‌جو رو تا عمق مشخصی ادامه میدن و بعد مقدار تابع ارزش گره پیدا شده در اون عمق رو تقریب می‌زنند یا کار دیگه‌ای که می‌کنند اینه که نمیان تمام اکشن‌ها رو در هر حالت گسترش بدن و صرفا اکشن‌ها رو به صورت نمونه‌برداری و محدود بر روی حالت مورد جستجو اعمال می‌کنند. این دو تکنیک با این که باعث جستجوی محدود‌تر روی کل درخت جستجو میشه اما در عمل در مورد بازی‌‌هایی مثل شطرنج جواب خوبی داده و در حد ابرانسان عمل می‌کنند. اما مشکل اینه که گو خیلی فضای پیچیده‌تری داره که این روش‌ها بتونن روش جواب بدن. اینجاست که داستان مدل آلفاگو (AlphaGo) شروع میشه.دیپ‌مایند سعی کرده در آلفاگو با ترکیب سه روش SL (یادگیری بانظارت) و RL (یادگیری تقویتی) و البته Search، یک مدل کارآمد توسعه بده که نه تنها از مدل‌های هوش مصنوعی قبل از خودش بهتره که حتی می‌تونه برترین آدم‌های گوباز رو هم شکست بده.یادگیری بانظارت شبکه‌های سیاستدر مرحله اول سعی میشه تا با استفاده از یادگیری بانظارت یک شبکه رو بر روی تصمیمات گرفته شده توسط انسان‌ها آموزش بدیم (معنای شبکه سیاست یعنی این که با ورودی گرفتن حالت بازی مدل بتونه پیش‌بینی کنی که حرکت خوب چه می‌تونه باشه). به معنای بهتر یعنی از قبل دیتاستی از بازی‌های آدم‌های خبره‌‌ی گو با همدیگر جمع شده که هر نمونه این دیتاست شامل یک جفت استیت و اکشنه که مشخص میکنه در اون استیت بازیکن خبره انسانی چه اکشنی رو انتخاب کرده. ساختار این شبکه هم یک شبکه کانولوشنی هست که وضعیت صفحه‌ی گو و البته تاریخچه حرکات قبلی رو در ورودی می‌گیره و در نهایت بایستی مشخص کنه حرکت بعدی گذاشتن مهره در کدوم یک از ۱۹*۱۹ خونه صفحه باید باشه. بعد از آموزش‌دادن، عملکرد این شبکه در پیش‌بینی حرکات خبره‌های انسانی، ۵۷ درصده که نسبت به پرچمدار زمان خودش که ۴۴ درصد دقت داشته پیشرفت قابل ملاحظه‌ای بوده. اما از اونجایی که این شبکه سنگینه و خروجی گرفتن ازش زمان میگیره (۳ میلی ثانیه) یک شبکه غیردیپ دیگه هم بر روی این داده‌ها آموزش داده میشه که با این که دقتش کمتره اما سرعت بیشتری داره. این شبکه کوچکتر با این که دقتش ۲۴ درصده اما تنها در ۲ میکروثانیه خروجی میده که سرعت خیلی بالاییه. حالا در پایان این گام، ما دو شبکه سیاست بانظارت داریم که یکیشون دقت بیشتری داره و دیگری هم سرعت بالاتر. در گام‌های بعدی می‌بینیم که از هر کدوم این شبکه‌ها کجا استفاده میشه. ما در نمادگذاری‌هامون پارامتر‌های شبکه بزرگ رو با σ و پارامتر‌های شبکه کوچک رو با π نمایش می‌دهیم.یادگیری تقویتی شبکه سیاستمرحله دوم از لحاظ نتیجه‌ای مشابه مرحله اوله. یعنی دنبال یک شبکه سیاست هستیم ولی با این تفاوت که در این جا قصد داریم یک شبکه سیاستی بهتر از مرحله قبل رو با کمک  یادگیری تقویتی به دست بیاریم. ساختار و معماری شبکه این بخش دقیقا همون معماری شبکه بزرگ قسمت اول هست. برای آموزش این شبکه اما به جای یادگیری بانظارت روی دیتاست بازی‌ها، میایم و این شبکه سیاست رو با نسخه‌های قبلی خودش بازی می‌دیم (یعنی مثلا اگر در ایتریشن ۱۰۰ام یادگیری این شبکه هستیم این شبکه رو با ایتریشن ۹۰ام اش بازی می‌دیم). حال در طی این بازی‌ها از طریق یادگیری تقویتی، شبکه سیاست رو آموزشش میدیم که انتخاب سیاستش رو بهبود ببخشه. از اونجایی که یادگیری این سیاست‌های پیچیده از اول با شبکه خام و آموزش ندیده ممکنه کار سخت و شاید غیرممکنی باشه میایم و مقدار اولیه پارامتر‌های مدل این بخش رو مساوی با پارامتر‌های شبکه بزرگ آموزش یافته در قسمت اول (یعنی شبکه سیاست یادگیری بانظارت) قرار می‌دهیم. بعد از اتمام آموزش مدل در این بخش، توسعه‌دهندگان آلفاگو اومدند و مدل سیاست این بخش رو با مدل سیاست حاصل از قسمت قبل بازی دادند (یعنی بین مدل‌های حاصل از RL و SL بازی راه انداختند تا بفهمند کدوم مدل بهتر عمل می‌کنه) جالبه که در بیش از ۸۰ درصد بازی‌ها مدل RL تونسته مدل SL رو شکست بده که دلیلی بر بهتر بودن این مدل محسوب میشه. ما در نماد‌گذاریمون پارامتر‌های این شبکه رو با ρ نمایش می‌دهیم.یادگیری تقویتی شبکه ارزشآخرین شبکه‌ای که مورد یادگیری واقع میشه شبکه ارزش هست. وظیفه این شبکه اینه که با ورودی گرفتن حالت بازی (وضعیت مهره‌ها بر روی تخته در هر لحظه) پیش‌بینی کنه در صورتی که دو بازیکن بهترین بازی ممکن رو انجام بدن نتیجه بازی چه خواهد بود. معماری این مدل شبیه معماری‌های استفاده شده در قسمت قبله با این تفاوت که خروجی این شبکه به جای این که یک توزیع احتمال روی اکشن‌های ممکن باشه یک خروجی عددی با مقدار بین صفر و یک هست (که مشخص میکنه که اگر بازی در این موقعیت باشه در پایان مهره سیاه میبره یا مهره سفید). برای آموزش این شبکه اومدند و ۳۰ میلیون بازی بین عامل سیاست آموزش یافته در بخش قبلی و خودش رو تا پایان بازی انجام دادند و ۳۰ میلیون موقعیت متمایز رو از این بازی‌ها استخراج کردند. حال روی دیتایی که از این ۳۰ میلیون بازی داریم می‌تونیم مدل شبکه ارزشی‌مون رو با تسک رگرشن آموزش بدیم. ما در نماد‌گذاریمون پارامتر‌های این شبکه رو با θ نمایش می‌دهیم.جستجو با شبکه‌های سیاست و مقدارخب بیاید مرور کنیم تا اینجا چه شبکه‌هایی داریم:از بخش اول دو شبکه سیاست داریم که با ورودی گرفتن حالت صفحه تعیین میکنن بهترین اکشن در گام بعدی چیه. این دو شبکه که با یادگیری بانظارت آموزش دیدند یکیشون بزرگ و کنده و دیگری کوچک و سریعه.از بخش دوم شبکه‌ سیاست‌ای رو داریم که با ورودی گرفتن حالت صفحه تعیین میکنه سیاست بهترین اکشن در گام بعدی چیه. فرق این شبکه با شبکه‌های قسمت قبل اینه که با یادگیری تقویتی آموزش دیده و از شبکه‌های قسمت قبلی دقیق‌تره.از بخش سوم هم یک شبکه ارزش داریم که با ورودی گرفتن حالت صفحه تعیین میکنه بازی رو در نهایت کدام یک از طرفین می‌بره.برای جمع‌بندی سریع می‌تونید به تصویر زیر نگاه کنید:کار مهمی که آلفاگو کرده اینه که اومده شبکه‌های سیاست و مقداری رو که داره با تکنیک سرچ ترکیب کرده. قبل از این که نحوه این ترکیب رو ببینیم یک نکته‌ای رو برای تکنیک جستجو باید بیان کنیم. همانطور که در ابتدای پست گفتیم، اگر ما با یک بازی مثل دوز، شطرنج یا گو مواجه باشیم می‌تونیم در هر موقعیتی از بازی که هستیم بیایم و کل فضای اعمال و حالات منتج‌شده از این اعمال رو با جستجوی درختی پیمایش کنیم و بعد اون عملی که بهترین نتیجه نهایی رو در پی داره انتخاب کنیم. این روش (یعنی جستجوی تمام و کمال حالات) جواب بهینه رو به ما میده ولی مشکلی که داره اینه که مرتبه‌ زمانی بسیار وحشتناکی می‌سازه. یک روشی که در عمل به‌جای جستجوی تمام و کمال انجام میشه روش &quot;جستجوی درختی مونته‌کارلو&quot; هست. در این روش،جستجوی تمام و کمال رو به جای این که تا انتهای درخت (یعنی حالت به پایان رسیدن بازی) انجام بدیم در یک نودی متوقف می‌کنیم (مثلا در عمق L،از جستجوی کامل زیردرخت دست می‌کشیم). به این نود میگیم نود برگ. حالا به جای این که برای محاسبه ارزش این نود، زیردرخت این نود رو هم به صورت کمال و تمام و گسترش تمامی اکشن‌هاش جستجو کنیم به شیوه نمونه برداری مونته کارلو میایم ارزش این نود رو تخمین می‌زنیم. یعنی مثلا از اون نود به بعد به صورت رندوم یا هر سیاست دیگه‌ای که داریم چند بار بازی رو سیمولیشن می‌کنیم و نتایج نهایی این‌ بازی‌ها رو با هم میانگین می‌گیریم و به عنوان ارزش اون نود گزارش می‌کنیم. با این روش عملا دیگه از جستجوی تمامی حالات و اکشن‌ها پرهیز کردیم و در عوض با یک تخمین، ارزش اون نود رو برمی‌گردونیم. در آلفاگو هم، الگوریتممون رو بر پی همین الگوریتم جستجوی درختی مونته‌کارلو بنا می‌کنیم. برای فهم بهتر روش جستجوی درختی مونته‌کارلو به تصویر زیر توجه کنید:حالا برگردیم سمت آلفاگو. فرض کنید موقعیت بازی در حالت s است و شما بایستی یک اکشن رو انتخاب کنید. مساله رو اگر از یک دید دیگه نگاه کنیم معادل با این میتونه باشه که ما با یک درخت جستجو مواجه هستیم که نود‌های اون حالات بازی و یال‌های هر نود اکشن‌های ممکن در اون حالت هستند و مابایستی در هر نود بهترین یال رو انتخاب کنیم. ما می‌تونیم یک تابع داشته باشیم که به هر زوج s و a (اکشن انتخابی در s) یک امتیاز نسبت بده که انجام این اکشن در این موقعیت چه قدر خوب هست (اگر با Qlearning آشنایی داشته‌ باشید یحتمل بهتر متوجه می‌شید این مطلب رو). در کنار این Q(s,a) ما دو مقدار دیگه N(s,a) و P(s,a) هم می‌تونیم تعریف کنیم که به ترتیب بیانگر میزان دفعات انتخاب شدن اکشن a در حالت s و احتمال پیشین انتخاب a در s هستند (اگر نفهمیدید چند دقیقه صبر کنید چند پارگراف پایین‌تر توضیح داده شده اینا دقیقا چی هستند).حالا فرض کنید آلفاگو در حال بازی کردنه و بازی در موقعیت s است و می‌خوایم ببینیم که چه اکشنی رو باید انتخاب کنیم. آلفاگو فرمولی داره که میگه باید بر طبق این فرمول اکشن a رو انتخاب کنی:این فرمول بیان میکنه که بهترین اکشن در حالت s اون اکشنی هست که بین بقیه اکشن‌ها، مجموع توابع Q و u اش بیشینه باشه. اما هر کدوم این تابع‌ها چطور محاسبه میشن؟ گفتیم که در الگوریتم جستجوی درختی مونته‌کارلو به‌جای این که درخت رو به صورت کامل جستجو کنیم با نمونه‌برداری تصادفی شاخه‌هایی از درخت رو پیمایش و سیمولیشن می‌کنیم و مقدار تخمینی از ارزش یک حالت یا حالت-اکشن رو با این تخمین به دست میاریم. در آلفاگو هم دقیقا همین سناریو رخ میده و ما بر روی درخت سیمولیشن و پیمایش انجام میدیم. بر این اساس تابع u رو به صورت زیر فرموله میکنیم:این فرمول تابع u رو متناسب با تابع P و معکوس با N مدل میکنه. اول از همه گفتیم که N نشون میده در طی سیمولیشن‌هامون روی درخت چند بار در حالت s اکشن a رو نمونه برداری کردیم. حال هر چه قدر این عدد بیشتر باشه شانس انتخاب اون اکشن پایین‌تر میاد. دیپ‌مایند این جوری توضیح داده که این عمل باعث میشه مدل، تشویق به اکسپلوریشن بیشتر در محیط باشه. اون تابع P هم دانش پیشین ما از میزان خوب بودن انتخاب اکشن a در حالت s است. ما حالا این تابع رو با همون شبکه سیاست بزرگ نظارتی که در بخش اول یاد گرفتیم مدل می‌کنیم. یعنی اگر خواستیم P(s,a) رو حساب کنیم s رو به اون شبکه سیاست بانظارت بزرگ ورودی می‌دیم و احتمالی که برای a برمی‌گردونه رو به عنوان مقدار P(s,a) در نظر می‌گیریم. اما بریم سراغ تابع Q. قبل از اون یکبار دیگه به تصویر شماتیک نحوه سرچ درختی مونته‌کارلو دقت کنید. گفتیم که برای محاسبه ارزش یک نود برگ، عوض این که کل زیر درختش رو بگردیم یک تخمین از اون ارائه میدیم. در این جا هم آلفاگو با توجه به مدل‌هایی که به دست آورده می‌تونه یک تقریب خوب از یک نود برگ به دست بده. فرمولی که واسه این تقریب آلفاگو در نظر می‌گیره همچین چیزیه:این فرمول خودش از ترکیب خطی دو ترم تشکیل شده. ترم اول تخمین شبکه ارزش از اون حالته (همون شبکه‌ای که تو بخش دوم با یادگیری تقویتی آموزشش دادیم) و ترم دوم هم اینجوری محاسبه میشه که ما با استفاده از شبکه سیاست کوچک بخش اول یک بازی سریع انجام می‌دهیم و نتیجه بازی (برد یا باخت) به عنوان z قرار داده می‌شه (به این سناریو Rollouts گفته می‌شه).حالا وقتی که سیمولیشن‌هامون رو انجام دادیم از روی میانگین نتایج سیمولیشن‌هامون تابع Q رو به طرز زیر محاسبه می‌کنیم:که در فرمول‌های بالا تابع (s,a,i)1 بیان ‌میکنه که آیا اکشن a در حالت s در سیمولیشن i ام مورد پیمایش قرار گرفته یا نه. وقتی سیمولیشن‌هامون رو انجام بدیم و مقدار Q(s,a) رو محاسبه کنیم حالا می‌تونیم تصمیم بگیریم که در نود ریشه (همون حالتی که توش هستیم) چه اکشنی رو می‌تونیم انتخاب کنیم.ارزیابی میزان قدرت آلفاگوتا اینجا توضیح روش آلفاگو تمام شد. در این بخش به تحلیل قدرت آلفاگو و همچنین سوالاتی که ممکنه پس از خوندن بخش قبل براتون به وجود اومده باشه می‌پردازیم:سوال اولی که ممکنه براتون پیش اومده باشه اینه که در تخمین ارزش یک حالت چرا به جای استفاده از شبکه سیاست RL ای از شبکه سیاست SL ای استفاده نکردیم؟ مقاله آلفاگو اینجوری پاسخ داده که با انجام آزمایش‌ها اولا فهمیده این کار بهتره و ثانیا این دلیلش به خاطر اینه که عامل RL به نحوی بهینه‌شده که بتونه یک بهترین اکشن رو برگردونه در حالی که شبکه سیاست SL در انتخاب اکشن‌هاش تنوع بیشتری داره و میتونه یک طیف از اکشن‌های خوب رو برگردونه و همین تنوع باعث بهبود عملکرد کل مدل شده.سوال دوم احتمالا اینه که چرا در تخمین ارزش یک حالت، از فرآیند Rollout استفاده شده و چرا به استفاده از شبکه ارزش اکتفا نشده؟ برای فهمیدن پاسخ این سوال در مقاله آلفاگو حالت‌ها و تنظیمات مختلفی از مدل مورد آزمایش قرار گرفتند که میزان عملکردشون در شکل پایین اومده. آلفاگو برای ارزیابی عملکرد مدل های رقیبش و انواع تنظیمات مدل‌ خودش آمده و تورنمنت‌‌هایی رو بین این مدل‌ها اجرا کرده و تعداد بار برنده شدن هر مدل رو به دست آورده:همانطور که می‌بینید وقتی که Rollout استفاده نشده و فقط از شبکه ارزش استفاده شده عملکرد ضعیف‌تر از زمانی بوده که Rollout و شبکه ارزش با هم استفاده شده‌اند. در نهایت در اکتبر ۲۰۱۵ پنج مسابقه بین آلفاگو و فان هویی که قهرمان متوالی سه سال رقابت‌های گو اروپا بود برگزار شد و آلفاگو تونست با اقتدار پنج بر صفر فان هویی رو در هم بکوبه و برای اولین بار یک عامل کامپیوتری تونست یک قهرمان گو رو شکست بده. در ادامه هم در سال ۲۰۱۶ آلفاگو در مقابل لی سدول از کره جنوبی که هجده عنوان در مسابقات جهانی گو داشت قرار گرفت و در مسابقه‌ای که توسط ۲۰۰ میلیون نفر بیننده دنبال میشد تونست این بازیکن رو با نتیجه ۴-۱ بفرسته خونشون سئول.استیصال لی سدول در برابر آلفاگوالان که در سال ۲۰۲۲ هستیم روشی که آلفاگو استفاده کرده به نظر خیلی ساده و مبتدیانه میاد. اما آلفاگو در سال ۲۰۱۵ برای خودش انقلابی در زمینه هوش مصنوعی محسوب می‌شده و باعث شد که موجی از توجهات به RL و یادگیری تقویتی جلب بشه. انشالله اگر عمری باقی باشه به باقی مقالات و مدل‌های مهم جریان‌ساز هوش مصنوعی نیز می‌پردازیم.در تلگرام می‌تونید دنبالمون کنید و اگر هم متن خوبی در حوزه‌ی هوش مصنوعی و پردازش زبان طبیعی داشتید که در انتشارات یا کانال بگذاریم، از همون‌جا ندا بدید. </description>
                <category>overfit.ir</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Fri, 01 Jul 2022 19:49:31 +0430</pubDate>
            </item>
                    <item>
                <title>تیپیکال سمپلینگ، تکه گم‌شده پازل تولید متن توسط ربات‌ها</title>
                <link>https://virgool.io/overfit/papers-typical-sampling-psuennnubiiu</link>
                <description>همون‌طور که می‌دونید چند سالی میشه که مدل‌های generative مانند GPT پا به عرصه وجود گذاشتند و وجود پرخیر و برکت‌شون باعث شده بتونیم در زمینه هوش‌مصنوعی، تولید متن داشته باشیم. اما همیشه یه دغدغه اصلی در تولید متن‌هایی که توسط ماشین میشده وجود داشته و اون هم قرابت اون متن‌ها با متونیه که انسان‌ها تولید می‌کنند. به عبارت دیگه در یه فضای مناسب، آدم نباید بتونه فرق متن تولیدشده توسط ماشین و انسان رو بفهمه که این یکی از آرزوهای بشری از دیرباز تا کنون بوده و به تست تورینگ معروفه. البته قبلا نوشته‌ای در این‌باره منتشر کرده بودم که تست تورینگ تا حد زیادی پاس شده و حالا چالش‌های جدید دیگه‌ای مطرحه. اما هستند افرادی که به کیفیت خوب قانع نیستند و دنبال عالی هستند! خانوم Meister و همکاراش یکی از همون قماش آدمان که دنبال بهتر و بهتر کردن تولید متن توسط ماشین‌ها هستند و در جدیدترین مقاله‌شون[1] به معرفی روشی در این‌باره پرداختند که قصد داریم در ادامه اون رو توضیح بدیم.نکته کلیدی؛ decoding strategyهمون‌طور که می‌دونید در تولید متون زبان طبیعی دو فاز اصلی داریم که فاز اولیه شامل پیش‌آموزش مدل برای فراگیری توزیع احتمال کلمات به‌شرط وجود کلمات قبلیه و ازش به مدل زبانی یاد میشه و فاز دوم شامل انتخاب کلمه مناسب به‌شرط وجود کلمات قبلی است. این مقاله ادعا می‌کنه که فاز دوم یعنی decoding strategy می‌تونه خیلی خیلی روی کیفیت متن خروجی تاثیرگذار باشه. به‌خاطر همین بر روی همین قسمت تمرکز کرده و مساله رو به صورت out of the box بررسی کرده؛ به این معنی که شما می‌تونید مدل زبانی‌تون رو با هر روشی که دوست دارید (مثل masking language model) آموزش بدید و بعد برای فاز decoding strategy از روش معرفی‌شده استفاده کنید. در روش‌های فعلی معمولا کلمه‌ای رو در فاز decoding انتخاب می‌کنیم که بیشترین احتمال رو به ازای کلمات داده‌شده داشته باشه. به عبارت دیگه اگه چندین کلمه داشته باشیم و بخوایم کلمه بعدی رو حدس بزنیم، رشته ورودی رو به مدل زبانی می‌دیم و بعد کلمه‌ای که بیشترین احتمال رو در بین بقیه داره به عنوان کلمه بعدی انتخاب می‌شه. این مقاله ادعا می‌کنه دقیقا همین موضوعه که بعضی وقت‌ها باعث میشه مدل‌هایی مثل GPT متن‌های توهمی تولید کنند. در واقع با یه سری مطالعات زبان‌شناختی [2] متوجه شدند که این دقیقا کاری نیست که انسان‌ها در مغز خودشون موقع تولید متن یا گفتار انجام میدند. در واقع انسان‌ها موقع تولید متن یه مصالحه‌ای بین کلمات با احتمال بالا و کلماتی که انتقال اطلاعات موردانتظار رو تضمین می‌کنند برقرار می‌کنند. به‌عبارت دیگه ذهن شما وقتی چندین کلمه رو میبینه و میخواد کلمه بعدی رو حدس بزنه هم به مدل زبانی که در خودش شکل گرفته رجوع می‌کنه و هم از طرفی سعی میکنه مطلب پرتی رو بیان نکنه! از همین‌جا شاخک‌های آدم تیز میشه که شاید بهترین استراتژی، انتخاب محتمل‌ترین کلمه نباشه.گام اول؛ Beam Search و Samplingالگوریتم beam search روشیه که به شما اجازه میده در هر مرحله لزوما به محتمل‌ترین کلمه برای انجام decoding اتکا نکنید بلکه بتونید مثلا ۵ کلمه محتمل رو نگه دارید و مسیر decoding رو به ازای اون ۵ کلمه برای کلمات بعدی ادامه بدید و در حین سرچ کردن صرفا همون ۵ مسیر پراحتمال نگهداری میشه. در واقع این روش نوعی از Best First Search (BFS) برای پیمایش گرافه که با درنظر گرفتن صرفا k گزینه محتمل، تبدیل به یه الگوریتم حریصانه شده. نکته مهم در beam search، وجود یه تابع شهوده که در روش‌های decoding مرسوم که تا الان داشتیم اون تابع شهود یه تابع likelihood بود که می‌تونیم با استفاده از اون مثلا k مسیر پراحتمال رو همواره نگهداریم و به جلو بریم. در زیر می‌تونید تصویری از نحوه عملکرد beam search رو ببینید.نحوه کارکرد beam search. مسیرهایی که پررنگ‌تر هستند دارای احتمال بالاتری هستند.در این مقاله ابتدا دو روش decoding معرفی میشه که کمی متفاوت از انتخاب محتمل‌ترین کلمه در هر گامه. روش اول top-k sampling نام داره که به جای اینکه در هر مرحله محتمل‌ترین کلمه رو انتخاب کنیم، میایم و top-k محتمل‌ترین رو نگهداری می‌کنیم و با beam search میریم جلو. در این روش همچنان تابع شهود ما همون likelihood باقی میمونه. روش دوم هم استفاده از متدی به نام nucleus sampling هست. در این روش به جای اینکه در هر گام از beam search اقدام به نگهداری top-k محتمل‌ترین بکنیم، یه حد آستانه‌ی (threshold) احتمال (مثلا ۹۰ درصد) تعریف می‌کنیم و شروع به انتخاب محتمل‌ترین کلمات به صورت نزولی می‌کنیم تا اینکه مجموع احتمالات کلمات کاندید شده  به حد آستانه‌ی مورد نظر برسه.و اینک typical samplingخب تا اینجا دو روش کاندیدا برای decoding رو معرفی کردیم اما همون‌طور که در قسمت اول هم گفتیم با برخی مطالعات زبان‌شناسی به این نتیجه رسیدند که انسان موقع تکلم و یا نوشتن متن، لزوما محتمل‌ترین کلمات رو انتخاب نمی‌کنه. بلکه سعی می‌کنه ضمن اینکه کلمات محتمل رو انتخاب می‌کنه از طرفی مطلب پرتی رو هم بیان نکنه! ایده اصلی این مقاله اینه که بیایم و اون تابع شهود در beam search رو تغییر بدیم و با یه تابع جدید که بتونه این مصالحه رو برقرار کنه جایگذاری کنیم. طبق نظریه اطلاعات، میزان اطلاعاتی که یه کد میتونه منتقل کنه برابر با منفی لگاریتم احتمال اون کده. حالا برای یه رشته از کلمات هم میتونیم اطلاعات منتقل‌شده رو به صورت زیر تعریف کنیم:مقدار اطلاعات منتقل‌شده توسط یک رشته از کلماتکه در این فرمول طبق نظریه اطلاعات، مقدار I(y_t) برابر با مقدار زیره:I(y_t) = - log p(y_t|y_&lt;t)در این فرمول مقدار احتمال p که در فرمول اومده برابر با احتمال وجود کلمه y_t به ازای کلمات قبلیشه. حالا لازمه که اون پرت نبودن جمله رو هم به نوعی وارد محاسبات‌مون کنیم . در این مقاله، این قسمت با استفاده از مفهوم امید ریاضی اطلاعات منتقل‌شده توسط رشته مشخص شده. در واقع توقع داریم کلماتی رو انتخاب کنیم که مقدار مورد انتظار اطلاعات رو خیلی دستخوش تغییر نکنند و از طرفی محتمل هم باشند. این مقدار امید ریاضی طبق تعریف رسمی به صورت زیر تعریف میشه:همون‌طور که می‌بینید مقدار امید ریاضی اطلاعات منتقل‌شده در واقع همون آنتروپی شرطی p(.|y_&lt;t) است که می‌تونیم با عبارت (H(p(.|y_&lt;t) اون رو نشون بدیم. حالا برای اینکه مطلب ما به ازای یک کلمه جدید خیلی پرت نباشه باید اختلاف اطلاعات منتقل‌شده توسط اون کلمه به ازای کلمات قبلی با میانگین اطلاعات منتقل‌شده توسط کلمات قبلی، کمینه باشه. در واقع امید ریاضی اطلاعات منتقل‌شده توسط کلمات قبلی همون انتظار ما از یک جمله است که با اضافه شدن یک کلمه جدید نباید خیلی تغییر بکنه. از همینجا می‌تونیم یه تابع شهود جدید برای الگوریتم beam search در نظر بگیریم. اسم این تابع رو اپسیلون میذاریم که در زیر تعریف شده:مقدار تابع اپسیلون که همون تابع شهود جدید برای beam search میتونه باشهدر واقع ما در یک متنی که توسط انسان تولید شده، توقع داریم که مقدار اپسیلون نزدیک به صفر باشه. این یه فرضیه است که از مطالعات زبان‌شناسی گرفته شده و برای اینکه بیشتر در موردش مطمئن بشیم در این مقاله توزیع اپسیلون بر روی برخی متونی که انسان‌ها تولید کردند نیز بررسی شده که در نمودار زیر می‌تونید اون رو ببینید:توزیع تابع اپسیلون بر روی متونی که انسان‌ها تولید کردند. در سمت راست متن‌های ویکی‌پدیا مورد استفاده قرار گرفته و دو تصویر دیگه مربوط به متون داستان‌سرایی توسط انسان‌ها و متون خلاصه‌سازی abstractive توسط انسان‌ها ست.همون‌طور که در شکل بالا مشخصه توزیع اپسیلون به ازای متون مختلفی که توسط انسان‌ها تولید شده، حول صفر بیشترین مقدار رو داره و به نوعی داره صحت تابع شهود ما رو تایید می‌کنه که اپسیلون (تفاوت امید ریاضی اطلاعات انتقالی و خود اطلاعات انتقالی) بیشتر نزدیک به صفره.حالا کافیه که برای انجام روش typical sampling تابع اپسیلون رو به صورت یه تابع شهود برای beam search تعریف کنیم. تعریف این تابع رو در زیر می‌تونید ببینید:در این فرمول در واقع تابع اپسیلون رو ساده‌تر کردند و با باز کردن مقدار I(y_t) به مقدار فعلی رسیدند. شرط این تابع هم در واقع برمیگرده به این موضوع که ما سعی می‌کنیم کلماتی رو انتخاب کنیم که این تابع رو کمینه کنند و همچنین مجموع احتمال اون کلمات هم بزرگتر مساوی حد آستانه مشخصی بشه. این روش سعی می‌کنه کلماتی رو انتخاب کنه که در مدار امید ریاضی اطلاعات کل رشته باشند. در واقع سعی داره کلمات typical رو انتخاب کنه و به‌خاطر همین اسمش رو typical sampling گذاشتند.گام آخر؛ بررسی و تحلیل نتایجقبل از بررسی نتایج لازمه به یه نکته شهودی اشاره بشه. با توجه به تابع اپسیلونی که تعریف کردیم این تابع در هر مرحله از decoding سعی می‌کنه کلماتی رو که به امید ریاضی اطلاعات منتقل‌شده نزدیک‌تر هستند انتخاب کنه. حالا اگر توزیع احتمال کلمات کاندیدا رو به صورت یک توزیع نرمال در نظر بگیریم، ممکنه توزیع کلمات کاندیدا برای کلمه بعدی به یکی از صورت‌های زیر باشه:میدونیم که میانگین یا امید ریاضی به مقدار زیادی به داده‌های پرت حساس هستند. وقتی این توزیع، واریانس کمی داشته باشه (مثل توزیع صورتی رنگ) در واقع مقدار امید ریاضی احتمالات و در پی اون مقدار امید ریاضی اطلاعات هم به سمت بالا کشیده میشه. از اونجایی که گفتیم تابع اپسیلون تمایل داره کلمات نزدیک‌تر به میانگین رو انتخاب کنه در نتیجه کلماتی که واقعا احتمال بالایی دارند انتخاب خواهند شد (کلماتی که پیک احتمال رو رقم زدند) چرا که این کلمات میانگین رو به سمت خودشون کشیدند و نزدیک‌ترین کلمات به میانگین احتمالات هستند. اما اگه واریانس این توزیع زیاد باشه ( مثل توزیع آبی رنگ) امید ریاضی اطلاعات منتقل‌شده از کلمات قبلی به میانه نزدیک میشه و در نتیجه کلماتی که خیلی احتمال بالایی دارند انتخاب نخواهند شد (چون از امید ریاضی مذکور فاصله دارند) بلکه کلماتی که خیلی نزدیک به میانگین هستند انتخاب خواهند شد. به عبارتی این تابع اپسیلون به صورت خودکار مصالحه بین کلمات با احتمال بالا و عدم بیان مطالب پرت رو برقرار می‌کنه. در واقع هر وقت صرفا بین چند کلمه محدود مردد باشیم و بیشترین احتمال رو صرفا به اون کلمات بدیم و بقیه کلمات کاندیدا احتمالات بسیار کمی داشته باشند، تابع اپسیلون دقیقا همون کلماتی که بیشترین احتمال وقوع رو دارند به ما خروجی میده که از این حیث شبیه روش decoding مرسوم عمل می‌کنه. اما وقتی برای کلمه بعدی با چندین کلمه روبه‌رو باشیم که نسبت به هم خیلی احتمالات متفاوتی ندارند، تابع اپسیلون به جای خروجی دادن محتمل‌ترین کلمه، کلمه‌ای رو خروجی میده که نزدیک به امید ریاضی اطلاعات منتقل شده باشند.با توجه به اینکه سه روش برای sampling در فاز decoding مطرح کردیم (top-k, nucleus, typical) و هر کدوم یک سری هایپرپارامتر داشتند لازمه که این مقدار هم تیون بشه. با بررسی‌هایی که این مقاله انجام داده به این نتیجه رسیدند که برای روشی مثل top-k sampling بهترین مقدار k عددی حدود ۳۰ هست. یعنی در هر مرحله از decoding باید ۳۰ تا از محتمل‌ترین کلمات رو نگهداری کنیم. برای روش nucleus sampling هم بهترین حد آستانه حدود ۹۵ درصد است. یعنی باید در هر مرحله کلماتی رو نگهداری کنیم که مجموع احتمالشون بزرگتر مساوی ۹۵ درصد بشه. اما برای typical sampling اوضاع کمی فرق می‌کنه. در واقع برای typical sampling، بهترین مقدار حد آستانه (که در شرط تابع کمینه‌سازی ظاهر شده بود) برای تسک‌هایی مثل داستان‌سرایی با تسک‌هایی مثل خلاصه‌سازی مفهومی متفاوته. در واقع برای تسک‌هایی مثل داستان‌سرایی این مقدار بهینه برابر با حدودا ۲۰ درصده در حالیکه برای تسک‌هایی مثل خلاصه‌سازی حدود ۹۵ درصده. همین نکته می‌تونه یکی از نقاط ضعف این روش باشه که برای هر تسک باید این هایپرپارامتر یک بار دیگه تیون بشه. از طرفی طبق تست‌هایی که انجام شده دو روش اول متن‌های توهمی بیشتری رو تولید می‌کنند در حالیکه typical sampling از تولید متن‌های توهمی تا حد زیادی اجتناب می‌کنه و به واقعیت نزدیک‌تره. در پایان چند نمونه از متن‌های تولید شده توسط ماشین با استفاده از روش‌های بالا رو میاریم.جمع‌بندیدر این پست سعی کردیم یه نگاه جدید به تولید زبان توسط ماشین رو با محوریت توضیح مقاله typical sampling ارائه کنیم. همون‌طور که در ابتدا گفتیم این روش out of the box مساله رو بررسی کرده و مستقل از مدل‌ زبانی است که انتخاب می‌کنید. همچنین در آخر نتایج و نقاط قوت و ضعفش رو مطرح کردیم. امیدواریم مطالب برای شما مفید بوده باشه.اگه مطلب خوبی دارید که فکر می‌کنید میشه در انتشارات یا کانال اورفیت منتشر کرد تعارف نکنید و برای ما بفرستید. بدرود!منابع[1]: Typical Decoding for Natural Language Generation[2]: Predicting Pragmatic Reasoning in Language Games</description>
                <category>overfit.ir</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Mon, 11 Apr 2022 15:28:01 +0430</pubDate>
            </item>
                    <item>
                <title>داستان ترنسفورمرها (۶): داستان XLNet</title>
                <link>https://virgool.io/overfit/transformers6-xlnet-ufgmgu9rl8rs</link>
                <description>نبردی تاریخی میان مدل‌های autoregressive و autoencoder. برگرفته از فیلم The Great Battleاگر در دنیای یادگیری عمیق به خصوص در حوزه پردازش زبان طبیعی سیر و سلوک داشتید قطعا اسم برت به گوش‌تون خورده. ظهور برت یک انقلاب عظیم در حوزه پردازش زبان طبیعی بود و ما هم در قسمت چهارم از سریال داستان ترنسفورمر‌ها اون رو براتون روایت کردیم. پس از گذر از پیچ‌های تاریخی در حوزه یادگیری مدل زبانی حالا در این قسمت نوبت به XLNet رسیده. مدلی که از برت الهام گرفته و با نگاهی دیگه تونسته عملکرد برت رو تا حد خوبی بهبود بده. در واقع، مدل‌هایی مثل برت که از توکن‌های masked استفاده می‌کنند به صورت ضمنی ارتباط بین این توکن‌ها رو در نظر نمی‌گیرند و همین نکته می‌تونه باعث ضعف عملکرد مدل‌هایی مثل برت بشه. اگر نمی‌دونید سر این قصه از کجا شروع شده، به جهت آشنایی با مشکلات RNNها، مکانیزم توجه و معماری ترنسفورمرها می‌تونید قسمت‌های قبلی این سریال رو بخونید.انواع مدل‌های زبانی؛ نبرد بین autoregressive و autoencoderمدل‌های زبانی رو بر اساس نحوه pre-train می‌تونیم به دو دسته Autoregressive و Autoencoder تقسیم کنیم. مدل‌های زبانی که به صورت autoregressive پیش‌آموزش شبکه رو انجام می‌دهند، در واقع توزیع یک کلمه به ازای کلمات قبلی و یا کلمات بعدی رو حدس می‌زنند. همین یه طرفه به قاضی رفتن باعث ضعیف‌تر شدن مدل میشه. یعنی مدل‌های AR یک نگاه یه‌طرفه به مدل زبانی دارند در حالیکه مدل‌های مبتنی بر autoencoder سعی کردند به نوعی نگاه دوطرفه به مدل زبانی ایجاد کنند. مثلا مدل BERT که معرف حضور همه هست در دسته autoencoderها قرار می‌گیره. در BERT با استفاده از توکن MASK و جایگزینی اون با برخی توکن‌ها در فاز پیش‌آموزش و اجبار مدل به حدس‌زدن کلمات masked شده، در واقع به نوعی اثر نگاه دوطرفه در مدل ایجاد میشه. عملا در تسک‌های downstream در پردازش زبان طبیعی به این نگاه دوطرفه نیاز داریم. مثلا انسان‌ها در ترجمه زبان وقتی می‌خوان یه جمله رو ترجمه کنند به تمامی جمله توجه می‌کنند و ممکنه برخی از کلمات انتهای جمله زبان مبدا رو در ابتدای جمله زبان مقصد بیارند. همین نگاه باعث میشه مدل‌های autoregressive به مشکل بخورند و در ظاهر مدلی مثل BERT پیروز میدان قلمداد بشه!شکست BERT؛ XLNet برمی‌خیزداما مدل‌هایی مثل BERT هم خالی از اشکال نیستند. به عنوان ایراد اول، وقتی برخی از توکن‌ها با توکن MASK جایگزین می‌شود و مدل سعی می‌کنه این توکن‌های masked رو تشخیص بده، به صورت ضمنی ارتباط بین این توکن‌های maskشده در نظر گرفته نمیشه. در واقع مدل برت نمی‌تونه joint probability بین این توکن‌ها رو در نظر بگیره چرا که در هر لحظه به دنبال حدس‌زدن یکی از این کلمات maskشده است و عملا ممکنه در اون لحظه هنوز بخش عمده‌ای از این کلمات masked باقی مونده باشند و به صورت ضمنی فرض می‌کنه که توکن‌های maskشده از هم مستقل هستند. برای مثال جمله &quot;محمدرضا [MASK] در فیلم [MASK] بازی کرده است&quot; را در نظر بگیرید. این که مدل انتخاب کنه برای ماسک اول فروتن، گلزار یا شریفی نیا رو انتخاب کنه بر روی انتخاب هاش برای ماسک دوم نیز باید اثر بذاره.همچنین به عنوان ایراد دوم می‌تونیم به موضوع ناسازگاری بین فاز pretraining و finetuning اشاره کنیم. چرا که عملا توکنی به نام MASK در دیتای واقعی وجود نداره. به‌خاطر وجود توکن MASK عملا معماری برت پیچیده‌تر شده که هم بتونه تسک pretrain رو به‌خوبی هندل کنه و هم تسک fine tune رو. به این علت که توکن mask در دیتای فاین‌تیون وجود نداره ممکنه به خاطر همین maskکردن‌ها بخشی از اطلاعات از دست بره یا ممکنه نویز وارد فرآیند یادگیری بشه. برای حل این مشکلات XLNet وارد میدون میشه. مدلی که ذاتا autoregressive است اما با اتخاذ تکنیک permutation سعی کرده اثر نگاه یک‌طرفه در این نوع مدل‌ها رو از بین ببره از طرفی به خاطر ذات autoregressive بودنش دیگه نگران ناسازگاری بین فاز‌های pre-training  و fine tuning نیست. همچنین برای اینکه بتونه متن‌های با طول بلندتر رو هم ساپورت کنه از Transformr-XL الهام گرفته و در نتیجه نشون داده که تونسته BERT رو شکست بده. در تصویر زیر می‌تونید تفاوت XLNet و BERT رو مشاهده کنید.در این مثال فرض شده که جمله ورودی [New, York, is, a, city] است. همچنین توکن‌های هدف هم [New, york] هستند. با توجه به این مثال، مدل BERT به هر یک از کلمات New و York به صورت جداگانه نگاه می‌کنه در حالیکه مدل XLNet می‌تونه ارتباط بین New و York رو در نظر بگیره. بنابراین می‌تونه نتایج بهتری رو  با در نظر گرفتن ارتبط بین دو توکن new و york تولید کنه.مکانیزم Permutationمدل XLNet برای فاز pre-training از Permutation Language Modeling استفاده می‌کنه که همون‌طور که از اسمش پیداست ایده اصلی اون درباره جایگشت‌های متفاوت از جمله ورودیه. فرض کنید که یک جمله ورودی به شکل [x1, x2, x3, x4] داریم. در این صورت تعداد کل جایگشت‌ها برابر با ۴! یا همون ۲۴ است. فرض کنید توکنی که باید مدل اون رو حدس بزنه همون x3 باشه. تابع هدف به صورت کلی در این نوع مدل زبانی به صورت زیره:در این فرمول مقدار Z_T برابر با مجموعه کل جایگشت‌های دنباله به طول T است. همچنین x_z_t بیانگر توکن tام از جایگشت z است و x_z&lt;t برابر با تمامی توکن‌های قبل از اندیس t است.  با توجه به فرمول بالا لگاریتم احتمال رخداد توکنی که مدل باید حدس بزنه به شرط توکن‌های قبلی حساب میشه و امیدریاضی بر روی تمامی جایگشت‌ها حساب میشه. اما در عمل به دلیل اینکه تعداد جایگشت‌ها می‌تونه خیلی زیاد باشه فقط بعضی از اون‌ها به صورت رندم انتخاب می‌شوند، به صورتی که توکن هدف حتما در مجموعه جایگشت‌های انتخابی، در تمامی ایندکس‌های اول تا آخر جمله ظاهر شده باشه.جایگشت‌های مورد قبول برای حدس زدن توکن x3مکانیزم Attention Maskبا توضیحات بالا احتمالا متوجه شده باشید که پیاده‌سازی تابع هدف معرفی‌شده با استفاده از transformer یک چالش اصلی داره. فرض کنید که جمله ورودی برابر با x=[This, is, a, sentence] باشد. در این صورت مدل احتمال Pr(This|is)  را همسان با Pr(This|a) می‌تونه ببینه در حالیکه می‌دونیم پوزیشن کلمات is و a متفاوته و همین موضوع می‌تونه بر احتمال محاسبه شده تاثیر بذاره. در واقع نیاز داریم تا اطلاعات پوزیشن کلمات context (یعنی کلماتی که به شرط وجود اون‌ها احتمال کلمه هدف رو مشخص می‌کنیم) رو داشته باشیم. خوشبختانه معماری پایه ترنسفومر به صورت پیش‌فرض این مشکل رو حل می‌کنه. در این معماری اطلاعات پوزیشن توکن‌ها با بازنمایی هر توکن ترکیب می‌شه و اینطوری اثر پوزیشن هر توکن context رو می‌تونیم در محاسبه احتمال‌ها ببینیم. اما از اونجایی که در XLNet مکانیزم جایگشتی داریم پس ترتیب کلمات در جمله می‌تونه بهم بخوره. از اینجاست که دیگه مکانیزم position embedding به‌تنهایی به‌درد نمیخوره. XLNet برای پیاده‌سازی مکانیزم جایگشتی از مفهوم attention mask استفاده می‌کنه. به عبارت دیگه مدل همیشه ترتیب اصلی کلمات رو حفظ می‌کنه و فقط کلماتی رو که نباید در نظر بگیره در محاسبه بردارهای attention ازشون چشم‌پوشی می‌کنه. مثلا فرض کنید بخوایم جایگشت [a, is, sentence, This] رو به تابع هدف مدل بدیم. در این‌صورت برای حدس زدن اولین کلمه از این جایگشت (یعنی a) هیچ کانتکستی رو لازم نداریم بنابراین بردار attention mask برابر با [0,0,0,0]  خواهد بود. اگر بخوایم کلمه is رو حدس بزنیم، در جایگشت موردنظر فقط کلمه a قبل از اون اومده پس بردار attention mask برابر با [0,0,1,0] میشه. چرا که در جمله اصلی کلمه a در جایگاه سوم قرار داره. به همین شکل ماتریس attention mask ساخته می‌شه که به‌صورت زیر خواهد بود.از نگاه دیگه تابع هدف می‌تونه شامل موارد زیر باشه. در این تصویر کلماتی که در نظر گرفته نمیشه با زیرخط مشخص شده:مکانیزم Two-Stream Self-Attentionاما با توجه به توضیحات داده شده هنوز یه چالش دیگه باقی‌مونده. در واقع ما علاوه بر اینکه نیاز داریم تا اندیس توکن‌های context رو بدونیم، نیاز داریم تا اندیس توکن هدف رو هم داشته باشیم. به عبارت دیگه دنبال Pr(This|1, is+2) هستیم. اما همون‌طور که می‌دونید اینجا دیگه معماری ترنسفومر نمی‌تونه به‌ما کمکی بکنه چرا که پوزیشن کلمه This رو همراه با بازنمایی خود کلمه This ایجاد می‌کنه. به عبارت دیگه ترنسفومر اصلی مقدار Pr(This|This+1, is+2) رو برمی‌گردونه که طبیعتا ما نمی‌تونیم بازنمایی This رو داشته باشیم چرا که کلمه‌ای هست که می‌خوایم اون رو حدس بزنیم. برای این مشکل، از two-stream self-attention استفاده می‌کنیم. هر توکن در هر لایه self-attention دو تا وکتور داره. یک وکتور h که مربوط به content stream میشه و یک بردار g که مربوط به query stream است. بردارهای content stream همانند بردارهای attention عادی در شبکه ترنسفورمر هستند و با بازنمایی هر توکن به علاوه بازنمایی پوزیشن هر توکن مقداردهی اولیه می‌شوند. اما بردارهای query stream با بازنمایی یک کلمه مشخص مانند w به علاوه بازنمایی پوزیشن هر توکن مقداردهی اولیه می‌شوند. در واقع چون در بردارهای query stream صرفا از بازنمایی یک کلمه ثابت استفاده شده، اثر استفاده از توکن mask رو در برت داره. مکانیزم به‌روزرسانی هر یک از این stream ها به صورت جداگانه انجام میشه. به‌طوری که برای به‌روزرسانی h_i وکتور‌های content stream که unmasked هستند به علاوه خود h_i استفاده می‌شوند. مثلا برای به‌روزرسانی کلمه a  با توجه به جایگشتی که در قسمت قبل مثال زدیم، بردار mask به صورت [0, 0, 1, 0] استفاده می‌شود. چرا که attention mask این کلمه برابر با [0, 0, 0, 0] بود و اندیس اصلی خود این کلمه نیز ۳ است. یا مثلا برای کلمه is بردار mask به صورت [0, 1, 1, 0] خواهد بود. این پروسه از بردارهای content stream به عنوان query, key, value  استفاده می‌کند. از طرف دیگر، هر g_i با استفاده از بردارهای content vector بر اساس attention mask و خود g_i به‌روزرسانی میشه. مثلا برای به‌روزرسانی بردار g_4 که مربوط به کلمه sentence است باید content vector  دو کلمه is و a به همراه خود g_4 استفاده شود چرا که attention mask آن برابر با [0, 1, 1, 0] است. در تصویر زیر نحوه به‌روزرسانی content vector ها و query vector به ازای کلمه چهارم یعنی sentence را مشاهده می‌کنید.با توجه به توضیحات بالا، تابع هدف شامل مقادیر زیر می‌شود که در این تصویر علامت * به معنای این است که اطلاعات پوزیشن آن توکن در نظر گرفته شده است.برای اینکه این موفقیت عظیم رو بیشتر درک کنید، در زیر می‌تونید جدول مقایسه نتایج XLNet رو با BERT ببینید.یه نکته مهم اینه که علی‌رغم بهبود همه‌جانبه از سمت XLNet در تسک‌های معروف، اما قدرت این مدل نسبت به برت در تسک‌هایی که به‌نوعی generative هستند بیشتر مشهوده. درواقع شبکه برت در تسک‌های تولید زبان ضعف بیشتری از خودش نشون میده و دلیلش هم تقریبا مشخصه. چون وقتی می‌خوایم متنی رو تولید کنیم طبیعتا کلمات ماقبل رو فقط دیدیم و همین فرض باعث میشه که AR language modelها قدرت بیشتری در تسک‌های تولید زبانی داشته باشند.جمع‌بندیمدل XLNet یه روش برای پیش‌آموزش مدل زبانیه که با استفاده از permutation language modeling سعی داره هم از خوبی‌های AR language modelingها استفاده کنه و هم از AE language modelها. معماری این مدل طوری طراحی شده که با استفاده از مکانیزم Two-Stream Self-Attention بتونه بر کمبود‌های معماری استاندارد ترنسفورمر برای پیاده‌سازی این تابع هدف غلبه کنه و تونسته نتایج بهتری نسبت به BERT بر روی خیلی از تسک‌های استاندارد پردازش زبان به‌دست بیاره.منابع[1]: XLNet: Generalized Autoregressive Pretraining for Language Understanding[2]: Understanding XLNet[3]: What is XLNet and why it outperformes BERT</description>
                <category>overfit.ir</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Wed, 23 Feb 2022 18:49:33 +0330</pubDate>
            </item>
                    <item>
                <title>مدل WebGPT؛ به GPT-3 اینترنت و مرورگر دادند!</title>
                <link>https://virgool.io/overfit/papers-webgpt-a0xvwzafrj2q</link>
                <description>بسم الله الرحمن الرحیممقدمهیکی از چالش‌های اساسی در NLP، پاسخ طولانی به پرسش‌های دامنه‌بازه که مثلا مدل باید حداقل اندازه‌ی یک پاراگراف به یک سوال با هر موضوعی پاسخ بده و خب اگر مدل خوب عمل کنه، می‌تونه باعث بشه مردم با مراجعه به این مدل‌ها و پرسیدن سوالشون کلی چیز جدید یاد بگیرند. اما هنوز مدل‌های هوشی ضعیف‌تر از آدم‌ها عمل می‌کنند. مدل‌های قبلی در این مسئله عمدتا از دو بخش بازیابی اطلاعات و ترکیب تشکیل شده بودند. حالا شرکت OpenAI در مقاله‌ای به نام WebGPT: Browser-assisted question-answering with human feedback، مدلی به نام WebGPT داده و به این مسئله به شکل جدیدی حمله کرده؛ بخش بازیابی اطلاعات رو با استفاده از API موتور جستجوی بینگ شرکت مایکروسافت ردیف کرده و قسمت ترکیب رو هم با استفاده از مدل هیولایی GPT-3 پیش برده!!! در این پست خلاصه‌ای از نحوه‌ی کار و نتایج این مدل رو بررسی می‌کنیم.حالا بات‌ها هم برای پاسخ به سوالاتشان در اینترنت جستجو می‌کنندتوضیح مدلشرکت OpenAI با یه تیم متشکل از یه نیسان آدم اومده GPT-3 رو فاین‌تیون کرده تا بتونه سوال‌های دامنه‌باز رو با استفاده از یک مرورگر (browser) پاسخ بده! یعنی واقعا یه مرورگر تکستی درست کردند و دادند دست مدل GPT-3 که با بینگ (موتور جستجوی مایکروسافت) سرچ کنه و جواب رو تولید کنه. مدل رو با استفاده از imitation learning (در خیلی از مسائل یادگیری تقویتی با شرایطی مواجه می‌شیم که یا تابع پاداش بسیار تنک (sparse) است و در انتهای چند گام به ما داده میشه یا این که تعریف مشخصی از تابع پاداش وجود نداره مثل رانندگی ماشین خودران. در این شرایط یک تکنیک به نام imitation learning وجود داره که در اون به جای این که عامل از روی تابع پاداش تنک سیاست رو یاد بگیره، سناریو‌های اجرا شده به وسیله متخصص اون کار رو به عامل نشون میدیم و عامل بایستی سعی کنه به وسیله تقلید کارهای اون متخصص سیاست بهینه رو یاد بگیره) و روی ترکیب دادگان ELI5 و TriviaQA آموزش دادند تا مدل یاد بگیره که چجوری باید سوال رو توی اینترنت سرچ کنه، پارگراف‌های مناسب رو انتخاب کنه و به اون پاراگراف هم ارجاع بده! به مدل در هر مرحله، یک سوال و state مرورگر داده میشه و مدل هم بایستی یک سری کامند مثل search و qoute و find in page و …. رو وارد کنه. بعد که اینجوری متن جمع می‌کنه، باهاش متن جواب رو تولید می‌کنه (نه اینکه فقط چند تا پاراگراف رو به هم بچسبونه). این مدل برای پاسخ‌هایی که تولید می‌کنه از انسان بازخورد هم میگیره و تونسته در بعضی جاها از انسان هم بهتر عمل کنه. تاکید میکنیم که واقعا یاد میگیره که خودش بگرده توی سایت‌ها و جواب رو تولید کنه و تحویل بده. نمونه‌ی نحوه‌ی جمع‌آوری داده و پاسخ به سوال مدل هم در این ویدیوئیه که در ادامه آوردیم. می‌تونید ببینید مدل برای پاسخ به سوال «شکسپیر چه وقت رمان‌های هری پاتر رو نوشت؟» چی سرچ میکنه و در نهایت چه جوابی میده. با این مدل سعی کردند میزان «دقت حقیقت‌گویی» (factual accuracy) مدل زبانی رو افزایش بدهند. البته از چهار روش برای آموزش مدل استفاده کردند که توضیح مختصری از هر کدوم رو می‌تونید در خود مقاله در بخش 3.2 بخونید. https://aparat.com/v/uOk1h ارزیابی مدلمدل رو اومدند در چند بخش ارزیابی کردند: اول دیتاست ELI5  که سوالاتیه که ملت در subreddit با عنوان Explain Like I’m Five پرسیده بودند. جواب‌هایی که مدل داده در ۵۶ درصد مواقع بهتر از جواب انسان بوده!!نتایج مدل WebGPT روی دیتاست ELI5  دوم اومدند میزان موثق و مفید بودن مدل رو با استفاده از معیار مقاله‌ی TruthfulQA سنجیدند و در این بخش، مدل از مدل‌های برپایه‌ی GPT-3 قبلی بهتر عمل کرده ولی هنوز با مدل انسانی فاصله داره که نویسندگان، دلیلش رو آوردن جواب از بعضی لینک‌های غیرعلمی و غیرقابل اعتماد می‌دونند و مشکل رو پیدا کردند و گفتند سعی می‌کنیم با تکنیک‌های adversarial training این رو حل کنیم!نتایج مدل WebGPT روی دیتاست TruthfulQAبعد هم اومدند میزان حقیقت پاسخ‌های مدل رو ارزیابی کردند. آدم‌های ارزیاب، پاسخ‌های خیلی فنی و مبهم رو هم با استفاده از میزان موثق بودن لینک‌های منابع ارزیابی کردند. مدل هنوز در این قسمت مشکلات پایه‌ای داره (در ادامه چندتاشو هم آوردیم) و مشکل بعدی هم اینه که با این روش ارزیابی، مدل بعد از یه مدت یاد میگیره لینک‌هایی که آدم‌ها (که مدل داره ازشون فیدبک میگیره) دوست دارند رو به عنوان منبع بذاره. برای حل این یکی مشکل هم گفتند از روش Debate که در یک مقاله دیگه مطرحش کردند قراره استفاده کنند (این روش رو هم انشاءالله در پستی دیگر توضیح خواهیم داد).بررسی عملکرد مدل با مثال‌های مختلفمدل پاسخ خوبی به سوالاتی که توی اینترنت واقعا جوابشون هست میده. مثل سوال «شبکه‌های عصبی چجوری کار می‌کنند؟» یا «قطارها چجوری دور می‌زنند؟»چون که GPT-3 رو یک سال پیش train کردند، اینکه به مدل دسترسی به اینترنت رو دادند  تا باهاش به سوالات جواب بده، باعث میشه به سوالات جدید هم پاسخ به‌روز بده. مثل سوال «چرا کانال سوئز در مارس ۲۰۲۱ بسته شد؟»مدل به خوبی می‌تونه از چندین منبع پاسخ‌ها رو ترکیب کنه اما گاهی اشتباه می‌کنه. مثلا برای سوال «ارباب حلقه‌ها تعداد کلمات بیشتری داره یا  هری پاتر؟» که در پاسخ گفته ارباب حلقه‌ها اما اعدادی که از دو منبع آورده نشون میده هری پاتر بیشتره.مدل معمولا فرض غلط سوال رو زیر سوال نمیبره. مثلا اگر بپرسند «چرا همه قایق‌ها سفیدند؟» میره جواب این سوال رو پیدا می‌کنه. ازش بپرسند «چرا همه قایق‌ها صورتی‌اند؟» هم میره جوابش رو پیدا می‌کنه و در جواب نمیگه «مشتی اصلا کلا قایق‌ها یک رنگ نیستند که!!»مدل سوالات و پاسخ‌های درپیتی و خرافی رو نمی‌تونه تشخیص بده. مثلا ازش پرسیدند «چی میشه اگر از زیر یه نردبان رد بشیم؟» مدل توضیح میده که باعث بدشانسی میشه و ریشه‌اش فلانه. در صورتی که انتظار میره حداقل اولش بگه هیچی نمیشه ولی مثلا فلان ملت این اعتقاد رو داشتند که باعث بدشانسی میشه. یا مثلا سوال «با چه ابزارهایی میشه ارواح رو پیدا کرد؟» مدل رفته از کلی لینک کج و کوله جواب آورده.از مدل وقتی سوالات بی‌معنی می‌پرسند، چرت و پرت جواب میده و هنوز نمیتونه سوال چرت رو خوب تشخیص بده. مثلا ازش میپرسند «?What» شروع میکنه یک سری چیزا راجع به افزایش فشار برق و تاثیرش در لوازم الکتریکی صحبت می‌کنهه!وقتی از مدل سوالاتی می‌پرسند که توی اینترنت جواب مستقیمش نیست، شروع میکنه فقط یه سری مطالب مرتبط ولی حاشیه‌ای می‌نویسه مثل دانشجویی که جواب خود سوال رو بلد نیست. مثلا سوال «عدد پی به توان عدد پی چی میشه؟» یا سوال «۵۱+۳۷ چی میشه؟»مدل گاهی غلط موجود در سوال رو هم تشخیص میده. مثلا پرسیدند شکسپیر چه زمانی رمان‌های هری پاتر رو نوشته؟ مدل گفته اولا رولینگ نوشته. در فلان سال‌ها هم نوشته.پ.ن. در آخر ترکیب تیم رو در بخش Author contributions مقاله ببینیم تا ببینیم با کار تیمیه که میشه به همچین نتایجی رسید. هوشی‌ها و نرم‌افزاری‌های تیم به کنار؛ سه نفر زیرساخت راه انداختند و دو نفر امنیت شبکه و کامپیوترها رو برعهده داشتند!!اعضای تیم مقاله WebGPTنتیجه‌گیریدر این پست ما رویکرد جدید مدل WebGPT از شرکت OpenAI و نتایجش رو به صورت خلاصه و مفید بررسی کردیم. اگر می‌خواهید ته قضیه رو دربیارید این دو لینک رو دریابید:لینک بلاگ توضیح مقاله:https://openai.com/blog/improving-factual-accuracy/لینک خود مقاله:https://arxiv.org/abs/2112.09332خوشحال میشیم شما رو هم در کانال تلگرام nlp_stuff ببینیم و اگر پست یا نوشته‌ی خوبی داشتید ندا بدید تا در کانال و انتشارات بگذاریم.</description>
                <category>overfit.ir</category>
                <author>علی اکبر بدری</author>
                <pubDate>Wed, 05 Jan 2022 09:22:41 +0330</pubDate>
            </item>
                    <item>
                <title>داستان ترنسفورمرها (۵): سریع و سبک، گلاب‌گیری از برت با دیستیل‌برت</title>
                <link>https://virgool.io/overfit/transformers5-distilbert-smwuod8mlb9p</link>
                <description>به نام خداوند بخشنده مهرباناگر اینجایید و آماده خوندن این پست، به احتمال ۹۹ درصد اسم برت به گوشتون خورده (اگر هم که نه میتونید به این پست ما درباره برت مراجعه کنید!). برت قوی و قدرتمنده و به وسیله فاین-تیون در مسائل مختلف پردازش زبانی امتیازات بالایی رو می‌تونه به‌دست بیاره. اما بخشی از این قدرت برت به واسطه انعطاف‌پذیری و تعداد بالای پارامتر برته. نسخه Bert-Base با داشتن ۱۲ لایه حدود ۱۱۰ میلیون پارامتر داره. داشتن این تعداد پارامتر یعنی این که شما برای فاین-تیون کردن یا حتی استفاده و خروجی گرفتن از برت نیازمند رم بسیار بالایی باید باشید. حالا اگر امکانات سخت افزاری برای فاین-تیون کردن نداشته باشید یا حتی اگر این رو هم دارید ولی بعد از تنظیم برت، می‌خواید مدلتون رو به هنگام استفاده روی سخت‌افزار‌های سبکی نظیر گوشی همراه اجرا کنید؛ با یک چالش بزرگ مواجه خواهید بود. در این پست می‌خوایم یک پاسخ به این چالش یعنی تکنیک distillation و حاصل انجام این تکنیک بر مدل برت، یعنی مدل distilbert رو معرفی کنیم.توی distillation مدل کوچکتر سعی می‌کنه تا از یک مدل‌ بزرگتر دانش فرا بگیره. هر که بامش بیش، برفش بیشتربا راه افتادن نهضت انتقال یادگیری در پردازش زبان، سلسله‌ای از مدل‌های زبانی از‌پیش‌آموزش‌دیده مختلف نظیر Bert و GPT و XLNet و ... هم پا به عرصه گذاشتند. این مدل‌ها با این که توانایی بالایی در حل مسائل دارند اما خب به واسطه اندازه غول آسا، گرفتاری‌هایی رو هم در عمل ایجاد می‌کنند. اولین مشکل اینه که این مدل‌ها انرژی الکتریکی زیادی رو مصرف می‌کنند و در نتیجه باعث انتشار گازهای گلخانه‌ای بیشتر و آسیب به محیط‌ زیست می‌شوند (شاید مسخره به نظر بیاد ولی یک عده دانشمند یادگیری ماشین در دنیا هستند که این براشون مساله است و حتی به صورت مقاله و کارگاه در کنفرانس‌های مطرح یادگیری ماشین این موضوع مورد بررسی قرار می‌گیره. غیرقابل باوره ولی واقعا این چیزها اهمیت زیادی اون ور آب‌ها داره گویا). از محیط زیست که بگذریم مشکلاتی که برای ما ملموس‌تره نیاز به حافظه و انرژی بیشتر این مدل‌هاست که این نیاز توی مواردی که مجبوریم مدلمون رو روی یک سخت‌افزار سبک مثل موبایل اجرا کنیم حادتر هم میشه. از حافظه و انرژی گرانتر اما زمان است. حتی اگر مشکلات حافظه و انرژی رو حل کنیم برامون خیلی مهمه که بتونیم سریعتر از مدلمون خروجی بگیریم. مدل‌های از‌پیش‌آموزش‌دیده بزرگ به خاطر تعداد لایه و پارامتری که دارند زمان قابل توجهی رو از ما می‌گیرند. هر چه قدر بتونیم این مدت زمان رو کاهش بدیم نفع بیشتری می‌بریم. اما چاره چیه؟ در قسمت بعدی می‌خوایم تکنیکی رو نشون بدیم که مدل ۴۰ درصد کوچکتر میشه ولی همچنان همون عملکرد باکیفیت سابق رو به ما ارائه میده، ضمن این که سرعت جوابدهی‌اش هم ۶۰ درصد افزایش پیدا می‌کنه.عصاره‌گیری از دانشقدمت تکنیک عصاره‌گیری از دانش یا &quot;knowledge distillation&quot; از قدمت ترنسفورمر‌ها بیشتره. تعریف فنی این تکنیک اینه که یک روش فشرده‌سازیه که یک مدل کوچکتر (که بهش میگیم مدل دانش‌آموز) طوری آموزش می‌بینه که بتونه رفتار یک مدل بزرگتر (که بهش می‌گیم مدل معلم) رو ارائه بده. در حالت عادی یادگیری بانظارت، یک مدل جوری آموزش می‌بینه که برای هر نمونه ورودی بتونه احتمال تخمین‌زده‌اش از برچسب اون نمونه رو بیشینه کنه. این امر از طریق کمینه‌سازی تابع هزیه cross-entropy بین توزیع پیش‌بینی شده مدل و توزیع تک-فعال (همون one hot) برچسب‌ نمونه‌ها به‌دست میاد.حالا با این توضیح در سناریوی distillation یادآوری می‌کنیم که ما دنبال آموزش مدل دانش‌آموز بر روی رفتار مدل معلم هستیم یا به قول بهتر دنبال یادگیری نحوه تصمیم‌گیری مدل معلم هستیم. بر این اساس تابع loss زیر رو در نظر می‌گیریم:در فرمول بالا t بیانگر توزیع تخمین‌زده شده توسط مدل معلم و s هم بیانگر توزیع تخمین زده شده توسط مدل دانش‌‌آموز است. ما دنبال آموزش مدل دانش‌آموز به طریقی هستیم که حاصل تابع هزینه بالا کمتر بشه. (دقت کنید یعنی اون t ثابت فرض میشه و ما در واقع دنبال بهینه‌سازی s هستیم). اندیس i ای هم که در سیگما می‌بینید برای مشخص کردن جمع زدن روی تمام نمونه‌هایی هست که براشون تصمیم و توزیع احتمال تولید میشه.یک نکته جالبی هم این که جا داره اینه که معمولا در موقع آموزش شبکه دانش‌آموز، یک softmax-temperature روی احتمالات t و s اعمال می‌کنیم. حالا در واقع این عملیات، توزیع رو نرم می‌کنه و مانع از اورفیت‌‌شدن مدل دانش آموز بر مدل معلم می‌شه و از طرفی یادگیری رو هم پایدارتر میکنه. حالا به زبان ریاضی‌تر softmax-temperature برای یک توزیع احتمالی z به صورت زیر تعریف میشه:در این رابطه هر چه قدر T بیشتر باشه توزیع نرم‌تر میشه. این T صرفا در هنگام آموزش اعمال میشه و در هنگام تست شبکه مقدارش یک گذاشته میشه تا softmax استاندارد داشته باشیم. در نهایت به هنگام آموزش یک مدل دانش‌‌آموز تابع هزینه کلی برابر است با تابع هزینه distillation به علاوه تابع هزینه حالت نظارتی خود مساله اصلی. به بیان بهتر، فرض کنید شما یک مساله دسته‌بندی تصاویر و یک مدل دسته‌بند تصاویر معلم دارید و می‌خواید یک مدل کوچکتر دانش‌آموز رو برای این مساله با تکنیک distillation به‌دست بیارید. شما نمونه‌های دیتاست تصاویر رو به مدل معلم می‌دید و احتمالات خروجی از اون دریافت می‌کنید. حالا مدل دانش‌آموز رو همزمان هم روی خود مساله دسته‌بندی تصاویر با تابع loss سوپروایزد آموزش می دهید و هم این که به احتمالات تولید شده توسط مدل معلم هم دقت می‌کنیم و مدل دانش‌آموز رو با تابع distillation loss هم آموزش میدهیم. یک تابع loss سومی هم وجود داره که آزمایشات نشون داده کیفیت کار رو بالاتر میبره و اون هم در نظر گرفتن فاصله کسینوسی بین بازنمایی‌های تولیدشده توسط مدل‌ معلم و مدل دانش‌آموزه. به این معنا که هر چه قدر فاصله بازنمایی‌های مدل معلم و دانش‌آموز بیشتر باشه دانش‌آموز جریمه میشه و بایستی جوری آموزش ببینه که بازنمایی‌هاش هم شبیه معلم دربیاد. مجموع این سه تابع هزینه‌ای که توضیح دادیم (تابع loss خود تسک + تابع distillation loss + loss فاصله کسینوسی بین بازنمایی‌ها ) برای ما چارچوب distillation رو می‌سازند.مدل DistilBERTدر قسمت قبل نحوه استفاده از تکنیک distillation برای آموزش یک مدل دانش‌آموز از مدل معلم رو توضیح دادیم حالا سراغ انجام این تکنیک بر روی برت ‌میریم. طبق تعریف مساله، ما یک مدل Bertآموزش‌دیدهه داریم که بزرگه (۱۲ لایه یا ۲۴ لایه میتونه باشه) و در نفش مدل معلم میخوایم ازش استفاده کنیم. یک مدلی به نام Distilbert هم قراره داشته باشیم که کوچکتره و در نقش مدل دانش‌آموز قراره از تجربیات Bert استفاده کنه. طبق توضیحات قسمت قبل، مدل Distilbert رو باید بر روی سه تابع loss مذکور آموزش بدیم. یک دیتاست متنی (مشابه آن چه که برت بر رویش آموزش میبینه) رو در نظر می‌گیریم و تسک MLM (مدل زبانی ماسک‌شده) رو هم به عنوان تسک بانظارت انتخاب می‌کنیم. برای هر نمونه از این دیتاست آموزش، ما اون رو به شبکه های Bert و DistilBert میدیم و بازنمایی‌های لایه آخر و توزیع احتمال‌های تخمینی برای کلمات ماسک شده توسط دو شبکه معلم و دانش‌آموز رو به دست میاریم. حالا با این اطلاعات، سه تابع lossی که قسمت قبل توضیح دادیم رو حساب می‌کنیم و مدل رو روی مجموع این سه تابع هزینه سعی می‌کنیم آموزش بدیم. آموزش که تموم شد تبریک عرض می‌کنیم. مدل DistilBert شما آماده است! حالا می‌تونیم از این مدل به عنوان یک مدل از‌پیش‌آموزش‌دیده مثل برت استفاده کنیم.حالا برای مقایسه و این که چه قدر این DistilBert خوبه می‌تونیم جداول زیر رو بررسی کنیم:دقت کنید دیستیل‌برت شش لایه داره و برت هم دوازده لایه. همانطور که مشاهده می‌کنید، تعداد پارامتر‌هاش به همین علت ۰.۶ برابر تعداد پارامتر‌های برت هست. این تعداد کمتر لایه‌ها و پارامتر‌ها متقابلا باعث می‌شه زمان پاسخ‌گویی این مدل هم نسبت به برت ۴۰ درصد کمتر باشه. اما علی‌رغم تمامی این فشرده‌سازی‌ها همانطور که در جدول اول می‌بینید، دیستیل برت تونسته به ۹۷ درصد امتیاز و کیفیت برت در تسک‌های مختلف دست پیدا کنه (دقت کنید که دیستیل‌برت یک شبکه از‌پیش‌آموزش‌دیده مثل برت هست پس وقتی می‌خوایم ازش در یک تسک استفاده کنیم مثل برت میایم و اون رو روی دادگان اون تسک فاین-تیون می‌کنیم)جمع‌بندیدر این پست، داستان رو اول از سختی‌های فاین-تیون و استفاده کردن از برت شروع کردیم. بعدش تکنیک distillation رو توضیح دادیم که به کمک اون می‌تونیم دانش یک شبکه بزرگ با عنوان شبکه معلم رو در یک شبکه کوچکتر با عنوان شبکه دانش‌آموز تزریق کنیم. در آخر هم یکی از مدل‌های مورد اقبال پردازش زبان یعنی دیستیل‌برت رو که حاصل انجام Distillation بر روی مدل برت هست معرفی کردیم و نشون دادیم که با وجود کاهش حجمش نسبت به برت، اما بالای ۹۵ درصد عملکرد برت رو تونسته حفظ کنه. طبیعتا اگر سخت افزار خوبی ندارید که بتونید باهاش برت رو بر روی مساله موردنظرتون فاین-تیون کنید، گزینه بعدی می‌تونه استفاده از مدل Distilbert باشه.در تلگرام می‌تونید دنبالمون کنید و اگر هم متن خوبی در حوزه‌ی هوش مصنوعی و پردازش زبان طبیعی داشتید که در انتشارات یا کانال بگذاریم، از همون‌جا ندا بدید.</description>
                <category>overfit.ir</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Wed, 22 Dec 2021 18:44:08 +0330</pubDate>
            </item>
                    <item>
                <title>داستان ترنسفورمرها (۴): داستان برت</title>
                <link>https://virgool.io/overfit/transformers4-bert-c6ah7xv69vjj</link>
                <description>به نام خداوند بخشنده مهرباناگر سر و کارتون با یادگیری عمیقه و به طور خاص علاقه‌مند به حوزه پردازش زبان هستید، قطعا نام پرآوازه &quot;برت&quot; به گوشتون خورده. تولد برت باعث انقلابی عظیم در حل مسائل زبانی شد و دونستن ساز و کارش بر هر محقق و مهندس پردازش زبان واجب عینی است. ما در انتشارات اورفیت در یک رشته پست تحت عنوان «داستان ترنسفورمرها»، ماجرای چرایی به وجود آمدن مکانیزم توجه و معماری ترنسفورمر‌ها رو بیان کردیم. اگر با معماری ترنسفورمرها و توجه آشنایی ندارید میتونید خیلی مختصر و مفید سه پست قبلی رو بخونید و زودی برگردید همینجا. حالا بعد از حکایت مشکلات RNNها و ظهور مکانیزم توجه و معماری ترنسفورمری نوبت داستان برته.واژه bert مخفف bidirectional encoder representation from transformers هست که به شخصیت برت در مجموعه عروسکی ماپت‌ها نیز تلمیح داره!نهضت انتقال یادگیری در پردازش زبانبا این که برت یک مدل با معماری ترنسفورمری است اما داستان رو میخوایم چند سال قبلتر از ۲۰۱۷ یعنی تولد ترنسفورمرها شروع کنیم. داستان از ۲۰۱۲ شروع میشه. در اون زمان شبکه های عمیق با معماری کانولوشنی در حوزه تصویر تازه ترکونده بودند. اما مشکل اساسی که وجود داشت این بود که به ازای هر تسک و مساله محققین مجبور بودند که یک شبکه عمیق رو از نو بر دادگان آموزشی اون مساله تعلیم بدهند. این قضیه هم وقتگیر بود و هم این که در خیلی اوقات به واسطه کمبود تعداد داده آموزشی برای مسائل کمتر مطرح، ناممکن بود. اینجا بود که یک ایده به ذهن محققین پردازش تصویر رسید و اون این بود که چطوره که بیایم شبکه های عمیق با ظرفیت بالا (معادل تعداد پارامتر زیاد) رو با تسک تشخیص کلاس تصویر و بر روی دادگان عظیم مثل ImageNet آموزش بدهیم و سپس در مسائل جدید از این شبکه‌ها به عنوان یک نقطه شروع استفاده کنیم و صرفا وزن‌های این شبکه های از پیش آموزش دیده رو تنظیم یا به اصطلاح Fine-Tune کنیم. این ایده در عمل هم موفقیت آمیز بود و باعث پیدایش شبکه‌هایی نظیر VGG و AlexNet و بعدها ResNet شد. به بیانی دیگر این شبکه‌ها به واسطه ظرفیت بالا و البته تعداد دادگان آموزشی زیاد که روی آن‌ها پیش‌تعلیم می‌دیدند میتونستند بازنمایی از تصویر به دست بیارند که در روند حل مسائل تصویری دیگه نیز بشه از اونها استفاده کرد و به اصطلاح یادگیری رو انتقال داد. اما از اونجایی که در پردازش متن دیتاست عظیمی همچون ImageNet وجود نداشت و جمع آوریش هم کار سختی بود داستان به نحو دیگه ای پیش رفت. در سال ۲۰۱۳ مدل معروف word2vec ابداع شد. این مدل یک شبکه عصبی با یک لایه نهان بود که وظیفه داشت با ورودی گرفتن یک کلمه، کلمات اطراف اون رو پیش بینی کنه (چیزی هم که زیاده متن و دنباله کلمات، فلذا نیازی به ساختن دیتاست عظیمی مثل ImageNet برای متن نیست). پس از پیش‌آموزش روی این تسک، بازنمایی لایه نهان شبکه w2v به عنوان یک بازنمایی معنایی از کلمه میتونست در وظایف مختلف پردازش زبان مورد استفاده قرار بگیره. در واقع ارزش اصلی w2v هم همین بود که میتونست کلماتی رو که قبل از اون به صورت بردارهای تک فعال (one-hot) با سایز بالا مدل می‌شدند رو به صورت یک بردار با سایز کوچکتر و البته روابط معنایی غنی، ارائه کنه. استفاده از بازنمایی w2v در شبکه‌های عصبی متنی باعث شد تا عملکرد و امتیاز این مدل‌ها جهش جالب توجهی رو تجربه کنه. اما از اونجایی که کسی از جنبه یادگیری انتقالی به w2v نگاه نکرد، مساله انتقال یادگیری در پردازش زبان چند سال به خواب عمیقی رفت تا این که در سال ۲۰۱۸ مدل ELMO منتشر شد. نکته ماجرا این جا بود که از اونجایی که شبکه‌نظیر w2v برای هر کلمه یک بردار بازنمایی تولید میکردند، وجود کلماتی مثل &quot;شیر&quot; که چند معنی دارند محققین رو به این فکر انداخت که بردار بازنمایی یک کلمه باید تابعی از محتوایی که آن کلمه در آن قرار گرفته نیز باشه. برای مثال بازنمایی کلمه شیر در دو عبارت &quot;من شیر را خوردم&quot; و یا &quot;شیر سلطان جنگل است&quot; باید متفاوت باشه و تابعی از جمله باشه. از طرفی در طی این چند سال معماری‌های LSTM ای هم رونق گرفته بودند. اینجا بود که ELMO متولد شد. به طور مختصر مدل ELMO از دو شبکه LSTM چندلایه تشکیل شده که یکی از اونها تسک مدل زبانی (Language Model) را از سمت چپ دیگری نیز تسک مدل زبانی را از سمت راست روی دادگان متنی آموزش می‌بینند. ( تسک مدل زبانی یک از مسائل پایه ای اصلی پردازش زبانه، به این معنا که با دیدن یک سری کلمات از جمله بتونید بگید که کلمه بعدی چه میتونه باشه. برای مثال یعنی با دیدن &quot;من تو را دوست .......&quot; بتونید بگید که در جای خالی باید کلمه دارم قرار بگیره. در واقع توی w2v شما بایستی یک کلمه رو به شرط داشتن یک کلمه دیگر پیش بینی می‌کردید ولی اینجا باید یک کلمه رو با فرض داشتن یک عبارت پیش بینی کنید). مدل elmo در ابتدا با تسک مدل زبانی پیش آموزش میبینه و در مرحله بعدی وقتی که بخواهند از این شبکه به عنوان نقطه شروع یا شبکه استخراج کننده ویژگی از کلمات برای یک تسک دیگه استفاده کنند، ترکیب خطی بازنمایی کلمات از لایه‌های مختلف هر دو LSTM رو به عنوان بردار ویژگی آن کلمه در نظر می‌گیرند. نکته تاکتیکی ماجرا در w2v و مخصوصا elmo این بود که محققین پردازش زبان تونستند معادل و جایگزین تسک دسته‌بندی تصاویر و دیتاست ImageNet رو در دنیای متن هم پیدا کنند. تسک مدل زبانی به عنوان وظیفه مرحله پیش آموزش و دادگان متنی خام که همه جا فراوان ریخته (از جمله اینترنت) به عنوان دیتاست به کار رفته اند. نمایی از معماری مدل elmoبا کمک elmo میزان امتیاز مدل های عصبی در وظایف متنی نظیر دسته بندی متون و تشخیص موجودیت‌های نامدار و ... دچار جهش قابل توجهی شدند و elmo یک شمع انقلابی نورانی رو در ظلمات شب پردازش متن روشن کرد. همه چیز به نظر برای المو رویایی بود اما از بخت بدش این قضایا با تولد معماری ترنسفورمری همزمان شد. شب وصلش دیر نپایید و آفتاب برت شمع elmo را خاموش کرد. این روزها کمتر کسی از elmo یاد میکنه و خیلی به ندرت ازش استفاده میشه ولی شما به یاد داشته باشید که شمع اول پارادایم مدل‌های زبانی نظیر Bert و GPT توسط این بنده خدا روشن شده.اگر میخواید بدونید مرحوم المو چه شکلی بودهبرتبعد از ارائه معماری ترنسفورمری، توجهات زیادی به این معماری جلب شد و در اغلب مسائل مهاجرت از معماری‌های بازگشتی به معماری‌های نو شکل گرفت. طبعا این مهاجرت‌ها محققین را به این فکر انداخت که مدلی با معماری ترنسفورمری و با کارکردی مشابه المو ارائه دهند. این ایده سرانجام منجر به انتشار مدل برت در ۲۰۱۸ شد. مدل برت از لحاظ ساختاری یک ترنسفورمری است که تنها قسمت انکودر را دارد و فاقد قسمت دیکودر است. برای یادآوری همانطور که میدانید (اگر قسمت های قبلی پست‌ها رو خونده باشید حتما می‌دانید) انکودر ترنسفورمر یک دنباله به طول N توکن را گرفته و در خروجی خود برای هر یک از این توکن‌ها یک بردار ویژگی تولید میکند، یعنی مثلا اگر سایز بردارهای ویژگی d باشد در خروجی دیکودر N تا بردار با سایز d خواهیم داشت. هدف کارکردی برت مشابه المو به دست آوردن یک بازنمایی معنایی قوی به وسیله آموزش روی دادگان فراوان متنی بدون برچسب است. دو تفاوتی که معماری برت را از المو متمایز میکند و به آن برتری می‌بخشند را می‌توان اولا در سرعت بالاتر و آموزش سریع تر و راحت تر شبکه ترنسفورمری نسبت به بازگشتی دانست (موازی سازی در ترنسفورمر بیشتر است و دیگر شاهد ساختار بازگشتی نیستیم) و ثانیا امکان توجه توامان دوطرفه در هر کلمه نسبت به محتوای چپ و راست خود دید. به بیان بهتر در برت بردار بازنمایی یک کلمه میتواند همزمان به کلمات سمت چپ و راست خود توجه کند، در حالی که ما در المو با دو شبکه بازگشتی مواجه هستیم که هر یک به طور غیر توام توجه بردار بازنمایی کلمه را به سمت چپ و راست معطوف می‌کنند. نکته مهم دیگر در مورد برت سایز بزرگ آن است. برت در دو سایز Base و Large ارائه شده است که سایز Base آن دارای ۱۲ لایه در پشته انکودر خود و سایز Large نیز دارای ۲۴ لایه در پشته دیکودر خود است. اندازه بردارهای بازنمایی خروجی برای هر کلمه توسط این دو سایز نیز به ترتیب ۷۶۸ و ۱۰۲۴ است. در نهایت تعداد پارامترهای این دو سایز از برت به ترتیب ۱۱۰ میلیون و ۳۴۰ میلیون پارامتر است.  دو نکته مهم در مورد برت چگونگی پیش آموزش این شبکه و تنظیم و به اصطلاح فاین تیون آن روی وظایف مختلف پردازش زبان است که در قسمت بعدی آن‌ها را بررسی میکنیم. نحوه پیش‌آموزش برتبرت برای پیش آموزش خود سعی میکند تا دو تسک مدل زبانی ماسک‌شده (Masked Language Model) و تشخیص جمله بعدی را یاد بگیرد. در مساله مدل زبانی ماسک‌شده هدف این است که توزیع احتمال یک کلمه از روی کلمات قبل و بعدش یادگرفته شود. با توجه به معماری برت در امکان توجه توامان به چپ و راست، این تسک بیشترین استفاده را از پتانسیل این معماری میکند. در هنگام پیش‌ آموزش برت با تسک مدل زبانی ماسک‌شده، به تصادف به جای پانزده درصد از توکن‌های دنباله، توکن MASK قرار می‌گیرد. برای مثال جمله &quot;رنگ آسمان آبی است&quot; به &quot;رنگ آسمان MASK است&quot; تغییر پیدا میکند. این جمله تغییریافته به برت به عنوان ورودی داده می‌شود و برت برای هر کدام از چهار کلمه یک بردار بازنمایی با سایز مثالی ۷۶۸ تولید میکند. حال بر روی بردار بازنمایی مربوط به کلمه MASK یک لایه شبکه عصبی قرار می‌گیرد که تسک آن پیش‌بینی توزیع احتمال کلمات محتمل به جای MASK است. (فرض کنیم سایز دیکشنری کلمات برت ۳۰۰۰۰ باشد در این صورت اندازه این لایه بایستی ۷۶۸ به ۳۰۰۰۰ باشد. در واقع این لایه در خروجی خود توزیع احتمال بین تمامی کلمات ممکن در دیکشنری را تولید می‌کند)پیش آموزش روی تسک مدل زبانی ماسک‌شده به برت کمک می‌کند تا برای هر کلمه بازنمایی موثری پیدا کند. اما برت برای انجام برخی وظایف پردازش زبان نیاز به ارائه بازنمایی مناسب در سطح جملات و کشف روابط بین جملات نیز دارد. برای نیل به این هدف برت بر روی تسک تشخیص جمله بعدی نیز پیش آموزش می‌بیند. نحوه طرح این تسک به این صورت است که جمله فرضی A از دیتاست متن‌های بدون برچسب انتخاب میشود. سپس  به احتمال ۵۰ درصد جمله پس از A در دیتاست به عنوان جمله B انتخاب می‌شود و یا به احتمال ۵۰ درصد یک جمله تصادفی دیگر به عنوان جمله B انتخاب می‌شود. حال مدل برت با ورودی گرفتن جملات A و B بایستی تشخیص بدهد و یادبگیرد که آیا جمله B پس از A آمده است و متوالی بوده‌اند و یا خیر.ابتکار دیگر برت اضافه کردن توکن‌های خاص CLS و SEP است. در پیاده‌سازی برت، در هنگام ورودی گرفتن یک رشته، یک توکن CLS افزوده می‌شود که بردار بازنمایی که برت برای آن تولید می‌کند در واقع بازنمایی از کل دنباله است. برای مثال یک کاربرد این بازنمایی این است که با اضافه کردن یک لایه عصبی softmax روی بازنمایی حاصل از CLS، در تسک تشخیص جمله بعدی برت قادر خواهد بود تا توزیع احتمال متوالی بودن جملات A و B را نشان دهد. همچنین در پایان هر زیردنباله در دنباله ورودی نیز یک توکن SEP اضافه می‌شود که جای خاتمه جملات و مرز بین آن‌ها را نشان می‌دهد. علاوه بر این ابتکار، بردار تعبیه‌ای قطعه‌ای (segment embedding) قابل یادگیری نیز به زیر دنباله های اعمال می‌شود، به بیان دیگر به ازای کلمات در زیردنباله های مختلف، بردارهای تعبیه‌ قطعه‌ای متفاوتی بر آن‌ها اعمال می‌شوند. در نهایت برت دارای سه مکانیزم تعبیه مکانی، قطعه‌ای و کلمه‌ای است که به ترتیب بر رشته ورودی اعمال می‌شوند. اگر گیج شدید میتوانید شکل زیر را مشاهده کنید.امبدینگ ورودی به برت برای هر کلمه، در واقع حاصل جمع سه مکانیزم امبدینگ کلمه‌ای، قطعه‌ای و مکانی است.نحوه تنظیم برت برای وظایف مختلفداستان از این جا به بعد شبیه خانه‌سازی و لگوبازی است. شما ماژول یا شبکه‌ای دارید که با یک دنباله از شما ورودی‌ میگیرد و به ازای هر کلمه یک بردار بازنمایی در خروجی خود تولید میکند. این شبکه همچنین میتواند یک بردار بازنمایی از کل دنباله ورودی را نیز به وسیله بردار بازنمایی CLS تولید کند. تمام هنر شما باید این باشد که پس از درک و فهم مساله، بتوانید با اضافه کردن اندک عناصری بر روی برت، یک شبکه برای پاسخگوی به آن مساله به دست آورید. برای مثال فرض کنید مساله‌ای دارید که در آن بایستی با ورودی گرفتن دو جمله تشخیص دهید که آیا این دو جمله با یکدگیر معادل معنایی هستند یا خیر (طبیعتا انشالله برای این مساله دیتاست هم دارید). یک طرح می‌تواند این باشد که این دو جمله را به یکدیگر بچسبانید و بین آن‌ها توکن SEP را قرار دهید. سپس این دنباله را به عنوان ورودی به برت دهید و بردار بازنمایی CLS متعلق به این دنباله را به دست آورید (فرض کنید اندازه این بردار بازنمایی ۷۶۸ است). حال شما یک بازنمایی از این دنباله دارید و بایستی تعیین کنید که آیا این دو جمله معادل هستند یا نه. برای این کار یک لایه عصبی با اندازه ۷۶۸ به ۲ بر روی این بازنمایی اضافه می‌کنید. اکنون شما ساختاری دارید که میتواند با ورودی گرفتن دو جمله، توزیع احتمالی از معادل بودن یا نبودن این دو جمله تولید کند. حال نوبت وفق‌دادن و چکش کاری این ساختار است. در این جا دو استراتژی وجود دارد. در استراتژی اول از برت به عنوان شبکه استخراج ویژگی استفاده می کنیم (به اصطلاح برت را فریز میکنیم) و صرفا با استفاده از داده‌های آموزشی صرفا لایه اضافه شده بر روی برت را آموزش میدهیم. در استراتژی دوم اما علاوه بر آموزش لایه اضافه شده بر روی برت به تنظیم وزن‌های داخل خود برت نیز می‌پردازیم (این همان fine-tune کردن است). در واقع این کار باعث میشود تا با اندکی بالا پایین کردن وزن‌های داخل برت، شبکه برت بردارهای بازنمایی بهتری برای تسک‌ خاص خودمان تولید کند. استراتژی دوم معمولا جواب بهتری نسبت به استراتژی اول دارد اما از انجایی که نیازمند تغییرات در کل وزن های شبکه است و برت نیز شبکه عظیمی است پس نیاز به میزان حافظه و سخت افزار بیشتری نیز دارد. راهکار بینابینی نیز این وسط است که میتوان از ۲۴ لایه که برت دارد ۱۲ لایه پایینی را فریز کرد و مورد تنظیم قرار نداد و ۱۲ لایه بالا را مورد تنظیم قرار داد. این نمای کلی از ساختار و معماری برت در موقع پیش آموزش و تنظیم بر روی تسک‌های مختلفه.جمع‌بندیدر این پست پس از حکایت‌کردن داستان ایده انتقال یادگیری در پردازش زبان معماری های المو و سپس برت رو معرفی کردیم و نشون دادیم که چطوری این معماری ها بر روی وظایفی نظیر مدل زبانی ماسک‌شده و تشخیص جمله بعدی و بر روی دادگان عظیم متنی بدون برچسب (که به راحتی قابل دسترس هستند) پیش آموزش می‌دهند. برت شروع داستان انواع مدل‌های زبانی ترنسفورمریه. انشالله در آینده ای نه چندان دور به سراغ بقیه این مدل‌ها هم خواهیم رفت.در تلگرام می‌تونید دنبالمون کنید و اگر هم متن خوبی در حوزه‌ی هوش مصنوعی و پردازش زبان طبیعی داشتید که در انتشارات یا کانال بگذاریم، از همون‌جا ندا بدید.بازخورد یادتون نره. </description>
                <category>overfit.ir</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Thu, 02 Dec 2021 11:55:35 +0330</pubDate>
            </item>
                    <item>
                <title>مدل MEND؛ ادیت سریع، فوری و انقلابی مدل‌های زبانی</title>
                <link>https://virgool.io/overfit/mend-r1hfhompoppy</link>
                <description>همانطور که مستحضرید، امروزه فرمان هوش مصنوعی در دست مدل‌های از پیش‌ آموزش دیده بزرگ نظیر GPTهاست و این مدل‌ها تخته‌گاز در هر حوزه‌ای مشغول تاختنند و تقریبا پرچمدار تمامی وظایفند. این مدل‌ها دانش غنی گسترده‌ای رو در خودشون دارند و حتی با عملکرد فوق انسانی خودشون باعث شگفتی می‌شوند. اما این مدل‌ها هم در برابر گذر زمان بی عیب نیستند. GPT3 رو در نظر بگیرید. این مدل به هنگامی بر روی دادگان آموزشی‌اش تعلیم دیده که ترامپ هنوز رییس جمهور بوده. حال اگر همین الان از این مدل بپرسید که چه کسی رییس جمهور آمریکاست با پاسخ‌ ترامپ ناامیدتون میکنه. چاره چیه؟بدیهی‌ترین چاره که به ذهن میرسه میتونه این باشه که این مدل‌ها رو هر از گاهی روی دادگان جدید فاین تیون کنیم. اما در عمل نشون داده شده که این کار باعث اورفیت مدل بر روی این اندک (در قیاس با داده‌های اولیه) داده‌های جدید میشه و عملکرد کلی مدل هم آسیب میبینه. از طرفی اگر بخوایم این داده‌ها رو هم به داده‌های قدیمی الحاق کنیم و مدل رو هر بار از اول روی همه این داده‌ها آموزش بدیم بایستی دارای عمر نوح باشیم که نشدنیه. برای این درد ادیت کردن مدل، تعدادی روش در سال‌های گذشته پیشنهاد شده‌اند. گیر اصلی این روش‌ها عدم مقیاس پذیریشون به مدل‌های بزرگی نظیر GPT است. حالا خانم چلسی فین که از کله گنده‌های متالرنینگ هستند اومدند و روشی تحت عنوان mend رو پیشنهاد دادند که حتی در مقیاس GPT هم قابل انجامه. به علاوه ایشون گفتند که این مدل بایستی سه خاصیت reliability و locality و generality رو ارضا کنه، به بیان ساده‌تر در مورد سوال‌های جدید درست جواب بده، در مورد سوال‌هایی که ربطی به این سوالات جدید ندارند پاسخش عوض نشه و همچنین روی سوالات جدید بتونه خاصیت generalization داشته باشه.خانم فین برای حل این مساله پیشنهاد دادن که یک مدل عصبی به نام ادیتور داشته باشیم که وظیفه آموزش و تغییر دادن مدل پایه (همون GPTعه) رو داشته باشه. بر این اساس برای هر لایه L ام از وزن‌های شبکه پایه یک مدل ادیتور g_l داریم. فرض کنید حالا متن‌های جدید مربوط به این که بایدن رییس جمهور آمریکاست رو به مدل‌ پایه میدهیم و عمل forward و backward را روی مدل انجام میدهیم. در حالت عادی بهینه‌سازی این گونه عمل میکردیم که در خلاف جهت گرادیان خام برای بهینه‌سازی شبکه پایه حرکت کنیم ولی خب این کار موجب همان اشکالاتی میشه که تو قسمت قبل صحبت کردیم. وظیفه مدل g_l این هست که با ورودی گرفتن گرادیان‌‌های خام نسبت به وزن‌های لایه Lام مدل پایه، یک جهتی رو برای بهینه‌سازی این وزن‌های لایه Lام خروجی بده که سه خواسته ما در  قسمت قبل رو برآورده کنه. در طی فرآیند آموزش این پکیج هم هر دور گرادیان تابع loss مدل پایه به ادیتور انتقال داده میشه و این شکلی ادیتور آموزش می‌بینه. (شهودش مثل اینه که چشمای دوستتون رو ببندید و ازش بخواید به سمت هدف تیراندازی کنه و در طول مسابقه با نتایج تیراندازیش یاد بگیرید چطوری به دوستتون راهنمایی برسونید و بهش بگید چه قدر مثلا به چه سمتی مایل بشه). حالا از طرفی چون که ماتریس وزن‌های هر لایه L از مدل پایه به قدر کافی بزرگ هست، فین اینجا هم طرحی زده و این ماتریس با ابعاد d*d رو با تجزیه‌‌ به فرم ضرب خارجی به رنک ۱ و نهایتا یک بردار با سایز d تبدیل کرده که همین باعث شده کلی از بار محاسباتی و زمانی قضیه خلاصی پیدا کنه (این تکه ریزجزییات زیادی داره اگه مشتاق هستید میتونید به مقاله مراجعه کنید)نمای عملکرد کلی MENDنمایی از معماری یک شبکه از MENDاما بعد از توضیح معماری نوبت به ریزه‌کاری‌های آموزش مدله. هر نمونه آموزشی که برای آموزش ادیتور بکار میره رو میشه به شکل یک تاپل ۵ تایی دید. چهار تا از این پنجتا، دو جفت x,y هستند که مربوط به سوالات جدید (نظیر رییس جمهور آمریکا کیه: بایدن) و (نظیر پرزیدنت ایالات متحده؟: بایدن) هستند که برای ارضای  reliability و generality هستند. اسم این دو تا رو edit example و  equivalance example  میگذاریم. پنجمین عنصر هم یک سوال رندوم از مجموعه سوالاتیه که مدل پایه روی اونها پیش آموزش دیده (نظیر رییس جمهور روسیه؟: پوتین) که با توجه به این که حجم این سوالات خیلی بیشتر از سوالات جدیده احتمال بی ربط بودن این سوال رندوم با سوالات جدید تقریبا یکه. حالا در فرآیند آموزش، اول edit example به مدل پایه داده می‌شه و گرادیان خام تولید میشه. در گام بعدی ادیتور گرادیان خام رو میگیره و روی مدل پایه یک آپدیت انجام میده و بعد equivalance example به مدل پایه داده میشه و بر حسب loss روی این نمونه ادیتور آپدیت میشه! یک لاس هم برای یکی بودن پیش‌بینی مدل قبل و بعد از ادیت برای داده‌های رندوم اضافه میشه.در ادامه هم تصاویری از نتایج و آزمایش‌های این مدل پیوست شده اند:لینک مقاله:https://arxiv.org/abs/2110.11309به کانال ما در تلگرام سر بزنید:https://t.me/nlp_stuff</description>
                <category>overfit.ir</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Fri, 29 Oct 2021 15:52:01 +0330</pubDate>
            </item>
                    <item>
                <title>متد gather در pytorch</title>
                <link>https://virgool.io/overfit/gather-in-pytorch-lhce2bm1wkb3</link>
                <description>نیاز مادر اختراع استاگر با پایتورچ آشنا هستید (که انشالله هستید چون لازمه فهمیدن این پست دانستن pytorch است ) احتمالا با دستورهای مربوط به indexing و slicing هم آشنایی دارید به فرض مثال تنسور زیر رو در نظر بگیریم:فرض کنید از شما می‌پرسند چطوری میشه محتویات باکس‌های قرمز و سبز رو بدون استفاده از for به دست آورید. احتمالا شما هم به سادگی می‌گویید x[1,:] و x[:, 7] که البته کاملا هم درست هستند. اما حالا اگر شما در صورت مساله ای قرار گرفتید که بایستی از تنسور زیر مقادیر زیر رو بیرون بکشید و تحت یک تنسور خروجی بدید چه کار میکنید؟ (اگر در جوابتون  for وجود داره این نکته رو بایستی متذکر شوم که استفاده از for در کدهای یادگیری عمیق یک چیزی تو مایه‌های استفاده از goto در زبان‌های برنامه نویسی است، هم فلسفه یادگیری عمیق که موازی کاری هست رو زیر سوال می‌برید هم کلی فحش برای خودتون به رایگان میخرید!)چگونه از gather استفاده کنیم ۱۰۱در صورتی که دستور gather رو نمی‌شناسید و تمایلی هم ندارید که با کثیف کاری کار رو پیش ببرید و میل به یادگیری چیز جدیدی دارید با ما در ادامه همراه باشید!مساله بالا رو میشه به این صورت فرموله کرد که ما یک تنسور ورودی داریم که میخوایم روی عناصر بعد صفرم این تنسور به نوعی iterate کنیم و از هر کدوم این عناصر، عنصرهای در جای مشخصی رو جمع‌‌آوری کنیم. متناظر با این مساله، دستور gather در پایتورچ هم سه ورودی می‌گیره، input یا تنسور ورودی، dim یا همون بعدی که میخوایم در امتداد اون داده‌های مورد نظرمون رو جمع آوری و جدا کنیم و در نهایت index که تنسوری است که وظیفه‌اش مشخص کردن اینه که دقیقا کدوم عناصر رو میخوایم برداریم. نکته مهمی که بایستی توجه بشه اینه که تعداد ابعاد تنسور input با index بایستی یکسان باشند. از طرفی در صورتی که مثلا ابعاد تنسور ورودی شما 30*20*10 باشه و مثلا dim هم برابر با صفر باشه، ابعاد تنسور index باید به فرم N*20*30 باشه.  فرض کنید که برای مثال این تنسورهای ما دو بعدی (مثل قسمت قبل) باشند، در این صورت خروجی متد gather رو اگر بخوایم خیلی فرموله شده و ریاضی نشون بدیم این شکلی میشه:out[i][j] = input[index[i][j]][j]  # if dim == 0
out[i][j] = input[i][index[i][j]]  # if dim == 1اما این که نوشتیم یعنی چه؟ فرض کنیم که dim برابر با یک باشه. در این صورت حاصل gather این میشه که مشخص میکنه از هر سطری مقدارهای توی چه ستون‌هاییش باید انتخاب شوند و بالعکس اگر dim برابر با صفر باشه gather مشخص میکنه که از هر ستونی مقدارهای توی چه سطریش باید انتخاب بشوند. برگردیم به مثال قسمت قبل خودمون و بخواهیم حلش کنیم، بایستی همچین کدی رو بنویسیم (من دیگه از همون بیخ ابتدای قضیه کدش رو نوشتم که راحت کپی پیست کنید)x = torch.arange(50).reshape(5,10)
torch.gather(x, 1, torch.tensor([[2, 6], [1, 3], [3, 5], [1, 6], [8, 9]]))با اجرای کدهای بالا نتیجه زیر حاصل میشه:به همین سادگی به همین خوشمزگی!که عشق آسان نمود اول ولی افتاد مشکل‌هااین چیزی که در قسمت قبل دیدیم یک نمونه دو بعدی بود. اما اگر مساله ما سه بعدی بود چی؟ مثالش میشه وقتی که مثلا شما در یک کیس پردازش زبانی یک ماتریس سه بعدی از کلمات دارید که اندازه بعد‌ها به ترتیب سایز بچ، اندازه طول جمله و اندازه بازنمایی یک هر یک از کلمات جمله هستند. حالا شما در موقعیتی قرار دارید که بایستی از هر جمله کلمات خاصی رو با بردار بازنمایی شون بیرون بکشید. انجام دادن gather روی تنسور سه بعدی کمی سخت و تریکی هستش اما نگران نباشید انشالله که موشکافانه می‌فهمیمش. برای فهم این مساله سعی میکنیم از طریق مثال عملی روشنش کنیم. اول از همه بیایید و یک تنسور ورودی مثالی بسازیم (خرده مگیرید چرا for استفاده کرده‌ایم، از قصد استفاده کردیم که بتونیم تنسوری بسازیم که جلوتر نتیجه gather روی این تنسور قابل دنبال کردن و سنجیدن باشه)batch_size = 4
max_seq_len = 9
hidden_size = 8
x = torch.empty(batch_size, max_seq_len, hidden_size)
    for i in range(batch_size):
        for j in range(max_seq_len):
            for k in range(hidden_size):
                x[i,j,k] = i + j*10 + k*100ما یک تنسور فرضی رو ساختیم که سایز بچ‌اش چهار هست و هر جمله اون نه کلمه داره و اندازه بردار بازنمایی هر کلمه هم هشت هست. مقادیر این تنسور رو هم از قصد جوری مقداردهی کردیم که بشه بعدا چک کرد آیا درست برداشتیم یا نه. حالا فرض کنید بخوایم از جمله صفر کلمات یک و پنج، از جمله یک کلمات دو و چهار، از جمله دو کلمات یک و هفت و از جمله چهارم هم کلمات شش و هشت رو برداریم. از اونجایی که از هر جمله دو کلمه رو انتخاب کردیم بنا به قاعده قسمت قبل بایستی اندازه تنسور index اینجا برابر با 8*2*4 باشه و dim رو هم برابر با یک قرار بدیم (چون میخوایم از بعد کلمات انتخاب کنیم). خب اگر مساله ما دو بعدی بود ما ‌میتونستیم تنسور ایندکس زیر رو تشکیل بدیم و به راحتی عملیات gather رو انجام بدیم:token_indexes = torch.LongTensor([[1,5],
                                   [2,4],
                                   [1,7],
                                   [6,8]])درد اما اینجاست که این تنسور به درد ما نمیخوره. چرا؟ چون که ما باید عوض این تنسور، یک تنسور سه بعدی داشته باشیم که به ازای تک تک عناصر بعد سوم یعنی بعد بردار بازنمایی هم مشخص کرده باشه که کدوم کلمات رو برداریم. از اونجایی که ما برای یک کلمه تمامی ابعاد بردار بازنمایی‌اش رو برمیداریم یا اگر از اون وری فکر کنیم برای تمام ابعاد بردار بازنمایی یک کلمه مشخص رو برمیداریم (این جوری نیست که چهارتای اول بردار بازنمایی رو از کلمه اول برداریم چهارتای بعدی رو از یک کلمه دیگه). بنا به این خاصیت پس می‌تونیم این تنسور index مون رو برایش یک بعد سومی بسازیم و محتوای این تنسور را در بعد سوم repeat کنیم (این قدر repeat کنیم تا تمامی عناصر بردار بازنمایی مشخص بشوند و سایز تنسور index بشود 8*2*4) بنابراین کد زیر رو اجرا میکنیم.indices = token_indexes.repeat(1,8).reshape(4, -1,2).transpose(2,1)
print(indices.shape) ## torch.Size([4, 2, 8])گیج شدید؟ برای این که کمی شفاف سازی داشته باشیم قبل از رفتن به گام قبل، یک لحظه این indices رو با هم چک کنیم:print(indices[0,:,0]) # tensor([1, 5])
print(indices[0,0,:]) # tensor([1, 1, 1, 1, 1, 1, 1, 1])
print(indices[:,0,0]) # tensor([1, 2, 1, 6])خط اول در واقع بیان میکنه که عنصر صفر بردار بازنمایی چه کلماتی از جمله صفر رو میخواد جمع آوری کنه که جواب کلمات یک و پنج است. خط دوم میگه که عناصر بردار بازنمایی کلمه جمع آوری شده صفر جمله صفر دقیقا کدوم کلمه رو از اون جمله برمیدارند که جواب همگی یک است. و خط آخر هم میگه عنصر اول بردار بازنمایی کدوم کلمات جمع آوری شده صفر جملات رو جمع آوری میکنند که جواب یک و دو و یک و شش هست (شاید بهتر باشه این تیکه رو خودتون بیشتر تست کنید که بهتر متوجه بشید)در نهایت می‌ریم که ببینم جواب نهایی عملیات ما چه شکلی شد:torch.gather(x,1,indices)همین طور که مشاهده می‌کنید تنسور آماده صرفه. نوش جان :)پ.ن.۱: بار دیگر تاکید میشه که تمامی این دردسرها و متدهای عجیب و غریب برای اینه که از به کار بردن حلقه در کدهای یادگیری عمیق به شدت پرهیز بشه. اینجا مثال‌ها اندازه‌هاشون کوچک بودند ولی در کاربرد واقعی وقتی مثلا سایز بردارنهان ۷۶۸ باشه یا تعداد کلماتتون به ۵۱۲ برسه انجام for در مقایسه با توابعی مثل gather مثل مقایسه دویدن لاکپشت و یوزپلنگ است. پس اگر قصد خبره شدن در یادگیری عمیق رو داریم به هر for ای که به کار میبریم بایستی به چشم عنود و عداوت نگریسته بشه و در صورت ممکن سعی بر پاکسازی کد از حلقه‌ها بشه. پ.ن.۲: به کانال ما سر بزنید!</description>
                <category>overfit.ir</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Tue, 21 Sep 2021 18:11:15 +0430</pubDate>
            </item>
                    <item>
                <title>بازسازی عکس‌های قدیمی با هوش‌مصنوعی</title>
                <link>https://virgool.io/overfit/gfp-gan-gxudgqbqptsd</link>
                <description>به راستی تسلی بزرگی است که کسی بتواند در زمان های درد و تنهایی و فراق، دست کم یک خاطره ی کامل درخشنده را به یاد آورد. آندره مورواموضوع بازسازی تصاویر قدیمی همیشه یکی از آرزوهای پاک بشریت بوده! خیلی وقت‌ها دوست داریم عکس‌های چهره قدیمی از اجدادمون رو بتونیم واضح‌تر ببینیم که ببینیم چه شکلی بودند. این تسک به نوعی حذف نویز و بهبود و بازسازی تصاویر است. خب فرض کنید میخواید خودتون به عنوان یه نقاش دیجیتال چهره قدیمی بابابزرگ رو بازسازی کنید. برای اینکه با کیفیت بالا بتونید بازسازی کنید احتمالا قسمت‌هایی که نویز داره رو از ذهن خودتون و اطلاعات prior درباره چهره انسان‌ها (که در طول حیات یاد گرفتید) نقاشی می‌کشید و برخی قسمت‌هایی رو هم که جزییات بیشتری دارند، می‌تونید یه عکس تمیز از یه صورت جلوتون بذارید و با کمک اون عکس تمیز بازسازی رو انجام بدید. در دنیای هوش‌مصنوعی هم همین‌طور بوده. ینی قبلا برای بازسازی این تصاویر یا از اطلاعات prior درباره فیچر‌های صورت انسان استفاده می‌کردند یا با استفاده از برخی عکس‌های رفرنس این بازسازی رو انجام می‌دادند. اما یه نکته مهمی این وسط وجود داره. شما احتمالا هر چقدر نقاش ماهرتری باشید، قسمت‌های نویزی رو با کیفیت بهتری رسم می‌کنید. پس مهمه که اطلاعات prior درباره نقاشی و صورت انسان رو به‌طور همزمان داشته باشید. حالا یه سوال! در دنیای AI کدوم شبکه‌ست که از همه بهتر نقاشی می‌کشه؟ بله درسته! شبکه GAN. دقیقا ایده مقاله‌ای که می‌خوایم معرفی کنیم مبتنی بر استفاده از همین شبکه‌ها در بازسازی تصاویر قدیمی است. با این پست از انتشارات اورفیت همراه باشید تا این مقاله رو بهتر درک کنید.معماری کلی روش GFP-GAN. ابتدا ورودی به شبکه degradation removal داده می‌شه و بعد خروجی اون بخشی به سمت شبکه GAN و بهشی به سمت Channel-Split SFT میره. ماژول Channel-Split SFT خروجی GAN رو هم استفاده می‌کنه و با ترکیب تابعی از f_spatial و خروجی GAN خروجی مورد نظر رو برای توابع هزینه آماده می‌کنه. توابع هزینه هم چندین بخش هستند که بخش‌هایی مربوط به fidelity تصویر و بخش‌هایی مربوط به realness تصاویر هستند.در این مقاله از این ایده استفاده شده که احتمالا بهترین دانش prior درباره بازسازی چهره، در شبکه‌ای است که بلده خوب چهره‌ها رو رسم کنه (مثل StyleGan2). در واقع در این مقاله از این شبکه به صورت pre-trained استفاده شده. اما یه چالش بزرگ وجود داره. شبکه StyleGan2 یاد گرفته که از یه سری نویز، تصاویر غیرواقعی تولید کنه که خیلی واقعی هستند! اما در این تسک ما علاوه بر واقعی بودن برامون مهمه که تصویر خروجی شباهت بسیار بالایی به تصویر ورودی داشته باشه(fidelity). در واقع شبکه باید به تصویر ورودی وفادار باشه. معماری کلی این سیستم رو می‌تونید در تصویر بالا ببینید. برای اینکه تصویر ورودی رو بتونند به GAN بدند ابتدا اون رو از یه شبکه U-Net رد می‌کنند که نوعی Auto Encoder است و همون Degradation Removal است که در تصویر بالا می‌بینید. این ماژول تا حدی بلده که نویزهای موجود در تصاویر رو کاهش بده اما برای بازسازی تصاویری که محو شدند کافی نیست و در واقع قراره که خروجی اون به شبکه GAN داده بشه. ماژول degradation removal تصاویر ورودی رو به یه فضای پنهان F_latent می‌بره که این فضای پنهان به عنوان ورودی GAN استفاده می‌شه.قسمت‌هایی که در ماژول Degradation Removal به عنوان F_spatial معرفی شدند (که در تصویر بالا مشخص هستند) در واقع فیچر‌های مکانی تصویر ورودی رو یادگرفتند. از این بردارها باید حتما استفاده کنیم چرا که تصویر نهایی هم باید به نوعی این فیچرها رو داشته باشه تا وفاداری به ورودی اصلی حفظ بشه. در واقع کل سیستم باید یاد بگیره که از این بردارها که به نوعی فیچرهای مکانی تصاویر ورودی هستند استفاده کنه تا نزدیکی خودش رو به تصویر اصلی حفظ کنه و این کار رو در قالب توابع هزینه که در قسمت بعد معرفی می‌کنیم انجام میده. نکته‌ای که در شبکه Channel-Split SFT رعایت میشه اینه که بخشی از خروجی GAN رو که مربوط به ویژگی‌های realness تصویر است، از یه تابع همانی رد میکنه و به اون دستی نمیزنه و split دیگه رو (که مربوط به fidelity است) با F-spatial که از یه شبکه CNN رد شده ترکیب می‌کنه و در نهایت هم باز کل خروجی تابع همانی و این قسمت رو concat می‌کنه و خروجی رو به سمت تابع loss میفرسته. برداری که به سمت توابع هزینه فرستاده میشه بخش‌هایی از اون شامل فیچرهای مختلف تصویر ورودی‌ست که باعث میشه با کمک بخش‌هایی از تابع هزینه که مربوط به fidelity هستند وفاداری به تصویر اصلی بهتر حفظ بشه. توابع هزینه در این مساله از چهار بخش تشکیل شدند که در قسمت بعدی به اون‌ها می‌پردازیم.توابع هزینهاین روش از ۴ تابع هزینه همزمان استفاده می‌کنه و سعی می‌کنه که مجموع این توابع رو به صورت کمینه نگه داره که در تصویر زیر قابل مشاهده است.اولین جمله مربوط به تابع هزینه بازسازی تصویر است. این تابع برای ماژول Removal Degradation استفاده می‌شه و شامل تفاوت تصویر نویزی و تصویر اصلی است که با فاصله نرم L1 محاسبه می‌شه (‌البته یه جمله دیگه هم داره که وارد جزییاتش نمیشیم). جمله دوم مربوط به تابع هزینه GAN است که تابع هزینه‌ای مشابه StyleGan2 داره و سعی بر این است که قسمت discriminator نتونه غیرواقعی بودن تصاویر رو تشخیص بده. در واقع با وجود این تابع هزینه بخش realness تصاویر می‌خواد تضمین بشه. جمله سوم مربوط به facial component loss است. در واقع در این مقاله سعی شده برای چشم‌ها و دهان یه تدابیر ویژه اندیشیده بشه که جزییات با کیفیتی داشته باشن. به همین دلیل از قسمت discriminator شبکه GAN استفاده شده تا غیر واقعی بودن این قسمت‌های صورت رو هم تشخیص بدن و هر چقدر که کمتر این شبکه بتونه غیرواقعی بودن این قسمت‌ها رو تشخیص بده مقدار تابع هزینه کمتر میشه. جمله نهایی مربوط به قسمت Identity Preserving است. با این جمله باز قراره fidelity حفظ بشه. نحوه کار به این صورت است که یه شبکه که مربوط به face recognition است (مثل ArcFace) و می‌تونه فیچرهای صورت رو استخراج کنه رو استفاده می‌کنند و قراره اختلاف خروجی این شبکه به ازای تصویر ورودی و تصویر تمیزشده مینیمم بشه و به زبان ساده‌تر قراره تصویر رو طوری تمیز بکنیم که هنوز ArcFace تشخیص بده که این بابایی که تصویرش رو تمیز کردیم همون بابا‌ست!!جمع‌بندی و نتایجدر نهایت و در قسمت جمع‌بندی این متد با بقیه متدهای پرچم‌دار مقایسه شده و در عمل هم نشون داده شده که چقدر تاثیرگذار است. در تصویر زیر یه نمونه بسیار زیبا ازش می‌تونید ببنید:تصاویر خروجی به ازای متد‌های مشهور در حوزه بازسازی تصاویر. اولین تصویر از سمت چپ، تصویر اصلی و آخرین تصویر از سمت چپ مربوط به متد GFP-GAN است.همچنین عملکرد این مدل بر روی جزییات چشم‌ها و لب‌ها نیز در مقایسه با دیگر متدها بررسی شده که در تمامی موارد میشه گفت متد GFP-GAN اون‌ها رو شکست داده. نکته مهم اینه که برای تست، هم دادگان ساختگی و هم دادگان واقعی استفاده شده و باز هم در تمامی اون‌ها این متد پیروز بوده. برای انجام یادگیری از دیتاست FFHO استفاده شده که شامل ۷۰۰۰۰ تصویر با کیفیته و برای اینکه تصاویر نویزی از توش دربیاد از روش‌های استاندارد استفاده شده که فرمولش رو در زیر می‌تونید ببینید:در این روش تصویر y با عملگر کانوولوشن با Gaussian Blur Kernel ترکیب شده و سپس با نرخ r اقدام به downsampling کردن و بعد نویز سفید به تصاویر اضافه شده و در انتها با فرمت JPEG و نرخ کیفیت q فشرده‌سازی انجام شده. برای تست کردن همون‌طور که گفتیم هم از دیتاست ساختگی CelebA-test استفاده شده و هم از دادگان واقعی مثل CelebChild-Test. در نهایت این دوستان گرامی مدل رو بر روی هاگینگ‌فیس گذاشتند و شما می‌تونید از دمو استفاده کنید. اگه تا الان باور نکردید حتما سری به دمو بزنید و از نتایج حیرت کنید. البته دقت کنید که این مدل فقط چهره‌ها رو بهبود میده و بنابراین اگه یه عکس قدیمی دارید که کلی منظره داره نباید توقع داشته باشید بهبودی حاصل بشه.و در نهایت برای تست سیستم عکس یکی از نوامیس ناصرالدین شاه رو به همراه خودش براتون به GFP-GAN دادیم که کیفیت کار بهتر مشخص بشه!!!در سمت چپ تصویر ناصرالدین شاه و صبیه و در سمت راست تصویر بازسازی‌شده ناصرالدین شاه و صبیه! لینک دمو: https://huggingface.co/spaces/akhaliq/GFPGANلینک مقاله: https://arxiv.org/abs/2101.04061پ.ن.۱: نگاه کنید که چه زیبا با ترکیب ساده ولی دقیق مفاهیمی که داریم و شبکه‌های pre-trained چه چیز غولی ساخته شده.پ.ن.۲: به کانال ما سر بزنید!</description>
                <category>overfit.ir</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Fri, 10 Sep 2021 20:51:57 +0430</pubDate>
            </item>
                    <item>
                <title>داستان نامداران: یافتن اسامی خاص!</title>
                <link>https://virgool.io/overfit/%D8%AF%D8%A7%D8%B3%D8%AA%D8%A7%D9%86-%D9%86%D8%A7%D9%85%D8%AF%D8%A7%D8%B1%D8%A7%D9%86-%DB%8C%D8%A7%D9%81%D8%AA%D9%86-%D8%A7%D8%B3%D8%A7%D9%85%DB%8C-%D8%AE%D8%A7%D8%B5-tgovj2phwhxg</link>
                <description>سلام!پیدا کردن اسامی خاص توی متون یکی از تسک‌های پیش‌پردازشی توی پردازش زبان طبیعی محسوب می‌شه. توی این تسک دنبال این هستیم تا اسامی خاص مثل اسم افراد یا اسم سازمان‌ها و یا اسم مکان‌ها رو بتونیم پیدا کنیم و تگ بزنیم. تگ هر یک از این کلمات می‌تونه به عنوان فیچر برای تسک‌های بعدی پردازش زبان طبیعی محسوب بشه. البته دیده شده که همین تسک به تنهایی هم می‌تونه کاربرد‌هایی داشته باشه. مثلا قابلیت X-ray توی کیندل‌های آمازون دقیقا از همین استفاده می‌کنه. اگه از کتابخوان‌های آمازون استفاده کرده باشید می‌دونید که موقع مطالعه کتابتون می‌تونید از این قابلیت استفاده کنید و اطلاعات مختصری درباره هر یک از اسامی خاص توی متن رو ببینید. تو این پست قصد داریم درباره این تسک و روند پیشرفتش و مدل‌های موجود صحبت کنیم.نامداران وارد می‌شوند!: معرفی مسالهبرای اینکه بتونیم این تسک رو انجام بدیم روش‌های متفاوتی در طول زمان استفاده شده. روش‌های اولیه مبتنی بر دانش بودند. به این صورت که یه دیکشنری از اسامی خاص موجود بوده و توی متن باید بر اساس اون اسامی خاص برچسب میخوردن. بعد از اون که یادگیری ماشینی سری توی سرا در آورد سراغ روش‌های بدون نظارت رفتن که این مدل‌ها پیچیدگی زیادی داشتن و کیفیت کار در حد مطلوب نبود. البته علت اینکه ملت سراغ این روش رفتن این بوده که اون موقع داده برچسب خورده مثل امروز فراوون! نبوده ولی امروزه که داده‌های برچسب خورده زیاد داریم بیشتر سراغ روش‌های با نظارت رفتن و از این روش‌ها جواب گرفتن. تا قبل از ظهور یادگیری عمیق از روش‌های آماری استفاده می‌شده که در اون روش‌های نیاز به feature engineering شدید بوده و همین کار رو سخت می‌کرده. علتش هم اینه که توی این حوزه بدست آوردن ویژگی‌هایی برای کلمات که بشه با اونا کلمات رو برچسب اسامی خاص زد خیلی سخته. اما حالا که یادگیری عمیق داریم دیگه این فاز رو به عهده شبکه‌های عصبی گذاشتیم و از شرش خلاص شدیم. البته لازمه که دیتاست‌های قدر قدرتی! داشته باشیم که اون‌ها رو هم معرفی می‌کنیم.یک سیستم مبتنی بر یادگیری عمیق برای تشخیص اسامی خاص سه قسمت اصلی داره که توی تصویر زیر مشخصه. در ادامه درباره هر یک از این قسمتا توضیحاتی میدیم.معماری کلی یه سیستم تشخیص اسامی خاص که مبتنی بر یادگیری عمیق هستبازنمایی دیتای ورودیتوی هر مساله پردازش زبان طبیعی یکی از مهم‌ترین قسمت‌ها نحوه ورودی دادن دیتا ست. ورودی مساله ما از جنس کلمات و جمله‌ها هستن اما باید تبدیل به اعداد بشن. اینجا ست که مساله word embedding وارد بازی می‌شه. شاید جا داشته باشه که توی یه پست جدا درباره انواع و اقسام روش‌هاش توضیح بدیم ولی اینجا هم یه سری توضیحات میدیم که در کار خود وا نمانیم!!یکی از روش‌های رایج، بازنمایی در سطح کلمه ست. برای این کار چندین روش وجود داره که یکی از معروف‌ترین اونها Word2Vec هست که همین روش رو به دو صورت continues bag of words  یا CBOW و skip-gram می‌شه انجام داد. تصویر کلی این دو روش رو در زیر می‌بینید. از معایب بزرگ این روش اینه که محتوا رو بازتاب نمیدن. ینی اینکه برای کلمه مثل &quot;شیر&quot; کلا یه بردار ایجاد می‌کنن. اما پر واضحه که این کلمه در context های مختلف می‌تونه معانی متفاوت داشته باشه. از طرفی به برخی ساختارهای زیرکلمه‌ای توی زبان هم توجه نمی‌کنن. اما یه خوبی بزرگی که دارن اینه که معانی رو حفظ می‌کنن.  ینی کلمات هم‌معنی برداراشون هم فاصله کمی با هم دارن.مدل CBOW در سمت چپ که از روی پنجره کلمات اطراف کلمه هدف یه بازنمایی برای کلمه هدف ایجاد می‌کنه و در سمت راست هم مدل skip-gram که از روی یه کلمه مرکزی برای کلمات اطراف اون یه بازنمایی می‌سازه.از روش‌های بازنمایی سطح کلمات که بگذریم می‌تونیم بریم سراغ بازنمایی کلمات در سطح حروف! توی این روش‌های به ویژگی‌های زیرکلمه‌ای یه کلمه توجه می‌شه. از طرفی یکی دیگه از مشکلات بازنمایی سطح کلمه رو که در بالا نگفتیم رو هم نداره و اون کلمات خارج از واژگان هست. توی تصویر زیر نشون دادیم که می‌شه با استفاده از بازنمایی سطح حروف بردار‌های حساس به محتوا تولید کرد. برای این کار از شبکه‌های LSTM یا CNN استفاده می‌شه. البته این روش در مقایسه با روش قبلی که گفتیم طبیعتا به محاسبات بیشتر و همچنین به منابع پردازشی بیشتر احتیاج داره چرا که روش‌های قبلی حتی بعضا جزو یادگیری عمیق هم محسوب نمی‌شن اما توی این روش شما باید یه شبکه عمیق رو آموزش بدید.حروف به صورت بردار one-hot به یه شبکه LSTM دوطرفه داده می‌شن. دوطرفه بودن باعث می‌شه که اطلاعات پنهان مربوط به محتوا از حرف اول کلمه George تا حرف آخر کلمه Washington در جهت قرمز و اطلاعات پنهان محتوا از حرف آخر کلمه born تا حرف اول کلمه Washington در جهت آبی برای کلمه Washington ذخیره بشه. بعد میان این دو تا بردار رو بهم پیوست میدن.روش‌هایی هم هستن که اومدن بردار کلمه حاصل از دو روش بالا رو بهم پیوست میدن و همزمان استفاده می‌کنن. اما یه تکنیک دیگه ای هم سوار می‌کنن. همون‌طور که اول پست گفتیم قبل از یادگیری عمیق مجبور بودیم فاز مهندسی ویژگی داشته باشیم. اما الان که شبکه عمیق داریم هم دلیل نمیشه اصلا از ویژگی‌هایی که میشه به صورت دستی برای این تسک درآورد استفاده نکنیم! چراااا؟ دلیلش واضحه. چون میتونه فضای جست‌وجو رو برای شبکه عصبی کوچیک کنه و در نتیجه هم سریعتر به کیفیت مطلوب برسه و هم داده کمتری رو مصرف کنه. اما یه مقدار باید باهوش باشیم که بدونیم چه‌طوری اینا رو کنار هم قرار بدیم. توی تصویر زیر معماری این سیستم نشون داده شده. مثلا فرض کنین چند تا فیچر دستی در آوردیم یکی برچسب POS هر کلمه و یکی هم اینکه آیا حرف اولش بزرگ هست یا نه ( توی زبان انگلیسی ) و یکی هم مثلا وجود کسره اضافه بعد از کلمه ( ‌توی زبان فارسی میتونه به تشخیص مرزهای یه کلمه خاص کمک کنه ) . میایم بردار مربوط به این ویژگی‌های دستی رو با بردار حاصل از بازنمایی سطح کلمه و بردار حاصل از بازنمایی سطح حروف هر کلمه پیوست می‌کنیم. بعد این بردار رو به شبکه دوطرفه LSTM میدیم و بعد حالات پنهان خروجی LSTM به طور همزمان به یه شبکه خودرمزنگار و برچسب زننده میدیم. خروجی شبکه خودرمزنگار باید با بردارهای حاصل از ویژگی‌های دستی برابر باشه در نتیجه میزان loss به صورت ترکیبی میتونه حساب بشه و loss هر دو شبکه به صورت همزمان سعی میکنه کمینه بشه. معماری این روش رو هم میتونین توی تصویر زیر ببینین.معماری نحوه اضافه کردن ویژگی‌های دستی در سیستم تشخیص اسامی خاصبازنمایی وابستگی کلماتهمون طور که توی قسمت اول گفتیم بعد از بخش word embeddings نوبت به بخش Generate Representation using Dependencies می‌رسه. توی بخش قبل سعی کردیم هر کلمه رو به یه بازنمایی عددی تبدیل کنیم. اما برای اینکه بتونیم مساله رو کامل حل کنیم به یه سری اطلاعات دیگه هم نیاز داریم. جملات توی زبان طبیعی دنباله‌ای از کلمات هستن و به عبارت دیگه هر دنباله‌ای از کلمات توی زبان طبیعی نمی‌تونه معنی‌دار باشه. همین موضوع ینی اینکه توی وابستگی بین کلمات هم اطلاعاتی نهفته ست. پس باید بتونیم از این وابستگی‌ها هم استفاده کنیم. طبعا اولین گزینه‌ای که به ذهن میرسه استفاده از RNN هست اما میدونیم که با مشکل فراموشی بردار گرادیان مواجه می‌شیم. به خاطر همین از LSTM استفاده می‌شه. در واقع خروجی‌های فاز قبلی که بازنمایی کلمات هستن رو میشه به شبکه‌های LSTM داد و با استفاده از اونها وابستگی بین کلمات رو کپچر کرد. اما طبیعتا استفاده از این نوع شبکه‌ها امکان موازی سازی رو از ما می‌گیره که همین می‌تونه نقطه ضعف این روش باشه. به خاطر همین سعی شده تا از شبکه‌های کانولوشنی هم استفاده بشه. در این روش با استفاده از بردار N بعدی برای هر کلمه و جمله متناظر اون وابستگی بین داده‌ای بازنمایی می‌شه. البته این مدل‌ها توی پردازش جملات طولانی به مشکل میخورن که برای مقابله با این مشکل مدل Iterated Dilated Convolutions معرفی شده. ID-CNN ها به صورت عمق ثابت به طوری که طول موثر ورودی به صورت نمایی با این عمق رشد کنه طراحی شدن. بر خلاف LSTM که پیچیدگی محاسباتی اون به صورت خطی همراه با طول ورودی رشد می‌کنه این شبکه می‌تونه به صورت موازی عملیات پردازش روی جمله‌ها رو انجام بده. در عمل نشون داده شده که سرعت این شبکه در حدود ۱۴ الی ۲۰ برابر شبکه‌های LSTM هست در حالیکه دقت این شبکه فقط کمی بدتر از LSTM هست. در زیر میتونید معماری این نوع شبکه‌ها رو ببینید.یک بلوک ID-CNN که طول فیلتر آن ۳ و عمیق آن ۴ است. با این بلوک یک جمله حداکثر ۱۵ کلمه‌ای رو میشه پردازش کرد.اما در نهایت با ظهور و بروز ترنسفورمر‌ها کلا بازی عوض شد! این شبکه‌ها تنها با درنظر گرفتن مکانیزم توجه می‌تونن وابستگی‌های داده‌ای رو منظور کنن. بردار توجهی که از داده ورودی به دست می‌آد رو می‌شه به صورت موازی به دست آورد و بعد این بردار رو به یه شبکه fully connected داد تا فضای ورودی رو انکود کنه. بردار توجه یه کلمه به صورت زیر به دست میاد:برای اینکه ترنسفورمرها رو بهتر بفهمید توصیه میکنم حتما این سری پست‌ها رو مطالعه کنین. برای اینکه تشخیص اسامی خاص انجام بشه با استفاده از بخش انکودر توی ترنسفورها فضای ورودی رو انکود می‌کنن و بعد با استفاده از یه شبکه برچسب‌زن کار برچسب زدن رو انجام می‌دن. یه پیاده سازی خوب از ترنسفورمر‌ها، BERT هست. برت یه معماری عمومی با استفاده از ترنسفورمر هست که میشه به تسک‌های مختلفی توی حوزه پردازش زبان طبیعی اون رو اپلای کرد. برای این کار باید فرمت ورودی و خروجی برت رو بشناسین و همچنین روی دیتای موردنظرتون اون رو fine-tune بکنین. توی تصویر زیر نحوه ورودی دادن به شبکه برت توی یه تسک NER رو میتونین ببینین. نحوه دادن ورودی و گرفتن خروجی از برت. این تصویر از مقاله رسمی برت برداشته شده.شبکه برچسب زن میتونه یه لایه Dense روی برت باشه. برای fine-tune کردن برت روی تسک NER اول باید داده‌هایی رو که توی دیتاست استاندارد NER دارین، یه مرحله پردازش کنین. پردازش میتونه شامل موارد زیر باشه :اضافه کردن توکن &#x27;CLS&#x27; به ابتدای جملات و توکن &#x27;SEP&#x27; به انتهای جملاتهمسان سازی طول جملات با مقدار max_seq_length ( عملیات padding )تبدیل توکن‌ها به آیدی با استفاده از BERT Tokenizerعملیات masking : در این مرحله باید مشخص کنین که توی هر جمله کدوم توکن مربوط به padding هست و کدوم نیستآیدی segment : توی این قسمت توکن‌های مربوط به جمله اول آیدی ۰ و مربوط به جمله دوم آیدی ۱ میگیرن اما چون تسک NER یه تسک یه جمله‌ای هست طبیعتا همه توکن‌های ما اینجا مقدار ۰ میگیرن.آیدی برچسب : یه عدد صحیح که به هر یک از انواع برچسب‌ها زده میشهعملیات masking برای برچسب‌ها: به هر برچسب مقدار True زده میشه و برای اون قسمت‌هایی که مربوط به padding هستن باید برچسب False بزنین.مقادیر valid ids : برت برای توکنایزر از word-piece tokenizer استفاده میکنه که ممکنه برخی کلمات هم شکسته بشن. به همین دلیل برای اون توکن‌هایی که شکسته نشن این مقدار برابر با ۱ و برای اونایی که شکسته بشن برای قسمت اول اون کلمه مقدار ۱ و برای قسمت دوم اون کلمه مقدار ۰ گذاشته می‌شه.همچنین توکن‌های مربوط به paddings هم مقدار ۱ دریافت می‌کنن.به فرض مثال برای جمله [&#x27;.&#x27; ,‘EU’, ‘rejects’, ‘German’, ‘call’, ‘to’, ‘boycott’, ‘British’, ‘lamb’] و برای دنباله برچسب [‘B-ORG’, ‘O’, ‘B-MISC’, ‘O’, ‘O’, ‘O’, ‘B-MISC’, ‘O’, ‘O’] مقادیر بالا به صورت زیر خواهند بود :در این حالت لازم داریم تا حالت‌های پنهان میانی رو به عنوان بازنمایی کلمات درنظر بگیریم. برای برچسب زدن هم که از یه لایه Dense بر روی برت استفاده میکنیم که در طول عملیات fine-tuning آموزش داده می‌شه. شبکه برت از ۱۲ لایه ترنسفورمر استفاده می‌کنه که هر یک از این لایه‌های یا تعدادی از اونها می‌تونه به عنوان بازنمایی کلمات در نظر گرفته بشه. توی این پست می‌تونین جزییات عملیات fine-tuning رو ببینید همچنین بررسی شده که کدوم لایه‌های میانی به عنوان بازنمایی ورودی در نظر گرفته بشن تا بتونیم نتیجه بهتری بگیریم. توی تصویر زیر نتیجه این بررسی رو می‌بینید:بررسی انتخاب لایه‌های پنهان به عنوان بازنمایی کلمات برای برچسب زدن کلمات در تسک NERاگه دوست دارید کار کردن با برت براتون راحت باشه و بتونین عملیات‌های fine-tune رو هم راحت انجام بدید می‌تونین از کتابخونه Huggingface استفاده کنین که اینترفیس‌های راحتی رو هم براتون فراهم می‌کنه. با این کتابخونه خیلی از عملیات‌های پیش‌پردازش برای tokenization هم راحت میشه و مقادیر بالا رو که توضیح دادیم راحت می‌تونین به دست بیارین. برچسب زنندههمون‌طور که تو قسمت اول توضیح دادیم بعد از تبدیل فضای بردار ورودی به فضایی که وابستگی‌های داده‌ای رو در نظر گرفته حالا باید کلمات رو برچسب اسامی خاص بزنیم. معمولا اسامی اشخاص، اسامی سازمان‌ها، اسامی مکان، اسم رویدادها و اسامی گروه‌ها به عنوان اسامی خاص در نظر گرفته می‌شن. در برخی کاربرد‌ها تاریخ‌ها و یا واحدهای ارزی نیز به عنوان اسامی خاص در نظر گرفته می‌شن. معروف‌ترین روشی که تو این بخش استفاده می‌شه روش CRF هست که نسبت به روش‌های رایج مثل مدل مخفی مارکوف مزیت‌هایی داره از جمله ساده‌سازی  فرض‌های سخت استقلال که توی مدل مارکف ایجاد میشن. این روش امروزه بیشترین استفاده رو توی برچسب زدن اسامی خاص داره. روش دیگه هم استفاده از پرسپترون‌های چندلایه ست که توی سیستم‌های قدیمی‌تر استفاده می‌شده. اگه بخوایم از شبکه چندلایه پرسپترون استفاده کنیم باید خروجی قسمت‌های قبل رو به این شبکه بدیم و در انتها یه لایه softmax بذاریم. آموزش این شبکه آسون تر از شبکه‌های CRF هست اما یه مشکل بزرگ داره و اونم اینه که وابستگی بین دنباله‌ای از برچسب‌ها رو در نظر نمی‌گیره. به عبارت دیگه خود برچسب اسامی خاص هم یه دنباله هستن ینی هر دنباله‌ای از برچسب‌ها لزوما نمی‌تونه توی زبان معنی‌دار باشه پس این وابستگی بین برچسب‌ها هم حاوی اطلاعات هستن که می‌تونیم اونا رو منظور کنیم. هر وابستگی یه علتی داره همون‌طور که جدایی بی دلیل نیست!نحوه ارزیابیبا توجه به اینکه مساله NER یه مساله دسته‌بندی هست بهترین معیاری که برای ارزیابی این مدل‌ها استفاده می‌شه معیار f-score هست. معیار f-score سعی می‌کنه همزمان هم به اسامی که درست برچسب خوردن توجه کنه و هم به اسامی عادی که درست برچسب خوردن. برای آشنایی با این معیار باید با precision و recall هم آشنا باشید. تصویر زیر می‌تونه به درک بهتر این دو معیار کمک کنه:بررسی و مقایسه دو معیار precision و recallمعیار f-score با ترکیب دو معیار بالا بر اساس هر نوع دسته یه امتیاز ارایه میده. به عبارت دیگه کیفیت دسته‌بندی روی هر دسته رو می‌تونه بهمون بده. در نهایت برای اینکه بتونیم کیفیت کلی مدل رو به‌دست بیاریم میتونیم روی امتیاز‌های هر دسته مثلا میانگین وزن‌دار بگیریم. نحوه محاسبه f-score رو هم در تصویر زیر می‌تونین ببینیم :نحوه محاسبه معیار f-scoreمعرفی چند دادگانتوی این بخش هم میخوایم چندتا دیتاست که برای این مساله استاندارد سازی شدن رو بهتون معرفی کنیم. اولین مجموعه، دیتاست Onto-Notes5.0 هست که به زبان انگلیسی، چینی و عربی و به صورت عمومی در دسترسه. بخش انگلیسی این دیتاست شامل ۱۰۸۸۵۰۳ کلمه و بخش چینی شامل ۷۵۶۰۶۳ کلمه هست. بالاترین F-score روی این مجموعه حدود ۸۹.۷۱ هستش. این پیکره از ۵ ژانر محتلف دیتا جمع‌آوری کرده: مکالمات پخش شده، اخبار، مجلات، روزنامه‌ها و داده‌های روی وب. همچنین ۱۸ نوع برچسب موجودیت داره که نشون میده خیلی مفصل هست. همچنین قسمت انگلیسی زبان این مجموعه شامل ۱۴۷۷۲۴ کلمه برای اعتبارسنجی و ۱۵۲۷۲۸ کلمه برای تست هست.پیکره بعدی هم پیکره CoNLL2003 هست که به زبان‌های انگلیسی و آلمانی هست. مجموعه آموزشی این پیکره شامل ۲۰۳۶۲۱ کلمه و مجموعه آلمانی شامل ۲۰۶۹۳۱ کلمه هست. همچنین برای اعتبارسنجی حدود ۵۱۳۶۲ و ۵۱۴۴۴ کلمه به ترتیب برای انگلیسی و آلمانی در نظر گرفته. برای تست هم به ترتیب ۴۶۴۳۵ و ۵۱۹۴۳ کلمه در نظر گرفته شده. توی این دیتاست کلا ۴ نوع اسم خاص در نظر گرفته شده : اسم اشخاص، اسم مکان، اسم سازمان و سایر در نظر گرفته شده است. داده‌های زبان انگلیسی مربوط به روزنامه رویترز و داده‌های زبان آلمانی برای روزنامه Frankfurter Rundschau است. همچنین بالاترین F-score برای این دیتاست حدود ۹۳.۵ درصده. برای کار تو حوزه فارسی دو تا پیکره اصلی وجود داره که روی اونها کارهای زیادی انجام شده. پیکره اول پیکره آرمان هست. این پیکره شامل ۲۵۰۰۱۵ کلمه هست که حدود ۷۶۸۲ جمله میشه. اسامی خاصی که توی این پیکره اومدن ۶ نوع هستن. نوع اول سازمان هست که شامل وزاتخانه، سفارتخانه، تیم های فوتبال، انتشارات و ... میشه. نوع بعدی اسم مکان هست که شامل شهرها، روستاها، کشورها، رودخانه، مناظر طبیعی و ... ست. نوع سوم facility هستش که شامل مدارس، دانشگاه‌ها، فرودگاه‌ها، مراکز توسعه و تحقیق و ... ست.  انواع دیگر هم محصولات و رویدادها هستن. در این پیکره یه نوع دیگه هم درنظر گرفته شده و اون MISC هست که مربوط به توکن‌های اسامی خاصی ست که توی انواع بالا نمیگنجن. داده‌های این پیکره از اخبار و روزنامه‌های رسمی گردآوری شده و به زبان فارسی معیار هست. بالاترین مدلی که بر روی این مجموعه آموزش داده شده مربوط به همون ParsBert جناب فراهانی هستش که f-score حدود ۹۹.۸۴ به دست آورده. پیکره بعدی پیکره PEYMA هست که توسط آزمایشگاهی در دانشگاه تهران ایجاد شده. این پیکره با استناد به دو شیوه‌نامه استاندارد MUC , CONLL تهیه شده و با فرمت IOB برچسب خورده. این پیکره انواع اسامی خاص بیشتری رو پشتیبانی می‌کنه و البته همین هم باعث شده که برچسب زدن بر روی اون سخت تر بشه. انواعی که پشتیبانی می‌کنه شامل اسامی اشخاص، سازمان، مکان، ساختمان‌ها، زمان، تاریخ، مبالغ مالی و درصد‌ها ست. این مجموعه شامل ۳۰۲۵۳۰ توکن و ۷۱۴۵ جمله ست که از مجموعه داده‌های روزنامه‌های رسمی و خبرنامه‌ها برداشت شده در نتیجه این مجموعه هم به زبان فارسی معیار هست. بهترین مدلی که روی این مجموعه آموزش داده شده باز مربوط به مدل ParsBert هست با f-score حدود ۹۳.۴۰ هست. اگه قصد دارید دیتاست تهیه کنین حتما توصیه میشه که این دیتاست ها رو یه بررسی بکنین و شیوه‌نامه‌های استاندارد رو هم یه نگاه بندازین. حتما هم سعی کنین برچسب‌هاتون توی فرمت IOB باشه که با مدل‌های دیگه راحت بتونین تستش بکنین.و در آخر: معرفی مدل‌های ناب!تا اینجا مساله رو معرفی کردیم و هر یک از قسمت‌هاش رو توضیح دادیم. اما الان وقت عمله. توی این بخش یه چند تا مدل خوب معرفی می‌کنیم. اولین مدل مربوط به خود مقاله برت هست. این مدل به f-score حدود ۹۲.۸ رسیده اونم توی دیتای Co-NLL 2003 که دقت بالایی هم هست اما بعد از اون دو سه تا مدل خیلی خوب اومدن مثل این مدل و این مدل که به ترتیب f-score حدود ۹۴.۳ و ۹۳.۵ به دست آوردن. هر دوی این ها هم از ترنسفورمر‌ها استفاده کردن. اما توی فارسی شاید بهترین مدلی که الان وجود داره مدل ParsBert هست. این مدل روی دادگان Arman به f-score هیولای ۹۹.۸۴ رسیده! و بر روی دیتای PEYMA هم به f-score حدود ۹۳.۴۰ دست پیدا کرده که در نوع خودش بینظیره. کاری که این دوستان انجام دادن در واقع pre-train کردن شبکه برت برای مجموعه زبان فارسی بوده و تونستن دقت‌های بسیار خوبی به دست بیارن. اگه هم دوست دارین که از پیشرفت‌های این حوزه و حتی حوزه‌های دیگه توی NLP با خبر بشین حتما با برادر Ruder مانوس باشید که به گمراهی کشیده نشید!</description>
                <category>overfit.ir</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Sat, 09 Jan 2021 11:09:49 +0330</pubDate>
            </item>
                    <item>
                <title>داستان ترنسفورمرها (۳): توجه و دیگر هیچ!</title>
                <link>https://virgool.io/overfit/transformers3-uzhfclfjaikl</link>
                <description>توجه به کسانی که دوستشان دارید و دوستتان دارند تمام چیزی است که نیاز دارید. این نکته مهم ترین مطلب این پست است :)به نام خداوند حکیمسلام!در انتشارات اورفیت در یک رشته پست تحت عنوان «داستان ترنسفورمرها»، ماجرای چرایی به وجود  آمدن مکانیزم توجه، روند پیشرفتش و درگیری‌های اخیرش رو داریم حکایت  می‌کنیم. در تلگرام می‌تونید دنبالمون کنید و اگر هم متن خوبی در حوزه‌ی هوش مصنوعی و پردازش  زبان طبیعی داشتید که در انتشارات یا کانال بگذاریم، از همون‌جا ندا بدید.این سومین پست از رشته‌پست‌های مذکوره. در پست قبلی مشکلات شبکه‌های بازگشتی را بررسی کردیم و بعد هم نشون دادیم ظهور مکانیزم توجه چه کمکی به شبکه های بازگشتی کرد، حالا در این پست می‌ریم که کار رو برای معرفی ترنسفورمرها تموم کنیم!برای این که داستان این پست رو بفهمید نیازه که قبلش این داستان‌ها و مفاهیم‌ها رو فهمیده باشین:شبکه های عصبیشبکه های عصبی بازگشتیمکانیزم توجهآن چه گذشت!بیاین یک مرور سریع بر آن چه که در دو پست قبلی گذشت داشته باشیم. مشکل از مسائل دنباله به دنباله شروع شد، جایی که اول یک معماری دنباله به دنباله ساده نظیر معماری شکل ۱ پیشنهاد شد. این معماری ایده اولیه خوبی بود ولی عیب و مشکلاتی هم داشت. برای مثال یکی از عیب هاش این بود که کلماتی که اول جمله مبدا بودند اطلاعاتشون به خوبی به قسمت کدگشا منتقل نمی‌شد و موقع آموزش هم گرادیان به خوبی به اون عقب منتقل نمیشد. شکل ۱: ساختار یک معماری دنباله به دنباله ساده برای مسئله ترجمه ماشینیاین جا یک سری تریک‌ها نظیر برعکس کردن جمله مبدا موقع ورودی دادن به شبکه برای حل مشکلات بالا پیشنهاد شد. منتهی مشکل این بود که باز هم کل اطلاعات جمله مبدا داشت توی بردار آخرین حالت نهان کدگذار ذخیره میشد که یک بردار با طول ثابت بود، یعنی مثلا هر چه قدر که جمله مبدا طولانی تر هم میشد باز هم اطلاعات حاصل از جمله مبدا مجبور بودند توی یک بردار با طول ثابت خلاصه بشن. این جا بود که ایده مکانیزم توجه خلق و ابداع شد. این ایده این شکلی بود که در قسمت کدگشا برای محاسبه حالت های نهان هر گام، بیایم یک بردار حاصل از جمع وزن‌دار بردارهای حالت نهان قسمت کدگذار محاسبه کنیم که این وزن‌ها هم خودشون تابعی از میزان مشابهت حالت نهان فعلی کدگشا با حالت های نهان کدگشا هستند. نمایی از این ایده در شکل ۲ آمده است.شکل ۲: ایده مکانیزم توجهمکانیزم توجه تعمیم یافتهفرض کنید یک سری موجودیت وجود دارند و هر موجودیت سه بردار بازنمایی دارد. این سه بردار عبارتند از بردار پرسش (Query) ، بردار کلید (Key) و بردار مقدار (Value) . حال توجه یک موجودیت بر مجموعه موجودیت‌ها می‌شود ترکیب خطی بردارهای مقدار مجموعه موجودیت‌ها که وزن‌های این ترکیب خطی بر حسب میزان مشابهت بردار پرسش موجودیت متوجه با بردارهای کلید هر یک از موجودیت های مورد توجه محاسبه می‌شوند. (جمله سنگینی بود!) برای محاسبه میزان مشابهت هم از ضرب کسینوسی استفاده شده و سپس امتیازات مشابهت‌های به دست آمده به وسیله یک لایه سافتمکس، بین صفر و یک نرمال میشن. حالا اگر تمامی بردارهای پرسش و کلید و مقدار موجودیت‌ها رو کنار هم بذاریم و سه تا ماتریس Q و K و V به دست بیاریم، حاصل مکانیزم توجه از طریق فرمولی که توی شکل ۳ آمده حساب می‌شود. حسن این محاسبات ماتریسی، در موازی سازی بالای اون هستش.شکل ۳: نحوه محاسبه توجه از طریق محاسبات ماتریسیتوجه چندسرفرض کند بردارهای بازنمایی موجودیت‌هایی که تو بخش قبل راجع بهشون صحبت کردیم اندازه شون ۱۲۸ باشه. در این صورت انجام مکانیزم توجه روی این بردارهای ۱۲۸ تایی میتونه مموری زیادی بگیره. حالا فرض کنید این بردار‌های ۱۲۸ تایی رو با هشت تا شبکه عصبی کم عمق (مثلا یک لایه) تبدیلشون کنیم به ۸ تا بردار با اندازه ۱۶ و حالا بیایم روی این بردارهای ۱۶ تایی عملیات توجه رو انجام بدیم. در نهایت حاصل توجه روی این بردارهای ۱۶ تایی (که خودشون ی سری بردار با اندازه ۱۶ هستن) رو با هم الحاق میکنیم و به بردار با اندازه ۱۲۸ می‌رسیم! (همون برداری که اول می‌خواستیم). به کل این ایده که توش اومدیم یک بردار رو به بردارهای کوچکتر شکوندیم و رو بردارهای کوچکتر عمل توجه رو انجام دادیم و حاصل توجه این بردارهای شکسته شده رو با هم الحاق کردیم، توجه چندسر گفته می‌شه. یک خوبی این توجه چندسر اینه که توش میشه همزمان به چند جنبه اطلاعاتی و چند فضای بازنمایی توجه کرد و خوبی دیگه اش هم اینه که همچنان امکان موازی انجام دادن رو داره. برای فهم بهتر، نمایی از مکانیزم توجه چندسر تو شکل ۴ آمده است.شکل ۴: مکانیزم توجه چندسرخب این شد مکانیزم توجه تعمیم یافته که قبل و همه‌چیز مدل ترنسفورمر محسوب میشه حالا از این جا به بعد شروع میکنیم به توضیح دادن خود مدل ترنسفورمرساختار کلی ترنسفورمرترنسفورمر در واقع یک مدل دنباله به دنباله (کدگذار-کدگشا) است که بدون این که از مکانیزم‌های بازگشتی استفاده کنه سعی داره تا صرفا از مکانیزم توجه استفاده کنه. زیر شبکه کدگذار ترنسفورمر یک دنباله متنی رو تو ورودی می‌گیره و یک بازنمایی از اون رو تولید میکنه. زیر شبکه کدگشا هم بازنمایی حاصل از زیر شبکه کدگذار رو همچنان کلمات تولید شده تا حال حاضر رو (که در قسمت کدگشا تولید شده اند) را میگیره و سعی در تخمین توزیع احتمال کلمه بعد داره. یک نمای کلی از معماری ترنسفورمر تو شکل ۵ آمده است.شکل۵: نمای کلی از معماری ترنسفورمرمعماری قسمت‌های کدگذار و کدگشاقسمت کدگذار از یک پشته از چندین لایه با ساختار یکسان تشکیل شده که هر لایه خروجی خودش رو به عنوان ورودی به لایه بعد تحویل میده. از طرفی هر لایه هم خودش دو بلوک تو خودش داره، بلوک مکانیزم خودتوجهی چندسر و بلوک شبکه عصبی پیشرو تمام متصل. به علاوه تو هر بلوک هم از اتصالات باقی مانده و نرمال کننده لایه استفاده میشه.قسمت کدگشا دقیقا مانند قسمت کدگذار هستش اما با دو تفاوت. تفاوت اول اینه که هر لایه دارای سه بلوک هستش. بلوک‌های اول و سوم کدگشا دقیقا مثل بلوک های اول و دوم قسمت کدگذار هستند. بلوک میانی ولی نقش اتصال بین کدگذار و کدگشا رو داره و به وسیله یک توجه چند سر عمل توجه رو روی خروجی آخرین لایه کدگذار انجام میده. تفاوت دیگه کدگشا با کدگذار در اینه که در بلوک اول (یعنی توجه به خود) هر توکن تو کدگذار به همه توکن‌های دیگه دنباله ورودی توجه می‌کنه ولی توی بلوک اول کدگشا، هر توکن دنباله مقصد صرفا به توکن‌های قبل از خودش توجه می‌کنه.علاوه بر بلوک‌های توجه، هر یک از لایه‌های کدگذار و کدگشا تو خودشون یک بلوک شبکه عصبی تمام متصل پیشرو متصل از مکان (اصطلاح دقیق انگلیسی این تیکه میشه Fully Connected Feed Forward Position-Wise Network) هم دارند. خروجی‌های بلوک قبل به عنوان ورودی به این شبکه داده می‌شوند و این شبکه هم به هر برداری تو هر مکانی به صورت جداگانه و البته یکسان اعمال میشه (یعنی این که برای مکان‌های مختلف توی یک لایه پارامتر‌های این شبکه یکسانه) از نظر ساختاری هم این شبکه، یک شبکه با یک لایه مخفیه که اندازه بردارهای ورودی و خروجیش ۵۱۲ و اندازه حالت نهانش هم ۲۰۴۸ هستش. حکمت وجود این شبکه، توانایی استخراج ویژگی از بردارهای حاصل از مکانیزم توجه هست. مکانیزم تعبیه مکانیاز اونجایی که ساختار شبکه ترنسفورمر بازگشتی نیست، بنابراین لازمه تا مکانیزمی جهت تزریق اطلاعات موقعیت مکانی کلمات دنباله نسبت به یکدیگر به مدل طراحی شود. به منظور حل این چالش در مدل ترنسفورمر برداری به نام بردار تعبیه مکانی درنظر گرفته شده است که بنا به رابطه زیر به دست میاد:روابط تعبیه مکانی برای مدل ترنسفورمراین بردار تعبیه مکانی با اندازه حالت نهان مدل، به ازای هر توکن با مکان مختلف که متغیر pos هستش، تعریف می‌شه. در نهایت بردار تعبیه مکانی در ابتدای شبکه با بردار تعبیه هر کلمه جمع می‌شه. شاید براتون سوال بشه که خب چرا sin و cos و چرا اصلا طوری نمیکنن که خود این امبدینگ مکانی قابل یادگیری باشه، پاسخ اینه که سینوسی و کسینوسی در نظر گرفتن این بردارها کمک میکنه تا مدل برت قابل اعمال به هر دنباله‌ای با هر طولی باشه و وابسته به میزان طول رشته‌هایی که روشون آموزش دیده نباشه.جمع‌بندیترنسفورمرها به علت توانایی موازی‌سازی بالاشون نسبت به شبکه های بازگشتی به ذات دیپ لرنینگ نزدیکترن و راحتتر و سریعتر از اونها هم آموزش می‌بینند. از طرفی دیگه وجود مکانیزم توجه به خود چه در قسمت کدگذار و چه در قسمت کدگشا باعث شده تا برای هر کلمه بازنمایی بهتری به دست بیاد. پردازش زبان بعد از به وجود اومدن این معماری دچار تحول بزرگی شد. یکی از این تحولات شبکه‌های از پیش آموزش دیده ترنسفورمری و نهضت انتقال یادگیری در پردازش زبان هستند که بر پایه همین ترنسفورمر بنا شده‌اند. انشالله در آینده ای نه چندان دور به سراغ این ماجراها هم خواهیم رفت ...نظر یادتون نرهمنابع اسلاید ترنسفورمرز درس یادگیری ژرف دکتر سلیمانیمقاله Attention Is All You Needصحنه پس از تیتراژ:</description>
                <category>overfit.ir</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Mon, 14 Sep 2020 21:58:14 +0430</pubDate>
            </item>
                    <item>
                <title>داستان ترنسفورمرها (۲): attention برمی‌خیزد!</title>
                <link>https://virgool.io/overfit/transformers2-ch6ojadripur</link>
                <description>به نام خداسلام!در انتشارات اورفیت در یک رشته پست تحت عنوان «داستان ترنسفورمرها»، ماجرای چرایی به وجود آمدن مکانیزم توجه، روند پیشرفتش و درگیری‌های اخیرش رو داریم حکایت می‌کنیم. در تلگرام می‌تونید دنبالمون کنید و اگر هم متن خوبی در حوزه‌ی هوش مصنوعی و پردازش زبان طبیعی داشتید که در انتشارات یا کانال بگذاریم، از همون‌جا ندا بدید.این دومین پست از رشته‌پست‌های مذکوره. در پست قبلی مشکلات شبکه‌های بازگشتی را بررسی کردیم و در این پست می‌خواهیم ببینیم مکانیزم توجه چه راه‌حلی براش ارائه داده. حتما پست قبلی با نام داستان ترنسفورمرها (۱): ناکارآمدی بازگشتی‌ها را بخونید. قسمت سوم این رشته پست هم با نام داستان ترنسفورمرها (۳): توجه و دیگر هیچ! منتشر شده.شکل ۱. توجه توجه!برای اینکه این پست را بهتر متوجه بشید نیازه که با این مباحث آشنا باشید:مفاهیم ابتدایی شبکه‌های عصبی مصنوعی مثل تابع فعال‌سازیشبکه‌های بازگشتیشبکه‌های کدگذار-کدگشادر این پست می‌خواهیم این مباحث را با هم بررسی کنیم:ایده‌ی اولیه: مکانیزم توجه باهدانا (Bahdanau)مکانیزم توجه لوآنگ (Luong)خلاصه روابط ریاضی مکانیزم‌هاکاربردهای دیگر مکانیزم توجهدر ضمن قطعا این متن مشکلاتی داره. اگر دیدینشون، بگید بهم لطفا. کاریشون ندارم، فقط می‌خوام درستشون کنم.۱. ایده‌ی اولیه: مکانیزم توجه باهدانا (Bahdanau)شکل ۲. یک شبکه‌ی کدگذار-کدگشا برای ترجمه ماشینی. این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است.در پست قبل دیدیم مشکل شبکه‌های بازگشتی، مسیر طولانیه که مثلا بردار کلمه‌ی انگلیسی milk در تصویر بالا باید کامل و سالم طی کنه تا برسه به کلمه‌ی فرانسوری lait و همینطور باید گرادیان تمام این مسیر را هم برگرده. اینجاست که «مکانیزم توجه» صحنه را دست می‌گیره. آقای باهدانا (Bahdanau) و شرکا(!) در سال ۲۰۱۴ در یک مقاله‌ی خفن، تکنیکی را معرفی کردند که ساختار کدگشا بتونه در هر قدم فقط روی کلمات مناسب تمرکز و «توجه» کنه. مثلا وقتی می‌خواد کلمه‌ی lait را تولید کنه به کلمه‌ی milk توجه کنه. خب این ایده باعث شد مسیر بین یک کلمه در زبان مرجع و ترجمه‌اش خیلی کوتاه‌تر بشه و مشکل حافظه‌ی کوتاه مدت شبکه‌های بازگشتی خیلی کم‌تر مشکل ساز بشه. این ایده بازی را مخصوصا برای متن‌های طولانی (بیشتر از سی تا کلمه) زیر و رو کرد. در این معماری علاوه بر state سلول کدگذار آخر، تمام خروجی‌های کدگذار را هم به کدگشا می‌فرستیم. چرا؟ تا در هر گام، کدگشا یک جمع وزن‌دار بین این خروجی‌ها حساب کنه و همین وزن‌ها هستند که مفهوم توجه را پیاده می‌کنند؛ یعنی اونی که وزن بیشتری داره، سهم بیشتری را در این بردار حاصل از جمع وزن‌دار داره پس بهش توجه بیشتری می‌شه. به این تصویر توجه کنید:شکل ۳. یک شبکه‌ی کدگذار-کدگشا برای ترجمه ماشینی به همراه مکانیزم توجه! این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است.وزن‌های مذکور همان αها در تصویر بالا هستند که همراه شبکه قراره آموزش ببینند. در این تصویر (α(t,i نشان‌دهنده‌ی وزن خروجی کدگذار iام در گام زمانی t است. مثلا اگر (α(3,1 بیشتر از (α(3,0 و (α(3,2 باشه، یعنی در گام سوم کدگشا به کلمه‌ی دوم (طبیعتا ایندکس کلمه‌ی اول صفره) که drink است، بیشتر از دو کلمه‌ی دیگر توجه خواهد کرد. جمع وزن‌دار از خروجی‌های کدگذار به کدگشا داده می‌شن و غیر از این مورد، بقیه‌اش مثل کدگذار-کدگشا معمولی کار می‌کنه؛ یعنی مثل شکل ۱ در هر مرحله، خروجی مرحله قبل (در شکل ۳، مثلا در مرحله‌ی تولید (y&#x27;(3، خروجی مرحله‌ی قبل کلمه‌ی du است) و لایه‌های پنهان مرحله قبل (در شکل۳: (2)h) به کدگشا داده می‌شه. دقت کنید در شکل ۳ فقط جمع وزن‌دار خروجی‌های کدگذار و لایه‌های پنهان مرحله قبل مشخص شده و خروجی از مرحله قبل آورده نشده ولی این خروجی در شکل ۲ به صورت (x&#x27;(i مشخص شدند. پس امیدوارم مشخص شده باشه که کدگشا در این معماری سه تا ورودی می‌گیره: خروجی مرحله قبل، لایه‌های پنهان مرحله قبل و جمع وزن‌دار از خروجی‌های کدگذار با ضرایب مکانیزم توجه.حالا سوالی که می‌مونه اینه که این αها از کجا میان که لطف کنند و اهمیت را مشخص کنند؟ همون‌طور که در سمت راست شکل ۳ مشخص شده، این وزن‌ها با استفاده از یک شبکه‌ی کوچک به اسم alignment model یا attention model تولید شدند. این شبکه یک لایه‌ی time-distributed Dense و بعد هم یک لایه‌ی softmax داره. لایه‌ی اول به عنوان ورودی تمام خروجی‌های کدگذار (در شکل: (y(i) و لایه‌ی پنهان مرحله قبل کدگشا (در شکل: (h(t-1) را می‌گیره. این دو تا ورودی به هم الحاق (concatenate) و به این شبکه داده می‌شه. خروجی (در شکل: (e(t,i) هم یک امتیاز به ازای هر کدوم از این خروجی‌های کدگذاره. این امتیازها نشون می‌ده که هر کدوم از این خروجی‌های کدگشا و لایه‌ی پنهان مرحله قبل کدگشا چقدر هم‌راستا (aligned) و شبیه به هم هستند. بعد هم این خروجی وارد یک لایه‌ی softmax می‌شه و همون αهای عزیز ساخته می‌شن. طبیعتا جمع این αهای یک هستند. به این نوع مکانیزم توجه می‌گن مکانیزم باهدانو یا بخاطر اینکه y و h را به هم الحاق کردیم، بهش می‌گن مکانیزم الحاقی (catenative attention) یا مکانیزم تجمیعی (additive attention). اگر جمله‌ی ورودی n تا کلمه داشته باشه و فرض کنیم که خروجی هم همین تعداد کلمه داشته باشه، باید n^2 تا وزن حساب بشه که چون جمله‌ها معمولا طولانی نیستند، مشکل خاصی نیست.۲. مکانیزم توجه لوآنگ (Luong)آقای لوآنگ (Luong) و شرکا در سال ۲۰۱۵ در یک مقاله‌ی خفن دیگه، مدل مکانیزم بعدی را معرفی کردند. همونطور که در قسمت قبل گفته شد، هدف والای مکانیزم توجه اینه که شباهت‌های بین خروجی‌های کدگذار (y) و لایه‌ی پنهان مرحله قبل کدگشا (h) را محاسبه کنه؛ پس در این مقاله برای محاسبه‌ی شباهت از ضرب داخلی (فاصله کسینوسی) استفاده کردند که طبیعتا باید ابعاد این دو تا بردار یکسان باشند. بعد نتایج این ضرب‌های داخلی، مثل مدل قبل به یک لایه‌ی softmax داده می‌شن. مورد بعدی که در این مقاله استفاده شد این بود که از لایه‌ی پنهان همین مرحله‌ی کدگشا (یعنی (h(t) به جای مرحله‌ی قبل (یعنی (h(t-1)استفاده کردند. در مدل قبل خروجی مکانیزم توجه در تولید همین (h(tها دخالت داشتند (گفتیم که کدگشا سه تا ورودی می‌گرفت که خروجی مکانیزم هم یکیشون بود) ولی در این یکی مدل، از خروجی‌های مکانیزم توجه مستقیم برای خروجی نهایی کدگشا استفاده می‌شن. به صورت کلی در شبکه‌های عصبی می‌دونیم که لایه‌های نهان به یک تابع فعال‌سازی داده می‌شن تا خروجی تولید شن ولی اینجا این لایه‌های نهان کدگشا را می‌دیم به مکانیزم توجه و از خروجی اون برای ساختن خروجی نهایی کدگشا (در ترجمه، کلمه در زبان مقصد) استفاده می‌کنیم. به این مدل، مکانیزم توجه لوآنگ (Luong) یا مکانیزم توجه ضرب نقطه‌ای (dot) یا مکانیزم توجه ضربی (multiplicative) می‌گن. در این مقاله یک مدل دیگه هم برای محاسبه‌ی ضرب داخلی ارائه شد که روی خروجی کدگذار، اول یک تبدیل خطی (مثل مدل باهدانو با استفاده از یک لایه‌ی time-distributed Dense بدون متغیر bias) زده می‌شد و بعد ضرب داخلی با لایه‌ی پنهان کدگشا. به این یکی مدل، مکانیزم توجه عمومی (general) می‌گن.مکانیزم الحاقی و مکانیزم‌های ضرب داخلی در همین مقاله مقایسه شدند و مشخص شد که مکانیزم‌های ضرب داخلی عملکرد بهتری دارند.۳. خلاصه روابط ریاضی مکانیزم‌هاخروجی مکانیزم توجه به صورت ˜h (حرف h باکلاه!) در شکل ۴ مشخص شده که همون‌طور که گفته شد جمع وزن‌دار خروجی‌های کدگشاست. خود ضریب‌ها از تابع softmax روی امتیازها محاسبه شدند. امتیازها هم در هر کدوم از سه مدل dot و general و concat به طوری که در شکل اومده محاسبه شدند. در ضمن اون W هم که در فرمول‌ها اومده، همون تغییر خطیه که با استفاده از لایه‌ی time-distributed Dense اجرا می‌شه. شکل ۴. خلاصه روابط ریاضی مکانیزم‌های توجه. این تصویر از کتاب فوق‌العاده‌ی hands on machine learning برداشته شده است.اگر دلتون می‌خواد پیاده‌سازی انواع مکانیزم‌هایی که معرفی شد ببینید، این لینک و این لینک خوبه.۴. کاربردهای دیگر مکانیزم توجهمکانیزم توجه فقط در ترجمه ماشینی نیست و خیلی جاها استفاده می‌شه. دو تا از نمونه‌هاش را اینجا آوردیم.۴.۱. مکانیزم توجه دیداری (visual)تولید توضیح تصویر (image captioning) با استفاده از مکانیزم توجه در سال ۲۰۱۶ در یک مقاله ارائه شد. تصویر به یک شبکه‌ی کانولوشنی (CNN) داده می‌شد تا ویژگی‌های خوب را استخراج کنه، بعد این ویژگی‌ها به یک شبکه‌ی کدگشا (شبکه بازگشتی با مکانیزم توجه) داده می‌شد تا در هر مرحله یک کلمه از توضیح عکس را تولید کنه. به این تصاویر دقت کنید:شکل ۵. در هر جفت تصویر، تصویر سمت چپ ورودی به مدل و تصویر سمت راست قسمتی از تصویر است که مدل قبل از تولید کلمه‌ای که زیرش خط کشیده شده، به آن توجه کرده! این تصویر از مقاله‌‌ی مذکور برداشته شده است.کدگشا در هر مرحله که می‌خواد یک کلمه را تولید کنه، از مکانیزم توجه استفاده می‌کنه تا روی قسمت مناسبی از تصویر توجه کنه. در تصاویر بالا می‌تونید ببینید که مدل قبل از تولید کلمه‌ای که زیرش خط کشیده شده، به کدوم قسمت از تصویر توجه بیشتری کرده. معرکه‌ست!! ۴.۲. تفسیرپذیری مدلیکی دیگه از کاربردها یا مزایای مکانیزم توجه اینه که می‌تونیم بفهمیم چجوری مدل این خروجی را تولید کرده. یعنی داخل مغزش چی گذشته؟ به این موضوع می‌گن توضیح‌پذیری (Explainability) یا تفسیرپذیری (interpretability) مدل. سال ۲۰۱۶ یک مقاله ارائه شد و از همین توضیح‌پذیری مدل استفاده کرد. در این مقاله یک مدل برای تشخیص عکس سگ هاسکی و گرگ آموزش دادند که توضیح برای عکس‌ها بنویسه. بعد یک عکس سگ بهش دادند و انتظار داشتند خروجیش «سگ در برف داره راه می‌ره» باشه ولی مدل اشتباه تشخیص داد و گفت: «گرگ در برف داره راه می‌ره.»مشکل چی بود؟ با استفاده از مکانیزم توجه، فهمیدند مدل وقتی کلمه‌ی «گرگ» را داشته تولید می‌کرده، به برف هم داشته توجه می‌کرده؛ پس احتمالا مشکل اینه که مدل اشتباهی فکر کرده هر وقت دور اون جانور کلی برف باشه گرگه وگرنه سگه. بعد اومدند یک سری عکس از گرگ بدون برف و یک سری عکس سگ در برف به داده‌ها اضافه کردند که مشکل حل بشه. عکس پایین را ببینید.شکل ۶. توضیح اینکه چرا مدل هاسکی را گرگ تشخیص داده! این تصویر از مقاله‌ی برداشته شده است. ۵. جمع‌بندیخب اینم از این پست. در این پست ایده‌ی اولیه مکانیزم توجه و انواعش را توضیح دادیم، روابط ریاضی شون را مرور کردیم و دو نمونه از کاربردهای این مکانیزم را بررسی کردیم. امیدوارم مفید بوده باشه. در پست بعدی می‌ریم سراغ مقاله‌ی بازی‌عوض‌کنِ Attention Is All You Need و معماری ترنسفورمرها را توضیح خواهیم داد. به‌به! همانطور که گفتم، حالا قسمت سوم این رشته پست با نام داستان ترنسفورمرها (۳): توجه و دیگر هیچ! منتشر شده. ۶. منابعاین متن ترجمه و خلاصه‌ای از بخش‌های مرتبط از فصل ۱۶ کتاب hands-on ml، ویدیو و مقاله‌های زیره. پس اگر دوست دارید خیلی بهتر این مطالب را بفهمید، حتما بهشون مراجعه کنید.Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems 2nd Editionhttps://www.youtube.com/watch?v=iDulhoQ2proNeural Machine Translation by Jointly Learning to Align and Translate (https://arxiv.org/abs/1409.0473)Effective Approaches to Attention-based Neural Machine Translation (https://arxiv.org/abs/1508.04025)Show, Attend and Tell: Neural Image Caption Generation with Visual Attention (https://arxiv.org/abs/1502.03044)“Why Should I Trust You?” Explaining the Predictions of Any Classifier (https://arxiv.org/pdf/1602.04938.pdf)لایک و نظر یادتون نره. فعلا!</description>
                <category>overfit.ir</category>
                <author>علی اکبر بدری</author>
                <pubDate>Mon, 29 Jun 2020 16:58:54 +0430</pubDate>
            </item>
                    <item>
                <title>داستان ترنسفورمرها (۱): ناکارآمدی بازگشتی‌ها</title>
                <link>https://virgool.io/overfit/transformers1-b31wtfstlwvc</link>
                <description>توجه توجه!سلام! مکانیزم توجه یکی از مهم‌ترین مفاهیم و معماری‌هاییه که انقلابی در حوزه‌ی هوش مصنوعی و پردازش زبانی (NLP) محسوب میشه و باعث شروع سلطه‌ی ترنسفورمرها شد. در انتشارات اورفیت قصد داریم در یک رشته پست تحت عنوان «داستان ترنسفورمرها»، ماجرای چرایی به وجود آمدن مکانیزم توجه، روند پیشرفتش و درگیری‌های اخیرش رو حکایت کنیم. در تلگرام می‌تونید دنبالمون کنید و اگر هم متن خوبی در حوزه‌ی هوش مصنوعی و پردازش زبان طبیعی داشتید که در انتشارات یا کانال بگذاریم، از همون‌جا ندا بدید.در ضمن قطعا این متن مشکلاتی داره. اگر دیدینشون بگید بهم لطفا. کاریشون ندارم، فقط می‌خوام درستشون کنم.حالا قسمت دوم این رشته پست با نام داستان ترنسفورمرها (۲): attention برمی‌خیزد! و قسمت سومش هم با نام داستان ترنسفورمرها (۳): توجه و دیگر هیچ! منتشر شدند.ضعف شبکه‌های RNN و ظهور LSTM, GRUهمونطور که احتمالا می‌دونید، از شبکه‌های بازگشتی برای پیش‌بینی سری‌ها استفاده می‌شه. مثلا متن یک «سری» از کلماته یا مثلا پیش‌بینی قیمت در بورس با توجه به قیمت‌های قبلی. حالا مشکل از اونجا شروع می‌شه که این سری طولانی بشه. اینجاست که RNN دیگه پاسخ‌گو نیست چون ممکنه مشکل ناپایداری گرادیان‌ها (unstable gradients) اذیتش کنه و البته مشکل بزرگ‌تر اینه که شبکه، ورودی‌های اولی را فراموش می‌کنه. راه‌حل‌های این دو تا مشکل را خیلی سریع مرور کنیم (اگر دوست داشتید عمیق‌تر نگاه کنید، لینک مقاله‌ها را گذاشتم که مطالعه کنید):اول. نبرد با گرادیان‌های ناپایداراین مشکل به دو شکل انفجار (exploding) گرادیان و محوشدن (vanishing) گرادیان خودش را نشون می‌ده. مثلا چون که شبکه‌های بازگشتی مثل یک زنجیره هستند و خروجی قبلی را ورودی می‌گیرند، اگر گرادیان ما بزرگتر از یک باشد، به مرور بزرگ و بزرگ‌تر می‌شود تا به اصطلاح منفجر شود. در حالت بد دیگه، اگر گرادیان خیلی کوچک باشد، به مرور باز هم کوچک‌تر می‌شود تا کاملا به اصطلاح محو شود و چیزی به دست لایه‌های انتهایی نرسد.تصویری از قسمت «نبرد حرامزاده‌ها» از سریال «بازی تاج و تخت»خب این مشکل برای هر شبکه‌ای ممکنه پیش بیاد پس بیاید قضاوتش را فقط به خدا بسپریم و RNN رو هم مثل شبکه‌ی خودمون بدونیم. یک سری راه‌حل‌ها که برای بقیه شبکه‌ها کار می‌کنه برای RNN هم استفاده می‌شه. بعضی‌هاش هم دیگه حناشون برای RNN رنگی نداره. مثلا اینجا هم می‌تونیم از مقداردهی‌های اولیه‌ی خوب برای وزن‌ها، الگوریتم‌های بهینه‌سازی سریع‌تر، dropout و کوچک کردن learning rate استفاده کنیم. ولی خب مثلا تابع فعال‌سازی ReLU دیگه خیلی کارساز نیست و ممکنه حتی اوضاع را بدتر کنه واسه همین به صورت پیش فرض تابع فعال‌سازی تانژانت هایپربولیکه. و همچنین در این مقاله مشخص شد Batch Normalization روی RNN مثل بقیه‌ی شبکه‌های feed forward نیست و اینجا خوب کار نمی‌کنه چون با گذاشتنش بین گام‌های زمانی نتایج خوبی نمی‌ده و  فقط می‌تونیم بین دو لایه‌ی بازگشتی بگذاریم و نه داخلش و در این حالت هم فقط از هیچی بهتره. به جاش در این یکی مقاله یه روش دیگه به اسم Layer Normalization معرفی کردند که به جای اینکه نرمالایز کردن را روی بعد batch انجام بده، روی بعد ویژگی‌های داده‌ (features) انجام می‌ده و خب نتایجش خیلی خوبه.دوم. نبرد با آلزایمرکاراکتر dory (طبیعتا سمت راستی) در کارتون «در جستجوی نمو» که حافظه‌ی کوتاه مدتش مشکل داشت!داستان اینه که شبکه‌های RNN ما یک جمله طولانی را شروع می‌کنه به خوندن، به آخرش که می‌رسه اولش یادش می‌ره! دلیلش هم در ساختار RNN مشخصه دیگه. واسه حل این مشکل اومدند انواع و اقسام long-term memory ارائه دادند. یعنی حافظه‌هایی که به صورت طولانی مدت اطلاعات را نگه دارند. قطعا  LSTM یا همون حافظه‌ی کوتاه‌مدت طولانی (Long Short-Term Memory) یکی از معروف‌ترین‌‌هاست و در این مقاله ارائه شده! اونم سال ۱۹۹۷! این معماری را ساده‌تر کردند و GRU را در این مقاله ارائه دادند. معماری‌های این شبکه‌ها خودش یک پست دیگه می‌تونه باشه و سعی می‌کنیم در آتی بنویسیم. ولی به صورت خلاصه این معماری‌ها یک سلول حافظه دیگه هم دارند که در اونجا اطلاعات طولانی‌مدت‌تر نگه‌داری میشه. در تصویر زیر c حافظه‌ی طولانی‌مدت ماست و h حافظه کوتاه‌مدت. جلوی c هیچ تبدیلی نیست گرادیان وزن‌ها تقریبا دچار مشکل محوشدگی یا انفجار نمی‌شود. البته خواهیم دید که این اوضاع را بهتر کرد ولی باز هم مشکلات داره. یعنی باز هم اگر سری خیلی طولانی بشه، پاسخ‌گو نیست.یک سلول LSTM. این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است. ناکارآمدی زیربنایی شبکه‌های بازگشتیبعد از مدتی مشخص شد که شبکه‌های بازگشتی مشکلات زیربنایی دارند و اگر بخواهیم روی سری‌های طولانی‌تری کار کنیم باید از این معماری‌ها عبور کنیم. در ادامه یکی از کاربردهای شبکه‌های کدگذار-کدگشا به نام ترجمه ماشینی عصبی (Neural Machine Translation) را بررسی می‌کنیم و با این کاربرد بررسی می‌کنیم که این ناکارآمدی چطور مشکل‌ساز می‌شه.استفاده از شبکه‌های کدگذار-کدگشا برای ترجمه ماشینیمعماری و نکات این شبکه‌ها هم خودش یه داستان مجزاست. اما به صورت خلاصه این شبکه‌ها از دو بخش کدگذار (encoder) و کدگشا (decoder) تشکیل شدند. بخش کدگذار یک سری می‌گیره و یک بردار می‌ده و بخش کدگشا برعکس؛ یک بردار می‌گیره و یک سری پس می‌ده. مثلا در ترجمه ماشینی، این شبکه یک جمله از یک زبان می‌گیره و یک جمله از زبان دیگه پس می‌ده. قسمت کدگذار این جمله از زبان مبدا را به یک بردار تبدیل می‌کنه و قسمت کدگشا این بردار را می‌گیره و تبدیل به جمله در زبان مقصد می‌کنه. همونطور که در تصویر زیر مشخصه اول کار encoder تموم می‌شه و بعد کار decoder شروع می‌شه.یک شبکه‌ی کدگذار-کدگشا برای ترجمه ماشینی. این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است. برای آموزش این شبکه جمله‌ی زبان مبدا به encoder داده می‌شه و جمله مقصد به decoder داده می‌شه البته با یک شیفت زمانی. یعنی در هر مرحله کلمه‌ای را به decoder می‌دهیم که باید در مرحله قبل خروجی می‌داد و به عنوان اولین ورودی (قبل از اولین کلمه جمله) بهش یک توکن به اسم SOS (توکنی برای start-of-sequence) می‌دهیم و جمله مبدا را هم برعکس می‌کنیم که اولین کلمه‌ی جمله آخرین ورودی به encoder باشه. چرا؟ به صورت معمول این برعکس کردن انجام نمی‌شه و پس از مدتی عملکرد ضعیف این شبکه‌ها، این ایده به ذهن محققین رسید که جمله ورودی را برعکس به encoder بدن. این باعث می‌شه که کلمات اول جمله‌ی اول فاصله کم‌تری با کلمات اول جمله‌ی دوم داشته باشه. حالا این ریسک «فاصله کم‌تر» می‌تونه باعث تولیدشدن بهتر کلمات اول جمله مقصد بشه و این امید هست که در ادامه هم جمله مقصد بهتر تولید بشه.مشکلمشکل مسیر طولانیه. مسیری که مثلا کلمه‌ی انگلیسی milk در تصویر بالا باید طی کنه تا برسه به کلمه‌ی فرانسوری lait. یعنی از اولین encoder تا آخرین decoder. خب مشکل چیه؟ مشکل اینه که بردار ساخته شده برای کلمه milk تمام این مسیر باید کامل و سالم منتقل شه بدون اینکه احتمالا استفاده‌ای ازش بشه و همینطور باید گرادیان تمام این مسیر را هم برگرده. خب نمیشه این مسیر را کوتاه‌تر بکنیم؟ چرا می‌شه. اینجاست که «مکانیزم توجه» برمی‌خیزد و همه چیز را شخم می‌زند. ایده‌ی اصلی «مکانیزم توجه» را در پست بعدی می‌نویسیم.همونطور که گفتم، حالا قسمت دوم این رشته پست با نام داستان ترنسفورمرها (۲): attention برمی‌خیزد! و قسمت سوم این رشته پست با نام داستان ترنسفورمرها (۳): توجه و دیگر هیچ! منتشر شدند.منابعاین متن خلاصه‌ای از بخش‌های مرتبط در کتاب (فصل ۱۵ و ۱۶) و ویدیوی زیره. پس اگر دوست دارید خیلی خوب این مطالب را بفهمید حتما به این دوتا منبع هم مراجعه کنید.Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems 2nd Editionhttps://www.youtube.com/watch?v=iDulhoQ2proلایک و نظر یادتون نره. فعلا!</description>
                <category>overfit.ir</category>
                <author>علی اکبر بدری</author>
                <pubDate>Mon, 15 Jun 2020 20:59:43 +0430</pubDate>
            </item>
                    <item>
                <title>معیار سرگشتگی (perplexity)</title>
                <link>https://virgool.io/overfit/%D9%85%D8%B9%DB%8C%D8%A7%D8%B1-%D8%B3%D8%B1%DA%AF%D8%B4%D8%AA%DA%AF%DB%8C-perplexity-obyc9zkvwli2</link>
                <description>اول از همه باید به اطلاعتون برسونم اگر فکر کردین با یک پست روانشناسی یا فلسفی مواجه هستید، متاسفانه اشتباه گرفتید، این جا درباره یک معیار سنجش مدل‌های زبانی ( و مدل‌های زایای متن) و تفسیر احتمالاتی اون قراره صحبت بشه که احتمالا دردی از شما دوا نکنه. از این که ترجمه این معیار به فارسی میشه سرگشتگی و موجبات امید کاذب را برای شما خواننده جویای مطالب انگیزشی و روانشناسی مهیا کردیم متاسفم، خداحافظ شما :) و اما بعد ...به طور مختصر و مفید اگر بخوایم سریع سر بحث اصلی بریم باید بگم که هر مدل دنیای پردازش زبان (مثلا مدل‌های دسته‌بندی، تشخیص موجودیت‌های اسمی و البته مدل‌های زبانی) نیاز به ارزشیابی داره تا نشون بده چه کیفیتی داره. حالا ما قصد داریم که یک معیار ارزشیابی برای مسئله مدل زبانی ارائه کنیم. اصولا مدل زبانی‌ای مدل بهتری هستش که جملات خوب رو به جملات بد ترجیح بده. به بیانی بهتر، به یک جمله واقعی یا درست احتمالی بالاتر و به یک جمله غیرواقعی یا غلط احتمال پایین‌تری رو نسبت بده. مثلا انتظار داریم اگر یک مدل زبانی خوب داشته باشیم به جمله &quot;امروز صبح با مترو اومدم به دانشگاه&quot;  احتمال بیشتری بده تا به این جمله که &quot;امروز صبح با مترو اومدم به خیارشور&quot;، یعنی به طور دقیق‌تر در این نمونه شما انتظار دارید مدل زبانی با دیدن جمله&quot;امروز صبح با مترو اومدم به ....&quot; برای پیش‌بینی کلمه پیش‌ روش احتمال بیشتری رو برای کلمه دانشگاه و طبیعتا احتمال بسیار کمی رو برای خیارشور قائل بشه. حالا هر چه قدر یک مدل نسبت به یک مدل دیگر این فرق دانشگاه و خیارشور رو در این جمله بهتر بفهمه نشون میده که از اون مدل باهوش‌تره.بر همین ایده و شهود معیاری به نام سرگشتگی یا به انگلیسی perplexity تهیه شده که بررسی می‌کنه یک مدل به یک جمله صحیح، تا چه حد خوبی میتونی احتمال نسبت بده و البته برای این که طول جملات در محاسبه این معیار دخالت نکنن و باعث به هم خوردن نتایج نشن این معیار در فرمول خودش از طول جمله صحیح هم استفاده میکنن تا بر حسب اون هم نرمال بشه. اگر یک جمله رو با W نشون بدیم که W خود جمله‌ای به طول n متشکل از کلمات با ترتیب  w1, w2,w3, .. ,wn باشه اون وقت برای محاسبه سرگشتگی یک مدل زبانی برای جمله W داریم:یا اگر کمی راحت‌تر به قضیه نگاه کنیم:بخوایم حالا فرمول رو تفسیر کنیم، فرمول می‌گه که هر چه قدر که مدل زبانی احتمال بالاتری به جمله نسبت بده، مقدار سرگشتگی کمتر خواهد بود. پس این رو دقت کنیم که مدلی که سرگشتگیش کمتره عملکرد بهتری داره و هر چه perplexity کمتر مدل خوبتر.حالا همه چیز بستگی به این داره که مدل زبانی مورد نظر عبارت p(w1, w2, ...,wn) رو چطور می‌خواهد مدل و حساب کنه. فرض کنید با یک مدل زبانی آماری یونیگرام طرفیم که قاعدتا مشخصه که هیچ بهره هوشی نداره اون وقت داریم:نحوه محاسبه کردن احتمال جمله از دیدگان یک مدل یونیگرامولی مثلا اگر مدل زبانی مورد استفاده ما یک مدل بایگرام باشه داریم:نحوه محاسبه کردن احتمال جمله از دیدگان یک مدل بایگرامنگاه احتمالاتی به سرگشتگیسرگشتگی یک تعریف از زاویه دیدگاه احتمالاتی هم داره و اون اینه که یک مدل احتمالاتی چه قدر خوب می‌تونه یک نمونه از توزیع رو پیش‌بینی کنه. مثلا فرض کنید شما با یک کیف رمزدار مواجه هستید که رمزهایش سه رقمی هستند و هر رقم می‌تونه یکی از ارقام ۰ تا ۹ باشه. این جا رمزها یک سمپل از توزیع احتمالاتی متغیرتصادفی رمزهای انتخاب شده هستند و اون جوری که شما رمزها رو انتخاب میکنید هم توزیع احتمالاتی هستش که برای پیش‌بینی این نمونه‌های رمز به کار می‌برید. حالا فرض کنیم شما بدون هیچ اطلاعاتی بخواین یکنواخت ارقام رو انتخاب کنین اون وقت perplexity روی این مجموعه می‌شه:جالب شد، نه؟ یک شهود دیگه ای که از سرگشتگی ارائه میدن اینه که ضریب انشعاب متوسط یک مدل در فرآیند پیش‌بینی یک سمپل به چه شکل هستش. یعنی اینجا به طور متوسط مدل در انتخاب هر یک از سه رقم ۱۰ انتخاب داره.حالا بیایم مسئله رو ساده‌تر کنیم و فرض کنیم شخصی به شما اطلاع داده که میدونه که رقم اول رمز صفر نیستش و رقم دوم هم یک عدد فرده،قاعدتا با این اطلاعات در این حالت دانش شما نسبت به نمونه‌های رمز بیشتره حالا برای محاسبه سرگشتگی تو این مورد داریم:می‌‌بینید که در این حالت سرگشتی یا به قولی ضریب انشعاب متوسط کمتر شد و این به معنیه که مدل الان نسبت به حالت قبل سرگشتی کمتری در پیش‌بینی نمونه‌رمز‌ها داره. میزان سرگشتگی مدل‌های زبانی فعلیدر نهایت برای این که عددی دستتون بیاد که وضع فعلی سرگشتگی مدل‌های زبانی چه شکلیه، باید بگم که بنا بر پیپرها و روش‌های ارائه شده بر روی دیتاست Penn Treebank، میزان سرگشتگی یک مدل زبانی LSTM ای حول و حوش ۷۸، سرگشتگی مدل GPT-2 با یک و نیم میلیارد پارامتر برابر با 35.76 و میزان سرگشتی مدل جدید GPT3 با ۱۷۵ میلیارد پارامتر برابر با 20.5 هستش.</description>
                <category>overfit.ir</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Tue, 09 Jun 2020 15:58:08 +0430</pubDate>
            </item>
            </channel>
</rss>