<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های پوریا اعظمی</title>
        <link>https://virgool.io/feed/@pooriaazami</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 15:00:13</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/311032/avatar/J3CyoH.jpg?height=120&amp;width=120</url>
            <title>پوریا اعظمی</title>
            <link>https://virgool.io/@pooriaazami</link>
        </image>

                    <item>
                <title>نقشه راه هوش‌مصنوعی</title>
                <link>https://virgool.io/@pooriaazami/%D9%86%D9%82%D8%B4%D9%87-%D8%B1%D8%A7%D9%87-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-enynhdk5wzee</link>
                <description>بعد از انتشار اولین ورژن ChatGPT توجه ها به هوش مصنوعی خیلی بیشتر شد و آدم های بیشتری میخوان وارد این حوزه بشن، برای همین تصمیم گرفتم این پست ویرگول رو بنویسم و از تجربه خودم تو این مسیر بگم، شاید به دردتون بخوره.پیش نیاز هااول از همه که قبل از شروع هوش مصنوعی انتظار میره که برنامه نویسی رو بلد باشید و به طور خاص برنامه نویسی با زبان پایتون رو باید حتما یاد بگیرید. البته از زبان های دیگه هم میشه استفاده کرد ولی کارتون خیلی سخت تر خواهد بود چون برای هیچ زبانی به گستردگی پایتون کتابخونه های هوش مصنوعی وجود نداره.دومین مهارتی که خیلی تاثیر گذاره و واقعا بهتون کمک میکنه زبان انگلیسیه، گرچه الان منابع فارسی هم برای یادگیری هوش‌مصنوعی وجود داره اما اگر بخواید تکنولوژی های جدید رو مطالعه کنید و از اون ها استفاده کنید باید از منابع اصلی (مثل مقاله ها)، بخونید که همه انگلیسی هستند.انتخاب هدفقبل از اینکه شروع به خوندن هوش مصنوعی کنید حتما هدفتون از هوش‌مصنوعی خوندن رو مشخص کنید. اگر میخواید برای پروژه ی دانشگاهی از هوش استفاده کنید خیلی فرق داره با اینکه بخواید مقاله بدید. یا اگر قراره هوش‌مصنوعی رو به عنوان شغل آیندتون انتخاب کنید خیلی فرق داره با اینکه بخواید صرفا باهاش آشنا بشید.به طور کلی دو حالت متفاوت برای هوش‌مصنوعی خوندن میتونید در نظر بگیرید، یکی برای کار های دانشگاهی مربوط به هوش‌مصنوعی (مقاله دادن و بهبود روش های هوش‌مصنوعی) و حالت دوم استفاده های صنعتی، پروژه های دانشگاهی برای رشته های دیگه و این جور موارده.تو مورد اول شما باید با ریاضیات هوش سر و کله بزنید و از روش کار کردن الگوریتم های مختلف سر در بیارید و اونا رو کامل بفهمید که نیاز داره ریاضیات قوی ای داشته باشید ولی تو حالت دوم صرفا باید بتونید از الگوریتم ها استفاده کنید و نتایج رو برسی و بهبود بدید.در نهایت هم توصیه ی من به کسی که میخواد به هوش‌مصنوعی به عنوان شغل آینده نگاه کنه اینه که اول کلیت الگوریتم ها رو یاد بگیره و بعد تا جای ممکن تو مفاهیم عمیق بشه. این فیلد هنوز هم از نظر آکادمیک خیلی جای پیشرفت داره و بخش زیادی از پیشرفت های علمی هوش مصنوعی توسط شرکت ها انجام میشه و این یعنی شما به عنوان یک مهندس هوش مصنوعی تو فضای کاملا غیر دانشگاهی هم احتمالا با مقاله دادن و استفاده از روش های جدید و دست کم فهمیدن روش های جدید سر و کار خواهید داشت.ریاضیاتقبل از توضیح این بخش بگم که اگر میخواید صرفا برای پروژه دانشگاهی یا کار های صنعتی از هوش استفاده کنید و در کل نمیخواید خیلی توی الگوریتم های عمیق بشید میتویند بدون خوندن ریاضیات شروع کنید ولی اگر رشتتون هوش مصنوعیه یا میخواید در این زمینه مقاله بدید یا میخواید الگوریتم ها رو عمیق یاد بگیرید حتما ریاضیات رو بخونید.یکی از مشکلات ریاضیات هوش، به خصوص برای بچه های کامپیوتری، اینه که ریاضیاتی که به درد این زمینه میخوره معمولا تو دانشگاه ها تدریس نمیشن یا اگر هم تدریس بشن جوری تدریس نمیشن که در نهایت به درد دانشجو بخوره و معمولا برای دانشجو ها سخته که ریاضی بخونن ولی نکته ی مهم اینه که اگر از منابع درست استفاده کنید و براش زمان بذارید خیلی راحت میتونید ریاضیات هوش رو بخونید.تنها پیش نیازی که برای ریاضیات هوش‌مصنوعی وجود داره، حسابان در حد دبیرستانه (به خصوص تابع و مشتق). در ادامه باید مباحث جبرخطی، احتمال و آمار رو بخونید. با خوندن این موارد بخش زیادی از ریاضیات مورد نیاز رو یاد میگیرید، البته باز هم مباحثی هست که ممکنه باهاش برخورد داشته باشید و تو این موارد نباشن ولی خیلی کم هستند و به جز چند مورد خاص نیازی به اونها ندارید.برای جبرخطی منبعی که خودم ازش استفاده کردم دوره ی پرفسور Gilbert Strang هست که میتونید از این لینک دوره رو ببینید. برای احتمال هم دوره ی Statistics 110: probability دانشگاه Harvard دوره ی خوبیه که میتونید از این لینک دوره رو ببینید.بعد از این دو تا دوره شما عملا بخش زیادی از ریاضیات هوش مصنوعی رو بلدید و میتونید با خیال راحت شروع به خوندن ماشین‌لرنینگ کنید. اما اگر میخواید باز هم مباحث بیشتری رو بخونید و یا میخواید توی زمین های دیتاساینس فعالیت کنید توصیه میکنم حتما یک مقداری آمار هم بخونید. برای آمار میتونید با دوره ی Data Analysis with R Specialization دانشگاه Duke که از این لینک میتونید بهش دسترسی داشته باشید شروع کنید و در ادامه دوره ی Bayesian Statistics Specialization رو بگذرونید که از این لینک میتونید بهش دسترسی داشته باشید.یادگیری ماشینبرای خوندن مباحث ML منابع خیلی زیادی وجود داره، برای شروع دوره ی Machine Learning Specialization سایت Coursera که از این لینک میتونید بهش دسترسی داشته باشید دوره ی خیلی خوبیه و بعد از تموم کردن این دوره اگر بخواید مباحث رو عمیق تر یاد بگیرید دوره ی CS229 دانشگاه استنفورد که از این لینک میتونید بهش دسترسی داشته باشید دوره ی خیلی خوبیه. موضوعی که باید بهش اشاره کنم اینه که این دوره ریاضیات خیلی زیادی داره و حتی برای دانشجو های استفورد هم دوره ی سختی حساب میشه، اگر نمیخواید خیلی درگیر ریاضیات بشید به هیچ وجه سمت این دوره نرید.به جز دوره هایی که گفتم میتونید از کتاب های ماشین لرنینگ هم کمک بگیرید، سه تا از معروف ترین کتاب های ML اینا هستند: 1- pattern recognition and machine learning از Christopher Bishop2-  Machine Learning: A Probabilistic Perspective از Kevin P. Murphy3- Machine Learning از Tom Mitchellاگر حوصله ی کتاب خوندن رو دارید حتما دو تا کتاب اول رو بخونید. (البته در نظر داشته باشید که این کتاب ها هم بیشتر کاربرد آکادمیک داره) برای تمرین ماشین لرنینگ میتونید توی سایت kaggle دیتاست های مختلف رو دانلود کنید و از روش هایی که یادگرفتید استفاده کنید تا روی اون دیتاست های مدل بسازید. چیزی که تو این مرحله خیلی برای شما دردسر ساز خواهد بود معمولا load کردن داده ها است. چون دیتاست ها عموما نیاز به preprocess و تمیز کردن دارد. برای این کار میتونید هر زمان که نیاز شد سرچ کنید و ابزار مناسب با اون کار رو پیدا کنید (که خودم این روش رو توصیه میکنم) یا میتونید برای Pandas و numpy دوره پیدا کنید و بعد از دیدن اون دوره ها بیاید سراغ کار روی دیتاست ها.یادگیری عمیقبعد از اینکه با مفاهیم یادگیری ماشین آشنا شدید میتونید برید سراغ deep learning. گرچه خیلی از الگوریتم هایی که توی ML میخونید ممکنه تو deep براتون کارایی مستقیم نداشته باشه ولی بهتون دید خوبی میده و در عین حال ممکنه خیلی جا ها مسئله ای که باهاش سر و کار دارید با روش های کلاسیک حل بشه و نیاز به deep نداشته باشید اصلا.برای مقدمات deep میتونید دوره ی Andrew Ng رو ببینید که تو این لینک میتونید بهش دسترسی داشته باشید. بعد از این دوره دوره های Tensorflow میتونه خیلی مفید باشه براتون:1- DeepLearning.AI TensorFlow Developer Professional Certificate2- TensorFlow: Advanced Techniques Specialization3- TensorFlow: Data and Deployment Specializationبعد از گذروندن این دوره ها شما به نقطه ای رسیدی که میتونید توی یک پروژه deep learning ساده و یا متوسط کد بزنید، میتونید تو این مقطع برای خودتون پروژه تعریف کنید و یک مقدار روی کدنویسی بیشتر وقت بذارید. به طور خاص میتونید از دیتاست های سایت kaggle استفاده کنید.بعد از اینکه یک مقدار دستتون راه افتاد بهترین کاری که میتونید انجام بدیدی اینه که شروع به یادگیری pytorch کنید و دیگه کلا از pytorch استفاده کنید. برای شروع tensorflow واقعا گزینه ی خوبیه ولی برای ادامه دادن دست و پا گیر میشه خیلی جا ها و واقعا اذیت میکنه.برای این قسمت اگر اهل کتاب خوندن هستید، کتاب deep learning از Ian Goodfellow کتاب خوبیه.یادگیری تقویتیبعد از اینکه ML و DL رو یاد گرفتید و دستتون راه افتاد و تونستید چند تا کد بنویسید وقتشه که برید سراغ یادگیری تقویتی برای RL اول از دوره ی دانشگاه آلبرتا شروع کنید: این لینک. توی این دوره تو مراحل مخالف ارجاعاتی به کتاب Sutton وجود داره که توصیه میکنم هر بخشی رو که میخواد درس بده حتما اون بخش رو توی کتاب مطالعه کنید. (هر کتابی توی این مسیر رو که نخوندید حتما کتاب Sutton رو بخونید).بعد از تموم شدن این دوره میتوتید دوره ی Deep RL از سایت Udacity رو ببینید که دانش RL شما تکمیل تر بشه.گرافگراف واقعا مبحث جذابیه ولی کاربرد های صنعتی اون خیلی کمتر از بقیه ی بخش های هوش مصنوعیه.برای گراف دوره ی CS224w دانشگاه استنفورد که از این لینک میتونید بهش دسترسی داشته باشید دوره ی خیلی خوبیه و در کنارش میتونید کتاب Barabasi رو هم بخونید.برای کد نویسی های این بخش از کتابخونه ی Pytorch Geometric میتونید استفاده کنید. برای یادگیریش توی سایتشون چند تا کد هست که خیلی بهتون کمک میکنه ولی قبل از شروع کد نویسی حتما دوره ی CS224w رو ببینید.مدل های زبانی (LLM)درسته که این روزا خیلی از اخبار درباره ی LLM هاست ولی واقعیت اینه که خیلی چیزای دیگه ای هم وجود داره که باید یاد بگیرید و در عمل هم خیلی از اون ها کاربرد دارن. برای این بخش میتونید از دوره ی CS224n شروع کنید که تو این لینک قابل دسترسیه و بعد از اون برای هر بخش که نیاز داشتید از سایت deeplearning.ai دوره ی مربوط به اون رو پیدا کنید و ببنیید. چون دوره های این بخش خیلی سریع دارن update میشن و هر روز دوره های جدید و بهتری تولید میشه من اینجا لینک خاصی رو براتون نمیذارم ولی حتما به سایت deeplearning.ai سر بزنید و تو بخش short courses دنبال دوره ی مناسب نیاز خودتون بگردید.دوره ی NLP از سایت deeplearning.ai (NLP Specialization) هم میتونید ببینید ولی الان دیگه دوره ی قدیمی ای حساب میشه.مقالهدر نهایت هم تلاش کنید مقاله های مربوط به هوش مصنوعی و زمینه ای که بیشتر برای خودتون جذابه رو بخونید و دنبال کنید. هر روز مقالات جدیدی تو زمینه های مختلف هوش چاپ میشن و اگر میخواید همیشه update باشید فعلا راهی به جز دنبال کردن مقالات ندارید.سخن پایانیدر نهایت هم میخوام تاکید کنم که راه یادگیری هوش مصنوعی راه طولانی ای خواهد بود و خیلی مهمه که خسته نشید و به راهتون ادامه بدید.علاوه بر مهارت هایی که گفتم درباره ی MLOps هم تحقیق کنید و ابزار های مربوط به اون رو یاد بگیرید چون یکی از مهم ترین مهارت هائیه که به اون نیاز خواهید داشت، همین طور به عنوان آدمی که میخواد توی زمینه های کامپیوتری کار کنه حتما git و docker نیازتون میشه پس اون ها رو هم مطالعه کنید.آخرین مطلب هم اینکه Data Science هم به خیلی از این مهارت ها نیاز داره و شما میتونید بعد از یادگرفتن ML و DL دنبال roadmap های data science هم باشید. لیست تمام ابزار هایی که به اون ها نیاز دارید اینها هستند:PythonTensorflowPytrochMLFlowRaySparknumpypandasmatplotlibseabornsklearnSQLDockerGitامیدوارم براتون مفید بوده باشه، اگر نظر یا سوالی دارید خوشحال میشم جواب بدم. اگر سوالی داشتید میتونید تو تلگرام هم از من بپرسید (@pooriaazami) یا بهم ایمیل بدید (pooriaazami@gmail.com).</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Tue, 23 Jul 2024 18:21:12 +0330</pubDate>
            </item>
                    <item>
                <title>اولین شبکه عصبی - بخش اول [لود کردن دیتا]</title>
                <link>https://virgool.io/@pooriaazami/%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%B4%D8%A8%DA%A9%D9%87-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-%D9%84%D9%88%D8%AF-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AF%DB%8C%D8%AA%D8%A7-m7cgcqmwrhxd</link>
                <description>تو این پست میخوایم یه شبکه ی عصبی train کنیم.  هدف اصلی اینه که با مقدمات کد زدن شبکه های عصبی آشنا بشیم و یه دید کلی نسبت بهش داشته باشیم. در ادامه خیلی بیشتر وارد جزئیات میشیم.دیتاستدیتاستی که قراره باهاش کار کنیم یه دیتاست خیلی معروفه به نام MNIST. این دیتاست در کل 70.000 تا عکس 28 پیکسل در 28 پیکسل داره که تو هر کدوم از عکسا یکی از رقم های 0 تا 9 نوشته شده. تسکی که برای این دیتاست تعریف شده اینه که با ورودی گرفتن عکس، عددی که توی اون عکس نوشته شده رو بگیم.این دیتاست خیلی دستاست معروفیه و خیلی جا ها به عنوان benchmark ازش استفاده شده. البته به خاطر اینکه روش های deep خیلی پیشرفت کردن، دیتاست ساده ای حساب میشه و دیگه از این دیتاست خیلی استفاده نمیشه.کتابخونه ی deep learningبرای کار با شبکه های عصبی، کتابخونه های زیادی وجود داره. دو تا از معروف ترین ها tensorflow و pytorch هستند. هر دوی این کتابخونه های کاربرد های زیادی تو research و صنعت دارن اما pytorch جدیدا خیلی بیشتر پیشرفت داشته و بیشتر داره استفاده میشه. به همین دلیل ما هم برای این پست و پست های بعدی از همین کتابخونه استفاده میکنیم.برای این آموزش نیازی نیست چیزی روی سیستمتون نصب کنید. ولی اگر بخواید pytorch رو نصب کنید هم خیلی کار سختی نیست: تنها کاری که باید انجام بدید اینه که سایتش رو باز کنید و تو بخش installation، دستوری که مینویسه رو copy و توی ترمینالتون paste کنید. (تنها چیزی که باید بهش دقت کنید اینه که اگر میخواید با pip نصب کنید، گزینه ی pip و اگر میخواید با anaconda نصب کنید، گزینه ی conda رو بزنید).اگر قبلا با پایتون کار کرده باشید میدونید که کلا نصب کتابخونه تو پایتون سادس. این قضیه درسته ولی برای کتابخونه های deep learning یکم داستان تفاوته چون اونا میتونن از GPU استفاده کنن و ممکنه نیاز باشه dependency های دیگه ای رو هم نصب کنید که نصب اون ها (به خصوص برای tensorflow) ممکنه کار راحتی نباشه.شروع کدنویسیتو مرحله ی اول سایت گوگل colab رو باز کنید. این محیط به شما این امکان رو میده که از GPU ها و TPU هایی که گوگل در اختیارتون میذاره به صورت رایگان استفاده کنید. گرچه همیشه و برای همه کار نمیشه ازش استفاده کرد اما تا حد خوبی میتونه کار ها رو برای ما ساده تر کنه. (این محیط، Jupyter notebook ای هست که روی سرور های گوگل run میشه.)تو مرحله ی اول سایت رو باز کنید و روز new notebook کلیک کنید.هر notebook از یک سری cell ساخته شده که یک سری از اونها برای code و بقیه برای text هستند. میتونید تو cell های text، از HTML و Markdown هم استفاده کنید.تو اولین سلول کد های مربوط به import کردن کتابخونه هایی که نیاز داریم رو مینویسیم:بعد از اینکه این دستورات ر نوشتیم باید روی [ ] کلید کنیم که این cell اجرا بشه. (وقتی روی اون علامت برید، باید آیکنش عوض بشه و جاش فلش بیاد.) به جز کلید کردن روی آیکن، میتونید با کلید های Shift+Enter هم cell رو اجرا کنید.خط اول این کد، کتخونه ی pytoch رو import میکنه. این کتابخونه، همون کتابخونه ایه که قراره شبکه عصبی رو بسازه و train کنه. همین طور داده ها رو هم با همین کتابخونه load میکنیم.دو تا خط بعدی هم یک سری از ماژول هایی که به اونها نیاز داریم رو به صورت nn و F مخفف میکنه که دیگه نیاز نباشه هر دفعه بنویسیم torch.nn یا torch.nn.functional و به جاش از nn و F استفاده کنیم. خط چهارم هم به همین تریب، torch.optim رو به optim مخفف میکنه.خط بعدی، کتابخونه ی torchvision رو import میکنه، این کتابخونه برای load کردن دیتاست به ما کمک میکنه. خط بعدی هم یکی از ماژول های torchvision رو مخفف میکنه.خط بعدی کتابخونه ی matplotlib رو import میکنه که برای رسم نمودار استفاده میشه و خط آخر هم accuracy_score رو از sklearn به کد اضافه میکنه. (برای محاسبه ی دقت مدل به درد میخوره).loading the datasetتو این مرحله باید دیتاستی که میخوایم باهاش کار کنیم رو load کنیم. برای این کار اول باید خود داده ها رو لود کنیم و بعد با استفاده از یک کلاس دیگه، داده ها رو برای شبکه عصبی آماده کنیم.برای مرحله ی اول باید از torchvision.dataset، دیتاست MNIST رو load کنیم. برای این کار باید این دستور رو بنویسیم:این دستور داده های MNIST رو برای ما load میکنه. البته نه دقیقا این دستور! در واقع باید یک سری پاراکتر دیگه هم بهش پاس بدیم.اول از همه، این دیتاست خودش به دو بخش train و test تقسیم شده. بخش train شامل 60.000 تا عکسه که برای train کردن مدل استفاده میشه و بخش test شامل 10.000 تا عکس که برای تست کردن، دقت مدل train شده استفاده میشه.دوم، یه object از نوع Transform (در واقع از نوع torchvision.transforms.Transform) بهش پاس بدیم، کار این object اینه که وقتی داده ها میخوان load بشن، روی اونها یک سری محاسبه انجام بده که بتونن تو مراحل بعدی قابل استفاده باشه. مثلا اونا رو به tensor های pytorch تبدیل کنه (این tensor ها میتونن روی GPU هم allocate بشن، پس مهمه که به جای مثلا numpy ndarray، داده ها از اون tensor های pytorch باشن). یا مثلا داده ها رو normalize کنه. (هنوز درباره ی اینکه normalization چی هست صحبت نکردیم، برای این ادامه ی این پست صرفا بدونید عدد رو تقسیم بر یک مقداری میکنه که بیان تو رنج 0 تا 1، توضیحات دقیق ترش رو تو یه پست دیگه مینویسم)اول از همه بیایم و transform رو تعریف کنیم.چون میخوایم داده ها اول به tensor تبدیل بشن و بعد normalize بشن باید از transform ای استفاده کنیم که خودش شامل چند تا transform باشه. برای ساختن همچین چیزی میتونیم از transforms.Conpose استفاده کنیم. این کلاس خودش یه list میگیره که از آیتمش یه Transformهست و اونا رو به ترتیب روی داده ها اجرا میکنه.برای تبدیل داده های به Tensor میتونیم از transforms.ToTensor و برای Normalize کردن اونها از transforms.Normalize استفاده کنیم. دستور نهایی برای ساختن transform به این صورت میشه:حالا باید این object رو به torchvision.datasets.MNIST پاس بدیم.کار بعدی هم که باید انجام بدیم اینه که داده های train و test جداگانه load کنیم. در نهایت کدش اینجوری میشه:در نهایت باید این داده ها رو آماده کنیم تا شبکه ی عصبی اونها رو پردازش کنه. برای این کار باید از torch.utils.data.Dataloader استفاده کنیم. Dataloader، یه کلاسه که داده ها رو آماده میکنه برای پردازش، مهم ترین کاری ک انجام میده اینه که داده ها رو به صورت batch در میاره.شبکه های عصبی وقتی میخوان داده ها رو پردازش کنن، یک دونه ورودی نمیگیرن. مثلا تو این مثالی که داریم، به جای اینکه هر دفعه 1 عکس بگیره، میاد 8 تا عکس میگیره و همزمان هر 8 تا پردازش میکنه. به این تعداد (8) میگن batch size. این عدد میتونه هر مقداری باشه ولی معولا اون رو توان 2 انتخاب میکنن (2 4 8 16 32 ...). برای ساختن dataloader باید از این دستور استفاده کنیم:خب تا اینجا ی کار داده ها رو لود کردیم.تو پست بعدی شبکه ی عصبی رو میسازیم و loss function و optimizer اون رو مشخص میکنیم و تو پست آخر هم خود train رو پیاده سازی میکنیم.</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Wed, 05 Apr 2023 14:50:24 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمه ای بر شبکه های عصبی</title>
                <link>https://virgool.io/@pooriaazami/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-ee3wymgko3ul</link>
                <description>تا اینجای کار، درباره ی الگوریتم linear regression صحبت کردیم، بعد اومدیم و خیلی ساده ای الگوریتم رو با numpy پیاده سازی کردیم. بعدش رفتیم سراغ vectorization و با این ایده آشنا شدیم، در نهایت هم یک مقدار درباره ی الگوریتم logistic regression صحبت کردیم. تو این پست میخوایم بریم سراغ شبکه های عصبی :) چرا شبکه های عصبی؟ چون تو سال‌ های اخیر خیلی از پیشرفته های ماشین لرنینگ و هوش مصنوعی با استفاده از شبکه های عصبی (و یا دقیق ترش شبکه های عصبی همین) به دست اومده.قبلا شبکه های عصبی مشکلات زیادی داشتن، مثل اینکه نوشتن کدی که بتونه شبکه عصبی train کنه سخت بود، train کردن اونها خیییلی زمان بر بود، داده ی زیادی نیاز داشتن و خیلی مشکلات دیگه. اما الان با توجه به وجود کتابخونه هایی مثل tensorflow و pytorch، وجود دیتاست های بزرگ، داشتن GPU های قوی، سرویس های cloud که GPU دارن و داشتن روش هایی که با اونها میشه شبکه های خیلی عمیق رو train کرد، استفاده از این الگوریتم خیلی زیاد شده و روز به روز داره بیشتر و بیشتر از این الگوریتم استفاده میشه.خب دیگه مقدمه چینی بسه، وقتشه که بریم سراغ خود شبکه های عصبی.شبکه های عصبیدلیل اصلی ای که پست های ماشین لرنینگ رو با linear regression و logistic regression شروع کردم این بود که شبکه های عصبی (البته در ساده ترین حالت ممکن)، در واقع یک سری logistic regression هستند که به هم چسبین. یعنی فرض کنید به جای اینکه مستقیما بیایم و ورودی رو بدیم به یک logistic regression، بیایم و اول اون رو بدیم به 4 تا logistic regression، بعد خروجی اون 4 تا رو بدیم به یک logistic regression دیگه. این میشه یه شبکه عصبی!اگر یادتون باشه تو پست linear regression گفته بودم که میشه یه این صورت نشونشن داد:میشه به همین صورت logistic regression رو هم نشون داد:تنها تفاوتی که اینجا ایجاد شده اینه که اومدیم و خروجی رو دادیم به یک تابع sigmoid.حالا اگر بخوایم بر اساس همون چیزی که گفتم (بیایم و ورودی رو اول بدیم به 4 تا logistic regression و بعد خروجی اونا رو بدیم به یک logistic regression دیگه) یک شبکه عصبی بسازیم، این شکلی میشه:البته تو این شکل دیگه bias ها رو نشون ندادم (همون تتا 0) و برای sigmoid هم دایره ی جدا نکشیدم.به هر کدوم از دایره هایی که توی این شکل هستند، میگیم نرون. و به هر تعداد نرون که توی این شکل زیر هم هستند میگیم یک لایه. به اولین لایه (همون 3 تا نقطه) میگیم لایه ی ورودی (input layer)، یه آخرین لایه هم میگم لایه ی خروجی (output layer). لایه های بین ورودی و خروجی هم لایه های مخفی (hidden layers) هستند.پارامتر های شبکه عصبیتو شکلی که داریم، یک شبکه ی دو لایه داریم (لایه ورودی رو حساب نمیکنیم). برای ادامه ی کار نرون های هر لایه رو از بالا به پایین شماره گذاری میکنیم. نرون اول لایه ی اول رو در نظر بگیرید، 3 تا ورودی به این نرون میرسه، پس باید سه تا پارامتر داشته باشه. بقیه ی نرون های این لایه هم همین جوری هستند.به نرون لایه ی آخر 4 تا ورودی میرسه پس باید 4 تا پارامتر داشته باشه.نرون اول لایه ی اول رو در نظر بگیرید، به این نرون باید 3 تا ورودی برسه. چون قراره روی اونها logistic regression انجام بشه پس خروجی اون به این صورت محاسبه میشه: (ورودی های اون به ترتیب x1، x2 و x3 هستند)برای اینکه مشخص کنیم که این پارامتر ها و خروجی مربوط به نرون اول هستند، برای پارامتر ها توان 1 میذاریم. (اون عدد رو با توان ریاضیاتی قاطی نکنید). پس معادله به این صورت درمیاد:به این ترتیب خروجی نرون های این لایه اینجوری میشه:میتونیم این معادله رو اینجوری بنویسیم:و خود این معادله رو میتونیم اینجوری بنویسیم:اگر به ماتریسی که توی اون تتا ها رو گذاشتیم بگیم تتا 1، میتونیم معادله ی این لایه رو به این صورت بنویسیم:البته، باید بردار bias رو هم با این معادله جمع کنیم و بعد اون از خروجی اون sigmoid بگیریم. (برای استاندارد تر بودن، از این به بعد به برای وزن لایه ها به جای تتا از W و به جای output از A استفاده میکنیم) پس در نهایت، معادلات این لایه به این صورت میشه:به همین ترتیب معادله ی لایه ی دوم هم به این صورت میشه:پس معادلات شبکه عصبی ای که ساختیم این شکلی میشه:اگر بیایم همین معادلات رو تو کد بنویسم، در واقع این شبکه عصبی رو با کد پیاده سازی کردیم. اما سوال اصلی اینه که چه جوری مقدار ماتریس های W1، W2 و بردار های b1 و b2 رو حساب کنیم؟اینجا هم مثل قبل باید بیایم و از یک الگوریتمی مثل gradient descent استفاده کنیم. مشکلی که اینجا به وجود میاد اینه که باید هر لایه رو بر اساس مشتق لابع J نسبت به اون لایه حساب کنیم. برای محاسبه ی این مشتقات از یک الگوریتم به نام backpropagation استفاده میشه و بعد با استفاده از gradient descent وزن ها آپدیت میشن.به این ترتیب ما میتونیم یک شبکه ی عصبی رو train کنیم!تو پست بعدی میریم سراغ کد نویسی یک شبکه عصبی ساده.</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Sun, 02 Apr 2023 01:58:15 +0330</pubDate>
            </item>
                    <item>
                <title>logistic regression</title>
                <link>https://virgool.io/@pooriaazami/logistic-regression-ppopzjqokys2</link>
                <description>تو پست های قبلی درباره ی الگوریتم linear regression خیلی مفصل و کامل حرف زدیم، یه پیاده سازی خیلی مقدماتی از این الگوریتم دیدیم و در نهایت هم با vectorize کردن آشنا شدیم. تو این پست میریم سراغ اولین الگوریتم classification که در ادامه با استفاده از همین الگوریتم شبکه های عصبی رو میسازیم.طرح مسئلهفرض کنید اطلاعات یک سری بیمار سرطانی (سرطان سینه) رو به عنوان ورودی به ما دادن و به ازای هر بیمار مشحص شده که نوع سرطان خوش خیم هست یا بدخیم. هدف ما اینه که با این داده ها یک الگوریتم classification بسازیم که اگر داده ی جدیدی به ما دادن بتونیم نوع سرطان اون رو تشخیص بدیم.تو این مسئله به جای اینکه label های ما یک مقدار پیوسته باشن، دو مدل هستند، سرطان خوش‌خیم/سرطان بدخیم، میتونیم بیایم و به هر کدوم از این کلاس ها یک عدد نسبت بدیم. مثلا اگر مریض سرطان خوش‌خیم داشت بگیم label بشه 1 و اگر خوش‌خیم بود بشه 0. (البته اینکه این اعداد رو 0 و 1 گذاشتیم خیلی هم بی دلیل نیست.)کاری که میخوایم بکنیم اینه که بیایم و یک تابع h بسازیم که خروجی اون این مدلی باشه که اگر سرطان خوش‌خیم بود خروجی بشه 1 و اگر نه بشه 0. (نیاز داریم حتما خروجی تابع بین 0 و 1 باشه)بیاید و یک سری داده ی تصادفی در نظر بگیریم، مثلا:تو این داده اگر x کمتر از 10 بود داده مال کلاس 0 و در غیر این صورت مال کلاس 1 هست.اگر بخوایم و این مسئله رو با الگوریتم قبلی که داشتیم حل کنیم یکی از مشکلاتی که داریم اینه که خروجی همیشه بین 0 و 1 نیست. (و یک سری مشکلات دیگه). در واقع اون الگوریتم سعی میکرد که بیاد و یک خطی پیدا کنه کنه که از داده ها رد بشه، تو این الگوریتم میخوایم خطی پیدا کنیم که داده ها رو جدا کنه، یعنی دوست داریم خطی که پیدا میشه این شکلی باشه:تابع h جدیدبرای اینکه خروجی ما این مدلی باشه، باید تابع h رو تغییر بدیم. فرض کنید ورودی ما n تا فیچر داشته باشه و فیچر صفرام مثل الگوریتم قبلی برابر با 1 باشه، در این صورت تابع h رو به صورت زیر تعریف میکنیم:در واقع اومدیم و همون خروجی الگوریتم قبلی رو دادیم به یک تابع جدید که اینجا با سیگما نشونش دادیم. این تابع اسمش sigmoid هست و به این صورت تعریف میشه:اگر نمودار این تابع رو رسم کنیم این شکلی میشه:آخرین نکته درباره ی تابع h اینکه تو این مسئله و با توجه به اینکه از تابع sigmoid برای خروجی استفاده کردیم، میشه یک سری دلیل آماری آورد که این تابع h درواقع داره احتمال اینکه خروجی ما متعلق به کلاس 1 باشه رو پیشبینی میکنه.تابع J جدیدتابع J باید مقدار خطا رو مشخص کنه، تو این مسئله دوست داریم که کلاسی که برای ورودی (x) پیشبینی میکنیم، مساوی کلاس خروجی باشه. یا از دید احتمالاتی دوست داریم اگر یک ورودی مال کلاس 1 باشه، مدل ما احتمال اینکه اون ورودی مال کلاس 1 باشه رو زیاد تشخیص بده.میدونیم که احتمال یک مقدار بین 0 و 1 هست و ما دوست داریم اگر ورودی متعلق به کلاس 1 باشه، خروجی مدل نزدیک 1 باشه و در غیر این صورت نزدیک 0 باشه. میتونیم اینجوری بگیم که اگر ورودی  متعلق به کلاس 1 بود دوست داریم احتمال تعلق داشتن اون به کلاس 1 زیاد باشه و اگر متعلق به 1 نبود (مال کلاس 0 بود) دوست داریم احتمال تعلق نداشتن اون به کلاس 1 زیاد باشه، یعنی یک منهای احتمال تعلق داشتنش به کلاس 1 زیاد باشه.بازم به یک سری دلایل ریاضیاتی که فعلا نمیخوام واردش بشم، اگر متغییر مربوط به هر کلاسی بود، فرقی نداره که بگیم احتمال تعلق داشتنش به اون کلاس زیاد بشه یا لگاریتم تعلق داشتنش به اون کلاس. پس میتونیم بگیم اگر label برابر با 1 بود دوست داریم log(h(x)) زیاد بشه و اگر متعلق به کلاس 0 بود دوست داریم log(1 - h(x)) زیاد بشه. میتونیم این دو تا معادله رو به این صورت کنار هم بنویسیم:تو این معادله، اگر label مساوی با 1 باشه، بخش دوم صفر میشه و فقط بخش اولش میمونه یعنی:y*log(h(x))و اگر label مساوی 0 باشه، بخش اول صفر میشه و فقط بخش دومش میمونه، یعنی:(1-y)*log(1-h(x))پس اگر تابع h ما تابع خوبی باشه، این مقدار باید زیاد بشه. از اونجایی که تابع J رو باید minimum کنیم پس تابع J رو برابر با منفی این عبارت قرار میدیم. (در واقع منفی میانگین این عبارت برای تمام داده هایی که داریم):برای پیدا کردن بهترین مقدار تتا (بردار تتا) میتونیم از الگوریتم gradient descent استفاده کنیم. (چون خیلی با جزئیاتش کار نداریم، اینجا توضیح نمیدم. در ادامه برای پیاده سازی این الگوریتم از کتابخونه های آماده استفاده میکنیم.)</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Fri, 31 Mar 2023 00:52:05 +0330</pubDate>
            </item>
                    <item>
                <title>رگرسیون چند متغییره (multivariate regression) و vectorization</title>
                <link>https://virgool.io/@pooriaazami/%D8%B1%DA%AF%D8%B1%D8%B3%DB%8C%D9%88%D9%86-%DA%86%D9%86%D8%AF-%D9%85%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1%D9%87-multivariate-regression-%D9%88-vectorization-dtju6fjsilta</link>
                <description>به جرئت میتونم بگم ایده هایی که توی این پست قراره با هم برسی کنیم، بین تمام پست های مربوط به regression از همشون مهم تره و خیلی خیلی مهمه که این مفاهیم رو متوجه بشید.رگرسیون چند متغییره (multivariate regression)فرض کنید تو مسئله ی تخمین قیمت خونه، به جز متراژ برای هر کدوم از خونه ها تعداد اتاق خواب ها رو هم بهمون میدادن. حالا باید بر اساس متراژ و تعداد اتاق خواب قیمت خونه رو پیدا کنیم. چه جوری باید تابع h رو تغییر بدیم که بتونه این متغییر رو هم در نظر بگیره؟ برای این کار میایم و یک متغییر دیگه به نام تتا 2 اضافه میکنیم که این متغییر در تعداد اتاق خواب ضرب بشه و با مقدار قبلی جمع بشه، یعنی تابع h ما به این صورت تغییر میکنه:در واقع هر تعداد متغییر دیگه هم که داشته باشیم میتونیم بیایم و براش یه تتا ی جدید اضافه کنیم که تابع h بتونه بر اساس تمام اونها خروجی رو تخمین بزنه. یک کار دیگه هم که میتونیم انجام بدیم اینه که بیایم و ترکیبی از این پارامتر ها رو به h بدیم و برای اون ترکیب هم یک تتا ی جدید اضافه کنیم. مثلا ممکنه بخوایم تابع تتا بر اساس متراژ به توان 2، متراژ و تعداد اتاق خواب قیمت خونه رو تخمین بزنه، در این صورت تابع h این شکلی میشه:بقیه ی کار ها دقیقا مثل قبل میشه، فقط با این تفاوت که موقع آپدیت کردن تتا ها باید مشتق J نسبت به هر کدوم از تتا رو حساب کنیم و تعداد معادلاتمون بیشتر میشه.یه چیزی هم که میخوام اینجا دربارش بحث کنیم، اینه که میشه تابع h رو به این صورت هم نشون داد:اینجا فقط اومدیم و یک شکل برای نشون دادن تابع h کشیدیم. نقاطی که سمت چپ هستن ورودی های تابع h، مقادیر روی فلش ها تتا ها و دایره هم داره نشون میده که تمام ورودی هاش باید با هم جمع بشن، یعنی در واقع اگر رو هر کدوم از اون نقطه ها مقدار بذاریم، میاد و در تتا ای که روی اون خطه هست ضرب میشه و در نهایت همشون با هم جمع میشن. (برای تتا 0 هم به طور ثابت عدد 1 رو به عنوان ورودی در نظر گرفتیم).به این الگوریتم میگن رگرسیون چند متغییره، تقریبا میشه گفت هیچ چیز جدیدی نداره، فقط پیاده سازیش بر اساس کدی که دفعه ی قبل نوشتیم، طولانی تر میشه. (باید برای گرادیان هر کدوم از تتا ها بیایم و تابع مخصوص به خودشو بنویسیم *_*)برداری کردن روابط (vectorization)تو پست قبلی گفته بودم که هدف ما پیاده سازی یک کد تمیز نیست. چرا؟ چون با اون روشی که دفعه ی قبل داشتیم پیاده سازی رو انجام میدادیم خود به خود کار کردن با متییغر های زیاد خیلی سخت میشه و عملا کد تمیزی نمیشه نوشت.یکی از کاربرد های vectorization برای همینه. اینجوری خیلی خیلی خیلی کد نویسی برامون راحت تر میشه. کاربرد بعدیش اینه که وقتی محاسبات رو به صورت برداری (ضرب بردار و ماتریس و کلا عملیات بین ماتریس ها) بنویسیم میشه اونها رو راحت تر روی GPU اجرا کرد. (اجرای کد های ماشین لرنینگ روی GPU باعث میشه سرعت محاسبات خیلی بالاتر بره.) و کاربرد آخر (که شاید این یکی از همشون مهم تر هم باشه) اینه که روابط رو میشه با جبر خطی تحلیل کرد و در کل آنالیز روابطی که داریم از نظر ریاضیاتی راحت تر میشه.حالا این vectorization چی هست؟قبل از اینکه بریم سراغ vectorization یه مرور خیلی سریع روی مفاهیم مهم جبر خطی که الان باهاشون کار داریم داشته باشیم و بعد بریم سراغ ادامه ی کارمون. (بعدا درباره ی جبر خطی، آمار، احتمال و بقیه ی ریاضایت مربوط به ماشین لرنینگ پست مینویسم ولی فعلا نیازی نیست خیلی وارد جزئیات بشیم و همین قدری که اینجا میگم برای ادامه ی کار کافیه)مرور مفاهیم کلیدی جبر خطیاگر از درس های دبیرستانتون یادتون باشه، یک بردار n تا عدد کنار همه. (به زبون کامپیوتریا میشه گفت یک بردار در واقع یک آرایه ی n تایی از اعداده). مثلا مختصات هر نقطه که شامل 2 تا عدد x و y میشه، خودش یک برداره. به تعداد اعدادی که هر بردار داره میگیم بعد اون بردار، مثلا برداری که برای مکان تعریف کردیم چون 2 تا عدد داره 2-بعدی میشه. یک سری عملیات بین بردار ها تعریف میشه که برای ما خیلی مهمن. (تمام عملیاتی که میخوام دربارشون صحبت کنم باید بین بردار هایی انجام بشن که ابعادشون یکیه مثلا جفتشون 2-بعدی هستن. یا جفتشون 3-بعدی هستن.)برای ادامه ی مطلب فرض کنید دو تا بردار x و y رو داریم که بردار هایی 3-بعدی هستن و به این صورت تعریف میشن:اولین عملیات جمع بین دو تا برداره. جمع بین دو تا بردار، یک بردار دیگس که هر کدوم از مولفه های اون (به د کدوم از اعداد توی بردار میگن مولفه) حاصل جمع مولفه های متناظر اون توی دو تا بردار دیگس *_*. یعنی اگر به حاصل جمع x و y بگیم z. در اون صورت مولفه ی اول z میشه جمع مولفه ی اول x با مولفه ی اول y. پس x + y اینطوری میشه:تفریق دو تا بردار هم به همین صورت تعریف میشه:ضرب مولفه ای بین دو تا بردار هم همین طور:عملیات مهم بدی دات دوتا برداره. (فعلا با اینکه این عملیات چی کار میکنه کاری نداریم، بعدا دربارش توضیح میدم):یک عملیات خیلی مهم دیگه هم داریم و اون هم ضرب دو تا ماتریسه. (ماتریس در واقع چند تا برداره که کنار هم قرار نوشتیمشون مثلا اگر 4 تا بردار 3 بعدی رو کنار هم بنویسیم به یک ماتریس 3 در 4 میرسیم). برای اینکه دو تا ماتریس رو تو هم ضرب کنیم لازمه که تعداد ستون های ماتریس اول با تعداد سطر های ماتریس دوم برابر باشه. مثلا اگر ماتریس اول یه چیزی در 2 باشه (مثلا 3 در 2، 4 در 2، 5 در 2 یا هر چیز دیگه ای)، ماتریس دوم باید 2 در یه چیزی باشه (مثلا 2 در 3، 2 در 4، 2 در 5 یا هر چیز دیگه ای).حاصل ضرب دو تا ماتریس (به شرطی که بشه اون ها رو تو هم ضرب کرد) میشه یک ماتریس دیگه که تعداد سطر هاش با  تعداد سطرهای ماتریس اول و تعداد ستون هاش با تعداد ستون های ماتریس دوم برابره. مثلا اگر یک مارتیس 5 در 2 رو ضرب کنیم تو یک ماریس 2 در 7، حاصل این عملیات میشه یک ماتریس 5 در 7.ضرب دو تا ماتریس عملیات عجیب و غریبیه (البته دلیل داره که اینجوری تعریف شده)، و به این صورت تعریف میشه:اینجا یک ماتریس 3 در 2 ضرب شده تو یک ماریس 2 در 3 در نتیجه حاصل میشه یک ماتریس 3 در 3. اگر دقیق به ماتریس خروجی نگاه کنید، میبینید که سطر i و j ماتریس حاصل برابره با دات بین سطر i ماتریس اول و ستون j ماتریس دوم! توی شکل اگر خونه ی توی سطر 1 و ستون 1 ماتریس جواب رو در نظر بگیرید، حاصل دات بین سطر اول ماتریس اول و ستون اول ماتریس دومه. اگر خونه ی سطر 2 و ستون 3 ماتریس جواب رو در نظر بگیرید، حاصل بین دات سطر دوم ماتریس اول و ستون سوم ماتریس دومه. یه عملیات مهم دیگه برای ماتریس، ترانهاده ی یک ماتریس، ترانهاده ی یک ماترسی اون رو 90 درجه میچرخونه. مثلا اگر ترانهاده ی یک بردار رو حساب کنید، تبدیل میشه به یک ماتریس 1 در تعداد ابعادش. (میتونید فرض کنید خود بردرار یک ماریس با تعداد ابعاد بردار در یک بعدیه. یعنی مثلا یک بردار 3 بعدی همون ماتریس 3 در 1 هست که اگر ترانهاده ی اون رو حساب کنید میشه یک ماتریس 1 در 3).آخرین مطلب هم اینکه دات دو تا بردار رو میشه به صورت ضرب ماتریس ها نوشت که به این صورت میشه:فرم برداریخب برگردیم سراغ بحث خودمون. توی رگرسون (و بقیه ی الگوریتم هایی که در ادامه میبینیم) میتونیم در نظر بگیریم که تمام مقادیر یک ورودی (تو مثالی که داشتیم، متراژ، تعداد اتاق خواب، مربع متراژ و ...) رو میشه به صورت یک بردار در نظر گرفت، یعنی به ازای هر کدوم از x هایی که داریم یک بردار داریم که مولفه ی اول اون  میشه متراژ، مولفه ی دوم اون میشه تعداد اتاق خواب و مولفه ی سوم اون میشه مربع متراژ. (فرض کنید برای هر کدوم از x ها n ها عدد داریم.)(به هر کدوم از مولفه های این بردار ها یعنی مثلا متراژ خونه، میگیم فیچر. تو این مثال برای هر خونه 3 تا فیچر داریم)در این صورت اگر تمام m تا xای که داریم رو کنار هم بذاریم یه ماتریس میسازیم به نام ماتریس X (با حرف بزرگ) که هر کدوم از ستون های اون یکی از داده هایی هستند که داریم. پس یک ماتریس n در m داریم.میتونیم تتا ها رو هم توی یک بردار بذاریم و بهش بگیم ماتریس تتا.در کل بردار تتا و ماتریس داده ها اینجوری میشن:میتونیم مقادیر y رو هم تو یک بردار بذاریم و بعش بگیم بردار Y:حالا اگر بخوایم مقدار h رو برای تمام ورودی هامون یک جا محاسبه کنیم، میتونیم X رو در تتا ضرب کنیم:دو تا نکته تو این معادله هست، اول اینکه اینجا پارامتر تتا 0 رو در نظر نگرفتیم و دوم اینکه از علامت هت برای نشون دادن پیشبینی هامون استفاده کدیم. (یعنی y hat نشون میده که این مقادیر پیشبینی های ما برای y هستند و نه خود y)برای اضافه کردن پارامتر تتا 0، فرض میکنیم هر کدوم از ورودی ها یک فیچر 1 دارن (برای همه ی ورودی ها ثابت و مساوی یک) و تتا صفر رو هم به بردار تتا اضافه میکنیم، در نتیجه بردار ها و ماتریس ها اینجوری میشن:به این ایده که اومدیم و تمام ورودی ها رو به صورت ماتریس، خروجی ها رو به صورت بردار و پارامتر ها رو به صورت بردار در نظر گرفتیم و روابط رو بر اساس روابط بین ماتریس ها و بردار ها نوشتیم میگن vectorization.برای اینکه بدونید چه قدر این ایده میتونه قدرمتند باشه و چه قدر به تحلیل بهتر کمک میکنه:میتونیم بدون استفاده از gradient descent و مستقیما بیایم و بهترین مقدار تتا رو حساب کنیم. برای این کار کافیه مقداری که مقدار بردار تتا رو بر اساس معادله ی پایین حساب کنیم:به این معادله میگم normal equation و در اصطلاح میگن closed-form solution برای linear regression هست. (اگر یادتون باشه تو پست های قبلی گفته بودم که برای این الگوریتم میشه معادله ی مشتق J مساوی صفر رو حل کرد).خب برای این پست کافیه، تو پست بعدی میایم و با استفاده از vectorization دوباره کدمون رو بازنویسی میکنیم. تو پست های بعدی درباره ی اینکه از چه جوری میشه normal equation رو اثبات کرد توضیح میدم.</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Sat, 25 Mar 2023 16:08:14 +0330</pubDate>
            </item>
                    <item>
                <title>رگرسیون خطی (Linear regression) - بخش سوم [کدنویسی]</title>
                <link>https://virgool.io/@pooriaazami/%D8%B1%DA%AF%D8%B1%D8%B3%DB%8C%D9%88%D9%86-%D8%AE%D8%B7%DB%8C-linear-regression-%D8%A8%D8%AE%D8%B4-%D8%B3%D9%88%D9%85-%DA%A9%D8%AF%D9%86%D9%88%DB%8C%D8%B3%DB%8C-eeqh4pgokza6</link>
                <description>تا اینجا با تئوری های مربوط به linear regression آشنا شدیم. تو این پست قراره درباره ی پیاده سازی این الگوریتم صحبت کنم. اگر پست های قبلی درباره ی این الگوریتم رو نخونید حتما اونها رو بخونید تا با تئوری ها و منطق این الگوریتم آشنا بشید. خب بریم سراغ پیاده سازی ...توضیحات اولیهبرای اینکه linear regression رو پیاده سازی کنیم از یک سری داده ی fake (یا همون داده هایی که خودمون تولید کردیم)  استفاده میکنیم. خوبی این کار اینه که راحت تر میتونیم نتایج رو تحلیل و برسی کنیم و اگر نیاز شد شرایط رو تغییر بدیم کارمون راحت تره، مثلا میتونیم noise داده ها رو کم و زیاد کنیم یا تعداد داده هایی که داریم رو تغییر بدیم و ببینیم که الگوریتم چه جوری عمل میکنه.برای پیاده سازی از کتابخونه numpy و matplotlib پایتون استفاده میکنیم. numpy برای محاسبات عددی (و به ویژه محاسبات ماتریس ها و تنسور ها) به کار میره و matplotlib برای رسم نمودار. برای خوندن این پست نیاز نیست که این کتابخونه ها رو بلد باشید و در طول مسیر هر چیزی که نیاز باشه رو توضیح. اگر خواستید این کتابخونه رو بیشتر یادبگیرید، تو یکی از ریپو های گیت هابم برای آموزش این کتابخونه ها (و چند تای دیگه) یه سری Notebook آماده کردم. (این نوتبوک ها به زبان انگلیسی هستن، بعدا تو ویرگول پست فارسی درباره ی این کتابخونه ها خواهم نوشت).برای پیاده سازی از jupyter notebook استفاده میکنم که البته فعلا نیاز نیست کار کردن با اون رو بلد باشید. (بعدا درباره ی jupyter notebook و اینکه چرا ازش استفاده میشه توضیح میدم).خب برگردیم به بحث خودمون، برای پیاده سازی این الگوریتم، میایم و فرض میکنیم قراره یک سری داده رو یاد بگریم که بر اساس خط 4x+1 تولید شدن. البته از اون جایی که داده های واقعی همیشه Noise دارن، باید به داده هایی که تولید میکنیم هم noise اضافه کنیم. (فرض میکنیم noise داده ها از یک توزیع نرمال تولید شده باشه).اضافه کردن کتابخونه هابرای اینکه از کتابخونه های numpy و matplotlib استفاده کنید، اول باید اون ها رو نصب کنید. اگر از pip استفاده میکنید، با دستور pip install numpy matplotlib و اگر از anaconda استفاده میکنید با دستور conda install numpy matplotlib این کتابخونه ها رو نصب کنید.بعد از نصب اونها یک فایل جدید بسازید (یا یک فایل .py که با vs code بشه توش نوشت، یا یه پروژه ی جدید تو pyCharm و یا یه notebook جدید با ژوپیتر. در هر صورت برای ادامه ی کار تفاوتی نداره)بعد از ساختن فایل، اولین کاری که باید انجام بدید اینه که کتابخونه ها رو Import کنید:معمولا کتابخونه ی numpy رو با np و matplitlib رو با plt مخفف میکنن.تولید داده های تصادفیتو مرحله ی بعدی باید داده ها رو تولید کنیم. اول از همه یه متغییر به نام THETA_1 و یکی هم به نام THETA_0 تعریف میکنیم که مقادیر واقعی تتا ها رو تو اونها ذخیره کنیم:حالا باید بیایم و مقادیر X و Y رو تعریف کنیم. برای مقدار X میایم و به صورت تصادفی 200 تا عدد بین 0 تا 10 انتخاب میکنیم. (میتونید هر تعداد دیگه ای عدد و در هر بازه که دوست داشتید انتخاب کنید، من اینجا برای انکه نمودار هایی که رسم میکنیم قشنگ تر بشن این اعداد رو انتخاب کردم. اگر تعداد نقاط زیاد باشه خیلی در هم میشن.)برای مقدار Y باید بیایم و مقدار هر نقطه رو اول در THETA_1 ضرب کنیم و بعد با THETA_0 جمع کنیم. در نهایت هم یک عدد تصادفی به عدد حاصل اضافه کنیم (عدد تصادفی برای اینه که به داد ها noise اضافه بشه).کد این قسمت به این صورت میشه:اول از همه از تابع uniform تو ماژول random کتابخونه ی numpy استفاده کردم که یک سری عدد به صورت تصادفی بین 0 تا 10 انتخاب کنم و بعد اونا رو با مقادیر که گفتم ضرب و جمع کردم. (اینجا اعداد X با توزیع یکنواخت یا همون uniform تولید شدن، ولی میتونید از هر توزیع دیگه ای هم استفاده کنید.)یک قدم از gradient descent اگر از پست قبلی یادتون باشه، الگوریتم gradient descent میومد و تلاش میکرد که مقدار خطا رو کم کنه (مثل پایین اومدن از کوه). این الگوریتم تو هر مرحله در جهت خلاف شیب، قدم بر میداشت. الان میخوایم قدم برداشتن در خلاف جهت شیب رو پیاده سازی کنیم.برای حرکت در خلاف جهت شیب اول باید بیایم و شیب رو حساب کنیم. (تو پست قبلی کامل منطق پشت این الگوریتم رو توضیح دادم). برای محاسبه ی شیب باید مشتق تابع J نسبت به تتا 0 و تتا 1 رو حساب کنیم. اگر یادتون باشه تابع J به این صورت تعریف میشد:باید مشتق این تابع نسبت به تتا 0 و تتا 1 رو حساب کنیم:برای تتا 0 داریم:و برای تتا 1 داریم:خب حالا باید بیایم و یک تابع بنویسم که این مقادیر رو حساب کنه. ورودی این تابع با X و Y و تتا 0 و تتا 1 باشه ولی فعلا برای ساده تر شدن کد فقط تتا 0 و تتا 1 رو به تابع پاس میدیم (X و Y رو به صورت global تعریف کردیم قبلا. مطمئنا این کد تمیز ترین کد ممکن نیست ولی فعلا هدفم اینه که بتونیم این الگوریتم رو پیاده سازی کنیم و در ادامه که به بحث vectorization برسیم به تمیز تر شدن کد فکر میکنیم)پیاده سازی این توابع به این صورت میشه:بازم میگم که اینجا اصلا هدف پیاده سازی یک کد تمیز نیست :)حالا باید از این دو تا تابع استفاده کنیم و یک قدم از gradient descent رو پیاده سازی کنیم.بازم برای یادآوری، هر قدم از gradient descent اینجوری میشه:پیاده سازی این قسمت هم به این صورت میشه:پیاده سازی بخش trainبرای train کردن الگوریتم، باید اول بیایم و یک مقدار تصادفی به تتا 0 و تتا 1 بدیم (یا دستی مقدار بدیم). بعد با چند قدم gradient descent اون پارامتر ها رو بهینه تر کنیم.کد این قسمت هم به این صورت میشه:و به این ترتیب کل کدی که برای پیاده سازی این الگوریتم نیاز بود رو نوشتیم ???اگر الان بیایم و تابع train رو صدا بزنیم، مقادیر تتا 0 و تتا 1 محاسبه میشن. برای مثال اگر این الگوریتم رو با 10 قدم و مقدار lr=.01 اجرا کنیم، در نهایت به مقدار 3.85 برای تتا 1 و .62 برای تتا 0 میرسیم.معمولا برای برسی اینکه train درست هست یا نه میان و مقدار تابع J رو بر حسب شماره ی قدم با یه نمودار نشون میدن. اگر همه چیز درست باشه، این مقدار باید همش کم بشه. اگر ما هم این کار رو انجام بدیم، نمودار این شکلی میشه:البته تو این نموار رادیکال مقدار خطا بر حسب زمان نشون داده شده.این کلیت کدی بود که برای پیاده سازی این الگوریتم نیاز بود. چون بعدا خیلی از این کار ها رو با کتابخونه انجام میدیم خیلی وارد جزئیات نشدم و صرفا میخواستم بهتون یک دید کلی بدم.کد مربوط به این پست رو میتونید تو این لینک ببینید.</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Sat, 25 Mar 2023 02:16:06 +0330</pubDate>
            </item>
                    <item>
                <title>رگرسیون خطی (Linear regression) - بخش دوم</title>
                <link>https://virgool.io/@pooriaazami/%D8%B1%DA%AF%D8%B1%D8%B3%DB%8C%D9%88%D9%86-%D8%AE%D8%B7%DB%8C-linear-regression-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-wnfgezi3q0ex</link>
                <description>تا ایجای کار یه داده رو load کردیم و اون رو با نمودار نقطه های (scatter plot) نشون دادیم. همین طور درباره ی اینکه قراره دقیقا چه کاری انجام بدیم که بگیم الگوریتم ما یه چیزی یاد بگیره صحبت کردیم و گفتم باید یک تابع به نام h رو یاد بگیریم که این تابع این شکلی تعریف میشد:بعد از این هم درباره ی اینکه یک تابع h خوب چه ویژگی ای داره حرف زدیم. تو این پست قراره درباره ی اینکه چه جوری باید این تابع رو پیدا کنیم، حرف بزنیم.برسی مجدد تابع J یا همون error functionتو پست قبلی توضیح دادم که اگر برای یک خط میانگین فاصله ی اون از نقاط ما کم باشه، اون خط یک خط خوبه. پس ما اگر بتونیم این خط رو پیدا کنیم در واقع به جواب مسئله رسیدیم. برای همین اومدیم و یک تابع به نام J تعریف کردیم که ورودیش پارمتر های یک خط (تتا 0 و تتا 1) بودن و خروجی اون میانگین فاصله خط با نقاط (به طور دقیق تر نصف میانگین فاصله ی خط با نقاط).پس در واقع میتونیم بگیم که به ازای هر پارامتری میشه بیایم و این میانگین رو حساب کنیم. از اینجا به بعد به این مقدار میگیم error با خطای اون خط یعنی:h(تتا 0, تتا1) = میزان خطای خطی که پارامتر های اون تتا 0 و تتا 1 باشندر واقع الان میتونیم هر مقداری رو به عنوان تتا 0 و تتا 1 به تابع J بدیم و ببینیم چه قدر خطا داره. پس میتونیم برای این تابع یک نمودار بکشیم که یکی از محور ها مقدار تتا 0، یکی دیگه مقدار تتا 1 و یکی دیگه هم مقدار J رو نشون بده. اگر این کار رو انجام بدیم، به نمودار پایین میرسیم:محور x مربوط به تتا 0، محور y مربوط به تتا 1 و محور z مربوط به مقدار تابع J میشه. یعنی اگر شما بیاید و یک خط با شیب و عرض از مبدا بین -20 تا 20 (اعداد روز محور های x و y) انتخاب کنید و ببینید مقدار اون طبق نمودار چند میشه، مقدار تابع J برای یک خط با این پارامتر ها رو پیدا کردید. (درباره ی رسم این نمودار تو بخش کد نویسی توضیح میدم).هدف ما این بود که میانگین اختلافات تابع h با y هایی که داریم حداقل بشه، پس توی نموداری که داریم، اگر یک خط رو پیدا کنیم که مقدار اون تو محور z ها پایین تر باشه (نقاط تیره تر نمودار)، خط بهتری رو انتخاب کردیم.جمع بندی تمام این حرفا این میشه که ما میخوایم تتا 0 و تتا 1 ای رو پیدا کنیم که تابع J رو میبینمم میکنن.ولی چه جوری باید این کار رو انجام بدیم؟الگوریتم gradient descent احتمالا خیلی از شما میدونید برای اینکه بخوایم مینیمم/ماکسیمم یک تابع رو پیدا کنیم، میتونیم نقاطی که مشتق توی اون ها صفر هست رو حساب کنیم و اون نقاط میشن جواب های ما. اما اینجا نمیشه از این روش استفاده کرد! (البته به طور خاص برای این الگوریتم میشه و تو پست های بعدی دربارش توضیح میدم ولی در حالت کلی برای خیلی از الگوریتم های ماشین لرنینگ نمیشه از این راه استفاده کرد)چرا نمیشه از این راه استفاده کرد؟ چون نمیشه معادله ای که یک سمت اون مشتق J هست و سمت دیگه ی اون صفر رو حل کرد و به یک فرمول رسوند. (در اصلاح میگن closed-form solution نداره).پس باید چی کار کنیم؟ برای حل این مشکل میشه از یک الگوریتم استفاده کرد به نام gradient descent (ترجمه ی اسم این الگوریتم میشه الگوریتم گرادیان نزولی *_* ولی به نظرم خود gradient descent بهتره).در ساده ترین حالت میشه گفت این الگوریتم کاری که انجام میده اینه که از کوه پایین میاد! چه ربطی به پیدا کردن مینیمم تابع داره؟ ربطش به اینه که فرض کنید شما روی تابعی وایسادید که میخواید اون رو مینیمم کنید. اگر بخواید نقطه ی مینیمم رو پیدا کنید باید به قسمت های با ارتفاع کمتر برید. این الگوریتم هم دقیقا همین کار رو میکنه. اول میاد و شیب اون جایی که وایساده رو پیدا میکنه، بعد در خلاف جهت شیب یک قدم میره پایین تر، اینجوری به جایی میرسه که ارتفاع اون کمتره. حالا دوباره شیب رو حساب میکنه و بازم در جهت خلاف شیب میاد پایین تر. انقدر این کار رو انجام میده که یا به یه جایی برسه که از نظر ما (مایی که داریم از الگوریتم استفاده میکنیم) نقطه ی خوبی رو پیدا کرده باشه، یا دیگه هرچی قدم بر میداره به جای بهتری نرسه (یا دقیق ترش به جایی خیلی بهتری نرسه، مثلا ممکنه اگر قدم برداره به جایی برسه که مقدار J اونجا .0001 کمتر باشه ولی واقعا این قدر کاهش تفاوتی برای ما اینجاد نمیکنه)چه جوری باید شیب تابع رو حساب کنیم؟ با گرادیان. (گرادیان یه برداره که هر مولفه ی اون مشتق تابع نسبت به یکی از متغییر های تابعه، مثلا برای تابع J که تعریف کردیم، میشه یک بردار 2 بعدی که مولفه ی اول اون مشتق J نسبت به تتا 0 و مولفه ی دوم اون مشتق نسبت به تتا 1 میشه.)حالا باید خلاف جهت گرادیان (منفی گرادیان) حرکت کنیم.فرض کنید تو نقطه ی 10 از محور x وایسادید و میخواید حرکت کنید و برید به نقطه ی 20. چه جوری باید این حرکت رو انجام بدید؟ باید موقعیت خودتون رو با 10 جمع کنید. پس با جمع و تفریق کرد یه عددی با مقدار فعلی متغییر ها میتونید روی محور ها حرکت کنید.پس برای حرکت در جهت خلاف گرادیان باید مقدار فعلی پارامتر ها رو با منفی گرادیان جمع کنیم(=مقدار گرادیان رو از پارامتر ها کم کنیم). اگر این حرکت رو به صورت ریاضیاتی بنویسیم اینجوری میشه:البته هنوز باید یک بخش دیگه به این معادله اضافه کنیم و اون هم برای اینه که نوشن بده چه قدر در جهت خلاف گرادیان باید حرکت کنیم؟ (طول قدم ها چه قدر باشن). برای این کار میایم و یک عدد به نام learning rate رو تو گرادیان ضرب میکنیم. پس معادله ی نهایی میشه:اگر نعادله رو برای هر تتا به صورت جداگانه بنویسم، داریم:الگوریتم نهاییدر نهایت الگوریتم linear regression اینجوری میشه:تتا 0 و تتا 1 رو با یک نقدار تصادفی (مثلا صفر و صفر) مقدار دهی کنمقدار تتا ها رو بر با استفاده از gradient descent آپیدت کناگر مقدار J، قابل قبول بود الگوریتم رو تموم کن و اگر نه برو به خط قبلیتو پست بعدی این الگوریتم رو پیاده سازی میکنیم و میبنیم که به چه صورت باید کد اون رو نوشت. اما قبل از اون یک مورد دیگه رو باید برسی کنیم و اون هم اینه که قدار learning rate رو چه جوری باید تعیین کنیم؟تعیین مقدار learning rateاگر learning rate رو خیلی کوچیک اتخاب کنیم، خیلی طول میکشه که gradient descent به نقطه ی پایین برسه. (چون باید قدم های کوچیکی برداره، باید تعداد زیادی قدم برداره) و اگر اون رو خیلی بزرگ انتخاب کنیم ممکنه تو همون قدم اول انقدر قدمش بزرگ باشه که نقطه ی minimum رو رد کنه. (این قضیه خیلی مشکل سازه چون معمولا تو نقطه ی جدید مقدار گرادیان بیشتره، در تیجه قدم بعدی بزرگ تر میشه و باز میره به جایی که گرادیان بیشتره و دوباره تو قدم بعدی همین اتفاق میوفته، پس در نهایت هیچ وقت به نقطه ی مینیمم نمیرسه)در عمل این مقدار یه عددی مثل 0.1، 0.05، 0.01 و حتی مقادیر خیلی کمتر مثل 0.0001 ست میشه. (در ادامه خیلی بیشتر در این مورد حرف میزنیم)تو ماشین لرنینگ به این مدل پارامتر ها میگن hyper-parameter. در واقع اینا پارامتر هایی هستن که باید خودمون دستی انتخاب کنیم و مقدار اونها تو یادگیری اثر داره. به این ترتیب بحث ما درباره ی الگوریتم linear regression با یک متغییر ورودی و یک متغییر خروجی تموم میشه. تو پست های بعدی درباره ی اینکه چه جوری ورودی با بیشتر از یک متغییر کار کنیم صحبت میکنم، بعدش میریم سراغ تغییر الگوریتم برای classification و به الگوریتم logistic regression میرسیم. این وسطا هم کد تمام این الگوریتم ها رو پیاده سازی میکنیم :)</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Thu, 23 Mar 2023 22:47:08 +0330</pubDate>
            </item>
                    <item>
                <title>رگرسیون خطی (Linear regression) - بخش اول</title>
                <link>https://virgool.io/@pooriaazami/%D8%B1%DA%AF%D8%B1%D8%B3%DB%8C%D9%88%D9%86-%D8%AE%D8%B7%DB%8C-linear-regression-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-ygnoszvzw5nj</link>
                <description>اولین الگوریتم ماشین لرنینگ که میخوایم با هم برسی کنیم linear regression هست. اگر پست قبلی من رو خونده باشیم میدونید که مسائل regression، مسائلی هستند که ما یک سری داده داریم (x) و این داده ها یک سری label دارن (y) که label ها مقادیر پیوسته هستند.تعریف مسئلهیکی از کلاسیک ترین مسال های این مسئله، تخمین قیمت خونه بر اساس متراژ اون هست. یعنی x اینجا قیمت خونس و y قیمت اون. برای ادامه ی کار از داده های این لینک استفاده میکنیم. (تو این پست فقط با خود الگوریتم کار داریم و تو پست های بعدی میریم سراغ کدنویسی)تو مرحله ی اول بیاید و داده ها رو تو یک نمودار نقطه ای نمایش بدیم، به این صورت که محور x ها متراژ خونه و محور y ها قیمت خونه رو نشون بده:هدف ما تو این مسئله اینه که بیایم و بر اساس داده هایی که از خونه ها داریم، یک الگوریتم بسازیم که اگر در آینده خواستید قیمت یک خونه ی جدید رو بر اساس متراژ اون تخمین بزنیم بتونیم از اون الگوریتم استفاده کنیم.تابع h یا تابع فرضیه (hypothesis function):خروجی الگوریتم ما یک مدل برای همین کار میشه، در واقع بعد از اجرای الگوریتم، به ما یک تابع به عنوان خروجی میده (که بهش میگیم h) و اگر خواستیم قیمت یک خونه ی جدید رو تخمین بزنیم، میایم و اون داده ی جدید رو میدیم به تابع h، خروجی تابع h هرچی شد، همون میشه تخمین ما از قیمت خونه.منطقا اگر تابع h، تابع خوبی باشه (قیمت خونه ها رو درست پیشبینی کنه)، باید بتونه قیمت خونه هایی که همین الان داده های اونا رو داریم رو درست پیشبینی کنه. پس اگر بیایم و برای تمام نقطه های ممکن، مقدار تابع h رو رسم کنیم، باید از اون نقطه هایی که داریم رد بشه.خب بیاید و بدون داشتن تابع h، خودمون سعی کنیم اول رسمش کنیم.اگر خوب داده ها رو نگا کنید، میتونیم بگیم یه خطی وجود داره که تقریبا میشه گفت از داده های ما رد میشه:درسته که این خط از خیلی از نقطه ها رد نمیشه ولی فعلا همین قدری که داره از نقاط رد میشه هم برای ما کافیه (تو پست های بعدی درباره ی اینکه چه جوری میتونیم تابع بهتری پیدا کنیم توضیح میدم).پس اگر بیایم و خطی پیدا کنیم که تا جایی که میشه از نقاط ما رد میشه، میتونیم اون رو به عنوان تابع h در نظر بگیریم و هر وقت خواستیم قیمت یک خونه ی جدید رو تخمین بزنیم از این تابع استفاده کنیم. یعنی در نهایت ما باید یک خط پیدا کنیم!معادله ی تابع h برای linear regression:معادله ی یک خط رو میشه با شیب و عرض از مبدا اون نوشت، در نتیجه داریم:اگر ما بتونیم مقدار m و d رو جوری پیدا کنیم که این خط از داده های ما رد بشه، تابع h رو درست کردیم. قبل از اینکه ادامه بدیم بیاید به جای m و d از حرف یونانی تتا برای نشون دادن پارامتر ها استفاده کنیم. (این جوری استاندارد تره). پس تابع h اینجوری میشه:خب تا اینجای کار ما تونستیم یه تعریف ریاضیاتی برای چیزی که دنبالشیم ارائه بدیم. تابع خطا، تابع J یا error function:سوال بعدی اینه که چه از نظر ریاضیاتی چه خطی، خط خوبیه؟ به طور شهودی میتونیم بگیم خطی که از داده های ما رد بشه خط خوبیه. ولی خب دو تا مشکل هست؛ اول اینکه ممکنه هیچ خطی نمونه از همه ی داده ها رد بشه (که اتفاقا برای داده هایی که داریم هم همینجوریه) و دوم اینکه چه جوری رد شدن از داده ها رو به صورت ریاضیاتی بیان کنیم؟ما انتظار داریم تابع h از نقاطی که داریم رد بشه، پس مثلا اگر یک نقطه مثل (x,y) رو در نظر بگیریم، مقدار تابع h تو x باید y باشه. طبیعیه که هرچی تابع h از این نقطه دور تر بشه، اختلاف اون با y هم بیشتر میشه. پس اگر تابع h از یک نقطه ای رد بشه (یا از نزدیک اون رد بشه) اختلاف h با y اون نقطه کم میشه و اگر رد نشه این اختلاف زیاد میشه.پس میتونیم بگیم که برای یک نقطه با مختصات x و y دوست داریم اختلاف h با y کم باشه و از اونجایی که میخوایم h از تمام نقطه ها رد بشه، پس میخوایم اختلاف اون از همه ی اونا کم بشه. در واقع میتونیم بگیم دوست داریم مجموع اختلاف h از نقاط ما کم باشه و از اونجایی که اگر مجموع اختلاف ها کم بشه، میانگین اون ها هم کم میشه، فرقی نداره که بگیم دوست داریم میانگین اختلاف h با نقطه ها کم بشه یا مجموع اختلاف h با نقطه ها کم بشه.در نهایت هدف ما میشه: پیدا کردن h ای که میانگین فاصله ی اون تا نقاطی که داریم کم بشه. اگر بخوایم این هدف رو به صورت ریاضیاتی بیان کنیم، میایم و یک تابع به نام J تعریف میکنیم که مقدار اون برای یک خط h میشه میانگین اختلاف h با نقاط. تعریف دقیق تابع J میشه:jتعریف دقیق این تابع به جای میانگین از نصف میانگین استفاده میکنه (که عملا فرق خاصی ایجاد نمیکنه چون ما دنبال کمترین مقدار J نیستیم، دنبال اون hای هستیم که J رو کمینه کنه، این ضریب 1/2 که اینجا اضافه شده در ادامه به ساده تر شدن معادلات کمک میکنه). همین طور ایجا m تعداد نقطه هائیه که داریم.تو این پست ما تونستیم یک مسئله ی ماشین لرنینگی رو به صورت ریاضیاتی بیان کنیم. تو پست بعدی میریم سراغ حل این مسئله. آخرین موضوع قبل از تموم کردن این پست اینکه واقعا این معادلات انقدر شهودی به دست نمیان و در واقع پشت این معادلات دلایل آماری زیادی وجود داره. اما از اونجایی که فرض کردم آدمایی که قراره این پست ها رو بخونن کامپیوتری هستن و کامپیوتری ها هم معمولا از این مدل ریاضیات خوششون نمیاد، فعلا وارد این مباحث نمیشیم. بعد از جمع بندی این الگوریتم چند تا پست درباره ی این مدل ریاضیات linear regression میذارم :)</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Thu, 23 Mar 2023 03:30:17 +0330</pubDate>
            </item>
                    <item>
                <title>انواع روش های Machine learning</title>
                <link>https://virgool.io/@pooriaazami/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D8%B1%D9%88%D8%B4-%D9%87%D8%A7%DB%8C-machine-learning-p7s2cy18t7ko</link>
                <description>تو پست قبلی درباره ی اینکه ماشین لرنینگ چیه توضیح دادم و تو این پست میخوام درباره ی انواع روش ها یا همون دسته بندی الگوریتم های ماشین لرنینگ صحبت کنم. اما قبل از اینکه بریم سراغ مطالب این دفعه میخوام تعریف ماشین لرنینگ که تو پست قبلی گفتم رو دوباره یادآوری کنم:ماشین لرنینگ یه سری روش هوش مصنوعی هستند که به کامپیوتر اجازه میدن خوش دانش خودش رو استخراج کنه و بر اساس اونا کاری که ازش خواسته شده رو انجام بده.خب حالا سوال اینه که چه جوری یک الگوریتم کامپیوتری باید بتونه دانش خودش رو استخراج کنه؟ یکی از این روش ها میتونه این باشه که ما به الگوریتم یک سری داده بدیم و الگوریتم تلاش کنه بر اساس اون داده ها، دانش خودش رو استخراج کنه.مثلا بیایم و به الگوریتم یک سری عکس تحویل بدیم و بگیم که این عکس ها مربوط به رادیولوژی هایی هستند که مریض سرطان داشته و اینا مربوط به مریض هایی که سرطان ندارن. حالا خودت برو و بر اساس این عکس ها متوجه بشو (یاد بگیر) که کیا سرطان دارن و کیا سرطان ندارن.یا مثلا میتونیم بیایم و به الگوریتم یک سری داده بدیم و ازش بخوایم بره توش الگو پیدا کنه، مثلا داده های یک سری مشتری رو بهش بدیم و الگوریتم بده و بر اساس اونا پیدا کنه که مشتری های ما چند تا دسته هستند. (حالا اینکه مشتری ها رو بر چه اساس دسته بندی میکنه رو خودش باید تشخیص بده، در واقع به صلاح دید خودش میاد و مشتری های ما رو دسته بندی میکنه.)خب حالا با این دید اولیه بریم سراغ اینکه روش های ماشین لرنینگ چیا هستن:الگوریتم های یادگیری با نظارت یا همون Supervised Learningالگوریتم های supervised learning، یک دسته از الگوریتم های ماشین لرنینگ هستند که ورودی اون ها یک سری داده ی برچسب داره. یعنی چی؟ مثلا داده های ما میتونن عکس های رادیولوژی ای باشن که تو مقدمه گفتم. و label (برچسب) داده ها اینه که مریض سرطان دارد یا ندارد. یا مثلا میتونه اطلاعات یک سری خونه (تعداد اتاق خواب، متراژ، محله، آپارتمانی هست یا نه، حیاط داره یا نه و....) باشه و label قیمت خونه باشه.اگر بخوایم یکم دقیق تر صحبت کنیم باید اینجوری بگیم که ورودی الگوریتم ما یک سری x و y هستند که x ها داده ها و y ها برچست اون داده ها هستند.هدف ما تو این روش ها اینه که بر اساس داده یا همون x بیایم و مقدار label یا همون y رو پیدا کنیم. (یا به طور دقیق تر، تخمین بزنیم).پس میتونیم فرض کنیم الگوریتم ما داره یک تابع رو تخمین میزنه که ورودی اون x و خروجی اون y هست. خود این الگوریتم ها به دو دسته تقسیم میشن:اگر label یک مقدار پیوسته باشه (مثل قیمت، طول عمر احتمالی، قد، وزن، درآمد و...) میگیم با مسئله ای از نوع regression سر و کار داریم و به الگوریتیمی که بتونه این نوع مسئله رو حل کنه (با گرفتن x ، مقدار y رو حدس بزنه که خود y یک مقدار پیوسته هست) میگیم regressorاگر label گسسته یک مقدار گسسته باشه (شیر/خط، خوش‌خیم/بدخیم، ارزون/عادی/گرون و....) میگیم با مسئله ای از نوع classification سر و کار داریم و به  الگوریتیمی که بتونه این نوع مسئله رو حل کنه (با گرفتن x ، مقدار y رو حدس بزنه که خود y یک مقدار گسسته هست) میگیم classifierخیلی از الگوریتم های ماشین لرنینگ که الان تو صنعت ازشون استفاده میشه جزو همین دسته هستند. الگوریتم های یادگیری بدون نظارت یا همون Unsupervised Learningتو این دسته از الگوریتم ها داده های ما label ندارن و الگوریتم باید از بین اون ها الگو استخراج کنه.مثلا ممکنه از الگوریتم بخوایم با گرفتن اطلاعات یک سری مشتری اونا رو دسته بندی کنه، یا مثلا با گرفتن اطلاعات یک حساب بانکی بگه که این حساب فعالیت مشکوکی داره یا نه (مثلا داره پولشویی میکنه یا نه، یا اینکه ممکن هست خرید های آخر حساب مال صاحب واقعی حساب نباشه). در کل این روش ها دنبال استخراج الگو از داده ها هستن.منطقا چون حجم داده های بدون label از داده هایی که label دارن بیشتره و دسترسی به داده های بدون label راحت تره، دانشمندا خیلی دوست دارن از این روش ها بیشتر استفاده کنن و الگوریتم هایی بسازن که با این روش ها کار کنه ولی همچنان روش های supervised صنعتی تر هستند.الگوریتم های یادگیری تقویتی یا همون Reinforcement Learningتو این روش ها ما یک عامل هوشمند داریم که قراره یاد بگیره چه جوری یک کاری (که معمولا بر خلاف روش های قبلی که باید یک مقداری رو پیدا میکردیم یا دسته بندی میکردیم، باید در طول زمان یک سری از عملیات رو انجام بده. مثلا بخوایم یک ربات راه بره، یا یک برنامه برای مریض دارو تجویز کنه، یا یک الگوریتم با 1000 دلار برامون سهام بخره) رو انجام بده.این دفعه دیگه داده ای نداریم (و تو یک سری وقت ها خودمون هم دقیق نمیدونیم چه جوری باید اون کار رو انجام بدیم، مثلا ما دقیقا نمیدونیم چه جوری باید یه ربات به موتور هاش ورودی/خروجی بده که بتونه راه بره) ولی به جاش میتونیم هر وقت ربات کار خوبی کرد بهش بگیم آفرین! و هر وقت کار بدی کرد دعواش می‌کنیم.در واقع مدل رو ول میکنیم تو محیط که خودش شروع کنه و تلاش کنه کاری که میخوایم رو انجام بده، هر وقت کار خوبی کرد بهش میگیم آفرین! و هر وقت کار بدی کرد دعواش می‌کنیم میکنیم. این آفرین (پاداش) و  دعوا کردن (تنبیه) به این صورته که هر وقت عامل کار خوبی انجام داد بهش یک عدد مثبت و هر وقت کار بدی کرد بهش عدد منفی یا صفر میدیم. (انگار بهش میگیم برو کار انجام بده، بعد آخرش بهش نمره میدیم) که به این عدده میگیم reward.توی این روش ها عامل هوشمند ما باید یاد بگیریه که reward خودش رو بیشینه کنه و طبق فرضیه های یادگیری تقویتی اگر درست بهش reward بدیم میتونه کاری که میخوایم رو یاد بگیریه (حالا سوالی که پیش میاد اینه که میشه هر کاری رو با این روش به ربات یا داد؟ جواب این سوال هنوز مشخص نیست و یکی از مسائل باز یادگیری تقویتیه)روش های یادگیری نیمه نظارت شده یا همون Semi Supervised Learningتو این روش بخشی از داده های ما برچسب دارن و بخش دیگه ی اونها ندارن. مثلا ممکنه یک گراف داشته باشیم که یک سری از node ها برچسب داشته باشن و یک سری دیگه نداشته باشن و ما باید به تمام node ها برچسب بزنیم.روش دیگه ای هم داریم؟؟جدیدا یک سری روش های دیگه رو هم تو این دسته بندی ها اضافه میکنن ولی نمیشه به خیلی از اونها گفت یک دسته ی جدا چند تا از مهم ترین های اون ها یادگیری انتقالی (transfer learning) و یادگیری با نظارت خود یا خود نظارتی (self-supervised learning) هستن.یادگیری انتقالی (transfer learning) یک روش خیلی پر کاربرده (به خصوص تو deep learning) که جلوتر بیشتر دربارش حرف میزنیم ولی واقعا نمیشه اون رو یک دسته ی جدا فرض کرد.یادگیری خود نظارتی (self-supervised) هم وقتیه که الگوریتم خودش بتونه برای خودش label تولید کنه! (سوالی که ممکنه پیش بیاد اینه که اگر خودش میتونه label رو تولید کنه چرا باید یاد بگیره؟) این بحث رو فعلا میذاریم کنار تا وقتی به پست های مربوط به NLP و NLU رسیدیم کامل توضیح میدم که داستانش چیه ولی باز هم فعلا بهتره که اون رو یک روش جداگانه در نظر نگیریم. (بیشتر به unsupervised ها میخوره)تو پست بعدی میریم سراغ اولین الگوریتم ماشین لرنینگ به نام linear regression.</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Thu, 23 Mar 2023 01:48:20 +0330</pubDate>
            </item>
                    <item>
                <title>یادگیری ماشین چیه؟</title>
                <link>https://virgool.io/newdima/%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%DA%86%DB%8C%D9%87-v9zxacbfp98j</link>
                <description>این روزا و به خصوص با انتشار chat gpt و اخبار مربوط به مدل جدید open ai به نام gpt 4 خیلی بحث درباره ی هوش مصنوعی زیاد شده، به همین دلیل (و البته اینکه خیلی وقت بود که میخواستم یه وبلاگ درباره ی هوش مصنوعی راه بندازم) تصمیم گرفتم زودتر این کارو انجام بدم و به جای اینکه خودم یه وبلاگ راه بندازم تصمیم گرفتم بیام و تو ویرگول بنویسم. امیدوارم این پست و پست هایی که در آینده درباره ی یادگیری ماشین، یادگیری عمیق و مطالب مربوط به این موضوعات میذارم به دردتون بخوره.مقدمهقبل از اینکه بریم سراغ موضوعات پیچیده و جدید هوش مصنوعی بیاید اول از این شروع کنیم که هوش مصنوعی چیه و اصلا به چه درد میخوره؟یه زمانی دانشمندای ریاضی تصمیم گرفتن، بیان و مدل های محاسباتی ای بسازن که این مدل ها بتونن مسائل رو به طور خودکار حل کنن. اگه قبلا درباره ی محاسبه پذیری و نظریه ی محاسبه شنیده باشید، این بخش از ریاضیات دقیقا مربوط به همین چیزا میشه.در ادامه ی این تحقیقات، یه دانشمند انگلیسی به نام آلن تورینگ (همونی که فیلم the elimination game بخشی از زندگیشو نشون میداد) یه مدل محاسباتی ارائه کرد که به ماشین تورینگ معروفه و تمام کامپیوتر های امروزی در واقع همین ماشن تورینگن. (اینجا منظورم از کامپیوتر یه چیزیه که میتونه برنامه نویسی بشه که برای ما یه کاری رو انجام بده)وقتی کامپیوتر ها پیشرفت کردن و آدما برای اونا برنامه نوشتن، خیلی از کار هایی که برای آدما خسته کننده و سخت بود رو با اون ها انجام میدادن، مثلا برای محاسبات ریاضیاتی، شبیه سازی برای کارای علمی و خیلی چیزای دیگه که قبلا باید با دست انجام میدادن از کامپیوتر ها استفاده کردن. در واقع انجام خیلی از این کارا برای آدما کار سختیه، مثلا اینکه شما بخواید100 تا عددو تو یک ثانیه جمع بزنید تقریبا غیر ممکنه ولی برای کامپیوتر هیچ کاری نداره.در عوض یه سری کارا هست که کامپیوترا نمیتونن انجام بدن و براشون سخته، مثلا اگر بخواید به یه کامپیوتر یاد بدید که با شما سلام احوال پرسی کنه خیلی کار سختیه. (مثلا فرض کنید میخواید برای یه کامپیوتر برنامه بنویسید که از روی عکس یه آدمو بشناسه، حالا اگه اون آدما لباسش عوض شد، ماسک گذاشت، مدلموهاش عوض شد، عینک یا خیلی اتفاقای دیگه بازم کامپیوتر باید اونو بشناسه ولی اگه قبلا برنامه نویسی کرده باشید میدونید که این کار خیلی سخته و عملا میشه گفت ناممکنه)در واقع این جمله مشهوره که کارایی که برای آدم سختن برای کامپوتر راحتن و کارایی که برای کامپیوتر سختن برای آدم راحتن.خب حالا اینا به هوش مصنوعی چه ربطی داره؟ ربطش در اینه که هوش مصنوعی هدفش اینه که بیاد با کامپیوتر ها این کار سختا رو انجام بده (کارایی که برای کامپیوتر سختن ولی برای آدما راحتن).Darthmouthتو سال 1955 کالج dartmouth اومد به مدت 2 ماه رو یه سری موضوعات مرتبط به موضوعاتی مثل چت بات، ماشن خودران و... کار کرد و در نهایت تو گزارشی که توسط آقای John McCarthy و همکاراش منتشر شد اصلاح artificial intelligence یا همون AI برای بار اول مطرح شد.اون موقع ها تلاش میکردن بیان و با روش های کلاسیک و ارائه یه سری الگوریتم هایی که قدم به قدم به کامپیوتر میگفت باید چه کاری رو انجام بده، تلاش کنن اون کار سختا رو انجام بدن. در واقع در اصطلاح تخصصیش میگن تو اون روش ها میومدن و دانش (knowledge) رو برای کامپیوتر میگفتن و اون باید بر اساس اون دانش کاری که ازش میخواستن رو انجام میداد. (این مفاهیم خیلی شبیه روش های FOL هستن که در واقع هم از این روش ها خیلی استفاده میشد)اما مشکل این روش ها این بود که واقعا و در عمل خوب کار نمیکردن یا حداقل اون جوری که انتظار میرفت کار نمیکردن. دانشمندای کامپیوتر اومدن روش هایی که داشتن رو برسی کردن و به نظرشون اومد که مهم ترین اشکال این روش ها اینه که ما داریم به کامپیوتر میگیم که چی کار کنه یا به عبارتی ما داریم دانش رو در اختیار کامپیوتر قرار میدیم. شاید اگر به کامپیوتر اجازه بدیم که خودش بیاد و دانش خودش رو استخراج کنه به نتایج بهتری برسیم.یکی از اتفاق هایی که تو این زمینه خیلی مشهوره برنامه ی آقای Arthur Samuel هست که برای ایشون 30 سال روش کار کردن که بتونه چکرز بازی کنه. داستان از این قراره که این آقا 30 سال وقت گذاشت و برنامه ای که نوشته بود رو با روش های مختلف بهتر کرد و در نهایت برنامه میتونست از خود Arthur Samuel بهتر چکرز بازی کنه. خب حالا این اتفاق چرا مهمه؟ چون منطقا وقتی برنامه از خود برنامه نویس بهتر کار میکنه، یعنی برنامه نویس نمیتونسته قدم به قدم برای برنامه توضیح داده باشه که باید چی کار کنه.تعاریف آکادمیک ماشین لرنینگپس تا اینجا میدونیم که ماشین لرنینگ یه سری روش هوش مصنوعی هستند که به کامپیوتر اجازه میدن خوش دانش خودش رو استخراج کنه و بر اساس اونا کاری که ازش خواسته شده رو انجام بده. حالا وقتشه که بریم سراغ تعاریف آکادمیک ماشین لرنینگ.اولین تریف مال خود Arthur Samuel هست که میگه:&quot;Machine learning is the field of study that gives computers the ability to learn without being explicitly programmed&quot;ترجمش میشه: ماشین لرنینگ مطالعاتیه که به کامپیوتر ها اجازه میده بدون اینکه صراحتا برنامه نویسی بشن، یاد بگیرن. (مثل همون برنامه ای که خودش نوشته بود که بدون اینکه مستقیما به کامیپوتر بگه چه جوری باید برنده بشه، کامیپوتر یادگرفته بود که برنده بشه)یه تعریف مشهور دیگه هم توسط آقای Tom Mitchell ارائه شده که میگه:A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.ترجمش این میشه:میگیم یک برنامه ی کامپیوتری برای تسک T از تجربه ی E بر اساس معیار P یاد میگیره؛ اگر بعد از تجربه ی E، بازدهی اون بر اساس معیار P تو تسک T بهتر شده باشه. *_*این تعریف به ظاهر خیلی پیچیدس ولی در واقع خیلی سادس. به زبون ساده داره میگه اگر کامپیوتر بعد از اینکه یه چیزی رو تجربه کرد تو کاری که ازش خواستیم بهتر شده باشه میگیم یاد گرفته. خب این از تعریف ماشین لرنینگ :)تو نوشته های بعدی بیشتر وارد جزئیات میشیم و به مرور الگوریتم های مختلف رو با هم برسی میکنیم.</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Sat, 18 Mar 2023 04:01:50 +0330</pubDate>
            </item>
                    <item>
                <title>مسابقه ی IEEExtreme</title>
                <link>https://virgool.io/@pooriaazami/%D9%85%D8%B3%D8%A7%D8%A8%D9%82%D9%87-%DB%8C-ieeextreme-rocqnneslhdl</link>
                <description>این هفته دوره ی 15ام مسابقه ی IEEExtreme  بود و دومین دوره ای که من توی این مسابقه شرکت کردم، بعد از تموم شدن مسابقه این اولین فرصتیه که پیدا کردم تا تجربه ی 2 دوره این مسابقه رو با بقیه به اشتراک بذارم.امیدوارم که این تجربیات به دردتون بخورهشیوه ی برگزاری مسابقهمسابقه ی IEEExtreme یک مسابقه ی الگوریتمیه که دقیقا 24 ساعت ادامه داره. یعنی بر خلاف مسابقه ای مثل ACM ICPC (یا اگه درست تر بگیم ICPC) که زمانش حدود 4 5 ساعت میشه این مسابقه 24 ساعت ادامه داره و اولین تفاوت این مسابقه با بقیه ی مسابقات الگوریتمی در همین طولانی بودن مدت مسابقس.از لحظه ای که مسابقه شروع میشه تا آخرش، هر یک ساعت یک بار به شما سوال جدید داده میشه. معمولا هر ساعت یک سوال جدید اضافه میشه ولی دوره ی قبلی پیش میومد که بعضی وقتا دو یا سه تا سوال هم اضافه بشه.مورد دیگه ای که این مسابقه رو از بقیه ی مسابقات متمایز میکنه اینه که شما توی مسابقه ای مثل ICPC باید تمام تست کیس ها رو پاس کنید تا نمره ی سوال رو بگیرید اما توی این مسابقه اگر درصدی از تست کیس ها رو هم پاس کنید نمره ی مربوط به اون تست کیس ها رو میگیرد.یک فرق دیگه ی این مسابقه با بقیه ی مسابقات در اینه که توی این مسابقه همه ی سوالات امتیازشون با هم مساوی نیست. در واقع هر سوال یک ارزش بین 0 تا 100 داره و شما هم ازش یک نمره میگیرید که در نهایت بر اساس این دو تا نمره ی نهایی شما توی اون سوال تایین میشه. حالا موضوعی که هست اینه که هرچی تعداد بیشتری از تیم ها یک سوال رو حل کنند امتیاز اون سوال کمتر میشه و هرچی تعداد کمتری حل کنن نمره ی اون سوال بیشتر خواهد بود.آخرین تفاوت هم اینه که برای سابیمت اشتباه پنالتی وجود نداره و شما میتونید با خیال راحت هر تعداد باری که خواستید سوال رو سابمیت کنید. در صورتی که تو مسابقه ی ICPC اینجوری نیست و به ازای هر سابمیت اشتباه شما پنالتی دریافت میکنید.سوالات ویژههر دو سال توی مسابقه سوالاتی بودن که سوال خاص حساب میشدند. حالا سوال خاص یعنی چی؟ مثلا امسال یکی از سوالا این جوری بود که هرچی طول کد (بر حسب کاراکتر) کمتر میبود نمره ی بیشتری به تیم تعلق میگرفت.هر دو سال مسابقه از این سوالات داشت و سوالات بسیار جالبی هستند. تو مسابقه ای مثل ICPC خبری از این سوالات نیست ولی IEEExtreme هر سال از این سوالا داره.مدیریت زمانشما تو مسابقه ی ICPC در بیشترین حالت 12 تا سوال و در کمترین حالت 4 ساعت وقت دارید. تعداد سوالا میتونه تا 10 تا کم بشه و زمان تا 5 ساعت زیاد بشه. این یعنی شما برای هر سوال تو مسابقه ی ICPC به طور میانگین بین 20 تا 30 دقیقه وقت دارید.اما مسابقه ی IEEExtreme اینجوری نیست و شما زمان خیلی بیشتری رو میتونید برای سوالا صرف کنید. علاوه بر اینکه هر یک ساعت یک سوال جدید اضافه میشه و شما دست کم برای هر سوال یک ساعت وقت دارید (مگر اینکه 2 یا 3 تا سوال هم زمان بیاد که کمتر این اتفاق رخ میده)؛ یک تعدادی از سوالات، سوالات سخت هستند و شما از وقتی سوال رو میخونید مطمئن هستید که نمیتونید بهش جواب بدید در نتیجه برای سوالات قبلی وقت بیشتری صرف میکنید.در کل با این تفاسیری که گفتم، شما تو حل سوالات وقت خیلی بیشتری از مسابقه ی ICPC دارید و همین طور در طول مسابقه خیلی راحت میتونید تا 2 3 ساعت وقت آزاد داشته باشید و این یعنی تو اون تایم هیچ سوالی ندارید که بهش فکر کنید در نتیجه میتونید برای خوابیدن، ناهار و شام و خیلی کارای دیگه برنامه ریزی داشته باشید.اتفاق مهم توی این مسابقه اینه که چون مدت مسابقه زیاده، به احتمال خیلی زیاد نیاز دارید که وسط مسابقه بخوابید. با توجه به زیاد بودن زمان حل بین سوالات خیلی راحت میتونید این زمان رو برای خودتون در نظر بگیرید و اعضای تیمتون به نوبت در طول مسابقه استراحت کنن.ثبت نام توی مسابقهبرای ثبت نام تو مسابقه باید اشتراک IEEE داشته باشید که برای گرفتن اشتراک باید یک مبلغی رو (که به دلار هست) پرداخت کنید. البته شرکت تو خود مسابقه هزینه ای نداره و شما در واقع پول اشتراک IEEE رو میدید.با گرفتن اشتراک یک ساله شما میتونید تو دو دوره از مسابقه شرکت کنید. (قبل از تموم شدن اشتراک وقت برای ثبت نام تو مسابقه دوم هست).علاوه بر اینکه با گرفتن اشتراک میتونید 2 سال مسابقه بدید، از امکانات اکانت IEEE هم میتونید به مدت یک سال استفاده کنید. (البته به شخصه برای من کاربری نداشت).موضوع آخر هم اینکه از اونجایی که شرکت توی مسابقه هزینه ی خرید اشتراک رو داره خیلی از آدما و دانشگاه ها توی ایران این هزینه رو قبول نمیکنن و در نهایت از ایران 5 6 تا تیم توی مسابقه هستند و این یعنی هنوز این مسابقه توی کشور خیلی جا نیوفتادهسختی مسابقهسوالات این مسابقه اکثرا sub task دارن و این یعنی اگر نتونید نمره ی کل سوال رو بگیرید میتونید بخشی از نمره ی سوال رو بگیرید و برای خیلی از sub task ها نیاز به دانش عجیب و غریبی ندارید در نتیجه در حالت کلی میگم این مسابقه از ICPC از جهت نمره گرفتن راحت تره و میتونه برای دانشگاه ها و دانشجوی هایی که تازه میخوان تو مسابقات وارد بشن گزینه ی خوبی باشه.در نهایت هم توصیه میکنم اگر شرایط مالی شرکت تو مسابقه رو دارید حتما این کار رو انجام بدید. علاوه بر اینکه تجربه ی بسیار خوبیه که تو هیچ مسابقه ی دیگه ای تکرار نمیشه، شرکت تو این مسابقه رزومه ی خوبی برای شما خواهد بود.امیدوارم این پست به دردتون خورده باشه ;)</description>
                <category>پوریا اعظمی</category>
                <author>پوریا اعظمی</author>
                <pubDate>Fri, 29 Oct 2021 14:01:23 +0330</pubDate>
            </item>
            </channel>
</rss>