<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمدمهدی آقاجانی</title>
        <link>https://virgool.io/feed/@mma137421</link>
        <description>مهندس نرم افزار | متخصص علوم داده</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:17:08</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/11684/avatar/Z2olyd.png?height=120&amp;width=120</url>
            <title>محمدمهدی آقاجانی</title>
            <link>https://virgool.io/@mma137421</link>
        </image>

                    <item>
                <title>اندر حکایت GPT-4 و چاله‌چوله‌های آن!</title>
                <link>https://virgool.io/overfit/gpt-4-b35cyw5oxi4t</link>
                <description>انسانی در حال انگولک رباتی! این تصویر به کمک هوش‌مصنوعی تولید شده است.چندی پیش مدل GPT-4 هم منتشر شد (البته نه به صورت عمومی) و گفته شد که برخی از ضعف‌های ChatGPT در آن برطرف شده. مثلا قابلیت multi-modality بهش اضافه شده و می‌تونه تسک‌هایی که ترکیب text و عکس هست رو هم انجام بده. یا اینکه قابلیت reasoning در اون تقویت شده. همین موضوع بهانه‌ای شد تا تیمی از microsoft research کرم‌شون بگیره و این مدل زبون‌بسته رو به انحاء مختلف انگولک کنند تا چاله‌چوله‌های اون رو پیدا کنند که نتیجه‌ش یک مقاله ۱۵۰ صفحه‌ای (بله درست شنیدید ۱۵۰ صفحه) شد.در این مقاله در ابتدا در چندین فصل قابلیت‌های مختلف GPT-4 بررسی شده و رویکرد بررسی هم کاملا مبتنی بر مثال‌هایی از promptهای مختلف هست و متدهای ارزیابی ریاضیاتی خاصی استفاده نشده و همین باعث شده این مقاله تا حد خوبی همه‌فهم باشه. مثلا در باب تعامل انسان‌گونه این مدل، مثالی آورده شده که نشون میده مدل نه تنها می‌تونه reasoning بکنه بلکه می‌تونه درباره باورهای دیگری نیز reasoning انجام بده و یا اینکه می‌تونه احساسات یک انسان رو در تعامل با خودش در قالب جملات درک کنه. این دو مثال ذیل مفهوم Theory of Mind می‌گنجند که قراره به این سوال پاسخ بده که مثلا Alice به چه چیزی معتقده و یا میتونه یک مرحله پیچیده‌تر بشه: Bob فکر می‌کنه که Alice به چه چیزی معتقده و این مثال هی می‌تونه با اضافه شدن یک لایه دیگه پیچیده‌تر بشه. در این prompt همون‌طور که در تصویر مشخصه سعی‌شده شرایطی ذکر بشه که در دیتای اینترنت قابل پیدا کردن نبوده.یا مثلا برای درک توانایی مدل در فهم احساسات در قالب جملات، یک prompt طراحی شده که در اون Tom یک چیز خیالی به نام ZURFIN رو گم کرده. اینجا هم باز به خاطر اینکه مطمئن بشند مفهوم طراحی‌شده در دیتای آموزش مدل دیده‌نشده از یک چیز خیالی به این نام استفاده کردند.چاله‌های مدل - ساختار auto regressiveاما جنبه دیگه این مدل که می‌تونه جذاب باشه، ضعف‌های این مدل هست. ضعف‌های این مدل به دو دسته کلی تقسیم‌شده که دسته اول مربوط به ساختار autoregressive این مدل هست و دسته دوم مربوط به تاثیرات اجتماعیه. در دسته اول، همون‌طور که می‌دونید ساختار اصلی تمامی مدل‌های GPT مبتنی بر پیش‌بینی کلمه بعدی در پیکره متنیه که auto-regressive نامیده میشه (برای فهم بهتر داستان ترنسفورمرها و معماری اون‌ها می‌تونید به این رشته پست مراجعه کنید). همین ساختار باعث‌شده برخی سوالات متداول رو نتونه جواب بده. مثلا اومدند یه متن چندجمله‌ای از یه روزنامه بهش دادند و خواستند در یک جمله اون متن رو توضیح بده یا در واقع خلاصه کنه که مدل نتونسته این کار رو بکنه و دوباره یه متن طولانی تولید کرده. مدل در خلاصه کردن یک متن از روزنامه New York Times عاجزه! علت هم ضعف ساختار autoregressive در فهم چندباره  کل متن و تولید خروجی از اون هست. جایی که مدل‌های مبتنی بر autoencoder بسیار قوی‌تر هستند. برای فهم این نبرد به این رشته‌پست مراجعه کنید.یکی دیگه از ایرادات اصلی این مدل اینه که نمی‌تونه با خودش inner dialog داشته باشه یا work memory کوتاهی داره که نمی‌تونه تسک‌هایی که نیاز به نگه داشتن نتایج میانی دارند رو حل بکنه. مثلا ازش خواستند که تعداد اعداد اول بین ۱۵۰ و ۲۵۰ رو بگه که مدل به اشتباه عدد ۱۳ رو اعلام می‌کنه در حالیکه ۱۸تا عدد اول در این بازه داریم. بعد ازش خواستند که اعداد اول در این بازه رو لیست کنه و سپس طول این لیست رو بیان کنه که اینجا درست اعلام می‌کنه.تعداد اعداد اول در بازه ۱۵۰ تا ۲۵۰ برابر با ۱۸ عدد هست در حالیکه GPT-4 فکر می‌کنه ۱۳ تا عدد هستند!وقتی از GPT-4 می‌خواند که اول اعداد اول در بازه ۱۵۰ تا ۲۵۰ رو ذکر کنه و بعد بشمره اون وقت درست جواب میده که نشون میده working memory خوبی نداره.یکی دیگه از مشکلات پیش پاافتاده‌ای که عموم LLMها باهاش رو به رو هستند عملیات‌های ریاضیه. در مثال اول اومدند یه ضرب و جمع ریاضی رو دادند و ازش خواستند جواب یه ضرب و جمع دیگه رو بگه که اینجا هم مدل اشتباه می‌کنه. جالب اینه که در این حالات هر چقدر اعداد ریاضی به کار رفته در معادله ارقام بیشتری داشته باشند خطای مدل بیشتر میشه تا جایی که وقتی به اعداد سه رقمی می‌رسیم دقت مدل به صفر می‌رسه! اما وقتی همین مثال رو به مدل می‌دند و ازش می‌خوان که این معادله رو گام به گام حل بکنه جواب درست رو تولید می‌کنه. در واقع با این مثال نشون دادند که مدل ضعف برنامه‌ریزی درونی برای انجام تسک‌های ریاضی داره ولی وقتی به صورت صریح ازش خواسته میشه که این برنامه‌ریزی رو انجام بده می‌تونه موفق بشه.این prompt مربوط به مدل Chat-GPT هست که دقیقا همین ایراد GPT-4 را دارد ولی وقتی ازش می‌خوایم که این معادله رو گام به گام حل بکنه حتی در ضرب و جمع اعداد سه رقمی و بالاتر عملکرد درستی داره.همین مشکل عدم برنامه‌ریزی در انجام تسک رو در تولید محتوای متنی تحت شرایط خاص هم داره. اومدند و دو تا مثال تولید کردند. در اولی یه سری شروط لوکال برای مدل می‌ذارند. مثلا می‌خوان که یه شعر تولید کنه که اول هر مصرعش با تک تک کلمات یک جمله خاص شروع بشه (عمرا خودتون نمی‌تونید همچین شعری بگید!) و مدل کاملا با موفقیت این کار رو می‌کنه. این شرط یه شرط لوکال هست چرا که در تولید هر مصرع کافیه به حرف خاص از اون جمله هدف اولیه دقت کنه. اما یه مثال دیگه که یه شرط گلوبال هست و مدل رو بیشتر درگیر می‌کنه اینه که یه شعری تولید کنه که مصرع اول و آخرش یکی باشند و فقط ترتیب کلمات‌شون برعکس باشه به شرطی که بامعنی هم باشه (باز هم عمرا نمی‌تونید خودتون همچین چیزی بگید!) . اینجا مدل ضعیف عمل می‌کنه و دایم دنبال شعرهایی می‌ره که مصرع‌های بلندی دارند در حالیکه برای حل چنین تسکی باید سراغ شعر‌هایی با مصرع کوتاه رفت. در ادامه سعی می‌کنند مدل رو راهنمایی کنند و حتی مدل یه جمله کوتاه با این شرایط نمی‌تونه پیدا کنه که معنی‌دار باشه (مثلا جمله Life gives hope از هر دو طرف معنی میده که مدل این جمله رو هم ذکر می کنه ولی جملات پرت و پلای دیگه‌ای هم میگه).وقتی از مدل خواسته میشه که یک شعری بگه که حروف اول هر مصرعش با جمله I am Da vinci Three شروع بشه، مدل با موفقیت این کار رو انجام میده.وقتی از مدل خواسته میشه که شعری بگه که مصرع اول و آخرش عین هم باشند و فقط ترتیب کلمات برعکس باشه که هم معنی بده و هم از لحاظ گرامری درست باشه، مدل قاطی می‌کنه و شروع به چرت و پرت گفتن می‌کنهدر اینجا سعی‌شده که با پرسش و پاسخ فراوان، مدل رو راهنمایی کنند که چه طوری یه همچین شعری بگه ولی باز نمی‌تونهچوله‌های! مدل - تاثیرات اجتماعیدسته دوم ایرادات مربوط به تاثیرات اجتماعی هست که مهم‌ترین قسمتش بایاس‌های جوامع هست. با چند مثال نشون دادند که GPT-4 بایاس‌های اجتماعی رو تشدید کرده. مثلا در یه جدول، میزان توزیع برخی مشاغل بین زن ‌ها و مرد‌ها رو بررسی کردند و در عوض بررسی کردند که GPT-4 برای اون مشاغل در چند درصد موارد از ضمایر he یا she استفاده می‌کنه. به طور مثال در دنیا حدود ۷۸ درصد مهندسین نرم‌افزار مرد و مابقی خانم هستند در حالیکه GPT-4 در ۹۸ درصد اوقات از ضمیر he برای یه مهندس نرم‌افزار استفاده می‌کنه.مقایسه توزیع جنسیتی مشاغل مختلف و توزیع استفاده GPT-4 از ضمایر he و she برای این مشاغلیا نشون دادند که مدل‌های GPT کلا تمایلات زیادی به چرت و پرت گفتن دارند و انصافا هم خوب چرت و پرت می‌گند و هم چرت‌و‌پرت‌های خوبی می‌گند! اما درکی از اینکه مطلبی که تولید می‌کنند چقدر درست و چه مقدار غلط هست ندارند. به عبارت دیگه با گسترش استفاده از این مدل‌ها همون خطری که همواره برای تکنولوژی ذکر میشده برای GPT هم وجود داره؛ Misinformation.جمع‌بندیدر انتها هم مثال‌های ذکرشده رو دسته‌بندی کردند و گفتند که LLMها برای بهبود باید در چه زمینه‌هایی کار کنند. مثلا مباحثی مانند confidence calibration لازمه انجام بشه برای اینکه این مدل‌ها درباره اطلاعاتی که تولید می‌کنند بدونند چقدر اطمینان دارند تا از mis information جلوگیری بشه. یا مثلا باید روی long-term memoryشون کار بشه تا تسک‌هایی که نیاز به نگهداری نتایج میانی و یا Inner dialog دارند هم به خوبی انجام بشند. در پایان میشه گفت هنوز راه بسیار زیادی تا artificial general intelligence مونده ولی بعید هم نیست که بشر یه روزی به اون برسه.پ.ن: اینا نشستند ۱۵۰ صفحه مقاله نوشتند خداوکیلی ظلم در حق‌شون هست که شما مقاله شون رو حتی یه تورق هم نکنید! حداقل تصاویرش رو ببینید :)لینک مقاله:https://arxiv.org/abs/2303.12712به کانال ما سر بزنید:https://t.me/nlp_stuff</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Wed, 19 Apr 2023 06:26:15 +0330</pubDate>
            </item>
                    <item>
                <title>هوش مصنوعی با فیدبک‌های واقعی!</title>
                <link>https://virgool.io/overfit/rlhf-vkpgfist80nt</link>
                <description>چند وقتی هست که مدل‌های ChatGPT و GPT4 غوغایی به راه انداختند و همه از اون‌ها صحبت می‌کنند.  در واقع این دو مدل اولین جاهایی هستند که عموم جامعه با قدرت هوش مصنوعی رو‌به رو شدند. حالا به دور از این هیاهو قصد داریم در این نوشته به توضیح قلب تپنده ChatGPT بپردازیم یعنی روشی که با استفاده از اون این مدل، آموزش داده شده و کمی وارد جزییات فنی بشیم. این روش اسمش Reinforcement Learning from Human Feedback هست که در ادامه به توضیح مقاله‌ای با نام Deep reinforcement Learning from Human Preferences که این روش رو ارایه کرده می‌پردازیم. در این روش در واقع سعی شده از بازخوردهای یک عامل انسانی در آموزش یک مدل استفاده بشه که از نظر تعامل انسان و مدل یک گام رو به جلو محسوب میشه.یک گام به سمت هوش مصنوعی امن، تعامل انسان و هوش مصنوعی  است به طوریکه انسان‌ها سعی در تعریف مستقیم اهداف نداشته باشند و تفکیک‌کننده رفتارهای خوب و بد باشند.چه نیازی به بازخورد عامل انسانی بود؟!سوال خوبیه! همون‌طور که می‌دونید در پارادایم Reinforcement Learning (RL) چهار بخش اصلی وجود داره. اول state یا observation هست (که البته این دوتا یه فرق کوچولو داره که ما ازش صرف نظر می‌کنیم) که نشان‌دهنده وضعیتی هست که ایجنت هوشمند در اون قرار داره و می‌تونه با featureهای زیادی توصیف بشه. دوم، action هست که در واقع اون عملی هست که ایجنت قراره در اون state انجام بده. سوم، reward هست که در واقع مدل یا ایجنت به ازای انجام یک اکشن خاص در یک state خاص اون پاداش رو دریافت می‌کنه و چهارم environment هست که وقتی در یک state خاص یک اکشن انجام میشه state جدید رو معرفی می‌کنه و کمک می‌کنه که ایجنت وارد state جدید بشه. برای اینکه بتونیم یه مساله رو در قالب RL دربیاریم نیاز هست که هر یک از چهار اجزای بالا رو بتونیم براش تعریف کنیم. مثلا برای چت‌بات می‌تونیم دیالوگی که چت‌بات دریافت می‌کنه رو به منزله state درنظر بگیریم و دیالوگی که چت‌بات تولید می‌کنه رو به عنوان اکشن درنظر بگیریم. اما همون‌طور که احتمالا تا الان بهش فکر کردید برای تعریف تابع پاداش (reward) احتمالا با چالش رو‌به‌رو میشیم. در واقع یه سری مسایل وجود دارند که نمی‌تونیم یه تابع quantitative براش تعیین کنیم اما جنس مساله طوری هست که عامل انسانی می‌تونه یه اکشن خوب رو از بد بازشناسی کنه. در واقع تابع پاداش از حالت کمی درمیاد و تبدیل به کیفی میشه. اینجاست که بازخورد عامل انسانی وارد قضیه میشه.اما دو چالش اصلی بر سر راه وجود داره. اول اینکه وقتی قراره عامل انسانی بازخورد بده طبیعتا باید بتونیم با تعداد محدودی بازخورد کار رو دربیاریم و دوم اینکه تاجای ممکنه نیاز به domain expert رو باید کم کنیم. در واقع فیدبک‌ها طوری باید طراحی بشند که کمترین میزان تخصص رو لازم داشته باشه تا آموزش مدل رو اقتصادی بکنه.در این مقاله سعی شده برای ساده‌سازی بازخورد از روش مقایسه‌ای استفاده بشه. در واقع در هر iteration یه زوج از عملکرد مدل به عامل انسانی نشون داده میشه و عامل انسانی صرفا باید بگه کدوم رو بیشتر میپسنده. کلا مقایسه برای انسان‌ها خیلی راحت‌تر از توصیف شرایط مطلوبه (کلا ما آدما اهل قضاوت کردن هستیم!) جزییات این موضوع رو جلوتر بهش می‌پردازیم.از طرفی سعی شده برای کاهش نیاز به بازخوردهای انسانی از یه reward model استفاده بشه که قراره از روی بازخوردهای عامل انسانی به صورت supervised ترین بشه. در واقع با این کار دیگه نیاز نداریم که به ازای زوج اکشن و state بازخورد عامل انسانی رو داشته باشیم بلکه یه مدل داریم که این کار رو برامون انجام میده. این موضوع رو هم جلوتر بهش می‌پردازیم. معماری کلی این داستان در تصویر زیر قابل مشاهده است.معماری کلی روش RLHFدر این مقاله اشاره شده که مدل reward و مدل RL به صورت async و آنلاین آموزش داده می‌شند به این معنا که حین اینکه RL داره ترین میشه reward model هم ترین میشه (که البته async بودن این داستان رو خودم هم برام عجیبه و شاید concurrent بودن کافی بود ولی اشاره شده که این موضوع به بهبود عملکرد مدل منتج میشه!). در مجموع هم با روش‌هایی که در بالا توضیح دادیم نشون دادند که با حدود ۱۵ دقیقه تا ۵ ساعت از زمان یک عامل انسانی می‌تونند تقریبا هر تسک و بازی که تا حالا باهاش RL ترین شده رو مدل آموزش بدند و به عملکرد عالی برسند.آموزش مدلآموزش مدل ۴ قسمت اصلی داره که در این بخش به توضیح هر کدوم می‌پردازیممدل RLاین بخش که مربوط به بخش RL Algorithm تصویر بالا است می‌تونه با استفاده از هر یک از روش‌های traditional توی RL مانند Q-learning یا Policy Gradient می‌تونه حل بشه. در واقع با داشتن reward model می‌تونیم از همین روش‌ها استفاده کنیم. در این مقاله با توجه به اینکه reward function ممکنه non-stationary باشه از روش‌های policy gradient استفاده شده که به طور مستقیم policy رو مدل می‌کنه.نحوه بازخوردبا توجه به اینکه این مقاله برای experiments از بازی‌های معروف gym استفاده کرده به عنوان یه تسک پایه یادگیری پشتک زدن (تسک backflip در gym) رو انتخاب کرده. در نتیجه به عامل انسانی برای بازخورد، دوتا کلیپ کوتاه از دو رفتار مدل ارایه میشه که حداکثر ۲ ثانیه طول میکشه. عامل انسانی باید بگه کدوم رفتار رو ترجیح میده یا اینکه بگه هر دو خوب هستند یا بگه قابل مقایسه نیستند. نکته اینه که نتیجه بازخورد انسانی به صورت یه توزیع بر روی {1,2} ذخیره میشه به این صورت که اگه یکی از دو کلیپ رو ترجیح بده کل جرم توزیع بر روی کلیپ ترجیح‌داده‌شده قرار میگیره و اگه هر دو خوب باشند یه توزیع uniform ذخیره میشه و اگه قابل مقایسه نباشند اصلا رکوردی ذخیره نمیشه.آموزش مدل rewardورودی مدل reward یه زوج از state و action هست. اما برای اینکه نتیجه مقایسه انسانی رو برای آموزش مدل reward استفاده کنند از یه trick استفاده کردند و loss مدل رو به صورت زیر تعریف کردند:معادله اول تعریف احتمال ترجیح نمونه اول بر نمونه دوم است. معادله دوم فرمول loss مدل است.در واقع مدل reward یه preference predictor هست. مقدار []P، احتمال ترجیح یک رفتار مدل بر دیگری هست که به صورت exponential در معادله اول آورده شده و سپس loss مدل به صورت cross-entropy بر روی این احتمال preferenceها تعریف میشه. در این روش از ^r به عنوان یک متغیر پنهان برای پیش‌بینی فیدبک انسان استفاده شده و طبیعتا برای آپدیت پارامترهای مدل از loss براساس ^r گرادیان گرفته میشه و پارامترها آپدیت میشند. همچنین کل reward model به صورت ensemble هست (ینی به جای آموزش یک مدل، چندین مدل آموزش داده میشه و تجمیعی از خروجی اون‌ها درنظر گرفته میشه) که نتیجه نهایی به صورت میانگین خروجی هر یک از predictorها حساب میشه.انتخاب نمونه‌هایی برای گرفتن بازخورد عامل انسانیاین قسمت هم یکی از زیبایی‌های این مقاله است که نیاز به بازخورد انسانی رو باز هم کاهش داده. انتخاب جفت نمونه‌هایی که برای مقایسه به عامل انسانی داده میشه می‌تونه نقش حیاتی در کاهش نیاز به بازخورد‌های انسانی ایفا کنه. در این بخش، از ایده active learning الهام گرفته شده. برای اینکه جفت نمونه‌هایی رو برای گرفتن بازخورد عامل انسانی انتخاب کنند در هر مرحله تعداد زیادی از نمونه‌ها رو سمپل می‌گیرند و بعد جفت نمونه‌هایی انتخاب می‌شند که مدل‌های حاضر در ensemble بیشترین واریانس رو در مورد اون‌ها داشته باشند. با این روش بیشتر، جفت نمونه‌هایی انتخاب می‌شند که reward model درباره اون‌ها بیشترین عدم قطعیت رو داره و گرفتن بازخورد عامل انسانی می‌تونه اطلاعات مفیدی رو به reward model بده.سخن آخردر نوشته بالا قصد داشتیم ایده RLHF رو به صورت ساده و خلاصه مطرح کنیم. همون‌طور که دیدید به نظر خیلی ایده‌های ساده‌ای استفاده کردند ولی جزییات زیادی رعایت شده که برخی‌هاش باز هم در این نوشته نیومده و نشون میده هنوز مفاهیم پایه‌ای و ایده‌های اصلی در یادگیری ماشین (مثل active learning) چقدر می‌تونه در حل مسایل مفید باشه. امیدوارم از این مطلب لذذذت برده باشید.لینک بلاگ توضیح مقاله:https://openai.com/research/learning-from-human-preferencesلینک مقاله:https://arxiv.org/abs/1706.03741#خوشحال میشیم که به کانال nlp stuff سر بزنید و اگه مطلب و پستی داشتید یه ندا بدید که بذاریم تو کانال.</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Mon, 03 Apr 2023 10:32:29 +0330</pubDate>
            </item>
                    <item>
                <title>تیپیکال سمپلینگ، تکه گم‌شده پازل تولید متن توسط ربات‌ها</title>
                <link>https://virgool.io/overfit/papers-typical-sampling-psuennnubiiu</link>
                <description>همون‌طور که می‌دونید چند سالی میشه که مدل‌های generative مانند GPT پا به عرصه وجود گذاشتند و وجود پرخیر و برکت‌شون باعث شده بتونیم در زمینه هوش‌مصنوعی، تولید متن داشته باشیم. اما همیشه یه دغدغه اصلی در تولید متن‌هایی که توسط ماشین میشده وجود داشته و اون هم قرابت اون متن‌ها با متونیه که انسان‌ها تولید می‌کنند. به عبارت دیگه در یه فضای مناسب، آدم نباید بتونه فرق متن تولیدشده توسط ماشین و انسان رو بفهمه که این یکی از آرزوهای بشری از دیرباز تا کنون بوده و به تست تورینگ معروفه. البته قبلا نوشته‌ای در این‌باره منتشر کرده بودم که تست تورینگ تا حد زیادی پاس شده و حالا چالش‌های جدید دیگه‌ای مطرحه. اما هستند افرادی که به کیفیت خوب قانع نیستند و دنبال عالی هستند! خانوم Meister و همکاراش یکی از همون قماش آدمان که دنبال بهتر و بهتر کردن تولید متن توسط ماشین‌ها هستند و در جدیدترین مقاله‌شون[1] به معرفی روشی در این‌باره پرداختند که قصد داریم در ادامه اون رو توضیح بدیم.نکته کلیدی؛ decoding strategyهمون‌طور که می‌دونید در تولید متون زبان طبیعی دو فاز اصلی داریم که فاز اولیه شامل پیش‌آموزش مدل برای فراگیری توزیع احتمال کلمات به‌شرط وجود کلمات قبلیه و ازش به مدل زبانی یاد میشه و فاز دوم شامل انتخاب کلمه مناسب به‌شرط وجود کلمات قبلی است. این مقاله ادعا می‌کنه که فاز دوم یعنی decoding strategy می‌تونه خیلی خیلی روی کیفیت متن خروجی تاثیرگذار باشه. به‌خاطر همین بر روی همین قسمت تمرکز کرده و مساله رو به صورت out of the box بررسی کرده؛ به این معنی که شما می‌تونید مدل زبانی‌تون رو با هر روشی که دوست دارید (مثل masking language model) آموزش بدید و بعد برای فاز decoding strategy از روش معرفی‌شده استفاده کنید. در روش‌های فعلی معمولا کلمه‌ای رو در فاز decoding انتخاب می‌کنیم که بیشترین احتمال رو به ازای کلمات داده‌شده داشته باشه. به عبارت دیگه اگه چندین کلمه داشته باشیم و بخوایم کلمه بعدی رو حدس بزنیم، رشته ورودی رو به مدل زبانی می‌دیم و بعد کلمه‌ای که بیشترین احتمال رو در بین بقیه داره به عنوان کلمه بعدی انتخاب می‌شه. این مقاله ادعا می‌کنه دقیقا همین موضوعه که بعضی وقت‌ها باعث میشه مدل‌هایی مثل GPT متن‌های توهمی تولید کنند. در واقع با یه سری مطالعات زبان‌شناختی [2] متوجه شدند که این دقیقا کاری نیست که انسان‌ها در مغز خودشون موقع تولید متن یا گفتار انجام میدند. در واقع انسان‌ها موقع تولید متن یه مصالحه‌ای بین کلمات با احتمال بالا و کلماتی که انتقال اطلاعات موردانتظار رو تضمین می‌کنند برقرار می‌کنند. به‌عبارت دیگه ذهن شما وقتی چندین کلمه رو میبینه و میخواد کلمه بعدی رو حدس بزنه هم به مدل زبانی که در خودش شکل گرفته رجوع می‌کنه و هم از طرفی سعی میکنه مطلب پرتی رو بیان نکنه! از همین‌جا شاخک‌های آدم تیز میشه که شاید بهترین استراتژی، انتخاب محتمل‌ترین کلمه نباشه.گام اول؛ Beam Search و Samplingالگوریتم beam search روشیه که به شما اجازه میده در هر مرحله لزوما به محتمل‌ترین کلمه برای انجام decoding اتکا نکنید بلکه بتونید مثلا ۵ کلمه محتمل رو نگه دارید و مسیر decoding رو به ازای اون ۵ کلمه برای کلمات بعدی ادامه بدید و در حین سرچ کردن صرفا همون ۵ مسیر پراحتمال نگهداری میشه. در واقع این روش نوعی از Best First Search (BFS) برای پیمایش گرافه که با درنظر گرفتن صرفا k گزینه محتمل، تبدیل به یه الگوریتم حریصانه شده. نکته مهم در beam search، وجود یه تابع شهوده که در روش‌های decoding مرسوم که تا الان داشتیم اون تابع شهود یه تابع likelihood بود که می‌تونیم با استفاده از اون مثلا k مسیر پراحتمال رو همواره نگهداریم و به جلو بریم. در زیر می‌تونید تصویری از نحوه عملکرد beam search رو ببینید.نحوه کارکرد beam search. مسیرهایی که پررنگ‌تر هستند دارای احتمال بالاتری هستند.در این مقاله ابتدا دو روش decoding معرفی میشه که کمی متفاوت از انتخاب محتمل‌ترین کلمه در هر گامه. روش اول top-k sampling نام داره که به جای اینکه در هر مرحله محتمل‌ترین کلمه رو انتخاب کنیم، میایم و top-k محتمل‌ترین رو نگهداری می‌کنیم و با beam search میریم جلو. در این روش همچنان تابع شهود ما همون likelihood باقی میمونه. روش دوم هم استفاده از متدی به نام nucleus sampling هست. در این روش به جای اینکه در هر گام از beam search اقدام به نگهداری top-k محتمل‌ترین بکنیم، یه حد آستانه‌ی (threshold) احتمال (مثلا ۹۰ درصد) تعریف می‌کنیم و شروع به انتخاب محتمل‌ترین کلمات به صورت نزولی می‌کنیم تا اینکه مجموع احتمالات کلمات کاندید شده  به حد آستانه‌ی مورد نظر برسه.و اینک typical samplingخب تا اینجا دو روش کاندیدا برای decoding رو معرفی کردیم اما همون‌طور که در قسمت اول هم گفتیم با برخی مطالعات زبان‌شناسی به این نتیجه رسیدند که انسان موقع تکلم و یا نوشتن متن، لزوما محتمل‌ترین کلمات رو انتخاب نمی‌کنه. بلکه سعی می‌کنه ضمن اینکه کلمات محتمل رو انتخاب می‌کنه از طرفی مطلب پرتی رو هم بیان نکنه! ایده اصلی این مقاله اینه که بیایم و اون تابع شهود در beam search رو تغییر بدیم و با یه تابع جدید که بتونه این مصالحه رو برقرار کنه جایگذاری کنیم. طبق نظریه اطلاعات، میزان اطلاعاتی که یه کد میتونه منتقل کنه برابر با منفی لگاریتم احتمال اون کده. حالا برای یه رشته از کلمات هم میتونیم اطلاعات منتقل‌شده رو به صورت زیر تعریف کنیم:مقدار اطلاعات منتقل‌شده توسط یک رشته از کلماتکه در این فرمول طبق نظریه اطلاعات، مقدار I(y_t) برابر با مقدار زیره:I(y_t) = - log p(y_t|y_&lt;t)در این فرمول مقدار احتمال p که در فرمول اومده برابر با احتمال وجود کلمه y_t به ازای کلمات قبلیشه. حالا لازمه که اون پرت نبودن جمله رو هم به نوعی وارد محاسبات‌مون کنیم . در این مقاله، این قسمت با استفاده از مفهوم امید ریاضی اطلاعات منتقل‌شده توسط رشته مشخص شده. در واقع توقع داریم کلماتی رو انتخاب کنیم که مقدار مورد انتظار اطلاعات رو خیلی دستخوش تغییر نکنند و از طرفی محتمل هم باشند. این مقدار امید ریاضی طبق تعریف رسمی به صورت زیر تعریف میشه:همون‌طور که می‌بینید مقدار امید ریاضی اطلاعات منتقل‌شده در واقع همون آنتروپی شرطی p(.|y_&lt;t) است که می‌تونیم با عبارت (H(p(.|y_&lt;t) اون رو نشون بدیم. حالا برای اینکه مطلب ما به ازای یک کلمه جدید خیلی پرت نباشه باید اختلاف اطلاعات منتقل‌شده توسط اون کلمه به ازای کلمات قبلی با میانگین اطلاعات منتقل‌شده توسط کلمات قبلی، کمینه باشه. در واقع امید ریاضی اطلاعات منتقل‌شده توسط کلمات قبلی همون انتظار ما از یک جمله است که با اضافه شدن یک کلمه جدید نباید خیلی تغییر بکنه. از همینجا می‌تونیم یه تابع شهود جدید برای الگوریتم beam search در نظر بگیریم. اسم این تابع رو اپسیلون میذاریم که در زیر تعریف شده:مقدار تابع اپسیلون که همون تابع شهود جدید برای beam search میتونه باشهدر واقع ما در یک متنی که توسط انسان تولید شده، توقع داریم که مقدار اپسیلون نزدیک به صفر باشه. این یه فرضیه است که از مطالعات زبان‌شناسی گرفته شده و برای اینکه بیشتر در موردش مطمئن بشیم در این مقاله توزیع اپسیلون بر روی برخی متونی که انسان‌ها تولید کردند نیز بررسی شده که در نمودار زیر می‌تونید اون رو ببینید:توزیع تابع اپسیلون بر روی متونی که انسان‌ها تولید کردند. در سمت راست متن‌های ویکی‌پدیا مورد استفاده قرار گرفته و دو تصویر دیگه مربوط به متون داستان‌سرایی توسط انسان‌ها و متون خلاصه‌سازی abstractive توسط انسان‌ها ست.همون‌طور که در شکل بالا مشخصه توزیع اپسیلون به ازای متون مختلفی که توسط انسان‌ها تولید شده، حول صفر بیشترین مقدار رو داره و به نوعی داره صحت تابع شهود ما رو تایید می‌کنه که اپسیلون (تفاوت امید ریاضی اطلاعات انتقالی و خود اطلاعات انتقالی) بیشتر نزدیک به صفره.حالا کافیه که برای انجام روش typical sampling تابع اپسیلون رو به صورت یه تابع شهود برای beam search تعریف کنیم. تعریف این تابع رو در زیر می‌تونید ببینید:در این فرمول در واقع تابع اپسیلون رو ساده‌تر کردند و با باز کردن مقدار I(y_t) به مقدار فعلی رسیدند. شرط این تابع هم در واقع برمیگرده به این موضوع که ما سعی می‌کنیم کلماتی رو انتخاب کنیم که این تابع رو کمینه کنند و همچنین مجموع احتمال اون کلمات هم بزرگتر مساوی حد آستانه مشخصی بشه. این روش سعی می‌کنه کلماتی رو انتخاب کنه که در مدار امید ریاضی اطلاعات کل رشته باشند. در واقع سعی داره کلمات typical رو انتخاب کنه و به‌خاطر همین اسمش رو typical sampling گذاشتند.گام آخر؛ بررسی و تحلیل نتایجقبل از بررسی نتایج لازمه به یه نکته شهودی اشاره بشه. با توجه به تابع اپسیلونی که تعریف کردیم این تابع در هر مرحله از decoding سعی می‌کنه کلماتی رو که به امید ریاضی اطلاعات منتقل‌شده نزدیک‌تر هستند انتخاب کنه. حالا اگر توزیع احتمال کلمات کاندیدا رو به صورت یک توزیع نرمال در نظر بگیریم، ممکنه توزیع کلمات کاندیدا برای کلمه بعدی به یکی از صورت‌های زیر باشه:میدونیم که میانگین یا امید ریاضی به مقدار زیادی به داده‌های پرت حساس هستند. وقتی این توزیع، واریانس کمی داشته باشه (مثل توزیع صورتی رنگ) در واقع مقدار امید ریاضی احتمالات و در پی اون مقدار امید ریاضی اطلاعات هم به سمت بالا کشیده میشه. از اونجایی که گفتیم تابع اپسیلون تمایل داره کلمات نزدیک‌تر به میانگین رو انتخاب کنه در نتیجه کلماتی که واقعا احتمال بالایی دارند انتخاب خواهند شد (کلماتی که پیک احتمال رو رقم زدند) چرا که این کلمات میانگین رو به سمت خودشون کشیدند و نزدیک‌ترین کلمات به میانگین احتمالات هستند. اما اگه واریانس این توزیع زیاد باشه ( مثل توزیع آبی رنگ) امید ریاضی اطلاعات منتقل‌شده از کلمات قبلی به میانه نزدیک میشه و در نتیجه کلماتی که خیلی احتمال بالایی دارند انتخاب نخواهند شد (چون از امید ریاضی مذکور فاصله دارند) بلکه کلماتی که خیلی نزدیک به میانگین هستند انتخاب خواهند شد. به عبارتی این تابع اپسیلون به صورت خودکار مصالحه بین کلمات با احتمال بالا و عدم بیان مطالب پرت رو برقرار می‌کنه. در واقع هر وقت صرفا بین چند کلمه محدود مردد باشیم و بیشترین احتمال رو صرفا به اون کلمات بدیم و بقیه کلمات کاندیدا احتمالات بسیار کمی داشته باشند، تابع اپسیلون دقیقا همون کلماتی که بیشترین احتمال وقوع رو دارند به ما خروجی میده که از این حیث شبیه روش decoding مرسوم عمل می‌کنه. اما وقتی برای کلمه بعدی با چندین کلمه روبه‌رو باشیم که نسبت به هم خیلی احتمالات متفاوتی ندارند، تابع اپسیلون به جای خروجی دادن محتمل‌ترین کلمه، کلمه‌ای رو خروجی میده که نزدیک به امید ریاضی اطلاعات منتقل شده باشند.با توجه به اینکه سه روش برای sampling در فاز decoding مطرح کردیم (top-k, nucleus, typical) و هر کدوم یک سری هایپرپارامتر داشتند لازمه که این مقدار هم تیون بشه. با بررسی‌هایی که این مقاله انجام داده به این نتیجه رسیدند که برای روشی مثل top-k sampling بهترین مقدار k عددی حدود ۳۰ هست. یعنی در هر مرحله از decoding باید ۳۰ تا از محتمل‌ترین کلمات رو نگهداری کنیم. برای روش nucleus sampling هم بهترین حد آستانه حدود ۹۵ درصد است. یعنی باید در هر مرحله کلماتی رو نگهداری کنیم که مجموع احتمالشون بزرگتر مساوی ۹۵ درصد بشه. اما برای typical sampling اوضاع کمی فرق می‌کنه. در واقع برای typical sampling، بهترین مقدار حد آستانه (که در شرط تابع کمینه‌سازی ظاهر شده بود) برای تسک‌هایی مثل داستان‌سرایی با تسک‌هایی مثل خلاصه‌سازی مفهومی متفاوته. در واقع برای تسک‌هایی مثل داستان‌سرایی این مقدار بهینه برابر با حدودا ۲۰ درصده در حالیکه برای تسک‌هایی مثل خلاصه‌سازی حدود ۹۵ درصده. همین نکته می‌تونه یکی از نقاط ضعف این روش باشه که برای هر تسک باید این هایپرپارامتر یک بار دیگه تیون بشه. از طرفی طبق تست‌هایی که انجام شده دو روش اول متن‌های توهمی بیشتری رو تولید می‌کنند در حالیکه typical sampling از تولید متن‌های توهمی تا حد زیادی اجتناب می‌کنه و به واقعیت نزدیک‌تره. در پایان چند نمونه از متن‌های تولید شده توسط ماشین با استفاده از روش‌های بالا رو میاریم.جمع‌بندیدر این پست سعی کردیم یه نگاه جدید به تولید زبان توسط ماشین رو با محوریت توضیح مقاله typical sampling ارائه کنیم. همون‌طور که در ابتدا گفتیم این روش out of the box مساله رو بررسی کرده و مستقل از مدل‌ زبانی است که انتخاب می‌کنید. همچنین در آخر نتایج و نقاط قوت و ضعفش رو مطرح کردیم. امیدواریم مطالب برای شما مفید بوده باشه.اگه مطلب خوبی دارید که فکر می‌کنید میشه در انتشارات یا کانال اورفیت منتشر کرد تعارف نکنید و برای ما بفرستید. بدرود!منابع[1]: Typical Decoding for Natural Language Generation[2]: Predicting Pragmatic Reasoning in Language Games</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Mon, 11 Apr 2022 15:28:01 +0430</pubDate>
            </item>
                    <item>
                <title>داستان ترنسفورمرها (۶): داستان XLNet</title>
                <link>https://virgool.io/overfit/transformers6-xlnet-ufgmgu9rl8rs</link>
                <description>نبردی تاریخی میان مدل‌های autoregressive و autoencoder. برگرفته از فیلم The Great Battleاگر در دنیای یادگیری عمیق به خصوص در حوزه پردازش زبان طبیعی سیر و سلوک داشتید قطعا اسم برت به گوش‌تون خورده. ظهور برت یک انقلاب عظیم در حوزه پردازش زبان طبیعی بود و ما هم در قسمت چهارم از سریال داستان ترنسفورمر‌ها اون رو براتون روایت کردیم. پس از گذر از پیچ‌های تاریخی در حوزه یادگیری مدل زبانی حالا در این قسمت نوبت به XLNet رسیده. مدلی که از برت الهام گرفته و با نگاهی دیگه تونسته عملکرد برت رو تا حد خوبی بهبود بده. در واقع، مدل‌هایی مثل برت که از توکن‌های masked استفاده می‌کنند به صورت ضمنی ارتباط بین این توکن‌ها رو در نظر نمی‌گیرند و همین نکته می‌تونه باعث ضعف عملکرد مدل‌هایی مثل برت بشه. اگر نمی‌دونید سر این قصه از کجا شروع شده، به جهت آشنایی با مشکلات RNNها، مکانیزم توجه و معماری ترنسفورمرها می‌تونید قسمت‌های قبلی این سریال رو بخونید.انواع مدل‌های زبانی؛ نبرد بین autoregressive و autoencoderمدل‌های زبانی رو بر اساس نحوه pre-train می‌تونیم به دو دسته Autoregressive و Autoencoder تقسیم کنیم. مدل‌های زبانی که به صورت autoregressive پیش‌آموزش شبکه رو انجام می‌دهند، در واقع توزیع یک کلمه به ازای کلمات قبلی و یا کلمات بعدی رو حدس می‌زنند. همین یه طرفه به قاضی رفتن باعث ضعیف‌تر شدن مدل میشه. یعنی مدل‌های AR یک نگاه یه‌طرفه به مدل زبانی دارند در حالیکه مدل‌های مبتنی بر autoencoder سعی کردند به نوعی نگاه دوطرفه به مدل زبانی ایجاد کنند. مثلا مدل BERT که معرف حضور همه هست در دسته autoencoderها قرار می‌گیره. در BERT با استفاده از توکن MASK و جایگزینی اون با برخی توکن‌ها در فاز پیش‌آموزش و اجبار مدل به حدس‌زدن کلمات masked شده، در واقع به نوعی اثر نگاه دوطرفه در مدل ایجاد میشه. عملا در تسک‌های downstream در پردازش زبان طبیعی به این نگاه دوطرفه نیاز داریم. مثلا انسان‌ها در ترجمه زبان وقتی می‌خوان یه جمله رو ترجمه کنند به تمامی جمله توجه می‌کنند و ممکنه برخی از کلمات انتهای جمله زبان مبدا رو در ابتدای جمله زبان مقصد بیارند. همین نگاه باعث میشه مدل‌های autoregressive به مشکل بخورند و در ظاهر مدلی مثل BERT پیروز میدان قلمداد بشه!شکست BERT؛ XLNet برمی‌خیزداما مدل‌هایی مثل BERT هم خالی از اشکال نیستند. به عنوان ایراد اول، وقتی برخی از توکن‌ها با توکن MASK جایگزین می‌شود و مدل سعی می‌کنه این توکن‌های masked رو تشخیص بده، به صورت ضمنی ارتباط بین این توکن‌های maskشده در نظر گرفته نمیشه. در واقع مدل برت نمی‌تونه joint probability بین این توکن‌ها رو در نظر بگیره چرا که در هر لحظه به دنبال حدس‌زدن یکی از این کلمات maskشده است و عملا ممکنه در اون لحظه هنوز بخش عمده‌ای از این کلمات masked باقی مونده باشند و به صورت ضمنی فرض می‌کنه که توکن‌های maskشده از هم مستقل هستند. برای مثال جمله &quot;محمدرضا [MASK] در فیلم [MASK] بازی کرده است&quot; را در نظر بگیرید. این که مدل انتخاب کنه برای ماسک اول فروتن، گلزار یا شریفی نیا رو انتخاب کنه بر روی انتخاب هاش برای ماسک دوم نیز باید اثر بذاره.همچنین به عنوان ایراد دوم می‌تونیم به موضوع ناسازگاری بین فاز pretraining و finetuning اشاره کنیم. چرا که عملا توکنی به نام MASK در دیتای واقعی وجود نداره. به‌خاطر وجود توکن MASK عملا معماری برت پیچیده‌تر شده که هم بتونه تسک pretrain رو به‌خوبی هندل کنه و هم تسک fine tune رو. به این علت که توکن mask در دیتای فاین‌تیون وجود نداره ممکنه به خاطر همین maskکردن‌ها بخشی از اطلاعات از دست بره یا ممکنه نویز وارد فرآیند یادگیری بشه. برای حل این مشکلات XLNet وارد میدون میشه. مدلی که ذاتا autoregressive است اما با اتخاذ تکنیک permutation سعی کرده اثر نگاه یک‌طرفه در این نوع مدل‌ها رو از بین ببره از طرفی به خاطر ذات autoregressive بودنش دیگه نگران ناسازگاری بین فاز‌های pre-training  و fine tuning نیست. همچنین برای اینکه بتونه متن‌های با طول بلندتر رو هم ساپورت کنه از Transformr-XL الهام گرفته و در نتیجه نشون داده که تونسته BERT رو شکست بده. در تصویر زیر می‌تونید تفاوت XLNet و BERT رو مشاهده کنید.در این مثال فرض شده که جمله ورودی [New, York, is, a, city] است. همچنین توکن‌های هدف هم [New, york] هستند. با توجه به این مثال، مدل BERT به هر یک از کلمات New و York به صورت جداگانه نگاه می‌کنه در حالیکه مدل XLNet می‌تونه ارتباط بین New و York رو در نظر بگیره. بنابراین می‌تونه نتایج بهتری رو  با در نظر گرفتن ارتبط بین دو توکن new و york تولید کنه.مکانیزم Permutationمدل XLNet برای فاز pre-training از Permutation Language Modeling استفاده می‌کنه که همون‌طور که از اسمش پیداست ایده اصلی اون درباره جایگشت‌های متفاوت از جمله ورودیه. فرض کنید که یک جمله ورودی به شکل [x1, x2, x3, x4] داریم. در این صورت تعداد کل جایگشت‌ها برابر با ۴! یا همون ۲۴ است. فرض کنید توکنی که باید مدل اون رو حدس بزنه همون x3 باشه. تابع هدف به صورت کلی در این نوع مدل زبانی به صورت زیره:در این فرمول مقدار Z_T برابر با مجموعه کل جایگشت‌های دنباله به طول T است. همچنین x_z_t بیانگر توکن tام از جایگشت z است و x_z&lt;t برابر با تمامی توکن‌های قبل از اندیس t است.  با توجه به فرمول بالا لگاریتم احتمال رخداد توکنی که مدل باید حدس بزنه به شرط توکن‌های قبلی حساب میشه و امیدریاضی بر روی تمامی جایگشت‌ها حساب میشه. اما در عمل به دلیل اینکه تعداد جایگشت‌ها می‌تونه خیلی زیاد باشه فقط بعضی از اون‌ها به صورت رندم انتخاب می‌شوند، به صورتی که توکن هدف حتما در مجموعه جایگشت‌های انتخابی، در تمامی ایندکس‌های اول تا آخر جمله ظاهر شده باشه.جایگشت‌های مورد قبول برای حدس زدن توکن x3مکانیزم Attention Maskبا توضیحات بالا احتمالا متوجه شده باشید که پیاده‌سازی تابع هدف معرفی‌شده با استفاده از transformer یک چالش اصلی داره. فرض کنید که جمله ورودی برابر با x=[This, is, a, sentence] باشد. در این صورت مدل احتمال Pr(This|is)  را همسان با Pr(This|a) می‌تونه ببینه در حالیکه می‌دونیم پوزیشن کلمات is و a متفاوته و همین موضوع می‌تونه بر احتمال محاسبه شده تاثیر بذاره. در واقع نیاز داریم تا اطلاعات پوزیشن کلمات context (یعنی کلماتی که به شرط وجود اون‌ها احتمال کلمه هدف رو مشخص می‌کنیم) رو داشته باشیم. خوشبختانه معماری پایه ترنسفومر به صورت پیش‌فرض این مشکل رو حل می‌کنه. در این معماری اطلاعات پوزیشن توکن‌ها با بازنمایی هر توکن ترکیب می‌شه و اینطوری اثر پوزیشن هر توکن context رو می‌تونیم در محاسبه احتمال‌ها ببینیم. اما از اونجایی که در XLNet مکانیزم جایگشتی داریم پس ترتیب کلمات در جمله می‌تونه بهم بخوره. از اینجاست که دیگه مکانیزم position embedding به‌تنهایی به‌درد نمیخوره. XLNet برای پیاده‌سازی مکانیزم جایگشتی از مفهوم attention mask استفاده می‌کنه. به عبارت دیگه مدل همیشه ترتیب اصلی کلمات رو حفظ می‌کنه و فقط کلماتی رو که نباید در نظر بگیره در محاسبه بردارهای attention ازشون چشم‌پوشی می‌کنه. مثلا فرض کنید بخوایم جایگشت [a, is, sentence, This] رو به تابع هدف مدل بدیم. در این‌صورت برای حدس زدن اولین کلمه از این جایگشت (یعنی a) هیچ کانتکستی رو لازم نداریم بنابراین بردار attention mask برابر با [0,0,0,0]  خواهد بود. اگر بخوایم کلمه is رو حدس بزنیم، در جایگشت موردنظر فقط کلمه a قبل از اون اومده پس بردار attention mask برابر با [0,0,1,0] میشه. چرا که در جمله اصلی کلمه a در جایگاه سوم قرار داره. به همین شکل ماتریس attention mask ساخته می‌شه که به‌صورت زیر خواهد بود.از نگاه دیگه تابع هدف می‌تونه شامل موارد زیر باشه. در این تصویر کلماتی که در نظر گرفته نمیشه با زیرخط مشخص شده:مکانیزم Two-Stream Self-Attentionاما با توجه به توضیحات داده شده هنوز یه چالش دیگه باقی‌مونده. در واقع ما علاوه بر اینکه نیاز داریم تا اندیس توکن‌های context رو بدونیم، نیاز داریم تا اندیس توکن هدف رو هم داشته باشیم. به عبارت دیگه دنبال Pr(This|1, is+2) هستیم. اما همون‌طور که می‌دونید اینجا دیگه معماری ترنسفومر نمی‌تونه به‌ما کمکی بکنه چرا که پوزیشن کلمه This رو همراه با بازنمایی خود کلمه This ایجاد می‌کنه. به عبارت دیگه ترنسفومر اصلی مقدار Pr(This|This+1, is+2) رو برمی‌گردونه که طبیعتا ما نمی‌تونیم بازنمایی This رو داشته باشیم چرا که کلمه‌ای هست که می‌خوایم اون رو حدس بزنیم. برای این مشکل، از two-stream self-attention استفاده می‌کنیم. هر توکن در هر لایه self-attention دو تا وکتور داره. یک وکتور h که مربوط به content stream میشه و یک بردار g که مربوط به query stream است. بردارهای content stream همانند بردارهای attention عادی در شبکه ترنسفورمر هستند و با بازنمایی هر توکن به علاوه بازنمایی پوزیشن هر توکن مقداردهی اولیه می‌شوند. اما بردارهای query stream با بازنمایی یک کلمه مشخص مانند w به علاوه بازنمایی پوزیشن هر توکن مقداردهی اولیه می‌شوند. در واقع چون در بردارهای query stream صرفا از بازنمایی یک کلمه ثابت استفاده شده، اثر استفاده از توکن mask رو در برت داره. مکانیزم به‌روزرسانی هر یک از این stream ها به صورت جداگانه انجام میشه. به‌طوری که برای به‌روزرسانی h_i وکتور‌های content stream که unmasked هستند به علاوه خود h_i استفاده می‌شوند. مثلا برای به‌روزرسانی کلمه a  با توجه به جایگشتی که در قسمت قبل مثال زدیم، بردار mask به صورت [0, 0, 1, 0] استفاده می‌شود. چرا که attention mask این کلمه برابر با [0, 0, 0, 0] بود و اندیس اصلی خود این کلمه نیز ۳ است. یا مثلا برای کلمه is بردار mask به صورت [0, 1, 1, 0] خواهد بود. این پروسه از بردارهای content stream به عنوان query, key, value  استفاده می‌کند. از طرف دیگر، هر g_i با استفاده از بردارهای content vector بر اساس attention mask و خود g_i به‌روزرسانی میشه. مثلا برای به‌روزرسانی بردار g_4 که مربوط به کلمه sentence است باید content vector  دو کلمه is و a به همراه خود g_4 استفاده شود چرا که attention mask آن برابر با [0, 1, 1, 0] است. در تصویر زیر نحوه به‌روزرسانی content vector ها و query vector به ازای کلمه چهارم یعنی sentence را مشاهده می‌کنید.با توجه به توضیحات بالا، تابع هدف شامل مقادیر زیر می‌شود که در این تصویر علامت * به معنای این است که اطلاعات پوزیشن آن توکن در نظر گرفته شده است.برای اینکه این موفقیت عظیم رو بیشتر درک کنید، در زیر می‌تونید جدول مقایسه نتایج XLNet رو با BERT ببینید.یه نکته مهم اینه که علی‌رغم بهبود همه‌جانبه از سمت XLNet در تسک‌های معروف، اما قدرت این مدل نسبت به برت در تسک‌هایی که به‌نوعی generative هستند بیشتر مشهوده. درواقع شبکه برت در تسک‌های تولید زبان ضعف بیشتری از خودش نشون میده و دلیلش هم تقریبا مشخصه. چون وقتی می‌خوایم متنی رو تولید کنیم طبیعتا کلمات ماقبل رو فقط دیدیم و همین فرض باعث میشه که AR language modelها قدرت بیشتری در تسک‌های تولید زبانی داشته باشند.جمع‌بندیمدل XLNet یه روش برای پیش‌آموزش مدل زبانیه که با استفاده از permutation language modeling سعی داره هم از خوبی‌های AR language modelingها استفاده کنه و هم از AE language modelها. معماری این مدل طوری طراحی شده که با استفاده از مکانیزم Two-Stream Self-Attention بتونه بر کمبود‌های معماری استاندارد ترنسفورمر برای پیاده‌سازی این تابع هدف غلبه کنه و تونسته نتایج بهتری نسبت به BERT بر روی خیلی از تسک‌های استاندارد پردازش زبان به‌دست بیاره.منابع[1]: XLNet: Generalized Autoregressive Pretraining for Language Understanding[2]: Understanding XLNet[3]: What is XLNet and why it outperformes BERT</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Wed, 23 Feb 2022 18:49:33 +0330</pubDate>
            </item>
                    <item>
                <title>استقرار تحلیل پیش‌بینی ریزش مشتریان در محصول</title>
                <link>https://virgool.io/SahabPardaz/%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1-%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D9%BE%DB%8C%D8%B4-%D8%A8%DB%8C%D9%86%DB%8C-%D8%B1%DB%8C%D8%B2%D8%B4-%D9%85%D8%B4%D8%AA%D8%B1%DB%8C%D8%A7%D9%86-%D8%AF%D8%B1-%D9%85%D8%AD%D8%B5%D9%88%D9%84-tp01rmm5skat</link>
                <description>استقرارِ یک تحلیلِ مبتنی بر هوش‌مصنوعی مانند جانمایی درست در یک سمفونی‌ست.قبلا در این مطلب به توضیح درباره تحلیل پیش‌بینی ریزش مشتریان و نکات فنی مربوط به این تحلیل پرداخته بودیم. در این قسمت می‌خوایم سراغ استقرار تحلیل پیش‌بینی ریزش در محصول بریم. تجربه‌ای که در سحاب و روی محصول سکان به‌دست آوردیم و دوست داشتیم اون رو به اشتراک بذاریم. همون طور که می‌دونید بین استفاده از یادگیری ماشین و یادگیری عمیق در آزمایشگاه و در صنعت اختلاف معناداری وجود داره. وقتی در محیط Colab اقدام به توسعه مدل می‌کنید، صرفا بر روی دادگان مشخصی آزمایش انجام می‌دهید که اتفاقا سعی بر اینه که مدل ایجاد شده تعمیم‌پذیری خوبی داشته باشه اما این به این معنا نیست که وقتی در پروداکشن قرار می‌گیره می‌تونه به خوبی عمل کنه. وقتی یک مدل مبتنی بر یادگیری ماشین وارد یک محصول میشه باید بتونه به خوبی نیازهای فنی و بیزینسی رو پوشش بده. در واقع تحلیل ما به عنوان مثال بخشی از یک سمفونیه که باید درست نواخته بشه. مثلا اگه محصول ما با سری‌های زمانی سروکار داشته باشه، مدل آموزش داده شده بعد از مدتی منقضی می‌شه و اگه مانیتورینگ خوبی برای عملکردش داشته باشید متوجه می‌شید که کیفیت عملکردش افت پیدا کرده. تا همین جا دو نیازمندی مهم برای استقرار مدل‌‌ پیش‌بینی ریزش مشتریان در محصول مشخص شد. اول اینکه باید بتونیم به صورت دوره‌ای با داده‌های تازه و تمیز اون‌ها رو re-train کنیم و همچنین بتونیم عملکردشون رو هم مانیتور کنیم. همچنین همون طور که در این مطلب توضیح دادیم، انجام تحلیل پیش‌بینی ریزش مشتریان، نیازمند استخراج ویژگی‌های متعدد از دیتای تراکنش‌های بیزینس هست که فرایندی زمان‌بره. در فاز اکسپریمنت (experiment) می‌تونیم براش صبر کنیم اما در فاز پروداکشن و به‌خصوص زمان inference نیاز داریم که خیلی سریع انجام بشه. این قسمت بیشتر یک فرآیند مهندسی داده‌ست و از سرویس ETL سکان به عنوان ورودی، این فیچرها رو طلب می‌کنیم و اینکه چه‌طوری در لحظه، فیچر‌های مورد نیازمون آماده می‌شن رو به یک پست دیگه واگذار می‌کنیم.نکته‌ی مهم دیگه اینه که وقتی بر روی یک محصول و داخل یک تیم کار می‌کنیم نیاز داریم تا از نتایج کار‌های همدیگه آگاه باشیم و هر موقع که لازم شد بتونیم به اکسپریمنت‌های گذشته رجوع کنیم. طبیعتا این حالت هم با حالتی که تنهایی نشستیم و داریم توی Colab خوش‌گذرونی می‌کنیم فرق می‌کنه. در این حالت لازمه که بدونیم هر اکسپریمنت دقیقا با چه دیتایی اجرا شده و چه مدلی رو خروجی داده. به عبارت دیگه نیاز داریم تا experiment tracking انجام بدیم. طرف دیگه ماجرا هم یک‌سری نیازمندی‌های بیزینسی هست. همون طور که قبلا توضیح دادیم، پیش‌بینی ریزش مشتریان در واقع نوعی تلاش برای شناسایی آن دسته از مشتریانی ست که قبلا خیلی‌خوب از ما خرید می‌کردند ولی به مرور زمان خرید‌های کمتری انجام میدن. هر چقدر زودتر بتونیم تشخیص بدیم که یک مشتری می‌خواد از پیش ما بره بهتره. اینجاست که به یک مدل پیش‌بینی‌کننده با دقت و حساسیت بالا نیاز داریم. در واقع مدل آموزش داده شده قراره کار forecast انجام بده. خروجی این مدل به صورت یک عدد احتمالاتی بین ۰ و ۱ است. به این معنی که هر چقدر عدد خروجی به عدد یک نزدیک باشه یعنی احتمال رویگردانی اون مشتری بیشتر میشه و هر چقدر به صفر نزدیک‌تر باشه احتمالا اون مشتری باز هم از بیزینس ما خرید خواهد کرد. تا اینجا همه‌چیز به نظر شیک و مجلسی میاد اما بر اساس اکشنی که بیزینس مورد نظر می‌خواد با مشتریان در معرض ریزش انجام بده خروجی می‌تونه متفاوت بشه. اون چیزی که برای بیزینس مهمه یک عدد احتمالاتی نیست بلکه مدل ما باید بگه چه کسانی ریزش می‌کنند و چه کسانی فعال خواهند ماند. پس در واقع باید خروجی صفر و یک به محصول برگردونیم و از همین جا پای یک threshold به میون میاد. نقش این threshold در اینه که مشتریانی با احتمال بیش از threshold رو به عنوان ریزش‌کرده در نظر بگیریم. اما هر چقدر این threshold رو سخت‌گیرانه‌تر در نظر بگیریم میزان precision رشد می‌کنه اما میزان recall با کاهش مواجه می‌شه. از همین‌جا باید بتونید در محصول یک تعادلی بین این دو معیار برقرار کنید. همچنین چون طبق توضیحات قبلی، پیش‌بینی ریزش مشتریان اساسا یک مسئله با دادگان imbalanced هست پس لایه آخر مدل آموزش داده شده (که عموما از جنس sigmoid) است به سمت عدد صفر بایاس می‌شه. به این صورت که اگه نمودار ROC و یا PR اون رو بکشید به ازای thresholdهای بسیار نزدیک به صفر، تعادل مناسبی بین precision و recall برقرار می‌شه. برقراری تعادل بین precision و recall و همچنین حد آستانه در‌نظر‌گرفته‌شده یکی دیگه از نکات مهمیه که باید در استقرار مدل در محصول مدنظر قرار داده بشه.نمودار precision برحسب recall. طبق این نمودار هر چقدر مقدار precision افزایش یابد مقدار recall کم می‌شود.و اما نکته اصلی! بله؛ اصلا لازم داریم تا مدل آموزش داده شده به دیگر بخش‌های سیستم سرویس‌دهی کنه و عملیات inference رو پشتیبانی کنه. پس یکی دیگه از نکات مهم استقرار تحلیل پیش‌بینی ریزش در محصول، نحوه سرویس‌دهی مدل به دیگر ماژول‌های سرویس سکان است. در ادامه به سیر تکاملی راه‌حل‌هایی که در سکان به اون‌ها رسیدیم می‌پردازیم و سعی ‌می‌کنیم مزایا و معایب هر کدوم از این practiceها رو بیان کنیم.راه‌حل اول؛ خیلی ساده، خیلی عالی! Python SDKدر این راه‌حل کل لاجیک مدل‌سازی و inference رو در یک پکیج پایتون پیاده‌سازی کردیم. سپس باید این پکیج در کدبیس back-end ایمپورت بشه تا این تیم بتونه ازش استفاده کنه. از خوبی‌های این راه‌حل اینه که تا حدی به separation of concerns نزدیک شده اما از نکات منفی‌ش اینه که هنوز وابستگی‌های نامناسبی وجود داره. مثلا از تنسورفلو در SDK ما استفاده شده و وقتی ‌back-end هم می‌خواد ازش استفاده کنه باید تنسورفلو رو نصب کنه که نگهداری و نصبش در ‌back-end هم خودش داستان‌هایی داره. از طرفی هنوز یکی از خواسته‌های ما یعنی re-train های منظم در بازه‌های زمانی مختلف رو پشتیبانی نمی‌کنه و این کار رو باید تیم back-end خودش انجام بده که این یعنی یک لاجیک از تیم دیتا به تیم back-end منتقل شده و این هم نکته خوبی نیست. همچنین مانیتورینگ عملکرد مدل‌ها نیز باز به عهده تیم back-end هست که با توجه به اینکه این مدل‌ها مبتنی بر یادگیری ماشین هستند مانتورینگ‌شون هم میتونه پیچیدگی‌های خاص خودش رو داشته باشه. از همه مهم‌تر این پکیج پایتونی مثل همه کدبیس‌های دیگه نیازمند استقرار فرآیند‌های دقیق و تمیز مهندسی نرم‌افزار است. مشکل اینجاست که لاجیک این تحلیل در تیم دیتاساینس وجود داره در حالیکه پیاده‌سازی اون رو احتمالا باید افراد دیگه‌ای انجام بدن. علتش هم اینه که عموما دیتاساینتیست‌ها اصول پیاده‌سازی تمیز کد رو به‌خوبی توسعه‌دهنده‌های دیگه انجام نمیدن. همین گلوگاه مهم می‌تونه مشکل‌آفرین باشه چون نیازمند تعامل بسیار نزدیک تیم دیتا و تیم بک‌اند هست.اما نیازمندی بیزینسی که در بالا مطرح کردیم یعنی همون استفاده از حد آستانه مشخص، در این SDK پیاده‌سازی شده و به back-end این اجازه رو می‌ده که هم برچسب ۰ و ۱ و هم احتمالات رو از این پکیج دریافت کنه. نکته مهم اینه که سرویس سکان باید پیش‌بینی ریزش مشتریان رو برای بیزینس‌های متفاوتی پشتیبانی کنه و به عبارتی قراره این تحلیل و تحلیل‌های دیگه رو به مثابه یک سرویس برای بیزینس‌ها فراهم کنه. قطعا توزیع دیتای هر بیزنس از دیگری متفاوته. از همین جا سختی کار با یک ترشولد ثابت مشخص می‌شه. در حالتی که این تحلیل فقط برای یک دیتاست و برای یک بیزینس طراحی شده باشه، چنانچه ترشولد تصمیم‌گیری نهایی بر روی مقادیر نزدیک به صفر بایاس شده باشه مشکلی پیش نمیاد. چرا که با رسم نمودار ROC و یا PR می‌تونیم ترشولد مناسب رو جهت برقراری تعادل پیدا کنیم. اما اینجا لازم داریم که همواره بهترین تعادل بین precision و recall بر روی مقدار ۰.۵ در تابع sigmoid قرار بگیره چرا که سختی تحلیل رو کاربر بر اساس نیاز بیزینس باید بتونه تنظیم کنه و لازم هست که در همه بیزینس‌ها این اسلایدر تعریف و مفهوم یکسانی داشته باشه. چیزی که در وهله اول به نظر می‌رسه اینه که با down-sampling بشه بایاس شدن لایه sigmoid رو حل کرد. بنابراین لاجیک down-sampling رو هم در این پکیج پیاده‌سازی کردیم تا از بایاس شدن تابع sigmoid به دلیل وجود داده‌های imbalanced جلوگیری بشه.تصویر اسلایدر جهت تنظیم سخت‌گیری تحلیل پیش‌بینی ریزش در محصول سکانهمچنین عملا اکسپریمنت‌هایی که تیم دیتا انجام داده هم خیلی به ورژن کد مپ نشده و عملا این دو تا فاز از هم کاملا جدا هستند. به عبارتی کار اکسپریمنت در یک ریپو و کار استقرار تحلیل در محصول هم در یک ریپوی دیگه انجام می‌شه. این جدایی می‌تونه کار ما رو برای بهبود‌های آینده تحلیل‌ها سخت کنه. همچنان اکسپریمنت‌ها در کولب انجام میشه و کسی از حال دیگری خبری نداره! که این هم نشونه خوبی نیست.راه‌حل دوم؛ Kubeflow و دیگر هیچ!خب همون طور که دیدید راه‌حل قبلی نقایص بسیاری داره که باید سعی کنیم اون‌ها رو برطرف کنیم. یک راه‌حل مناسب که نسبتا به‌روز و جدید هست استفاده از kubeflow هست که مبتنیه بر kubernetes. استفاده از کیوب‌فلو مزیت‌های زیر رو داره:با استفاده از kubeflow می‌تونیم تحلیل پیش‌بینی ریزش رو به صورت یک پایپ‌لاین خوش‌تعریف دربیاریم. می‌شه اکسپریمنت‌های مختلفی رو برای این پایپلاین تعریف کنیم که در نتیجه کل تیم می‌تونه به همه این اکسپریمنت‌ها دسترسی داشته باشه. می‌تونیم برای هر پایپ‌لاین زمان‌بندی training تعریف کنیم که به صورت دوره‌ای کار آموزش بر روی دادگان جدید انجام بشه. هر دادگانی که برای اکسپریمنت استفاده می‌شه بر روی یک minio server که در کنار kubeflow بالا اومده ذخیره می‌شه. این دیتاست‌ها تحت عنوان آرتیفکت اولین کامپوننت پایپ‌لاین ذخیره می‌شن که کارش آماده‌سازی دادگان برای تحلیله. میشه برای کامپوننت‌های مختلف، آرتیفکت‌های متفاوتی تعریف کرد و اون‌ها رو ذخیره کرد.برای استفاده از kubeflow لازمه که پایپ‌لاین‌هامون رو بتونیم به فرمتی که این ابزار میفهمه بنویسیم. چیزی که این ابزار میفهمه یک فایل yml پیچیده است که تقریبا هیچ بنی‌بشری به این راحتیا نمیتونه ازش سر دربیاره اما خوش‌بختانه کیوب‌فلو یک DSL به زبون پایتون داره که با استفاده از اون می‌تونید پایپ‌لاین‌تون رو توصیف کنید. اما کار به همین‌جا ختم نمیشه. از اونجایی که برای مدل‌سازی از ابزار tensorflow استفاده کردیم به راحتی می‌تونیم از مابقی استک tensorflow هم لذت ببریم. در همین راستا میشه از ابزار TFX استفاده کرد. در واقع به جای اینکه سراغ استفاده از DSL کیوب‌فلو بریم می‌تونیم از TFX استفاده کنیم. خب شاید بپرسید که چه مزیتی داره؟ اولین نکته‌ش اینه که در واقع TFX یک لایه بر روی کیوب‌فلو هست. یعنی شما اگه پایپ‌لاین‌تون رو با TFX توصیف کنید می‌تونید هم بر روی kubeflow اجراش کنید و هم بر روی orchestrator های دیگه مانند apache airflow. نحوه توصیف چند کامپوننت از پایپ‌لاین تحلیل پیش‌بینی ریزش مشتریان رو در بالا می‌تونید ببینید. پس در واقع یک لایه با یک زبان مشترک به نام TFX ایجاد شده که پایپ‌لاین‌هایی که با اون توصیف کردید رو می‌تونید بر روی زیرساخت‌های مختلف اجرا کنید. از طرفی چون تمرکز TFX بر روی ایجاد پایپ‌لاین برای train مدل‌ها و استقرار در محصول بوده تعداد مناسبی از کامپوننت‌های ازپیش‌تعریف‌شده داره که مثل هلو می‌تونید ازش استفاده کنید. کل پایپ‌لاین تحلیل پیش‌بینی ریزش مشتریان در تصویر زیر قابل مشاهده است.نمایی از کل پایپ‌لاین تحلیل پیش‌بینی ریزش مشتریاندر این تحلیل ابتدا باید دیتاست موردنظر به پایپ‌لاین وارد بشه که این کار رو کامپوننت importexmaplegen انجام می‌ده. سپس یک سری آماره بر روی دیتای ورودی حساب می‌شه تا با استفاده از اون آماره‌ها بشه داده‌های پرت رو شناسایی کرد. همچنین داده‌هایی که با schemaی موردنظر تطابق ندارند نیز باید کنار گذاشته بشن که این کارها به ترتیب به عهده statisticsgen و schemagen هست. بعد از اون نوبت برخی از pre-processها می‌رسه که با استفاده از کامپوننت transform انجام می‌شه. (برای اینکه جزئیات پیاده‌سازی این تحلیل و لاجیک‌های هر یک از این کامپوننت‌ها رو متوجه بشید می‌تونید به این پست مراجعه کنید). حالا دیگه دیتا آماده شده و می‌تونیم با استفاده از کامپوننت trainer اقدام به آموزش مدل کنیم. در واقع بیشترین لاجیک مربوط به تحلیل، در کامپوننت‌های transform و trainer پیاده‌سازی میشه. به دلیل اینکه از TFX استفاده می‌کنیم، خیلی راحت می‌تونید برای توصیف معماری مدل از Keras استفاده کنید. بعد از آموزش هم، مدل آموزش داده شده با بهترین مدل موجود که تا الان توی scope تیم شما طراحی شده مقایسه می‌شه و چنانچه مدل جدید آموزش داده شده با معیارهای مورد نیازی که تعریف کردیم تطابق داشته باشه، کامپوننت evaluator اون رو برای کامپوننت بعدی میفرسته و همچنین اون رو به عنوان بهترین مدل جایگزین مدل قبلی می‌کنه. در این مرحله اگه به موفقیتی نرسیده باشیم پایپ‌لاین همین جا به اتمام میرسه و دیگه جلوتر نمی‌ره. چنانچه مدل بهتری رو تونسته باشیم تولید کنیم، کار دست کامپوننت pusher می‌افته و کارش اینه که مدل رو ذخیره‌سازی کنه و مدل رو به فرمت SavedModel در tensorflow ذخیره می‌کنه.اما همچنان یک چالش اصلی باقی مونده. اینکه مدل‌هایی که به عنوان خروجی پایپ‌لاین این تحلیل تولید میشن باید serve بشن. اینطوری می‌تونیم با معماری میکروسرویس به دیگر تیم‌های فنی سرویس‌دهی بکنیم که خب معماری جا افتاده و درست‌و‌درمونی هست. برای serve کردن مدل هم از tensorflow serving استفاده می‌کنیم. این ابزار می‌تونه خروجی پایپ‌لاین رو سرو کنه به این صورت که برای هر مدل یک endpoint API ایجاد می‌کنه. در واقع خروجی پایپ‌لاینی که در بالا توضیح دادیم به عنوان ورودی برای tensorflow serving استفاده می‌شه. ابزار tensorflow serving به طور دائم به محل ذخیره‌سازی کامپوننت pusher نگاه می‌کنه و چنانچه مدل جدیدی توسط کامپوننت pusher ایجاد شده باشه مدل قبلی رو به نرمی پایین میاره و مدل جدید رو serve می‌کنه (تاکید روی به نرمی داریم به خاطر اینکه فقط تقریبا اندک لحظه‌ای حس پایین بودن سرویس ایجاد می‌شه و همه‌چیز خیلی smooth هندل شده است). البته این وسط برای tensorflow serving می‌تونید version policy های زیادی رو ست کنید.جمع‌بندیبدین ترتیب تونستیم یک تحلیل پیش‌بینی‌محور رو که صرفا باهاش اکسپریمنت کرده بودیم، در پروداکشن ایجاد کنیم. با استفاده از مکانیزم‌های بالا عملیات re-training با استفاده از زمان‌بند کیوب‌فلو انجام می‌شه و همچنین عملیات inference هم با استفاده از endpoint APIهایی که tensorflow serving برامون فراهم کرده صورت می‌پذیره. با استفاده از kubeflow می‌تونیم اکسپریمنت‌هامون رو track کنیم و آرتیفکت‌های هر بار اجرای پایپ‌لاین رو هم بر روی minio-server به صورت ذخیره‌شده داشته باشیم. پروژه‌ای که در بالا توضیح دادیم تنها یکی از فعالیت‌های تیم دیتا در شرکت سحاب بود. امیدواریم که از تجربه‌ای که ما داشتیم بهترین استفاده رو ببرید!</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Wed, 15 Dec 2021 08:49:30 +0330</pubDate>
            </item>
                    <item>
                <title>بازسازی عکس‌های قدیمی با هوش‌مصنوعی</title>
                <link>https://virgool.io/overfit/gfp-gan-gxudgqbqptsd</link>
                <description>به راستی تسلی بزرگی است که کسی بتواند در زمان های درد و تنهایی و فراق، دست کم یک خاطره ی کامل درخشنده را به یاد آورد. آندره مورواموضوع بازسازی تصاویر قدیمی همیشه یکی از آرزوهای پاک بشریت بوده! خیلی وقت‌ها دوست داریم عکس‌های چهره قدیمی از اجدادمون رو بتونیم واضح‌تر ببینیم که ببینیم چه شکلی بودند. این تسک به نوعی حذف نویز و بهبود و بازسازی تصاویر است. خب فرض کنید میخواید خودتون به عنوان یه نقاش دیجیتال چهره قدیمی بابابزرگ رو بازسازی کنید. برای اینکه با کیفیت بالا بتونید بازسازی کنید احتمالا قسمت‌هایی که نویز داره رو از ذهن خودتون و اطلاعات prior درباره چهره انسان‌ها (که در طول حیات یاد گرفتید) نقاشی می‌کشید و برخی قسمت‌هایی رو هم که جزییات بیشتری دارند، می‌تونید یه عکس تمیز از یه صورت جلوتون بذارید و با کمک اون عکس تمیز بازسازی رو انجام بدید. در دنیای هوش‌مصنوعی هم همین‌طور بوده. ینی قبلا برای بازسازی این تصاویر یا از اطلاعات prior درباره فیچر‌های صورت انسان استفاده می‌کردند یا با استفاده از برخی عکس‌های رفرنس این بازسازی رو انجام می‌دادند. اما یه نکته مهمی این وسط وجود داره. شما احتمالا هر چقدر نقاش ماهرتری باشید، قسمت‌های نویزی رو با کیفیت بهتری رسم می‌کنید. پس مهمه که اطلاعات prior درباره نقاشی و صورت انسان رو به‌طور همزمان داشته باشید. حالا یه سوال! در دنیای AI کدوم شبکه‌ست که از همه بهتر نقاشی می‌کشه؟ بله درسته! شبکه GAN. دقیقا ایده مقاله‌ای که می‌خوایم معرفی کنیم مبتنی بر استفاده از همین شبکه‌ها در بازسازی تصاویر قدیمی است. با این پست از انتشارات اورفیت همراه باشید تا این مقاله رو بهتر درک کنید.معماری کلی روش GFP-GAN. ابتدا ورودی به شبکه degradation removal داده می‌شه و بعد خروجی اون بخشی به سمت شبکه GAN و بهشی به سمت Channel-Split SFT میره. ماژول Channel-Split SFT خروجی GAN رو هم استفاده می‌کنه و با ترکیب تابعی از f_spatial و خروجی GAN خروجی مورد نظر رو برای توابع هزینه آماده می‌کنه. توابع هزینه هم چندین بخش هستند که بخش‌هایی مربوط به fidelity تصویر و بخش‌هایی مربوط به realness تصاویر هستند.در این مقاله از این ایده استفاده شده که احتمالا بهترین دانش prior درباره بازسازی چهره، در شبکه‌ای است که بلده خوب چهره‌ها رو رسم کنه (مثل StyleGan2). در واقع در این مقاله از این شبکه به صورت pre-trained استفاده شده. اما یه چالش بزرگ وجود داره. شبکه StyleGan2 یاد گرفته که از یه سری نویز، تصاویر غیرواقعی تولید کنه که خیلی واقعی هستند! اما در این تسک ما علاوه بر واقعی بودن برامون مهمه که تصویر خروجی شباهت بسیار بالایی به تصویر ورودی داشته باشه(fidelity). در واقع شبکه باید به تصویر ورودی وفادار باشه. معماری کلی این سیستم رو می‌تونید در تصویر بالا ببینید. برای اینکه تصویر ورودی رو بتونند به GAN بدند ابتدا اون رو از یه شبکه U-Net رد می‌کنند که نوعی Auto Encoder است و همون Degradation Removal است که در تصویر بالا می‌بینید. این ماژول تا حدی بلده که نویزهای موجود در تصاویر رو کاهش بده اما برای بازسازی تصاویری که محو شدند کافی نیست و در واقع قراره که خروجی اون به شبکه GAN داده بشه. ماژول degradation removal تصاویر ورودی رو به یه فضای پنهان F_latent می‌بره که این فضای پنهان به عنوان ورودی GAN استفاده می‌شه.قسمت‌هایی که در ماژول Degradation Removal به عنوان F_spatial معرفی شدند (که در تصویر بالا مشخص هستند) در واقع فیچر‌های مکانی تصویر ورودی رو یادگرفتند. از این بردارها باید حتما استفاده کنیم چرا که تصویر نهایی هم باید به نوعی این فیچرها رو داشته باشه تا وفاداری به ورودی اصلی حفظ بشه. در واقع کل سیستم باید یاد بگیره که از این بردارها که به نوعی فیچرهای مکانی تصاویر ورودی هستند استفاده کنه تا نزدیکی خودش رو به تصویر اصلی حفظ کنه و این کار رو در قالب توابع هزینه که در قسمت بعد معرفی می‌کنیم انجام میده. نکته‌ای که در شبکه Channel-Split SFT رعایت میشه اینه که بخشی از خروجی GAN رو که مربوط به ویژگی‌های realness تصویر است، از یه تابع همانی رد میکنه و به اون دستی نمیزنه و split دیگه رو (که مربوط به fidelity است) با F-spatial که از یه شبکه CNN رد شده ترکیب می‌کنه و در نهایت هم باز کل خروجی تابع همانی و این قسمت رو concat می‌کنه و خروجی رو به سمت تابع loss میفرسته. برداری که به سمت توابع هزینه فرستاده میشه بخش‌هایی از اون شامل فیچرهای مختلف تصویر ورودی‌ست که باعث میشه با کمک بخش‌هایی از تابع هزینه که مربوط به fidelity هستند وفاداری به تصویر اصلی بهتر حفظ بشه. توابع هزینه در این مساله از چهار بخش تشکیل شدند که در قسمت بعدی به اون‌ها می‌پردازیم.توابع هزینهاین روش از ۴ تابع هزینه همزمان استفاده می‌کنه و سعی می‌کنه که مجموع این توابع رو به صورت کمینه نگه داره که در تصویر زیر قابل مشاهده است.اولین جمله مربوط به تابع هزینه بازسازی تصویر است. این تابع برای ماژول Removal Degradation استفاده می‌شه و شامل تفاوت تصویر نویزی و تصویر اصلی است که با فاصله نرم L1 محاسبه می‌شه (‌البته یه جمله دیگه هم داره که وارد جزییاتش نمیشیم). جمله دوم مربوط به تابع هزینه GAN است که تابع هزینه‌ای مشابه StyleGan2 داره و سعی بر این است که قسمت discriminator نتونه غیرواقعی بودن تصاویر رو تشخیص بده. در واقع با وجود این تابع هزینه بخش realness تصاویر می‌خواد تضمین بشه. جمله سوم مربوط به facial component loss است. در واقع در این مقاله سعی شده برای چشم‌ها و دهان یه تدابیر ویژه اندیشیده بشه که جزییات با کیفیتی داشته باشن. به همین دلیل از قسمت discriminator شبکه GAN استفاده شده تا غیر واقعی بودن این قسمت‌های صورت رو هم تشخیص بدن و هر چقدر که کمتر این شبکه بتونه غیرواقعی بودن این قسمت‌ها رو تشخیص بده مقدار تابع هزینه کمتر میشه. جمله نهایی مربوط به قسمت Identity Preserving است. با این جمله باز قراره fidelity حفظ بشه. نحوه کار به این صورت است که یه شبکه که مربوط به face recognition است (مثل ArcFace) و می‌تونه فیچرهای صورت رو استخراج کنه رو استفاده می‌کنند و قراره اختلاف خروجی این شبکه به ازای تصویر ورودی و تصویر تمیزشده مینیمم بشه و به زبان ساده‌تر قراره تصویر رو طوری تمیز بکنیم که هنوز ArcFace تشخیص بده که این بابایی که تصویرش رو تمیز کردیم همون بابا‌ست!!جمع‌بندی و نتایجدر نهایت و در قسمت جمع‌بندی این متد با بقیه متدهای پرچم‌دار مقایسه شده و در عمل هم نشون داده شده که چقدر تاثیرگذار است. در تصویر زیر یه نمونه بسیار زیبا ازش می‌تونید ببنید:تصاویر خروجی به ازای متد‌های مشهور در حوزه بازسازی تصاویر. اولین تصویر از سمت چپ، تصویر اصلی و آخرین تصویر از سمت چپ مربوط به متد GFP-GAN است.همچنین عملکرد این مدل بر روی جزییات چشم‌ها و لب‌ها نیز در مقایسه با دیگر متدها بررسی شده که در تمامی موارد میشه گفت متد GFP-GAN اون‌ها رو شکست داده. نکته مهم اینه که برای تست، هم دادگان ساختگی و هم دادگان واقعی استفاده شده و باز هم در تمامی اون‌ها این متد پیروز بوده. برای انجام یادگیری از دیتاست FFHO استفاده شده که شامل ۷۰۰۰۰ تصویر با کیفیته و برای اینکه تصاویر نویزی از توش دربیاد از روش‌های استاندارد استفاده شده که فرمولش رو در زیر می‌تونید ببینید:در این روش تصویر y با عملگر کانوولوشن با Gaussian Blur Kernel ترکیب شده و سپس با نرخ r اقدام به downsampling کردن و بعد نویز سفید به تصاویر اضافه شده و در انتها با فرمت JPEG و نرخ کیفیت q فشرده‌سازی انجام شده. برای تست کردن همون‌طور که گفتیم هم از دیتاست ساختگی CelebA-test استفاده شده و هم از دادگان واقعی مثل CelebChild-Test. در نهایت این دوستان گرامی مدل رو بر روی هاگینگ‌فیس گذاشتند و شما می‌تونید از دمو استفاده کنید. اگه تا الان باور نکردید حتما سری به دمو بزنید و از نتایج حیرت کنید. البته دقت کنید که این مدل فقط چهره‌ها رو بهبود میده و بنابراین اگه یه عکس قدیمی دارید که کلی منظره داره نباید توقع داشته باشید بهبودی حاصل بشه.و در نهایت برای تست سیستم عکس یکی از نوامیس ناصرالدین شاه رو به همراه خودش براتون به GFP-GAN دادیم که کیفیت کار بهتر مشخص بشه!!!در سمت چپ تصویر ناصرالدین شاه و صبیه و در سمت راست تصویر بازسازی‌شده ناصرالدین شاه و صبیه! لینک دمو: https://huggingface.co/spaces/akhaliq/GFPGANلینک مقاله: https://arxiv.org/abs/2101.04061پ.ن.۱: نگاه کنید که چه زیبا با ترکیب ساده ولی دقیق مفاهیمی که داریم و شبکه‌های pre-trained چه چیز غولی ساخته شده.پ.ن.۲: به کانال ما سر بزنید!</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Fri, 10 Sep 2021 20:51:57 +0430</pubDate>
            </item>
                    <item>
                <title>کسب و کارها چطور با استفاده از هوش مصنوعی اثرات اجتماعی ایجاد می‌کنند؟ (بررسی گزارش دیجی‌کالا)</title>
                <link>https://virgool.io/SahabPardaz/%DA%AF%D8%B2%D8%A7%D8%B1%D8%B4-%D8%B3%D8%A7%D9%84%DB%8C%D8%A7%D9%86%D9%87-%D8%AF%DB%8C%D8%AC%DB%8C-%DA%A9%D8%A7%D9%84%D8%A7-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%AF%D8%B1-%D8%AE%D8%B1%D8%AF%D9%87-%D9%81%D8%B1%D9%88%D8%B4%DB%8C-%D9%87%D8%A7%DB%8C-%D8%A2%D9%86%D9%84%D8%A7%DB%8C%D9%86-bwjtlcdlea9v</link>
                <description>افرادی که به شدت به تغییر دنیا فکر می کنند، همان کسانی هستند که این کار را انجام می دهند.امروزه در محافل مختلف به خصوص در کسب‌وکار‌ها حرف از هوش‌مصنوعی زده می‌شود. هوش‌مصنوعی همچون یک مفهوم سهل ممتنع تا به امروز ظهور و بروز داشته است. مدیران، همگی به دنبال استفاده از این تکنولوژی هستند اما هر چه عطش آن‌ها در استفاده از این ابزار بیشتر می‌شود، ابهامات بیشتری در مورد آن پیدا می‌کنند. عدم توقع درست از این ابزار و همچنین نبود زیرساخت‌های داده‌محوری در سازمان می‌تواند موجب سرخوردگی در استفاده از این تکنولوژی شود چرا که هزینه‌های هنگفتی را بر دوش سازمان گذاشته و عملا نتایج مطلوبی نیز در پی نخواهد داشت.انتشار گزارش سالیانه دیجی‌کالا بهانه‌ای شد تا به بررسی استفاده از هوش‌مصنوعی در سازمان‌ها بپردازیم. عملکرد دیجی‌کالا در سال ۹۹ طبق گزارش منتشر‌شده نشان از بهبود کیفیت و رشد سازمان دارد. رشدی که بخشی از آن مرهون استفاده از تکنولوژی‌های نو و به‌روز در دیجی‌کالا ست و نشان از این دارد که دیجی‌کالا توانسته است زیرساخت‌های داده‌محوری را در سازمان خود نهادینه کند و سپس با به‌کارگیری هوش‌مصنوعی عملکرد خود را ارتقا دهد.در فصل «بستر فناوری» در این گزارش، می‌توان مواردی را که دیجی‌کالا از هوش‌مصنوعی و کلان‌داده‌ها استفاده کرده‌است مشاهده کرد. مواردی همچون بهبود موتور جست‌وجو، سیستم پیشنهاد‌دهنده، نظارت بر محتوای نظرات، پیش‌بینی فروش کالا‌های منتخب، شناسایی تقلب در استفاده از کد‌های تخفیف و همچنین بهبود بسته‌بندی از مواردی هستند که دیجی‌کالا نام آن‌ها را ذکر کرده است. اما برای طراحی و توسعه یک سیستم موفق مبتنی بر هوش‌مصنوعی لازم است نکاتی در نظر گرفته شود. نکاتی که می‌توانند در قالب انتظارات مدیران رده‌های بالای سازمان از تیم‌های فنی و توسعه محصول درنظر گرفته شوند. در واقع در عصر داده‌محوری لازم است تا مدیران بدانند که از جعبه‌سیاه هوش‌مصنوعی باید چه انتظاراتی داشته باشند. از طرفی توسعه‌دهندگان نیز باید به‌طور مسئولانه‌ای اقدام به طراحی و توسعه کنند. در شرکت گوگل حدودا یک سال است که برای طراحی و توسعه هوش‌مصنوعی اصول و قواعدی درنظر گرفته شده است که می‌توانید از این بلاگ آن‌ها را مشاهده کنید. این اصول لزوما صرفا فنی نیستند و بعضا از بیرون به موضوع هوش‌مصنوعی نگاه می‌کنند و همین امر باعث می‌شود که قابل فهم برای عموم باشند.در اولین گام لازم است تا مسئله به‌دقت و به‌درستی تعریف شود. اینکه بدانیم دقیقا دنبال چه چیزی می‌گردیم، اولین گام است. در واقع نباید توقع داشته باشیم که یادگیری ماشین و یا هوش‌مصنوعی اینکه چه مسئله‌ای را باید حل کنیم را به ما بگوید بلکه قرار است مسئله‌ای که ما تعریف می‌کنیم را حل کند[1]. دیجی‌کالا در این گام توانسته بخوبی مسئله‌های مشخصی همچون بهبود موتور جست‌وجو یا سیستم پیشنهاد‌دهنده و یا پیش‌بینی فروش کالاهای منتخب را تعریف کند. در گام بعدی لازم است تا با استفاده از تعریف مسئله، معیارهای ارزیابی مشخصی در سطح کسب‌وکار تعریف شود[2]. مسئله‌هایی که در حوزه یادگیری ماشین تعریف می‌شوند، توابع هدفی را بهینه می‌کنند که عموما از فهم کسب‌وکار دور هستند و جنبه ریاضیاتی دارند. این مرحله نقطه‌ای ست که کارشناسان حوزه کسب‌وکار باید با توسعه‌دهندگان همراهی کنند و معیار‌های مشخص و خوش‌تعریفی را در سطح کسب‌وکار تعریف کنند که عموما متاثر از شاخص‌های کلیدی عملکرد در سازمان هستند. مثلا در قسمت شناسایی تقلب در جشنواره‌ها، دیجی‌کالا توانسته است به صرفه‌جویی روزانه صد میلیون تومانی برسد یا در بهبود موتور جست‌وجو نرخ تبدیل ۸ برابری معرفی شده است. این شاخص‌ها یک معیار قابل فهم برای افراد کسب‌وکار است و حس اثربخش‌بودن توسعه یک موتور مبتنی بر هوش‌مصنوعی را متبادر می‌کند. در نبود این معیار‌ها حتی در صورت موثر بودن به‌کارگیری هوش‌مصنوعی باز هم حس موثر بودن القا نمی‌شود. مثلا در همین گزارش و برای پیش‌بینی فروش کالاهای منتخب، معیار عملکردی آورده نشده است که به نظر بهتر است برای این قسمت نیز معیار عملکرد ارایه گردد. همچنین بررسی ابعاد اجتماعی توسعه هوش‌مصنوعی نیز از مسئولیت‌های مهمی ست که مدیران سازمان باید به آن توجه کنند[3]. دیجی‌کالا در قسمت بهینه‌سازی بسته‌بندی نیز به خوبی به این موضوع توجه کرده است و نشان داده که با توسعه یک روش بهبود بسته‌بندی تا چه حد می‌تواند به صرفه‌جویی در منابع طبیعی کمک کند. بخشی از گزارش سالانه دیجی‌کالا. صرفه‌جویی قابل توجه در منابع طبیعی با پیاده‌سازی یک موتور هوش‌مصنوعی برای بهبود بسته‌بندی محصولاتدر واقع هر چقدر سازمان به سمت حرفه‌ای تر شدن پیش می‌رود افق نگاه سازمان در مسائل مهندسی، مسائل اجتماعی را نیز در بر می‌گیرد. به همین جهت شاید در سازمان‌های کوچک، بسیاری از مسائل اجتماعی اصلا محلی از اعراب نداشته باشد اما برای دیجی‌کالا می‌تواند مهم و پرفایده باشد. به عنوان یک پیشنهاد در راستای رسالت اجتماعی، به دیجی‌کالا توصیه می‌کنیم در گزارش‌های سال‌های آتی حتما ذکر کنند که چه مقدار از منابع سخت‌افزاری مانند GPU ها استفاده کرده‌اند چرا که در برخی پژوهش‌ها نشان داده شده است مثلا مدل خاصی از آموزش یک شبکه هوش مصنوعی به نام ترنسفورمر ( که ابتدا از حوزه پردازش زبان طبیعی مطرح شده است) می‌تواند تا ۵ برابر دوره حیات یک اتومبیل کربن‌دی‌اکسید تولید کند[4]!! میزان انتشار گاز دی‌اکسید‌کربن در سناریوهای مختلف. آموزش یک شبکه ترنسفورمری به تنهایی نمی‌تواند میزان زیادی دی‌اکسیدکربن منتشر کند اما چنانچه با مکانیزم neural architecture search همراه شود تا ۵ برابر یک اتومبیل می‌تواند گاز دی‌اکسیدکربن منتشر کند[5]شکل بالا نشان می‌دهد که مثلا برای آموزش یک شبکه ترنسفورمر اگر از مکانیزم neural architecture search استفاده کنیم تا ۵ برابر بیشتر گاز دی‌اکسیدکربن منتشر می‌شود. بنابراین چنانچه یک معماری پیش‌فرض برای شبکه درنظر بگیریم و از این مکانیزم استفاده نکنیم می‌توان به میزان بسیار زیادی از انتشار این گاز جلوگیری کرد و دین خود را بیشتر به طبیعت ادا کنیم! البته که توجه به این موارد در نگاه اول سخت‌گیرانه به نظر می‌رسد اما هرچه سازمان بالغ‌تر شود می‌تواند رسالت‌های اجتماعی بیشتری را برای خود تعریف کند.سوگیری و انصافمبحث سوگیری و انصاف و یا bias &amp; fairness در سال‌های اخیر بسیار مطرح شده است. عبارت bias در واقع اشاره به سوگیری‌های اجتماعی در جامعه موجود دارد که ممکن است در دیتاهایی که برای آموزش مدل‌های مبتنی بر هوش مصنوعی استفاده می‌شود نیز دیده شوند. مثلا در جامعه آمریکا این بایاس وجود دارد که سیاه‌پوستان، بیشتر جرم و جنایت انجام می‌دهند. وجود این سوگیری اجتماعی منفی می‌تواند در داده‌هایی که برای آموزش مدل‌های هوش‌مصنوعی به‌جهت اعتبارسنجی برای اعطای وام‌های بانکی استفاده می‌شود، خود را نشان دهد و مدل آموزش‌داده‌شده را به سمت عدم اعتبار برای سیاه‌پوستان سوق دهد. وجود این پدیده خطرناک با اولین اعتراضات به گوگل‌ترنسلیت شروع شد. زمانی که این ابزار برای ترجمه جملاتی که شغل‌هایی با موقعیت اجتماعی پایین‌تر داشتند از ضمیر &quot;She&quot; استفاده می‌کرد. این نشان می‌داد داده‌هایی که برای مدل‌های زبانی مورد استفاده در این ابزار استفاده شده بودند از سوگیری جنسیتی رنج می‌بردند. از همان زمان شرکت گوگل اصولی را برای طراحی این سیستم‌های مبتنی بر هوش‌مصنوعی درنظر گرفت تا از عدم انصاف و هم‌چنین سوگیری‌های نامتوازن جلوگیری کند[2]. همچنین در recommender system ها نیز می‌تواند نوعی عدم رعایت انصاف وجود داشته باشد. این عدم انصاف عموما در قبال مشتریانی که کمتر خرید انجام داده‌اند در قبال مشتریان پرخرید دیده می‌شود. به نحوی که مشتریان پرخرید عموما پیشنهادهای دقیق‌تری دریافت می‌کنند در حالیکه مشتریانی که فعالیت کمتری دارند پیشنهاد‌های بسیار ضعیفی به آن‌ها می‌رسد[6]. این عدم توازن تحت عنوان عدم انصاف شناخته می‌شود. لازم است تا مدیرانی که از تیم فنی انتظار طراحی مدل‌های هوشمند دارند به مبحث سوگیری و انصاف توجه ویژه کنند و معیارهایی برای بهبود این موارد توسعه دهند. در دیجی‌کالا یکی از موارد استفاده از هوش‌مصنوعی استفاده از سیستم پیشنهاددهنده است که تنها معیاری که از آن در گزارش یاد شده رشد استفاده ۳۰ درصدی از آن است که البته بسیار خوشحال‌کننده است. به نظر لازم است تا دیجی‌کالا در گزارش‌های آتی حتما معیارهای دقیقی را برای سوگیری و انصاف در توسعه و طراحی این سیستم‌ها تعریف کرده و آن‌ها را در گزارش اعلام نماید.سخن آخردر پایان باید به تمام تیم‌های دیجی‌کالا به خصوص تیم فنی آن خسته نباشید بگوییم. همچنین خوشحال باشیم که چنین سازمان بالغی در فضای IT کشور حضور دارد. امیدواریم انتشار این گزارش‌های عمومی ادامه‌دار باشد و همچنین در قسمت‌های مربوط به AI مواردی که در بالا گفته شد نیز در آن وارد شود تا به توسعه فضای هوش‌مصنوعی در کشور کمک کند.پ.ن: گزارش عملکرد سالیانه دیجی‌کالا در سال ۹۹ را می‌توانید از اینجا دریافت کنید.[1]: Human-Centered Machine Learning[2]: Responsible AI practices[3]: Building responsible AI for everyone[4]: Energy and Policy Considerations for Deep Learning in NLP[5]: Training a single AI model can emit as much carbon as five cars in their lifetimes[6]: User-oriented Fairness in Recommendation</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Sat, 14 Aug 2021 13:57:48 +0430</pubDate>
            </item>
                    <item>
                <title>آمار بازدید پست‌های من در سال ۹۹</title>
                <link>https://virgool.io/@mma137421/%D8%A2%D9%85%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B2%D8%AF%DB%8C%D8%AF-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B9%DB%B9-z8nhchuc9ahf</link>
                <description>در طول تاریخ از اعداد استفاده کردیم تا اغلب داد و ستد کنیم و آن‌چیزی که شمردنی است را بشماریم. برای هر عدد واحد درست کردیم تا عددهای زندگی قاطی نشوند و از اعداد، شفاف‌تر استفاده کنیم؛ مثلا وقتی می‌گوییم ده هزار تومان به پول اشاره داریم و وقتی می‌گوییم ده هزار بلیط به بلیط!روز به روز که در زندگی جلو‌تر رفتیم عددها فرقی نکردند ولی این واحدها بودند که زیاد شدند. واحد کریپتو، واحد اصله درخت، واحد فاصله و …«واحد» یک توافق عمومی است برای شمردن؛ تا همانطور که گفتم شمردن‌ها قاطی نشود. مشاهده افراد دارای ثروت (اجتماعی یا مالی) به من ثابت کرده اینکه چه چیزی را بشماریم از اینکه چطور بشماریم مهم‌تر است. هرکس با واحد خاصی مسائل زندگی را می‌شمارد. اینطور به نظرم آمده که مشخص کردن واحد یعنی مشخص کردن اینکه من در زندگی برای چه چیزهایی ارزش قائلم و می‌خواهم چه چیزهایی را در زندگی بشمارم. https://cdn.virgool.io/annual-report/1399/xvzylwy7siol-779Y4.mp4 اعدادی که بدون واحد ثبت کردمبه ویدیویی که ویرگول برایم ساخته که نگاه می‌کنم میبینم که در سال ۹۹، من در مجموع ۶,۳۰۴ کلمه در ویرگول نوشتم و منتشر کردم و مخاطبین، پست‌های من را ۳۵ مرتبه پسندیدند و  ۱ بار هم نظر خود را روی پست‌های من به اشتراک گذاشتند. در سال ۹۹، ۲۷ نفر در ویرگول من را دنبال کردند تا پست‌های بعدیم را بخوانند. این اعداد نشان میدهند من کاری کرده‌ام. هرکدام به واحدی وصل هستند. از خودم می‌پرسم من کدام واحد را شمارش کرده‌ام؟ کدامیک از واحدهای بالا از همه برای من مهم‌تر است؟ ادامه ویدیو را می‌بینم.آمار از اثر بیرونی می‌گویندطبق آمار پست‌های من ۱,۰۸۲ بار خوانده شدند و ۶۵۶,۷۲۶ ثانیه صرف مطالعه آنها شده است، که با توجه به جمعیتی که در ایران به اینترنت دسترسی دارند، ویرگول به من می‌گوید که توانستم  ۰/۰۰۹۰۰۳۶۴۷ ثانیه، سرانه مطالعه دیجیتال کشور را بالا ببرم.از طرف دیگر ویرگول به من می‌گوید که اگر قرار بود پست‌هایم را چاپ و به دست تک تک خوانندگان برسانم باید ۱۴,۰۶۶ کاغذ مصرف می‌کردم.آن عددهای کوچک ابتدای ویدیو حالا تبدیل شده‌اند به عددهای بزرگ به اینکه من جلوی مصرف این تعداد کاغذ را گرفتم یا به اینکه من  ۰/۰۰۹۰۰۳۶۴۷ ثانیه، سرانه مطالعه دیجیتال کشور را جابه جا کرده‌ام. واحد این عددها برای من ملموس‌تر است.واحد نوشتن چیست؟همه عددهای بالا و همینطور اثر بیرونی که روی خوانندگان و همینطور در مقیاس بزرگتر طبیعت و جامعه اطرافم گذاشتم اعدادی هستند که من دوستشان دارم و به آنها افتخار می‌کنم. اگر چنین ویدیویی دست شما نیز رسید به شما بابت تک تک اعداد تبریک می‌گویم.اثر هر نوشته تا حدودی معلوم است، اگر بنویسید جلوی قطع درخت را می‌گیرید، به سرانه مطالعه کشور اضافه می‌کنید و خوانندگانی جذب می‌کنید که شما را از طریق نوشته‌هایتان می‌شناسند و …به نظرم می‌رسد که نوشته‌های من و شما واحد ندارند ولی اثر بیرونی دارند.</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Mon, 22 Mar 2021 15:00:10 +0430</pubDate>
            </item>
                    <item>
                <title>داستان نامداران: یافتن اسامی خاص!</title>
                <link>https://virgool.io/overfit/%D8%AF%D8%A7%D8%B3%D8%AA%D8%A7%D9%86-%D9%86%D8%A7%D9%85%D8%AF%D8%A7%D8%B1%D8%A7%D9%86-%DB%8C%D8%A7%D9%81%D8%AA%D9%86-%D8%A7%D8%B3%D8%A7%D9%85%DB%8C-%D8%AE%D8%A7%D8%B5-tgovj2phwhxg</link>
                <description>سلام!پیدا کردن اسامی خاص توی متون یکی از تسک‌های پیش‌پردازشی توی پردازش زبان طبیعی محسوب می‌شه. توی این تسک دنبال این هستیم تا اسامی خاص مثل اسم افراد یا اسم سازمان‌ها و یا اسم مکان‌ها رو بتونیم پیدا کنیم و تگ بزنیم. تگ هر یک از این کلمات می‌تونه به عنوان فیچر برای تسک‌های بعدی پردازش زبان طبیعی محسوب بشه. البته دیده شده که همین تسک به تنهایی هم می‌تونه کاربرد‌هایی داشته باشه. مثلا قابلیت X-ray توی کیندل‌های آمازون دقیقا از همین استفاده می‌کنه. اگه از کتابخوان‌های آمازون استفاده کرده باشید می‌دونید که موقع مطالعه کتابتون می‌تونید از این قابلیت استفاده کنید و اطلاعات مختصری درباره هر یک از اسامی خاص توی متن رو ببینید. تو این پست قصد داریم درباره این تسک و روند پیشرفتش و مدل‌های موجود صحبت کنیم.نامداران وارد می‌شوند!: معرفی مسالهبرای اینکه بتونیم این تسک رو انجام بدیم روش‌های متفاوتی در طول زمان استفاده شده. روش‌های اولیه مبتنی بر دانش بودند. به این صورت که یه دیکشنری از اسامی خاص موجود بوده و توی متن باید بر اساس اون اسامی خاص برچسب میخوردن. بعد از اون که یادگیری ماشینی سری توی سرا در آورد سراغ روش‌های بدون نظارت رفتن که این مدل‌ها پیچیدگی زیادی داشتن و کیفیت کار در حد مطلوب نبود. البته علت اینکه ملت سراغ این روش رفتن این بوده که اون موقع داده برچسب خورده مثل امروز فراوون! نبوده ولی امروزه که داده‌های برچسب خورده زیاد داریم بیشتر سراغ روش‌های با نظارت رفتن و از این روش‌ها جواب گرفتن. تا قبل از ظهور یادگیری عمیق از روش‌های آماری استفاده می‌شده که در اون روش‌های نیاز به feature engineering شدید بوده و همین کار رو سخت می‌کرده. علتش هم اینه که توی این حوزه بدست آوردن ویژگی‌هایی برای کلمات که بشه با اونا کلمات رو برچسب اسامی خاص زد خیلی سخته. اما حالا که یادگیری عمیق داریم دیگه این فاز رو به عهده شبکه‌های عصبی گذاشتیم و از شرش خلاص شدیم. البته لازمه که دیتاست‌های قدر قدرتی! داشته باشیم که اون‌ها رو هم معرفی می‌کنیم.یک سیستم مبتنی بر یادگیری عمیق برای تشخیص اسامی خاص سه قسمت اصلی داره که توی تصویر زیر مشخصه. در ادامه درباره هر یک از این قسمتا توضیحاتی میدیم.معماری کلی یه سیستم تشخیص اسامی خاص که مبتنی بر یادگیری عمیق هستبازنمایی دیتای ورودیتوی هر مساله پردازش زبان طبیعی یکی از مهم‌ترین قسمت‌ها نحوه ورودی دادن دیتا ست. ورودی مساله ما از جنس کلمات و جمله‌ها هستن اما باید تبدیل به اعداد بشن. اینجا ست که مساله word embedding وارد بازی می‌شه. شاید جا داشته باشه که توی یه پست جدا درباره انواع و اقسام روش‌هاش توضیح بدیم ولی اینجا هم یه سری توضیحات میدیم که در کار خود وا نمانیم!!یکی از روش‌های رایج، بازنمایی در سطح کلمه ست. برای این کار چندین روش وجود داره که یکی از معروف‌ترین اونها Word2Vec هست که همین روش رو به دو صورت continues bag of words  یا CBOW و skip-gram می‌شه انجام داد. تصویر کلی این دو روش رو در زیر می‌بینید. از معایب بزرگ این روش اینه که محتوا رو بازتاب نمیدن. ینی اینکه برای کلمه مثل &quot;شیر&quot; کلا یه بردار ایجاد می‌کنن. اما پر واضحه که این کلمه در context های مختلف می‌تونه معانی متفاوت داشته باشه. از طرفی به برخی ساختارهای زیرکلمه‌ای توی زبان هم توجه نمی‌کنن. اما یه خوبی بزرگی که دارن اینه که معانی رو حفظ می‌کنن.  ینی کلمات هم‌معنی برداراشون هم فاصله کمی با هم دارن.مدل CBOW در سمت چپ که از روی پنجره کلمات اطراف کلمه هدف یه بازنمایی برای کلمه هدف ایجاد می‌کنه و در سمت راست هم مدل skip-gram که از روی یه کلمه مرکزی برای کلمات اطراف اون یه بازنمایی می‌سازه.از روش‌های بازنمایی سطح کلمات که بگذریم می‌تونیم بریم سراغ بازنمایی کلمات در سطح حروف! توی این روش‌های به ویژگی‌های زیرکلمه‌ای یه کلمه توجه می‌شه. از طرفی یکی دیگه از مشکلات بازنمایی سطح کلمه رو که در بالا نگفتیم رو هم نداره و اون کلمات خارج از واژگان هست. توی تصویر زیر نشون دادیم که می‌شه با استفاده از بازنمایی سطح حروف بردار‌های حساس به محتوا تولید کرد. برای این کار از شبکه‌های LSTM یا CNN استفاده می‌شه. البته این روش در مقایسه با روش قبلی که گفتیم طبیعتا به محاسبات بیشتر و همچنین به منابع پردازشی بیشتر احتیاج داره چرا که روش‌های قبلی حتی بعضا جزو یادگیری عمیق هم محسوب نمی‌شن اما توی این روش شما باید یه شبکه عمیق رو آموزش بدید.حروف به صورت بردار one-hot به یه شبکه LSTM دوطرفه داده می‌شن. دوطرفه بودن باعث می‌شه که اطلاعات پنهان مربوط به محتوا از حرف اول کلمه George تا حرف آخر کلمه Washington در جهت قرمز و اطلاعات پنهان محتوا از حرف آخر کلمه born تا حرف اول کلمه Washington در جهت آبی برای کلمه Washington ذخیره بشه. بعد میان این دو تا بردار رو بهم پیوست میدن.روش‌هایی هم هستن که اومدن بردار کلمه حاصل از دو روش بالا رو بهم پیوست میدن و همزمان استفاده می‌کنن. اما یه تکنیک دیگه ای هم سوار می‌کنن. همون‌طور که اول پست گفتیم قبل از یادگیری عمیق مجبور بودیم فاز مهندسی ویژگی داشته باشیم. اما الان که شبکه عمیق داریم هم دلیل نمیشه اصلا از ویژگی‌هایی که میشه به صورت دستی برای این تسک درآورد استفاده نکنیم! چراااا؟ دلیلش واضحه. چون میتونه فضای جست‌وجو رو برای شبکه عصبی کوچیک کنه و در نتیجه هم سریعتر به کیفیت مطلوب برسه و هم داده کمتری رو مصرف کنه. اما یه مقدار باید باهوش باشیم که بدونیم چه‌طوری اینا رو کنار هم قرار بدیم. توی تصویر زیر معماری این سیستم نشون داده شده. مثلا فرض کنین چند تا فیچر دستی در آوردیم یکی برچسب POS هر کلمه و یکی هم اینکه آیا حرف اولش بزرگ هست یا نه ( توی زبان انگلیسی ) و یکی هم مثلا وجود کسره اضافه بعد از کلمه ( ‌توی زبان فارسی میتونه به تشخیص مرزهای یه کلمه خاص کمک کنه ) . میایم بردار مربوط به این ویژگی‌های دستی رو با بردار حاصل از بازنمایی سطح کلمه و بردار حاصل از بازنمایی سطح حروف هر کلمه پیوست می‌کنیم. بعد این بردار رو به شبکه دوطرفه LSTM میدیم و بعد حالات پنهان خروجی LSTM به طور همزمان به یه شبکه خودرمزنگار و برچسب زننده میدیم. خروجی شبکه خودرمزنگار باید با بردارهای حاصل از ویژگی‌های دستی برابر باشه در نتیجه میزان loss به صورت ترکیبی میتونه حساب بشه و loss هر دو شبکه به صورت همزمان سعی میکنه کمینه بشه. معماری این روش رو هم میتونین توی تصویر زیر ببینین.معماری نحوه اضافه کردن ویژگی‌های دستی در سیستم تشخیص اسامی خاصبازنمایی وابستگی کلماتهمون طور که توی قسمت اول گفتیم بعد از بخش word embeddings نوبت به بخش Generate Representation using Dependencies می‌رسه. توی بخش قبل سعی کردیم هر کلمه رو به یه بازنمایی عددی تبدیل کنیم. اما برای اینکه بتونیم مساله رو کامل حل کنیم به یه سری اطلاعات دیگه هم نیاز داریم. جملات توی زبان طبیعی دنباله‌ای از کلمات هستن و به عبارت دیگه هر دنباله‌ای از کلمات توی زبان طبیعی نمی‌تونه معنی‌دار باشه. همین موضوع ینی اینکه توی وابستگی بین کلمات هم اطلاعاتی نهفته ست. پس باید بتونیم از این وابستگی‌ها هم استفاده کنیم. طبعا اولین گزینه‌ای که به ذهن میرسه استفاده از RNN هست اما میدونیم که با مشکل فراموشی بردار گرادیان مواجه می‌شیم. به خاطر همین از LSTM استفاده می‌شه. در واقع خروجی‌های فاز قبلی که بازنمایی کلمات هستن رو میشه به شبکه‌های LSTM داد و با استفاده از اونها وابستگی بین کلمات رو کپچر کرد. اما طبیعتا استفاده از این نوع شبکه‌ها امکان موازی سازی رو از ما می‌گیره که همین می‌تونه نقطه ضعف این روش باشه. به خاطر همین سعی شده تا از شبکه‌های کانولوشنی هم استفاده بشه. در این روش با استفاده از بردار N بعدی برای هر کلمه و جمله متناظر اون وابستگی بین داده‌ای بازنمایی می‌شه. البته این مدل‌ها توی پردازش جملات طولانی به مشکل میخورن که برای مقابله با این مشکل مدل Iterated Dilated Convolutions معرفی شده. ID-CNN ها به صورت عمق ثابت به طوری که طول موثر ورودی به صورت نمایی با این عمق رشد کنه طراحی شدن. بر خلاف LSTM که پیچیدگی محاسباتی اون به صورت خطی همراه با طول ورودی رشد می‌کنه این شبکه می‌تونه به صورت موازی عملیات پردازش روی جمله‌ها رو انجام بده. در عمل نشون داده شده که سرعت این شبکه در حدود ۱۴ الی ۲۰ برابر شبکه‌های LSTM هست در حالیکه دقت این شبکه فقط کمی بدتر از LSTM هست. در زیر میتونید معماری این نوع شبکه‌ها رو ببینید.یک بلوک ID-CNN که طول فیلتر آن ۳ و عمیق آن ۴ است. با این بلوک یک جمله حداکثر ۱۵ کلمه‌ای رو میشه پردازش کرد.اما در نهایت با ظهور و بروز ترنسفورمر‌ها کلا بازی عوض شد! این شبکه‌ها تنها با درنظر گرفتن مکانیزم توجه می‌تونن وابستگی‌های داده‌ای رو منظور کنن. بردار توجهی که از داده ورودی به دست می‌آد رو می‌شه به صورت موازی به دست آورد و بعد این بردار رو به یه شبکه fully connected داد تا فضای ورودی رو انکود کنه. بردار توجه یه کلمه به صورت زیر به دست میاد:برای اینکه ترنسفورمرها رو بهتر بفهمید توصیه میکنم حتما این سری پست‌ها رو مطالعه کنین. برای اینکه تشخیص اسامی خاص انجام بشه با استفاده از بخش انکودر توی ترنسفورها فضای ورودی رو انکود می‌کنن و بعد با استفاده از یه شبکه برچسب‌زن کار برچسب زدن رو انجام می‌دن. یه پیاده سازی خوب از ترنسفورمر‌ها، BERT هست. برت یه معماری عمومی با استفاده از ترنسفورمر هست که میشه به تسک‌های مختلفی توی حوزه پردازش زبان طبیعی اون رو اپلای کرد. برای این کار باید فرمت ورودی و خروجی برت رو بشناسین و همچنین روی دیتای موردنظرتون اون رو fine-tune بکنین. توی تصویر زیر نحوه ورودی دادن به شبکه برت توی یه تسک NER رو میتونین ببینین. نحوه دادن ورودی و گرفتن خروجی از برت. این تصویر از مقاله رسمی برت برداشته شده.شبکه برچسب زن میتونه یه لایه Dense روی برت باشه. برای fine-tune کردن برت روی تسک NER اول باید داده‌هایی رو که توی دیتاست استاندارد NER دارین، یه مرحله پردازش کنین. پردازش میتونه شامل موارد زیر باشه :اضافه کردن توکن &#x27;CLS&#x27; به ابتدای جملات و توکن &#x27;SEP&#x27; به انتهای جملاتهمسان سازی طول جملات با مقدار max_seq_length ( عملیات padding )تبدیل توکن‌ها به آیدی با استفاده از BERT Tokenizerعملیات masking : در این مرحله باید مشخص کنین که توی هر جمله کدوم توکن مربوط به padding هست و کدوم نیستآیدی segment : توی این قسمت توکن‌های مربوط به جمله اول آیدی ۰ و مربوط به جمله دوم آیدی ۱ میگیرن اما چون تسک NER یه تسک یه جمله‌ای هست طبیعتا همه توکن‌های ما اینجا مقدار ۰ میگیرن.آیدی برچسب : یه عدد صحیح که به هر یک از انواع برچسب‌ها زده میشهعملیات masking برای برچسب‌ها: به هر برچسب مقدار True زده میشه و برای اون قسمت‌هایی که مربوط به padding هستن باید برچسب False بزنین.مقادیر valid ids : برت برای توکنایزر از word-piece tokenizer استفاده میکنه که ممکنه برخی کلمات هم شکسته بشن. به همین دلیل برای اون توکن‌هایی که شکسته نشن این مقدار برابر با ۱ و برای اونایی که شکسته بشن برای قسمت اول اون کلمه مقدار ۱ و برای قسمت دوم اون کلمه مقدار ۰ گذاشته می‌شه.همچنین توکن‌های مربوط به paddings هم مقدار ۱ دریافت می‌کنن.به فرض مثال برای جمله [&#x27;.&#x27; ,‘EU’, ‘rejects’, ‘German’, ‘call’, ‘to’, ‘boycott’, ‘British’, ‘lamb’] و برای دنباله برچسب [‘B-ORG’, ‘O’, ‘B-MISC’, ‘O’, ‘O’, ‘O’, ‘B-MISC’, ‘O’, ‘O’] مقادیر بالا به صورت زیر خواهند بود :در این حالت لازم داریم تا حالت‌های پنهان میانی رو به عنوان بازنمایی کلمات درنظر بگیریم. برای برچسب زدن هم که از یه لایه Dense بر روی برت استفاده میکنیم که در طول عملیات fine-tuning آموزش داده می‌شه. شبکه برت از ۱۲ لایه ترنسفورمر استفاده می‌کنه که هر یک از این لایه‌های یا تعدادی از اونها می‌تونه به عنوان بازنمایی کلمات در نظر گرفته بشه. توی این پست می‌تونین جزییات عملیات fine-tuning رو ببینید همچنین بررسی شده که کدوم لایه‌های میانی به عنوان بازنمایی ورودی در نظر گرفته بشن تا بتونیم نتیجه بهتری بگیریم. توی تصویر زیر نتیجه این بررسی رو می‌بینید:بررسی انتخاب لایه‌های پنهان به عنوان بازنمایی کلمات برای برچسب زدن کلمات در تسک NERاگه دوست دارید کار کردن با برت براتون راحت باشه و بتونین عملیات‌های fine-tune رو هم راحت انجام بدید می‌تونین از کتابخونه Huggingface استفاده کنین که اینترفیس‌های راحتی رو هم براتون فراهم می‌کنه. با این کتابخونه خیلی از عملیات‌های پیش‌پردازش برای tokenization هم راحت میشه و مقادیر بالا رو که توضیح دادیم راحت می‌تونین به دست بیارین. برچسب زنندههمون‌طور که تو قسمت اول توضیح دادیم بعد از تبدیل فضای بردار ورودی به فضایی که وابستگی‌های داده‌ای رو در نظر گرفته حالا باید کلمات رو برچسب اسامی خاص بزنیم. معمولا اسامی اشخاص، اسامی سازمان‌ها، اسامی مکان، اسم رویدادها و اسامی گروه‌ها به عنوان اسامی خاص در نظر گرفته می‌شن. در برخی کاربرد‌ها تاریخ‌ها و یا واحدهای ارزی نیز به عنوان اسامی خاص در نظر گرفته می‌شن. معروف‌ترین روشی که تو این بخش استفاده می‌شه روش CRF هست که نسبت به روش‌های رایج مثل مدل مخفی مارکوف مزیت‌هایی داره از جمله ساده‌سازی  فرض‌های سخت استقلال که توی مدل مارکف ایجاد میشن. این روش امروزه بیشترین استفاده رو توی برچسب زدن اسامی خاص داره. روش دیگه هم استفاده از پرسپترون‌های چندلایه ست که توی سیستم‌های قدیمی‌تر استفاده می‌شده. اگه بخوایم از شبکه چندلایه پرسپترون استفاده کنیم باید خروجی قسمت‌های قبل رو به این شبکه بدیم و در انتها یه لایه softmax بذاریم. آموزش این شبکه آسون تر از شبکه‌های CRF هست اما یه مشکل بزرگ داره و اونم اینه که وابستگی بین دنباله‌ای از برچسب‌ها رو در نظر نمی‌گیره. به عبارت دیگه خود برچسب اسامی خاص هم یه دنباله هستن ینی هر دنباله‌ای از برچسب‌ها لزوما نمی‌تونه توی زبان معنی‌دار باشه پس این وابستگی بین برچسب‌ها هم حاوی اطلاعات هستن که می‌تونیم اونا رو منظور کنیم. هر وابستگی یه علتی داره همون‌طور که جدایی بی دلیل نیست!نحوه ارزیابیبا توجه به اینکه مساله NER یه مساله دسته‌بندی هست بهترین معیاری که برای ارزیابی این مدل‌ها استفاده می‌شه معیار f-score هست. معیار f-score سعی می‌کنه همزمان هم به اسامی که درست برچسب خوردن توجه کنه و هم به اسامی عادی که درست برچسب خوردن. برای آشنایی با این معیار باید با precision و recall هم آشنا باشید. تصویر زیر می‌تونه به درک بهتر این دو معیار کمک کنه:بررسی و مقایسه دو معیار precision و recallمعیار f-score با ترکیب دو معیار بالا بر اساس هر نوع دسته یه امتیاز ارایه میده. به عبارت دیگه کیفیت دسته‌بندی روی هر دسته رو می‌تونه بهمون بده. در نهایت برای اینکه بتونیم کیفیت کلی مدل رو به‌دست بیاریم میتونیم روی امتیاز‌های هر دسته مثلا میانگین وزن‌دار بگیریم. نحوه محاسبه f-score رو هم در تصویر زیر می‌تونین ببینیم :نحوه محاسبه معیار f-scoreمعرفی چند دادگانتوی این بخش هم میخوایم چندتا دیتاست که برای این مساله استاندارد سازی شدن رو بهتون معرفی کنیم. اولین مجموعه، دیتاست Onto-Notes5.0 هست که به زبان انگلیسی، چینی و عربی و به صورت عمومی در دسترسه. بخش انگلیسی این دیتاست شامل ۱۰۸۸۵۰۳ کلمه و بخش چینی شامل ۷۵۶۰۶۳ کلمه هست. بالاترین F-score روی این مجموعه حدود ۸۹.۷۱ هستش. این پیکره از ۵ ژانر محتلف دیتا جمع‌آوری کرده: مکالمات پخش شده، اخبار، مجلات، روزنامه‌ها و داده‌های روی وب. همچنین ۱۸ نوع برچسب موجودیت داره که نشون میده خیلی مفصل هست. همچنین قسمت انگلیسی زبان این مجموعه شامل ۱۴۷۷۲۴ کلمه برای اعتبارسنجی و ۱۵۲۷۲۸ کلمه برای تست هست.پیکره بعدی هم پیکره CoNLL2003 هست که به زبان‌های انگلیسی و آلمانی هست. مجموعه آموزشی این پیکره شامل ۲۰۳۶۲۱ کلمه و مجموعه آلمانی شامل ۲۰۶۹۳۱ کلمه هست. همچنین برای اعتبارسنجی حدود ۵۱۳۶۲ و ۵۱۴۴۴ کلمه به ترتیب برای انگلیسی و آلمانی در نظر گرفته. برای تست هم به ترتیب ۴۶۴۳۵ و ۵۱۹۴۳ کلمه در نظر گرفته شده. توی این دیتاست کلا ۴ نوع اسم خاص در نظر گرفته شده : اسم اشخاص، اسم مکان، اسم سازمان و سایر در نظر گرفته شده است. داده‌های زبان انگلیسی مربوط به روزنامه رویترز و داده‌های زبان آلمانی برای روزنامه Frankfurter Rundschau است. همچنین بالاترین F-score برای این دیتاست حدود ۹۳.۵ درصده. برای کار تو حوزه فارسی دو تا پیکره اصلی وجود داره که روی اونها کارهای زیادی انجام شده. پیکره اول پیکره آرمان هست. این پیکره شامل ۲۵۰۰۱۵ کلمه هست که حدود ۷۶۸۲ جمله میشه. اسامی خاصی که توی این پیکره اومدن ۶ نوع هستن. نوع اول سازمان هست که شامل وزاتخانه، سفارتخانه، تیم های فوتبال، انتشارات و ... میشه. نوع بعدی اسم مکان هست که شامل شهرها، روستاها، کشورها، رودخانه، مناظر طبیعی و ... ست. نوع سوم facility هستش که شامل مدارس، دانشگاه‌ها، فرودگاه‌ها، مراکز توسعه و تحقیق و ... ست.  انواع دیگر هم محصولات و رویدادها هستن. در این پیکره یه نوع دیگه هم درنظر گرفته شده و اون MISC هست که مربوط به توکن‌های اسامی خاصی ست که توی انواع بالا نمیگنجن. داده‌های این پیکره از اخبار و روزنامه‌های رسمی گردآوری شده و به زبان فارسی معیار هست. بالاترین مدلی که بر روی این مجموعه آموزش داده شده مربوط به همون ParsBert جناب فراهانی هستش که f-score حدود ۹۹.۸۴ به دست آورده. پیکره بعدی پیکره PEYMA هست که توسط آزمایشگاهی در دانشگاه تهران ایجاد شده. این پیکره با استناد به دو شیوه‌نامه استاندارد MUC , CONLL تهیه شده و با فرمت IOB برچسب خورده. این پیکره انواع اسامی خاص بیشتری رو پشتیبانی می‌کنه و البته همین هم باعث شده که برچسب زدن بر روی اون سخت تر بشه. انواعی که پشتیبانی می‌کنه شامل اسامی اشخاص، سازمان، مکان، ساختمان‌ها، زمان، تاریخ، مبالغ مالی و درصد‌ها ست. این مجموعه شامل ۳۰۲۵۳۰ توکن و ۷۱۴۵ جمله ست که از مجموعه داده‌های روزنامه‌های رسمی و خبرنامه‌ها برداشت شده در نتیجه این مجموعه هم به زبان فارسی معیار هست. بهترین مدلی که روی این مجموعه آموزش داده شده باز مربوط به مدل ParsBert هست با f-score حدود ۹۳.۴۰ هست. اگه قصد دارید دیتاست تهیه کنین حتما توصیه میشه که این دیتاست ها رو یه بررسی بکنین و شیوه‌نامه‌های استاندارد رو هم یه نگاه بندازین. حتما هم سعی کنین برچسب‌هاتون توی فرمت IOB باشه که با مدل‌های دیگه راحت بتونین تستش بکنین.و در آخر: معرفی مدل‌های ناب!تا اینجا مساله رو معرفی کردیم و هر یک از قسمت‌هاش رو توضیح دادیم. اما الان وقت عمله. توی این بخش یه چند تا مدل خوب معرفی می‌کنیم. اولین مدل مربوط به خود مقاله برت هست. این مدل به f-score حدود ۹۲.۸ رسیده اونم توی دیتای Co-NLL 2003 که دقت بالایی هم هست اما بعد از اون دو سه تا مدل خیلی خوب اومدن مثل این مدل و این مدل که به ترتیب f-score حدود ۹۴.۳ و ۹۳.۵ به دست آوردن. هر دوی این ها هم از ترنسفورمر‌ها استفاده کردن. اما توی فارسی شاید بهترین مدلی که الان وجود داره مدل ParsBert هست. این مدل روی دادگان Arman به f-score هیولای ۹۹.۸۴ رسیده! و بر روی دیتای PEYMA هم به f-score حدود ۹۳.۴۰ دست پیدا کرده که در نوع خودش بینظیره. کاری که این دوستان انجام دادن در واقع pre-train کردن شبکه برت برای مجموعه زبان فارسی بوده و تونستن دقت‌های بسیار خوبی به دست بیارن. اگه هم دوست دارین که از پیشرفت‌های این حوزه و حتی حوزه‌های دیگه توی NLP با خبر بشین حتما با برادر Ruder مانوس باشید که به گمراهی کشیده نشید!</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Sat, 09 Jan 2021 11:09:49 +0330</pubDate>
            </item>
                    <item>
                <title>داستان یک سقوط: پیش‌بینی ریزش مشتریان!</title>
                <link>https://virgool.io/SahabPardaz/%D8%AF%D8%A7%D8%B3%D8%AA%D8%A7%D9%86-%DB%8C%DA%A9-%D8%B3%D9%82%D9%88%D8%B7-%D9%BE%DB%8C%D8%B4%D8%A8%DB%8C%D9%86%DB%8C-%D8%B1%DB%8C%D8%B2%D8%B4-%D9%85%D8%B4%D8%AA%D8%B1%DB%8C%D8%A7%D9%86-qbz4nc2xbsvj</link>
                <description>ریزش چیزهایی که خود، آن ها را به دست آورده ایم بسیار دردناک است!!همیشه مشتری به عنوان یه موجودیت ارزشمند برای کسب‌و‌کارهای مختلف حساب می‌شده. کسی یا سازمانی که با هزینه به عنوان مشتری به‌دست میومده و قرار بوده برای کسب‌و‌کار منبعی از درآمد باشه. حالا قطعا از‌دست دادن یه همچین موجودی! میتونه خیلی برای هر کسب‌و‌کاری دردناک باشه به خاطر همین اگه بتونیم زودتر جلوی این داستان ناگوار رو بگیریم قطعا به کسب‌و‌کار کمک کردیم. از اینجاست که پیش‌بینی این سقوط، مهم و تاثیرگذار می‌شه.توی این پست قصد داریم که یه تحلیل تمیز از ریزش مشتریان ارایه بدیم و تجربه‌ای که خودمون توی سکان به‌دست آوردیم رو با یه دیتای عمومی که اتفاقا توی آوردگاه کگل هم میشه پیداش کرد، توضیح بدیم. این دادگان شامل اطلاعات کمپین‌ها و تخفیف‌ها و تراکنش‌ها ست. اما ما فقط از اطلاعات تراکنش‌ها استفاده می‌کنیم چرا که خیلی مواقع فقط اطلاعات تراکنش‌ها در دسترس هستند گرچه نوت‌بوک‌های دیگه‌ای که روی این دادگان منتشر شدن از اطلاعات دیگه‌ای هم استفاده کردن. کد کامل این تحلیل رو می‌تونید اینجا ببینید.خواندن دادگان و بررسی‌های اولیهخواندن دادگان تراکنش‌هادر این دادگان چند ویژگی نقش کلیدی بازی می‌کنن. ویژگی household_key در واقع شناسه مشتریان کسب‌و‌کاره. همچنین ویژگی BASKET_ID شناسه سفارش مشتریانه. هر سفارش میتونه شامل چندین کالا باشه که در این صورت ممکنه یک شناسه سفارش در چندین سطر تکرار بشه تا کالا‌های مختلف یک سفارش اعلام بشن. ویژگی‌های QUANTITY و SALES_VALUE نیز به ترتیب، تعداد کالا در آن سطر سفارش و حجم خرید از آن کالا در سطر سفارش رو مشخص می‌کنه.قبل از مدل‌سازی لازمه تا بررسی‌های آماری روی دادگان انجام بدیم. برای این کار خوبه که روی ویژگی‌های کلیدی، مقادیر بیشینه و کمینه و توزیع متغیر‌ها رو بدونیم. همین طور بفهمیم که کجاها مقادیر غیر معقول وجود داره یا مثلا چه سطر‌هایی مقادیر None دارن. یکی از مقادیر مرسوم در دیتای فروش کسب‌و‌کارها، مقادیر منفی برای QUANTITY یا SALES_VALUE هست که نشون‌دهنده سفارش‌های برگشتی هست. برخی جاها هم ممکنه برای این نوع سفارش‌ها مقادیر صفر رو در نظر بگیرن. تو این دادگان همین اتفاق افتاده. برای تحلیل لازمه که این سفارش‌ها حذف بشن تا توی سفارش‌های هر مشتری لحاظ نشن. ( البته ممکنه شما ایده بزنین و از دل همین سفارش‌ها هم بخواین ویژگی در بیارین ولی چیزی که مهمه اینه که نباید با این سفارش‌ها مثل سفارش‌های عادی برخورد بشه و ما هم ساده‌ترین راه رو انتخاب کردیم ینی حذف ! ) نمودار هیستوگرام مقادیر QUANTITYهمچنین مقادیر None رو هم بر روی دادگان بررسی میکنیم که اگه وجود داشتن یه فکری به حالشون بکنیم. برای ویژگی‌های کلیدی household_key و BASKET_ID و SALES_VALUE هیچ مقدار None ای وجود نداره.بررسی مشتریاندر این مرحله میخوایم از داده تراکنش‌ها به داده مشتریان برسیم. برای همین بر اساس household_key باید group_by کنیم و ویژگی‌های مختلفی از جمله تعداد خرید هر مشتری یا frequency و مجموع خرید هر مشتری یا monetary رو استخراج کنیم. تابع convert_transaction_to_customers ویژگی‌های مختلف رو از تراکنش‌ها استخراج می‌کنه. لازمه به این نکته توجه کنیم که برخی مشتریان به صورت خیلی کم از کسب‌و‌کار خرید انجام داده‌اند و به نوعی مشتریان غیرعادی تلقی می‌شوند. به همین دلیل توزیع frequency رو بر روی مشتریان بررسی می‌کنیم تا یه سطح آستانه مشخص برای مشتریان پیدا کنیم و مشتریانی که کمتر از اون مقدار دفعات خرید داشتن رو حذف کنیم.فضای ویژگی جدید برای مشتریانفضای ویژگی جدیدی که برای مشتریان بدست اومده از روی اطلاعاتی هست که از متخصصان این دامنه گرفته شده. این ویژگی‌ها میتونن تفسیر نسبتا خوبی از رفتار خرید هر مشتری ارایه بدن. مثلا مقدار recency فاصله زمانی آخرین خرید هر مشتری از تاریخ روز هست. یا مثلا product_diversity برابر تعداد انواع کالایی هست که هر مشتری خریده. پارامتر periodicity هم فاصله زمانی بین هر خرید مشتری هست که آماره‌های مختلف مانند میانگین و انحراف از معیار و ... بر روی اون حساب شده. مقدار AOV هم برابر میانگین ارزش خرید هر مشتری هست. توزیع ویژگی‌های بالا رو میتونین ببینین.نمودار هیستوگرام توزیع فضای ویژگی بر روی مشتریانتوزیع frequency برای مشتریانبا بررسی توزیع frequency، مشتریانی که کمتر از ۱۰ بار خرید انجام دادن رو حذف می‌کنیم. این مشتریان به نوعی داده پرت محسوب می‌شن و می‌تونن تعمیم‌پذیری مدل احتمالاتی رو خراب کنن.یه پارامتری که خیلی می‌تونه توی تحلیل ریزش موثر باشه مقدار D/F یه کسب‌و‌کار هست. مقدار D/F همان میزان duration هر مشتری تقسیم بر مقدار frequency همون مشتریه و میانگین مقادیر D/F یه پارامتر مهم هست که رفتار کلی کسب‌و‌کار رو براساس دفعات خرید تعیین می‌کنه. پارامتر duration هم به میزان حضور یه مشتری توی کسب‌و‌کار برمی‌گرده ینی بازه بین اولین و آخرین خرید هر مشتری. با پارامتر D/F جلو‌تر کار داریم! اما علی الحساب بدونین که این مقدار برای این دادگان حدود ۱۱.۱۹ روز هست. به این معنی که توی این کسب‌و‌کار امید میره که هر مشتری حدودا هر ۱۱ روز یک‌بار خرید انجام بده. البته توی محاسبه این KPI هم لازمه که اول مشتریان تک خرید حذف بشن چرا که مقدار duration برای این مشتریان برابر صفر هست و این مقدار میتونه ما رو گمراه کنه. تعریف ریزش مشتریانقبل از ورود رسمی به مساله باید که ریزش یک مشتری رو تعریف کنیم. برای ریزش مشتریان تعریف رسمی وجود نداره ولی با توجه به اطلاعاتی که از متخصصان این دامنه گرفتیم معمولا مشتری که بیش از مقدار دو برابر میانگین D/F توی کسب‌و‌کار خریدی انجام نده به عنوان یه مشتری ریزش کرده شناسایی می‌شه. اینجاست که اهمیت این پارامتر مشخص می‌شه. البته ما روی دادگان های مختلف با D/F های متفاوت هم تست کردیم و دیدیم که یک مدل بر روی کسب‌و‌کار‌هایی با D/F های نزدیک بهم تا حد بسیار زیادی نتایج یکسان ارایه می‌کنه و این نشون میده که توی تحلیل ریزش مشتریان این پارامتر میتونه نقش کلیدی ایفا کنه. با توجه به تعریف بالا لازمه که از روی دیتای تراکنش‌های کسب‌و‌کار، الگوهای رفتاری خرید مشتریان رو به‌دست بیاریم و بعد این‌ها رو براساس تعریف ریزش مشتری، برچسب بزنیم تا برای فاز مدل‌سازی آماده بشیم. برای این کار یک پنجره لغزان M روزه رو با گام S روزه بر روی داده تراکنش‌ها حرکت می‌دیم. باید تابعی داشته باشیم تا رفتار M روزه هر مشتری رو به یه فضای ویژگی جدید ببره که بتونه رفتار اون مشتری رو توصیف کنه و بعد هم چنانچه توی N روز آینده خریدی انجام نداده بود، به اون الگوی رفتاری برچسب ۱ ( به‌معنای ریزش کرده) و در غیر این صورت برچسب ۰ بزنه. این تبدیل رو تابع transform_data انجام می‌ده. شیوه کار به این صورته که رفتار خرید M روزه مشتری شامل یه سری ویژگی‌های تجمیعی از قبیل تعداد دفعات خرید در اون بازه، حجم خرید در اون بازه و یا فاصله آخرین خرید مشتری تا آخرین روز بازه خواهد بود.( تعداد این ویژگی‌های تجمیعی ۱۲ تاست ). همچنین به ازای هر روز در این بازه، چنانچه مشتری در اون روز خریدی انجام داده باشه حجم خرید در اون روز و تعداد انواع کالا و تعداد کالایی که خریده رو در ۳ بعد اضافه می‌کنه و در غیر این صورت مقدار هر یک از این سه بعد رو برابر با صفر میذاره. با توجه به این توضیحات رفتار M روزه مشتری با یه بردار 12+3*M بعدی توصیف میشه و اگر هم در بازه N روزه آتی خریدی نداشت مقدار label برای اون الگوی رفتاری مشتری برابر ۱ و در غیر این صورت برابر صفر خواهد بود.مقدار N با توجه به تعاریف بالا برابر با حدود دو برابر شاخص D/F ینی ۲۰ روز خواهد بود و مقدار M هم باید با Hyper-Parameter-Setting به دست بیاد که با آزمایشاتی که ما انجام دادیم این مقدار برابر با ۴۰ روز هست. همچنین پارامتر S هم با توجه به نرخ انجام تراکنش توی اون کسب‌و‌کار انجام میشه. در این دادگان هر ۱.۱ روز یه تراکنش انجام شده به همین دلیل مقدار S رو برابر با ۲ روز گذاشتیم. با استفاده از تحلیل PCA می‌تونیم این فضای ۱۳۲ بعدی را در سه بعد ببینیم.نمودار scatter فضای ۱۳۲ بعدی رفتار مشتریان. نقاط قرمز، مشتریان ریزش کرده هستند. نسبت دیتای ریزش کرده به ریزش نکرده حدود ۱ به ۶ است. با توجه به اطلاعات دامنه اگه کسب‌و‌کاری سالم و سرپا باشه باید نسبت مشتریان ریزش کرده به نکرده در اون کمتر از ۱ به ۵ باشه. این نشون میده تعریف ما از ریزش با واقعیت‌های میدانی هم سازگاره.با توجه به توضیحات بالا مساله ریزش برای این دادگان به این صورت تعریف میشه که رفتار ۴۰ روزه هر مشتری رو به عنوان ورودی می‌گیریم و پیش‌بینی می‌کنیم که آیا در ۲۰ روز آینده خریدی انجام خواهد داد یا خیر. قبل از هر چیز باید دیتای آموزش رو از دیتای تست جدا کنیم. برای اینکه مدل ما تعمیم‌پذیری بیشتری داشته باشه باید این دیتاها رو با توجه به فاز زمانی از هم جدا کنیم. مثلا دیتای تراکنش a روز اول رو برای آموزش و b  روز بعدی رو برای تست در نظر بگیریم. به دلیل اینکه پارامتر های مساله رو تعیین کردیم پس دیتای ۶۰ روز آخر رو برای تست و مابقی دیتا رو برای آموزش درنظر می‌گیریم.دیتای تستدیتای آموزشمدل سازیبا توجه به اینکه نسبت داده‌های ریزش کرده به ریزش نکرده حدود ۱ به ۶ هست، داده موجود از نوع imbalanced هست. فرآیند یادگیری در این مدل‌ها می‌تونه تا حد زیادی سخت و دشوار باشه. این هم به این دلیله که شبکه عصبی ممکنه به سمت کلاسی که داده بیشتری ازش موجود هست غش کنه!! و همزمان اگه از کلاس کمیاب‌تر دیتای کافی وجود نداشته باشه حتی توزیع داده کمیاب‌تر رو هم نمی‌تونه یاد بگیره. متدهای زیادی وجود داره که توی مساله دسته‌بندی با داده های imbalanced بتونیم ازشون استفاده کنیم و مدل رو بهتر آموزش بدیم. با توجه به اینکه از کلاس کمیاب، ینی الگوهای رفتاری ریزش کرده، نسبتا تعداد داده‌های مناسبی وجود داره ( حدود ۱۰۰ هزار الگوی ریزش داریم) می‌تونیم از تکنیک under-sampling استفاده کنیم به این صورت که از دسته‌ای که دیتای بیشتری از اون موجوده به صورت تصادفی حدود ۱۰۰ هزار دیتا برمیداریم تا تعداد دو کلاس با هم بالانس بشه. اما چون دوست داریم از دیتاهای خوبی که از کلاس الگوی‌های ریزش نکرده داریم هم به خوبی استفاده کنیم ابتدا مدل رو روی کل داده‌ها آموزش می‌دیم و بعد با Fine-Tuning به صورت بالانس شده شبکه رو آموزش می‌دیم. مد fine-tuning ای که استفاده می‌کنیم هم به صورت ساده و INIT هست ینی با همان وزن‌هایی که شبکه در مد اول آموزش دیده، آموزش رو ادامه می‌دیم. معماری شبکه و تعداد پارامترهای آن در زیر اومده.معماری شبکه برای آموزش مساله ریزش مشتریان. طبق یه قانون سرانگشتی تعداد داده‌های لازم برای جلوگیری از آورفیت شدن شبکه حدود ۱۰ برابر  تعداد پارامتر هاست.در این شبکه از لایه‌های batch_normalization استفاده شده تا استانداردسازی داده‌ها در سطح معماری شبکه انجام بشه. همچنین برای جلوگیری از آورفیت شدن شبکه از dropout با نرخ ۰.۵ استفاده کردیم. از طرفی از تکنیک early_stopping نیز استفاده کردیم تا هر چه بیشتر از داده‌های آموزشی استفاده کنیم و از آورفیتینگ دورتر بشیم. این شبکه را یکبار با کل داده‌ها و بعد هم با داده‌های بالانس شده آموزش دادیم. نمودار داده‌های بالانس شده به صورت زیر هست.نمودار scatter داده‌های بالانس شده. نقاط قرمز مربوط به دیتای ریزش می‌باشد.آموزش شبکه و ایجاد شبکه عصبی توسط ابزار Keras انجام شده که API بسیار ساده‌ای برای طراحی و آموزش شبکه‌های عصبی عمیق داره. همچنین معیار ارزیابی رو معیار AUC یا Area Under Curve انتخاب کردیم. علت هم اینه که هم مساله با دیتای Imbalanced رو به رو هست و هم اینکه لایه آخری که برای تصمیم‌گیری کلاس داده استفاده شده تابع Sigmoid هست که یه عدد احتمالاتی بین ۰ تا ۱ برمیگردونه و خیلی مهمه که حد آستانه رو برای این تابع چه عددی در نظر بگیریم تا مشخص بشه از چه احتمالی بیشتر رو باید به عنوان یک الگوی ریزش در نظر گرفت. با نمودار ROC میتونیم این مقدار رو به راحتی تنظیم کنیم البته باید توجه کنیم که در این حالت باید حتما دیتای validation جداگانه ای هم داشته باشیم تا ازش برای تنظیم این پارامتر استفاده بشه. تابع loss هم با توجه به ذات مساله تابع BinaryCrossEntropy انتخاب شده. در ادامه نحوه تغییر معیار ارزیابی و تابع loss در طول فرآیند آموزش قابل مشاهده ست.تابع loss برای آموزش شبکه. علت کمتر بودن loss شبکه در حالت validation این هست که لایه dropout در این فاز غیر فعال هست.نمودار تغییر معیار AUC در طول فرآیند آموزش. علت اینکه معیار ارزیابی در حالت validation بهتره به خاطر غیر فعال بودن لایه Dropout در حالت validation  هست.تحلیل خطابا اقدامات انجام شده نتایج به دست اومده رو می‌تونیم روی ماتریس زیر ببینیم:ماتریس درهم‌ریختگیبا توجه به ماتریس بالا میزان recall حدود ۷۰ درصده. ینی از بین تمام الگو‌های ریزش تونستیم ۷۰ درصدشون رو تشخیص بدیم. از طرفی مقدار precision نیز ۴۰ درصد هست. ینی از بین الگو‌هایی که به‌عنوان ریزش پیش‌بینی کردیم حدود ۴۰ درصدشون واقعا ریزش کرده بودن. اما علت اینکه مقدار precision پایین هست چیه و آیا بهتر می‌تونه بشه یا نه؟ این سوال مهمی هست که با تحلیل خطاهای موجود می‌تونیم بفهمیم وضعیت چه طوره!نمودار ROC برای پیش‌بینی ریزش. با تنطیم مقدار حد آستانه تشخیص به اندازه 0.5481 می‌تونیم به recall حدود ۷۰ درصد و false positive rate حدود ۲۲ درصد رسید.با بررسی خطاهای false positive ینی مشتریانی که ریزشی نبودن ولی ما اونا رو ریزشی پیش‌بینی کردیم متوجه می‌شیم که اغلب اونا ( ینی حدود ۷۰ درصد) کسانی هستن که فقط ۱ خرید داشتن. پس ینی خیلی به ریزش نزدیک بودن در حالی که مشتریانی که ریزشی نبودن و ما هم اونا رو درست تشخیص دادیم عموما ۲ یا ۳ یا ۴ خرید داشتن. همچنین میتونیم ۴ دسته ماتریس درهم‌ریختگی رو از منظر آماره‌های D/F و یا recency بررسی کنیم که ببینیم ایا بر روی این ویژگی‌ها هم می‌تونیم جداسازی داشته باشیم یا نه. نمودار joint توزیع D/F و recency برای داده‌هایی که به عنوان ریزش پیش‌بینی شده اندنمودار joint برای D/F و recency برای داده‌هایی که به عنوان عدم ریزش پیش‌بینی شده‌انداز روی نمودار های بالا می‌تونیم نتیجه بگیریم که با گذاشتن یه دسته‌بند خطی بر روی خروجی شبکه عصبی می‌شه نتایج پیش‌بینی رو بهتر کرد. کاری که در آینده به عنوان بهبود میشه روی مدل فعلی پیاده کرد. البته همین دو ویژگی رو به عنوان ورودی در شبکه عصبی داشتیم ولی احتمالا به خاطر کمبود داده، مدل نتونسته اهمیت بیشتری رو به این دو ویژگی بده. این شهود میتونه ما رو به معماری‌های بهتری هم رهنمون کنه! مثلا ممکنه یه شبکه CNN بتونه اهمیت این ویژگی‌ها رو استخراج کنه.اما سوال اصلی اینه که مقدار precision تا کجا می‌تونه بهتر بشه؟ برای جواب دادن به این سوال باید بدونیم از منظر مصالحه bias-variance میزان unavoidable-bias چقدر هست. این میزان خطا در واقع مشخص می‌کنه که حتی یه دسته‌بند بهینه تا چه حد میتونه به دقت خوبی برسه. مثلا تصور کنین که دو تا دیتا در یک فضا کاملا روی هم افتاده باشن و یکی‌شون مربوط به دسته اول و دیگری مربوط به دسته دوم باشن. در این حالت هیچ مدلی نمیتونه تفاوت این دو دیتا رو بفهمه. حالا اگه این دو دیتا خیلی به هم نزدیک باشن شانس پیدا شدن کرنلی که بتونه این دیتا ها رو توی فضای دیگه ببره و این دیتاها از هم کامل دور باشن باز هم پایین میاد. به عبارت دیگه شبکه عصبی ( که لایه‌های خودش می‌تونه به عنوان کرنل فانکشن در نظر گرفته بشه ) با داده‌های ناکافی، به احتمال بسیار بالا نمیتونه اون کرنل رو پیدا کنه. حالا ما می‌خوایم یه تحلیل احتمالا تقریبا درست ارایه بدیم که میزان خطا در precision از چه حدی نمیتونه پایین‌تر باشه. برای این کار ابتدا از هر دو دسته ریزش کرده و ریزش نکرده ۲۵۰۰۰ داده رو به صورت تصادفی بر میداریم. بعد فاصله دو به دوی هر یک از دیتاهای دسته اول رو با دسته دوم محاسبه می‌کنیم. حالا باید ببینیم چند تا داده ریزش نکرده وجود داره که در همسایگی اپسیلون اون حداقل یه داده ریزش کرده هست. در همسایگی کمتر از فاصله ۰.۰۷ حدود ۳۰ درصد از داده‌های ریزش کرده حداقل یک داده ریزش نکرده وجود داره و در همسایگی حدود ۶ درصد از داده‌های ریزش نکرده حداقل یه داده ریزش کرده وجود دارهبا توجه به تصویر بالا و اینکه مدل ما به recall حدود ۷۰ درصد رسیده پس می‌تونیم فرض کنیم که فاصله‌های بیشتر از ۰.۰۷ در مدل ما تشخیص داده شده اما در این حالت حدود ۶ درصد داده‌های ریزش نکرده در همسایگیشون به فاصله کمتر از ۰.۰۷ یه داده ریزش کرده هست. پس در حالت اپتیمال مقدار FPR یا false positive rate میتونه حدود ۶ درصد باشه. با توجه به نسبت داده‌های ریزش کرده و ریزش نکرده ( که حدود یک به شش هست) مقدار precision در حالت اپتیمال حدود ۶۵ درصد خواهد بود. پس دسته‌بند بهینه در بهترین حالت می‌تونه به precision حدود ۶۵ درصد برسه. این به خاطر درهمرفتگی دیتاهای موجود با توجه به فضای ویژگی هست که تشکیل دادیم.جمع‌بندیدر تحلیل بالا ابتدا دادگان رو بررسی کردیم و بعد یه تعریف از ریزش ارایه دادیم. بعدش هم سعی کردیم از روی دیتای تراکنش‌ها الگوهای رفتاری خرید مشتریان رو در بیاریم. کیفیت مدل ارایه شده عالی نبود اما با توجه به تحلیل خطا قابل قبول بود. برای ارزیابی مدل معیار AUC رو معرفی کردیم که باعث میشه با تغییر حدآستانه تابع خروجی sigmoid بتونیم یه مصالحه‌ای بین مقدار recall و false positive rate به‌دست بیاریم. نشون دادیم که توی فضای ویژگی که ترسیم کردیم درهمرفتگی زیادی وجود داره که مقدار unavoidable bias رو بررسی کردیم. یه نکته‌ای که لازمه بهش اشاره بشه اینه که ما از روی داده تراکنش‌ها به فضای ویژگی جدید رسیدیم و این به خاطر محدودیت مدل بود که نمی‌تونه وابستگی‌های زمانی رو به خاطر بسپره. به همین دلیل ما مجبور بودیم فاز مهندسی ویژگی داشته باشیم و ویژگی‌هایی که در بالا توضیح دادیم رو از روی داده به دست بیاریم. همون‌طور که دیدیم فضای ویژگی‌ای که ترسیم کردیم درهمرفتگی زیادی داشت که موجب می‌شد unavoidable bias افزایش پیدا کنه. یه فاز بهبود می‌تونه این باشه ، به جای استفاده از شبکه عصبی feed forward از شبکه LSTM استفاده کنیم و داده‌های تراکنش رو به صورت مستقیم به شبکه بدیم و خود شبکه بهترین فضای ویژگی رو پیدا می‌کرد. البته این روش نیاز به داده‌های بیشتری نسبت به روش فعلی داره ولی می‌تونه تست بشه. مورد دیگه‌ای که باز به عنوان بهبود می‌تونستیم استفاده کنیم این بود که داده‌های مشتریان رو قبل از انجام تحلیل خوشه‌بندی می‌کردیم و برای هر خوشه یه مدل جداگونه ترین می‌کردیم چرا که نحوه ریزش توی خوشه‌های متفاوت مشتریان می‌تونه متفاوت باشه و در تحلیل بالا یه فرض ساده‌سازی ضمنی گرفته شده که مشتریان خوشه‌های مختلف با توزیع یکسان دچار ریزش می‌شن. انشاالله در آینده‌ای نه چندان دور به سراغ این ایده‌ها خواهیم رفت....منابعHands-On Machine Learning with Scikit-Learn, Keras, and TensorFlowPrinciple Component AnalysisDropout: A Simple Way to Prevent Neural Networks from OverfittingBatch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate ShiftReceiver operating characteristic (ROC)Understanding the Bias-Variance Tradeoff</description>
                <category>محمدمهدی آقاجانی</category>
                <author>محمدمهدی آقاجانی</author>
                <pubDate>Wed, 23 Dec 2020 16:30:17 +0330</pubDate>
            </item>
            </channel>
</rss>