<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمدمهدی سمیعی</title>
        <link>https://virgool.io/feed/@mmsamiei</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 11:52:29</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/43635/avatar/18f1Zn.jpeg?height=120&amp;width=120</url>
            <title>محمدمهدی سمیعی</title>
            <link>https://virgool.io/@mmsamiei</link>
        </image>

                    <item>
                <title>وقتی پاییز دیگه پاییز نیست، اندکی داده‌کاوی روی داده‌های آب و هوا</title>
                <link>https://virgool.io/@mmsamiei/%D9%88%D9%82%D8%AA%DB%8C-%D9%BE%D8%A7%DB%8C%DB%8C%D8%B2-%D8%AF%DB%8C%DA%AF%D9%87-%D9%BE%D8%A7%DB%8C%DB%8C%D8%B2-%D9%86%DB%8C%D8%B3%D8%AA-%D8%A7%D9%86%D8%AF%DA%A9%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%DA%A9%D8%A7%D9%88%DB%8C-%D8%B1%D9%88%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%D8%A2%D8%A8-%D9%88-%D9%87%D9%88%D8%A7-vrw26oto6bdh</link>
                <description>یحتمل شما هم تو زندگی‌تون این سناریو تجربه کردید. وقتی که با یکی از افراد پرسن و سالتر از خودتون، تو کوچه، تو سوز سرمای پاییز یا زمستون دارید راه می‌رید بهتون میگن که ما وقتی بچه بودیم زمستون این شکلی نبود که. شب چله حتما برف می‌اومد. صبح که می‌شد با تا زانو تو برف راه می‌رفتیم تا مدرسه و ....این سناریوها شنیدنشون جوری بود که انگار راویان این زمستون‌های سخت، دارند از عصر یخبندان دور تعریف می‌کنند. ولی امسال، همزمان با پیرشدن احساس کردم که انگار من هم طبق نفرین گرمایش زمین دارم به یکی از راویان این سناریوها تبدیل می‌شدم. به خودم و دیدم که شب چله است و پاییز تموم شد، در حالی که نه بارون خاصی به ذهنم موند ازش و نه لرزیدنی در سوز سرمایش. از همین‌جا بود که تصمیم‌ گرفتم به صورت مستدل بگردم ببینم آیا &quot;واقعا&quot; پاییز امسال تهران فرقی با سال‌های قبل داشت یا این توهم و جوگیری منه که سعی می‌کنم این پاییز رو جوگیرانه‌تر از چیزی که هست توصیف کنم. سعی کردم بنابراین با جمع‌آوری داده و یکسری نمودار ساده و سریع این پرسش رو پاسخ بدم.اول از همه نیاز به داشتن داده از آب و هوای تهران داشتم. خیلی سایت‌ها رو گشتم ولی api درست درمونی پیدا نکردم (یا شاید هم خوب نگشتم) نهایتا سایت open-meteo.com رو پیدا کردم و تونستم ازش به صورت محدود، داده‌های آب و هوایی تهران از ۱ ژانویه ۲۰۰۰ به اینور رو بگیرم (می‌شه ۱۰ دی ۱۳۷۸ اگر اشتباه نکنم)این سایت‌ داده‌های متنوعی از آب و هوا رو میتونه در اختیار بذاره که البته خیلی‌هاشون رو من نمی‌دونستم چیه. پس صرفا سعی کردم چیزایی که می‌دونم رو روشون کار کنم. من برای هر روز از ۱ ژانویه ۲۰۰۰ به اینور، مقادیر این اطلاعات آب و هوایی رو جمع کردم پس: کمینه دما، بیشینه دما، متوسط دما،‌ بارش باران، بارش برف، کل بارش (جمع باران و برف) و تعداد ساعات بارشی هر روز (یعنی هر روز چند ساعت بارونی یا برفی بوده). این متغیرها خیلی کم و سطحی به نظر میان، ولی جلوتر می‌بینیم که از روند تغییر ۲۳ ساله همین‌ها هم از توشون می‌شه حرف درآورد. سعی می‌کنم تحلیل رو سوال‌طور جلو برم. به این معنا که در هر بخش اول پرسشی مطرح کنم و حول اون پرسش تحلیل رو شکل بدم:آیا پاییز ۱۴۰۲، در تهران میزان بارش‌ها غیرعادی بود؟با توجه به نمودار زیر مشخصه که بله!میزان بارش در پاییز ۱۴۰۲ نسبت به میانگین این ۲۴ سال پایین‌تر بوده. هر چند که سال‌های خراب‌تر از امسال رو هم داشتیم. سال‌هایی مثل ۱۴۰۱ یا ۱۳۹۶ که میزان خیلی خیلی بدتر از امسال بوده. یک نکته اضافه کنم که ارقام نمودار بالا برحسب میلی‌متره. آیا آذر ۱۴۰۲، در تهران میزان بارش‌ها غیرعادی بود؟بله بسیار بسیار غیرعادی! در حد افتضاح!در واقع اینجوری که پیداست، در خیلی از سال‌ها حجم زیاد بارش پاییزه به خاطر بارش‌های ماه آذر بوده. در صورتی که امسال در تهران میزان بارش در این ماه، در بی سابقه‌ترین وضع خودش در ۲۴ سال اخیر بوده. رقمی که خیلی ناچیز و عجیب و غریبه.آیا اوضاع برای همه شهر‌های ایران این شکلی بوده؟برای پاسخ به این سوال که وضع شهر‌های دیگه چه بوده، داده‌های رشت و اصفهان و مشهد و اردبیل رو هم جمع آوری کردم که وضع اونها چه طور بوده. رشت:اردبیل:اصفهان:مشهد:همونطور که مشخصه همه این شهرها، آذرماه خوبی رو به خاطر عدم ورود سامانه بارشی نداشتند.آیا اوضاع برای ما (ایران) اینطوریه یا بقیه هم همینند؟اگر اهل توییتر باشید میبینید هر از گاهی برخی تئوری توطئه‌ مطرح می‌کنند که در ترکیه بارش میاد و در ایران نه. برای این که به صورت مستدل‌تر به این ادعا نگاه کنیم، من آمار بارش‌های دو شهر اربیل عراق و وان ترکیه رو که هر دو در سمت غرب ایران و ورود سامانه‌های بارشی هستند رو هم گرفتم و نمودارشون رو در آذر کشیدم.وان ترکیه:اربیل عراق:آمار وان از جهت بارش بالای میانگین و آمار اربیل از بابت آن قدر فاجعه نبودن مشکوک به نظر می‌رسن.آیا اصلا میزان بارش در وان و اربیل کوریلیشنی با شهرهای ما دارند؟حالا که وسوسه تئوری توطئه در ذهنمون شکل گرفت که چرا میزان بارش در وان و اردبیل متفاوته، این جرقه تو ذهنمون می‌زنه که خب اصلا بریم بررسی کنیم آیا قبلا میزان بارش در ماه آذر در شهرهایی مثل وان و اربیل با شهرهای ما نسبت و کوریلیشنی داشتند یا نه ؟ یک مورد دیگه هم اضافه می‌کنیم که آیا اصلا میزان کوریلیشن میزان بارش‌های شهرهای خودمون با هم چه قدر هستند، برای پاسخ به این سوالات می‌ریم و ضریب پیرسون بین میزان بارش شهرهای مختلف رو درمیاریم: رشت و وان:  ۰.۳۶اردبیل و وان: ۰.۶۷اردبیل و اربیل: ۰.۳۴رشت و وان: ۰.۲۸اردبیل و تهران: ۰.۷۱اردبیل و رشت: ۰.۷۲اردبیل و مشهد: ۰.۴۱اردبیل و اصفهان: ۰.۲۱تهران و مشهد: ۰.۴۳آمار بالا و مخصوصا کوریلیشن بین اردبیل و وان قابل توجه هستند. ارومیه رو وارد بازی کنیم. وضع اون چی میگه؟با این که ضریب پیرسون بین اردبیل و وان بالاست ولی فاصله‌شون هم زیاده (۵۵۰ کیلومتر) بیاید داده ارومیه رو هم بگیریم که هم فاصله‌شون با وان کمه (۲۸۰ کیلومتر) و هم بیشتر مطمئن بشیم آیا واقعا تفاوت عجیبی هست یا نه.اول بریم سراغ میزان بارش ارومیه در آذر امسال و سال‌های قبل:افتضاح! مثل بقیه شهرهای ایران. حالا بیاید کوریلیشن بارش‌ها در ارومیه را با شهرهای دیگه مقایسه کنیم:ارومیه و وان: ۰.۷۹ارومیه و اربیل: ۰.۸۰ارومیه و اردبیل: ۰.۶۹ارومیه و تهران: ۰.۷۶مکث! چه کنم ؟!؟!واقعتیش من این کدزدن‌ها رو به این نیت شروع کردم که نشون بدم توطئه‌ای در کار نیست و تئوری توطئه‌ها رو باید دور بریزیم و اینها ولی با این آمار‌ها الان خودم متعجب شدم وسط کار :)))))))آیا واقعا ارومیه با تهران و وان کوریلیشنی داره؟مساله الان برای من عوض میشه به این که اصلا آیا این کوریلیشنی که پیدا کردیم در ابعاد دیگه هم صدق میکنه؟؟بعد از چند دقیقه فکر کردن به این نتیجه رسیدم که سرم خیلی شلوغه و مسائل مهمتری دارم و اگر بخوام برم سمتش روش گیر می‌کنم :))))) در نتیجه حل این مساله (یعنی کوریلیشن داشتن میزان بارش در ارومیه و وان و بررسی این تئوری توطئه که ابرها داخل ایران یهو رفتارشون عوض می‌شه) رو به هر خواننده‌ علاقه‌مندی وامی‌گذارم.وضع اون دورترها چطور بوده؟بیاید بررسی کنیم که مثلا وضع برلین در بارش‌های پاییزی چطور بوده:همونطور که می‌بینید گویا وضع اونا نسبت به میانگین این ۲۴ ساله بسیار هم خوب بوده! اصلا در ۲۴ سال گذشته این قدر وضعشون خوب نبوده! انگار فقط شانس ما خرابه.وضع دمای تهران در پاییز چطور بوده؟اگر از بارش عبور کنیم بریم سراغ دمای هوا. این پاییز ۱۴۰۲ ای که گذشت احتمالا خیلی‌هامون خیلی از بافتنی‌هامون رو هنوز از تو ته بقچه‌ها بیرون نیاوردیم. حالا بررسی کنیم آیا به خاطر تغییر مد بوده یا این که واقعا هوا گرم شده؟سوال اول این که آیا میانگین هوا در پاییز در تهران واقعا تفاوتی داشته نسبت به سال‌های پیش؟اول بیاید میانگین دماهای هر پاییز رو حساب کنیم:خیلی معناداره! ما واقعا گرمترین پاییز قرن ۲۱ رو امسال سپری کردیم! اون هم با میانگین دمای ۱۵ درجه!با توجه به آذرماه افتضاحی که از نظر بارش باران گذروندیم بیاید ببینیم آیا وضع دما هم خراب بوده؟همونطور که دیده می‌شه در حالی که در گذشته نه چندان دور میانگین دمای شبانه روز در آذرماه زیر ۵ درجه بود، چندین ساله که دیگه این اتفاق نمی‌افته (از ۹۶ به بعد) و بدتر این که امسال رسما به مرز ۹ رسیده!سوالی برام پیش اومد که پایین‌ترین دمایی که در هر سال در پاییز ثبت شده چه قدر بوده؟پاسخ اینه که در تمامی ۲۴ سال گذشته به غیر از ۱۳۹۷ ما همیشه در پاییز تونستیم دمای زیر صفر رو ببینیم ولی امسال باز هم میسر نشده. مثل این که واقعا گرمایش جهانی کار میکنه و جهان به طور ملموسی در حال گرم شدنه!وضع دمای شهرهای دیگه چه طور بوده؟بیاید اول اردبیل رو که همیشه به سرما معروفه میانگین دمای پاییزش رو ببینیم:اردبیل گویا فقط سال ۸۹ از امسال پاییز گرمتری داشته.بریم سراغ رشت: رشت هم با این که آب و هوای مرطوب و معتدلی داره ولی اون از هم گرمایش جهانی بی نصیب نمونده.بریم حالا سراغ ارومیه:ارومیه هم فقط سال ۸۹ پاییز گرمتری داشته. آیا شهرهای نزدیک به ایران هم وضع دمایی‌شون همینه؟بریم سراغ وان جنجالی:به طرز عجیبی وان هم امسال دماش اون قدر گرم نبوده در پاییز!!! مورد جالبی که تو این نمودار می‌شه دید اینه که در سال ۸۹ که هم اردبیل و هم ارومیه دمای بالایی داشتند،‌ وان هم دماش بالا بوده ولی امسال وان با اردبیل و ارومیه در بالا بودن دما همراهی نکرده!بریم سراغ اربیل عراق:موردی که برای وان صادقه برای اربیل هم تمام صادقه! خیلی عجیبه!آیا بین دمای ارومیه و وان کوریلیشنی هست؟ دوباره اون سوال در مغزم شکل گرفت که قبلا که دیدیم بین بارش کوریلیشن هست بیایم حالا واسه دما کوریلیشن رو اندازه بگیریم. ضریب پیرسون متوسط دمای پاییز بعضی شهرها با هم رو این زیر نوشتم:ارومیه و وان: ۰.۹۰ارومیه و اربیل: ۰.۸۶ارومیه و تهران: ۰.۷۰ارومیه و رشت: ۰.۸۳ارومیه و مشهد: ۰.۶۲عجیب و قابل تامل!از دمای برلین چه خبر؟برای حسن ختام بیاید دمای اون دور دورها یعنی برلین رو هم بررسی کنیم:برلین هم امسال پاییز آن‌چنان گرمی نداشته.آیا امیدوار بمونیم؟برای حسن ختام هم می‌تونیم بین میزان بارش در آذرماه با میزان بارش در زمستون کوریلیشن بگیریم ببینیم آیا وضع همینه یا می‌تونه غیرقابل پیش‌بینی باشه؟پیرسون میانگین بارش در آذرماه و در زمستان (تهران): -۰.۲۲خیلی جالب! یک جوری نشون میده که انگار آذرماه‌های خشک در پی‌شون زمستون‌های پربارش بوده. البته وقتی پیرسون میانگین دمای آذرماه و زمستون رو می‌گیریم میشه ۰.۴۸ و باید اندکی ناامید بشیم.برای حسن ختام واقعی این نمودار میزان بارش در آذرماه و زمستان رو در نظر بگیرید و امیدوار بمونیم که مثل سال‌های دیگه‌ای باشه که بعد از پاییز خشک با زمستان پربارش مواجه شدیم:گرنه که اگر قرار باشه زمستون هم مثل پاییز باشه، تابستون خیلی سختی خواهیم داشت.</description>
                <category>محمدمهدی سمیعی</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Fri, 29 Dec 2023 02:02:32 +0330</pubDate>
            </item>
                    <item>
                <title>درس‌هایی که از درس‌دادن آموختم</title>
                <link>https://virgool.io/@mmsamiei/%D8%AF%D8%B1%D8%B3-%D9%87%D8%A7%DB%8C%DB%8C-%DA%A9%D9%87-%D8%A7%D8%B2-%D8%AF%D8%B1%D8%B3-%D8%AF%D8%A7%D8%AF%D9%86-%D8%A2%D9%85%D9%88%D8%AE%D8%AA%D9%85-ozsythh8a9bc</link>
                <description>یکی از میل‌های همیشگی من آموزش‌دادن بوده است، همیشه دوست داشتم مفهومی را که یاد می‌گیرم را با نظر خودم پخته‌تر کنم و به دیگران نیز انتقال دهم. حال در ترم بهار سال ۱۴۰۲ این فرصت برای من پیش آمد که درس هوش مصنوعی دانشکده کامپیوتر را در نقش استاد مدعو ارائه کنم و برای اولین بار چنین تجربه‌ای داشته باشم. این فرآیند که چند ماه طول کشید و اولین تجربه من بود، با داشتن فراز و نشیب‌های فراوان برای من نکات زیادی را همراه داشت. سعی کرده‌ام در این پست این نکات را در حکم تجربه‌ای که گذشت مطرح کنم. قبل از هر چیز از دکتر رهبان (مدیر وقت گروه هوش) و دکتر سلیمانی بابت این فرصتی که به من دادند، تشکر می‌کنم. راستی عکس‌هایی که در ادامه می‌بینید هم همگی توسط هوش مصنوعی bing تولید شده‌اند.Don Quixote as a Teacherنکته صفر: از دانشجو تا مدرس (ولی افتاد مشکل‌ها)نکته صفر: روزگاری بود که دانشجو بودم و دوست داشتم TA (تدریسار) شوم. روزگاری TA بودم و دوست داشتم که HeadTA (سرتدریس‌یار) شوم. روزگاری بود که HeadTA بودم و دوست داشتم مدرس باشم. اگر نیروهای انسانی حاضر در یک درس را همین چهار رکن دانشجو، تدریسیار،‌ سرتدریسیار و مدرس بدانیم، اکنون من هر چهار مرحله را در این بازه ۵ ساله تجربه کرده‌ام و همین تجربه‌کردن همگی اینها در این بازه کوتاه به نظرم فرصت بهتری به من می‌دهد تا بدون فاصله گرفتن از هر کدام از این شخصیت‌ها نظر بهتری بدهم. قاعدتا من هم در هر یک از جایگاه‌هایی که بوده‌ام از سمت جایگاه‌های بالاترم گاها اذیت شده‌ام. تدریس‌یارهایی را تجربه کردم که تمرین‌های ظالمانه طراحی می‌کردند، هد‌هایی را دیده‌ام که گویا فرشته عذاب درس بوده اند و استادهایی که فقط آرزو می‌کنی درسش پاس شود و تمام. آن چه اغلب ما در دانشگاه تجربه می‌کنیم کیفیت پایین اکثر دروس است که برای ما خاطره آن چنان مثبتی نمی‌سازند. حال از پاییز ۱۴۰۱ که پیشنهاد تدریس مطرح شد تا امروز ۱۵ تیر که نمرات نهایی شد، من تمام خواسته‌ام ساختن یک تجربه مثبت و کارآمد برای مجموعه درس بوده است. در بعضی‌ جاها به نظرم موفق بوده‌ایم و البته در شاید اغلب موارد به آن چه فکر می‌کردیم نرسیدیم و البته این نرسیدن‌ها به من فهماند که این موضوع ساخت درس با کیفیت بالا پیچیدگی‌های بسیاری دارد. من در این پست می‌خواهم همین دشواری‌ها و مسائل را در موردشان بحث کنم. جاهایی که به نظرم درست عمل کردیم و می‌توانند دوباره تکرار شوند و جاهایی که نتوانستیم مساله‌ای که باید را حل کنیم و باید راه‌حل دیگری بر آن امتحان شود و جاهایی که اصلا مساله خوش تعریف نیست و باید دوباره به آن پرداخته شود. من در ادامه می‌خواهم فرآیندی که این چند ماه طی کردیم و مشکلاتی که با آن‌ها رو به رو شدیم و راه‌حل‌هایی که امتحان کردیم را به همراه نتایج آنان با شما در میان بگذارم. با ما همراه باشید :)))A lot of nonsense contents and papers, painting by picasoنکته یک: سیلابسسیلابس و برنامه‌درس بسیاری از دروس ما کهنه، قدیمی و به معنای واقعی کلمه بی‌فایده‌اند. این ویژگی‌ها مخصوصا در رشته کامپیوتر که سرعت تغییرات در آن بالا است برای دانشجویان واضح‌تر است. در مورد درس هوش (با شماره 40417) من کمتر با این مشکل مواجه بودم. چرا که برنامه این درس چندین بار در دانشکده مورد اصلاح‌های جزیی در سالیان قبلی قرار گرفته بود و مباحث جدیدتر مانند لرنینگ به آن اضافه شده بود. به طور کلی سیلابس درس هوش فعلی دانشگاه شریف از سه بخش الگوریتم‌های کلاسیک سرچ (و البته RL)، شبکه‌های بیزی و لرنینگ تشکیل شده است و از درس cs188 دانشگاه برکلی الهام‌گیری شده است. با توجه به سمت و سوهای حرکت هوش مصنوعی در سالهای گذشته به نظرم در این سیلابس می‌توان تغییراتی اعمال کرد. نکته اول این که می‌توان مبحث CSP را حذف کرد چرا که اصلا ربطی به هوش ندارد و بیش‌تر به نظرم مربوط به درس طراحی الگوریتم است (کما این که آن جا هم حضور دارد) و حذفش نیز آسیبی به درس نمی‌زند. دوم این که به نظرم مبحث HMM‌ها نیز با توجه به رشد شبکه‌های عصبی و ناکارآمد شدن راه‌حل‌های مبتنی بر شبکه‌های مارکوف در برابر شبکه‌های عصبی، قابل حذف هستند. نکته سوم این که با حذف‌کردن این دو مبحث چیزی حدود شاید چهار جلسه اضافه می‌شود که می‌توان آن‌ها را به یادگیری تقویتی(مخصوصا) و یادگیری عمیق اختصاص داد. سابقاها در درس هوش این گونه بود که یادگیری تقویتی بعد از یادگیری ماشین تدریس می‌شد و معمولا هم به خاطر همین در انتهای ترم بودن، قربانی می‌شد. اما در این ترم با صحبتی که با دکتر رهبان داشتیم تصمیم گرفتیم تا هر دو گروه، مبحث یادگیری تقویتی را بعد از سرچ مطرح کنیم. نتیجه به نظرم بسیار مثبت بود و بسیاری از دانشجویان به یادگیری تقویتی (یا همان Reinforcement learning) علاقه‌مند شدند. من خودم فکر می‌کردم تدریس RL قبل از ML کارنشدنی باشد ولی این ترم فهمیدم که اتفاقا شهودهای ساده و زیبایی در پشت RL قرار دارند که در صورتی که آن را بعد از ML ارائه دهیم ممکن این است شهودها پشت یادگیری ماشین گم شوند. به هر صورت، تغییر سیلابس درس در اختیارات من نیست و فکر کنم در اختیارات وزارت علوم است اما با توجه به ترند و رشد فعلی هوش مصنوعی می‌توان تغییراتی در آن به وجود آورد یا حداقل با ارائه‌ درس‌های اختیاری جدید بخشی از اهداف این نو و به روز بودن را محقق ساخت.A renaissance painting of a A team of rescuers trying to deal with problems نکته دو: تیم تدریس‌یاربا توجه به این که وظیفه استاد ارائه و آموزش درس است و وقت نمی‌کند تا خود به طراحی تمرین بپردازد در نتیجه به تعداد تدریس‌یار (به اختصار TA) نیاز داریم که تمارین را طرح و آنان را تصحیح کنند. این تدریس‌یاران باید حتی المقدور از بچه‌های کارشناسی باشند که درس را به تازگی گذرانده‌اند و حال و هوای آن هنوز در سرشان است. حال از آن‌جایی که نظارت به این تدریس‌یاران خود و همچنین درخواست‌های دانشجویان (در مسائلی مانند مهلت ارسال تمارین و رسیدگی به تقلب‌ها و ...) خود امری مستلزم انرژی است، ما نیاز به سرتدریس‌یار (به اختیار HeadTA) داریم. سرتدریس‌یار معمولا از بچه‌های ارشد انتخاب می‌شود تا هم مشغله درسی کمتری داشته باشد و هم تجربه و سنش به کمک او در تصمیم‌گیری‌ها بیایند. در انتخاب سرتدریس‌یار بایستی به دو نکته توجه کرد، یکی این که او بایستی با سیاست‌های کلی موردنظر شما برای درس همسو باشد تا با یکدیگر به اختلاف نخورید و دو این که او باید ویژگی‌هایی داشته باشد تا بتواند شما را در درس پوشش دهد. مثلا من شخصیت مهربانی هستم و در برابر تقاضاهای بی‌پایان دانشجوها برای تمدید الی القیامت تمرین‌ها مقاومت نمی‌کنم برای همین باید سراغ کسی بروم که بتواند به آن‌ها نه بگوید و دقیق باشد. با توجه به این مسائل من به سراغ سروش وفایی‌تبار و محمدرضا فریدونی دو تن از دانشجوهای خوب ارشد آزمایشگاهمان رفتم. من با این دو نفر از لحاظ شخصیتی راحت و نزدیک بودم و از آنان تقاضا کردم تا در این درس به عنوان HeadTA به من کمک کنند. این دو نفر نیز در طول ترم واقعا به داد من رسیدند و اگر آنان نبودند یحتمل دچار مشکلات جدی در زمان‌بندی‌ها می‌شدیم. بسیاری از جاها من می‌خواستم تصمیماتی بگیرم و این‌ها مخالف من بودند و البته بعدا فهمیدم که نظر آنان به صلاح‌تر بوده است. در کل داشتن یک همچنین افرادی در کنار خودتان قطعا کار راه بنداز است. بعد از انتخاب این عزیزان، محمدرضا (ما بهش می‌گیم ممرض) به من پیشنهاد داد تا محمدجواد ماهرالنقش (که دانشجوی کارشناسی بود و ترم قبل هوش مصنوعی پاس کرده بود) را به عنوان تی‌ای تمرین‌ها انتخاب کنیم. من اولش نمی‌دانستم چرا و از روی اعتماد به ممرض قبول کردم ولی هر چه گذشت بیشتر از بابت این تصمیم خوشحال شدم، چرا که محمدجواد هم با بچه‌های کارشناسی نزدیک‌تر بود و فیدبک‌های آن‌ها را می‌گرفت و هم پیگیری وحشتناک و عجیبی برای سر برنامه‌بودن این درس داشت. محمدجواد به معنای واقعی کلمه مدیر و پیگیر بود و همن ازش نقش مهمی در فرآیند ارائه درس ساخت (منظورم اینه که وقتی دارید آدم انتخاب می‌کنید قبل از خفن بودن به کارا بودنش دقت کنید). کلا من این ترکیب دو تا HTA ارشد و یک Lead-TA کارشناسی رو توصیه می‌کنم، HTA‌ها به شما در فرآیند تصمیم‌گیری کمک می‌کنند و Lead-TA هم با توجه به کارشناسی‌بودنش با بچه‌ها لینک بهتری داره و ارتباط بین استاد و دانشجوها رو راحت‌تر می‌کنه. بقیه TA‌ها هم همگی گل بودند و من ازشون بابت تمامی زحماتشون در به موقع رسوندن طراحی تمرین‌ها و تصحیح‌شون ممنونم.نکته سوم: برنامه و سیستم ارزیابیما (یعنی من و سروش و ممرض) از ابتدا چندین ساعت با هم بر سر اهداف درس و نحوه ارزیابی بحث کردیم و به نتیجه زیر رسیدیم:درس کارشناسی، محل آشنا شدن افراد با موضوعات است. انسان در دوره کارشناسی باید با موضوعات مختلف آشنا شود و آن‌ها را تجربه کند تا بتواند تصمیم بگیرد که دوست دارد بعدا روی چه چیز متمرکز شود. از این رو لود و میزان بار درس باید معقول و قابل هندل‌کردن باشد.بر همین نتیجه سعی کردیم آیتم‌های ارزیابی خود را با این اصل به پیش ببریم. ما برای ارزیابی، چهار آیتم کوییز، تمرین‌ها، امتحان‌های میان‌ترم و پایان‌ترم را در نظر گرفتیم. کوییز بایستی در حدی ساده می‌بود که هر کسی که در کلاس حاضر بوده است و گوشش به مطالب خورده قادر به پاسخ‌دادن به آن‌ها باشد و تاریخ‌های برگزاری آن نیز از قبل در تقویم درس به دانشجویان اعلام شده بود. تمرین‌ها نیز شامل دو بخش تئوری و عملی بودند که بخش تئوری بایستی در حد انجام الگوریتم‌های ارائه شده در درس می‌بودند و در بخش عملی نیز دانشجوها باید همین الگوریتم‌ها را پیاده‌سازی می‌کردند. تلاش ما بر این بود که هر کدام از تمرین‌های تئوری یک روز و تمرین‌های عملی نیز یک آخر هفته از دانشجوها وقت ببرد. امتحانات میان‌ترم و پایان‌ترم نیز هر کدام شامل دو بخش مفهومی و محاسباتی بودند. بخش مفهومی بخش سخت‌تری بود که دانشجو بایستی به حکمت و چرایی مسائل مطرح‌شده در درس و  راه‌حل‌های آن‌ها تسلط می‌داشت. یک ارائه هم در آخر درس گذاشتیم و یک سری موضوعات تعیین کردیم تا دانشجوها آن‌ها را بردارند و ارائه دهند. معمولا روال کار برای ارائه در بعضی دروس این شکلی است که دانشجوها باید یک مقاله را ارائه دهند اما بعد از مشورتی که با ممرض داشتیم به این نتیجه رسیدیم که از آن‌جایی که دانشجوی کارشناسی هنوز عمیق نشده این که یک موضوع را به صورتی کلی ارائه بسیار خواهد بود تا این که بخواهد یک مقاله را بخواند و نفهمیده ارائه دهد.A renaissance painting of evil and deadlineنکته چهار: مرگ بر عادی‌سازی تاخیرکرونا باعث تحولات زیادی شد و دنیا رو به دو تاریخ قبل و بعد خودش تقسیم کرد. در دانشگاه شریف رسمی وجود داشت به اسم تاخیر مجاز. به این معنا که شما می‌تونستید تکالیف‌تون رو با تاخیر بفرستید و مثلا در کل ترم هشت روز تاخیر مجاز برای اون درس داشتید. گذر زمان و البته کرونا باعث شد که اولا هم مفهومی به نام تاخیر غیرمجاز اضافه بشه که شما وقتی تاخیرهای مجازتون تموم شد می‌تونین با کسر درصدی از نمره تمرینتون رو بفرستید و هم این که مقدار روز تاخیرهای مجاز به حتی ۲۰ یا ۲۵ روز هم رسید!حال چرا این مکانیزم مشروعیت دادن به تاخیر بد است؟ اولا شما در واقعیت تاخیر مجاز یا غیرمجاز ندارید. در صنعت شما نمی‌توانید تاخیر داشته باشید. در نتیجه آدم باید یاد بگیرد که ددلاین وجود دارد (خود من نیز هم).دوما مکانیزم مشروعیت دادن به تاخیر باعث وسواس و عدم تمام‌کردن امور می‌شود. انسان همش با خودش می‌گوید بذار این قسمت را هم بزنم و بعد بفرستم فوقش از تاخیرهایم استفاده می‌کنم و همین حس عدم تمام‌کردن آدم را آزار می‌دهد.وقتی سیستم تاخیر مجاز داریم ساعت به ساعت مهم می‌شود. مثلا فرض کنید ساعت ۱۲ شب شده و شما وارد باز تاخیر خود شده‌اید و نیاز به سه ساعت دیگر وقت گذاشتن دارید تا کارتان را تمام کنید. با توجه به این که سیاست تاخیر مجاز به صورت ساعتی حساب می‌شود، شما اگر بخوابید و شش صبح پاشید و سه ساعت وقت بگذارید، ۹ ساعت از میزان تاخیرهایتا را از دست داده‌اید ولی به نفعتان است که آن شب را نخوابید و تا صبح کد بزنید. بنابراین سیاست تاخیر مشروع به سلامتی شما هم گند می‌زند.بر اساس همین دلایل، من قبل از حتی ارائه درس تصمیم گرفتم تا به هر نحوی با عادی‌سازی تاخیر مقابله کنم. حضور سروش و ممرض و موافقت آنان نیز به عنوان هدتی‌ای‌ها باعث کمک و دلگرمی من شد. ما همان ابتدای ترم به دانشجو‌ها اعلام کردیم که سیاست تاخیر نداریم و دانشجوها هم قبول کردند. ولی هر چه جلوتر می‌رفتیم طبق عادتی که دانشجوها با بقیه درس‌هایشان داشتند فشار می‌آوردند که ما هم تاخیر مجاز داشته باشیم اما با پایداری ما به هر نحوی که بود مانع از این اتفاق شدیم و در نهایت یک درس بدون عادی‌سازی تاخیر ساختیم. به این امید که ملت لذت تمام‌کردن کارها را بچشند و بدانند که زندگی تاخیربردار نیست! البته ما امکانی را قرار دادیم و به بچه‌ها گفتیم که اگر مشکلی برای‌تان پیش آمد می‌توانید به ما پیام بدهید و بعد از بررسی ما تمرین را صرفا برای شخص شما تمدید خواهیم کرد که در طول ترم هم خیلی از بچه‌ها از این امکان استفاده کردند و در این زمینه سروش واقعا عالی و با حوصله عمل کرد و تک تک مشکلات بچه‌ها را بررسی کرد. Painting, by van gogh, a programmer works hard in night نکته پنج:‌ تمدید تا صبح؟ هرگز!وقتی گفتیم تاخیر مجاز برای تمرین‌ها در کار نیست حالا با سیل انبوهی از درخواست‌های تمدید مواجه شدیم. در راه کلاس، داخل کلاس،‌ بیرون کلاس، در راه سلف، داخل سلف، در اینباکس جی‌میل و ... جایی نبود که از ما درخواست تمدید نداشته باشند. وقتی پایمردی کردیم و می‌گفتیم نه تمدید نداریم (تمدید نمی‌کردیم چون اگر می‌کردیم از نظر برنامه عقب می‌افتادیم) حال با درخواست‌های بعدی مواجه می‌شدیم. لااقل تا شش صبح مهلت ارسال را تمدید کنید! من واقعا نمی‌فهمم! چرا استادان برخی درس‌ها این رسم تمدید تا شش صبح را جا انداخته‌اند؟ این کار غیراخلاقی، ضداخلاقی و شنیع است. ضد بشریت است. افتخار می‌کنم یکبار هم مهلت ارسال را تا صبح تمدید نکردیم و ملت را وادار به بیدار ماندن نکردیم. نکته ششم: دوگانه عدالت یا رفاهتصویری که در بالا مشاهده می‌کنید یکی از اسلایدهای جلسه صفر درس است. من از اول بنا داشتم که یک تجربه خوب برای بچه‌ها بسازم و هرگز باعث استرس و اذیت آن‌ها نشوم و از طرفی دیگر هم اهداف درس را محقق سازم و مفاهیم را به دانشجویان انتقال بدهم. ولی هر چه قدر جلوتر که رفتم با این دوگانه رفاه یا عدالت مواجه شدم. انسان ذاتا تنبل است و به فکر حرکت‌افتادن نیست. از طرف دیگر هم بودند کسانی که سخت تلاش می‌کردند. اگر به من بود دوست داشتم به همه ۲۰ بدهم ولی در این درس بود که تازه اندکی این دوگانه عدالت و دوست‌داشتن ملت برایم جا افتاد. ناچارا در خیلی از موقعیت‌های درس هر چه قدر هم که بچه‌ها تقاضای ناموجه مثل تمدید تمرین را داشتند مقاومت کردیم.a mascot of angry flower, digital art, concept artنکته هفتم: دلخوریخب هیچ گلی بی‌خار نیست! در طول ترم بارها می‌شد که دانشجوها از ما درخواست‌هایی داشتند (عمدتا تمدید) و ما خب چون مخالفت می‌کردیم دانشجوها هم ناراحت می‌شدند. اولاش من هم ناراحت می‌شدم ولی هر چه گذشت بیشتر عادت کردم که بدون این که هیچ کسی را ناراحت کنی نمی‌توانی کاری را پیش ببری :))) این فکر کنم جزو مهارت‌هایی بود که من نداشتم و بعد از این درس اندکی از آن به من اضافه شد‌ :)An ancient tablet of A professor and an empty class in the style of Giza in Ancient Egyptنکته هشتم: تدریس و حضوراز همان لحظه اول بدون هیچ تردیدی من در نظر گرفتم که حضور در کلاس اجباری نیست و حضور و غیابی در کار نخواهد بود با این استدلال که اگر کلاس جذاب باشد خود دانشجو خواهد آمد و این از تصورات اشتباه من بود :) دانشجویان بعد از کرونا بسیار تنبل شده‌اند و البته با وجود منابع آنلاین واقعا دلیلی وجود ندارد که دانشجو سر کلاس حاضر شود. با این وجود من برای همان ملتی که سر کلاس می‌آمدند سعی می‌کردم مفهوم را به خوبی برسانم. من در این ترم به نحوه تدریس زخمی‌کردن بیشتر رو آوردم. به این نحو که اول سعی می‌کردم مساله‌ای را در کلاس مطرح کنم و بعد از کلاس بخواهم که با هم این مساله را زخمی کنیم و دنبال راه‌حل دامی(ساده) برای آن باشیم و بعد راه‌حل را مرحله به مرحله گسترش بدهیم.A professor in the lust of using PowerPoint slides, cartoon styleنکته نهم: در دام اسلایدها گیر نیافتیداین نکته می‌توانست بخشی از نکته قبلی باشد ولی به نظرم این قدر مهم بود که باید جدا و برجسته می‌شد. با این که توانایی من در ارائه دادن قبلا برای خودم لااقل اثبا شده بود ولی من بعد از چند جلسه دچار مشکل شده بودم و نمی‌توانستم مطلب را خوب انتقال بدهم. یک روز با دکتر رهبان صحبت می‌کردیم که سخن جالبی گفت به این مضمون که اسلاید برای مدرس دام هست. من نیز فکر کردم و دیدم که خیلی درگیر این دام هستم و سعی می‌کنم خود را مقیود اسلاید کنم و انگار به جای درس‌دادن در حال ارائه‌کردن هستم (درس‌دادن با ارائه‌دادن خیلی فرق داره). برای همین از جایی به بعد تصمیم گرفتم که از اسلاید به عنوان بک‌آپ سر کلاس استفاده کنم و خود برنامه جلسه را بچینم و مستقل از اسلاید بتوانم ارائه دهم. این نکته مستقل‌شدن از اسلاید تاثیر زیادی روی کیفیت ارائه درس من در ادامه داشت و جزو نکات مهمی بود که یاد گرفتم.نکته دهم:‌ استادبودن فرصت غیبت نداردمن تا وقتی دانشجو بودم خیال می‌کردم خوش به حال این استادها چه قدر راحتند که جای من در درس نیستند ولی وقتی در جایگاه مدرس قرار گرفتم فهمیدم این‌ور هم سختی‌هایی دارد. مثلا از بازه انتهای فروردین تا انتهای اردیبهشت من دچار بر هم‌نهی چند مشکل شدم و به معنای واقعی کلمه Collapse کردم. اگر مسئولیت این درس را نداشتم، دوست داشتم چند وقتی اصلا به گوشه‌ای بخزم و تنها باشم اما به خاطر همین درس هم که شده مجبور بودم و به دانشگاه می‌رفتم. نکته این است که دانشجو می‌تواند هر وقت که دچار مشکل شد غیبت کند و نیاید ولی استاد این قابلیت را ندارد. باری به هر جهت آن بازه زمانی اردیبهشت برای من بازه سختی بود و البته هندل‌کردن آن هم برای من تجربه مفید دیگری داشت که آدم در حال Collapse هم می‌تواند وظایفش را انجام دهد. (یک بازه دیگری هم که خیلی اذیت شدم نیمه دوم فروردین بود که با ماه رمضان مصادف بود و من با زبان روزه هر روز صبح یک ساعت و نیم حرف می‌زدم و باقی روز دیگر توان حرف‌زدن نداشتم :))نکته یازدهم: جداکردن ددلاین تئوری و عملییک سیستم خوب باید بتواند تغییرات را به نحو خوبی بپذیرد و آنان را اعمال کند. بعد از چند سری تمرین، من و سروش و ممرض و محمدجواد به این نتیجه رسیدیم که شاید بهتر است که ددلاین تمرینات تئوری را از تمرینات عملی جدا کنیم و بین آن‌ها دو روزی فاصله بیاندازیم. یعنی مثلا ددلاین تمرینات تئوری تا جمعه شب بود و ددلاین عملی‌ها تا یکشنبه شب. این تغییر موثر واقع شد و بچه‌های درس هم از آن راضی بودند.Wrong place and time, everyone is asleep, nothing is working right, fantasy, digital artنکته دوازدهم: در مکان و زمان نامناسب!آخ آخ آخ. این نکته مرا نقره‌داغ کرد. من هم از زمان و هم از مکان کلاس نیاوردم و ترم که تمام شد به خودم گفتم ما را به سخت جانی خود این گمان نبود. کلاس ما ساعت ۹ صبح بود و برای کامپیوتری‌ها که صبح‌‌شان از ساعت ۱۱ آغاز می‌شود این ساعت قشنگ اوت بود. ملت یا نمی‌آمدند یا اگر هم می‌آمدند در حالت نیمه‌خواب بودند. البته حسنش این بود که ساعت خواب من تا چند وقتی اصلاح شده بود و سحرخیز شده بودم (چند باری حتی ساعت ۵ صبح رفتم نان بخرم ولی نانواها هم بیدار نشده بودند). باری به شما توصیه می‌کنم اگر خواستید زمان کلاس انتخاب کنید آن را به بعد از ظهر موکول کنید.از زمان بدتر اما مکان بود! مکان کلاس در ساختمان ابن سینا بود و پدر ما در آمد. هم کلاس گرم بود و تهویه مناسبی نداشت و هم این که پروژکتور و کابل‌ها و پین‌هایش خراب بودند و خیلی وقت‌ها کلی از دقایق ابتدایی کلاس صرف آن می‌شد. اشتباه من این بود که باید همان اول ترم مکان را عوض می‌کردم.A beautiful saint is turning into a devil, her wings are turning into fireنکته سیزدهم: شما یا به عنوان یک استاد خوب می‌میرید یا آن قدر زنده می‌مانید که خودتان را به عنوان استاد بد می‌بینید.یک دیالوگ معروفی هست از فیلم بتمن که:you either die as a hero or live long enough to be the villainمن قبل با خودم فکر می‌کردم که چه می‌شود که بعضی از استادان این قدر بی‌منطق و نچسب و خشک و روی اعصاب هستند. گاها داستان‌ استادهایی را شنیده بودم که قبلا خوب بوده‌اند و اکنون بد شده اند. و این ترم تازه به این مشکلات پی بردم. مشکلات استاد بودن زیاد است. شما با یک انگیزه زیادی درس دادن را شروع می‌کنید ولی هر چه جلوتر می‌روید آتش انگیزه‌هایتان کم‌سو‌تر می‌شوند و ذغال بر دلتان باقی میماند. مثلا عدم حضور دانشجویان سر کلاس یکی از این فاکتورهای بی‌انگیزه‌کننده است. یا مثلا درخواست‌هایی بیجایی که بعضا می‌کنند و از آن جایی که فاصله سنی من تا دانشجویان کم بود و خودم هم سعی در نزدیکی با آن‌ها داشتم گاها این درخواست‌ها نامحترمانه دنبال می‌شدند. من تجربه یک ترم را داشتم و فهمیدم که چه قدر سخت است. حال اگر شما چند سال در این جایگاه باشید و فیدبک انگیزشی مناسبی از سمت دانشجویان نگیرید، کم کم احساس بی‌ارزشی می‌کنید و مصداق همان دیالوگ می‌شوید. فلذا عزیزان دانشجو اندکی با استاد مهربان‌تر باشید.نکته چهاردهم: اگر به عقب برگردم؟آیا اگر به عقب بازگردم باز هم این تجربه را تکرار می‌کنم؟ بله. به دو دلیل، اول این که همین تجربه باعث شد من بهتر در جریان مشکلات آموزشی قرار بگیرم و هم به مهارت‌های مدیریتی‌ام اضافه شد و دلیل دوم آن که از نظر علمی نیز به سود من تمام شد. من این ترم فهمیدم که یادگیری یک چیز کامل نمی‌شود مگر آن بتوانید آن را به فرد دیگری یاد دهید. من برای مثال با این که یادگیری تقویتی را از قبل بلد بودم ولی این ترم چون مجبور شدم آن را از چند زاویه بررسی کنم و به آن حمله کنم تا راهی برای توصیف ساده آن برای دیگران پیدا کنم، احساس می‌کنم به یک درک بسیار بهتری از آن رسیدم. آن جلساتی که RL را توضیح می‌دادم بعضا خودم در پایان جلسه از مطالب ذوق می‌کردم و از دیدن شهودی که تا آن روز نداشتم لذت می‌بردم. فلذا تدریس به لحاظ شخصی هم تجربه مفیدی است.نکته پایانی: تشکردر پایان می‌خواستم باز هم از همه کسانی که این تجربه و فرصت را برای من فراهم کردند تشکر کنم. از دکتر رهبان و دکتر سلیمانی بابت در اختیارقراردادن این موقعیت، از سروش و ممرض و محمدجواد بابت مدیریت عالیشان، از اعضای تیم تدریس‌یار شامل امیررضا میرزایی، بنیامین ملکی، عماد صالحی، عرفان صدرائیه، امیرحسین عابدی، پردیس زهرایی، سیاوش رحیمی، سوگند صالحی، حمیدرضا دهباشی، علی مهربانی، امیررضا سلیمان بیگی و سلاله محمدی بابت همکاری و بالاخص نظم‌شان متشکرم. انشالله که این مطلب نیز سودمند بوده باشد.</description>
                <category>محمدمهدی سمیعی</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Fri, 07 Jul 2023 12:37:55 +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>محمدمهدی سمیعی</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Fri, 01 Jul 2022 19:49:31 +0430</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>محمدمهدی سمیعی</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>محمدمهدی سمیعی</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>محمدمهدی سمیعی</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Fri, 29 Oct 2021 15:52:01 +0330</pubDate>
            </item>
                    <item>
                <title>ملت، پهلوان و دیوید تیلور</title>
                <link>https://virgool.io/@mmsamiei/%D9%85%D9%84%D8%AA-%D9%BE%D9%87%D9%84%D9%88%D8%A7%D9%86-%D9%88-%D8%AF%DB%8C%D9%88%DB%8C%D8%AF-%D8%AA%DB%8C%D9%84%D9%88%D8%B1-rh5yumcdzzvp</link>
                <description>پرده اولحسن یزدانی چهار بر صفر پیش است اما طعم تلخ شکست‌های قبلی هنوز روی زبانمان است. ناگهان تیلور اقدام به زیرگیری می‌کند و پای یزدانی را بلند می‌کند. انگار که پای ما را بلند کرده باشد پای دیگر را همگی با تمام وجود به زمین می‌کوبیم و از ته دل آرزو می‌کنیم ای کاش حسن مقاومت کند و تیلور نتواند او را خاک کند. از قضا پاهایمان محکم می‌ایستد و این تیلور است که می‌افتد و ناکام می‌ماند. نفس راحتی می‌کشیم. چند لحظه بعد اما بالاخره این کابوس با خاک شدن حسن شروع می‌شود. بیست ثانیه به پایان بازی مانده است و تیلور غرق در حمله، اگر یک بار دیگر حسن را خاک کند بار دیگر دیدن لبخند بر صورت حسن برایمان حسرت می‌شود. ثانیه شمار به ۱۸ می‌رسد اما من طاقت و تحمل دیدن این ثانیه نحس را ندارم. رویم را آن طرف می‌کنم و از ته دلم می‌گویم خدایا خودت حسن را کمک کن. چند ثانیه بعد با صدای عامل برمی‌گردم و زیرگیری لحظه آخر حسن را می‌بینم. تیلور شکست خورد. ما فریاد می‌زنیم. حسن فریاد می‌زند. حسن بر روی زمین می‌افتد و ما بی اختیار مشغول دویدن دور خودمان می‌شویم. ملت و پهلوانشان هر دو خوشحالند. مژده باران به نفس های بیابان، به رگ خشک درختان، به شب خسته ایوان، برسان باز ...پرده دومبه شبکه‌های مجازی سر می‌زنم. اکثر مردم در حال خوشحالی هستند و اقلیتی در حال تذکر این نکته که ارزش طلای المپیک چندین برابر هر رقابتی است و آن شکست توکیو قابل جبران نیست. یاد چند ماه قبل می‌افتم که دوستم ابراز حسرت کرده بود که با باخت حسن در این فینال، او نخواهد توانست به رکورد چهار طلای المپیک لوپز برسد. قطعا تمامی این حرفها به لحاظ منطقی و ریاضی درست هستند ولی آیا فرق تمام این ها بیش از چند رقم و عدد است؟ عددهایی که در اکسل‌ها می‌نشینند و شاید روزی به درد مسابقات اطلاعات عمومی تلویزیون بخورند، اما به گمان من چیزی بیش از ترکیب ارقام نیستند. نبرد یزدانی و تیلور یک نبرد حیثیتی میان اراده‌ها بود. اراده‌هایی که به دنبال پاسخ به دو پرسش بودند. آیا تیلور شکست ناپذیر باقی می‌ماند؟ آیا حسن یزدانی بالاخره سحر این جادوگر را باطل می‌کند؟ من چه کار به ارقام و اعداد و تعداد مدل‌های طلای المپیک دارم. چهل سال دیگر میخواهم بنشینم و برای نوه‌هایم از داستان پهلوان درون قلبم صحبت کنم. از پهلوانی که در اوج بود. اما یک روز باخت. باز هم باخت. داشت می‌برد اما باز در آخرین ثانیه‌‌ها ناباورانه باخت. در نهایت برد! جای حسن یزدانی درون قلب من است نه در جدول‌های اکسل‌ها و دیتابیس‌ها. حسن یزدانی اگر قرار بود برای طلای المپیک کشتی بگیرد بعد از شکست دردناک دو ماه پیش باید از شدت افسردگی زمین‌گیر میشد تا سه سال بعد که المپیک پاریس برسد. اما از همان بعدازظهر تلخ قول جبران را داد. نه جبران طلای المپیک، بلکه جبران اندوهی که بر دل مردم نشسته بود. حسن یزدانی برای ارقام کشتی می‌گیرد اما از نوع ۸۰ میلیونی.پرده سومشخصا معتقدم تمامی فراز و نشیب‌های ماجرای چندین ساله حسن و تیلور، از حسن پهلوان والاتری ساخت. در واقع تمامی این ماجرا‌ها آرک و پیچش داستانی بهتری از قصه حسن یزدانی برای ما و نسل‌های بعدی ساخت. در یک دنیای موازی حسن یزدانی در رقابت‌های جام جهانی کرمانشاه بر تیلور گمنام پیروز می‌شود و تیلور اصلا مجال بروز و ظهور نمی‌یابد. یزدانی هم تا زمانی که کشتی می‌گیرد برنده تمامی ارقام ممکن می‌شود. این یزدانی بی نقص است اما قابل الگوگیری و همزادپنداری نیست. همه این ماجراهای تلخ و شیرین باعث شد فاصله ما و حسن کمتر شود. ما فهمیدم که حتی پهلوان اول شهر هم هر چه قدر قوی باشد باز هم مثل ماست و برای او نیز تیلوری وجود دارد که سد راهش شود. تنها ما نیستیم که خاک مشکلات روزگار می‌شویم. بنابر انگیزه و قدرت و پشتکار حسن و محاسبات ما این طلسم تیلور باید در توکیو شکسته می‌شد و البته بسیار هم نزدیک می‌نمود. اما بار دیگر تراژدی در هجده ثانیه مانده به پایان رخ داد تا پیچش داستان کامل شود. ما فهمیدیم که پهلوان هم ممکن است مانند ما در لحظات آخر غفلت کند و خاک شود و همه ما با هم در آن لحظه پس از دیدن ثانیه‌های اندک ثانیه شمار دست بر زمین کوبیدیم. این زمان اوج وحدت بود. غم حسن غم در دل مردم بود و غم مردم به خاطر ناراحتی و تاسف حسن و نه مدال از دست رفته. مدال یک رقم است، کیفیت را نمی‌توان با ارقام توصیف کرد. به بازی بعدی نزدیک شدیم و کل شهر و کشور از پیر و کودک گرفته همه منتظر انتقام بودیم..پرده چهارمآن لحظه که علیرضا دبیر و حمید سوریان و پژمان درستکار کاردرست دور حسن نشسته بودند و مشغول طرح‌ریزی برای شکستن سد تیلور هستند برای من بسیار تاثیرگذار است. همه ما آن کنار مدت‌ها مشغول فکر به شکستن این لعنتی بودیم. دغدغه زمین زدن تیلور دغدغه ۸۰ میلیون ایرانی بود. روز مسابقه فرا رسید و این نباز لعنتی سرانجام باخت. همه داد کشیدیم. حسن خوشحال از خوشحالی مردم و مردم خوشحال از لبخند حسن. همه ما در زندگی دوره‌ای قهرمانی را هر چند کوتاه گذرانده‌ایم و سپس با تیلورهایمان مواجه شده‌ایم. خیلی از ما پشت تیلورمان گیر کرده‌ایم و پشت سر هم شکست خورده ایم و بعضی اوقات در آخرین ثانیه‌ها خاک شده‌ایم. همه ما یکشنبه حسن بودیم و همه تیلورهایمان لحظه‌ای دیوید تیلور بودند. دیوید تیلور که خاک شد، همه فریاد زدیم.پرده پنجمحسن یزدانی در میانه دوران ورزشی خود است. داستان فیلم او هنوز تا رسیدن به تیتراژ فاصله زیادی دارد. احتمال بازگشت تیلور زخم خورده بسیار زیاد است. احتمال دارد که برگردد و دوباره حسن یزدانی را ببرد یا اصلا ممکن است جادوگر جدیدی به جایش ظاهر شود و مدتی چند دوباره اذیتمان کند. اما یک چیز اکنون فرق کرده است. دشمن هر چند رویین تن فرض می‌شد سرانجام پهلوان حسن او را زخمی کرد و ما در طی این پروسه چند ساله همه به واسطه حسن یزدانی به هم نزدیک‌تر شده ایم. حسن یزدانی نمونه فردی است که تمامی آرزوهای یک ملت در سرزمین به نام ایران پشت او هستند. زن و مرد، از پیر گرفته تا کودک پنج ساله، از ساکنان ترکمن شمال شرق ایران گرفته تا ساکنان عرب خوزستان. از بلوچ‌های چابهار گرفته تا آذری‌های ماکو همه و همه پشت حسن یزدانی هستیم تا هر رقیبی را از آمریکا و روسیه بتواند برای ایران ببرد. به امیدی روزی که این ملت در هر تشک اقتصادی، اجتماعی و فرهنگی دلخوش به یک حسن یزدانی در برابر تیلور‌های تحریم و تورم و بیکاری باشند. راز دوام ملت ایران همین الگو‌های باورپذیر هستند.خدا بهت عزت بده نازنین پهلوانپاینده باد ایران</description>
                <category>محمدمهدی سمیعی</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Mon, 04 Oct 2021 16:14:59 +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>محمدمهدی سمیعی</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Tue, 21 Sep 2021 18:11:15 +0430</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>محمدمهدی سمیعی</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Mon, 14 Sep 2020 21:58:14 +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>محمدمهدی سمیعی</category>
                <author>محمدمهدی سمیعی</author>
                <pubDate>Tue, 09 Jun 2020 15:58:08 +0430</pubDate>
            </item>
            </channel>
</rss>