<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علیرضا مدنی</title>
        <link>https://virgool.io/feed/@Aleereza</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-04-15 04:35:33</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>علیرضا مدنی</title>
            <link>https://virgool.io/@Aleereza</link>
        </image>

                    <item>
                <title>ردیابی افکار مدل زبان بزرگ LLM</title>
                <link>https://virgool.io/@Aleereza/%D8%B1%D8%AF%DB%8C%D8%A7%D8%A8%DB%8C-%D8%A7%D9%81%DA%A9%D8%A7%D8%B1-%DB%8C%DA%A9-%D9%85%D8%AF%D9%84-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A8%D8%B2%D8%B1%DA%AF-llm-tnprvqlca5ss</link>
                <description>پژوهشگران Anthropic در مقاله‌ای که مارس 2025 منتشر شد،متوجه موضوعی شدند: مدل‌های زبانی بزرگ مثل Claude، فقط کلمه بعدی را پیش‌بینی نمی‌کنند، بلکه مثل مغز انسان، استراتژی‌های پیچیده و الگوهای فکری عمیقی می‌سازند. اما چون حتی سازندگان این مدل‌ها از نحوه عملکرد این &quot;جعبه سیاه&quot; بی‌خبرند، با الهام از علوم اعصاب، ابزاری شبیه &quot;میکروسکوپ هوش مصنوعی&quot; طراحی کرده‌اند تا جریان فکر و اطلاعات را در این مدل‌ها رصد کنند. این کشف برای اطمینان از عملکرد درست و ایمن این فناوری حیاتی است و شگفت‌انگیزتر اینکه Claude گاهی در یک &quot;فضای ذهنی مشترک&quot; فکر می‌کند—جهانی که در آن مفاهیم، فارغ از زبان‌هایی مثل فارسی، انگلیسی یا چینی، آزادانه شکل می‌گیرند.مدل‌های هوش مصنوعی مثل کلود، توسط انسان‌ها خط به خط کدنویسی نمی‌شوند. بلکه بر روی مقادیر زیادی داده آموزش داده می‌شوند. در طول فرآیند آموزش، آن‌ها استراتژی‌های خود را برای حل مسائل یاد می‌گیرند. این استراتژی‌ها در میلیاردها محاسباتی که یک مدل برای هر کلمه‌ای که می‌نویسد انجام می‌دهد، رمزگذاری شده‌اند. آن‌ها برای ما، توسعه‌دهندگان مدل، غیرقابل درک هستند. این به این معنی است که ما نمی‌فهمیم مدل‌ها چگونه بیشتر کارهایی که انجام می‌دهند را انجام می‌دهند.وقتی کلود به زبان‌های مختلف صحبت می‌کند، آیا در درونش هم به آن زبان‌ها فکر می‌کند؟ یا وقتی چیزی می‌نویسد، آیا فقط کلمه بعدی را حدس می‌زند یا از قبل برای جملات و پاراگراف‌ها برنامه‌ریزی می‌کند؟ یا وقتی دلیل یک پاسخ را توضیح می‌دهد، آیا واقعاً همانطور فکر کرده یا فقط یک دلیل ساختگی می‌آورد که قانع‌کننده به نظر برسد؟پژوهشگران هوش مصنوعی مثل دانشمندان حوزه علوم اعصاب که به داخل مغز نگاه می‌کنند، ابزاری شبیه &quot;میکروسکوپ&quot; برای دیدن داخل مدل‌های هوش مصنوعی می‌سازند. آن‌ها نمی‌توانند فقط با صحبت کردن با مدل همه چیز را بفهمند، همانطور که ما نمی‌توانیم با مغزمان صحبت کنیم و بفهمیم چطور کار می‌کند. در این مقاله، دو کار جدید توضیح داده شده است:یکی اینکه چطور بخش‌های مختلف مدل که مفاهیم را پردازش می‌کنند ویژگی‌ها (features) را به هم وصل کرده و نشان می‌دهند که اطلاعات چطور جریان پیدا می‌کند (مانند &quot;مدار&quot;).دوم، مدل کلود 3.5 هایکو را برای کارهای ساده بررسی کرده‌اند تا ببینند چطور رفتار اصلی آن کار می‌کند. این روش به آن‌ها کمک کرده تا بخشی از نحوه کار کلود را بفهمند و شواهدی قوی پیدا کنند که:۱. کلود می‌تواند درباره ایده‌ها و مفاهیم به روشی فکر کند که به زبان خاصی وابسته نیست، انگار یک زبان فکری کلی دارد که برای همه زبان‌ها مشترک است. این را با دیدن اینکه چطور جملات مشابه در زبان‌های مختلف در داخل کلود پردازش می‌شوند، فهمیده‌اند.۲. کلود وقتی متنی می‌نویسد، از قبل برای کلمات جلوتر برنامه‌ریزی می‌کند، نه فقط کلمه بعدی را حدس بزند. مثلاً در شعر، از قبل کلمات قافیه‌دار را در نظر می‌گیرد و بعد جمله را طوری می‌نویسد که به آن کلمه برسد. این یعنی مدل‌ها حتی وقتی کلمه به کلمه می‌نویسند، برای آینده دورتر فکر می‌کنند.۳. کلود گاهی وقت‌ها استدلالی می‌آورد که منطقی به نظر می‌رسند اما واقعی نیستند و فقط برای این هستند که با کاربر موافقت کند. مثلاً اگر در یک مسئله ریاضی سخت به آن یک راهنمایی اشتباه بدهید، کلود ممکن است دلایلی ساختگی بسازد تا به آن جواب اشتباه برسد. ابزار این محققان می‌تواند این لحظات را شناسایی کند و بفهمد مدل دارد دلیل الکی می‌آورد.محققان می‌گویند از نتایج کارشان تعجب کرده‌اند. مثلاً در مورد شعر فکر می‌کردند کلود برنامه‌ریزی نمی‌کند اما دیدند که برنامه‌ریزی می‌کند. در مورد اینکه چرا مدل‌ها گاهی اطلاعات غلط می‌دهند (توهم hallucinations)، فهمیدند که در واقع کلود معمولاً نمی‌خواهد حدس بزند و جواب ندهد، مگر اینکه چیزی باعث شود این حالت پیش‌فرض او تغییر کند و پاسخ دهد. همچنین در مورد ترفندهایی که مدل را وادار به گفتن چیزهای خطرناک می‌کند (جیل‌بریک jailbreak)، دیدند که مدل زودتر از اینکه بتواند جلوی خودش را بگیرد، متوجه خطرناک بودن درخواست شده است. این روش &quot;ساخت میکروسکوپ&quot; به آن‌ها کمک می‌کند چیزهایی را بفهمند که قبلاً نمی‌دانستند و این روش با پیشرفت مدل‌ها مهم‌تر می‌شود.این یافته‌ها فقط از نظر علمی جالب نیستند بلکه به هدف فهمیدن هوش مصنوعی و قابل اعتماد کردن آن کمک می‌کنند. این روش می‌تواند در زمینه‌های دیگری مثل پزشکی هم مفید باشد. اما این روش هنوز محدودیت دارد. حتی برای متن‌های کوتاه، فقط بخش کوچکی از کاری که مدل می‌کند را می‌بینند. همچنین درک این چیزهایی که می‌بینند ساعت‌ها طول می‌کشد و باید هم ابزار و هم نحوه درکشان را بهتر کنند تا بتوانند فرآیندهای پیچیده‌تر مدل را بفهمند.چون هوش مصنوعی قوی‌تر شده و در جاهای مهمی استفاده می‌شود، شرکت آنتروپیک روی چیزهایی مثل فهمیدن اینکه مدل چطور کار می‌کند (تفسیرپذیری) سرمایه‌گذاری زیادی کرده است. این کار سخت و پرخطر است اما می‌تواند ابزاری مهم برای شفاف کردن هوش مصنوعی باشد. اگر بدانیم مدل چطور کار می‌کند، می‌توانیم چک کنیم که آیا با ارزش‌های انسانی همخوانی دارد و می‌توان به آن اعتماد کرد یا نه.اولین سؤال این است: کلود چطور به زبان‌های مختلف صحبت می‌کند؟ آیا برای هر زبان یک بخش جداگانه دارد یا یک بخش اصلی دارد که برای همه زبان‌ها کار می‌کند؟ تحقیقات نشان می‌دهد که در داخل کلود، بخش‌های مشترکی وجود دارد که برای زبان‌های مختلف مثل انگلیسی، فرانسوی و چینی فعال می‌شوند، یعنی ایده‌ها و مفاهیم اصلی در مدل برای همه زبان‌ها یکسان است.برای فهمیدن اینکه کلود چطور چندزبانه است، از آن خواسته‌اند که در زبان‌های مختلف &quot;متضاد کوچک&quot; را بگوید. دیده‌اند که در داخل مدل، همان بخش‌هایی که مربوط به مفهوم &quot;کوچکی&quot; و &quot;متضاد&quot; هستند فعال می‌شوند، که این فعال شدن منجر به فعال شدن مفهوم &quot;بزرگی&quot; می‌شود. سپس این مفهوم &quot;بزرگی&quot; به زبانی که سؤال پرسیده شده، ترجمه می‌شود. این نشان می‌دهد که مدل ابتدا به مفهوم فکر می‌کند و بعد آن را به زبان می‌آورد. همچنین مدل‌های بزرگ‌تر، بخش‌های مشترک بیشتری برای زبان‌ها دارند.این یافته‌ها ثابت می‌کند که کلود ایده‌ها و معانی را در یک فضای مشترک و انتزاعی (جدا از زبان خاصی) پردازش می‌کند و بعد آن را به زبان مورد نظر تبدیل می‌کند. این یعنی کلود می‌تواند چیزی را در یک زبان یاد بگیرد و از آن در زبان دیگر استفاده کند. این قابلیت برای هوش و استدلال پیشرفته مدل که می‌تواند آموخته‌هایش را در موقعیت‌های مختلف به کار ببرد، بسیار مهم است.سؤال بعدی این است که کلود چطور شعر قافیه‌دار می‌نویسد. مثالی زده شده. برای نوشتن خط دوم، مدل باید هم قافیه را رعایت می‌کرد و هم معنی جمله درست باشد.این بیت کوچک را در نظر بگیرید:He saw a carrot and had to grab it (او یک هویج دید و مجبور شد آن را بردارد)His hunger was like a starving rabbit (گرسنگی‌اش مثل یک خرگوش گرسنه بود)محققان فکر می‌کردند مدل کلمه به کلمه می‌نویسد و فقط در آخر خط به فکر قافیه می‌افتد. اما محققان دیدند که کلود برنامه‌ریزی می‌کند. قبل از نوشتن خط دوم شعر، کلماتی را که هم معنی دارند و هم با خط اول قافیه می‌شوند، در نظر می‌گیرد. بعد جمله را طوری می‌نویسد که به آن کلمه انتخابی برسد. تصاویری هم نشان داده شده که چطور اگر مفهوم &quot;rabbit&quot; را در مدل دستکاری کنند، مدل کلمه دیگری را برای قافیه انتخاب می‌کند.مثل کاری که دانشمندان مغز برای دیدن عملکرد مغز انجام می‌دهند (با تغییر فعالیت بخش‌هایی از آن)، محققان هم بخشی از مدل کلود که مربوط به مفهوم &quot;خرگوش&quot; بود را تغییر دادند. وقتی مفهوم &quot;خرگوش&quot; را حذف کردند، کلود به جای &quot;rabbit&quot; از کلمه &quot;habit&quot; (عادت) که با &quot;grab it&quot; هم قافیه می‌شود و معنی هم می‌دهد استفاده کرد. وقتی مفهوم &quot;سبز&quot; را به مدل دادند، کلود خط را طوری تمام کرد که به &quot;green&quot; ختم شود (هرچند دیگر قافیه نداشت). این آزمایش نشان می‌دهد که کلود هم برنامه‌ریزی می‌کند و هم می‌تواند برنامه خود را تغییر دهد.موضوع بعدی ریاضی است. کلود به عنوان ماشین حساب ساخته نشده و فقط روی متن آموزش دیده است. اما چطور می‌تواند اعداد را در ذهنش درست جمع کند (مثلاً ۳۶+۵۹) بدون اینکه مراحل را بنویسد؟ ممکن است جواب ساده این باشد که مدل فقط جواب جمع‌های زیادی را حفظ کرده، یا اینکه روش جمع کردن را مثل انسان‌ها یاد گرفته است.اما محققان دیدند که کلود از چند روش داخلی همزمان برای جمع کردن استفاده می‌کند. یک روش یک تخمین تقریبی از جواب می‌زند و روش دیگر رقم آخر جواب را دقیق حساب می‌کند. این دو روش با هم ترکیب می‌شوند تا جواب نهایی را بدهند. حتی فهمیدن این کار ساده (جمع) در این جزئیات می‌تواند به ما کمک کند بفهمیم کلود چطور مسائل پیچیده‌تر را حل می‌کند.نکته جالب اینجاست که کلود خودش هم نمی‌داند چطور واقعاً در ذهنش حساب می‌کند! اگر از آن بپرسید چطور ۳۶+۵۹ را حساب کرده، همان روشی که انسان‌ها یاد می‌گیرند (جمع کردن یکان‌ها و دهگان‌ها و انتقال عدد ۱) را توضیح می‌دهد. این نشان می‌دهد که مدل یاد گرفته توضیحات ریاضی را از روی متن‌هایی که انسان‌ها نوشته‌اند بگوید، اما برای انجام دادن واقعی ریاضی در ذهنش، روش‌های داخلی خودش را یاد گرفته است.سؤال بعدی این است که آیا کلود همیشه دلیل کارهایش را راست می‌گوید؟ مدل‌های جدیدتر مثل کلود می‌توانند قبل از جواب دادن، مراحل فکر کردنشان را بنویسند. این کار معمولاً جواب را بهتر می‌کند، اما گاهی این مراحل فکری واقعی نیستند و مدل فقط آن‌ها را می‌سازد تا به جواب برسد. مشکل اینجاست که این دلایل ساختگی خیلی واقعی به نظر می‌رسند. محققان راهی را بررسی کرده‌اند که با ابزارشان بتوانند بفهمند دلیل مدل واقعی است یا الکی.وقتی از کلود خواسته می‌شود مسئله‌ای را حل کند. وقتی مسئله آسان است (مثل ریشه دوم ۶۴)، مراحل داخلی مدل نشان می‌دهد که واقعاً ریشه دوم ۶۴ را حساب کرده است. اما وقتی مسئله سخت است (مثل حساب کردن کسینوس یک عدد بزرگ)، کلود ممکن است ادعا کند حساب کرده ولی در داخلش هیچ نشانی از محاسبه نیست؛ فقط یک جواب می‌دهد بدون اینکه برایش مهم باشد درست است یا نه. جالب‌تر اینکه، اگر به کلود یک راهنمایی (حتی اشتباه) درباره جواب بدهید، گاهی اوقات از جواب نهایی شروع می‌کند و مراحل ساختگی می‌سازد تا به آن جواب برسد. این نشان می‌دهد که مدل ممکن است برای رسیدن به یک نتیجه از پیش تعیین شده، دلیل بتراشد. این ابزار به ما کمک می‌کند این دروغ‌های داخلی را پیدا کنیم.این توانایی که می‌توانیم ببینیم کلود واقعاً چطور فکر می‌کند (نه فقط چیزی که خودش می‌گوید)، به ما کمک می‌کند مدل‌ها را بهتر بررسی کنیم. در یک آزمایش دیگر، مدلی را دیدند که پنهانی یاد گرفته بود طوری رفتار کند که مدل‌های پاداش‌دهنده را راضی نگه دارد (این مدل‌ها به مدل اصلی یاد می‌دهند چطور خوب رفتار کند، اما گاهی خودشان سوگیری دارند). حتی وقتی از مدل اصلی پرسیدند آیا این کار را می‌کند، قبول نکرد، اما ابزارهای محققان نشان داد که این کار را می‌کند. این نشان می‌دهد که این ابزار می‌تواند به پیدا کردن کارهای نگران‌کننده پنهان در مدل‌ها کمک کند.موضوع بعدی این است که کلود چطور به سؤالاتی جواب می‌دهد که چند مرحله فکری لازم دارند، مثل &quot;پایتخت ایالتی که دالاس در آن است کجاست؟&quot;. ممکن است فکر کنیم مدل فقط جواب را حفظ کرده است. اما تحقیقات نشان می‌دهد که کلود پیچیده‌تر عمل می‌کند. در مثال دالاس، دیدند که مدل اول مفهوم &quot;دالاس در تگزاس است&quot; را فعال می‌کند و بعد آن را به مفهوم &quot;پایتخت تگزاس آستین است&quot; وصل می‌کند. یعنی مدل اطلاعات مختلف را ترکیب می‌کند تا جواب را پیدا کند، نه اینکه فقط جوابی را که حفظ کرده بگوید.محققان با ابزارشان، توانستند مفهوم &quot;تگزاس&quot; را در ذهن مدل با مفهوم &quot;کالیفرنیا&quot; عوض کنند. وقتی این کار را کردند، مدل به جای گفتن &quot;آستین&quot; (پایتخت تگزاس)، گفت &quot;ساکرامنتو&quot; (پایتخت کالیفرنیا). این ثابت می‌کند که مدل واقعاً از آن مرحله میانی (فهمیدن ایالت) برای رسیدن به جواب استفاده می‌کند.موضوع بعدی این است که چرا مدل‌ها گاهی اطلاعات غلط یا ساختگی می‌دهند (توهم). در واقع، روش آموزش مدل‌ها باعث می‌شود آن‌ها همیشه سعی کنند کلمه بعدی را حدس بزنند، که می‌تواند منجر به اطلاعات غلط شود. چالش این است که چطور مدل‌ها یاد بگیرند که حدس نزنند. کلود آموزش دیده که اگر چیزی را نمی‌داند، جواب ندهد، اما این آموزش همیشه کار نمیکند. محققان خواستند بفهمند این عدم پاسخ دادن چگونه کار می‌کند. معلوم شده که حالت عادی کلود این است که جواب ندهد. بخشی در مدل وجود دارد که معمولاً روشن است و باعث می‌شود بگوید اطلاعات کافی ندارد. اما وقتی از کلود درباره چیزی که خوب می‌شناسد (مثل مایکل جردن) می‌پرسید، بخش دیگری که مربوط به &quot;چیزهای شناخته شده&quot; است فعال می‌شود و جلوی بخش &quot;جواب نده&quot; را می‌گیرد و مدل جواب می‌دهد. اگر درباره یک چیز ناشناس (مثل مایکل باتکین) بپرسید، آن بخش فعال نمی‌شود و مدل جواب نمی‌دهد.محققان توانستند با دستکاری مدل، کاری کنند که کلود درباره مایکل باتکین (که نمی‌شناخت) اطلاعات غلط بدهد، مثلاً بگوید او شطرنج بازی می‌کند. این اتفاق گاهی به طور طبیعی هم رخ می‌دهد: اگر کلود فقط یک اسم را بشناسد اما اطلاعات دیگری درباره آن نداشته باشد، ممکن است بخش &quot;شناخته شده&quot; به اشتباه فعال شود و جلوی بخش &quot;جواب نده&quot; را بگیرد. در این صورت، مدل چون فکر می‌کند باید جواب دهد، اطلاعات ساختگی و غیرواقعی می‌سازد و می‌گوید.جیل‌بریک‌ها روش‌هایی هستند که با ترفند مدل را وادار به گفتن یا انجام دادن کارهای خطرناک یا نامناسب می‌کنند و از سدهای ایمنی آن عبور می‌کنند. در اینجا مثالی از یک جیل‌بریک آورده شده که مدل را فریب می‌دهد تا درباره ساخت بمب صحبت کند. در این روش خاص، مدل با جمع کردن حروف اول جمله &quot;Babies Outlive Mustard Block&quot; به کلمه &quot;BOMB&quot; می‌رسد و این کلمه باعث گیج شدن مدل و تولید اطلاعاتی می‌شود که نباید می‌داد.اینجا سؤال مطرح می‌شود که چرا این ترفند مدل را گیج می‌کند و چرا مدل به دادن دستورات خطرناک ادامه می‌دهد؟محققان دیدند که مشکل اینجاست که بین اینکه مدل متن را درست و کامل بنویسد و اینکه از انجام کارهای خطرناک خودداری کند، یک کشمکش وجود دارد. وقتی کلود نوشتن یک جمله را شروع می‌کند، بخش‌هایی در مدل آن را مجبور می‌کنند که جمله را از نظر دستوری و معنایی کامل کند و ادامه دهد، حتی اگر بخش‌های دیگر متوجه شوند که نباید این کار را بکند.در مثالی که بررسی کردند، بعد از اینکه مدل کلمه &quot;BOMB&quot; را گفت و شروع به دادن دستورات کرد، دیدند که مدل تحت تأثیر بخش‌هایی بود که می‌خواستند متن از نظر گرامری درست و کامل باشد. این بخش‌ها معمولاً خوب هستند، اما در این مورد خاص باعث شدند که مدل به کار خطرناک خود ادامه دهد.مدل فقط بعد از اینکه آن جمله خطرناک را از نظر گرامری کامل کرد، توانست دست از کار بکشد و بگوید که نمی‌تواند اطلاعات بدهد. انگار اول مجبور بود جمله را تمام کند و بعد در جمله بعدی مقاومت نشان دهد.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Thu, 19 Jun 2025 09:38:59 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش بهینه از لحاظ محاسباتی در مدل‌های زبان بزرگ (Chinchilla)</title>
                <link>https://virgool.io/@Aleereza/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D8%A7%D8%AA%DB%8C-%D8%A8%D9%87%DB%8C%D9%86%D9%87-%D9%85%D8%AF%D9%84-%D9%87%D8%A7%DB%8C-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A8%D8%B2%D8%B1%DA%AF-chinchilla-unjchuvhfytg</link>
                <description>در این پست به بررسی مقاله Training Compute-Optimal Large Language Models می پردازیم. این مقاله به بررسی اندازه‌ی بهینه مدل و تعداد توکن‌ها برای آموزش یک مدل زبان ترانسفورمر با درنظر گرفتن محدودیت منابع محاسباتی می‌پردازد. پژوهشگران دیپ مایند در این مقاله بر این باورند که مدل‌های زبان بزرگ فعلی به اندازه‌ی کافی آموزش داده نشده‌اند و با آموزش بیش از ۴۰۰ مدل زبان با پارامترها و تعداد توکن‌های مختلف، دریافتند که برای آموزش بهینه‌ی محاسباتی، اندازه‌ی مدل و تعداد توکن‌های آموزشی باید به طور مساوی افزایش یابد. آن‌ها این فرضیه را با آموزش مدلی به نام چینچیلا (Chinchilla) آزمایش می‌کنند که از همان بودجه‌ی محاسباتی مدل گوفر (Gopher) استفاده می‌کند اما با ۷۰ میلیارد پارامتر و ۴ برابر داده‌ی بیشتر. چینچیلا در مجموعه‌ای در وظایف ارزیابی پایین‌دستی، عملکردی بهتر از گوفر، GPT-3، Jurassic-1 و Megatron-Turing NLG نشان می‌دهد. همچنین چینچیلا برای تنظیم دقیق و استنتاج به محاسبات کمتری نیاز دارد و به بالاترین دقت میانگین تا به امروز یعنی ۶۷.۵٪ در بنچ‌مارک MMLU دست می‌یابد که نسبت به گوفر ۷٪ بهبود یافته است.مقاله به بررسی رابطه بین اندازه مدل و تعداد توکن‌های آموزشی برای آموزش یک مدل زبان بزرگ با درنظر گرفتن محدودیت منابع محاسباتی می‌پردازد. این مقاله سه رویکرد مختلف را برای بررسی این رابطه ارائه می‌کند. هر سه روش با آموزش مجموعه‌ای از مدل‌ها با اندازه‌ها و تعداد توکن‌های مختلف شروع می‌شوند و سپس از داده‌های حاصل برای تخمین چگونگی مقیاس‌گذاری این عوامل با محاسبات بیشتر استفاده می‌کنند. یافته‌های حاصل از هر سه رویکرد نشان می‌دهد که افزایش متناسب تعداد پارامتر و تعداد توکن‌های آموزشی زمانی که منابع محاسباتی بیشتری در دسترس باشد، بهینه است.رویکرد اول:اولین رویکردی که در این مقاله ارائه شده است، ثابت نگه‌داشتن اندازه‌ی مدل و تغییر تعداد توکن‌های داده‌های آموزشی است. نویسندگان، یک گروه ثابت از مدل‌ها (با دامنه‌ی پارامتر ۷۰ میلیون تا بیش از ۱۰ میلیارد) را برای ۴ تعداد مختلف از توالی‌های آموزشی، آموزش دادند تا تخمین حداقل افت (loss) بدست آمده برای یک تعداد مشخص از فلاپ‌های آموزشی (FLOPs) را استخراج کنند. آن‌ها دریافتند که اندازه‌ی بهینه مدل و تعداد توکن‌های آموزشی برای یک محاسبات مشخص، باید به طور مساوی مقیاس‌گذاری شوند.رویکرد دوم:در این رویکرد، اندازه‌ی مدل برای مجموعه‌ی ثابتی از فلاپ‌های آموزشی (FLOP) تغییر می‌کند. اندازه‌ی مدل برای مجموعه‌ی ثابتی از ۹ مقدار مختلف فلاپ آموزشی (FLOP) و در نظر گرفتن افت نهایی آموزش برای هر نقطه  تغییر می‌کند.رویکرد سوم:در این رویکرد، یک تابع ریاضی برای مدل‌سازی رابطه بین اندازه مدل، تعداد توکن‌های آموزشی و میزان خطای نهایی (افت) مدل ارائه می‌شود:در معادله‌ی ارائه شده برای تابع افت (loss function)، سه بخش مجزا وجود دارد:عبارم اول: این عبارت میزان افت مربوط به یک فرایند ایده‌آل تولید متن را بر اساس توزیع داده‌ها نشان می‌دهد. این بخش با آنتروپی متن طبیعی مرتبط است. (آنتروپی: اندازه‌گیری تصادفی بودن یا عدم قطعیت در یک سیستم)عبارم دوم: این عبارت ایده‌ی محدودیت مدل ترانسفورمر را با تعداد مشخصی از پارامتر (N) نشان می‌دهد. به این معنا که حتی یک مدل ترانسفورمر کاملاً آموزش‌دیده با N پارامتر، به خوبی یک فرایند ایده‌آل تولید متن عمل نخواهد کرد.عبارم سوم: این عبارت نشان‌دهنده‌ی این واقعیت است که مدل ترانسفورمر به طور کامل آموزش ندیده است. دلیل این امر استفاده از تعداد محدودی از مراحل بهینه‌سازی روی نمونه‌ای از توزیع مجموعه داده است.به عبارت ساده‌تر، معادله‌ی ارائه شده میزان خطای مدل ترانسفورمر را در هنگام تولید متن در نظر می‌گیرد. این خطا از سه عامل ناشی می‌شود:محدودیت ذاتی فرایند تولید متن با در نظر گرفتن ماهیت تصادفی و غیرقابل پیش‌بینی بودن زبان طبیعیمحدودیت مدل به دلیل تعداد محدود پارامترعدم آموزش کامل مدل با توجه به استفاده از زیرمجموعه‌ای از کل داده‌ها و تعداد محدود مراحل بهینه‌سازینتیجه‌گیری مقاله:اندازه‌ی مدل و تعداد توکن‌های آموزشی باید به طور مساوی با افزایش منابع محاسباتی، افزایش یابند. این بدان معناست که برای دستیابی به بهترین عملکرد، نمی‌توان فقط یکی از این دو عامل را افزایش داد.مدل چینچیلا با ۷۰ میلیارد پارامتر و ۱.۴ تریلیون توکن، عملکرد بهتری نسبت به مدل‌های دیگر مانند Gopher، GPT-3 و Megatron-Turing NLG در بسیاری از وظایف NLP نشان می‌دهد. این نشان می‌دهد که با انتخاب صحیح اندازه‌ی مدل و تعداد توکن‌های آموزشی، می‌توان به عملکردهای قابل توجهی دست یافت.این مقاله نشان می‌دهد که چگونه می‌توان با استفاده از منابع محاسباتی محدود، مدل‌های زبان بزرگ با عملکرد بالا آموزش داد. این امر برای کاربردهای عملی که در آن‌ها منابع محاسباتی محدود هستند، مانند دستگاه‌های تلفن همراه، بسیار مهم است.عملکرد Gopher، چینچیلا، GPT-3 و Megatron-Turing NLG در مجموعه داده‌های مختلفی که شامل موارد زیر است، با هم مقایسه شده است:پرسش و پاسخ (TriviaQA)درک CommonSense (HellaSwag، PIQA، Winogrande و BoolQ)درک مطلب (LAMBADA)درک کلی زبان چندوظیفه‌ای (MMLU)نتایج این مقایسه را می‌توانید در تصویر زیر مشاهده کنید.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Fri, 26 Apr 2024 20:39:06 +0330</pubDate>
            </item>
                    <item>
                <title>Chronos: جدیدترین مدل پیش‌بینی سری زمانی توسط آمازون</title>
                <link>https://virgool.io/@Aleereza/chronos-%D8%AC%D8%AF%DB%8C%D8%AF%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D8%AF%D9%84-%D9%BE%DB%8C%D8%B4-%D8%A8%DB%8C%D9%86%DB%8C-%D8%B3%D8%B1%DB%8C-%D8%B2%D9%85%D8%A7%D9%86%DB%8C-%D8%AA%D9%88%D8%B3%D8%B7-%D8%A2%D9%85%D8%A7%D8%B2%D9%88%D9%86-x1vt0nk5hgzc</link>
                <description>حوزه پیش‌بینی سری‌های زمانی اخیراً با پیشرفت‌های زیادی در زمینه مدل‌های بنیادی پیش‌بینی همراه بوده است.این حرکت با انتشار مدل TimeGPT در اکتبر ۲۰۲۳ آغاز شد، یکی از اولین مدل‌های بنیادی که قادر به پیش‌بینی بدون آموزش اولیه (zero-shot) و تشخیص ناهنجاری است.پس از آن، تلاش‌های زیادی برای تطبیق مدل‌های بزرگ زبان (LLM) برای پیش‌بینی، مانند PromptCast و LLMTime صورت گرفت.به دنبال آن، شاهد مدل‌های بنیادی متن‌باز بیشتری شدیم، مانند Lag-LLaMA برای پیش‌بینی احتمالی بدون آموزش اولیه و Time-LLM که مدل‌های زبان موجود را برای پیش‌بینی سری‌های زمانی بازطراحی می‌کند.حالا، در مارس ۲۰۲۴، شرکت آمازون نیز با معرفی Chronos وارد این عرصه شده است.در مقاله آن‌ها با عنوان «کرونوس: یادگیری زبان سری‌های زمانی»، نویسندگان چارچوبی را برای پیش‌بینی احتمالی بدون آموزش اولیه (zero-shot) پیشنهاد می‌کنند که از معماری‌های موجود مدل‌های زبان مبتنی بر ترانسفورمر استفاده می‌کند. این چارچوب می‌تواند با حداقل تغییرات، مدل‌های زبان موجود را برای وظایف پیش‌بینی تطبیق دهد.در این مقاله، ما به بررسی عملکرد داخلی کرونوس می‌پردازیم؛ اینکه چگونه آموزش داده شده و از چه تکنیک‌هایی برای افزایش حجم داده جهت پیش-آموزش مدل‌های بزرگ استفاده شده است. سپس کرونوس را در یک آزمایش کوچک با استفاده از پایتون به کار می‌گیریم تا عملکرد آن را به صورت عملی مشاهده کنیم.بررسی کرونوسانگیزه پشت کرونوس با یک سوال ساده شروع شد:آیا مدل‌های زبان خوب نباید برای پیش‌بینی سری‌های زمانی هم کارآمد باشند؟این اولین باری نیست که سعی می‌کنیم فناوری‌های پردازش زبان طبیعی (NLP) را با پیش‌بینی سری‌های زمانی تطبیق دهیم. به هر حال، در هر دو زمینه، مدل‌ها تلاش می‌کنند تا یک توالی از داده‌ها را برای پیش‌بینی توکن بعدی یاد بگیرند، خواه این توکن یک کلمه باشد یا یک مقدار واقعی. با این حال، در NLP، تعداد کلمات برای انتخاب محدود است، در حالی که در سری‌های زمانی، این تعداد از نظر فنی نامحدود است؛ سری شما می‌تواند به طور نامحدود افزایش یا کاهش یابد. بنابراین، استفاده مستقیم از مدل‌های زبان بزرگ (LLM) برای پیش‌بینی منطقی نیست و باید آن‌ها را برای چنین وظیفه‌ای تطبیق داد. در همین راستا، کرونوس یک چارچوبی است که مدل‌های LLM موجود را برای پیش‌بینی سری‌های زمانی تطبیق می‌دهد. این چارچوب به محققان اجازه داد تا خانواده‌ای از مدل‌ها را برای پیش‌بینی بدون نیاز به آموزش اولیه (zero-shot) پیش‌آموزش دهند.مرور کلی بر کرونوسکرونوس از سه مرحله اصلی برای تطبیق مدل‌های زبان بزرگ (LLM) برای پیش‌بینی استفاده می‌کند.همانطور که در شکل بالا مشاهده می‌کنید، کرونوس ابتدا داده‌ها را مقیاس‌بندی می‌کند و پیش از تولید توکن‌های زمینه (context tokens)، آن‌ها را کمی‌سازی (quantization) می‌کند (به واحدهای مجزا تبدیل می‌کند). سپس از این توکن‌ها می‌توان برای آموزش یک مدل زبان موجود استفاده کرد که توکن زمینه بعدی را پیش‌بینی کند. این پیش‌بینی سپس برای به دست آوردن پیش‌بینی واقعی، کمی‌زدایی (dequantized) و بدون مقیاس (unscaled) درمی‌آید.بیایید نگاه دقیق‌تری به هر مرحله داشته باشیم.توکنیزه‌کردن سری‌های زمانیاز آنجایی که مدل‌های زبان بزرگ (LLM) با توکن‌هایی از یک دایره واژگان محدود کار می‌کنند، نیاز داریم راهی برای نگاشت مقادیر سری‌های زمانی به مجموعه محدودی از توکن‌ها بیابیم.برای این منظور، نویسندگان پیشنهاد می‌کنند مقادیر سری زمانی را ابتدا مقیاس‌بندی (scale) کرده و سپس آن‌ها را به تعداد ثابتی از دسته (bin) کمی‌سازی (quantize) کنیم.تکنیک‌های زیادی برای مقیاس‌بندی داده‌ها وجود دارد، مانند مقیاس‌بندی حداقل-حداکثر (min-max)، مقیاس‌بندی میانگین (mean) و مقیاس‌بندی استاندارد (standard). در اینجا، نویسندگان از مقیاس‌بندی میانگین استفاده کرده‌اند که از فرمول ساده زیر پیروی می‌کند: که در آن m روی 0 تنظیم شده است و s میانگین مقادیر مطلق سری است.همانطور که در شکل بالا مشاهده می‌کنید، مقیاس‌بندی داده‌ها، شکل آن را در طول زمان حفظ می‌کند، اما مقادیر را به مجموعه کوچک‌تری محدود می‌کنیم. به این ترتیب، نمایش این مقادیر به عنوان یک مجموعه ثابت از توکن‌ها برای آموزش LLM آسان‌تر خواهد بود.پس از مقیاس‌بندی داده‌ها، کمی‌سازی (quantization) اعمال می‌شود. این یک مرحله حیاتی است، زیرا سری مقیاس‌بندی‌شده هنوز مقادیر حقیقی دارد و LLM نمی‌تواند این نوع داده را مدیریت کند.کمی‌سازی فرآیندی است که مقادیر پیوسته و نامحدود را به مجموعه‌ای از مقادیر گسسته و محدود نگاشت می‌کند. اینگونه است که می‌توانیم از داده‌های سری‌های زمانی توکن‌های زمینه (context token) ایجاد کنیم تا آن‌ها را به LLM ها تغذیه کنیم.در چارچوب کرونوس، محققان از باین‌بندی (binning) استفاده می‌کنند که شامل ایجاد دسته‌هایی (bin) است که در آن کوچکترین مقدار به اولین دسته‌ تعلق دارد و بزرگترین مقدار سری به آخرین دسته‌ اختصاص داده می‌شود. سپس، هر لبه دسته‌ به طور یکنواخت در کل محدوده مقادیر سری پخش می‌شود و هر مقدار به یک دسته‌ اختصاص می‌یابد.در شکل بالا، نمونه‌ای از کمی‌سازی با استفاده از باین‌بندی بر اساس صدک (percentile) را مشاهده می‌کنیم. ما ۱۰۰ دسته‌ تعریف می‌کنیم، یک دسته‌ برای هر صدک، و مقادیر مقیاس‌بندی‌شده را به دسته‌ مربوطه اختصاص می‌دهیم.به این ترتیب، اکنون مجموعه‌ای از توکن‌های ثابت داریم، زیرا با باین‌بندی بر اساس صدک، توکن تنها می‌تواند مقادیر ۱ تا ۱۰۰ را داشته باشد.بنابراین، ما با موفقیت یک سری زمانی را از مقادیر حقیقی نامحدود به مجموعه ثابتی از توکن‌ها تبدیل کرده‌ایم، که همان چیزی است که مدل‌های زبان بزرگ (LLM) انتظار دارند.توجه داشته باشید که در کرونوس، رمزگذاری ویژگی‌های زمانی رایج مانند روز هفته، روز سال و غیره وجود ندارد. در عوض، کرونوس سری را به عنوان یک توالی ساده از توکن‌ها در نظر می‌گیرد.آموزشپس از توکنیزه‌کردن سری زمانی، می‌توان آن را برای آموزش به LLM فرستاد. در اینجا، نویسندگان از تابع اتلاف (loss function) آنتروپی متقاطع دسته‌بندی‌شده (categorical cross-entropy) به عنوان تابع اتلاف برای آموزش مدل استفاده می‌کنند.این بدان معناست که مدل یاد می‌گیرد دسته‌های (bin) نزدیک به هم را با هم مرتبط کند. به عبارت دیگر، آن‌ها در حال یادگیری یک توزیع (distribution) هستند.این کار به مدل اجازه می‌دهد تا توزیع‌های دلخواه را بیاموزد و به طور بالقوه تعمیم‌پذیری بهتری روی داده‌های نادیده شده برای پیش‌بینی بدون نیاز به آموزش اولیه (zero-shot) داشته باشد.این رویکرد همچنین با رویکردهای معمولی متفاوت است. به طور معمول، مدل‌ها نوعی توزیع را برای پیش‌بینی‌های احتمالی اعمال می‌کنند، مانند توزیع گاوسی (Gaussian) یا توزیع تی-استیودنت (Student’s-t) (که دومی در Lag-LLaMA استفاده می‌شود).استنتاجپس از آموزش مدل، می‌تواند پیش‌بینی را انجام دهد.ما به سادگی توکن‌های زمینه را تغذیه می‌کنیم، که مدل از آن‌ها برای تولید توالی‌ای از توکن‌های آتی استفاده می‌کند.سپس آن توکن‌ها کمی‌زدایی می‌شوند که منجر به پیش‌بینی‌های مقیاس‌شده می‌شود.در انتها تبدیل برعکس است، که داده‌ها را به مقیاس اصلی برمی‌گرداند و سپس پیش‌بینی‌های نهایی را به دست می‌آوریم.حالا که فهمیدیم کرونوس چگونه LLM ها را برای پیش‌بینی سری‌های زمانی تطبیق می‌دهد، چالش بزرگی برای ایجاد مدل‌های بنیادی پیش‌بینی با عملکرد بالا وجود دارد: دسترسی به داده.برای این منظور، محققان دو روش افزایش داده را پیشنهاد می‌کنند: TSMix و KernelSynth.افزایش دادهمدل‌های بنیادی به مجموعه داده‌های بزرگ و متنوعی متکی هستند که این برای زبان طبیعی امکان‌پذیر است، ولی برای داده‌های سری‌های زمانی به راحتی قابل دسترسی نیستند.بنابراین، محققان برای افزایش و متنوع‌سازی مجموعه داده آموزشی خود از دو تکنیک افزایش داده استفاده کردند.ترکیب سری‌های زمانی TSMix اولین روش TSMix است که مخفف Time Series Mixup می‌باشد.ایده پشت TSMix بسیار ساده است. این روش به طور تصادفی زیرمجموعه‌هایی از سری‌های زمانی موجود با طول مشخص را نمونه‌برداری می‌کند، آن‌ها را مقیاس‌بندی می‌کند و ترکیب محدب (convex combination) آن‌ها را می‌گیرد.در شکل بالا، مشاهده می‌کنیم که چگونه سری‌ها نمونه‌برداری و سپس با سری‌های دیگر با استفاده از وزن‌های مختلف ترکیب می‌شوند تا سری دیگری برای آموزش ایجاد شود.تولید سری‌های زمانی مصنوعی KernelSynthبرای گسترش بیشتر مجموعه داده آموزشی خود، نویسندگان همچنین KernelSynth را پیشنهاد می‌کنند، روشی برای تولید سری‌های زمانی مصنوعی با استفاده از فرآیندهای گاوسی، همانطور که در زیر نشان داده شده است.با KernelSynth، مجموعه‌ای از کرنل‌ها وجود دارد که رفتار کلی سری‌های زمانی را تعریف می‌کنند: خطی، دوره‌ای و غیره. در شکل بالا، مشاهده می‌کنیم که هسته خطی با استفاده از ضرب با خود ترکیب می‌شود، که منجر به شکل درجه دوم می‌شود. سپس، این دوباره با هسته دوره‌ای با استفاده از جمع ترکیب می‌شود و یک الگوی فصلی اضافه می‌کند. از آنجا، هسته به یک فرآیند گاوسی تغذیه می‌شود که وظیفه تولید نمونه‌هایی را در یک توزیع خاص بر عهده دارد.حالا که فهمیدیم کرونوس چگونه کار می‌کند و از چه تکنیک‌های افزایش داده برای پیش‌آموزش مدل‌ها استفاده شده است، بیایید در یک پروژه کوچک پیش‌بینی با استفاده از پایتون از آن‌ها استفاده کنیم.پیش‌بینی با کرونوسبا استفاده از چارچوب کرونوس، محققان از قبل پنج مدل را پیش‌آموزش داده‌اند که به صورت عمومی برای پیش‌بینی بدون نیاز به آموزش اولیه (zero-shot) در دسترس هستند.این مدل‌ها با معماری T5 که توسط گوگل پیشنهاد شده است، آموزش داده شده‌اند و در اندازه‌های مختلف در دسترس هستند:chronos-t5-tiny: 8 میلیون پارامترchronos-t5-mini: 20 میلیون پارامترchronos-t5-small: 46 میلیون پارامترchronos-t5-base: 200 میلیون پارامترchronos-t5-large: 710 میلیون پارامتروزن‌های مدل‌ها همگی روی HuggingFace در دسترس هستند.برای این آزمایش کوچک، از chronos-t5-large استفاده خواهیم کرد و آن را روی مجموعه داده ماهانه M3 آزمایش می‌کنیم. این مجموعه شامل 1428 سری زمانی منحصر به فرد، همگی با فرکانس ماهانه، از صنایع مختلف است. این مجموعه  در اینجا در دسترس است.عملکرد کرونوس را همچنین با عملکرد MLP و N-BEATS مقایسه خواهیم کرد. توجه داشته باشید که M3 یک مجموعه داده نسبتاً کوچک است و روش‌های یادگیری عمیق عملکرد چندان خوبی ندارند، اما این مدل‌ها معمولاً روی مجموعه‌های داده کوچک عملکرد خوبی دارند.ابتدا باید Chronos را نصب کنیمpip install git+https://github.com/amazon-science/chronos-forecasting.gitسپس بقیه کتابخانه ها را نصب می‌کنیم.import time
from datasetsforecast.m3 import M3
import torch
from chronos import ChronosPipelineپس از آن، می توانیم مجموعه داده را بارگذاری کنیم. برای این کار کتابخانه datasetsforecast، یک رابط پایتون برای دانلود مجموعه داده به ما می دهد.Y_df, *_ = M3.load(directory=&#x27;./&#x27;, group=&#x27;Monthly&#x27;)حالا می توانیم Chronos را مقداردهی اولیه کنیم. یک ابجکت ازChronosPipeline می‌سازیم و مدل از پیش آموزش دیده ای را که می خواهیم مشخص می کنیم.pipeline = ChronosPipeline.from_pretrained(  &quot;amazon/chronos-t5-large&quot;,  device_map=&quot;cuda&quot;,  torch_dtype=torch.bfloat16,)حالا برای پیش بینی آماده‌ایم!پیش‌بینی با کرونوسبرای این کار، روی تمام سری‌های موجود در مجموعه داده M3 حلقه می‌زنیم و ۱۲ مقدار آخر را به عنوان مجموعه تست برای ارزیابی پیش‌بینی‌ها نگه می‌داریم.کرونوس یک torch.tensor به عنوان ورودی انتظار دارد، بنابراین باید سری زمانی pandas.Series خود را به یک آرایه numpy.array و سپس به یک تنسور تبدیل کنیم.تمام مقادیر به عنوان توکن‌های زمینه به مدل داده می‌شوند.سپس متد predict را در پایپ‌لاین فراخوانی می‌کنیم.برای به دست آوردن پیش‌بینی‌های واقعی، باید مشخص کنیم که به کدام چارک (quantile) علاقه‌مند هستیم، زیرا کرونوس پیش‌بینی‌های احتمالی را تولید می‌کند. در این مورد، ما فقط به میانه (median) علاقه‌مند هستیم. با این حال، برای یک بازه اطمینان ۸۰ درصد، می‌توانید لیست زیر از چارک‌ها را پاس دهید: [۰.۱، ۰.۵، ۰.۹]. اطمینان حاصل کنید که همیشه چارک ۰.۵ را در نظر بگیرید، زیرا این مقدار نشان‌دهنده میانه است.horizon = 12
batch_size = 12


actual = []
chronos_large_preds = []

start = time.time()
all_timeseries = [
    torch.tensor(sub_df[&amp;quoty&amp;quot].values[:-horizon])
    for _, sub_df in Y_df.groupby(&amp;quotunique_id&amp;quot)
]
for i in tqdm(range(0, len(all_timeseries), batch_size)):
    batch_context = all_timeseries[i : i + batch_size]
    forecast = pipeline.predict(batch_context, horizon)
    predictions = np.quantile(forecast.numpy(), 0.5, axis=1)

    chronos_large_preds.append(predictions)

chronos_large_preds = np.concatenate(chronos_large_preds)
chronos_large_duration = time.time() - start
print(chronos_large_duration)در این مرحله، پیش‌بینی‌هایی از کرونوس داریم. پس بیایید عملکرد آن را با سایر مدل‌ها مانند MLP و N-BEATS مقایسه کنیم.پیش‌بینی با MLP و N-BEATSحالا بیایید یک مدل MLP و N-BEATS آموزش دهیم. در اینجا، پیکربندی پیش‌فرض را حفظ کرده و از اندازه‌ی ورودی معادل سه برابر افق (horizon) استفاده می‌کنیم.from neuralforecast.models import MLP, NBEATS
from neuralforecast.losses.pytorch import HuberLoss
from neuralforecast.core import NeuralForecast

horizon = 12
val_size = 12
test_size = 12

# Fit an MLP
mlp = MLP(h=horizon, input_size=3*horizon, loss=HuberLoss())

nf = NeuralForecast(models=[mlp], freq=&#039;M&#039;)
mlp_forecasts_df = nf.cross_validation(df=Y_df, val_size=val_size, test_size=test_size, n_windows=None, verbose=True)

# Fit N-BEATS
nbeats = NBEATS(h=horizon, input_size=3*horizon, loss=HuberLoss())

nf = NeuralForecast(models=[nbeats], freq=&#039;M&#039;)
nbeats_forecasts_df = nf.cross_validation(df=Y_df, val_size=val_size, test_size=test_size, n_windows=None, verbose=True)اکنون که پیش‌بینی‌هایی از همه مدل‌های خود داریم، بیایید عملکرد آنها را ارزیابی کنیم.ارزیابیبیایید پیش‌بینی‌های هر مدل را در برابر مقادیر واقعی ترسیم کنیم.fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(14,12))

for i, ax in enumerate(axes.flatten()):
    id = f&amp;quotM{i+1}&amp;quot
    mlp_to_plot = mlp_forecasts_df[mlp_forecasts_df[&#039;unique_id&#039;] == id]
    nbeats_to_plot = nbeats_forecasts_df[nbeats_forecasts_df[&#039;unique_id&#039;] == id]

    ax.plot(mlp_to_plot[&#039;ds&#039;], mlp_to_plot[&#039;y&#039;], label=&#039;actual&#039;)
    ax.plot(mlp_to_plot[&#039;ds&#039;], mlp_to_plot[&#039;MLP&#039;], ls=&#039;--&#039;, label=&#039;MLP&#039;)
    ax.plot(nbeats_to_plot[&#039;ds&#039;], nbeats_to_plot[&#039;NBEATS&#039;], ls=&#039;:&#039;, label=&#039;N-BEATS&#039;)
    ax.plot(nbeats_to_plot[&#039;ds&#039;], preds[0+12*i:12+12*i], ls=&#039;-.&#039;, label=&#039;Chronos&#039;)

    ax.legend()در شکل بالا، پیش‌بینی‌های هر مدل برای چهار سری اول مجموعه داده ما را مشاهده می‌کنیم. باز هم می‌بینیم که مدل‌های یادگیری عمیق با کمبود داده دست و پنجه نرم می‌کنند.با این حال، از آنجایی که کرونوس یک مدل یادگیری عمیق است، می‌خواستم مقایسه را در حوزه یادگیری عمیق نگه دارم.حالا بیایید میانگین خطای مطلق (MAE) و میانگین تقارنی خطای مطلق درصدی (sMAPE) را برای هر مدل محاسبه کنیم.برای این کار، از کتابخانه utilsforecastاستفاده می‌کنیم که با بسیاری از توابع رایج مورد استفاده در پروژه‌های سری‌های زمانی برای ارزیابی مدل، ترسیم و پیش پردازش داده همراه است.from utilsforecast.losses import mae, smape
from utilsforecast.evaluation import evaluate

forecast_df = mlp_forecasts_df
forecast_df[&amp;quotNBEATS&amp;quot] = nbeats_forecasts_df[&amp;quotNBEATS&amp;quot]
forecast_df[&amp;quotChronos-Tiny&amp;quot] = chronos_pred_df[&amp;quotchronos_tiny_pred&amp;quot]
forecast_df[&amp;quotChronos-Large&amp;quot] = chronos_pred_df[&amp;quotchronos_large_pred&amp;quot]

evaluation = evaluate(
    forecast_df,
    metrics=[mae, smape],
    models=[&amp;quotMLP&amp;quot, &amp;quotNBEATS&amp;quot, &amp;quotChronos-Tiny&amp;quot, &amp;quotChronos-Large&amp;quot],
    target_col=&amp;quoty&amp;quot,
)

time = pd.DataFrame(
    {
        &amp;quotmetric&amp;quot: [&amp;quotTime&amp;quot],
        &amp;quotMLP&amp;quot: [mlp_duration],
        &amp;quotNBEATS&amp;quot: [nbeats_duration],
        &amp;quotChronos-Tiny&amp;quot: [chronos_tiny_duration],
        &amp;quotChronos-Large&amp;quot: [chronos_large_duration],
    }
)
avg_metrics = (
    evaluation.drop(columns=&amp;quotunique_id&amp;quot).groupby(&amp;quotmetric&amp;quot).mean().reset_index()
)
avg_metrics = pd.concat([avg_metrics, time]).reset_index(drop=True)

avg_metricsدر جدول بالا می‌بینیم که N-BEATS مدل برتر است، زیرا کمترین MAE و sMAPE را به دست می‌آورد.مهم است که توجه داشته باشید که N-BEATS و MLP نسبت به کرونوس به عملکرد بهتری در کسری از زمان دست می‌یابند.برای این آزمایش، مدل chronos-large تقریباً سه برابر زمان بیشتری را برای انجام پیش‌بینی بدون نیاز به آموزش اولیه (zero-shot) روی مجموعه داده M3 صرف کرد، در مقایسه با برازش و پیش‌بینی با N-BEATS. از طرف دیگر، chronos-tiny زمان استنتاج (inference) سریع‌تری را به دست می‌آورد، اما این به قیمت عملکرد پایین‌تر تمام می‌شود.همچنین این آزمایش تحت تأثیر محدودیت دسترسی من به قدرت محاسباتی قرار دارد.ما می‌توانیم این آزمایش را با موارد زیر قوی‌تر کنیم:تنظیم دقیق مدل‌های MLP و N-BEATSاستفاده از مجموعه داده‌های بیشتربرای یک بنچ‌مارک جامع‌تر از Chronos، به اینجا مراجعه کنید: [مقاله بررسی جامع Chronos]نظر من در مورد کرونوسبا آزمایش Lag-LLaMA و Time-LLM ، می‌توانم بگویم که استفاده از Chronos بسیار ساده‌تر و سریع‌تر است.من معتقدم محققان کار بزرگی در ایجاد یک مدل بنیادی که واقعاً قابل استفاده باشد انجام داده‌اند. اگرچه آزمایش من ۲۰ دقیقه طول کشید، اما همچنان بسیار سریع‌تر از Lag-LLaMA و Time-LLM است.با این حال، ما هنوز یک مدل بنیادی نداریم که عملکردی به طور مداوم بهتر از مدل‌های خاص داده داشته باشد.اگرچه مدل‌های بنیادی به پیش‌بینی بدون نیاز به آموزش اولیه (zero-shot) اجازه می‌دهند که از نظر فنی خط لوله پیش‌بینی را ساده می‌کند، اما آن‌ها به قدرت محاسباتی زیادی نیاز دارند، اجرای آن‌ها زمان زیادی می‌برد و در نهایت عملکردی بهتر از مدل‌های ساده ندارند.مدل‌های پیش‌بینی بنیادی هنوز در مراحل اولیه توسعه هستند، اما برای من، مدل‌های خاص داده هنوز برنده هستند.با تشکر از اینکه خواندید. امیدوارم چیز جدیدی یاد گرفته باشید!</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Sun, 07 Apr 2024 07:17:09 +0330</pubDate>
            </item>
                    <item>
                <title>تولید تصویر در مدلهای Stable Diffusion (بخش دوم)</title>
                <link>https://virgool.io/@Aleereza/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AE%D9%84%D9%82-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%AF%D8%B1-%D9%85%D8%AF%D9%84%D9%87%D8%A7%DB%8C-stable-diffusion-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-fcw2g0kvdzaz</link>
                <description>بخش نخست این مقاله را می‌توانید در این پست مطالعه نمائید.نحوه عملکرد diffusion ایده اصلی تولید تصاویر با مدل های انتشار بر این واقعیت استوار است که ما مدل های بینایی کامپیوتری قدرتمندی داریم. با توجه به مجموعه داده به اندازه کافی بزرگ، این مدل ها می توانند عملیات پیچیده را یاد بگیرند. مدل‌های diffusion با قاب‌بندی مسئله به شکل زیر به تولید تصویر نزدیک می‌شوند:بگوییم یک تصویر داریم، مقداری نویز تولید می کنیم و آن را به تصویر اضافه می کنیم.اکنون می توان این را به عنوان یک نمونه آموزشی در نظر گرفت. ما می‌توانیم از همین فرمول برای ایجاد نمونه‌های آموزشی زیادی برای آموزش بخش مرکزی مدل تولید تصویر خود استفاده کنیم.در این مثال اضافه کردن مقدار کم نویز (مقدار 0، بدون نویز) تا کل نویز (مقدار 4، نویز کل) نشان می‌دهد، ما به راحتی می‌توانیم میزان نویز اضافه شده به تصویر را کنترل کنیم، بنابراین می‌توانیم آن را طی ده‌ها مرحله پخش کنیم و به این ترتیب برای هر تصویر در مجموعه داده‌ی آموزشی، ده‌ها نمونه‌ی آموزشی ایجاد کنیم.با استفاده از این مجموعه داده، می‌توانیم «پیش‌بینی‌کننده‌ی نویز» را آموزش دهیم و در نهایت به یک پیش‌بینی‌کننده‌ی نویز قدرتمندی برسیم که در صورت اجرا با پیکربندی خاص، تصاویر واقعی را تولید کند. اگر با یادگیری ماشین آشنایی داشته باشید، مرحله‌ی آموزش برایتان آشنا به نظر خواهد رسیداکنون ببینیم که چگونه این مدل می‌تواند تصاویر را تولید کند.رسم تصاویر با حذف نویزپیش بینی کننده نویز آموزش دیده می تواند یک تصویر نویزدار و تعداد مرحله حذف نویز بگیرد و قادر به پیش بینی بخش نویز آن است.نویز نمونه‌برداری شده به گونه‌ای پیش‌بینی می‌شود که اگر آن را از تصویر کم کنیم، تصویری به دست می‌آید که به تصاویر مورد استفاده در آموزش مدل نزدیک‌تر باشد. (البته نه دقیقا همان تصاویر، بلکه توزیع آنها. منظورمان دنیای چینش پیکسل‌هاست که در آن آسمان معمولا آبی و بالای زمین است،  افراد دو چشم دارند، گربه‌ها ظاهر خاصی دارند – گوش‌های تیز و معمولا، بی‌تفاوت به نظر می‌رسند.)اگر مجموعه‌ی داده‌ی آموزشی شامل تصاویر دلنشین و زیبا باشد (مانند مجموعه‌ی LAION Aesthetics که برای آموزش «Stable Diffusion» استفاده شد)، تصویری که در نهایت ایجاد می‌شود نیز به احتمال زیاد دلنشین و زیبا خواهد بود. در مقابل، اگر مدل را با تصاویر لوگو آموزش دهیم، به یک مدل تولیدکننده‌ی لوگو تبدیل می‌شود.با این توضیحات، توصیف ما از تولید تصویر با استفاده از مدل‌های انتشار که بیشتر بر اساس «مدل‌های احتمالی انتشار حذف نویز» بود، به پایان می‌رسد. حالا که درک اولیه‌ای از Diffusion دارید، با اجزای اصلی نه تنها Stable Diffusion، بلکه Dall-E 2 و Imagen گوگل نیز آشنا شده‌اید.لازم به ذکر است که فرآیند انتشار توضیح داده شده ، تصاویر را بدون استفاده از هیچ داده‌ی متنی ایجاد می‌کند. بنابراین، اگر این مدل را پیاده‌سازی کنیم، تصاویر فوق‌العاده‌ای تولید خواهد کرد، اما هیچ راهی برای کنترل اینکه تصویر یک هرم، گربه یا هر چیز دیگری است، نخواهیم داشت. در پست بعدی، نحوه‌ی ادغام متن در این فرآیند برای کنترل نوع تصویری که مدل تولید می‌کند، بررسی خواهیم کرد.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Mon, 04 Mar 2024 11:35:15 +0330</pubDate>
            </item>
                    <item>
                <title>تولید تصویر در مدلهای Stable Diffusion (بخش اول)</title>
                <link>https://virgool.io/@Aleereza/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AE%D9%84%D9%82-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%AF%D8%B1-%D9%85%D8%AF%D9%84%D9%87%D8%A7%DB%8C-stable-diffusion-k1stnoxfabuq</link>
                <description>توانایی‌ تولید تصویر با هوش مصنوعی به ما امکان می‌دهد با استفاده از توصیفات متنی، تصاویر خیره کننده ای خلق کنیم. انتشار مدل «پخش پایدار» (Stable Diffusion) نقطه عطفی مهم در این پیشرفت محسوب می‌شود، زیرا مدلی با عملکرد بالا (از نظر کیفیت تصویر، سرعت و نیاز به منابع/حافظه‌ی نسبتاً کم) را در دسترس عموم قرار داد.پس از آزمایش تولید تصویر هوش مصنوعی، ممکن است تعجب کنید که این مدل‌ها چگونه کار می کند.این یک مقدمه ساده برای توضیح نحوه عملکرد Stable Diffusion است.‏Stable Diffusion از این جهت همه کاره است که می توان از آن به روش های مختلف استفاده کرد. بیایید ابتدا روی تولید تصویر فقط از متن تمرکز کنیم (text2img). تصویر بالا نمونه ای از ورودی متن و تصویر تولید شده را نشان می دهد. به غیر از متن به تصویر، یکی دیگر از راه های استفاده از آن تغییر تصاویر است (بنابراین ورودی‌ها متن + تصویر هستند).بیایید به مدل نگاهی بیاندازیم، چون به ما کمک می کند تا اجزای تشکیل دهنده، نحوه‌ی تعامل آن‌ها و معنای گزینه‌ها و پارامترهای تولید تصویر را بهتر درک کنیم.اجزای تشکیل دهنده‌ی «پخش پایدار» (Stable Diffusion)  یک سیستم متشکل از چندین جزء و مدل است و یک مدل یکپارچه نیست.وقتی جزئیات مدل را نگاه می کنیم، اولین چیزی که متوجه می شویم وجود یک جزء «درک متن» است که اطلاعات متنی را به یک نمایش عددی که مفاهیم متن را در خود جای داده است، ترجمه می کند.حال با یک دید کلی از مدل شروع می‌کنیم و در ادامه‌ به جزئیات بیشتر می‌پردازیم. با این حال، می‌توانیم بگوییم که این &quot;کدگذار متن&quot; یک مدل زبان ویژه‌ی &quot;ترانسفورمر&quot; است (از نظر فنی: کدگذار متن مدل CLIP). این بخش، متن ورودی را دریافت می‌کند و فهرستی از اعداد را خروجی می‌دهد که هر کلمه/توکن موجود در متن را نشان می‌دهد (یک بردار برای هر توکن).سپس این اطلاعات به مولد تصویر (Image Generator) داده می شود که خود از چند جزء تشکیل شده است.مولد تصویر دو مرحله را طی می کند:1- ایجاد کننده اطلاعات تصویراین بخش راز موفقیت Stable Diffusion است. دلیل اصلی بهبود عملکرد آن نسبت به مدل‌های قبلی همین بخش است.این بخش برای تولید اطلاعات تصویر، چندین مرحله را طی می‌کند که همان پارامتر &quot;steps&quot; در رابط‌ها و کتابخانه‌های Stable Diffusion است که معمولا مقدار پیش‌فرض آن ۵۰ یا ۱۰۰ است.خالق اطلاعات تصویر بطور کامل در &quot;فضای اطلاعات تصویر image information space&quot; (یا &quot;فضای نهفته latent space&quot;) کار می‌کند. در ادامه‌ی مقاله به معنای دقیق این فضا خواهیم پرداخت. این ویژگی باعث می‌شود که این بخش نسبت به مدل‌های دیفیوژن قبلی که در &quot;فضای پیکسل&quot; کار می‌کردند، سریع‌تر باشد. از لحاظ فنی، این بخش از یک شبکه‌ی عصبی U-Net و یک الگوریتم زمان‌بندی تشکیل شده است.کلمه‌ی &quot;انتشار&quot; (diffusion) به فرآیندی که در این بخش اتفاق می‌افتد اشاره دارد. این فرآیند، پردازش گام به گام اطلاعات است که در نهایت منجر به تولید یک تصویر باکیفیت توسط بخش بعدی (رمزگشای تصویر) می‌شود.2- رمزگشای تصویررمزگشای تصویر از اطلاعاتی که از خالق اطلاعات گرفته است، تصویری را ترسیم می کند. در پایان فرآیند فقط یک بار اجرا می شود تا تصویر پیکسلی نهایی تولید شود.با این توضیحات، می‌توانیم سه جزء اصلی تشکیل دهنده‌ی «پخش پایدار» را مشاهده کنیم که هرکدام شبکه‌ی عصبی مخصوص به خود را دارند:‏ClipText: مسئول رمزگذاری متن ورودی: متنخروجی: ۷۷ بردار نمایش کلمه (توکن)، هر کدام با ۷۶۸ بعد‏UNet + Scheduler: مسئول پردازش و انتشار تدریجی اطلاعات در فضای اطلاعاتی (فضای نهفته)ورودی: بردارهای نمایش کلمه و یک تنسور (آرایه‌ی چندبعدی) اولیه‌ی حاوی نویزخروجی: یک آرایه‌ از اطلاعات پردازش‌شدهرمزگشای ات رمزگذار: مسئول نقاشی تصویر نهایی با استفاده از آرایه‌ی اطلاعات پردازش‌شدهورودی: آرایه‌ی اطلاعات پردازش‌شده (ابعاد: ۴ × ۶۴ × ۶۴)خروجی: تصویر نهایی (ابعاد: ۳ × ۵۱۲ × ۵۱۲ که نشان‌دهنده‌ی مقادیر قرمز، سبز، آبی، عرض و ارتفاع تصویر است)خب، بیایید ببینیم &quot;انتشار&quot; (diffusion) در Stable Diffusion چیست؟فرآیند انتشار &quot;diffusion&quot; درون بخش صورتی‌رنگ &quot;خالق اطلاعات تصویر&quot; اتفاق می‌افتد. این بخش با در اختیار داشتن بردارهای نمایش کلمه (که متن ورودی را نشان می‌دهند) و یک آرایه‌ی اولیه‌ی تصادفی &quot;اطلاعات تصویر&quot; (که به آن‌ها &quot;نهفته&quot; (latent) هم می‌گویند)، یک آرایه‌ی اطلاعات تولید می‌کند که &quot;رمزگشای تصویر&quot; از آن برای رسم تصویر نهایی استفاده می‌کند.&quot;این فرآیند به صورت گام به گام انجام می شود. هر مرحله اطلاعات مرتبط بیشتری را اضافه می کند. برای درک شهودی از فرآیند، می‌توانیم آرایه‌های نهفته تصادفی را بررسی کنیم و ببینیم که به نویز بصری تبدیل می‌شود. بازرسی بصری در این مورد، عبور آن از رمزگشای تصویر است.انتشار در چند مرحله اتفاق می‌افتد، هر مرحله بر روی یک آرایه پنهان ورودی عمل می‌کند، و آرایه پنهان دیگری تولید می‌کند که بهتر شبیه متن ورودی و تمام اطلاعات بصری است که مدل از تمام تصاویری که مدل روی آن‌ها آموزش دیده است، گرفته است.ما می توانیم مجموعه ای از این پنهان ها را تجسم کنیم تا ببینیم در هر مرحله چه اطلاعاتی اضافه می شود.این روند کاملاً نفس گیر است.در این مورد بین مراحل 2 و 4 اتفاق بسیار جالبی رخ می دهد. طرح کلی ازنویزها بیرون می آید.نحوه عملکرد diffusionایده اصلی تولید تصاویر با مدل های انتشار بر این واقعیت استوار است که ما مدل های بینایی کامپیوتری قدرتمندی داریم. با توجه به مجموعه داده به اندازه کافی بزرگ، این مدل ها می توانند عملیات پیچیده را یاد بگیرند. در پست بعد به نحوه عملکرد این بخش میپردازیم.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Mon, 04 Mar 2024 10:30:57 +0330</pubDate>
            </item>
                    <item>
                <title>الگوهای عاطفی در داستان‌نویسی</title>
                <link>https://virgool.io/@Aleereza/%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-%D8%B9%D8%A7%D8%B7%D9%81%DB%8C-%D8%AF%D8%B1-%D8%AF%D8%A7%D8%B3%D8%AA%D8%A7%D9%86-%DA%AF%D9%88%DB%8C%DB%8C-lsb8jk2wh4qv</link>
                <description>در سال ۲۰۱۶، محققان دانشگاه آدلاید، داده‌های مربوط به فراز و نشیب‌های عاطفی در بیش از ۱۳۰۰ رمان را استخراج کردند و از پردازش زبان برای تحلیل این فراز و نشیب‌ها استفاده کردند. پس از آن، ۶ الگوی تکراری را در داستان‌گویی غربی شناسایی کردند. اصل مقاله را می‌توانید در اینجا پیدا کنید.این الگوها عبارتند از:۱. از چاه‌ویل به قصر (صعود):داستان کلاسیکِ فردیِ بی‌چیز و تلاشگر که کوه را فتح می‌کند تا شمشیر را از سنگ بیرون بکشد.شاه آرتوردر جستجوی خوشبختی۲. از قصر به چاه‌ویل (فرود):غم‌انگیزترین داستانِ همه‌ این الگوها. سفری از اوج به حضیض.شاه لیرشهروند کینداغ ننگ۳. فرود، سپس صعود:کاراکتری که زندگی خوبی دارد، با یک مشکل بزرگ مواجه می‌شود، اما راهی برای غلبه بر آن پیدا می‌کند. اغلب در نهایت، آن‌ها در موقعیت بهتری از قبل قرار می‌گیرند.‏Martian‏The Hunger Gamesرستگاری در شاوشنک۴. ایکاروس (صعود، سپس فرود):قهرمان به سرعت در جامعه نیویورک (یا هر جای دیگری) پیشرفت می‌کند و بزرگترین مهمانی‌های شهر را برگزار می‌کند. سپس با ضربه‌ای از واقعیت متوجه می‌شود که بیش از حد نزدیک خورشید شده است.مکبثگتسبی بزرگمرگ فروشنده۵. سیندرلا (صعود، سپس فرود، سپس صعود):توضیحات را به عهده‌ی وانه‌گت می‌گذاریم:«از بدبخت‌ترین سطح شروع کنیم. از کی بدبخت‌تر؟ خب، از یک دختر کوچولو... یک کفش اندازه‌اش می‌شود و به خوشبختی‌ دور از انتظار می‌رسد.»طلوع سرخ Red Risingمیلیونر زاغه نشینکنت مونت کریستو۶. ادیپ (فرود، سپس صعود، سپس فرود):حدود ۷۰ درصد داستان همه چیز عالی به نظر می‌رسد. والتر وایت از معلم دبیرستان به پادشاه مواد مخدر تبدیل می‌شود. سپس همه چیز به هم می‌ریزد. سقوط اولیه اغلب تقصیر خود او نیست، اما سقوط نهایی چرا.هملتدختر گم‌شدهبریکینگ بدسه نکته‌ی کلیدی:۱. از چاه‌ویل به قصر، ادیپ و سیندرلا محبوب‌ترین‌ داستانها بین خوانندگان هستند. یعنی بیشترین فروش را داشته‌اند.۲. وقتی به داستانی فکر می‌کنید، شکلِ احساسی آن را ترسیم کنید.محورِ X: زمانمحورِ Y: بدبیاری به خوشبختی</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Thu, 25 Jan 2024 09:58:28 +0330</pubDate>
            </item>
                    <item>
                <title>سیستم رتبه‌بندی بیزی</title>
                <link>https://virgool.io/@Aleereza/%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%B1%D8%AA%D8%A8%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%A8%DB%8C%D8%B2%DB%8C-dfsf9gpzumxo</link>
                <description>فراتر از محاسبه‌ی احتمال برنده شدن در لاتاری یا پیش‌بینی میزان احتمال ابتلا به بیماری، کاربردهای دیگری هم برای قضیه‌ی بیز وجود داره. یه نمونه‌ش می‌تونه ساختن یه سیستم رتبه‌بندی باشه. مثال بزنیم یه سایت نقد و بررسی فیلم که کاربران می‌تونن به فیلم‌ها رأی مثبت یا منفی بدن. روش‌های رتبه‌بندی ساده‌، مثل درصد آرای مثبت یا تفاضل آرای مثبت و منفی، عملکرد خوبی ندارن. مثلاً: اگر 60 رأی مثبت و 40 رأی منفی باشه، در مقابل 6 رأی مثبت و 4 رأی منفی، هر دو 60 درصد مثبت هستن.تفاضل آرا هم مشکل داره. مثلاً 100 رأی مثبت و 95 رأی منفی در مقابل 5 رأی مثبت و 0 رأی منفی، هر دو فقط 5 تا اختلاف دارن. چیزی که ما می‌خوایم اینه که تعداد آرا اطلاعات بیشتری بهمون بده. 60 رأی باید نسبت به 6 رأی، وزن بیشتری داشته باشه. خب، بیایین از آرا به عنوان احتمالات در استنتاج بیزی استفاده کنیم. اینجا یه مجموعه‌ی فیلم A تا E رو با آرای مثبت و منفی‌شون می‌بینیم و همچنین تابع بتا که با یه تابع یکنواختِ Beta(1,1) پیشین محاسبه شده:با این حال، توزیع بتا یه تابع چگالی احتماله، پس ما یه الگوریتم نیاز داریم تا اون رو تبدیل به یه مقیاس عددی برای رتبه‌بندی کنیم. یه روش اینه که حداقل مقدار توزیع بتا رو پیدا کنیم، طوری که 95 درصد مطمئن باشیم مقدار واقعی از اون بیشتره. این کار می‌تونه با کم کردن انحراف معیار از میانگین انجام بشه.Ranking = Mean + z-score × standard deviation برای یه تقریب نرمال، تابع توزیع تجمعی یا CDF داریم 5 درصد z-score برابر با 1.64- می‌شه که می‌تونید در فرمول بالا ازش استفاده کنید. اما اگه به CDF معکوس (inverse CDF) خود توزیع بتا دسترسی دارید، می‌تونید مستقیماً ازش استفاده کنید.rank = beta.ppf(0.05,a,b) # python
rank = BETA.INV(0.05,a,b) # Excel, Sheets
rank = qbeta(0.05,a,a) # Rکه نتایج زیر رو به دست می‌آرن:B   6:1  rank: 0.53
A  60:40 rank: 0.52
C   6:4  rank: 0.35
E  10:20 rank: 0.21
D   1:2  rank: 0.10این روش باعث میشه فیلم‌های A (60 به 40) با شواهد زیاد و فیلم‌های C (6 به 4) با شواهد کم از هم جدا بشن، ولی برای رتبه‌بندی کلی ایده‌آل نیست، مخصوصاً D (قرمز) که شواهد خیلی کمی داره ولی بدترین رتبه رو می‌گیره. ما می‌دونیم که اکثر فیلم‌ها متوسط هستن، نه فوق‌العاده خوب یا فوق‌العاده بد. ترجیح می‌دیم رتبه‌بندی‌ای داشته باشیم که از فرض فیلم‌های متوسط شروع بشه و برای رفتن به سمت فیلم‌های عالی یا افتضاح به شواهد نیاز داشته باشه. می‌تونیم این ترجیح رو با استفاده از یه &quot;احتمال پیشین&quot; در سیستم رتبه‌بندی انجام بدیم که یه سوگیری به سمت فیلم‌های متوسط داشته باشه، با شروع از &quot;پیشین&quot; (11،11)Beta به جای (1،1)Beta. حالا برای دور شدن از &quot;احتمال پیشین&quot; و رفتن به سمت افراط‌ها به تعدادی رأی نیاز خواهد بود و در نتیجه رتبه‌بندی کلی بهتری به دست میاد.A  60:40 rank: 0.51
B   6:1  rank: 0.43
C   6:4  rank: 0.39
D   1:2  rank: 0.32
E  10:20 rank: 0.30خب، نتیجه‌ی نهایی نشون می‌ده که فیلم D با شواهد کم تقریباً تو وسط قرار می‌گیره، در حالی که فیلم E با شواهد منفی بیشتر، حالا رتبه‌ی پایین‌تری داره.این روش فقط برای رأی مثبت/منفی کار نمی‌کنه، بلکه می‌تونید با تعیین مقادیر رأی مثبت/منفی همزمان، اون رو برای سیستم رأی‌دهی بر اساس ستاره هم گسترش بدید. Stars (1,2,3,4,5): up (0,0.25,0.5,0.75,1) down (1,0.75,0.5,0.25,0)بنابراین اگر سه نفر هر کدام به یک فیلم 4 ستاره امتیاز بدن، مجموع امتیاز آن برابر است با:3  up  votes each of 0.75 value = 3×0.75 = 2.25
3 down votes each of 0.25 value = 3×0.25 = 0.75
Beta(3.25,1.75) # Uniform prior
Beta(13.25, 11.75) # Prior biased toward average movie assumptionما یه سیستم رتبه‌بندی پایدار ساختیم که شواهد بیشتر رو بیشتر پاداش می‌ده و نشون دادیم که چطور با استفاده از قضیه‌ی بیز، می‌تونیم اون رو برای سیستم‌های رأی‌دهی بر اساس ستاره هم به کار ببریم.اگر می‌خواهید خودتان آن را امتحان کنید، کد پایتون زیر رتبه‌بندی را انجام می‌ده و نمودارها را برای مورد بایاس ترسیم می‌کنه.from scipy.stats import beta
import numpy as np
import matplotlib.pyplot as plt

movies_arr = [
        [&#039;A&#039;, 60, 40],
        [&#039;B&#039;, 6, 1],
        [&#039;C&#039;, 6, 4],
        [&#039;D&#039;, 1, 2],
        [&#039;E&#039;, 10, 20],
               ];

movies= [dict(zip([&#039;name&#039;,&#039;up&#039;,&#039;down&#039;], a)) for a in movies_arr]

x = np.linspace(0, 1, 1001)

plt.figure(dpi = 200)
axes = plt.gca(frameon=False)


# Prior information, movies tend to be more average and less extreme
a0, b0 = (11,11)

for i in range(len(movies)):
    a = movies[i][&#039;up&#039;] + a0
    b = movies[i][&#039;down&#039;] + a0
    b1 = beta.pdf(x, a, b)

    p = axes.plot(x, b1, linewidth=0.5)
    p[0].set_label(f&amp;quot{movies[i][&#039;name&#039;]}  {movies[i][&#039;up&#039;]}:{movies[i][&#039;down&#039;]}&amp;quot )
    axes.fill_between(x, b1, alpha=0.4)

    rank = beta.ppf(0.05, a, b)
    axes.axvline(x=rank, ymin=0, ymax=1, color=p[0].get_color(), linewidth=1)

    print(f&amp;quot{movies[i][&#039;name&#039;]}  {movies[i][&#039;up&#039;]}:{movies[i][&#039;down&#039;]} rank: {rank:0.2f}&amp;quot)

axes.grid(b=None, which=&#039;major&#039;, axis=&#039;both&#039;)

if a0 &gt; 5:
    axes.set_xlim(0.2, 0.8)

plt.legend()</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Fri, 12 Jan 2024 03:04:49 +0330</pubDate>
            </item>
                    <item>
                <title>پیش‌بینی‌های هیجان‌انگیز هوش مصنوعی برای سال 2024</title>
                <link>https://virgool.io/@Aleereza/%D9%BE%DB%8C%D8%B4-%D8%A8%DB%8C%D9%86%DB%8C-%D9%87%D8%A7%DB%8C-%D9%87%DB%8C%D8%AC%D8%A7%D9%86-%D8%A7%D9%86%DA%AF%DB%8C%D8%B2-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%A7%D9%84-2024-sgjwhhj44ini</link>
                <description>سال 2023 سال پررونقی برای هوش مصنوعی بود. پیش‌بینی کردن آینده همیشه خطرناکه، ولی خب، یه تلاشی بکنیم:۱. عینک‌های هوشمند هوش مصنوعی: رقبای جدی برای گوشی‌های هوشمند؟با افزایش اهمیت قابلیت‌های چند وجهی (multimodal)، شرکت‌های پیشرو در هوش مصنوعی روی دستگاه‌های پوشیدنی هوش مصنوعی تمرکز می‌کنند و چه چیزی بهتر از عینک به عنوان یه دستیار هوش مصنوعیِ همیشه همراه؟ هم صدا رو از کنار گوش پخش می‌کنه، هم با دوربین نزدیک چشم ورودی‌های تصویری رو می‌گیره، هم دست‌ها آزادن و هم راحته. متا با عینک‌ هوشمند Ray Ban پیشتاز این کاره، ولی یادتون بیاد شایعه‌ی همکاری OpenAI با اسنپ‌چت رو! این تازه اولشه...۲. خداحافظ ChatGPT، عصر دستیارهای هوش مصنوعی متنوع‌تر فرا رسیده استسال 2023 با سلطه‌ی ChatGPT شروع شد، اما سال رو داره با مدل‌های Bard، Claude، Llama، Mistral و هزاران مدل مشتق‌شده تموم می‌کنه. با پایین اومدن قیمت و افزایش رقابت، ChatGPT به‌عنوان تنها معیار ارزشیابی کم‌کم کنار می‌ره.۳. فراتر از LLMها، به LMMها خوشامد بگویید:مدل‌های بزرگ چندوجهی (Large Multimodal Models) ظهور خواهند کرد و LLMها رو تو بحث‌های هوش مصنوعی کنار می‌زنند. ارزیابی‌های چندوجهی، امنیت چندوجهی، و کلی چیز دیگه‌ای با پیشوند “چندوجهی” رو شاهد خواهیم بود. LMMها یه قدم به سمت دستیارهای هوش مصنوعی واقعا همه‌فن‌حریف نزدیک‌ترن.۴. جهش بزرگ نداریم، اما پیشرفت تو همه‌چیز:مدل‌های جدید مثل GPT5 جهش بزرگی ایجاد نمی‌کنن و LLMها با محدودیت‌های ذاتی خودشون و مشکل توهم‌زنی دست‌وپنجه نرم می‌کنن. در سال 2024 شاهد هیچ پیشرفتی که باعث بشه به اندازه‌ی کافی قابل اعتماد باشن و “هسته‌ی هوش مصنوعی عمومی پایه” رو حل کنن نخواهیم بود. پیشرفت‌های تکرارشونده باعث می‌شه “به اندازه‌ی کافی” برای انجام وظایف مختلف خوب باشن. بهبودهایی در روش‌های RAG، مدیریت و سازماندهی داده، تنظیم دقیق بهتر، کمی‌سازی و غیره LLMها رو به اندازه‌ی کافی قدرتمند و مفید برای کاربردهای مختلف می‌کنه و باعث استفاده‌ی هرچه بیشتر از اون‌ها در سرویس‌های مختلف تو صنایع مختلف می‌شه.۵. کوچکی زیباست: مدل‌های زبان کوچک، قهرمان‌های آینده‌ی هوش مصنوعی؟مدل‌های زبان کوچک (SLM) دیگه غریبه نیستن، ولی در سال 2024 اهمیتشون حتی بیشتر می‌شه. چرا؟ چون هم کم‌خرج‌ترن، هم مصرف انرژی و منابعشون پایین‌تره. این‌طوری هم برای شرکت‌ها به صرفه‌ترن، هم برای محیط‌زیست بهتر.تکنیک “کمی‌سازی” هم پیشرفت زیادی می‌کنه که باعث می‌شه این مدل‌های کوچیک‌تر راحت‌تر روی دستگاه‌های خودتون مثل گوشی یا لپ‌تاپ اجرا بشن. یعنی به‌زودی کلی سرویس‌های هوش مصنوعی روی خود گوشیتون در دسترس خواهد بود، بدون نیاز به اینترنت یا کامپیوترهای قوی.۶. مدل‌های متن‌باز پیروز می‌شن، اما بحث متن‌باز در مقابل بسته کم‌رنگ‌تر می‌شهسال 2023 یه سال عالی برای جامعه‌ی نرم‌افزارهای متن‌باز بود. مدل‌های متن‌باز مثل Mistral نشون دادن که می‌تونن به خوبی مدل‌های تجاری مثل GPT-4 کار کنن و اختلاف عملکردشون خیلی کم شده (فقط 13٪ روی بنچمارک MMLU!).همه‌ی شرکت‌های بزرگ فهمیدن که مدل‌های متن‌باز دیگه یه اپشن نیستن، یه ضرورتن. برای پیشرفت سریع‌تر هوش مصنوعی و ساخت مدل‌های بهتر. این مدل‌ها قرار نیست مدل‌های تجاری رو از دور خارج کنن، بلکه قراره با هم کار کنن و پیشرفت رو سریع‌تر کنن.۷. چطور بفهمیم یه مدل هوش مصنوعی خوبه؟معما همچنان ادامه داردهنوز هم معلوم نیست که چه‌جوری باید مدل‌های هوش مصنوعی رو باهم مقایسه کرد و کدومشون عملکرد بهتری داره. هیچ بنچمارک یا جدول رده‌بندی‌ای نیست که همه‌چیز رو در نظر بگیره و جواب قطعی بده.ولی خب، پیشرفت در این زمینه هم زیاده. ابزارهای جدید و استانداردهای بهتر ساخته می‌شه، مخصوصا برای مدل‌های چندوجهی. کم‌کم راه و چاه ارزیابی این مدل‌ها داره مشخص‌تر می‌شه.۸. ریسک‌های آینده فعلا تو تعطیلاتن، ریسک‌های واقعی همین الان جلوی چشممون هستنتو سال 2023 خیلی در مورد ریسک‌های دور و درازی هوش مصنوعی حرف زدیم، مثل سوء‌استفاده‌ی ربات‌ها برای کنترل دنیا. ولی خب، ریسک‌های واقعی‌تر و نزدیک‌تری هم هستن که باید بیشتر نگرانشون باشیم. مثل سوگیری‌های الگوریتم‌ها، اخبار جعلی، امنیت کاربران، سلامت انتخابات، و غیره. اینا مشکلاتیه که همین الان باید برای حلشون تلاش کنیم.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Sat, 30 Dec 2023 10:08:31 +0330</pubDate>
            </item>
                    <item>
                <title>‏مدل جدید FunSearch :DeepMind برای کشف الگوریتم های جدید</title>
                <link>https://virgool.io/@Aleereza/funsearch-vgunesz3efhw</link>
                <description>‏‏Google DeepMind یکی از آزمایشگاه‌های هوش مصنوعی پیشرو در جهان است که در زمینه‌های مختلف یادگیری ماشین و رباتیک فعالیت می‌کند. این آزمایشگاه در سال ۲۰۱۰ توسط گوگل خریداری شد و از آن زمان تاکنون دستاوردهای چشمگیری در زمینه هوش مصنوعی داشته است.‏یکی از جدیدترین دستاوردهای Google DeepMind، مدلی به نام FunSearch است که می‌تواند الگوریتم‌های ریاضی و علوم کامپیوتری جدیدی را کشف کند. FunSearch از یک رویکرد هوشمندانه استفاده می‌کند که به آن «تفکر در کد(thinking in code)» می‌گویند. در این رویکرد، FunSearch از یک LLM برای تولید برنامه‌های کامپیوتری بر اساس مجموعه‌ای از توابع استفاده می‌کند. سپس، یک ارزیاب برای اثبات راه‌حل‌های مختلف استفاده می‌شود.‏FunSearch تاکنون نتایج چشمگیری داشته است. این مدل موفق شده است الگوریتم‌های جدیدی برای مشکلات ریاضی و علوم کامپیوتری مانند مسئله‌ی cap set و مسئله‌ی bin packing پیدا کند. مسئله‌ی cap set یک مسئله‌ی ریاضی است که به دنبال یافتن مجموعه‌ای از اشیا است که بیشترین پوشش را برای یک مجموعه‌ی داده فراهم می‌کند. مسئله‌ی bin packing نیز یک مسئله‌ی است که به دنبال یافتن راه‌حلی برای قرار دادن اشیا در بسته‌‌های مختلف است به گونه‌ای که هر بسته‌‌ ظرفیت خود را پر کند.‏FunSearch پتانسیل زیادی برای اکتشافات علمی جدید در زمینه‌های ریاضی و علوم کامپیوتری دارد. این مدل می‌تواند به دانشمندان کمک کند تا مشکلات پیچیده‌ای را حل کنند و راه‌حل‌های جدیدی برای چالش‌های دنیای واقعی ارائه دهند. نامگذاری FunSearch از این واقعیت مشتق شده است که مدل به طور مکرر فضای تابع را جستجو می کند.‏FunSearch یک روش هوشمندانه برای کشف الگوریتم‌های جدید در ریاضیات و علوم کامپیوتر است. این روش، ترکیبی از روش‌های تکاملی با مدل‌های زبان بزرگ (LLM) را برای بهبود و ارتقای بهترین ایده‌های برنامه‌نویسی به کار می‌گیرد.فرآیند به این صورت است:تعریف مسئله: کاربر ابتدا مسئله را به شکل کد با مشخص کردن یک تابع ارزیابی (برای سنجش راه‌حل‌های احتمالی) و یک برنامه ساده اولیه (نقطه‌ای برای شروع تکامل) معرفی می‌کند.‏LLM پیش‌آموزش‌دیده: FunSearch بر پایه‌ی مدل «Codey» از خانواده‌ی PaLM2 بنا شده است. Codey با آموزش گسترده روی کدهای مختلف، نقش کلیدی در پیشنهاد بهبودهایی برای توابع ایفا می‌کند. نکته‌ی قابل توجه این است که Codey نیازی به آموزش اختصاصی برای هر مسئله ندارد.ارزیابی: این بخش از FunSearch، برنامه‌های تولید شده توسط LLM را بر اساس ورودی‌های مشخصی ارزیابی می‌کند. مثلاً، در مسائل بهینه‌سازی ترکیبی یا ابعادی، ورودی‌ها با توجه به الزامات خاص آن وظیفه، تغییر می‌کنند.پایگاه داده‌ی برنامه‌ها: این پایگاه، مجموعه‌ای متنوع از برنامه‌های صحیح را در خود نگه می‌دارد. این برنامه‌ها برای ایجاد ورودی‌های جدید و جلوگیری از گیر افتادن در نقاط بهینه محلی در فرآیند تکامل، حیاتی هستند.ورودی Prompt : در FunSearch از روشی به نام «بهترین ورودی احتمالی best-shot prompting» استفاده می‌شود که شامل انتخاب و رتبه‌بندی برنامه‌ها از پایگاه داده بر اساس عملکرد آن‌هاست. به هر برنامه بر اساس امتیازش، یک شماره نسخه اختصاص داده می‌شود.سیستم توزیع‌شده: این بخش از FunSearch شامل سه جزء اصلی است: پایگاه داده‌ی برنامه‌ها، نمونه‌گیرها و ارزیابگرها که به‌صورت غیرهمزمان کار می‌کنند. پایگاه داده، برنامه‌ها را ذخیره و ارائه می‌کند، نمونه‌گیرها با استفاده از LLM پیش‌آموزش‌دیده توابع جدیدی ایجاد می‌کنند و ارزیابگرها کارایی این برنامه‌ها را قضاوت می‌کنند. این سیستم پیچیده، که در اطلاعات تکمیلی آن‌ها نشان داده شده است، رویکرد جامع و پویای Google DeepMind برای پیشرفت حوزه تکامل برنامه را به نمایش می‌گذارد.در کل، FunSearch یک نوآوری هیجان‌انگیز در کشف الگوریتم‌های جدید است که پتانسیل زیادی برای حل مشکلات پیچیده و ارائه راه‌حل‌های نوآورانه در ریاضیات و علوم کامپیوتر دارد.‏FunSearch در عملبرای ارزیابی FunSearch ، گوگل دیپ‌مایند تصمیم گرفت به سراغ چندین مسئله‌ی نمادین در ریاضیات و علوم کامپیوتر برود.مسئله‌ی ۱: مسئله‌ی پوشش مجموعه (Cap Set Problem)اولین چالش، مسئله‌ی پوشش مجموعه بود، یک معما که مدت‌هاست جامعه‌ی ریاضیدانان را به خود مشغول کرده است. این مسئله شامل شناسایی بزرگ‌ترین گروه از نقاط در یک شبکه‌ی مرتبه‌بالا است به نحوی که هیچ سه نقطه‌ای روی یک خط راست قرار نگیرند. گوگل دیپ‌مایند با همکاری جردن النبرگ، استاد ریاضی از دانشگاه ویسکانسین-مدیسون به این مسئله پرداخت. روش‌های محاسباتی سنتی در اینجا به دلیل تعداد نجومی احتمالات، حتی فراتر از تعداد کل اتم‌های جهان، با مشکل مواجه می‌شوند.دستاورد FunSearch در این زمینه قابل توجه بود. این سیستم برنامه‌هایی تولید کرد که بزرگ‌ترین مجموعه‌های پوشش شناخته شده تا به امروز را کشف کردند و بیشترین پیشرفت در این زمینه را در بیش از دو دهه گذشته رقم زدند. FunSearch نه تنها به این موفقیت دست یافت، بلکه از قابلیت‌های پیشرفته‌ترین ابزارهای حل محاسباتی موجود نیز فراتر رفت و کارایی برتر خود را در حل چالش‌های ریاضی پیچیده نشان داد.مسئله‌ی ۲: مسئله بسته‌بندی (Bin Packing)دومین مسئله‌ای که گوگل دیپ‌مایند با FunSearch به سراغ آن رفت، مسئله‌ی بسته‌بندی (Bin Packing) بود. این مسئله‌ی کاربردی و رایج، شامل بسته‌بندی بهینه و کارآمد اشیاء با اندازه‌های مختلف در کمترین تعداد بسته‌ ممکن است. این مسئله در دنیای واقعی کاربردهای فراوانی دارد، از لجستیک گرفته تا مدیریت مراکز داده.به طور معمول، این مسئله با استفاده از قوانین تجربی و مبتنی بر تجربه انسان حل می‌شود. اما کارایی این قوانین، بسته به شرایط خاص هر مورد، به‌شدت متفاوت است.‏FunSearch  یک‌بار دیگر قدرت انطباق خود را نشان داد. راه‌اندازی آن برای مسئله‌ی بسته‌بندی، با وجود تفاوت قابل توجه با مسئله‌ی پوشش مجموعه، کاملاً ساده و مستقیم بود. این ابزار با ایجاد یک برنامه‌ی سفارشی و مختص به جزئیات این مسئله، عملکرد فوق‌العاده‌ای از خود نشان داد. این برنامه، با استفاده از بسته‌های کمتر، بسته‌بندی کارآمدتری نسبت به قوانین تجربی سنتی انجام داد. این موفقیت، انعطاف‌پذیری و پتانسیل FunSearch در انقلابی کردن حل مسائل در حوزه‌های مختلف را برجسته کرد.چرا FunSearch مهم است؟فراتر از الگوریتم‌ها: کشف الگوریتم‌های جدید تنها بخشی از توانایی‌های FunSearch است. اصول این سیستم در علوم مختلفی قابل‌استفاده بوده و پتانسیل دستیابی به دانش و نوآوری‌های در عرصه‌های گوناگون را دارد.پیدا کردن گنج‌های پنهان: توانایی FunSearch در کاوش فضاهای پیچیده و گسترده از دانش، باعث شناسایی دانش‌های پنهانی می‌شود که روش‌های سنتی از آن‌ها غافل می‌مانند. این قابلیت می‌تواند علم را با آشکارسازی ارتباطات و الگوهای غیرمنتظره به پیش ببرد.دموکراتیزه کردن کشف علمی: دسترسی آسان و انعطاف‌پذیری FunSearch می‌تواند کشف علمی را برای عموم مردم تسهیل کند. پژوهشگران از زمینه‌های مختلف و بدون نیاز به تخصص محاسباتی پیچیده، می‌توانند از این ابزار برای کشف و حل مسائل در حوزه‌های خود استفاده کنند.چالش‌ها و نکات قابل‌تأمل:تفسیرپذیری و قابلیت توضیح: درک اینکه FunSearch چگونه به نتایج خود می‌رسد برای ایجاد اعتماد و اطمینان به کشف‌های آن ضروری است. تلاش برای شفاف‌تر و قابل‌توضیح‌تر کردن استدلال‌های این سیستم، امری حیاتی است.سوگیری و محدودیت‌ها: مانند هر سیستم هوش مصنوعی دیگری، FunSearch نیز در معرض سوگیری‌های موجود در داده‌هایی است که با آن‌ها آموزش دیده است. انتخاب دقیق داده‌های آموزشی و نظارت مستمر بر سوگیری‌های احتمالی، برای تضمین اعتبار و جلوگیری از تداوم نابرابری‌ها ضروری است.همکاری انسان و هوش مصنوعی: به نظر می‌رسد ایده‌آل‌ترین حالت، همکاری پژوهشگران و دانشمندان با FunSearch است. در این همکاری، انسان‌ها مسیر اکتشاف را هدایت می‌کنند و از قابلیت‌های این سیستم برای کشف دانش جدید و گسترش مرزهای علم استفاده می‌کنند.در مجموع، FunSearchجهشی بزرگ در استفاده از زبان‌های مدل بزرگ برای کشف علمی محسوب می‌شود. با وجود چالش‌های پیش‌رو، توانایی این سیستم در شتاب‌بخشی به پیشرفت علمی و گسترش حوزه‌های تحقیقاتی غیرقابل‌انکار است. ادامه‌ی تحقیقات و توسعه در این زمینه می‌تواند راه را برای آینده‌ای هموار کند که در آن هوش مصنوعی به‌طور فعال در پیشرفت‌های علمی در رشته‌های مختلف مشارکت داشته باشد.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Tue, 19 Dec 2023 23:49:11 +0330</pubDate>
            </item>
                    <item>
                <title>‏(RAG)retrieval-augmented generation چیست؟</title>
                <link>https://virgool.io/@Aleereza/ragretrieval-augmented-generation-%DA%86%DB%8C%D8%B3%D8%AA-klfxh9jfsekf</link>
                <description>‏‏RAG (Retrieval-Augmented Generation) یک چارچوب هوش مصنوعی است که مدل‌های زبان بزرگ (LLM) را قادر می‌سازد تا اطلاعات دقیق و به‌روز را از منابع دانش خارجی بازیابی کنند و درک بهتری در مورد فرآیند تولید متن در LLM در اختیار کاربران قرار دهد.برای درک آن، یک دادگاه را تصور کنید. قاضی بر اساس درک کلی خود از قانون به پرونده ها رسیدگی می کند و تصمیم می گیرد. گاهی اوقات یک پرونده - مثل یک دعوای قصور پزشکی یا یک اختلاف کارگری - به تخصص خاصی نیاز دارد، بنابراین قاضی، کارمندان دادگاه را به کتابخانه حقوقی می فرستد تا به دنبال سوابق و موارد خاصی باشند که می تواند به آنها استناد کند.مثل یک قاضی خوب، مدل های زبانی بزرگ (LLM) می توانند به طیف گسترده ای از سوالات انسانی پاسخ دهند. اما برای ارائه پاسخ‌های معتبر که به منابع استناد می‌کنند، مدل به یک دستیار برای انجام تحقیقات نیاز دارد. توسعه مبتنی بر بازیابی (RAG) یک راه برای بهبود کیفیت پاسخ‌های LLMs است. RAG مدل را به منابع خارجی دانش متصل می‌کند که به مدل کمک می‌کند تا معنای کلمات را بهتر درک کند و پاسخ‌های دقیق‌تری تولید کند.پیاده‌سازی RAG در یک سیستم پاسخگویی به سؤالات مبتنی بر LLM دو مزیت دارد:تضمین می‌کند که مدل همیشه به آخرین و قابل اعتمادترین حقایق دسترسی دارد.به کاربران این امکان را می‌دهد تا منابع مدل را بررسی کنند و ادعاهای آن را تأیید کنند.به زبان ساده، RAG به مدل‌های زبانی بزرگ کمک می‌کند تا پاسخ‌های دقیق‌تری تولید کنند و کاربران را مطمئن کند که می‌توانند به آنها اعتماد کنند.به یک مثال ساده از نحوه عملکرد RAG نگاه کنیم:فرض کنید کاربر سؤال می‌پرسد: «پایتخت فرانسه چیست؟»بدون RAG، مدل ممکن است پاسخ دهد: «پاریس». این پاسخ درست است، اما ممکن است کاربر بخواهد بداند چرا این پاسخ درست است.با RAG، مدل ممکن است پاسخ دهد: «پایتخت فرانسه پاریس است. این شهر در شمال کشور واقع شده است و جمعیت آن حدود دو میلیون نفر است.»این پاسخ دقیق‌تر است زیرا نه تنها پاسخ به سؤال را ارائه می‌دهد، بلکه اطلاعاتی در مورد دلایل صحت پاسخ نیز ارائه می‌دهد.‏RAG  به مدل‌ها منابعی می‌دهد که می‌توانند به آن‌ها استناد کنند، مانند پاورقی‌ها در یک مقاله تحقیقاتی، بنابراین کاربران می‌توانند هر ادعایی را بررسی کنند که باعث ایجاد اعتماد می شود. علاوه بر این، این تکنیک می‌تواند به مدل‌ها کمک کند تا ابهامات موجود در پرس و جوی کاربر را برطرف کنند. همچنین احتمال حدس اشتباه یک مدل را کاهش می دهد، پدیده ای که گاهی اوقات توهم (hallucination) نامیده می شود. یکی دیگر از مزایای بزرگ RAG این است که نسبتا آسان است. توسعه‌دهندگان می‌توانند این فرآیند را با حداقل پنج خط کد پیاده‌سازی کنند که باعث می شود که روش سریعتر و کم هزینه تر از آموزش مجدد یک مدل با مجموعه داده های اضافی باشد و به کاربران امکان می دهد منابع جدید را به سرعت مبادله کنند.‏RAG یک فناوری جدید است که هنوز در حال توسعه است. با این حال، پتانسیل زیادی برای بهبود کیفیت پاسخ‌های مدل‌های زبانی بزرگ دارد.چگونه &#x27;RAG&#x27; نامگذاری شدپاتریک لوئیس، نویسنده اصلی مقاله‌ای که در سال ۲۰۲۲ اصطلاح «توسعه مبتنی بر بازیابی» (RAG) را ابداع کرد از این نامگذاری عذرخواهی کرده است. او گفت که اگر می‌دانست RAG به این محبوبیت می‌رسد، نام دیگری برای آن انتخاب می‌کرد.لوئیس که اکنون رهبری یک تیم RAG در استارت‌آپ هوش مصنوعی Cohere را بر عهده دارد، گفت که تیمش همیشه قصد داشت نامی زیباتر برای RAG انتخاب کند، اما زمان نوشتن مقاله، هیچ‌کس ایده بهتری نداشت.پاتریک لوئیس‏چگونه از RAG استفاده می‌شودبا RAG ، کاربران می‌توانند با مخازن داده‌ها مکالمه کنند که نوع جدیدی از تجربه را باز می‌کنند. این بدان معنی است که برنامه‌های کاربردی برای RAG می‌توانند بسیار بیشتر از برنامه‌های موجود باشد.یک مدل هوش مصنوعی مولد همراه با یک شاخص پزشکی می‌تواند یک دستیار عالی برای یک پزشک یا پرستار باشد. این مدل می‌تواند به پزشکان در تشخیص بیماری‌ها، تجویز داروها و ارائه مراقبت‌های بیمار کمک کند.تحلیلگران مالی از دستیار مرتبط با داده‌های بازار سود خواهند برد. این دستیار می‌تواند به تحلیلگران در شناسایی فرصت‌های سرمایه‌گذاری، مدیریت ریسک و پیش‌بینی روندهای بازار کمک کند.تقریباً هر کسب‌وکاری می‌تواند دستورالعمل‌های فنی یا خط‌مشی، ویدیوها یا گزارش‌های خود را به منابعی به نام پایگاه‌های دانش تبدیل کند که می‌توانند LLM را تقویت کنند. این پایگاه‌های دانش می‌توانند برای موارد استفاده مانند پشتیبانی مشتری یا میدانی، آموزش کارمندان و بهره‌وری توسعه دهندگان استفاده شوند.پتانسیل RAG بسیار گسترده است. این فناوری می‌تواند در طیف وسیعی از صنایع و کاربردها مورد استفاده قرار گیرد. در حال حاضر، شرکت‌هایی مانند AWS، IBM، Glean، Google، Microsoft، NVIDIA، Oracle و Pinecone در حال توسعه و استفاده از RAG هستند.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Sat, 16 Dec 2023 15:29:19 +0330</pubDate>
            </item>
                    <item>
                <title>ترکیب متخصصان Mixture of Experts</title>
                <link>https://virgool.io/@Aleereza/%D8%AA%D8%B1%DA%A9%DB%8C%D8%A8-%D9%85%D8%AA%D8%AE%D8%B5%D8%B5%D8%A7%D9%86-mixture-of-experts-cqerkwha7ftj</link>
                <description>با انتشار مدل Mixtral 8x7B ، یک مدل از ترانسفورمرها تبدیل به داغ‌ترین موضوع در جامعه متن‌باز هوش مصنوعی شده است: Mixture of Experts یا به اختصار MoEs. در این پست ، نگاهی به بلوک‌های سازنده MoEs، نحوه آموزش آن‌ها و مواردی که باید در هنگام استنتاج در نظر گرفت، می‌اندازیم.ترکیبی متخصصان (MOE) چیست؟مقیاس پذیری یک مدل یعنی توانایی مدل برای افزایش عملکرد بدون افزایش هزینه، یکی از مهمترین عوامل تعیین کننده کیفیت مدل است. با توجه به یک بودجه محاسباتی ثابت، آموزش یک مدل بزرگتر با مراحل کمتر بهتر از آموزش یک مدل کوچکتر با مراحل بیشتر است.ترکیب متخصصان یک معماری یادگیری ماشین است که از چندین مدل کوچکتر برای انجام یک کار استفاده می کند. MoE به مدل ها امکان می دهد با محاسبات بسیار کمتری از قبل آموزش داده شوند. این بدان معناست که می توان مدل یا اندازه مجموعه داده را با همان بودجه محاسباتی یک مدل متراکم(dense) به طرز چشمگیری افزایش داد.به طور خاص، یک مدل MoE باید به همان کیفیتی که همتای متراکم خود دارد، در طول پیش‌آموزش سریع‌تر دست یابد. این به این دلیل است که MoE می تواند از موازی سازی محاسبات برای بهره برداری از چندین پردازنده استفاده کند.بنابراین، MoE دقیقاً چیست؟ در زمینه مدل های ترانسفورماتور، یک MOE از دو عنصر اصلی تشکیل شده است:لایه‌های Sparse MoE یک نوع لایه شبکه عصبی هستند که از چندین متخصص برای انجام یک کار استفاده می‌کنند. لایه‌های MoE تعداد معینی «متخصص» دارند (به عنوان مثال 8)، که در آن هر متخصص یک شبکه عصبی است. در عمل، متخصصان، Feedforward Neural Network هستند، اما می توانند شبکه های پیچیده‌‌‌تر یا حتی خود، یک MOE باشند که منجر به MOE های سلسله مراتبی شوند!یک شبکه گیت یا مسیریاب(router)، که تعیین می‌کند کدام توکن‌ها برای کدام متخصص ارسال می‌شوند. به عنوان مثال، در تصویر زیر، توکن &#x27;More&#x27; برای دومین متخصص و توکن &#x27;Parameters&#x27; به شبکه اول ارسال می شود. همانطور که در ادامه بررسی خواهیم کرد، می توانیم یک توکن را به بیش از یک متخصص ارسال کنیم. نحوه مسیریابی یک توکن به یک متخصص یکی از تصمیمات بزرگ هنگام کار با MoEs است - مسیریاب از پارامترهای آموخته شده تشکیل شده است و همزمان با بقیه شبکه آموزش داده شده است.بنابراین، به طور خلاصه، در MoEs ما هر لایه FFN مدل ترانسفورماتور را با یک لایه MoE جایگزین می کنیم که از یک شبکه گیت و تعدادی متخصص تشکیل شده است.اگرچه MOE مزایایی مانند پیش‌آموزش کارآمد و استنتاج سریع‌تر را در مقایسه با مدل‌های متراکم ارائه می‌کند، اما با چالش‌هایی نیز همراه است:آموزش: MOEها به طور قابل توجهی در آموزش کارآمدی محاسباتی دارند، اما در زمان تنظیم دقیق برای تعمیم تلاش می‌کنند که منجر به اورفیت می‌شود.استنتاج: اگرچه یک MOE ممکن است پارامترهای زیادی داشته باشد، اما تنها از برخی از آنها در طول استنتاج استفاده می شود. این مسئله، منجر به استنتاج بسیار سریعتر در مقایسه با یک مدل متراکم با همان تعداد پارامتر می شود. با این حال، تمام پارامترها باید در RAM بارگذاری شوند، بنابراین نیاز به حافظه زیادی دارند. به عنوان مثال، با توجه به MoE مانند Mixtral 8x7B، ما باید VRAM کافی برای نگهداری یک مدل پارامتر متراکم 47B داشته باشیم. حالا چرا پارامترهای 47B و نه 8x7B = 56B؟ به این دلیل که در مدل‌های MoE، تنها لایه‌های FFN به‌عنوان متخصصان در نظر گرفته می‌شوند و بقیه پارامترهای مدل به اشتراک گذاشته می‌شوند. در عین حال، با فرض استفاده از دو متخصص در هر توکن، سرعت استنتاج (FLOPs) مانند استفاده از یک مدل 12B (در مقابل مدل 14B) است، زیرا ضرب های ماتریس 2x7B را محاسبه می کند، اما با برخی از لایه های مشترک.اکنون که ما یک ایده تقریبی از چیستی MOE داریم، بیایید نگاهی به تحولات تحقیقاتی که منجر به اختراع آنها شده است بیندازیم.تاریخچه مختصر ترکیب متخصصانریشه‌های MoEs از مقاله 1991 Adaptive Mixture of Local Experts می‌آید. ایده، شبیه به روش‌های ensemble، داشتن رویه‌ای تحت نظارت برای سیستمی از شبکه‌های مجزا بود که هر کدام زیرمجموعه‌ای متفاوت از دیتای آموزش را مدیریت می‌کردند. هر شبکه مجزا (یا متخصص) در ناحیه متفاوتی از فضای ورودی است. متخصص چگونه انتخاب می شود؟ یک شبکه گیت ، وزن ها را برای هر متخصص تعیین می کند. در طول تمرین، هم متخصص و هم گیت، آموزش می بینند.بین سال‌های 2010-2015، دو حوزه تحقیقاتی مختلف به پیشرفت‌ بعدی ترکیب متخصصان کمک کردند:متخصصان به عنوان اجزاء: در سیستم‌های سنتی MOE، کل سیستم از یک مدل گیت و چندین مدل کوچکتر تشکیل می‌شود. این مدل‌های کوچکتر می‌توانند از انواع مختلفی از الگوریتم‌های یادگیری ماشین، مانند SVMها، فرآیندهای گاوسی یا شبکه‌های عمیق استفاده کنند. این متد امکان استفاده از MOE به عنوان لایه در یک شبکه چند لایه را فراهم می‌کند و این امر باعث می‌شود که مدل‌های MOE هم بزرگ و هم کارآمد باشند.محاسبه شرطی: در روش محاسبه شرطی، Yoshua Bengio روش‌هایی را برای فعال یا غیرفعال کردن پویای مؤلفه‌ها بر اساس توکن ورودی پیشنهاد کرد. این کار باعث می‌شود که شبکه بتواند داده‌های ورودی را به طور کارآمدتری پردازش کند و عملکرد بهتری داشته باشد.این کارها منجر به آزمایش ترکیب متخصصان در زمینه NLP شد. به طور مشخص گوگل این ایده را در LSTM 137B (معماری NLP در آن زمان) استفاده کرد. استنتاج در یک مقیاس بالا و بر ترجمه متمرکز بود اما با چالش‌های زیادی مانند هزینه‌های ارتباطی بالا و بی‌ثباتی در آموزش روبرو بود.‏MoEها امکان آموزش مدل‌های چند تریلیون پارامتری را فراهم کرده‌اند، مانند مدل‌های سوئیچ ترانسفورر با 1.6 تریلیون پارامتر که به صورت کد متن‌باز منتشر شده است. همچنین MoEها در حوزه بینایی کامپیوتر مورد بررسی قرار گرفته‌اند، اما این پست بر روی حوزه پردازش زبان طبیعی (NLP) تمرکز خواهد کرد.پراکندگی (Sparsity) چیست؟‏Sparity از ایده محاسبات شرطی استفاده می کند. در حالی که در مدل‌های متراکم از تمام پارامترها برای همه ورودی‌ها استفاده می‌شود، پراکندگی به ما اجازه می‌دهد فقط برخی از بخش‌های کل سیستم را اجرا کنیم. ایده محاسبات مشروط به افراد اجازه می‌دهد تا اندازه مدل را بدون افزایش محاسبات مقیاس‌پذیر کند و از این رو، این امر منجر به استفاده از هزاران متخصص در هر لایه MoE شد. این تنظیم چند چالش را ایجاد می‌کند. به عنوان مثال، اگرچه اندازه‌های batch بزرگ معمولاً برای عملکرد بهتر هستند، اما اندازه‌های batch در MoE‌ها با جریان داده در متخصصان فعال به طور موثری کاهش می‌یابد. به عنوان مثال، اگر ورودی دسته‌ای ما شامل 10 توکن باشد، ممکن است پنج توکن در یک متخصص و پنج توکن دیگر در پنج متخصص مختلف قرار گیرند که منجر به اندازه‌های batch ناهموار و ناکارآمد شود. چگونه می توانیم این را حل کنیم؟ یک شبکه گیت آموزش داده شده (G) تصمیم می‌گیرد که به کدام متخصصان (E) بخشی از ورودی را ارسال کند:در این تنظیم، همه متخصصان برای همه ورودی‌ها اجرا می‌شوند - این یک ضرب وزنی است. اما اگر G برابر با 0 باشد چه اتفاقی می افتد؟ اگر چنین باشد، نیازی به محاسبه عملیات مربوط به متخصصان نیست و از این رو در محاسبات صرفه جویی می کنیم. یک تابع گیتینگ (gating function) معمولی چیست؟ در سنتی‌ترین حالت، ما فقط از یک شبکه ساده با تابع softmax استفاده می‌کنیم. این شبکه یاد می‌گیرد که کدام متخصص را برای ارسال ورودی انتخاب کند.مکانیسم های دیگر گیت مانند Noisy Top-K Gating هم می‌توان بررسی کرد. این رویکرد، مقداری نویز (قابل تنظیم) را معرفی می کند و سپس مقادیر بالای k را حفظ می کند.مقداری نویز اضافه می کنیمسپس kتا بالا را انتخاب می کنیمسافت مکس را اعمال می کنیم.این روش برخی خواص جالب را به همراه دارد. با استفاده از k کم (مثلاً یک یا دو)، می‌توانیم آموزش و اجرای استنتاج را بسیار سریع‌تر از زمانی که بسیاری از متخصصان فعال هستند، انجام دهیم. چرا فقط متخصص برتر را انتخاب نکنیم؟ حدس اولیه این بود که مسیریابی به بیش از یک متخصص برای یادگیری نحوه مسیریابی به متخصصان مختلف لازم بود، بنابراین حداقل دو متخصص باید انتخاب می‌شدند. بخش «سوئیچ ترانسفورماتورها» این تصمیم را دوباره بررسی می‌کند.توزیع بار توکن‌ها برای MoEهمانطور که قبلاً گفته شد، اگر همه توکن‌های ما فقط به چند متخصص محبوب ارسال شوند، آموزش ناکارآمد خواهد شد و در آموزش MoE ، شبکه گیتینگ برای فعال کردن همان چند متخصص همگرا می‌شود. این کار تقویت هم می‌شود زیرا متخصصان مورد علاقه سریع‌تر آموزش دیده و در نتیجه بیشتر انتخاب می‌شوند. برای کاهش این مشکل، یک loss کمکی اضافه می‌شود تا به دادن اهمیت برابر به همه متخصصان تشویق شود. این loss تضمین می‌کند که همه متخصصان، تقریباً تعداد مساوی از نمونه‌های آموزشی را دریافت می‌کنند. بخش‌های بعدی همچنین مفهوم ظرفیت متخصص را بررسی خواهیم کرد که آستانه‌ای برای تعداد توکن‌هایی که می‌توانند توسط یک متخصص پردازش شوند را معرفی می‌کند. در ترانسفورمرها، loss کمکی از طریق پارامتر aux_loss مورد استفاده قرار می‌گیرد.‏MoE و ترانسفورمرهاترانسفورمرها نمونه بسیار واضحی هستند که نشان می‌دهد افزایش تعداد پارامترها عملکرد را بهبود می‌بخشد، بنابراین تعجب‌آور نیست که گوگل این موضوع را با GShard بررسی کرده است، که مقیاس‌پذیری ترانسفورمرها را فراتر از 600 میلیارد پارامتر بررسی می‌کند.‏GShard هر لایه FFN را با یک لایه MoE با استفاده از گیتینگ top-2 هم در رمزگذار (encoder) و هم در رمزگشا (decoder) جایگزین می‌کند. تصویر بعدی نحوه نمایش آن را برای رمزگذار نشان می‌دهد. این تنظیم برای محاسبات در مقیاس زیاد بسیار مفید است: زمانی که ما به چندین دستگاه مقیاس می‌شویم، لایه MoE در بین دستگاه‌ها به اشتراک گذاشته می‌شود، در حالی که بقیه لایه‌ها تکرار می‌شوند.برای حفظ بار متعادل و کارایی در مقیاس بالا، نویسندگان GShard علاوه بر loss کمکی مشابه آنچه در بخش قبلی مورد بحث قرار گرفت، چند تغییر دبگر هم ایجاد کردند:مسیریابی تصادفی: در یک تنظیم top-2، ما همیشه متخصص برتر را انتخاب می‌کنیم، اما متخصص دوم با احتمالی متناسب با وزن آن انتخاب می‌شود.ظرفیت متخصص: می‌توانیم آستانه‌ای را برای تعداد توکن‌هایی که می‌توانند توسط یک متخصص پردازش شوند، تعیین کنیم. اگر هر دو متخصص به ظرفیت برسند، توکن سرریز شده در نظر گرفته می‌شود و از طریق اتصالات باقیمانده به لایه بعدی ارسال می‌شود (یا در سایر پروژه‌ها به طور کامل حذف می‌شود). این مفهوم به یکی از مهم‌ترین مفاهیم برای MoE تبدیل خواهد شد. چرا به ظرفیت متخصص نیاز است؟ از آنجایی که همه ابعاد تنسور به صورت استاتیک در زمان کامپایل تعیین می‌شود، اما نمی‌توانیم از قبل بدانیم که چند توکن به هر متخصص می‌رود، پس باید فاکتور ظرفیت را ثابت کنیم.زمانی که استنتاج را اجرا می کنیم، فقط برخی از متخصصان فعال می شوند. این به این دلیل است که شبکه گیتینگ تصمیم می گیرد که کدام متخصصان برای هر نمونه داده باید فعال شوند. در نتیجه، تنها پارامترهای متخصصانی که فعال هستند، در محاسبات استفاده می شوند.این نکته مهم است زیرا به ما کمک می کند تا اندازه مدل و محاسبات مورد نیاز برای استنتاج را درک کنیم. به عنوان مثال، اگر یک مدل 47B با 8 متخصص داشته باشیم، می توانیم با محاسبات یک مدل متراکم 12B اجرا کنیم. این به این دلیل است که تنها 12B پارامتر در محاسبات استفاده می شوند و 2B پارامتر اضافی مربوط به متخصصان غیرفعال هستند.فرض کنید یک مدل با 4 متخصص داریم. هر متخصص 10 پارامتر دارد. اگر یک نمونه داده داشته باشیم، ممکن است شبکه گیتینگ تصمیم بگیرد که متخصص 1 و 2 فعال شوند. در این حالت، تنها 20 پارامتر (10 پارامتر برای متخصص 1 و 10 پارامتر برای متخصص 2) در محاسبات استفاده می شوند. 20 پارامتر اضافی مربوط به متخصصان غیرفعال هستند و هرگز استفاده نمی شوند.سوئیچ بین ترانسفورمرها Switch Transformers‏MoE ها پتانسیل زیادی دارند، اما آموزش و تنظیم دقیق آنها دشوار است. سوئیچ ترانسفورماتورها یک کار جدید و هیجان‌انگیز است که به این مشکلات می‌پردازد. نویسندگان این کار، حتی یک مدل MoE با 1.6 تریلیون پارامتر و 2048 متخصص را در Hugging Face منتشر کردند که با کتابخانه transformers قابل اجرا است. سوئیچ ترانسفورمرها، سرعت پیش‌آموزش را 4 برابر T5-XXL افزایش می‌دهد.همانطور که در GShard، نویسندگان لایه‌های FFN را با یک لایه MoE جایگزین کردند. مقاله سوئیچ ترانسفورمرها، لایه Switch Transformer را پیشنهاد می‌کند که دو ورودی (دو توکن مختلف) را دریافت می‌کند و دارای چهار متخصص است.برخلاف ایده اولیه استفاده از حداقل دو متخصص، سوئیچ ترانسفورمرها از استراتژی متخصص واحد ساده شده استفاده می‌کنند. اثرات این رویکرد عبارتند از:کاهش محاسبات روتر: با نیاز به مسیریابی برای تنها یک متخصص، بار محاسباتی روتر کاهش می یابد.کاهش حداقل اندازه دسته هر متخصص: با ارسال نیمی از توکن ها به هر متخصص، حداقل اندازه batch مورد نیاز برای هر متخصص نصف می شود.کاهش هزینه‌های ارتباطی: با ارسال توکن‌های کمتر بین متخصصان، هزینه‌های ارتباطی کاهش می‌یابد.حفظ کیفیت: با وجود استفاده از یک متخصص واحد، مدل همچنان عملکرد با کیفیت بالا را حفظ می‌کند.سوئیچ ترانسفورمرها همچنین مفهوم ظرفیت متخصص را بررسی می‌کنند که آستانه‌ای برای تعداد توکن‌هایی که می‌توانند توسط یک متخصص پردازش شوند را تعیین می‌کند.قدم به قدم 1. ورودی‌ها بلوک MoE دو توکن(آبی، نارنجی) دریافت می‌کند. 2. شبکه گیتینگ پردازش X1 (توکن آبی) را انجام می‌دهد و تعیین می‌کند Expert 2 باید فعال شود. 3. Expert 2 پردازش X1 (توکن آبی) را انجام می‌دهد. 4. شبکه گیتینگ پردازش X2 (توکن نارنجی) را انجام می‌دهد و تعیین می‌کند Expert 1 باید فعال شود. 5. Expert 1 پردازش X2 (توکن نارنجی) را انجام می‌دهد. 6. تابع فعال سازی ReLU خروجی های متخصصان را پردازش کرده و خروجی نهایی را تولید می کند.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Wed, 13 Dec 2023 09:51:49 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش LangChain: راهنمای ساخت برنامه کاربردی با LLM</title>
                <link>https://virgool.io/@Aleereza/%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-langchain-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%A8%D8%A7-llm-l1sbigbe4mik</link>
                <description>از زمان انتشار ChatGPT،مدل های زبان بزرگ (LLM) محبوبیت زیادی به دست آورده اند. مدل‌های زبان بزرگ (LLM) مدل‌های یادگیری ماشینی قدرتمندی هستند که برای طیف گسترده‌ای از کاربردها می‌توانند استفاده شوند، مثل:ساخت دستیارهای شخصی که می‌توانند به سؤالات شما پاسخ دهند و درخواست‌های شما را انجام دهند.ایجاد چت‌بات‌های سفارشی برای نیازهای خاص.تجزیه و تحلیل و خلاصه‌سازی اسناد یا کد.‏LLM ها از پیش آموزش دیده هستند، یعنی بر روی مجموعه داده‌های عظیم متنی آموزش دیده‌اند. این یعنی که می‌توانند الگوهای زبانی را درک کنند و از آنها برای تولید متن استفاده کنند.با این حال، LLM‌ها به تنهایی برای ساخت برنامه‌های قدرتمند کافی نیستند. قدرت واقعی زمانی ظاهر می شود که بتوانید آنها را با منابع محاسباتی یا اطلاعات دیگر ترکیب کنید.در این آموزش، Langchain را بررسی می‌کنیم، یک کتابخانه که به ما امکان می‌دهد برنامه های AI را با ترکیب اجزای مختلف مانند Model Wrappers، Chains، Agents و غیره توسعه دهیم.کتابخانه LangChain هم به صورت پایتون و هم به صورت جاوا اسکریپت در دسترس است، ولی ما برای این آموزش از کتابخانه پایتون استفاده می کنیم.‏LangChain یک فریمورک متن‌باز (مخزن گیت‌هاب) است که به شما کمک می‌کند تا برنامه‌های مبتنی بر مدل‌های زبان بزرگ (LLM) را آسان‌تر بسازید:یک رابط کاربری برای انواع اجرای وظایف مختلف پایه(چت‌بات‌، خلاصه‌سازی، ترجمه و... ).فریمورکی برای مدیریت پرامپت‌های شما.یک رابط کاربری با حافظه‌ی بلند مدت با امکان دسترسی به داده‌های خارجی، دسترسی به سایر LLMها و همچنین کارهایی که یک LLM قادر به انجام آن‌ها نیست.از آنجایی که LangChain دارای قابلیت‌های مختلفی است، ممکن است در ابتدا درک آن دشوار باشد. به همین دلیل در این پست به بررسی شش ماژول کلیدی LangChain خواهیم پرداخت تا درک بهتری از توانایی‌های آن به دست آوریم.نصب LangChainبرای نصب بسته LangChain پایتون، می توانید آن را با pip نصب کنید.pip install langchainپس از نصب، بسته LangChain  پایتون را import کنید.import langchainکلیدهای APIبرای ساخت یک برنامه با LLM، به کلیدهای API برای بعضی از خدماتی که می خواهید استفاده کنید نیاز دارید. برای استفاده از برخی از این APIها بایستی هزینه آن را پرداخت کنید.مدل‌های اختصاصی، مدل‌های قدرتمندی هستند که توسط شرکت‌های بزرگ با منابع مالی و متخصصان فراوان توسعه داده می‌شوند. این مدل‌ها معمولاً از مدل‌های متن‌باز بزرگتر هستند و بنابراین عملکرد بهتری دارند. با این حال، APIهای آنها نیز گران‌تر هستند. نمونه هایی از ارائه دهندگان مدل اختصاصی OpenAI، co:here، AI21 Labs یا Anthropic هستند.بیشتر آموزش های موجود LangChain از OpenAI استفاده می‌کنند، اما توجه داشته باشید که OpenAI API برای تست گران نیست اما رایگان هم نیست. برای دریافت کلید OpenAI API، به یک حساب OpenAI و سپس «Create new secret key» در بخش API keys نیاز دارید.import os
os.environ[&amp;quotOPENAI_API_KEY&amp;quot] = ... # insert your API_TOKEN hereمدل‌های متن‌باز معمولاً مدل‌های کوچک‌تر با قابلیت‌های کمتر نسبت به مدل‌های اختصاصی هستند، اما مقرون به صرفه‌تر از مدل‌های اختصاصی هستند. نمونه‌‌هایی از مدل‌های منبع باز عبارتند از:‏‏BLOOM از BigScience‏‏LLaMA از Meta AI‏‏Flan-T5 از Google‏‏GPT-J از Eleuther AIبسیاری از مدل‌های متن‌باز در Hugging Face میزبانی می‌شوند. برای به دست آوردن کلید API Hugging Face، به یک حساب کاربری Hugging Face نیاز دارید و «New token» در زیر Access Tokens ایجاد کنید.import os
os.environ[&amp;quotHUGGINGFACEHUB_API_TOKEN&amp;quot] = ... # insert your API_TOKEN hereمی‌توانید از Hugging Face به صورت رایگان برای LLM‌های متن‌باز استفاده کنید، اما محدود به LLM‌های کوچکتر با عملکرد کمتر خواهید شد.راهنمای شخصی: برای اکثر مثال‌ها می‌توان مدل‌های متن‌باز را استفاده کرد که در اکثر موارد کار می‌کند، اما استفاده از آن در چند مورد دردسرساز می‌شود. پیشنهاد می‌کنم یک حساب برای OpenAI بسازید و با خرید یک شماره مجازی (مثلا از این سایت) به توکن API آن دسترسی داشته باشید. به نظر می‌رسد اکثر مثالهای LangChain برای API OpenAI بهینه شده‌اند.دیتابیس برداریاگر می‌خواهید از یک پایگاه داده برداری خاص مانند Pinecone، Weaviate یا Milvus استفاده کنید، باید برای آنها ثبت‌نام کنید تا یک کلید API دریافت کنید که باید قیمت آنها را هم بررسی کنید. در این آموزش از Faiss استفاده می‌کنیم که نیازی به ثبت‌نام ندارد.بسته به ابزارهایی که می‌خواهید LLM با آنها تعامل داشته باشد مانند اطلاعات آب و هوا OpenWeatherMap یا SerpAPI، ممکن است لازم باشد برای آنها ثبت‌نام کنید تا یک کلید API دریافت کنید. در این آموزش، ما فقط از ابزارهایی استفاده می کنیم که نیازی به کلید API ندارند.‏LangChain (نسخه 0.0.147) شش ماژول زیر را پوشش می‌دهد:‏Models (مدل‌ها): انتخاب از بین مدل‌های LLM و ویرایش‌های متفاوت آنها‏Prompts (پرامپت‌ها): مدیریت ورودی‌های LLM‏Chains (زنجیره‌ها): ترکیب LLM ها با سایر اجزا‏Indexes (ایندکس‌‌ها): دسترسی به داده‌های خارجی‏Memory (حافظه): به خاطر سپردن مکالمات قبلی‏Agents (ایجنت): دسترسی به سایر ابزارهاکدهای نمونه در بخش‌های بعدی از مستندات LangChain کپی و اصلاح شده‌اند.1- مدل ها: انتخاب از بین LLM های مختلف و مدل های امبدینگدر حال حاضر، LLM های بسیاری در حال ظهور هستند. LangChain یکپارچه‌سازی با طیف گسترده‌ای از مدل‌ها و ایجاد یک رابط کاربری کارآمد برای آنها را ارائه می‌دهد.LangChain بین سه نوع مدل که در ورودی و خروجی متفاوت هستند تفاوت قائل می‌شود:‏LLM‌ها یک رشته متن را به عنوان ورودی (پرامپت‌) می گیرند یک رشته متن (completion) خروجی می‌دهند.# Proprietary LLM from e.g. OpenAI
# pip install openai
from langchain.llms import OpenAI
llm = OpenAI(model_name=&amp;quottext-davinci-003&amp;quot)

# Alternatively, open-source LLM hosted on Hugging Face
# pip install huggingface_hub
from langchain import HuggingFaceHub
llm = HuggingFaceHub(repo_id = &amp;quotgoogle/flan-t5-xl&amp;quot)

# The LLM takes a prompt as an input and outputs a completion
prompt = &amp;quotAlice has a parrot. What animal is Alice&#039;s pet?&amp;quot
completion = llm(prompt)مدل‌های چت، مشابه مدل‌های LLM هستند. آنها لیستی از پیام‌های چت را به عنوان ورودی می‌گیرند و یک پیام چت را برمی‌گردانند.مدل‌های امبدینگ، متن ورودی را دریافت می‌کنند و فهرستی از امبدینگ‌ها را برمی‌گردانند که یک نمایش عددی از متن ورودی هستند. امبدینگ‌ها به استخراج اطلاعات از متن کمک می کنند. این اطلاعات می‌تواند بعداً به عنوان مثال برای محاسبه شباهت‌های بین متون مورد استفاده قرار گیرد.# Proprietary text embedding model from e.g. OpenAI
# pip install tiktoken
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()

# Alternatively, open-source text embedding model hosted on Hugging Face
# pip install sentence_transformers
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name = &amp;quotsentence-transformers/all-MiniLM-L6-v2&amp;quot)

# The embeddings model takes a text as an input and outputs a list of floats
text = &amp;quotAlice has a parrot. What animal is Alice&#039;s pet?&amp;quot
text_embedding = embeddings.embed_query(text)2- پرامپت‌ها: مدیریت ورودی‌های LLM‏LLM ها دارای ویژگی‌های عجیب و غریب هستند. اگرچه وارد کردن پرامپت‌‌ها به زبان طبیعی نباید پیچیدگی خاصی داشته باشد، اما تا زمانی که خروجی دلخواه را از LLM دریافت کنید، نیاز به مقداری تنظیم پرامپت‌‌ دارید. این فرایند به نام مهندسی پرامپت‌‌ (prompt engineering) خوانده می شود.هنگامی که یک پرامپت‌‌ خوب دارید، ممکن است بخواهید از آن به عنوان یک قالب برای سایر موارد استفاده کنید. بنابراین، LangChain به شما  PromptTemplates را ارائه می‌دهد که به شما کمک می‌کند تا پرامپت‌‌های خود را از چند مؤلفه تشکیل دهید.from langchain import PromptTemplate

template = &amp;quotWhat is a good name for a company that makes {product}?&amp;quot

prompt = PromptTemplate(
    input_variables=[&amp;quotproduct&amp;quot],
    template=template,
)

prompt.format(product=&amp;quotcolorful socks&amp;quot)پرامپت‌‌ بالا را می توان به عنوان یک تنظیم zero-shot در نظر گرفت که در آن امیدوارید LLM بر روی داده‌های مرتبط به اندازه کافی برای ارائه پاسخ رضایت‌بخش، آموزش دیده باشد.یکی دیگر از ترفندها برای گرفتن خروجی بهتر اضافه کردن چند مثال در پرامپت‌‌ و تبدیل آن به یک تنظیم few-shot است.from langchain import PromptTemplate, FewShotPromptTemplate

examples = [
    {&amp;quotword&amp;quot: &amp;quothappy&amp;quot, &amp;quotantonym&amp;quot: &amp;quotsad&amp;quot},
    {&amp;quotword&amp;quot: &amp;quottall&amp;quot, &amp;quotantonym&amp;quot: &amp;quotshort&amp;quot},
]

example_template = &amp;quot&amp;quot&amp;quot
Word: {word}
Antonym: {antonym}\n
&amp;quot&amp;quot&amp;quot

example_prompt = PromptTemplate(
    input_variables=[&amp;quotword&amp;quot, &amp;quotantonym&amp;quot],
    template=example_template,
)

few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix=&amp;quotGive the antonym of every input&amp;quot,
    suffix=&amp;quotWord: {input}\nAntonym:&amp;quot,
    input_variables=[&amp;quotinput&amp;quot],
    example_separator=&amp;quot\n&amp;quot,
)

few_shot_prompt.format(input=&amp;quotbig&amp;quot)کد بالا یک قالب پرامپت ایجاد می‌کند و بر اساس مثال‌ها و ورودی‌ها، دستور زیر را می نویسد:Give the antonym of every input

Word: happy
Antonym: sad

Word: tall
Antonym: short

Word: big
Antonym:3- زنجیره‌ها (Chains): ترکیب LLM‌‌ها با اجزای دیگر‏Chaining در LangChain به سادگی فرآیند ترکیب LLM‌ها با اجزای دیگر برای ایجاد یک برنامه کاربردی را توصیف می‌کند. چند نمونه عبارتند از:ترکیب LLM با قالب‌های پرامپتترکیب چندین LLM به صورت متوالی با گرفتن خروجی LLM اول به عنوان ورودی برای LLM دومترکیب LLM با داده های خارجی، به عنوان مثال، برای پاسخ به سؤالترکیب LLM با حافظه بلند مدت، به عنوان مثال، برای تاریخچه چتدر قسمت قبل یک قالب پرامپت ایجاد کردیم. هنگامی که می خواهیم از آن برای LLM خودمان استفاده کنیم، می توانیم از یک LLMChainبه صورت زیر استفاده کنیم:from langchain.chains import LLMChain

chain = LLMChain(llm = llm, 
                  prompt = prompt)

# Run the chain only specifying the input variable.
chain.run(&amp;quotcolorful socks&amp;quot)اگر بخواهیم از خروجی این LLM اول به عنوان ورودی برای LLM دوم استفاده کنیم، می‌توانیم از SimpleSequentialChain استفاده کنیم:from langchain.chains import LLMChain, SimpleSequentialChain

# Define the first chain as in the previous code example
# ...

# Create a second chain with a prompt template and an LLM
second_prompt = PromptTemplate(
    input_variables=[&amp;quotcompany_name&amp;quot],
    template=&amp;quotWrite a catchphrase for the following company: {company_name}&amp;quot,
)

chain_two = LLMChain(llm=llm, prompt=second_prompt)

# Combine the first and the second chain 
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)

# Run the chain specifying only the input variable for the first chain.
catchphrase = overall_chain.run(&amp;quotcolorful socks&amp;quot)4- ایندکس‌ها: دسترسی به داده‌های خارجییکی از محدودیت‌های LLM‌ها فقدان اطلاعاتی مانند دسترسی به برخی اسناد یا ایمیل‌های خاص است. شما می‌توانید با دادن دسترسی LLM‌ها به داده‌های خارجی با این موضوع مبارزه کنید.برای این کار ابتدا باید داده‌های خارجی را با یک بارگذار سند بارگیری کنید. LangChain انواع لودرها را برای انواع مختلف اسناد اعم از PDF و ایمیل گرفته تا وب سایت‌ها و ویدیوهای YouTube ارائه می‌دهد.بیایید برخی از داده های خارجی را از یک ویدیوی YouTube بارگیری کنیم. اگر می خواهید یک سند متنی بزرگ را بارگیری کنید و آن را با یک تقسیم کننده متن تقسیم کنید، می توانید به داکیومنت LangChain مراجعه کنید.# pip install youtube-transcript-api
# pip install pytube

from langchain.document_loaders import YoutubeLoader

loader = YoutubeLoader.from_youtube_url(&amp;quothttps://www.youtube.com/watch?v=dQw4w9WgXcQ&amp;quot)
 
documents = loader.load()در اینجا داده‌ها را آماده ارسال با اسم documentsدارید، می توانید آن‌ را با یک مدل امبدینگ متن در یک دیتابیس برداری (یک VectorStore) فهرست کنید. دیتابیس برداری محبوب شامل Pinecone، Weaviate و Milvus است. در این پست، ما از Faiss استفاده می‌کنیم چون به کلید API نیاز ندارد.# pip install faiss-cpu
from langchain.vectorstores import FAISS

# create the vectorestore to use as the index
db = FAISS.from_documents(documents, embeddings)سند شما (در اینجا، یک ویدیو) به عنوان امبدینگ در یک دیتابیس برداری ذخیره می شود.حالا می‌توانید کارهای مختلفی را با این داده‌های خارجی انجام دهید. بیایید از آن برای پاسخگویی به سؤال با بازیابی اطلاعات استفاده کنیم:from langchain.chains import RetrievalQA

retriever = db.as_retriever()

qa = RetrievalQA.from_chain_type(
    llm=llm, 
    chain_type=&amp;quotstuff&amp;quot, 
    retriever=retriever, 
    return_source_documents=True)

query = &amp;quotWhat am I never going to do?&amp;quot
result = qa({&amp;quotquery&amp;quot: query})

print(result[&#039;result&#039;])خروجی RetrievalQA:5- حافظه: یادآوری مکالمات قبلیبرای برنامه هایی مانند ربات های چت، ضروری است که آنها بتوانند مکالمات قبلی را به خاطر بسپارند. اما به طور پیش‌فرض، LLM‌ها هیچ حافظه بلندمدتی ندارند مگر اینکه تاریخچه چت را وارد کنید.‏LangChain این مشکل را با ارائه چند گزینه مختلف برای مقابله با تاریخچه چت حل می کند:‏تمام مکالمات را حفظ کنیدآخرین مکالمات k را حفظ کنیدگفتگو را خلاصه کنیددر این مثال، ما از یک ConversationChainبرای دادن حافظه مکالمه به این برنامه استفاده خواهیم کرد.from langchain import ConversationChain

conversation = ConversationChain(llm=llm, verbose=True)

conversation.predict(input=&amp;quotAlice has a parrot.&amp;quot)

conversation.predict(input=&amp;quotBob has two cats.&amp;quot)

conversation.predict(input=&amp;quotHow many pets do Alice and Bob have?&amp;quot)این منجر به مکالمه سمت راست در تصویر زیر می شود. بدون ConversationChainبرای حفظ یک حافظه مکالمه، مکالمه مانند مکالمه سمت چپ خواهد بود.6 -ایجنت (Agents): دسترسی به ابزارهای دیگرعلیرغم قدرتمند بودن، LLM ها محدودیت‌هایی هم دارند: آنها فاقد اطلاعات زمینه‌ای هستند (مانند دسترسی به دانش خاصی که در داده‌های آموزش موجود نبوده) یا اطلاعاتی که می‌‌توانند به سرعت منسوخ شوند (به عنوان مثال، GPT-4 بر روی داده‌های قبل از سپتامبر 2021 آموزش داده شده است) و یا اینکه آنها در ریاضی واقعا بد هستند.از آنجایی که LLM‌ها می‌توانند در مورد کارهایی که به تنهایی نمی توانند انجام دهند توهم بزنند ما باید به آنها دسترسی به ابزارهای تکمیلی مانند جستجو (به عنوان مثال جستجوی گوگل)، ماشین حساب (مانند Python REPL یا Wolfram Alpha) بدهیم.علاوه بر این، ما به عامل‌هایی نیاز داریم که در مورد استفاده از ابزارها برای انجام یک کار بر اساس خروجی LLM  تصمیم بگیرند.در زیر مثالی وجود دارد که در آن ایجنت ابتدا تاریخ تولد باراک اوباما را با ویکی‌پدیا جستجو می‌کند و سپس سن او را در سال 2022 با ماشین حساب محاسبه می‌کند.# pip install wikipedia
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType

tools = load_tools([&amp;quotwikipedia&amp;quot, &amp;quotllm-math&amp;quot], llm=llm)
agent = initialize_agent(tools, 
                         llm, 
                         agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, 
                         verbose=True)


agent.run(&amp;quotWhen was Barack Obama born? How old was he in 2022?&amp;quot)</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Sat, 09 Dec 2023 21:48:34 +0330</pubDate>
            </item>
                    <item>
                <title>معماری Llama 2: چه چیزی آن را خاص می کند؟</title>
                <link>https://virgool.io/newdima/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-llama2-%DA%86%D9%87-%DA%86%DB%8C%D8%B2%DB%8C-%D8%A2%D9%86-%D8%B1%D8%A7-%D8%AE%D8%A7%D8%B5-%D9%85%DB%8C-%DA%A9%D9%86%D8%AF-xed2xjajohxj</link>
                <description>متا مدل زبان بزرگ خود را در سال 2023 به دنیا معرفی کرد و تنها چند ماه بعد، آن را به Llama 2 ارتقا داد و دنیایی از فرصت‌ها را برای کسب‌وکارها، استارت‌آپ‌ها، کارآفرینان و محققان باز کرد تا از مزایای اقتصادی و اجتماعی آن بهره ببرند.‏LLaMA درست مانند اکثر مدل‌های زبان بزرگ، مبتنی بر معماری ترانسفورمر است که یک معماری استاندارد برای مدل‌سازی زبان از سال 2018 تا به حال است. با این وجود، LLaMA چند بهبود نسبت به معماری اصلی ترانسفورمر معرفی می‌کند که به آن اجازه می‌دهد تا وابستگی‌های طولانی‌تر را در متن یاد بگیرد و عملکرد بهتری در پاسخگویی به سؤالات و یا خلاصه نویسی داشته باشد.معماری LLaMA چه تفاوتی با سایر مدل های LLM دارد؟معماری مدل LLaMa2 بر اساس معماری ترانسفورمر است، با چندین اصلاح و بهبود الهام گرفته از مدل‌های قبلی مانند GPT3، PalM، و GPTNeo. در کد زیر، معماری کلی مدل  llama 7b  آمده است. در ادامه به بخشهایی از این معماری می پردازیم که با ایده متفاوت نسبت به مدلهای دیگر مطرح شده است.LlamaModel(    (embed_tokens): Embedding(32000, 4096, padding_idx=0)    (layers): ModuleList(      (0-31): 32 x LlamaDecoderLayer(        (self_attn): LlamaAttention(          (q_proj): Linear8bitLt(in_features=4096, out_features=4096, bias=False)          (k_proj): Linear8bitLt(in_features=4096, out_features=4096, bias=False)          (v_proj): Linear8bitLt(in_features=4096, out_features=4096, bias=False)          (o_proj): Linear8bitLt(in_features=4096, out_features=4096, bias=False)          (rotary_emb): LlamaRotaryEmbedding()        )        (mlp): LlamaMLP(          (gate_proj): Linear8bitLt(in_features=4096, out_features=11008, bias=False)          (up_proj): Linear8bitLt(in_features=4096, out_features=11008, bias=False)          (down_proj): Linear8bitLt(in_features=11008, out_features=4096, bias=False) (act_fn): SiLUActivation()        )        (input_layernorm): LlamaRMSNorm()        (post_attention_layernorm): LlamaRMSNorm()      )    )    (norm): LlamaRMSNorm()  )  (lm_head): Linear(in_features=4096, out_features=32000, bias=False)نرمال‌سازی (normalisation) با استفاده از RMSNorm:‏RMSNorm تکنیکی است که برای نرمال‌سازی تابع فعال‌سازی (activation function) لایه های شبکه عصبی استفاده می شود. در این فرآیند، توابع فعال‌سازی به گونه‌ای تغییر می‌کنند که مقادیر آن‌ها در یک مقیاس مشترک قرار گیرند. هدف از این عمل، تسهیل تحلیل و مدل‌سازی داده‌ها است و همچنین باعث کاهش تأثیر مقیاس‌های مختلف بر دقت مدل‌های یادگیری ماشین می‌شود.تابع نرمال‌سازی RMSNorm توسط Zhang و Sennrich در یک مقاله تحقیقاتی در سال 2019 معرفی شد.RMSNorm ساده شده لایه نرمال‌سازی (LayerNorm) است. LayerNorm یک تکنیک نرمال‌سازی است که می‌تواند مشکل internal covariate shift را کنترل کند تا خروجی لایه فعال‌سازی تثبیت شود و همگرایی مدل را بهبود بخشد. LayerNorm به این صورت عمل می‌کند که میانگین را از خروجی تابع فعال‌سازی کم می‌کند و سپس نتیجه را بر انحراف معیار خروجی تقسیم می‌کند. این روش در مدلهای مبتنی بر NLP کاملاً موفق بوده است و به یک جزء ضروری برای بهینه سازی مدل تبدیل شده است.‏RMSNorm عملکرد قابل مقایسه ای در مقابل LayerNorm به دست می آورد اما زمان اجرا را از 7٪ تا 64٪ کاهش می دهد.‏GPT و Palm از LayerNorm برای نرمال‌سازی استفاده می کنند.چگونه RMSNorm عملکرد بهتری دارد:‏RMSNorm نسبت به داده های پرت (outlier) قوی‌تر است که به دلیل این است که از انحراف استاندارد بهره نمی‌برد، بلکه خروجی تابع فعال‌سازی یک لایه را با تقسیم بر مقدار میانگین مربع ریشه فعال‌سازی‌ها نرمال می‌کند. این به این معناست که مقدار RMS (ریشه میانگین مربع) از جایگزینی برای انحراف استاندارد در فرآیند نرمال‌سازی استفاده می‌شود.فرمول RMSNorm برای یک ویژگی (feature) خاص به شکل زیر است:‏RMSNorm برای محاسبه کارآمدتر است. این به این دلیل است که RMSNorm فقط به محاسبه ریشه دوم مقادیر نیاز دارد، در حالی که LayerNorm نیاز به محاسبه ریشه دوم و میانگین مقادیر دارد.نشان داده شده است که RMSNorm عملکرد را در مدلسازی زبان بهبود می بخشد که احتمالاً به این دلیل است که نسبت به موارد پرت قوی‌تر و برای محاسبه کارآمدتر است.تابع فعال سازی SwiGLU‏LLaMa مشکل غیر خطی بودن تابع فعال‌سازی ReLU را با تابع فعال‌سازی SwiGLU که توسط Shazeer در سال 2020 برای بهبود عملکرد معماری ترانسفورمر معرفی شد جایگزین کرده است.‏ReLU یک تابع فعال سازی غیرخطی است، به این معنی که می تواند روابط پیچیده بین متغیرهای ورودی و خروجی را یاد بگیرد. در عوض ‏SwiGLU یک تابع فعال‌سازی جدیدتر است که نشان داده شده است در معماری‌های شبکه عصبی خاص از ReLU بهتر عمل می‌کند.‏این تابع ترکیبی از تابع‌های فعال سازی Swish و Gated Linear Unit (GLU) است و یک تابع smooth و غیر یکنواخت به حساب میاید که نشان داده شده عملکرد شبکه های عصبی را در کارهای مختلف بهبود می بخشد.تابع فعال سازی GLU یک مکانیسم دروازه ای است که می تواند برای کنترل جریان اطلاعات از طریق یک شبکه عصبی استفاده شود.‏GPT از تابع فعال سازی ReLU استفاده می کند در حالی که Palm از SwiGLU نیز استفاده می کند.مزایای SwiGLU نسبت به ReLU:بهبود عملکرد: نشان داده شده است که SwiGLU عملکرد مدل‌های زبانی را در کارهای مختلف، از جمله مدل‌سازی زبان، ترجمه و پاسخ‌گویی به سؤال بهبود می‌بخشد.کاهش اورفیت: SwiGLU می‌تواند با جلوگیری از یادگیری بیش از حد رابطه بین ویژگی‌ها و متغیر هدف، به کاهش بیش‌برازش در مدل‌های زبانی کمک کند.افزایش کارایی: SwiGLU یک تابع فعال سازی کارآمد از لحاظ محاسبه است که آن را برای استفاده در مدل های زبان بزرگ مناسب می کند.با این حال، SwiGLU هنوز یک تابع فعال سازی نسبتا جدید است و به اندازه ReLU آزمایش نشده است. ممکن است که SwiGLU در تمام وظایف مدلسازی زبان به خوبی ReLU عمل نکند.‏Rotary Embeddings:‏LLaMa امبدینگهای موقعیتی (positional embedding) مطلق را حذف می‌کند و امبدینگهای موقعیتی چرخشی (RoPE) را در هر لایه از شبکه ترکیب می‌کند. این امبدینگ توسط سو و همکاران در سال 2021 معرفی شدند.در Rotary Position Embedding (RoPE)، هر امبدینگ موقعیتی مجموعه ای از توابع سینوس و کسینوس با فرکانس های مختلف است که موقعیت های مختلف را در دنباله نشان می دهد.برخلاف امبدینگ موقعیتی سنتی که اطلاعات موقعیتی را اضافه می‌کند، امبدینگ موقعیتی چرخشی، امبدینگ توکنها را در فضایی با ابعاد بالا می‌چرخاند، بنابراین اطلاعات اصلی را حفظ می‌کند و در عین حال اطلاعات موقعیتی را نیز در بر می‌گیرد.اطلاعات موقعیتی به روشی مبتنی بر چرخش به دلیل ویژگی‌های منحصربه‌فرد عملیات چرخش در فضاهای برداری، به‌ویژه حفظ طول و زاویه بین بردارها، اضافه می‌شود. حفظ‌ این ویژگی‌ها به حفظ یکپارچگی امبدینگ توکنها کمک می‌کنند و در عین حال آنها را با اطلاعات توالی ترکیب می‌کنند.‏ChatGPT و Bard هر دو مدل های زبان بزرگ (LLM) هستند که از امبدینگ‌های موقعیتی برای نمایش ترتیب کلمات در یک جمله استفاده می کنند. با این حال، ChatGPT از توابع سنتی سینوسی و کسینوس استفاده می کند، در حالی که Bard از تعبیه های چرخشی استفاده می کند.مزایای امبدینگ موقعیتی چرخشی:امبدینگ موقعیتی چرخشی چندین مزیت کلیدی دارد:عدم تغییر نسبت به طول دنباله: برخلاف امبدینگهای موقعیتی سنتی، RoPE می‌تواند امبدینگهای موقعیت را در لحظه برای هر طولی از دنباله‌ها ایجاد کند و به حداکثر طول دنباله از پیش تعریف‌شده نیاز ندارد.بهبود عملکرد مدل: با حفظ طول و زوایای بین بردارها، RoPE امکان استفاده دقیق‌تر و ظریف‌تر از امبدینگهای توکن را فراهم می‌کند که می‌تواند منجر به عملکرد بهتر مدل در کارهایی شود که به شدت به اطلاعات موقعیتی متکی هستند.کارایی و هزینه محاسباتی کمتر: از آنجایی که RoPE می تواند امبدینگ موقعیت را به صورت on-the-fly محاسبه کند، می تواند حافظه و منابع محاسباتی را حفظ کرده و آن را به انتخاب کارآمدتری برای مدل های در مقیاس بزرگ تبدیل کند.هدف مدل LLaMa با ترکیب این تغییرات معماری، افزایش پایداری آموزش، بهبود عملکرد و اصلاح رمزگذاری موقعیتی است.‏</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Sat, 02 Dec 2023 18:31:07 +0330</pubDate>
            </item>
                    <item>
                <title>معیار ROUGE در پردازش زبان طبیعی با مثال</title>
                <link>https://virgool.io/@Aleereza/%D9%85%D8%AA%D8%B1%DB%8C%DA%A9-rouge-%D8%AF%D8%B1-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B7%D8%A8%DB%8C%D8%B9%DB%8C-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-mo2wuyn4ud3u</link>
                <description>‏همانطور که پردازش زبان طبیعی (NLP) به پیشرفت خود ادامه می دهد، نیاز به ارزیابی مدل های NLP اهمیت فزاینده ای پیدا می کند.معیارهای ارزیابی NLP به محققان و متخصصان این امکان را می دهد تا عملکرد مدل های NLP را به طور عینی ارزیابی کرده و آنها را برای تصمیم گیری بهتر مقایسه کنند.دو معیار رایج در زمینه ارزیابی NLP امتیازات BLEU و ROUGE هستند. در این پست، به معیار ROUGE خواهیم پرداخت و اهمیت آنها را در ارزیابی مدل های NLP درک خواهیم کرد. همچنین در این پست معیار BLEU توضیح دادیم. معیار ROUGE‏ (Recall-Oriented Understudy for Gisting Evaluation)، مجموعه ای از معیارها و یک بسته نرم افزاری است که به طور خاص برای ارزیابی خلاصه سازی ماشینی طراحی شده است، اما می توان از آن برای ترجمه ماشینی نیز استفاده کرد. این معیارها یک خلاصه یا ترجمه ماشینی را با خلاصه ها یا ترجمه های مرجع (با کیفیت بالا و تولید شده توسط انسان) مقایسه می کند.‏‏‏ROUGE-N‏ROUGE-N تعداد n-گرم تطبیق بین متن تولید شده توسط مدل و مرجع تولید شده توسط انسان را اندازه گیری می کند.دنباله مرجع R و خلاصه C را در نظر بگیرید:R: The cat is on the mat.C: The cat and the dog.‏‏‏‏ROUGE-1با استفاده از R و C، می‌خواهیم precision و recall و F1-score  را محاسبه کنیم. بیایید محاسبه ROUGE-1 را فقط با در نظر گرفتن 1-گرم شروع کنیم.‏ROUGE-1 precision را می توان به عنوان نسبت تعداد 1-گرم ها در C که در R نیز ظاهر می شود (عبارتند از کلمات &quot;the&quot;، &quot;cat&quot; و &quot;the&quot;) به تعداد 1-گرم ها در C محاسبه کرد.ROUGE-1 precision = 3/5 = 0.6‏ROUGE-1 recall را می‌توان به عنوان نسبت تعداد 1-گرم‌های R که در C (که عبارت‌اند از کلمات &quot;the&quot;، &quot;cat&quot; و &quot;the&quot;) به تعداد 1-گرم‌ها در R محاسبه می‌شود.ROUGE-1 recall = 3/6 = 0.5سپس، ROUGE-1 F1-score را می توان مستقیماً از ROUGE-1 precision و ROUGE-1 recall  با استفاده از فرمول استاندارد F1-score به دست آورد.ROUGE-1 F1-score = 2 * (precision * recall) / (precision + recall) = 0.54‏‏ROUGE-2بیایید سعی کنیم ROUGE-2 را با در نظر گرفتن 2-گرم محاسبه کنیم.دنباله مرجع R و خلاصه C را به خاطر بسپارید:R: The cat is on the mat.C: The cat and the dog.‏ROUGE-2 precision نسبت تعداد 2-گرم در C است که در R نیز ظاهر می شود (فقط 2-گرم “the cat”)، به تعداد کل 2-گرم در C.ROUGE-2 precision = 1/4 = 0.25‏ROUGE-2 recall نسبت تعداد 2-گرم در R است که در C نیز ظاهر می شود (فقط 2-گرم “the cat”)، به تعداد کل 2-گرم در R.ROUGE-2 recall = 1/5 = 0.20و F1-score:ROUGE-2 F1-score = 2 * (precision * recall) / (precision + recall) = 0.22‏ROUGE-L‏ROUGE-L بر اساس طولانی‌ترین دنباله مشترک (LCS)longest common subsequence بین خروجی مدل و مرجع است، یعنی طولانی‌ترین دنباله کلمات (نه لزوماً متوالی، اما همچنان به ترتیب) که بین هر دو مشترک است. یک دنباله مشترک طولانی تر باید نشان دهنده شباهت بیشتر بین دو دنباله باشد.ما می‌توانیم ROUGE-L recall, precision و F1-score را درست مانند ROUGE-N محاسبه کنیم، اما این بار هر n-gram مطابقت را با LCS جایگزین می‌کنیم.دنباله مرجع R و خلاصه C را به خاطر بسپارید:R: The cat is on the mat.C: The cat and the dog.‏LCS دنباله 3-گرمی “the cat the” است (به یاد داشته باشید که کلمات لزوماً پشت سر هم نیستند) که در هر دو R و C ظاهر می شود.‏ROUGE-L precision نسبت طول LCS به تعداد یونی گرم در C است.ROUGE-L precision = 3/5 = 0.6‏ROUGE-L recall نسبت طول LCS به تعداد یونی گرم در R است.ROUGE-L recall = 3/6 = 0.5و F1-score:ROUGE-L F1-score = 2 * (precision * recall) / (precision + recall) = 0.55‏ROUGE-S‏ROUGE-S به ما اجازه می دهد تا درجه ای از ارفاق را به تطابق n-gram انجام شده با ROUGE-N و ROUGE-L اضافه کنیم. ROUGE-S یک متریک skip-gram است که امکان جستجو برای کلمات متوالی از متن مرجع که در خروجی مدل ظاهر می‌شوند اما با یک یا چند کلمه دیگر از هم جدا می‌شوند را می‌دهد.مرجع R و خلاصه C را در نظر بگیرید:R: The cat is on the mat.C: The gray cat and the dog.اگر 2-گرم “the cat” را در نظر بگیریم، معیار ROUGE-2 تنها در صورتی با آن مطابقت دارد که دقیقاً در C نشان داده شود، اما این چنین نیست زیرا C حاوی “the gray cat” است. با این حال، با استفاده از ROUGE-S با یونیگرام اسکیپینگ (unigram skipping) ، “the cat” با “the gray cat” نیز مطابقت دارد.ما می توانیم ROUGE-S precision, recall و F1-score را به همان روش سایر معیارهای ROUGE محاسبه کنیم.مزایا و معایب ROUGEمزایا: با ارزیابی انسان همبستگی مثبت دارد، محاسبه آن ارزان و مستقل از زبان است. معایب: ROUGE کلمات مختلفی را که معنی یکسانی دارند مدیریت نمی کند، زیرا به جای معنایی، مطابقت های نحوی را اندازه می گیرد.‏ROUGE vs BLEUاگر با متریک BLEU آشنایی ندارید پیشنهاد می‌کنم مقاله را بخوانید. به طور کلی BLEU بر precision تمرکز دارد: چقدر کلمات (و/یا n-gram) در خروجی های مدل در مرجع انسانی ظاهر می شوند. ROUGE بر recall تمرکز دارد: چقدر کلمات (و/یا n-gram) در مراجع انسانی در خروجی های مدل ظاهر می شوند. این نتایج تکمیل کننده یکدیگر هستند و اغلب یک تریداف precision-recall برای استفاده از آنها اتفاق می افتد.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Sun, 19 Nov 2023 09:18:26 +0330</pubDate>
            </item>
                    <item>
                <title>معیار BLEU در پردازش زبان طبیعی با مثال</title>
                <link>https://virgool.io/@Aleereza/%D9%85%D8%B9%DB%8C%D8%A7%D8%B1-bleu-%D8%AF%D8%B1-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B7%D8%A8%DB%8C%D8%B9%DB%8C-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-iutxqiudqbjr</link>
                <description>همانطور که پردازش زبان طبیعی (NLP) به پیشرفت خود ادامه می دهد، نیاز به ارزیابی مدل های NLP اهمیت فزاینده ای پیدا می کند.معیارهای ارزیابی NLP به محققان و متخصصان این امکان را می دهد تا عملکرد مدل های NLP را به طور عینی ارزیابی کرده و آنها را برای تصمیم گیری بهتر مقایسه کنند.دو معیار رایج در زمینه ارزیابی NLP امتیازات BLEU و ROUGE هستند. در این پست، به معیار BLEU خواهیم پرداخت و اهمیت آنها را در ارزیابی مدل های NLP درک خواهیم کرد. همچنین در پست بعدی به معیار ROUGE خواهیم پرداخت.امتیاز BLEU یک معیار پرکاربرد برای کارهای ترجمه ماشینی است که در آن هدف ترجمه خودکار متن از یک زبان به زبان دیگر است. این به عنوان راهی برای ارزیابی کیفیت ترجمه های تولید شده توسط ماشین با مقایسه آنها با مجموعه ای از ترجمه های مرجع ارائه شده توسط مترجمان انسانی پیشنهاد شد.امتیاز BLEU چگونه کار می کند؟اگرچه BLEU برای ترجمه توسعه یافته است، اما می تواند برای ارزیابی کارهای مختلف پردازش زبان طبیعی مانند بازنویسی و خلاصه سازی متن استفاده شود.امتیاز BLEU کامل نیست، اما محاسبه آن سریع و ساده است، مستقل از زبان است و مهمتر از همه، با ارزیابی انسانی بسیار مرتبط است.دو ترجمه مرجع R1 و R2 را در نظر بگیرید که توسط متخصصان انسانی تولید شده اند و ترجمه C1 که توسط سیستم ترجمه تولید شده است.R1 : The cat is on the matR2 : There is a cat on the mat.C1 : The cat and the dog.محاسبه دقیق یونی گرمبرای بیان کیفیت ترجمه خود با یک متریک، ممکن است شمارش کنیم که چند کلمه در ترجمه C1 در ترجمه های مرجع R1 و R2 وجود دارد و نتیجه را بر تعداد کلمات C1 تقسیم کنیم تا یک درصد بدست آوریم. بنابراین نمره کامل 1.0 است و بدترین نمره 0.0 است. بیایید این متریک را *BLEU بنامیم.در C1 سه کلمه (&#x27;the&#x27;، &#x27;cat&#x27;، &#x27;the&#x27;) وجود دارد که در ترجمه های مرجع ظاهر می شوند، بنابراین:BLEU*(C1) = 3/5 = 0.6ترجمه از C1 از ترجمه کامل فاصله زیادی دارد و امتیاز 0.6 را دریافت می کند. همه چیز خوب به نظر می رسد.مشکل تکرار یونیگرام هابیایید امتیاز *BLEU را برای ترجمه جدید C2 محاسبه کنیم:R1: The cat is on the mat.R2: There is a cat on the mat.C2: The The The The The.این بار متاسفانه ترجمه ما خیلی خوب نیست.هر کلمه در C2 حداقل در یک کلمه بین R1 و R2 وجود دارد، بنابراین:BLEU*(C2) = 5/5 = 1ما با ترجمه‌ای بی‌معنی به امتیاز کاملی دست یافتیم پس چیزی وجود دارد که باید در معیار خود اصلاح کنیم.منطقی نیست که کلمه &#x27;The&#x27; را پنج بار در شمارنده در نظر بگیرید، زیرا حداکثر دو بار در هر ترجمه مرجع ظاهر می شود. ما می‌توانیم کلمه «The» را فقط برای دفعاتی که در هر ترجمه مرجع ظاهر می‌شود، بشماریم، یعنی دو. بیایید این متریک جدید را **BLEU بنامیم.BLEU**(C2) = 2/5 = 0.4اکنون امتیاز منطقی تر است، زیرا ما جلوی این واقعیت را گرفتیم که یک کلمه ترجمه شده خوب بارها در ترجمه ما ظاهر شود.با در نظر گرفتن n-گرمبیایید امتیاز **BLEU را روی دو ترجمه دیگر C3 و C4 محاسبه کنیم تا بررسی کنیم که آیا همه چیز خوب به نظر می رسد.R1: The cat is on the mat.R2: There is a cat on the mat.C3: There is a cat on the mat.C4: Mat the cat is on a there.امتیازات **BLEU به شرح زیر است:BLEU**(C3) = 7/7 = 1.0BLEU**(C4) = 7/7 = 1.0هر دو ترجمه حاوی کلماتی هستند که در ترجمه های مرجع وجود دارند، بنابراین هر دو به حداکثر امتیاز می رسند. با این حال، C4 یک جمله انگلیسی خوب نیست.یک راه سریع برای به دست آوردن نمرات بالاتر برای جملات خوب این است که به جای 1-گرم فقط 2-گرم یا 3-گرم را در نظر بگیرید. بیایید BLEU**1 را امتیازی بنامیم که فقط 1-گرم را در نظر می گیرد و BLEU**2 را امتیازی را که فقط 2-گرم را در نظر می گیرد.BLEU**₁(C3) = 7/7 = 1.0BLEU**₂(C3) = 6/6 = 1.0در عوض، در C4 تمام 2-گرم ها در هیچ ترجمه مرجعی ظاهر نمی شوند، بنابراین:BLEU**₁(C4) = 7/7 = 1.0BLEU**₂(C4) = 0/6 = 0.0به طور کلی گفته می شود که امتیاز BLEU**ₙ برای n-گرم برای n کم بر روی معنی جمله  و برای n بالا بر روی فرم خوب جمله تمرکز می کند.مشخص شده است که میانگین هندسی امتیازهای BLEU**ₙ برای n بین یک تا چهار بهترین همبستگی را با ارزیابی انسانی دارد. بگذارید آن را **MEAN_BLEU بنامیم.جریمه کردن ترجمه های کوتاهبیایید اکنون امتیازات BLEU**1 و BLEU**2 برای ترجمه C5 را محاسبه کنیم:R1: The cat is on the mat.R2: There is a cat on the mat.C5: There is a cat.امتیازات عبارتند از:BLEU**₁(C5) = 4/4 = 1.0BLEU**₂(C5) = 3/3= 1.0به نظر می‌رسد که C5 به ازای هر n امتیاز عالی را به دست می‌آورد، حتی اگر ترجمه یک قطعه از متن را با توجه به ترجمه‌های مرجع از دست داده باشد.با اضافه کردن جریمه برای ترجمه‌ای که طول آن کمتر از ترجمه های مرجع است، از این امر جلوگیری می شود. ما آن را جریمه کوتاهی (Brevity penalty) می نامیم.امتیاز نهایی BLEU این است:BLEU = BP * MEAN_BLEU**یعنی، BLEU حاصلضرب جریمه کوتاهی BP (که ترجمه‌های کوتاهی را که حاوی متن مرتبط از ترجمه‌های مرجع نیستند جریمه می‌کند) و میانگین هندسی امتیازات BLEU**ₙ برای n بین یک تا چهار (که شامل n-گرم های کوچک را برای دریافت معنی جمله و n-گرم های بزرگ برای به دست آوردن جملات خوب).مقدار جریمه کوتاهی Brevity penalty(BP) چقدر است؟اگر طول ترجمه بزرگتر از طول ترجمه مرجع باشد، نباید جریمه کنیم و بنابراین BP برابر با یک است. در غیر این صورت، BP یک مقدار نمایی رو به کاهش است که زمانی که اختلاف طول بین ترجمه ما و ترجمه مرجع بیشتر باشد، کمتر است. مقاله BLEU پیشنهاد می‌کند که جریمه کوتاهی را در کل مجموعه به جای ترجمه‌های تکی محاسبه کنید تا جریمه‌های ترجمه‌های کوتاه را هموارتر کنید.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Mon, 06 Nov 2023 11:32:09 +0330</pubDate>
            </item>
                    <item>
                <title>شبکه عصبی ترانسفورمر</title>
                <link>https://virgool.io/@Aleereza/%D8%B4%D8%A8%DA%A9%D9%87-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%AA%D8%B1%D8%A7%D9%86%D8%B3%D9%81%D9%88%D8%B1%D9%85%D8%B1-zmrusr8ic5st</link>
                <description>ترانسفورمر به عنوان یکی از معماری‌های اصلی در زمینه پردازش زبان طبیعی و بینایی ماشین محسوب می‌شود و در مسائل مختلفی از ترجمه ماشینی گرفته تا تولید متن و تشخیص تصاویر مورد استفاده قرار می‌گیرد. این معماری با انعطاف بالا و قابلیت آموزش بیشتر در مقایسه با معماری‌های سنتی شبکه عصبی عمیق (Deep Neural Network)  مورد توجه قرار گرفته است.در این پست، ما به ترانسفورمرها نگاهی خواهیم کرد - مدلی که از توجه (attention) برای افزایش سرعت آموزش استفاده می کند. این معماری ابتدا در مقاله‌ای به نام &quot;Attention Is All You Need&quot; توسط Vaswani و همکارانش معرفی شد و بسیاری از مسائل پردازش زبان طبیعی را بهبود بخشید.پس بیایید سعی کنیم مدل را از هم جدا کنیم و به نحوه عملکرد آن نگاه کنیم.یک نگاه سطح بالابیایید به مدل به عنوان یک جعبه سیاه  نگاه کنیم. در یک برنامه ترجمه، یک جمله را از یک زبان می گیرد و خروجی ترجمه آن را به زبان دیگر می دهد.با باز کردن این جعبه، یک بخش رمزگذاری (encoding)، یک بخش رمزگشایی (decoding) و اتصالات بین آنها را می بینیم.بخش رمزگذاری پشته ای از رمزگذارها (encoder) است (در مقاله، شش عدد از آنها را روی هم قرار می دهد - هیچ جادویی در مورد عدد شش نیست، قطعاً می توان با اعداد دیگری هم آزمایش کرد). بخش رمزگشایی پشته‌ای از رمزگشاها (decoder) به همان تعداد است.‏همه encoderها از نظر ساختار یکسان هستند (ولی وزن‌های یکسان ندارند). هر کدام به دو زیر لایه تقسیم می شوند:ورودی‌های انکودر ابتدا وارد یک لایه توجه-به-خود (self-attention) می‌شوند - لایه‌ای که به انکودر امکان می‌دهد تا با توجه به کلمات دیگر جمله ورودی، کلمات آن را رمزگذاری کند. در ادامه پست بیشتر به  self-attention خواهیم پرداخت.خروجی های لایه self-attention به یک شبکه عصبی feed-forward تغذیه می شود.دیکودر دارای هر دو لایه است، اما بین آنها یک لایه attention وجود دارد که به دیکودر کمک می کند تا روی کلمات مرتبط در جمله ورودی تمرکز کند (همان چیزی که attention در مدل های seq2seq انجام می دهد).تنسورهااکنون که اجزای اصلی مدل را دیدیم، بیایید به بررسی بردارها/تنسورهای مختلف و چگونگی ارتباط آنها در بین این مؤلفه ها، برای تبدیل ورودی یک مدل آموزش دیده به خروجی بپردازیم.همانطور که در برنامه های NLP به طور کلی وجود دارد، ما با تبدیل هر کلمه ورودی به یک بردار با استفاده از یک الگوریتم امبدینگ embedding شروع می کنیم.هر کلمه در یک بردار با اندازه 512 جاسازی شده است. این بردارها را با این کادرهای ساده نشان خواهیم داد.امبدینگ در اولین انکودر انجام می شود. بنابراین ورودی اولین انکودر، امبدینگها خواهند بود، اما در انکودرهای دیگر، خروجی انکودر است که مستقیماً به عنوان ورودی است. سایز لیست امبدینگها، هایپرپارامتری است که می‌توانیم تنظیم کنیم - اساساً این عدد برابر طول طولانی‌ترین جمله در مجموعه داده آموزشی ما خواهد بود.پس از امبدینگ کلمات جمله ورودی، همه بردارهای امبدینگ در هر دو لایه انکودر جریان می یابد.حالا یک ویژگی کلیدی ترانسفورمر را می‌بینیم و آن این است که هر کلمه از مسیر خود در انکودر عبور می کند. بین این مسیرها در لایه self-attention وابستگی هایی وجود دارد. با این حال، لایه feed-forward آن وابستگی‌ها را ندارد و بنابراین مسیرهای مختلف  می‌توانند به صورت موازی در لایه feed-forward اجرا کرد.در مرحله بعد، مثال را به یک جمله کوتاه تر تغییر می دهیم و به آنچه در هر زیر لایه انکودر اتفاق می افتد نگاه می کنیم.اکنون در حال رمزگذاری هستیم!همانطور که قبلاً اشاره کردیم، یک انکودر لیستی از بردارها را به عنوان ورودی دریافت می کند. این لیست را با انتقال این بردارها به یک لایه self-attention، سپس به یک شبکه عصبی feed-forward، پردازش می‌کند، سپس خروجی را به سمت بالا به انکودر بعدی ارسال می‌کند.‏نگاهی به self-attention از بالامفهوم &#x27;self-attention&#x27;  مفهومی است که همه باید با آن آشنا باشند. بیایید با نحوه عملکرد آن آشنا شویم.جمله زیر یک جمله ورودی است که می خواهیم ترجمه کنیم:”The animal didn&#x27;t cross the street because it was too tired”‏“it” در این جمله به چه چیزی اشاره دارد؟ منظور street است یا animal؟ این یک سوال ساده برای انسان است، اما برای یک الگوریتم ساده نیست.هنگامی که مدل در حال پردازش کلمه &#x27;it&#x27; است، self-attention به او اجازه می دهد &#x27;it&#x27; را با &#x27;animal&#x27; مرتبط کند.همانطور که مدل هر کلمه را پردازش می کند (هر موقعیت در دنباله ورودی)، self-attention به آن اجازه می دهد تا به موقعیت های دیگر در دنباله ورودی برای سرنخ هایی نگاه کند که می تواند به رمزگذاری بهتر این کلمه کمک کند.اگر با RNN ها آشنایی دارید، به این فکر کنید که چگونه حفظ یک حالت پنهان به یک RNN اجازه می دهد تا نمایش خود را از کلمات/بردارهای قبلی که پردازش کرده است را با حالت فعلی که پردازش می کند ترکیب کند. self-attention روشی است که ترانسفورمر برای ایجاد &#x27;درک&#x27; سایر کلمات مرتبط به واژه ای که در حال حاضر در حال پردازش آن هستیم، استفاده می کند.همانطور که ما در حال رمزگذاری کلمه &#039;it&#039; در رمزگذار شماره 5 هستیم، بخشی از مکانیسم توجه بر روی &#039;animal&#039; متمرکز بود و بخشی از نمایش آن را در رمزگذاری &#039;it&#039; قرار داد.جزئیات self-attentionبیایید ابتدا نحوه محاسبه self-attention را با استفاده از بردارها بررسی کنیم، سپس به نحوه پیاده سازی آن با استفاده از ماتریس ها ادامه دهیم.اولین مرحله در محاسبه self-attention، ایجاد سه بردار از هر یک از بردارهای ورودی انکودر (در این مورد، امبدینگ هر کلمه) است. بنابراین برای هر کلمه، یک بردار Query، یک بردار Key و یک بردار value ایجاد می کنیم. این بردارها با ضرب امبدینگ در سه ماتریس که در طول فرآیند آموزش، آموزش داده ایم ایجاد می شوند.توجه داشته باشید که این بردارهای جدید از نظر ابعاد کوچکتر از بردار تعبیه شده هستند. ابعاد آنها 64 است، در حالی که بردارهای ورودی/خروجی امبدینگ و انکودر دارای ابعاد 512 هستند. البته الزامی برای اینکه کوچکتر باشند نیست، این یک انتخاب معماری برای محاسبات multiheaded attention است.ضرب x1 در ماتریس وزن WQ، بردار q1که بردار query مرتبط با آن کلمه است را تولید می کند. ما در نهایت یک &#039;query&#039;، یک &#039;key&#039; و یک &#039;value&#039; برای هر کلمه در جمله ورودی ایجاد می کنیم.بردارهای «query»، «key» و «value» چیست؟آنها انتزاعاتی هستند که برای محاسبات و تفکر در مورد توجه لازم هستند. هنگامی که نحوه محاسبه توجه در زیر ادامه دهید، تقریباً تمام آنچه را که باید در مورد نقش هر یک از این بردارها بدانید، خواهید دانست.مرحله دوم در محاسبه self-attention، محاسبه امتیاز (score) است. فرض کنید ما در حال محاسبه self-attention برای اولین کلمه در این مثال، &#x27;Thinking&#x27; هستیم. ما باید هر کلمه از جمله ورودی را در مقابل این کلمه امتیاز دهیم. امتیاز تعیین می کند که وقتی کلمه ای را در یک موقعیت خاص خود در جمله رمزگذاری می کنیم، چه مقدار تمرکز روی سایر قسمت های جمله ورودی قرار دهیم.امتیاز با گرفتن حاصل ضرب نقطه بردار query با بردار key کلمه مربوطه که به آن امتیاز می دهیم محاسبه می‌شود. بنابراین اگر self-attention را برای کلمه در موقعیت 1# پردازش کنیم، اولین امتیاز حاصل ضرب نقطه‌ای q1 و k1 خواهد بود. امتیاز دوم حاصل ضرب نقطه ای q1 و k2 خواهد بود.مرحله سوم و چهارم تقسیم امتیازها بر 8 است (ریشه مربع بردارهای کلیدی استفاده شده در مقاله (64) این منجر به داشتن گرادیان های پایدارتر می شود. مقادیر دیگر هم ممکن است، اما پیش فرض این مقدار است)، سپس نتیجه را از یک عملیات softmax عبور دهید. Softmax امتیازات را نرمال می کند تا همه آنها مثبت باشند و جمع آنها 1 شود.امتیاز سافت‌مکس تعیین می کند که هر کلمه چقدر در این موقعیت، شاخص می شود. واضح است که خود کلمه در این موقعیت بالاترین امتیاز softmax را خواهد داشت، اما گاهی اوقات تمرکز روی کلمه دیگری که با کلمه فعلی ارتباط دارد مفید است.مرحله پنجم ضرب هر بردار value در امتیاز سافت مکس است. دلیل آن، این است که مقادیر کلمه(هایی) را که می خواهیم روی آنها تمرکز کنیم، دست نخورده نگه داریم و کلمات نامربوط را حذف کنیم (مثلاً با ضرب آنها در اعداد کوچکی مانند 0.001).مرحله ششم، جمع بردارهای value وزن داده شده است. این خروجی لایه self-attention را در این موقعیت (برای کلمه اول) تولید می کند.این خروجی محاسبات self-attention است. بردار به دست آمده برداری است که می توانیم به شبکه عصبی feed-forward ارسال کنیم. اما در پیاده سازی واقعی، این محاسبات به صورت ماتریسی جهت پردازش سریعتر انجام می شود. پس بیایید اکنون که نحوه محاسبات را در سطح کلمه دیدیم، به آن نگاه کنیم.محاسبه ماتریسی Self-Attentionاولین مرحله، محاسبه ماتریس Query، Key و Value است. ما این کار را با قرار دادن امبدینگهای خود در ماتریس X و ضرب آن در ماتریس‌های وزنی که آموزش داده‌ایم (WQ، WK، WV) انجام می‌دهیم.در نهایت، از آنجایی که ما با ماتریس‌ها سر و کار داریم، می‌توانیم مراحل دو تا شش را در یک فرمول فشرده کنیم تا خروجی‌های لایه self-attention را محاسبه کنیم.هیولایی با سرهای بسیارمقاله با افزودن مکانیزمی به نام &#x27;multi-headed attention&#x27; لایه self-attention را اصلاح کرد. این امر عملکرد لایه توجه را از دو طریق بهبود می بخشد:توانایی مدل را برای تمرکز بر موقعیت های مختلف افزایش می دهد. در مثال بالا، z1 حاوی اندکی کد از هر کد کلمات دیگر است، اما ممکن است کد خود کلمه واقعی بر آن غالب باشد. اگر جمله ای مانند«“The animal didn’t cross the street because it was too tired”»را ترجمه می کنیم، لازم است که بدانیم «it» به کدام کلمه اشاره دارد.این به لایه توجه امکان &#x27;بازنمایی زیرفضاهای&#x27; متعددی می دهد. همانطور که در ادامه خواهیم دید، با multi-headed attention، ما نه تنها یک، بلکه مجموعه های متعددی از ماتریس های وزن Query/Key/Value داریم (ترانسفورمر از هشت attention head استفاده می کند، بنابراین برای هر encoder/decoder هشت مجموعه داریم) . هر یک از این مجموعه ها به صورت تصادفی مقداردهی اولیه می شوند. سپس، پس از آموزش، از هر مجموعه برای نمایش امبدینگ‌های ورودی (یا بردارهای رمزگذار/رمزگشاهای پایین‌تر) در یک زیرفضای نمایش متفاوت استفاده می‌شود.اگر همان محاسبه self-attention را که در بالا ذکر کردیم انجام دهیم، فقط هشت بار مختلف با ماتریس های وزنی متفاوت، در نهایت به هشت ماتریس Z متفاوت می رسیم.این ما را با کمی چالش روبرو می کند. لایه feed-forward انتظار هشت ماتریس را ندارد - انتظار یک ماتریس واحد (یک بردار برای هر کلمه) را دارد. بنابراین ما به راهی برای متراکم کردن این هشت در یک ماتریس نیاز داریم.چگونه ما آن را انجام دهیم؟ ماتریس ها را به هم متصل می کنیم سپس آنها را در یک ماتریس وزن اضافی WO ضرب می کنیم.این تقریباً تمام چیزی است که در مورد multi-headed self-attention وجود دارد. بیایید همه ماتریس‌ها را در یک تصویر قرار دهیم تا بتوانیم آنها را یکجا نگاه کنیماکنون که attention heads را درک کرده‌ایم، بیایید مثال قبلی خود را دوباره بررسی کنیم تا ببینیم attention heads مختلف در کجا تمرکز می‌کنند، همانطور که کلمه &#x27;it&#x27; را در جمله مثال خود رمزگذاری می‌کنیم:با این حال، اگر تمام attention heads را به تصویر اضافه کنیم، تفسیر چیزها دشوارتر می شود:نمایش ترتیب توالی با استفاده از Positional Encodingیکی از مواردی که در مدل گم شده است، روشی برای محاسبه ترتیب کلمات در دنباله ورودی است.برای رفع این مشکل، ترانسفورمر یک بردار به هر تعبیه ورودی اضافه می کند. این بردارها از الگوی خاصی پیروی می کنند که به مدل کمک می کند موقعیت هر کلمه یا فاصله بین کلمات مختلف در دنباله را تعیین کند. علت این است که افزودن این مقادیر به امبدینگ‌ها، فواصل معنی‌داری را بین بردارهای امبدینگ پس از نمایش بردارهای Q/K/V و در هنگام ، فراهم می‌کند.اگر فرض کنیم امبدینگ دارای ابعاد 4 است، positional encodings به این صورت خواهند بود:‏Residualsیکی از جزئیات در معماری encoder که قبل از ادامه باید به آن اشاره کنیم، این است که هر لایه فرعی (self-attention، ffnn) در هر انکودر یک اتصال Residual دارد و سپس در ادامه یک مرحله لایه نرمال سازی دارد.اگر بخواهیم بردارها و عملیات layer-norm مرتبط با self attention را تجسم کنیم، به شکل زیر خواهد بود:این برای sub-layers در decoder نیز صدق می کند. اگر بخواهیم یک ترانسفورمر دو پشته‌ای encoders و decoders  داشته باشیم چیزی شبیه به این خواهد بود:‏بخش Decoder اکنون که بیشتر مفاهیم سمت encoder را پوشش داده ایم، می دانیم که اجزای decoderها چگونه کار می کنند. اما بیایید نگاهی به نحوه کار آنها با یکدیگر بیندازیم.کار encoder با پردازش دنباله ورودی شروع می شود. سپس خروجی آخرین انکودر به مجموعه‌ بردارهای توجه K و V تبدیل می‌شود. این بردارها باید توسط هر decoder در لایه «encoder-decoder attention» استفاده شود که به decoder کمک می‌کند تا روی مکان‌های مناسب در دنباله ورودی تمرکز کند:مراحل فرآیند تکرار می‌شوند تا زمانی که به نماد خاصی برسد که نشان می دهد decoder خروجی خود را کامل کرده است. خروجی هر مرحله در مرحله بعدی به decoder پایینی داده می‌شود و decoderها نتایج رمزگشایی خود را درست مانند encoderها به بالا می‌فرستند. همانند کاری که با ورودی‌های encoder انجام دادیم، برای نشان دادن موقعیت هر کلمه، positional encoding را به ورودی‌های decoder امبد کرده و اضافه می‌کنیم.لایه های self attention در decoder به روشی کمی متفاوت از لایه encoder عمل می کنند:در decoder، لایه self attention فقط مجاز است به موقعیت های قبلی در دنباله خروجی توجه کند. این کار با ماسک کردن موقعیت های آینده (تنظیم آنها به -inf) قبل از مرحله softmax در محاسبه self-attention انجام می شود.لایه &#x27;Encoder-Decoder Attention&#x27; درست مانند multiheaded self-attention کار می کند، با این تفاوت که ماتریس کوئری خود را از لایه زیر آن ایجاد می کند و ماتریس کلیدها و Values را از خروجی پشته رمزگذار می گیرد.لایه نهایی Linear و Softmaxپشته decoder یک بردار از اعداد اعشار (floats) را خروجی می دهد. چگونه آن را به یک کلمه تبدیل کنیم؟ این کار آخرین لایه Linear است که یک لایه Softmax بعد از آن می‌آید.لایه Linear یک شبکه عصبی fully connected ساده است که بردار تولید شده توسط پشته decoderها را به بردار بسیار بسیار بزرگتری به نام بردار logits تبدیل می‌کند.بیایید فرض کنیم که مدل ما 10000 کلمه انگلیسی منحصربه‌فرد را که از مجموعه داده‌های آموزشی خود آموخته است. این باعث می شود که بردار لاجیت 10000 سلول عرض داشته باشد - هر سلول شامل امتیاز یک کلمه منحصر به فرد است. اینگونه است که ما خروجی مدل را با لایه Linear تفسیر می کنیم.سپس لایه softmax آن امتیازات را به احتمالات تبدیل می‌کند (همه مثبت، مجموع همه  1.0 می‌شود). سلول با بیشترین احتمال انتخاب می شود و کلمه مرتبط با آن به عنوان خروجی این مرحله زمانی تولید می شود.خلاصه آموزشاکنون که کل فرآیند forward-pass از طریق یک ترانسفورمر آموزش دیده را پوشش داده ایم، نگاهی به نحوه آموزش مدل مفید خواهد بود.در طول آموزش، یک مدل آموزش ندیده دقیقاً همان forward-pass را پشت سر می گذارد. اما از آنجایی که ما آن را روی یک مجموعه داده آموزشی لیبل‌گذاری شده آموزش می‌دهیم، می‌توانیم خروجی آن را با خروجی صحیح واقعی مقایسه کنیم.برای تجسم این موضوع، فرض کنیم واژگان خروجی ما فقط شامل شش کلمه است.(“a”, “am”, “i”, “thanks”, “student”, and “&lt;eos&gt;” (مخفف &#x27;پایان جمله&#x27;)هنگامی که واژگان خروجی (output vocabulary) را تعریف می کنیم، می توانیم از بردار با همان بعد برای نشان دادن هر کلمه در واژگان خود استفاده کنیم که به عنوان one-hot encoding شناخته می شود. به عنوان مثال، می توانیم کلمه &#x27;am&#x27; را با استفاده از بردار زیر نشان دهیم:پس از این خلاصه، بیایید تابع loss مدل را مورد بحث قرار دهیم - معیاری که ما در مرحله آموزش بهینه سازی می کنیم تا به یک مدل آموزش دیده و امیدواریم به طرز شگفت انگیزی دقیق برسیم.تابع Lossفرض کنید ما داریم مدل خود را آموزش می دهیم. فرض کنید اولین مرحله در فرآیند آموزش است و ما آن را با یک مثال ساده آموزش می دهیم - ترجمه &#x27;merci&#x27; به &#x27;متشکرم&#x27;.این به این معنی است که ما می خواهیم خروجی یک توزیع احتمال باشد که کلمه &#x27;متشکرم&#x27; را نشان می دهد. اما از آنجایی که این مدل هنوز آموزش ندیده است، بعید است که این اتفاق هنوز بیفتد.از آنجایی که پارامترهای مدل (وزن ها) همگی به صورت تصادفی مقداردهی اولیه می شوند، مدل آموزش ندیده  یک توزیع احتمال با مقادیر دلخواه برای هر سلول/کلمه تولید می کند. ما می‌توانیم آن را با خروجی واقعی مقایسه کنیم، سپس تمام وزن‌های مدل را با استفاده از backpropagation تنظیم کنیم تا خروجی به خروجی مورد نظر نزدیک‌تر شود.چگونه دو توزیع احتمال را با هم مقایسه می کنید؟ به سادگی یکی را از دیگری کم می کنیم. برای جزئیات بیشتر، به cross-entropy و Kullback–Leibler divergence نگاه کنید.اما توجه داشته باشید که این یک مثال بیش از حد ساده شده است. در شرایط واقع بینانه تر، از جمله ای طولانی تر از یک کلمه استفاده خواهیم کرد. به عنوان مثال - ورودی: &#x27;je suis étudiant&#x27; و خروجی مورد انتظار: &#x27;من یک دانشجو هستم&#x27;. معنای واقعی آن این است که ما می خواهیم مدل ما به طور متوالی توزیع های احتمال را در جایی که:هر توزیع احتمال با یک بردار با بعد vocab_size نشان داده می شود (6 در مثال تمرینی ما، اما به طور واقعی تر عددی مانند 30000 یا 50000)اولین توزیع احتمال، بیشترین احتمال را در سلول مرتبط با کلمه &#x27;i&#x27; دارد.توزیع احتمال دوم، بیشترین احتمال را در سلول مرتبط با کلمه &#x27;am&#x27; دارد.و به همین ترتیب، تا زمانی که پنجمین توزیع خروجی نماد &lt;end of sentence&gt; را نشان دهد که همچنین دارای یک سلول مرتبط با آن از واژگان 10000 عنصر است.امیدواریم پس از آموزش، این مدل ترجمه مناسبی را که انتظار داریم ارائه دهد. البته این نشانه واقعی نیست که آیا این عبارت بخشی از مجموعه داده آموزشی بوده است (نگاه کنید به: cross validation). توجه داشته باشید که هر موقعیت کمی احتمال دارد، حتی اگر بعید باشد که خروجی آن مرحله زمانی باشد - این یک ویژگی بسیار مفید softmax است که به روند آموزش کمک می کند.حال، از آنجایی که مدل خروجی ها را یکی یکی تولید می کند، می توانیم فرض کنیم که مدل کلمه با بیشترین احتمال را از آن توزیع احتمال انتخاب می کند و بقیه را دور می اندازد. این یکی از راه‌های انجام آن است (به نام greedy decoding). راه دیگر برای انجام این کار این است که مثلاً دو کلمه بالا را نگه دارید (مثلاً «I» و «a»)، سپس در مرحله بعد، مدل را دو بار اجرا کنید: یک بار با فرض اینکه اولین موقعیت خروجی بود. کلمه &#x27;I&#x27;، و بار دیگر با فرض اولین موقعیت خروجی کلمه &#x27;a&#x27; بود، و هر نسخه ای که با در نظر گرفتن هر دو موقعیت #1 و #2 خطای کمتری ایجاد کرد، حفظ می شود. ما این کار را برای موقعیت های #2 و #3 ... و غیره تکرار می کنیم. این روش &#x27;beam search&#x27; نامیده می شود، جایی که در مثال ما، beam_size دو بود (به این معنی که در هر زمان، دو فرضیه جزئی (ترجمه های ناتمام) در حافظه نگهداری می شود)، و top_beams نیز دو است (به این معنی که دو ترجمه را برمی گردانیم. ). این هر دو فراپارامترهایی هستند که می توانید با آنها آموزش دهید.امیدوارم این شروعی برای آشنایی با مفاهیم اصلی ترانسفورمر بوده باشد. اگر می خواهید عمیق تر شوید، این مراحل را پیشنهاد می کنم:مقاله Attention Is All You Need، پست وبلاگ Transformer (Transformer: A Novel Neural Network Architecture for Language Understanding) و Tensor2Tensor را بخوانید.صحبت های Łukasz Kaiser را در مورد مدل و جزئیات آن تماشا کنیدبه کدهای نوت بوک Jupyter Notebook provided as part of the Tensor2Tensor repo نگاه کنید‏Tensor2Tensor repo را نگاه کنید.منبع:https://jalammar.github.io/illustrated-transformer/</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Sat, 30 Sep 2023 11:42:11 +0330</pubDate>
            </item>
                    <item>
                <title>تنظیم دقیق بهینه پارامترها (PEFT) برای LLM</title>
                <link>https://virgool.io/@Aleereza/%D8%AA%D9%86%D8%B8%DB%8C%D9%85-%D8%AF%D9%82%DB%8C%D9%82-%D8%A8%D9%87%DB%8C%D9%86%D9%87-%D9%BE%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1%D9%87%D8%A7-peft-%D8%A8%D8%B1%D8%A7%DB%8C-llm-ycanjtbr5efa</link>
                <description>مدل های زبانی بزرگ (LLM) از نظر حجم هم واقعا بسیار بزرگ هستند. این مدل ها معمولاً بین 7 تا 70 میلیارد پارامتر دارند که برای بارگذاری یک مدل پارامتر 70 میلیاردی با دقت کامل، به 280 گیگابایت حافظه GPU نیاز است. برای آموزش این مدل‌ها، باید میلیاردها توکن را در میلیون ها یا میلیاردها متن به روز کرد که محاسبات مورد نیاز برای به‌روزرسانی پارامترهای آن حایز اهمیت است. آموزش self-supervised این مدل ها گران است و برای سازمان‌ها تا 100 میلیون دلار هزینه در بر دارد.ما معمولا به دنبال این هستیم داده هایمان را با این مدل ها تطبیق دهیم. اما با مجموعه داده‌های محدود و بدون داشتن قدرت محاسباتی، چگونه می‌توان مدل‌هایی ایجاد کرد که با هزینه‌ای کم، مدلهای اصلی را بهبود داد؟اینجاست که حوزه تحقیقاتی Parameter-Efficient Fine-Tuning (PEFT)  وارد عمل می شود. از طریق تکنیک‌های مختلف که به زودی به تفصیل آن‌ها را بررسی خواهیم کرد، می‌توان بخش‌های کوچکی از این مدل‌ها را تقویت کرد تا برای کارهای خودمان، مناسب‌تر باشند. هدف PEFT تنظیم دقیق تنها زیر مجموعه کوچکی از پارامترهای مدل، جهت دستیابی به عملکرد قابل مقایسه با تنظیم دقیق کامل و در عین حال کاهش قابل توجه نیازهای محاسباتی است.آیا زمان تنظیم دقیق فرا رسیده است؟تنظیم دقیق مدل‌های زبانی بزرگ (LLM) می‌تواند برای سازمان‌ها خطرناک باشد، چرا که این مدل‌ها می‌توانند بخش قابل توجهی (حداقل 1%) از داده‌های آموزشی را به خاطر بسپارند. این امر در مورد داده‌های تکراری، نگرانی بیشتری ایجاد می‌کند. اگر LLM شما توسط افراد خارج از سازمان مورد استفاده قرار گیرد، به اشتراک گذاشتن داده‌های آموزشی با آنها می‌تواند ریسک‌های امنیتی را به همراه داشته باشد، مانند حملات تزریق پرامپت.در این شرایط، راه‌حل‌هایی مانند استفاده از &quot;مشاهده پویا&quot; با ICL می‌تواند مفید باشد. این روش به شما امکان می‌دهد تا بدون به اشتراک گذاشتن داده‌های آموزشی، از LLM خود در یک محیط کنترل‌شده استفاده کنید.علاوه بر این، کیفیت داده‌های آموزشی برای عملکرد LLM شما حیاتی است. اگر سازمان شما به جمع‌آوری و برچسب‌گذاری داده‌های باکیفیت تعهد ندارد، بهتر است از تنظیم دقیق LLM خودداری کنید. مدل‌های زبانی با داده‌های باکیفیت عملکرد بهتری دارند و عدم وجود چنین تعهدی می‌تواند منجر به ناامیدی ذینفعان شود.تفاوت بین تنظیم دقیق fine-tuning وتنظیم دقیق پارامترها parameter-efficient fine-tuning چیست؟تنظیم دقیق و تنظیم دقیق بهینه پارامتر دو رویکردی هستند که در یادگیری ماشین برای بهبود عملکرد مدل‌های از پیش آموزش دیده در یک کار خاص استفاده می‌شوند.تنظیم دقیق یک مدل از پیش آموزش دیده، آموزش بیشتر آن مدل در حوزه‌ای جدید با داده های جدید است. معمولاً  کل مدل آموزش دیده در این روش آموزش داده می شود و شامل تمام لایه ها و پارامترهای آن می‌شود. این فرآیند می تواند از نظر محاسباتی گران و وقت گیر باشد، به خصوص برای مدل های بزرگ.از سوی دیگر، تنظیم دقیق پارامتر کارآمد PEFT، روشی برای تنظیم دقیق است که تنها بر آموزش زیرمجموعه ای از پارامترهای مدل  تمرکز دارد. این رویکرد شامل شناسایی مهم ترین پارامترها برای حوزه جدید و تنها به روز رسانی آن پارامترها در طول آموزش است. با انجام این کار، PEFT می تواند محاسبات مورد نیاز را به میزان قابل توجهی کاهش دهد.در این مقاله نگاهی می‌اندازیم به تکنیک های که در Hugging Face PEFT در زمان نگارش در دسترس هستند.بررسی سریع ترانسفورمرفرض می کنیم که خوانندگان با معماری ترانسفورمر آشنا هستند و نیازی به جزئیات self-attention یا کامپوننت دیگری ندارید، اما بهتر است نگاهی به این مقاله بیندازید و شاید نیاز به توضیحی درباره The Annotated Transformer داشته باشیم.قصد داریم از این شبه کد برای بلوک ترانسفورماتور استفاده کنیم:def self_attention(x):
    k = x @ W_k
    q = x @ W_q
    v = x @ W_v
 return softmax(q @ k.T) @ v

def transformer_block(x):
 &amp;quot&amp;quot&amp;quot Pseudo code by author based on [2] &amp;quot&amp;quot&amp;quot
    residual = x
    x = self_attention(x)
    x = layer_norm(x + residual)
    residual = x
    x = FFN(x)
    x = layer_norm(x + residual)
 return x‏FFN یک شبکه Feed Forward است که متناسب با هدف ما در اینجا 2 لایه است. بسیاری از تکنیک‌های PEFT که در ادامه می‌آیند، تغییراتی را در بلوک ترانسفورمر یا self-attention ایجاد می‌کنند، بنابراین در مقاله چندین بار به این شبه کد اشاره می‌کنیم و آن را تغییر می‌دهیم.نگاه اجمالی به متدهای PEFT‏Additive Methodsمتدهای Additive از ساده‌ترین متدها هستند. هدف متدهای Additive اضافه کردن مجموعه‌ای از پارامترها یا لایه‌های شبکه برای تقویت مدل است. هنگام تنظیم دقیق داده ها، وزن این پارامترهای تازه اضافه شده را به روز می کنید. این امر آموزش را از نظر محاسباتی آسان‌تر می‌کند و همچنین با مجموعه داده‌های کوچک‌تر سازگار می‌شود (برای شروع، 100 تا 500 را در نظر بگیرید، با سقفی نزدیک به 100000).‏Adapters Methodاداپترها به طور همزمان یک متد و یک کلاس هستند. این تکنیک توسط Houlsby و همکاران معرفی شد. هدف اداپترها اضافه کردن شبکه‌های کوچک Feed Forward بعد از لایه‌های فرعی Transformer و یادگیری آن پارامترها است. پس اداپترها فقط لایه‌های Feed Forward را به شبکه اضافه می‌کنند.یک به روز رسانی ساده برای بلوک ترانسفورمر همانطور که در این شبه کد نشان داده شده است لایه های Feed Forward در دو مکان اضافه می‌شوند.def transformer_block_adapter(x):
 &amp;quot&amp;quot&amp;quotPseudo code from [2] &amp;quot&amp;quot&amp;quot
    residual = x
    x = self_attention(x)
    x = FFN(x)  # adapter
    x = layer_norm(x + residual)
    residual = x
    x = FFN(x)
    x = FFN(x)  # adapter
    x = layer_norm(x + residual)
 return xتنظیم دقیق با استفاده از اداپتر چگونه کار می کند؟ماژول اداپتر شامل دو لایه feed forward  است که با یک لایه فعال‌سازی غیرخطی متصل شده‌اند. همچنین یک skip connection وجود دارد که لایه‌های fully connected را دور می‌زند.اگر اداپتر را درست بعد از لایه multi-head attention قرار دهیم، ورودی لایه اداپتر ، نمایش پنهان h است که توسط لایه multi-head attention محاسبه می شود. در اینجا، h دو مسیر مختلف را در لایه آداپتور طی می کند. یکی skip-connection است که ورودی را بدون تغییر می‌گذارد و راه دیگر شامل لایه‌های feed-forward است.در ابتدا، اولین لایه feed-forward، مقدار h را به فضایی با ابعاد پایین تبدیل می‌کند. این فضا ابعادی کمتر از h دارد. پس از آن، ورودی از طریق یک تابع فعال‌سازی غیر خطی عبور داده می‌شود و دومین لایه feed-forward آن را به ابعاد h برمی‌گرداند. نتایج به دست آمده از دو روش با هم جمع می شوند تا خروجی نهایی ماژول اداپتر به دست آید.skip-connection ورودی اصلی h اداپتر را حفظ می کند، در حالی که مسیر feed-forward یک تغییر افزایشی ایجاد می کند که به صورت Δh نشان داده می شود. با اضافه کردن تغییر افزایشی Δh، به دست آمده از لایه feed-forward با h اصلی از لایه قبل، اداپتر نمایش پنهان محاسبه شده توسط مدل از پیش آموزش دیده را تغییر می دهد. این به اداپتر اجازه می دهد تا نمایش پنهان مدل از پیش آموزش دیده را تغییر دهد و در نتیجه خروجی آن را برای یک کار خاص تغییر دهد.‏‏LoRAسازگاری با رتبه پایین (LoRA)Low-Rank Adaptation در مدل‌های زبانی بزرگ، رویکرد دیگری در تنظیم دقیق مدلها برای وظایف یا حوزه‌های خاص است. مشابه اداپترها، LoRA نیز یک زیر ماژول کوچک قابل آموزش است که می تواند در معماری ترانسفورمرها وارد شود که شامل فریز کردن وزن‌های مدل از پیش آموزش‌دیده و تزریق ماتریس‌های تجزیه-رتبه rank-decomposition قابل آموزش به هر لایه از معماری ترانسفورمر است که تعداد پارامترهای قابل آموزش را کاهش می‌دهد. این روش می‌تواند تعداد پارامترهای قابل آموزش را تا 10000 برابر و نیاز به حافظه GPU را تا 3 برابر کاهش دهد، در حالی که همچنان در کارهای مختلف، با کیفیت مدل مشابه یا بهتر از تنظیم دقیق عمل می‌کند. LoRA همچنین امکان سوئیچینگ کارآمدتر را فراهم می کند، موانع سخت افزاری برای ورود را کاهش می دهد و در مقایسه با روش های دیگر، تاخیر برای استنتاج اضافی را ندارد.با استفاده از LoRA از  huggingface PEFT ، می توانیم تعداد پارامترهای قابل آموزش در مدل را به 0.77 درصد از نسخه اصلی کاهش دهیم.‏LoRA چگونه کار می کند؟‏LoRA به موازات ماژول ها در مدل ترانسفورمر از پیش آموزش دیده قرار می گیرد، به ویژه به موازات لایه های feed-forward. یک لایه feed-forward دارای دو لایه و یک لایه غیرخطی در بین آنها است، که در آن بردار ورودی با استفاده از تبدیل افین affine به یک بردار خروجی با ابعاد متفاوت نمایش داده می‌شود. لایه‌های LoRA در کنار هر یک از دو لایه feed-forward قرار می‌گیرند.حال، اجازه دهید لایه فید فوروارد up-project و LoRA را در کنار آن در نظر بگیریم. پارامترهای اصلی لایه feed-forward خروجی از لایه قبلی با ابعاد dmodel گرفته و آن را به dFFW می‌فرستند. در اینجا، FFW مخفف feed-forward است. ماژول LoRA که در کنار آن قرار گرفته است از دو لایه  feed-forward تشکیل شده است. اولین لایه فید فوروارد LoRA همان ورودی لایه feed-forward up-project را می گیرد و آن را در یک بردارr بعدی  که به مراتب کمتر از dmodel است، تبدیل می کند. سپس، لایه دوم feed-forward، بردار را به بردار دیگری با ابعاد dFFW تبدیل می کند. در نهایت، دو بردار با هم جمع می شوند تا نمایش نهایی را تشکیل دهند.همانطور که قبلاً بحث کردیم، تنظیم دقیق نمایش پنهان h محاسبه شده توسط مدل اصلی ترانسفورمر را تغییر می دهد. از این رو، در این مورد، نمایش پنهان محاسبه شده توسط لایه feed-forward up-project ترانسفورمر اصلی h است. در همین حال، بردار محاسبه شده توسط LoRA، تغییر افزایشی Δh است که برای اصلاح h اصلی استفاده می شود. بنابراین، مجموع نمایش اصلی و تغییر افزایشی، نمایش پنهان به روز شده ’h است.با قرار دادن ماژول‌های LoRA در کنار لایه‌های feed-forward و یک classifier head در بالای مدل از پیش آموزش‌دیده، پارامترها برای وظیفه خاص هر کار به حداقل می‌رسد.‏Prefix tuning‏متد Prefix tuning یک جایگزین سبک برای تنظیم دقیق مدل های زبانی بزرگ از پیش آموزش دیده برای وظایف خاص است. Prefix tuning پارامترهای مدل زبان را ثابت نگه می‌دارد و یک بردار کوچک پیوسته task-specific به نام prefix را بهینه می‌کند. در Prefix tuning، بردار prefix مجموعه ای از پارامترهای آزاد است که همراه با مدل زبانی آموزش داده می شود. هدف از prefix tuning یافتن زمینه ای است که مدل زبان را به سمت تولید متنی هدایت شود که یک کار خاص را حل می کند.‏متد Prefix tuning یک روش additive است که در آن دنباله‌ای از بردارهای پیوسته مخصوص تسک خاص به ابتدای ورودی یا پیشوند (prefix) متصل می شود. فقط پارامترهای پیشوند بهینه شده و به حالت های پنهان hidden state در هر لایه از مدل اضافه می شوند. توکن های جملات ورودی همچنین می توانند به عنوان توکن‌های مجازی به پیشوند توجه کنند. در نتیجه، تنظیم پیشوند 1000 برابر پارامترهای کمتری نسبت به یک مدل کاملاً تنظیم شده ذخیره می کند، به این معنی که می توانید از یک مدل زبان بزرگ برای بسیاری از کارها استفاده کنید.‏متد prefix را می توان دنباله ای از &#x27;توکن های مجازی&#x27; virtual tokens دانست که توکن های بعدی می توانند به آن توجه کنند. با یادگیری تنها 0.1٪ از پارامترها، prefix عملکردی قابل مقایسه با تنظیم دقیق در تنظیمات کامل داده را به دست می آورد، از تنظیم دقیق در تنظیمات با داده کم بهتر عمل می کند و به نمونه هایی با موضوعاتی که در طول آموزش دیده نمی شوند، بهتر عمل می کند.مشابه تمام تکنیک‌های PEFT که قبلاً ذکر شد، هدف نهایی تنظیم prefix رسیدن به h است. تنظیم prefix از پیشوندها برای اصلاح نمایش های پنهان استخراج شده توسط مدل های زبان اصلی از پیش آموزش داده شده استفاده می کند. هنگامی که تغییر افزایشی Δh به نمایش پنهان اصلی h اضافه می شود، نمایش اصلاح شده را دریافت می کنیم، یعنی ’h.هنگام استفاده از Prefix tuning، فقط prefix ها به روز می شوند، در حالی که بقیه لایه ها ثابت هستند و به روز نمی شوند.‏Prompt tuning‏Prompt tuning یکی دیگر از تکنیک های PEFT برای تطبیق مدل های زبان از پیش آموزش دیده با وظایف خاص پایین دست است. تنظیم پرامپت شامل یادگیری soft prompts از طریق پس انتشار خطا (backpropagation) است که می‌تواند برای کارهای خاص با استفاده از نمونه‌های برچسب‌گذاری شده تنظیم دقیق شود. Prompt tuning از یادگیری few-shot در GPT-3 بهتر عمل می کند و با افزایش اندازه مدل رقابتی تر می شود. همچنین در انتقال دامنه (domain transfer) استحکام (robustness) بیشتری دارد. این کار نیاز به ذخیره یک prompt کوچک مختص هر کار دارد، که استفاده مجدد از یک مدل ثابت را برای کار پایین‌دستی آسان‌تر می‌کند.چگونه کار می کند؟Prompt tuning یک نوع ساده تر از Prefix tuning است. در آن، برخی از بردارها در ابتدای دنباله در لایه ورودی قرار می گیرند. هنگامی که یک جمله ورودی ارائه می شود، لایه embedding، هر توکن را به بردار embedding متناظر خود تبدیل می کند و prefix embeddings به دنباله ی  token embeddings اضافه می شوند. در مرحله بعد، لایه‌های ترانسفورمر از قبل آموزش داده شده، دنباله جاسازی را مانند مدل ترانسفورمر با یک دنباله عادی پردازش می‌کنند. فقط prefix embeddings در طول فرآیند تنظیم دقیق تنظیم می‌شوند، در حالی که بقیه مدل ترانسفورمر ثابت و بدون تغییر نگه داشته می‌شوند.این تکنیک چندین مزیت نسبت به روش‌های تنظیم دقیق سنتی دارد، از جمله بهبود کارایی و کاهش سربار محاسباتی. علاوه بر این، این واقعیت که فقط prefix embedding تنظیم دقیق شده به این معنی است که خطر کمتری برای تطبیق بیش از حد با داده‌های آموزشی وجود دارد و در نتیجه مدل‌های قوی‌تر و قابل تعمیم‌تری تولید می‌شود.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Tue, 12 Sep 2023 11:51:37 +0330</pubDate>
            </item>
                    <item>
                <title>خلاصه‌ای از توکن‌سازها در پردازش زبان طبیعی</title>
                <link>https://virgool.io/@Aleereza/%D8%AE%D9%84%D8%A7%D8%B5%D9%87-%D8%A7%DB%8C-%D8%A7%D8%B2-%D8%AA%D9%88%DA%A9%D9%86-%D8%B3%D8%A7%D8%B2%D9%87%D8%A7-%D8%AF%D8%B1-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B7%D8%A8%DB%8C%D8%B9%DB%8C-oteuqgmpviz8</link>
                <description>‏Tokenization یک مرحله پیش پردازش برای اکثر برنامه های پردازش زبان طبیعی NLP است. توکن سازی شامل تقسیم متن به واحدهای کوچکتر به نام توکن‎‎‎‌ها (به عنوان مثال کلمات) به منظور تبدیل یک رشته ورودی بدون ساختار به دنباله‎‎‎‎‌ای از واحدهای جدا از یکدیگر که برای یک مدل یادگیری ماشینی ML مناسب است. در مدل های مبتنی بر یادگیری عمیق (به عنوان مثال BERT)، هر توکن به یک بردار نگاشت می شود تا به عنوان ورودی مدل استفاده شود.الگوریتم‌های توکن‌سازی زیرکلمه‌ (Subword tokenization) بر این اصل تکیه می‌کنند که کلمات پرکاربرد نباید به زیرکلمه‌های کوچک‌تر تقسیم شوند، بلکه کلمات نادر باید به زیرکلمه‌های معنادار تجزیه شوند. به عنوان مثال، &#x27;واژه annoyinglyبه معنی &#x27;آزاردهنده&#x27; ممکن است یک کلمه نادر در نظر گرفته شود و می تواند به &#x27;annoying&#x27; و &#x27;ly&#x27; تجزیه شود. هم annoying و هم ly به‌عنوان زیرکلمه‌های مستقل بیشتر در متون ظاهر می‌شوند، همچنین معنای annoyingly با ترکیب معنای annoying و ly نیز درک می‌شود. این به ویژه در زبان‌های پیوندی مانند ترکی مفید است، جایی که می‌توانید کلمات پیچیده (تقریباً) دلخواه خود را با اتصال زیرکلمه‌ها تشکیل دهید.توکن‌سازی زیرکلمه‌ Subword  به مدل اجازه می دهد تا اندازه مجموعه واژگان معقولی داشته باشد در حالی که قادر به یادگیری بازنمایی های معنادار مستقل از متن زمینه است. به‌علاوه، توکن‌سازی زیرکلمه‌ای، مدل را قادر می‌سازد تا کلماتی را که قبلاً ندیده است، با تجزیه آنها به زیرکلمه‌های شناخته شده پردازش کند. به عنوان مثال توکن‌سازی جمله &quot;!I have a new GPU&quot; &lt;من یک GPU جدید دارم!&gt; توسط BertTokenizer به شرح زیر است:&gt;&gt;&gt;from transformers import BertTokenizer 
&gt;&gt;&gt;tokenizer = BertTokenizer.from_pretrained(&amp;quotbert-base-uncased&amp;quot)
&gt;&gt;&gt;tokenizer.tokenize(&amp;quotI have a new GPU!&amp;quot)

 [&amp;quoti&amp;quot, &amp;quothave&amp;quot, &amp;quota&amp;quot, &amp;quotnew&amp;quot, &amp;quotgp&amp;quot, &amp;quot##u&amp;quot, &amp;quot!&amp;quot]از آنجا که ما مدل BERT base model (uncased) را استفاده می کنیم، ابتدا حروف lowercased می کند. می‌توانیم ببینیم که کلمات [&#x27;i&#x27;، &#x27;have&#x27;، &#x27;a&#x27;، &#x27;new&#x27;] در مجموعه واژگان توکنایزر وجود دارد، اما کلمه &#x27;gpu&#x27; وجود ندارد. در نتیجه، توکنایزر &#x27;gpu&#x27; را به زیرکلمه های شناخته شده تقسیم می کند: [&#x27;gp&#x27; و &#x27;##u&#x27;]. &#x27;##&#x27; به این معنی است که بقیه توکن باید بدون فاصله (برای رمزگشایی یا معکوس کردن توکن) به علامت قبلی متصل شود.به عنوان مثالی دیگر، XLNetTokenizer متن را به صورت زیر توکن می کند:&gt;&gt;&gt;from transformers import XLNetTokenizer
&gt;&gt;&gt;tokenizer = XLNetTokenizer.from_pretrained(&amp;quotxlnet-base-cased&amp;quot)
&gt;&gt;&gt;tokenizer.tokenize(&amp;quotDon&#039;t you love ? Transformers? We sure do.&amp;quot)

[&amp;quot▁Don&amp;quot, &amp;quot&#039;&amp;quot, &amp;quott&amp;quot, &amp;quot▁you&amp;quot, &amp;quot▁love&amp;quot, &amp;quot▁&amp;quot, &amp;quot?&amp;quot, &amp;quot▁&amp;quot, &amp;quotTransform&amp;quot, &amp;quoters&amp;quot, &amp;quot?&amp;quot, &amp;quot▁We&amp;quot, &amp;quot▁sure&amp;quot, &amp;quot▁do&amp;quot, &amp;quot.&amp;quot]وقتی به بخش SentencePiece در ادامه این مقاله برسیم به معنای &#x27;▁ &#x27; نیز برمی گردیم. همانطور که مشاهده می شود، کلمه کمیاب &#x27;Transformers&#x27; به زیرکلمه های متداول تر &#x27;Transform&#x27; و &#x27;ers&#x27; تقسیم شده است.بیایید اکنون به نحوه عملکرد الگوریتم‌های مختلف توکنایز زیرکلمه نگاه کنیم. توجه داشته باشید که همه الگوریتم‌های توکن‌سازی به آموزشی متکی هستند که معمولاً روی مجموعه‌ای انجام می‌شود که مدل مربوطه روی آن آموزش داده شده است.Byte-Pair Encoding (BPE)رمزگذاری زوج بایت (BPE) در مقاله Neural Machine Translation of Rare Words with Subword Units (Sennrich et al., 2015) معرفی شد. BPE به یک پیش_توکن‌ساز متکی است که داده‌های آموزشی را به کلمات تقسیم می‌کند. پیش_توکن‌سازی می‌تواند به سادگی توکن‌سازی بوسیله اسپیس باشد، به عنوان مثال GPT-2، روبرتا. پیش_توکن‌سازی پیشرفته تر شامل توکن سازی مبتنی بر قاعده است، به عنوان مثال XLM، FlauBERT که از تولکیت Moses برای اکثر زبان ها استفاده می کند، یا GPT که از Spacy و ftfy برای شمارش فراوانی هر کلمه در مجموعه آموزشی استفاده می کند.بعد از پیش_توکن‌سازی، مجموعه ای از کلمات منحصر به فرد ایجاد شده و فراوانی هر کلمه ای که در داده های آموزشی رخ می دهد مشخص شده است. در مرحله بعد، BPE یک مجموعه واژگان پایه متشکل از تمام سیمبل‌هایی که در مجموعه کلمات منحصر به فرد رخ می دهد ایجاد می کند و قواعد ادغام را می آموزد تا یک سیمبل‌ جدید از دو سیمبل‌ از واژگان پایه تشکیل دهد. این کار را تا زمانی انجام می دهد که واژگان به اندازه واژگان مورد نظر برسد. توجه داشته باشید که اندازه واژگان مورد نظر یک فراپارامتر است که قبل از آموزش توکنایزر باید تعریف شود.به عنوان مثال، فرض می کنیم که پس از پیش_توکن‌سازی، مجموعه کلمات زیر شامل فراوانی مشخص شده است:(&quot;hug&quot;, 10), (&quot;pug&quot;, 5), (&quot;pun&quot;, 12), (&quot;bun&quot;, 4), (&quot;hugs&quot;, 5)در نتیجه، واژگان پایه [&#x27;b&#x27;، &#x27;g&#x27;، &#x27;h&#x27;، &#x27;n&#x27;، &#x27;p&#x27;، &#x27;s&#x27;، &#x27;u&#x27;] است. با تقسیم تمام کلمات به سیمبل واژگان پایه، به دست می آوریم:(&quot;h&quot; &quot;u&quot; &quot;g&quot;, 10), (&quot;p&quot; &quot;u&quot; &quot;g&quot;, 5), (&quot;p&quot; &quot;u&quot; &quot;n&quot;, 12), (&quot;b&quot; &quot;u&quot; &quot;n&quot;, 4), (&quot;h&quot; &quot;u&quot; &quot;g&quot; &quot;s&quot;, 5)سپس BPE فرکانس هر جفت نماد ممکن را می شمارد و جفت نمادی را که بیشتر اتفاق می افتد انتخاب می‌کند. در مثال بالا، &#x27;h&#x27; که به دنبال آن u بیاید   15 = 10 + 5 بار وجود دارد (10 بار در 10 مورد HUG و 5 بار در 5 مورد hugs). با این حال، رایج ترین جفت نماد &#x27;u&#x27; و به دنبال آن &#x27;g&#x27; است که در مجموع 20 = 10 + 5 + 5  بار رخ می دهد. بنابراین، اولین قانون ادغامی که توکنایزر می‌آموزد این است که همه نمادهای &#x27;u&#x27; و سپس یک نماد &#x27;g&#x27; را با هم گروه بندی کند. بعد، &#x27;ug&#x27; به واژگان اضافه می شود. سپس مجموعه کلمات تبدیل می شود به:(&quot;h&quot; &quot;ug&quot;, 10), (&quot;p&quot; &quot;ug&quot;, 5), (&quot;p&quot; &quot;u&quot; &quot;n&quot;, 12), (&quot;b&quot; &quot;u&quot; &quot;n&quot;, 4), (&quot;h&quot; &quot;ug&quot; &quot;s&quot;, 5)سپس BPE متداول ترین جفت نماد بعدی را شناسایی می کند. &#x27;u&#x27; به دنبال آن &#x27;n&#x27; است که 16 بار تکرار می شود. &#x27;u&#x27;، &#x27;n&#x27; با &#x27;un&#x27; ادغام شده و به واژگان اضافه می شود. پرتکرارترین جفت نماد بعدی &#x27;h&#x27; و به دنبال آن &#x27;ug&#x27; است که 15 بار رخ می دهد. دوباره این جفت ادغام می شود و hug را می توان به مجموعه واژگان اضافه کرد.در این مرحله، واژگان [&#x27;b&#x27;، &#x27;g&#x27;، &#x27;h&#x27;، &#x27;n&#x27;، &#x27;p&#x27;، &#x27;s&#x27;، &#x27;u&#x27;، &#x27;ug&#x27;، &#x27;un&#x27;، &#x27;hug&#x27;] و ما هستند. مجموعه ای از کلمات منحصر به فرد به عنوان نشان داده شده است(&quot;hug&quot;, 10), (&quot;p&quot; &quot;ug&quot;, 5), (&quot;p&quot; &quot;un&quot;, 12), (&quot;b&quot; &quot;un&quot;, 4), (&quot;hug&quot; &quot;s&quot;, 5)با فرض اینکه آموزش رمزگذاری زوج بایت در این نقطه متوقف شود، قوانین ادغام آموخته شده سپس بر روی کلمات جدید اعمال می شود (تا زمانی که کلمات جدید شامل نمادهایی نباشند که در واژگان پایه نیستند). به عنوان مثال، کلمه bug به[&quot;b&quot;, &quot;ug&quot;] نشانه می شود، اما mug به عنوان [&quot;unk&gt;&quot;, &quot;ug&gt;&quot;] نشان داده می شود زیرا نماد &#x27;m&#x27; در واژگان پایه نیست. . به طور کلی، حروف منفرد مانند &#x27;m&#x27; با نماد &quot;&lt;unk&gt;&quot; جایگزین نمی‌شوند، زیرا داده‌های آموزشی معمولاً حداقل یک مورد از هر حرف را شامل می‌شود، اما احتمالاً برای کاراکترهای بسیار خاص مانند ایموجی‌ها اتفاق می‌افتد.همانطور که قبلا ذکر شد، اندازه واژگان، یعنی اندازه واژگان پایه + تعداد ادغام ها، یک فراپارامتر است. به عنوان مثال GPT دارای اندازه واژگان 40478 است زیرا آنها 478 کاراکتر پایه دارند و تصمیم گرفتند پس از 40000 ادغام آموزش را متوقف کنند.Byte-level BPEیک مجموعه واژگان پایه که شامل تمام کاراکترهای پایه ممکن است می تواند بسیار بزرگ باشد. اگر به عنوان مثال همه کاراکترهای یونیکد به عنوان کاراکترهای پایه در نظر گرفته می شوند. برای داشتن واژگان پایه بهتر، GPT-2 از بایت ها به عنوان واژگان پایه استفاده می کند، که یک ترفند هوشمندانه برای وادار کردن واژگان پایه به اندازه 256 است و در عین حال اطمینان می دهد که هر کاراکتر پایه در واژگان گنجانده شده است. با برخی قواعد اضافی برای مقابله با علائم نقطه گذاری، توکنایزر GPT2 می تواند هر متنی را بدون نیاز به نماد &lt;unk&gt; توکنیزه کند. GPT-2 دارای اندازه واژگان 50257 است که با توکن های پایه 256 بایتی، یک توکن ویژه برای پایان متن  و نمادهایی که از 50000 ادغام یاد گرفته شده‌اند به دست آمده است.WordPiece‏WordPiece الگوریتم توکن سازی زیرکلمه ای است که برای BERT، DistilBERT و Electra استفاده می شود. این الگوریتم در Japanese and Korean Voice Search (Schuster et al., 2012) تشریح شد و بسیار شبیه BPE است. WordPiece ابتدا واژگان را برای گنجاندن هر کاراکتر موجود در داده‌های آموزشی مقداردهی اولیه می‌کند و به تدریج تعداد معینی از قواعد ادغام را یاد می گیرد. برخلاف BPE، روش WordPiece ‏متداول‌ترین جفت نماد را انتخاب نمی‌کند، بلکه یکی را انتخاب می‌کند که احتمال داده‌های آموزشی را پس از افزودن به واژگان را به حداکثر می‌رساند.این دقیقا به چه معناست؟ با اشاره به مثال قبلی، به حداکثر رساندن احتمال داده های آموزشی معادل یافتن جفت نماد است که احتمال تقسیم آن بر احتمالات نماد اول و سپس نماد دوم آن، در بین تمام جفت نمادها بیشترین است. به عنوان مثال &#x27;u&#x27; و سپس &#x27;g&#x27; تنها در صورتی با هم ادغام می‌شوند که احتمال &quot;ug&quot;تقسیم بر &quot;u&quot;, &quot;g&quot; بیشتر از هر جفت نماد دیگری باشد. به طور شهودی، WordPiece کمی با BPE متفاوت است زیرا آنچه را که با ادغام دو نماد از دست می دهد ارزیابی می کند تا مطمئن شود ارزشش را دارد.Unigram‏Unigram یک الگوریتم نشانه‌سازی Subword است که در Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidates (Kudo, 2018) معرفی شده است. برخلاف BPE یا WordPiece، یونیگرام واژگان پایه خود را به تعداد زیادی نماد مقداردهی می کند و به تدریج هر نماد را کاهش می دهد تا واژگان کوچکتری به دست آورد. برای مثال، واژگان پایه می تواند با تمام کلمات از پیش توکن‌سازی شده و رایج ترین substringها مطابقت داشته باشد. Unigram به طور مستقیم برای هیچ یک از مدل های ترانسفورمر استفاده نمی شود، اما همراه با SentencePiece استفاده می شود.در هر مرحله آموزشی، الگوریتم Unigram با توجه به واژگان فعلی و یک مدل زبانی unigram، تابع هزینه (loss) (اغلب به عنوان log-likelihood تعریف می‌شود) را بر روی داده‌های آموزشی تعریف می‌کند. سپس، برای هر نماد در واژگان، الگوریتم محاسبه می کند که اگر نماد از واژگان حذف شود، هزینه کلی چقدر افزایش می یابد. سپس Unigram نماد p را حذف می کند (که p معمولاً 10٪ یا 20٪) درصد نمادهایی است که افزایش هزینه آنها کمترین است، یعنی آن نمادهایی که کمترین تأثیر را بر هزینه کلی در داده های آموزشی دارند. این روند تا زمانی که واژگان به اندازه دلخواه برسد تکرار می شود. الگوریتم Unigram همیشه کاراکترهای پایه را نگه می دارد تا هر کلمه ای را بتوان توکن‌گذاری کرد.از آنجایی که Unigram بر اساس قوانین ادغام نیست (برخلاف BPE و WordPiece)، الگوریتم چندین روش برای توکن کردن متن جدید پس از آموزش دارد. به عنوان مثال، اگر یک توکنایزر Unigram آموزش دیده این واژگان را به نمایش بگذارد:[&amp;quotb&amp;quot, &amp;quotg&amp;quot, &amp;quoth&amp;quot, &amp;quotn&amp;quot, &amp;quotp&amp;quot, &amp;quots&amp;quot, &amp;quotu&amp;quot, &amp;quotug&amp;quot, &amp;quotun&amp;quot, &amp;quothug&amp;quot],‏&#x27;hugs&#x27; را می توان به صورت [&quot;hug&quot;, &quot;s&quot;]، [&quot;h&quot;, &quot;ug&quot;, &quot;s&quot;] یا [&quot;h&quot;, &quot;u&quot;, &quot;g&quot;, &quot;s&quot;] توکن گذاری کرد. پس کدام را انتخاب کنیم؟ Unigram علاوه بر ذخیره واژگان، احتمال هر نشانه را در مجموعه آموزشی ذخیره می کند تا احتمال هر توکن سازی ممکن پس از آموزش محاسبه شود. این الگوریتم به سادگی محتمل‌ترین توکن‌سازی را در عمل انتخاب می‌کند، اما همچنین امکان نمونه‌برداری از توکن‌سازی ممکن را با توجه به احتمالات آن‌ها ارائه می‌دهد.این احتمالات با هزینه‌ای که توکنایزر روی آن آموزش دیده است، تعریف می شود. با فرض اینکه داده های آموزشی از کلمات x1​,…,xN تشکیل شده است و مجموعه ای از تمام توکنهای ممکن برای یک کلمه xi رابه صورت S(x_{i})S(x) تعریف می شود. S(xi​) سپس هزینه کلی به صورت تعریف می شودSentencePieceهمه الگوریتم‌های توکن‌سازی که تاکنون توضیح داده شد، مشکل یکسانی دارند: فرض بر این است که متن ورودی از اسپیس برای جدا کردن کلمات استفاده می‌کند. با این حال، همه زبان ها از اسپیس برای جدا کردن کلمات استفاده نمی کنند. یکی از راه حل های ممکن استفاده از پیش_توکنایزر خاص زبان است، به عنوان مثال XLM از یک پیش توکنایزر خاص چینی، ژاپنی و تایلندی استفاده می کند. برای حل این مشکل SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing (Kudo et al., 2018) ورودی را به عنوان یک جریان ورودی خام در نظر می‌گیرد، بنابراین اسپیس در مجموعه کاراکترها برای استفاده در نظر گرفته میشود. سپس از الگوریتم BPE یا unigram برای ساخت واژگان مناسب استفاده می کند.برای مثال XLNetTokenizer  از SentencePiece استفاده می کند، به همین دلیل است که در مثال قبلی کاراکتر &quot;▁&quot; در واژگان گنجانده شده است. رمزگشایی با SentencePiece بسیار آسان است زیرا همه توکنها را می توان به هم متصل کرد و &quot;▁&quot; با یک فاصله جایگزین می شوند.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Tue, 07 Feb 2023 11:37:35 +0330</pubDate>
            </item>
                    <item>
                <title>اسکیپگرام Skipgram</title>
                <link>https://virgool.io/@Aleereza/%D8%A7%D8%B3%DA%A9%DB%8C%D9%BE%DA%AF%D8%B1%D8%A7%D9%85-skipgram-yje57gucs1oq</link>
                <description>اگر قسمت اول و دوم و سوم این مقاله را مطالعه نکرده اید بهتر است ابتدا به آن نگاهی بیاندازید.به جای اینکه فقط دو کلمه  قبل از کلمه مورد نظر جستجو کنیم ، می توانیم به دو کلمه بعد از آن هم نگاه کنیم.با انجام این کار مجموعه داده ای که ما در حال ساخت و آموزش مدل ارائه می دهیم به این شکل خواهد بود:این معماری Bag of Words پیوسته نامیده می شود و در یکی از مقالات word2vec  شرح داده شده است. معماری دیگر به جای حدس یک کلمه بر اساس زمینه آن (کلمات قبل و بعد از آن) ، سعی می کند کلمات همسایه را با استفاده از کلمه فعلی حدس بزند. می توانیم پنجره ای را که در برابر متن آموزشی قرار می گیرد به این شکل بدانیم:باکس صورتی در زیر جمله با سایه های مختلف ترسیم شده است چون این پنجره کشویی در واقع چهار نمونه جداگانه در مجموعه آموزش ما ایجاد می کند:این روش معماری skipgram نامیده می شود. ما می توانیم با پنجره کشویی بصورت زیر عمل کنیم:این عبارت چهار نمونه را به مجموعه آموزش ما اضافه می کند:سپس پنجره خود را به موقعیت بعدی می کشیم:که چهار مثال بعدی ما را ایجاد می کند:چند موقعیت بعد ، ما نمونه های بسیار بیشتری داریم:بازبینی روند آموزشاکنون که مجموعه داده های آموزش اسکیپگرام را که از متن موجود موجود استخراج کرده ایم را داریم، بیایید نگاهی به نحوه استفاده از آن برای آموزش یک مدل اساسی زبان عصبی که کلمه همسایه را پیش بینی می کند ، بیاندازیم.با اولین نمونه در مجموعه داده خود شروع می کنیم. این ویژگی را می گیریم و به مدل آموزش ندیده می خورانیم که از آن می خواهد یک کلمه همسایه مناسب را پیش بینی کند.این مدل سه مرحله را انجام می دهد و یک بردار پیش بینی (با احتمال اختصاص داده شده به هر کلمه در واژگان آن) را خارج می کند. از آنجا که این مدل آموزش ندیده است ، مطمئناً پیش بینی آن در این مرحله اشتباه است. اما مشکلی نیست ما می دانیم که چه کلمه ای باید حدس زده باشد - ستون برچسب/خروجی در ردیفی که در حال حاضر برای آموزش مدل استفاده می کنیم:مدل چقدر فاصله داشت؟ ما دو بردار را از هم کم میکنیم و یک بردار خطا به عنوان نتیجه داریم:این بردار خطا اکنون می تواند برای به روزرسانی مدل مورد استفاده قرار گیرد ، بنابراین دفعه بعدی ، احتمال اینکه کلمه thou را حدس بزنید وقتی ورودی not است کمی بیشتر است.و اولین مرحله آموزش به پایان می رسد. همین کار را با نمونه بعدی در مجموعه داده خود انجام می دهیم و سپس سراغ نمونه بعد میرویم تا زمانی که همه نمونه های مجموعه داده را پوشش دهیم و این، نتیجه یک دوره (epoch) آموزش است. ما این کار را برای چندین دوره دوباره انجام می دهیم و سپس مدل آموزش دیده را داریم و می توانیم ماتریس جاسازی را از آن استخراج کرده و برای هر کاربرد دیگری از آن استفاده کنیم.اگرچه آنچه یاد گرفتیم درک ما از روند کار گسترش می دهد، اما هنوز نحوه آموزش word2vec نیست. ما چند ایده اصلی را از دست داده ایم.نمونه گیری منفیسه مرحله چگونگی محاسبه پیش بینی این مدل زبان عصبی را به یاد بیاورید:مرحله سوم از نظر محاسباتی بسیار پرهزینه است - خصوصاً اینکه بدانید ما این کار را فقط یک بار برای هر نمونه آموزش در مجموعه داده خود انجام نخواهیم داد (به راحتی ده ها میلیون بار). برای بهبود عملکرد باید کاری انجام دهیم.یک راه تقسیم هدف به دو مرحله است:ایجاد جاسازی کلمات با کیفیت بالا (نگران پیش بینی کلمه بعدی نباشید).استفاده از این جاسازی با کیفیت برای آموزش مدل زبان (برای انجام پیش بینی کلمه بعدی)بیایید روی مرحله 1 تمرکز خواهیم کنیم. در این مقاله همانطور که روی جاسازیها تمرکز داریم برای تولید جاسازیهای با کیفیت بالا برای استفاده در یک مدل با عملکرد بالا، ما می توانیم وظیفه مدل را از پیش بینی یک کلمه همسایه تغییر دهیم:و آن را به مدلی تغییر دهید که کلمه ورودی و خروجی را می گیرد و نمره ای را به شما نشان می دهد که مشخص میکند همسایه هستند یا نه (0 برای &quot;همسایه نیست&quot; ، 1 برای &quot;همسایه&quot;).این تغییر ساده، مدل مورد نیاز ما را از یک شبکه عصبی به یک مدل رگرسیون لجستیک تغییر می دهد - بنابراین محاسبه آن بسیار ساده و سریعتر می شود.این تغییر مستلزم آن است که ما ساختار مجموعه داده خود را تغییر دهیم - برچسب کنونی یک ستون جدید با مقادیر 0 یا 1 است که همه 1 خواهند بود زیرا تمام کلماتی که اضافه کردیم همسایه هستند.اکنون می توان محاسبات را با سرعت بسیار زیاد انجام داد و میلیون ها نمونه را در عرض چند دقیقه پردازش کرد. اما یک حفره وجود دارد که باید آن را ببندیم. اگر همه مثال ها مثبت باشند (هدف: 1) ، ما با مدل زرنگی روبرو هستیم که احتمالا همیشه 1 را برمی گرداند - دستیابی به 100٪ دقت ، اما چیزی یاد نگرفته و جاسازیهای آشغال ایجاد می کند.برای حل این مشکل، باید نمونه های منفی را به مجموعه داده خود بخورانیم - نمونه کلماتی که همسایه نیستند و مدل ما برای آن نمونه ها باید مقدار 0 برگرداند. اکنون مدل با چالشی روبرو است که برای حل آن باید سخت تلاش کند اما هنوز هم با سرعت زیاد.اما کلمات خروجی با چه چیزهایی پر می کنیم؟ ما کلمات را به طور تصادفی از واژگان خود انتخاب می کنیماین ایده از برآورد انقباضی نویز الهام گرفته شده است. ما سیگنال واقعی (نمونه های مثبت کلمات همسایه) را با نویز (کلمات تصادفی انتخاب شده که همسایه نیستند) مقایسه می کنیم. این امر منجر به کارایی محاسباتی و آماری بالایی می شود. اسکیپگرام Skipgram با نمونه گیری منفی (SGNS)اکنون این دو ایده را در word2vec می آوریم که به آنها skipgram با نمونه گیری منفی گفته می شود.فرایند آموزش Word2vecاکنون که دو ایده اصلی skipgram و نمونه گیری منفی را تثبیت کردیم ، می توانیم به روند آموزش word2vec نزدیک تر نگاه کنیم.قبل از شروع فرایند آموزش ،متنی را که با آن در حال آموزش مدل هستیم، پیش پردازش می کنیم. در این مرحله ، ما اندازه واژه نامه را تعیین می کنیم (به این  vocab_size می گوییم ، مثلاً 10000 واژه) و چه کلماتی به آن تعلق دارند.در شروع مرحله آموزش ، ما دو ماتریس ایجاد می کنیم - یک ماتریس Embedding و یک ماتریس Context. این دو ماتریس برای هر کلمه در واژه نامه ما یک جاسازی دارد. (پس یکی از ابعاد آنها vocab_size است). بعد دوم به آن بستگی دارد که ابعاد جاسازی ما چقدر است(embedding_size = 300 یک مقدار معمول است ، اما ما قبلاً در این پست مقدار 50 داشتیم).در آغاز فرایند آموزش ، ماتریس ها را با مقادیر تصادفی مقداردهی اولیه می کنیم. سپس مراحل آموزش را شروع می کنیم. در هر مرحله آموزش ، یک مثال مثبت و مثالهای منفی مرتبط با آن را در نظر می گیریم. بیایید اولین گروه را ببینیم:سپس ، ما ضرب داخلی از جاسازی کلمه ورودی با هر یک از جاسازیهای context را محاسبه می کنیم. در هر حالت ، این امر منجر به یک عدد می شود که نشان دهنده شباهت ورودی و متن جاسازی شده است.اکنون ما به روشی نیاز داریم که بتوانیم این امتیاز را به چیزی شبیه احتمالات تبدیل کنیم - باید همه مقادیر مثبت باشند و مقداری بین صفر تا یک داشته باشند.  برای این یک کار تابع سیگموئید عالی است.اکنون می توانیم خروجی تابع سیگموئید را به عنوان خروجی مدل برای این نمونه ها در نظر بگیریم. می بینید که taco بالاترین امتیاز را دارد و aaron هم قبل و هم بعد از عمل سیگموئید همچنان کمترین امتیاز را دارد.اکنون که مدل آموزش ندیده پیش بینی کرده و با دیدن اینکه یک برچسب هدف واقعی برای مقایسه داریم ، بیایید محاسبه کنیم که خطای پیش بینی مدل چقدر است. برای انجام این کار ، ما فقط نمرات سیگموئید را از برچسب های هدف کم می کنیم.در اینجا دیگر بخش &quot;یادگیری&quot; از &quot;یادگیری ماشین&quot; است. اکنون می توانیم از این نمره خطا برای تنظیم جاسازیهای (not, thou, aaron, taco) استفاده کنیم تا دفعه بعد که این محاسبه را انجام دادیم ، نتیجه به امتیازات هدف نزدیکتر شود.حال چندین بار در کل مجموعه داده حرکت میکنیم تا جاسازی ها بهبود یابند. سپس می توانیم روند آموزش را متوقف کنیم ، ماتریس Context را کنار بگذاریم و از ماتریس Embeddings به عنوان جاسازیهای آموزش دیده خود برای کار بعدی استفاده کنیم.اندازه پنجره و تعداد نمونه های منفیدو پارامتر اصلی در فرایند آموزش word2vec، اندازه پنجره و تعداد نمونه های منفی است.فعالیتهای مختلف با اندازه های مختلف پنجره بهتر انجام می شوند. یک ایده ابتکاری این است که اندازه پنجره های کوچکتر (2 تا 15) منجر به جاسازی هایی می شود که شباهت زیاد بین دو جاسازی نشان دهنده این است که کلمات در آن قابل تعویض هستند (توجه داشته باشید که کلمات متضاد اغلب قابل تعویض با یکدیگرند - اگر فقط به کلمات اطراف آنها نگاه کنیم - به عنوان مثال خوب و بد اغلب در متن های مشابه ظاهر می شوند). اندازه پنجره های بزرگتر (15تا 50 یا حتی بیشتر) منجر به جاسازیهایی می شود که در آن شباهت بیشتر نشان دهنده رابطه بین کلمات است. در عمل ،اغلب باید دلایلی ارائه دهید که روند جاسازی را هدایت کند و منجر به کارایی مفید برای کار شما شود. اندازه پنجره پیش فرض Gensim مقدار 5 است (دو کلمه قبل و دو کلمه بعد از کلمه ورودی ، علاوه بر خود کلمه ورودی).تعداد نمونه های منفی عامل دیگری در روند آموزش است. مقاله اصلی 5 تا 20  را به عنوان تعداد خوبی از نمونه های منفی تجویز می کند. همچنین بیان می کند که به نظر تعداد 2 تا 5 وقتی مجموعه داده‌ی کافی در اختیار داشته باشید کفایت میکند. پیش فرض Gensim تعداد 5 نمونه منفی است.منبع:https://jalammar.github.io/illustrated-word2vec/</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Tue, 22 Sep 2020 11:33:33 +0330</pubDate>
            </item>
                    <item>
                <title>مدل سازی زبان</title>
                <link>https://virgool.io/@Aleereza/%D9%85%D8%AF%D9%84-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%B2%D8%A8%D8%A7%D9%86-e3wzv8vmwljm</link>
                <description>اگر قسمت اول و دوم این مقاله را مطالعه نکرده اید بهتر است ابتدا به آن نگاهی بیاندازید.اگر کسی بخواهد مثالی از برنامه NLP بیاورد، یکی از بهترین نمونه ها، ویژگی پیش بینی کلمه بعدی صفحه کلید تلفن هوشمند است. ویژگی‌ای که میلیاردها نفر هر روز صدها بار از آن استفاده می کنند.پیش بینی کلمه بعدی کاری است که می تواند توسط یک مدل زبان انجام شود. یک مدل زبان می تواند لیستی از کلمات را به عنوان ورودی بگیرد (اجازه دهید فقط دو کلمه را بگوییم) و سعی در پیش بینی کلمه ای دارد که به دنبال آن می‌آید.در تصویر زیر، به دنبال مدلی هستیم که این دو کلمه سبز را گرفته است (thou shalt) (به معنی تو باید) و لیستی از پیشنهادات را برگردانده است (نه فقط بالاترین احتمال را):می توانیم مدل را شبیه این جعبه سیاه بدانیم:اما در عمل ، این مدل فقط یک کلمه تولید نمی کند. در واقع برای همه واژگانی که بلد است یک امتیاز احتمالی ارائه می دهد (&quot;واژه نامه&quot; مدل که می تواند از چند هزار تا بیش از یک میلیون کلمه باشد) سپس برنامه &quot;صفحه کلید&quot; باید کلماتی را که بالاترین امتیاز را دارد را پیدا کند و آن را به کاربر ارائه دهد.خروجی مدل زبان عصبی برای تمام کلماتی که مدل می داند یک امتیاز احتمالی است. ما در اینجا با درصد به مقدار احتمال اشاره می کنیم ، اما در بردار خروجی 40٪ در واقع 0.4 نشان داده می شود.اولین قدم، جاسازی کلمات است. در فرآیند آموزش، ماتریسی که شامل جاسازی هر کلمه در واژه نامه است به دست آید. در زمان پیش بینی، ما از ماتریس جاسازی، کلمات ورودی را جستجو می کنیم و از آن برای محاسبه امتیاز پیش بینی استفاده می کنیم:بیایید اکنون به فرایند آموزش برگردیم تا در مورد چگونگی توسعه ماتریس جاسازی کلمات، اطلاعات بیشتری کسب کنیم.آموزش مدل زبانی&amp;quotبا متوقف كردن فرآیند نمی توان آن را فهمید. درک باید با روند حرکت کند، به آن بپیوندد و با آن جریان یابد.&amp;quot ~Duneمدلهای زبان نسبت به اکثر مدلهای یادگیری ماشین یک مزیت بزرگ دارند. مزیت آنها اینست که ما می توانیم آنها را با متن آموزش دهیم و از طرف دیگر متن هم زیاد در اختیار داریم. به همه کتابها، مقالات، محتوای ویکی پدیا و سایر فرمهای داده های متنی که در اطراف ماست فکر کنید. حالا این را با مدلهای یادگیری ماشین که به ویژگی دهی دستی و جمع آوری داده های  مخصوص نیاز دارد ، مقایسه کنید.جاسازی کلمات توسط ما انجام میشود و ما هستیم که می خواهیم کدام کلمه در کنار کدام کلمات ظاهر شوند. مکانیزم آن به این صورت است که:1- ما داده های متنی زیادی را میگیریم (مثلاً تمام مقالات ویکی پدیا). سپس2- ما یک پنجره داریم (مثلاً پنجره سه کلمه ای) که بر روی همه متن می لغزانیم.3-پنجره کشویی نمونه های آموزشی را برای مدل ما ایجاد می کند.وقتی این پنجره در برابر متن قرار می گیرد ، ما عملا یک مجموعه داده تولید می کنیم که برای آموزش مدل استفاده می شود. برای بررسی دقیق نحوه انجام این کار ، بیایید ببینیم که پنجره کشویی چگونه این عبارت را پردازش می کند:ما دو کلمه اول را به عنوان ویژگی می گیریم و کلمه سوم را برچسب می زنیم:سپس پنجره خود را به موقعیت بعدی می کشیم و نمونه دوم را ایجاد می کنیم:و خیلی زود یک مجموعه داده بزرگ داریم که در آن تمایل پدیداری کلمات بعد از جفت کلمات مختلف مشخص شده است:در عمل ، وقتی ما پنجره را حرکت میدهیم ، مدل ما آموزش می بیند. البته تفکیک مرحله &quot;تولید مجموعه داده&quot; از مرحله &quot;آموزش&quot; مشخص است. گذشته از رویکردهای مبتنی بر شبکه عصبی در مدل سازی زبان ، معمولاً از روشی به نام N-gram برای آموزش مدل های زبان استفاده می شود (نگاه کنید به: فصل 3 پردازش گفتار و زبان). برای مشاهده چگونگی تغییرات مدل از N-gram به مدل عصبی بر روی محصولات دنیای واقعی ، در اینجا یک پست 2015 وبلاگ از Swiftkey ، صفحه کلید Android، که در آن مدل زبان عصبی خود را معرفی کرده و آن را با مدل قبلی N-gram مقایسه می کند را بررسی میکنیم. این مثال را دوست دارم چون به شما نشان می دهد چگونه می توان ویژگیهای الگوریتمی جاسازی کلمه در مباحث تجاری نشان داد.به دو طرف نگاهی بیاندازیم:&amp;quotپارادوکس نوعی اشاره گر است که به شما می گوید فراتر از آن نگاه کنید. اگر پارادوکس شما را آزار می دهد ، تمایل شما برای مطلق بودن را نشان میدهد. نسبی گرایی با یک پارادوکس به عنوان یک تفکر جالب یا شاید سرگرم کننده یا حتی ترسناک برخورد می کند.&amp;quot ~ God Emperor of Duneبا دانستن آنچه که از اوایل پست می دانید ، جای خالی را پر کنید:متنی که در اینجا داریم پنج کلمه قبل از کلمه خالی است (و نزدیک ترین کلمه که به آن اشاره میکند &quot;اتوبوس&quot; است). من مطمئنم که اکثر مردم کلمه اتوبوس در جای خالی حدس می زنند. اما اگر من یک اطلاعات دیگر به شما بدهم - یک کلمه بعد از جای خالی ، آیا این پاسخ شما را تغییر می دهد؟این عبارت کاملا آنچه را که باید در جای خالی باشد عوض می کند. اکنون کلمه &quot;قرمز&quot; به احتمال زیاد جای خالی را پر میکند. پس ما یاد گرفتیم کلمات قبل و بعد از یک کلمه خاص دارای ارزش اطلاعاتی هستند. پس به نظر می رسد که محاسبات از هر دو جهت (کلمات سمت چپ و راست کلمه ای که حدس می زنیم) منجر به جاسازی بهتر کلمه می شود. بیایید ببینیم که چگونه می توانیم روش آموزش مدل را متناسب با این مورد تنظیم کنیم.</description>
                <category>علیرضا مدنی</category>
                <author>علیرضا مدنی</author>
                <pubDate>Tue, 22 Sep 2020 11:23:31 +0330</pubDate>
            </item>
            </channel>
</rss>