<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Ahmadreza Sezavar</title>
        <link>https://virgool.io/feed/@sezavar</link>
        <description>PhD in AI

https://github.com/SezavarH</description>
        <language>fa</language>
        <pubDate>2026-06-16 07:10:02</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/4101318/avatar/YJli08.jpg?height=120&amp;width=120</url>
            <title>Ahmadreza Sezavar</title>
            <link>https://virgool.io/@sezavar</link>
        </image>

                    <item>
                <title>دنیای داده‌ها؛ از جدول ساده تا متن‌های بی‌قاعده</title>
                <link>https://virgool.io/@sezavar/%D8%AF%D9%86%DB%8C%D8%A7%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-%D8%A7%D8%B2-%D8%AC%D8%AF%D9%88%D9%84-%D8%B3%D8%A7%D8%AF%D9%87-%D8%AA%D8%A7-%D9%85%D8%AA%D9%86-%D9%87%D8%A7%DB%8C-%D8%A8%DB%8C-%D9%82%D8%A7%D8%B9%D8%AF%D9%87-otr5hwianhmf</link>
                <description>همه ما می‌دانیم که داده، قلب علم داده است. اما آیا تا به حال فکر کرده‌اید که خود داده‌ها به چند دسته تقسیم می‌شوند؟واقعیت این است که داده‌ها شکل و شمایل متفاوتی دارند.بعضی از آنها مرتب و ردیفی هستند، مثل یک صفحه اکسل مرتب. بعضی دیگر کاملاً بی‌قاعده و آشفته به نظر می‌رسند، مثل یک ایمیل یا یک ویدیو.در این مقاله، قرار است با این انواع داده و فرمت‌های معروف آنها آشنا شویم.بخش اول: دسته‌بندی کلی داده‌هااولین و مهم‌ترین تقسیم‌بندی که هر دانشمند داده باید بلد باشد، تفاوت بین داده‌های ساختاریافته و غیرساختاریافته است.بیایید با هم این دو را بررسی کنیم.داده ساختاریافته (Structured Data)به زبان ساده، داده ساختاریافته یعنی داده‌ای که در قالب جدول، با سطر و ستون مشخص، سازماندهی شده است.مثل یک فایل اکسل را تصور کنید. ستون اول اسم، ستون دوم سن، ستون سوم شهر. هر سطر هم مربوط به یک شخص.این نوع داده بسیار خوش‌رفتار است. کامپیوترها به راحتی می‌توانند آن را بخوانند، جستجو کنند و روی آن محاسبه انجام دهند.مثال‌های معروف داده ساختاریافته کدامند؟لیست مشتریان یک فروشگاه، جدول نمرات دانش‌آموزان، اطلاعات محصولات در یک فروشگاه آنلاین.حدس بزنید چند درصد داده‌های جهان از این نوع هستند؟ فقط حدود ۲۰ درصد.بله، درست خواندید. فقط ۲۰ درصد داده‌های دنیا ساختاریافته هستند. جالب می‌شود، نه؟داده غیرساختاریافته (Unstructured Data)حالا برسیم به قطب مخالف. داده غیرساختاریافته یعنی داده‌ای که ساختار جدولی و منظمی ندارد.این داده‌ها حجیم‌تر، پیچیده‌تر و البته بسیار رایج‌تر هستند.حدود ۸۰ درصد داده‌های جهان غیرساختاریافته هستند. تصور کنید! این یعنی چهار پنجم دنیای داده، بی‌قاعده و نامرتب به نظر می‌رسد.مثال بزنیم تا واضح شود.متن یک کتاب، یک ایمیل طولانی، پست اینستاگرامی شما، یک فایل صوتی از یک پادکست، یک ویدیو در یوتیوب، یا یک عکس از صورت خودتان.هیچکدام از اینها در قالب جدول و سطر و ستون قرار نمی‌گیرند. در عین حال، ارزش اطلاعاتی فوق‌العاده‌ای دارند.کار علم داده همین جاست: چگونه از این داده‌های بی‌قاعده، دانش و بینش استخراج کنیم؟یک دسته دیگر: داده نیمه‌ساختاریافته (Semi-structured Data)بین این دو دنیا، یک حالت میانی هم وجود دارد. به آن داده نیمه‌ساختاریافته می‌گویند.این داده‌ها کاملاً بی‌قاعده نیستند، اما مثل جدول هم مرتب نیستند. آنها از برچسب‌ها (tags) یا کلیدها برای سازماندهی استفاده می‌کنند.جالب است بدانید که معروف‌ترین فرمت‌هایی که در ادامه معرفی می‌کنیم، دقیقاً در همین دسته قرار می‌گیرند.بخش دوم: فرمت‌های معروف دادهحالا که با انواع داده از نظر ساختار آشنا شدیم، وقت آن است که با رايج‌ترین فرمت‌های فایل در علم داده آشنا شویم.این فرمت‌ها تعیین می‌کنند که داده چگونه ذخیره، منتقل و پردازش شود.فرمت CSVساده‌ترین و قدیمی‌ترین قهرمان دنیای داده، CSV است. مخفف Comma-Separated Values یعنی مقادیری که با کاما از هم جدا شده‌اند.یک فایل CSV را مثل یک صفحه اکسل ساده در نظر بگیرید. سطر اول معمولاً نام ستون‌هاست. سطرهای بعدی هم داده‌ها هستند. هر خانه با یک کاما از خانه بعدی جدا می‌شود.مزیت بزرگ CSV چیست؟ سادگی فوق‌العاده آن. هر نرم‌افزاری از اکسل گرفته تا پایتون، می‌تواند CSV را باز کند.عیب آن هم این است که فقط داده‌های ساده و مسطح را می‌تواند ذخیره کند. نمی‌تواند روابط پیچیده و تو در تو را نشان دهد.اگر با داده‌های ساختاریافته سروکار دارید، CSV اولین گزینه شماست.فرمت JSONJSON یک اسم آشنا برای کسانی است که با وب کار کرده‌اند. مخفف JavaScript Object Notation است.برخلاف CSV که صاف و مسطح است، JSON می‌تواند داده‌های تو در تو و سلسله‌مراتبی را ذخیره کند.تصور کنید می‌خواهید اطلاعات یک کتاب را ذخیره کنید. کتاب یک نویسنده دارد، چندین فصل، هر فصل چند زیربخش. JSON به راحتی این ساختار را حفظ می‌کند.امروزه تقریباً تمام APIهای معروف (مثلاً API توییتر یا اینستاگرام) خروجی خود را با فرمت JSON ارائه می‌دهند.فرمت JSON برای داده‌های نیمه‌ساختاریافته و وب، بی‌رقابت است.فرمت XMLXML را می‌توان پدربزرگ JSON در نظر گرفت. مخفف eXtensible Markup Language.XML هم مثل JSON می‌تواند داده‌های تو در تو را ذخیره کند، اما با ظاهری کمی متفاوت. XML از برچسب‌های باز و بسته شونده استفاده می‌کند، شبیه به HTML که دیده‌اید.مهمترین تفاوت XML با JSON این است که XML کمی قدیمی‌تر و سنگین‌تر است. یعنی فایل XML معمولاً حجم بیشتری نسبت به JSON برای همان داده اشغال می‌کند.با این حال، XML هنوز هم در صنایعی مثل بانکداری، سیستم‌های قدیمی بیمارستانی و فرمت‌های آفیس (مثل فایل‌های docx) بسیار رایج است.اگر با سیستم‌های قدیمی و سازمانی سروکار دارید، احتمالاً با XML روبرو خواهید شد.جمع‌بندی: کدام را کی استفاده کنیم؟بیایید یک جمع‌بندی سریع و ساده داشته باشیم.اگر داده شما کاملاً جدولی و مرتب است و خبری از پیچیدگی نیست، سراغ CSV بروید. ساده و همه‌گیر.اگر با APIهای وب کار می‌کنید یا داده شما ساختار تو در تو و سلسله‌مراتبی دارد، JSON انتخاب اول شماست.اگر در یک سازمان بزرگ و قدیمی کار می‌کنید و با سیستم‌های شرکتی سروکار دارید، XML را هم باید بشناسید.</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Sun, 14 Jun 2026 12:11:25 +0330</pubDate>
            </item>
                    <item>
                <title>علم داده و هوش مصنوعی: قلب تپنده دنیای فناوری</title>
                <link>https://virgool.io/@sezavar/%D8%B9%D9%84%D9%85-%D8%AF%D8%A7%D8%AF%D9%87-%D9%88-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D9%82%D9%84%D8%A8-%D8%AA%D9%BE%D9%86%D8%AF%D9%87-%D8%AF%D9%86%DB%8C%D8%A7%DB%8C-%D9%81%D9%86%D8%A7%D9%88%D8%B1%DB%8C-g19squ6junbe</link>
                <description>اگر تصور می‌کنید علم داده و هوش مصنوعی یکی هستند، یا برعکس، دو رقیب جدی‌اند، بهتر است کمی در نگاهتان تجدید نظر کنید.بیایید از یک حقیقت تاریخی شروع کنیم.هوش مصنوعی پدیده جدیدی نیست. تولد رسمی آن به سال ۱۹۵۶ و کنفرانس دارتموث برمی‌گردد. از آن روز تا امروز، هوش مصنوعی فراز و نشیب‌های زیادی را پشت سر گذاشته است.اما علم داده داستان دیگری دارد.علم داده بسیار جوان‌تر است. اوایل دهه ۲۰۰۰، وقتی حجم داده‌ها به طرز باورنکردنی افزایش پیدا کرد، دانشمندان به این نتیجه رسیدند که روش‌های سنتی آماری و پایگاه داده دیگر جوابگو نیست.به همین دلیل، یک رشته میان‌رشته‌ای متولد شد با نام «علم داده» یا Data Science.حالا سوال اصلی: نسبت علم داده با هوش مصنوعی چیست؟بهترین تشبیه، رابطه «پدر و فرزند» نیست، بلکه رابطه «درخت و شاخه» است.هوش مصنوعی درخت کهنسالی است که ریشه‌هایش به دهه‌ها قبل می‌رسد. علم داده یکی از پرمایه‌ترین و پربارترین شاخه‌های این درخت محسوب می‌شود. اما تفاوت اصلی در هدف این دو حوزه نهفته است.هوش مصنوعی (به خصوص در تعریف کلاسیک خود) به دنبال شبیه‌سازی هوش انسانی است. می‌خواهد ماشینی بسازد که مثل انسان فکر کند، استدلال کند و تصمیم بگیرد.اما علم داده چنین جاه‌طلبی ندارد.علم داده صرفاً و صرفاً روی «داده» تمرکز می‌کند. هدف آن استخراج دانش، الگو و بینش از داده‌های خام است. فرقی نمی‌کند از روش‌های آماری ساده استفاده کند یا از الگوریتم‌های پیچیده یادگیری ماشین.برای روشن‌تر شدن، به دو مثال ساده توجه کنید.مثال اول: فرض کنید یک فروشگاه آنلاین می‌خواهد بداند کدام محصول در ماه گذشته بیشترین فروش را داشته است.جمع‌آوری این اطلاعات، تمیز کردن داده‌ها و رسم یک نمودار ساده، یک پروژه علم داده است. در اینجا هیچ هوش مصنوعی به کار نرفته است. صرفاً یک تحلیل توصیفی انجام شده.مثال دوم: حالا فرض کنید همان فروشگاه می‌خواهد پیش‌بینی کند کدام مشتری در ماه آینده خرید خود را متوقف می‌کند.در اینجا دانشمند داده از الگوریتم‌های یادگیری ماشین (که خود زیرمجموعه هوش مصنوعی است) استفاده می‌کند تا مدلی بسازد. این مدل ساخته شده یک مصداق کوچک از هوش مصنوعی است.هر دو مثال بالا، علم داده محسوب می‌شوند. اما مثال دوم، علم داده‌ای است که از ابزارهای هوش مصنوعی بهره گرفته است.پس می‌توان اینگونه جمع‌بندی کرد: تمام علم داده زیرمجموعه هوش مصنوعی نیست. اما علم داده مدرن که از یادگیری ماشین استفاده می‌کند، قطعاً یکی از شاخه‌های پرکاربرد هوش مصنوعی به شمار می‌رود.حالا که این رابطه را درست فهمیدیم، بد نیست نگاهی به کاربردهای علم داده در دنیای واقعی بیندازیم.سیستم پیشنهاد فیلم در نتفلیکس یا اسپاتیفای؟ پشت صحنه آن علم داده خوابیده است.تشخیص تراکنش‌های مشکوک بانکی و جلوگیری از کلاهبرداری؟ باز هم علم داده.بهینه‌سازی مسیرهای ارسال مرسولات پستی در شرکت‌های لجستیکی؟ علم داده جوابگو است.پیش‌بینی قیمت سهام، تحلیل احساسات مشتریان در توییتر، تشخیص زودهنگام بیماری‌ها از روی تصاویر پزشکی. همه و همه بدون علم داده تقریباً غیرممکن هستند.اگر به این فکر می‌کنید که چطور وارد علم داده شوید، مسیر سختی پیش رو ندارید. کافی است با مفاهیم پایه آمار و احتمال شروع کنید. بعد سراغ یادگیری زبان پایتون بروید. پس از آن، کتابخانه‌هایی مثل Pandas و NumPy را تمرین کنید.و در نهایت، وقتی به مرحله مدل‌سازی رسیدید، دیگر عملاً وارد آن بخش از هوش مصنوعی شده‌اید که به آن یادگیری ماشین می‌گوییم.پس دیگر نگران نباشید. علم داده و هوش مصنوعی رقیب شما نیستند. آنها ابزارهای قدرتمندی در دست شما هستند. کافی است بدانید هر کدام چه کاری می‌تواند انجام دهد.آینده از آنِ کسانی است که زبان داده را بلد باشند. یک دانشمند داده چه کارهایی انجام می‌دهد؟ نگاهی به وظایف علم دادهحتماً این سوال برایتان پیش آمده که یک دانشمند داده پشت میز کارش دقیقاً چه کاری انجام می‌دهد؟آیا فقط کد می‌نویسد؟ یا با نمودارها و گزارش‌های رنگی سر و کار دارد؟واقعیت این است که وظایف علم داده بسیار متنوع‌تر و جذاب‌تر از این حرف‌هاست.وظیفه اول: درک مسئله کسب‌وکارقبل از هر خط کد، یک دانشمند داده باید بفهمد که کسب‌وکار واقعاً به چه چیزی نیاز دارد.آیا مدیر فروشگاه می‌خواهد بداند چرا مشتری‌ها ریزش کرده‌اند؟ یا می‌خواهد پیش‌بینی کند کدام کالاها برای ماه بعد پرتقاضا هستند؟درک درست مسئله، نیمی از موفقیت است. بدون این مرحله، حتی پیچیده‌ترین الگوریتم‌ها هم بی‌فایده خواهند بود.وظیفه دوم: جمع‌آوری دادهحالا نوبت به پیدا کردن و جمع‌آوری داده می‌رسد.داده می‌تواند از جای‌های مختلفی بیاید: پایگاه داده فروشگاه، فایل‌های اکسل، اطلاعات رفتار کاربران در وبسایت، حتی از سنسورهای کارخانه.یک دانشمند داده باید بداند از کجا و چطور این داده‌ها را استخراج کند.برای این کار معمولاً از زبان SQL استفاده می‌شود تا با پایگاه‌های داده ارتباط برقرار کند.وظیفه سوم: پاکسازی داده (The Most Boring but Crucial Part)باور کنید این مرحله، زمان‌برترین و در عین حال حیاتی‌ترین بخش کار است.داده‌های خام همیشه نامرتب و کثیف هستند. مقادیر خالی، داده‌های تکراری، فرمت‌های اشتباه و خطاهای انسانی همه جا دیده می‌شوند.اگر داده را پاکسازی نکنید، مدل شما خروجی اشتباه خواهد داد. به قول معروف: «Garbage in, garbage out».در این مرحله، دانشمند داده ستون‌های بی‌استفاده را حذف می‌کند، مقادیر گمشده را مدیریت می‌نماید و داده‌ها را به فرمت یکسان تبدیل می‌کند.وظیفه چهارم: اکتشاف و تحلیل داده (Exploratory Data Analysis)حالا که داده تمیز شده، وقت کشف و شهود است.در این مرحله، دانشمند داده با ابزارهای مصورسازی (مثل Matplotlib یا Seaborn در پایتون) شروع به رسم نمودارهای مختلف می‌کند.می‌خواهد ببیند توزیع سنی مشتریان چگونه است؟ کدام محصول بیشترین فروش را دارد؟ آیا بین دو متغیر (مثلاً قیمت و میزان فروش) رابطه‌ای وجود دارد؟این مرحله مثل یک کارآگاهی است. شما با نگاه به نمودارها، الگوها، ناهنجاری‌ها و داستان پشت داده را کشف می‌کنید.وظیفه پنجم: مهندسی ویژگی (Feature Engineering)این مرحله تا حد زیادی تعیین می‌کند که مدل نهایی شما چقدر دقیق خواهد بود.داده خام به تنهایی برای مدل قابل استفاده نیست. شما باید «ویژگی» یا Feature بسازید.مثلاً فرض کنید ستون «تاریخ خرید» دارید. یک دانشمند داده از روی این ستون، ویژگی‌های جدیدی می‌سازد: روز هفته، ماه، فصل، یا تعداد روز از آخرین خرید.این ویژگی‌های جدید به مدل کمک می‌کنند تا الگوهای عمیق‌تری را یاد بگیرد.وظیفه ششم: انتخاب و ساخت مدلحالا به قلب علم داده می‌رسیم. این جایی است که پای هوش مصنوعی و یادگیری ماشین به میان می‌آید.دانشمند داده باید الگوریتم مناسب را انتخاب کند. بسته به مسئله، گزینه‌های مختلفی وجود دارد.می‌خواهیم دسته‌بندی کنیم؟ از رگرسیون لجستیک یا جنگل تصادفی استفاده می‌کنیم. می‌خواهیم عددی را پیش‌بینی کنیم؟ رگرسیون خطی یا XGBoost جواب می‌دهد.بعد از انتخاب، مدل را با داده‌های موجود آموزش می‌دهد و سپس با داده‌های جدید تست می‌کند تا مطمئن شود خروجی درستی تولید می‌کند.وظیفه هفتم: ارزیابی مدلیک مدل ساخته شده است، اما از کجا بدانیم خوب کار می‌کند؟اینجا معیارهای ارزیابی وارد می‌شوند. مثلاً دقت (Accuracy)، معیار F1 یا خطای میانگین مربعات (MSE).کار دانشمند داده این است که مدل را با معیارهای مختلف بسنجد و بهترین نسخه را انتخاب کند.گاهی لازم است بارها و بارها مدل را تنظیم کند (به این کار Hyperparameter Tuning می‌گویند) تا به نتیجه مطلوب برسد.وظیفه هشتم: تفسیر و ارائه نتایجآخرین و شاید مهم‌ترین وظیفه: توضیح دادن نتایج به دیگران.مدیران کسب‌وکار معمولاً کد پایتون نمی‌فهمند و به الگوریتم‌ها کاری ندارند. آنها می‌خواهند بدانند «چه کاری باید انجام دهند».دانشمند داده باید نتایج را به زبان ساده و با کمک نمودارهای جذاب توضیح دهد. مثلاً بگوید: «بر اساس مدل ما، اگر تخفیف ۲۰ درصدی روی محصول X بدهیم، فروش ۳۵ درصد افزایش می‌یابد.»این مرحله به مهارت داستان‌سرایی (Storytelling) و ارتباط مؤثر نیاز دارد.نکته مهم: همه پروژه‌ها به همه این مراحل نیاز ندارند.گاهی یک پروژه ساده فقط تا مرحله تحلیل اکتشافی پیش می‌رود و دیگر خبری از مدل‌سازی نیست.گاهی هم مدل ساخته می‌شود، اما هیچوقت به مرحله اجرا نمی‌رسد.مهم این است که بدانید علم داده فقط الگوریتم نوشتن نیست. ترکیبی از درک کسب‌وکار، مهارت برنامه‌نویسی، دانش آمار و توانایی ارتباط برقرار کردن است.اگر از آن دسته افرادی هستید که عاشق حل مسئله هستید و از کار با داده خسته نمی‌شوید، احتمالاً علم داده همان مسیر شغلی است که دنبالش می‌گشتید.</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Sun, 14 Jun 2026 12:02:05 +0330</pubDate>
            </item>
                    <item>
                <title>مکانیزم attention و روش K-V cache</title>
                <link>https://virgool.io/@sezavar/%D9%85%DA%A9%D8%A7%D9%86%DB%8C%D8%B2%D9%85-attention-%D9%88-%D8%B1%D9%88%D8%B4-k-v-cache-bvyz1tbcnxdj</link>
                <description>فهم ساده Attention و KV-Cache در Transformerها (برای LLMها)مدل‌های زبانی بزرگ (مثل GPT) بر پایه‌ی معماری Transformer ساخته شده‌اند. قلب این معماری یک مفهوم کلیدی است: Attention.برای اینکه inference این مدل‌ها سریع و عملی شود، از تکنیکی به نام KV-Cache استفاده می‌شود.در این مطلب، این مفاهیم را ساده، مرحله‌به‌مرحله و دقیق مرور می‌کنیم.🔷 1. Attention چیست؟در زمان inference برای هر توکن، مدل باید تصمیم بگیرد:«این کلمه باید به کدام کلمات قبلی بیشتر توجه کند؟»برای این کار، هر توکن به سه بردار تبدیل می‌شود:بردارهای Q, K, V برای هر توکن:* Q (Query) → بردار سوال، “من دنبال چه چیزی هستم؟” * K (Key) → بردار برچسب، “من چه ویژگی‌هایی دارم؟”* V (Value) → بردار جواب، “محتوای واقعی من چیست؟”این سه بردار از ضرب embedding توکن در سه ماتریس یادگرفته‌شده ساخته می‌شوند. پس به یاد داشته باشید که خود این بردار ها نیز از توکن ورودی ساخته شده اند.🔷 2. فرمول Attentionمحاسبه attention به شکل زیر است:Attention = softmax(QK^T) Vاین فرمول چه می‌گوید؟1. شباهت Q با همه Kها محاسبه می‌شود2. این شباهت‌ها به احتمال (softmax) تبدیل می‌شوند3. این وزن‌ها در V ضرب می‌شوند4. نتیجه = ترکیب هوشمند اطلاعات توکن‌های قبلیبه عبارتی هر بردار سوال هر توکن با این معنا که من دنبال چی هستم و باید به چی بیشتر توجه کنم در بردار های برچسب توکن های دیگر (و خودش) ضرب داخلی میشه، هرچی این مقدار ضرب داخلی بزرگتر باشه یعنی شباهت بردار سوال توکن حاضر و بردار برچسب توکن دیگر بیشتر است، حاصل آن وارد تابع softmax میشه زیرا مقادیر خروجی ضرب داخلی تنها امتیازهایی بدون تفسیر هستند که softmax آنها را به وزن و مقادیر احتمالی قابل تفسیر تبدیل می کنه، سپس این وزن ها در بردار های V ضرب میشن تا جواب هایی که مرتبط تر هستند وزن بیشتری گیرند.🔷 3. تفاوت مهم Training و Inferenceدر زمان آموزش (training) همه توکن‌ها همزمان پردازش می‌شوند، یعنی مکانیزم attention به تمام توکن های ورودی همزمان نگاه می کند و مقادیر را تولید می کند.ولی در زمان تست (inference) مدل یک توکن در هر مرحله تولید می‌کند و تنها مقدار attention توکن ورودی مهم است زیرا برای توکن های قبلی در گذشته محاسبه شده است.🔷 4. مشکل اصلی در Inferenceاین است که هر بار که توکن جدید وارد می شود باید بردار های گفته شده دوباره محاسبه شوند که کاری کند و غیر بهینه است.🔷 5. KV-Cache چیست؟KV-cache یک بهینه‌سازی مهم در inference است. همان طور که گفتیم در زمان inference تنها محاسبه attention برای توکن ورودی مهم است.برای اینکار نیاز است که برای توکن ورودی بردار های K, V, Q درست شوند. ولی نیاز نیست که برای توکن های قبلی هم اینکار انجام شود، زیرا اولا که نیازی به برداری Q آنها نداریم زیرا نمی خواهیم attention را برای آنها حساب کنیم (قبلا محاسبه کرده ایم) دوما تنها بردار های K, V آنها را نیاز داریم.💡 ایده اصلی:&gt; K و V توکن‌های قبلی را یک‌بار محاسبه کن و ذخیره کن. دوباره نسازشان.🔷 6. KV-Cache دقیقاً چه کاری می‌کند؟در هر مرحله تولید:برای توکن جدید:Q جدید ساخته می‌شودK جدید ساخته می‌شودV جدید ساخته می‌شودبرای توکن‌های قبلی:❌ دوباره K/V ساخته نمی‌شوند✔ از حافظه (cache) خوانده می‌شوند🔷 7. Attention در زمان استفاده از KV-Cacheدر هر step decode:Attention = softmax(Q_{new} K_{cached}^T) V_{cached}]یعنی:فقط Q مربوط به توکن جدید ساخته می‌شودK و V قبلی reuse می‌شوندخروجی با ترکیب همه اطلاعات قبلی ساخته می‌شود🔷 10. چرا attention قبلی دوباره حساب نمی‌شود؟در inference: attention هر توکن همان لحظه تولید آن توکن حساب شدهبعد از آن فقط بخشی از context می‌شود🔷 11. نتیجه مهم KV-CacheKV-cache باعث می‌شود:سرعت inference به شدت افزایش یابدپیچیدگی محاسبات از حالت سنگین به سبک‌تر تبدیل شودمدل بتواند متن‌های طولانی تولید کند.با تشکر احمدرضا سزاوار</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Wed, 06 May 2026 15:20:33 +0330</pubDate>
            </item>
                    <item>
                <title>پایتون برای حرفه‌ای‌ها - بخش اول</title>
                <link>https://virgool.io/@sezavar/%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AD%D8%B1%D9%81%D9%87-%D8%A7%DB%8C-%D9%87%D8%A7-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-zetxxqz5itjj</link>
                <description>مقدمهپایتون زبانی هست که هم ساده‌ست و هم عمیق. تو این پست می‌خواهیم یه سری مفاهیم پایه‌ای و نسبتاً پیشرفته‌تر رو با مثال مرور کنیم:بررسی مفاهیم کتابخانه، ماژول و پکیج داک استرینگ، راهنمای نگارش PEP8ماژول های array و تابع lambdaتوابع map, filter, reduce اگه می‌خوای کدهای تمیزتر و حرفه‌ای‌تری بنویسی، این پست برات مفیده.ماژول، پکیج و کتابخانه (Module, Package, and Library)ماژول یعنی یک فایل پایتون که داخلش کدهای آماده‌ای مثل توابع و کلاس‌ها نوشته شده‌اند و می‌توانی آن را در برنامه‌ات وارد (import) کنی.پکیج یعنی وقتی چند ماژول مرتبط را در یک پوشه (directory) کنار هم می‌گذاری و در آن پوشه یک فایل مخصوص به نام (__init__) قراربدی، آن مجموعه می‌شود یک پکیج. فایل پایتونی (__init__) باعث می‌شه پایتون تشخیص دهد که یک پوشه، یک پکیج است، نه فقط یک فولدر معمولی.کتابخانه مجموعه‌ای از پکیج‌ها و ماژول‌ها است که برای یک هدف خاص ساخته شده‌اند.مثال خیلی ساده برای اینکه همیشه یادت بماند:فرض کن یک شهر داری:کتابخانه (Library) = خود شهرپکیج (Package) = محله‌های شهرماژول (Module) = خانه‌های داخل محلهتوابع و کلاس‌ها = وسایل داخل خانهمثال: NumPy یک کتابخانه است (مجموعه بزرگی از پکیج‌ها و ماژول‌ها برای کار با آرایه‌ها و محاسبات عددی)ساختار داخلی NumPy چیزی شبیه این است:numpy/
    __init__.py
    core/
        __init__.py
        numeric.py
        multiarray.py
        shape_base.py
    linalg/
        __init__.py
        linalg.py
    fft/
        __init__.py
        fftpack.py
    random/
        __init__.py
        generator.py
        mt19937.py
    ...
همانطور که از ساختار بالا مشخص است، numpy یک کتابخانه است که مجموعه ای از پکیج های مختلفی مانند core, linalg, fft, random و غیره است (مانند یک شهر و محله هایش)هر پکیج مانند random شامل ماژول های مختلفی مانند random  می باشد (محله و خانه های آن) هر ماژول مانند random  نیز توابع مختلفی دارد که می توانیم از آنها استفاده کنیم مانند rand() (مانند خانه و وسایل داخلی آن)numpy.random.rand از کجا می‌آید؟شهر → numpyمحله → numpy.randomخانه →  random یا generatorوسیله → تابع rand()import numpy as np
np.random.rand(3,3)راهنمای نگارش - PEP8PEP 8 یه راهنمای نگارش کد در پایتون هست. رعایت کردنش باعث می‌شه کدت برای خودت و بقیه خواناتر و قابل فهم‌تر باشه. مثال: استفاده از فاصله بعد از کاما، حداکثر ۷۹ کاراکتر در هر خط، نام‌گذاری متغیرها با حروف کوچکداک‌استرینگ (Docstring)برای مستندسازی تابع‌ها، کلاس‌ها و ماژول‌ها از داک‌استرینگ استفاده می‌کنیم. این یه رشته چندخطی با &quot;&quot;&quot; است.def factorial(n):
    &quot;&quot;&quot;محاسبه فاکتوریل یک عدد صحیح نامنفی&quot;&quot;&quot;
    if n == 0:
        return 1
    return n * factorial(n - 1)
ماژول Arrayاگر بخواهیم مفهومی به اسم آرایه که همه عنصر های آن از یک جنس هستند (مثلاً همه integer) را در پایتون پیاده سازی کنیم از این ماژول استفاده می کنیم.import array
a = array.array(&#039;i&#039;, [1, 2, 3])  # &#039;i&#039; یعنی اعداد صحیح
print(a[0])  # خروجی: 1
تابع لامبدالامبدا توابع کوچک و بی‌نام هستن. فقط یه عبارت دارن و از return استفاده نمی‌کنن.square = lambda x: x ** 2
print(square(5))  # خروجی: 25
توابع map, filter, reduceاین سه تابع روی iterableها (لیست، تاپل، دیکشنری و ...) کار می‌کنن.map: همه عناصر رو نگه می‌داره، ولی تابع روی هر کدوم اجرا می‌شه.filter: فقط عناصری که شرط تابع رو برگردونن نگه می‌داره.reduce: همه عناصر رو به یه مقدار واحد تبدیل می‌کنه (نیازمند functools.reduce).from functools import reduce

my_list = [1, 2, 3, 4]

square = lambda x: x ** 2
even = lambda x: x % 2 == 0
add = lambda x, y: x + y

print(list(map(square, my_list)))      # [1, 4, 9, 16]
print(list(filter(even, my_list)))     # [2, 4]
print(reduce(add, my_list))            # 10توضیح قطعه کد بالا:تابع map یک تابع را روی تمام اعضای یک لیست اعمال می‌کند و نتیجه‌ها را در یک آبجکت جدید برمی‌گرداند.یعنی به هر عنصر از my_list می‌گوید: «تو را به تابع square می‌فرستم تا مربع‌ات را حساب کند.»تابع filter برعکس map چیزی را تغییر نمی‌دهد؛ فقط مواردی که شرط خاصی را دارند، نگه می‌دارد.در اینجا تابع even بررسی می‌کند که عدد زوج است یا نه. پس همه مقادیر فرد حذف می‌شوند.تابع reduce کمی متفاوت است:به جای برگرداندن لیستی از نتایج، کل لیست را به یک مقدار واحد تبدیل می‌کند.تابع add دو به دو اعضای لیست را جمع می‌کند تا به یک نتیجه نهایی برسد:(((1 + 2) + 3) + 4) = 10یعنی reduce برای تجمیع (aggregate) داده‌هاست.</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Sun, 03 May 2026 16:22:52 +0330</pubDate>
            </item>
                    <item>
                <title>ابزار های کاربردی کد نویسی- بخش دوم</title>
                <link>https://virgool.io/@sezavar/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%DA%A9%D8%AF-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-tkinmnmoeinu</link>
                <description>گیت - بخش دوم (Git LFS)مشکل اصلی: Git برای فایل‌های بزرگ ساخته نشده!فرض کنید در حال آموزش یک مدل هوش مصنوعی هستید. فایل مدل شما با نام model.pt حجمی حدود ۵۰۰ مگابایت دارد.وقتی از دستورهای زیر استفاده می‌کنید:git add model.pt

git commit -m &quot;add my trained model&quot;

git push origin mainGit ممکن است خطا دهد یا کاملاً از کار بیفتد. دلیلش این است که:- Git در اصل برای کد منبع طراحی شده، یعنی فایل‌های متنی کوچک.- هر فایل ۵۰۰ مگابایتی باعث سنگین شدن کل مخزن می‌شود.- هم‌تیمی‌های شما باید برای هر clone کل این حجم را دانلود کنند.- بیشتر سرویس‌ها مثل GitHub، فایل‌های بالای ۱۰۰MB را قبول نمی‌کنند.نتیجه: شما نمی‌توانید مدل‌ها، دیتاست‌ها یا embeddings خود را با Git معمولی نسخه‌سازی کنید.راه‌حل: Git LFS (ذخیره‌سازی فایل‌های بزرگ)Git LFS به جای ذخیره‌ی مستقیم فایل‌های بزرگ، یک فایل متنی کوچک (pointer) در مخزن قرار می‌دهد و فایل واقعی را در سرور جداگانه‌ای ذخیره می‌کند.نحوه‌ی کار به شکل ساده:1. به Git LFS می‌گویید که فایل‌های خاص (مثلاً .pt) را ردیابی کند.2. هنگام commit، Git به جای فایل مدل، یک فایل کوچک ۱ کیلوبایتی ذخیره می‌کند.3. فایل ۵۰۰ مگابایتی واقعی در فضای LFS آپلود می‌شود.4. وقتی کسی مخزن را clone می‌کند، فایل‌های واقعی به‌صورت خودکار دانلود می‌شوند.مرحله ۱: راه‌اندازی در مخزن پروژهcd my-ai-project

git lfs install

git lfs track &quot;*.pt&quot;

git lfs track &quot;*.pth&quot;

git lfs track &quot;*.h5&quot;می‌توانید پوشه‌های بزرگ را نیز ردیابی کنیدgit lfs track &quot;models/*&quot;

git lfs track &quot;data/large/*&quot;ثبت تنظیمات ردیابیgit add .gitattributes

git commit -m &quot;track large files with Git LFS&quot;مرحله ۲: استفاده‌ی معمول از Gitgit add models/my_model.pt

git commit -m &quot;add trained model with 92% accuracy&quot;

git push origin mainپشت صحنه: Git LFS فایل‌های بزرگ را تشخیص داده و آن‌ها را به شکل متفاوتی مدیریت می‌کند.دستورات پرکاربرد Git LFS# دیدن اینکه چه نوع فایل‌هایی ردیابی می‌شوند

git lfs track# لیست فایل‌های تحت پوشش LFS

git lfs ls-files# بررسی میزان فضای مصرفی LFS

git lfs status# کلون سریع، بدون فایل‌های واقعی

GIT_LFS_SKIP_SMUDGE=1 git clone your-repo-url# سپس دانلود فایل‌های واقعی

git lfs pullمثال واقعی در پروژه‌های هوش مصنوعیmkdir sentiment-analysis-model

cd sentiment-analysis-model

git init

git lfs installgit lfs track &quot;*.pt&quot;      # مدل‌های PyTorch
git lfs track &quot;*.h5&quot;      # مدل‌های Keras/TensorFlow
git lfs track &quot;*.pkl&quot;     # مدل‌های pickled# اضافه کردن .gitignore

echo &quot;*.tmp&quot; &gt; .gitignore
echo &quot;data/raw/*.csv&quot; &gt;&gt; .gitignore

git add .gitattributes .gitignore
git commit -m &quot;setup LFS for model files&quot;پس از آموزش مدل  git add model.pt

git commit -m &quot;final sentiment model v2&quot;

git remote add origin https://github.com/yourname/sentiment-ai

git push origin mainموفق باشید</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Sun, 03 May 2026 16:02:18 +0330</pubDate>
            </item>
                    <item>
                <title>ریاضیات مورد استفاده در هوش مصنوعی - بخش چهارم</title>
                <link>https://virgool.io/@sezavar/%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C%D8%A7%D8%AA-%D9%85%D9%88%D8%B1%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%A8%D8%AE%D8%B4-%DA%86%D9%87%D8%A7%D8%B1%D9%85-r3quyaoawaxd</link>
                <description>نُرم‌ها و فاصله‌هاسناریودو بردار دارید. ممکن این بردارها بردار های embedding باشند، یا پروفایل کاربر، یا آرایه‌های پیکسل. باید بدانید: این دو چقدر به هم نزدیک هستند؟جواب کاملاً به این بستگی دارد که کدام تابع فاصله را انتخاب کنید. دو نقطه از داده می‌توانند تحت یک معیار، نزدیک‌ترین همسایه و تحت معیاری دیگر، دور از هم باشند.هیچ تابع فاصله ی کاملی وجود ندارد. L2 برای داده‌های فضایی و مکانی کار می‌کند. شباهت کسینوسی در NLP حاکم است. ژاکارد برای مجموعه‌ها مناسب است. فاصله‌ی ویرایش برای رشته‌ها. ماهالانوبیس همبستگی‌ها را در نظر می‌گیرد. وازرشتاین جرم احتمال را جابه‌جا می‌کند. هر کدام فرض متفاوتی درباره‌ی معنای «شباهت» در خود جای داده است.نُرم‌ها: اندازه‌گیری بزرگی بردارنُرم «اندازه» یک بردار را اندازه می‌گیرد. (norm measures the size of a vector)نُرم  L1 Norm (Manhattan distance)نُرم L1 قدر مطلق همه درایه‌ها را جمع می‌زند.||x||_1 = |x_1| + |x_2| + ... + |x_n|به آن فاصله منهتن می‌گویند چون مسافتی را اندازه می‌گیرد که در یک شبکه شهری راه می‌روید و فقط می‌توانید در امتداد محورها حرکت کنید – بدون خط مورب.مثال:نقطه A = (1, 1)نقطه B = (4, 5)فاصله L1 = |4-1| + |5-1| = 3 + 4 = 7در یک شبکه، ۳ بلوک شرق و ۴ بلوک شمال راه می‌روید.چه زمانی از L1 استفاده کنیم:- داده‌های پراکنده با ابعاد بالا (ویژگی‌های متنی، one-hot encoding)- زمانی که می‌خواهید در برابر نقاط پرت (outliers) مقاوم باشید- مسائل انتخاب ویژگی (feature selection) زیرا رگولاریزیشن L1 باعث پراکندگی میشه و وزن هایی که مقدار نزدیک به صفر دارند را به صفر تبدیل می کنه.نُرم L2 (فاصله اقلیدسی) - L2 Norm (Euclidean distance)نُرم L2 فاصله خط مستقیم است. جذر مجموع مجذور درایه‌ها.||x||_2 = sqrt(x_1^2 + x_2^2 + ... + x_n^2)این همان فاصله‌ای است که در کلاس هندسه یاد گرفتید. قضیه فیثاغورس در ابعاد n.نقطه A = (1, 1)نقطه B = (4, 5)فاصله L2 = sqrt((4-1)^ 2 + (5-1)^2) = sqrt(9 + 16) = sqrt(25) = 5.0خط مستقیم که به صورت مورب از شبکه عبور می‌کند.چه زمانی از L2 استفاده کنیم:- داده‌های پیوسته با ابعاد کم تا متوسط- وقتی مقیاس ویژگی‌ها قابل مقایسه است- فاصله‌های فیزیکی (داده‌های مکانی، خواندن سنسورها)- شباهت تصویر در سطح پیکسلنُرم‌های Lp: خانواده عمومی - Lp Norms: the general familyL1 و L2 حالت خاصی از نُرم Lp هستند:||x||_p = (|x_1|^p + |x_2|^p + ... + |x_n|^p)^(1/p)مقادیر مختلف p، توپ‌های واحد با شکل‌های متفاوت تولید می‌کنند (مجموعه نقاطی که فاصله ۱ از مبدأ دارند):p=1:    شکل لوزی      (گوشه‌ها روی محورها)p=2:    دایره/کره     (توپ گرد معمولی)p=3:    بیضی‌مانند    (چهارگوش گرد)p=inf:  مربع/مکعب     (اضلاع تخت در امتداد محورها)نُرم L-بینهایت (فاصله چبیشف) - L-infinity Norm (Chebyshev distance)وقتی p به سمت بینهایت میل می‌کند، نُرم Lp به بزرگترین درایه از لحاظ قدر مطلق همگرا می‌شود.||x||_inf = max(|x_1|, |x_2|, ..., |x_n|)فاصله بین دو نقطه به وسیله یک بعدی تعیین می‌شود که در آن بیشترین اختلاف را دارند. همه ابعاد دیگر نادیده گرفته می‌شوند.نقطه A = (1, 1)نقطه B = (4, 5)فاصله L-inf = max(|4-1|, |5-1|) = max(3, 4) = 4شباهت کسینوسی و فاصله کسینوسی - Cosine Similarity and Cosine Distanceشباهت کسینوسی زاویه بین دو بردار را اندازه می‌گیرد و اندازه آن‌ها را نادیده می‌گیرد.cos_sim(a, b) = (a . b) / (||a||_2 * ||b||_2)این مقدار از -1 (جهت‌های مخالف) تا +1 (جهت یکسان) متغیر است. بردارهای عمود بر هم شباهت کسینوسی ۰ دارند.فاصله کسینوسی آن را به فاصله تبدیل می‌کند: فاصله کسینوسی = 1 - شباهت کسینوسی. این مقدار از ۰ (جهت یکسان) تا ۲ (جهت مخالف) متغیر است.a = (1, 0)    b = (1, 1)cos_sim = (1*1 + 0*1) / (1 * sqrt(2)) = 1/sqrt(2) = 0.707cos_dist = 1 - 0.707 = 0.293چرا کسینوس در NLP و Embedding غالب است؟ در متن، طول سند نباید بر شباهت تأثیر بگذارد. سندی در مورد گربه‌ها که دو برابر سند دیگر درباره گربه‌ها بلندتر است، هنوز باید «شبیه» محسوب شود. شباهت کسینوسی اندازه (طول) را نادیده می‌گیرد و فقط جهت را در نظر می‌گیرد. دو سند با توزیع کلمات یکسان اما طول متفاوت، در یک جهت قرار دارند و شباهت کسینوسی ۱.۰ می‌گیرند.چه زمانی از شباهت کسینوسی استفاده کنیم:- شباهت متنی (بردارهای TF-IDF، توکارهای کلمه، توکارهای جمله)- هر حوزه‌ای که اندازه نویز و جهت سیگنال باشد- سیستم‌های توصیه‌گر (بردارهای ترجیح کاربر)- جستجوی embedding (پایگاه‌های داده برداری تقریباً همیشه از کسینوس یا ضرب داخلی استفاده می‌کنند)شباهت ضرب داخلی در مقابل شباهت کسینوسی - Dot Product Similarity vs Cosine Similarityضرب داخلی دو بردار عبارت است از:a . b = a_1*b_1 + a_2*b_2 + ... + a_n*b_n  = ||a||  ||b||  cos(angle)شباهت کسینوسی همان ضرب داخلی نرمالیزه شده با هر دو اندازه است. وقتی هر دو بردار قبلاً واحد-نرمال شده‌اند (اندازه = ۱)، ضرب داخلی و شباهت کسینوسی یکسان هستند.If ||a|| = 1 and ||b|| = 1: a . b = cos(angle between a and b)وقتی اندازه‌ها متفاوت باشند: ضرب داخلی اطلاعات اندازه را هم شامل می‌شود. بردار با اندازه بزرگتر، نمره ضرب داخلی بالاتری می‌گیرد. این در برخی سیستم‌های بازیابی اهمیت دارد، جایی که می‌خواهید آیتم‌های «محبوب» رتبه بالاتری داشته باشند. اندازه به عنوان یک سیگنال ضمنی کیفیت یا اهمیت عمل می‌کند.a = (3, 0)    b = (1, 0)    c = (0, 1)dot(a, b) = 3     dot(a, c) = 0cos(a, b) = 1.0   cos(a, c) = 0.0در عمل:- از شباهت کسینوسی استفاده کنید وقتی شباهت جهتی خالص می‌خواهید- از ضرب داخلی استفاده کنید وقتی اندازه‌ها حاوی اطلاعات معناداری هستند- بسیاری از پایگاه‌های داده برداری (Pinecone, Weaviate, Qdrant) به شما امکان انتخاب بین این دو را می‌دهند.با تشکر</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Thu, 30 Apr 2026 11:20:46 +0330</pubDate>
            </item>
                    <item>
                <title>ریاضیات مورد استفاده در هوش مصنوعی - بخش سوم</title>
                <link>https://virgool.io/@sezavar/%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C%D8%A7%D8%AA-%D9%85%D9%88%D8%B1%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%B3%D9%88%D9%85-oqgmeuguyl6b</link>
                <description>مفاهیم تابع‌های بهینه‌سازی در یادگیری ماشیندر یادگیری ماشین، وقتی در حال آموزش مدل هستیم، هدف اینه که خطای مدل کم بشه و بهترین پارامترها رو پیدا کنیم. برای این کار از توابع بهینه‌سازی استفاده می‌کنیم. حالا بیایید این مفاهیم رو یکی یکی بررسی کنیم.گرادیان کاهشی (Gradient Descent) و نرخ یادگیری (Learning Rate)فرض کنید داشتید روی یک تپه‌ای بالا می‌رفتید و می‌خواستید پایین‌ترین نقطه رو پیدا کنید. گرادیان کاهشی یه الگوریتم است که این کار رو انجام می‌دهد:در هر مرحله، بر اساس شیب (گرادیان) محل فعلی، قدمی در جهت کاهش خطا برمی‌دارید.این فرآیند رو تا رسیدن به نقطه کمینه ادامه می‌دید.نرخ یادگیری یا Learning Rate میزان اندازه گام‌هایی است که در هر مرحله بروزرسانی برمی‌دارید.اگر قدم‌های شما در مسیر پایین رفتن خیلی کوچک باشد، پس خیلی کند پیش می‌روید (همگرایی کند). یا برعکس، اگر قدم‌ها بزرگ باشد ممکنه از حداقل محتوای تابع رد بشید و پرش کنید.دلیل اینکه چرا باید در خلاف جهت گرادیان حرکت کنیم چیه؟فرض کنید تابع ما یک تابع ساده تک متغیره f(x) = x^2 می باشد. گرادیان این تابع برابر f&#039;(x) = 2x است. برای مثال فرض کنید الان در نقطه x = 5 قرار داریم، گرادیان این نقطه برابر ۱۰ می باشد. تفسیر این مقدار یعنی اگر در x=5 مقدار خیلی کوچکی به سمت راست حرکت کنیم، خروجی تابع ۱۰ برابر این مقدار کوچک تغییر می کند و افزایش پیدا می کند. پس اگر ما به دنبال این باشیم که کدام نقطه باعث می شود خروجی کم شود باید در خلاف جهت یعنی سمت چپ محور x حرکت کنیم (می دانیم نقطه کمینه این تابع x=0 است)آموزش Batch، Mini Batch و Stochasticوقتی دارید مدل رو آموزش می‌دهید، باید داده‌ها رو به صورت‌های مختلفی برای به‌روزرسانی پارامترها استفاده کنید:Batch Gradient Descentهمه داده‌ها رو به عنوان یک مجموعه (batch) استفاده می‌کنید.در هر مرحله، گرادیان کلی بر اساس کل داده‌ها رو محاسبه می‌کنید.مشکل: ممکن است خیلی طول بکشد اگر داده‌ها زیاد باشد و نیز از نظر حافظه مصرفی پیچیدگی بالایی دارد.Stochastic Gradient Descent (SGD)در هر گام، فقط یکی از نمونه ها از کل دیتاست به مدل برای آموزش داده می شود.سریع است و مناسب داده‌های بزرگ، ولی نوسانات زیادی دارد چون در واقع خاصیت تعمیم بخشی مدل کاهش پیدا می کند و مدل براساس رفتار تک نمونه ها در حال یادگیری است.Mini Batch Gradient Descentداده ها به مجموعه هایی (batch) تقسیم شده هر بار برای آموزش یکی از این مجموعه ها به مدل داده می شود.در هر مرحله، گرادیان براساس مجموعه در حال آموزش بروز رسانی می شوند.از نظر زمانی و حافظه مصرفی روشی متعادل و بهینه است.-تابع بهینه سازی آدام (Adam Optimization)آدام یکی از پیشرفته‌ترین و پرکاربردترین الگوریتم‌های بهینه‌سازی در یادگیری عمیق است. این الگوریتم ایده‌های دو روش محبوب را ترکیب می‌کند:Momentumجلوگیری از نوسان و زیزاگ شدن و ایجاد حرکت باثباتRMSProp(تنظیم نرخ یادگیری برای هر پارامتر و تنظیم گام)تنظیم اندازه گام برای هر پارامتر به طور جداگانهبه شیب نگاه می‌کند: اگر شیب تند است → گام کوچک (تا از هدف رد نشود)اگر شیب آرام است → گام بزرگ (تا سریع‌تر حرکت کند)Adam نرخ یادگیری را برای هر پارامتر به طور جداگانه و پویا تنظیم می‌کند، در حالی که حرکت (Momentum) را نیز حفظ می‌کند.آنتروپی (Entropy) – سردرگمی یک متخصصآنتروپی یعنی میزان «رندوم بودن» یا «عدم قطعیت» یک توزیع احتمال.مثال ساده:فرض کن دو تا دوست داری که هر روز برات پادکست می‌فرستند:علی: همیشه فقط پادکست «تاریخ ایران» می‌فرستد. → (قطعیت صددرصد)اگر بپرسی «امروز چی فرستاد؟»، جواب رو ۱۰۰٪ می‌دونی. یعنی آنتروپی = ۰. اصلاً سورپرایز نمی‌شی و رندوم بودنی وجود ندارد.محمد: با احتمالات مساوی (۲۵٪) یکی از چهار ژانر رو می‌فرستد: تاریخ، علمی، طنز، موسیقی.هر بار که نوتیف می‌آید ذهنت درگیر است: «کدوم رو فرستاده؟» → آنتروپی بالاست چون عدم قطعیت و رندوم بودن وجود دارد.در علم اطلاعات: اگر توزیع احتمال یکنواخت باشد، آنتروپی بالاست. اگر توزیع متمرکز روی یک مقدار باشد، آنتروپی پایین استکراس آنتروپی (Cross-Entropy)کراس انتروپی (Cross-Entropy) = تابع هزینه (Loss Function)همون چیزیه که مستقیماً در آموزش شبکه های عصبی استفاده می‌کنیم.loss = -log(0.7)  # ≈ 0.35به زبان خودمونی:&quot;ببین شبکه جان، تو گفتی ۳۰٪ گربه، ولی من خودم مطمئنم گربه است. بیا ببین چقدر اشتباه کردی.&quot;اگر شبکه بگوید ۹۹٪ گربه → loss = -log(0.99) ≈ 0.01 (عالی)اگر شبکه بگوید ۳۰٪ گربه → loss = -log(0.30) ≈ 1.2 (خیلی بد)# واقعیت: 100% گربه

truth = [1.0, 0.0]

# پیش‌بینی شبکه

prediction = [0.7, 0.3]

# CE = -plog(p&#039;)

CE = -log(0.7) ≈ 0.35# پیام: &quot;واقعیت گربه است، تو 70% گفتی. چقدر اشتباه کردی؟&quot;تابع KL-divergenceمعمولاً در شبکه‌های عصبی مستقیماً استفاده نمیشه، ولی تو مدل‌های خاص (VAE, دانش تقطیر) کاربرد داره.# مثال: دانش تقطیر (شاگرد میخواد مثل استاد فکر کنه)

# استاد (مدل بزرگ) گفته: گربه 80%، سگ 20%

teacher = [0.8, 0.2]

# شاگرد (مدل کوچیک) گفته: گربه 90%، سگ 10%

student = [0.9, 0.1]

# KL-divergence = sum(teacher * log(teacher/student))

KL = 0.8*log(0.8/0.9) + 0.2*log(0.2/0.1)

KL ≈ 0.8*log(0.89) + 0.2*log(2)

KL ≈ 0.8*(-0.116) + 0.2*(0.693)

KL ≈ -0.093 + 0.139 ≈ 0.046به زبان خیلی ساده:&quot;ببین شاگرد جان، استاد گفته ۸۰٪ گربه، تو می‌گی ۹۰٪. چقدر از تفکر استاد دور شدی؟ اگه خیلی دور بشی، به میزان X جریمه میشی!&quot;مقایسه:اگر بخواهیم دو توزیع را با هم مقایسه کنیم =&gt; KL-divergenceاگر بخواهیم یک توزیع با یک حقیقت یکتا (one-hot) مقایسه کنیم =&gt; cross-entropy</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Thu, 30 Apr 2026 10:00:50 +0330</pubDate>
            </item>
                    <item>
                <title>ریاضیات مورد استفاده در هوش مصنوعی - بخش دوم</title>
                <link>https://virgool.io/@sezavar/%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C%D8%A7%D8%AA-%D9%85%D9%88%D8%B1%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-wn4acjjx6bod</link>
                <description>فضای نمونه (Sample Space)فضای نمونه یعنی مجموعه‌ی تمام حالت‌هایی که ممکن است رخ دهد.  مثال ساده:- اگر یک تاس بیندازیم، ممکن است عددهای ۱ تا ۶ بیاید.    پس فضای نمونه ما این است:   S={1,2,3,4,5,6}رخداد (Event)رخداد یعنی یک مجموعه (زیرمجموعه) از فضای نمونه که به یک «شرط» یا «پرسش» مربوط می‌شود.مثال:- رخداد «عدد زوج بیاید» یعنی:  A={2,4,6}این یعنی فقط همان حالت‌هایی که زوج هستند، رخداد محسوب می‌شوند.&gt; پس: فضای نمونه کلِ حالت‌هاست، و رخداد یک تکه از آن است.تابع PMF و PDFدر احتمال دو نوع «حالت» داریم:  گسسته (شمردنی)  پیوسته (بی‌نهایت مقدار ممکن در یک بازه)الف) متغیر تصادفی گسسته (Discrete)مثل:تعداد دانشجوها: ۱، ۲، ۳، ...تعداد سکه‌های شیر هنگام پرتاب چند سکهبرای گسسته، معمولاً می‌خواهیم بدانیم: احتمال اینکه دقیقاً مقدار x رخ بدهد چقدر است؟تابع PMF (Probability Mass Function)PMF احتمالِ دقیقِ هر مقدار را می‌دهد.مثال: تاس سالموقتی تاس سالم ۶ وجهی داریم:- احتمال اینکه عدد ۱ بیاید:  P(X=1)= 1 / 6- احتمال اینکه عدد ۲ بیاید:   P(X=2)= 2 / 6و به همین ترتیب برای ۳،۴،۵،۶.پس PMF می‌گوید برای هر مقدار مشخص، چقدر احتمال دارد.ب) متغیر تصادفی پیوسته (Continuous)مثال:وزن، قد، دمادر متغیر پیوسته، مقدار دقیق معمولاً “دقیقاً یک عدد مشخص” نیست. چون بین دو عدد، بی‌نهایت عدد دیگر هم وجود دارد.مثال:فرض کنید وزن یک کیسه برنج همیشه دقیقاً مثلاً ۱ کیلوگرم نیست و معمولاً کمی کم‌وزیاد می‌شود.تابع PDF (Probability Density Function)PDF برای پیوسته‌ها به ما می‌گوید:اگر یک بازه را در نظر بگیریم (مثلاً بین ۹۰۰ تا ۱۱۰۰ گرم)،«چقدر محتمل» است مقدار داخل آن بازه باشد. تابع PDF (Probability Density Function) به ما می‌گوید که احتمال اینکه وزن کیسه برنج در این بازه (۹۰۰ تا ۱۱۰۰ گرم) قرار گیرد چقدر است.برای پیوسته‌ها احتمالِ دقیقاً روی یک عدد مشخص معمولاً صفر در نظر گرفته می‌شود.اما احتمال داخل یک بازه از روی مساحت زیر نمودار PDF به دست می‌آید.قضیه حد مرکزی (Central Limit Theorem)قضیه حد مرکزی می‌گه: اگه از هر چیزی (مثل پرتاب سکه یا قد بچه‌ها) تعداد زیاد نمونه بگیری و میانگین شون رو حساب کنی، میانگین‌ها همیشه دور یه عدد مرکزی جمع می‌شن و شکل منحنی‌شون زنگوله‌ای (توزیع نرمال) می‌شه!مثال سوپرمارکت: وزن سیب‌ها فرق داره (بعضی سنگین، بعضی سبک). اگه ۳۰ سیب تصادفی برداری و میانگین وزن‌شون رو حساب کنی، و این کار رو ۱۰۰۰ بار تکرار کنی، همه میانگین‌ها نزدیک ۱۵۰ گرم جمع می‌شن و منحنی‌شون زنگوله‌ای (توزیع نرمال) می‌شه!این یعنی با چند نمونه می‌تونی مشخصه کل جمعیت رو حدس بزنی! سافتمکس (softmax) به عنوان توزیع احتمالشبکه‌های عصبی امتیازهای خام (logits) تولید می‌کنند. سافتمکس آن‌ها را به یک توزیع احتمال معتبر تبدیل می‌کند. یعنی تبدیل کردن ارقام بی  معنی یه یک توزیع احتمالی که قابل تفسیر است.softmax(z_i) = exp(z_i) / sum(exp(z_j) for all j)ویژگی‌ها:- همه خروجی‌ها در بازه (۰، ۱) هستند- مجموع همه خروجی‌ها برابر ۱ است- ترتیب نسبی ورودی‌ها را حفظ می‌کند</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Wed, 29 Apr 2026 18:40:40 +0330</pubDate>
            </item>
                    <item>
                <title>ابزار های کاربردی کد نویسی - بخش ششم</title>
                <link>https://virgool.io/@sezavar/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%DA%A9%D8%AF-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%B4%D8%B4%D9%85-ls34ojtyonqn</link>
                <description>مدیریت داده هاسناریو:پروژه‌های هوش مصنوعی با داده شروع می‌شوند. برای شروع، معمولاً باید دیتاست‌ها را پیدا، دانلود و در صورت نیاز فرمت آن‌ها را تبدیل کنیم، سپس آن‌ها را به بخش‌های مختلف مثل آموزش (train)، اعتبارسنجی (validation) و تست (test) تقسیم کنیم. هر آزمایشی که انجام می‌شود باید روی نسخه‌های مشخصی از داده انجام شود تا هم تکرارپذیر باشد و هم بتوان نتایج را به‌صورت قابل اتکا بازتولید کرد. برای جلوگیری از خطا و تضمین قابل اتکا بودن نتایج، به روشی بهینه برای مدیریت داده‌ها و نسخه‌های آن‌ها نیاز داریم.کتابخانه datasets از huggingfaceروشی استاندارد برای کار با دیتاست‌های مختلف فراهم می‌کند: دانلود، کش (cache)، تبدیل فرمت، تقسیم دیتاست به بخش‌های مختلف و … .# install
pip install datasets           

# load imdb dataset
from datasets import load_dataset

dataset = load_dataset(&quot;imdb&quot;)در مرتبه‌ی اول، کل دیتاست دانلود و در کش ذخیره می‌شود و در مرتبه‌های بعدی، به‌جای دانلود مجدد، از کش روی دیسک لود می‌شود.حال اگر دیتاست ما سایز خیلی زیادی داشت که ممکن است روی دیسک جا نشود و سیستم کرش کند بهترین راه استفاده از روش stream کردن دیتاست است که سطر به سطر دیتا را لود میکند. تابع load_dataset برای برخی دیتاست‌ها مثل ویکی‌پدیا نیاز به مشخص کردن name دارد. برای مثال:from datasets import load_dataset

dataset = load_dataset(&quot;wikipedia&quot;, name=&quot;20220301.en&quot;, streaming=True)

for i, sample in enumerate(dataset[&#039;train&#039;]):
    print(i, sample)
    if i &gt; 100:
        break
نکته: آبجکت برگردانده‌شده در حالت استریمینگ معمولاً یک دیکشنری از اسپلیت‌هاست، بنابراین باید مثلاً dataset[&#039;train&#039;] را پیمایش کنیم.اگر بخواهیم دیتاست را به بخش های آموزش و تست تقسیم کنیم:from datasets import load_dataset

train_ds = load_dataset(&quot;imdb&quot;, split=&quot;train&quot;)
test_ds = load_dataset(&quot;imdb&quot;, split=&quot;test&quot;)

print(&quot;length and first train sample: &quot;, len(train_ds), train_ds[0])فرمت های دیتاست هافرمت‌های CSV و JSON متن‌محور و خوانا برای انسان هستند، ولی برای دیتاست‌های بزرگ، هم فضای نسبتاً زیادی روی دیسک می‌گیرند و هم برای پردازش و جستجو روی حجم زیاد داده، معمولاً کارایی پایینی نسبت به فرمت‌های ستونی دارند. فرمت Parquet یک فرمت ستونی و باینری است که برای ذخیره‌سازی فشرده، سرعت خواندن/نوشتن بالا و پردازش تحلیلی روی داده‌های حجیم طراحی شده است. این فرمت برای سناریوهایی مانند آموزش‌های توزیع‌شده و ذخیره‌سازی روی چند دیسک یا سیستم توزیع‌شده بسیار کاربردی است.مدیریت فایل های بزرگگفتیم که یک راه برای مدیریت دیتاست های حجیم استفاده از streaming است که کمک میکند سطر به سطر دیتا لود شود.حال فرض کنید ما در سیستم خود چندین مدل آموزش دیده شده و دیتاست های مختلف داریم، اگر همه آنها را در گیت آپلود کنیم کاری بهینه نیست، برای این سناریو سه روش موثر وجود دارد:۱. استفاده از gitignoreدر این فایل می‌توانیم لیستی از فایل‌ها و دایرکتوری‌هایی که نمی‌خواهیم Git آن‌ها را تحت کنترل ورژن قرار دهد مشخص کنیم. در نتیجه این فایل‌ها هر بار به مخزن ریموت (مثلاً GitHub) ارسال نمی‌شوند. برای کامنت گذاشتن در فایل .gitignore دقیقا مانند کامنت گذاشتن در پایتون از # استفاده می کنیم.# ignore model checkpoints
*.pt
*.pth

#ignore directories
venv/
dataset/۲. استفاده از Git LFSوقتی بخواهیم فایل‌های بزرگ را در کنار کد در مخزن Git نگه داریم، می‌توانیم از Git LFS استفاده کنیم. در این روش، به‌جای ذخیره‌ی مستقیم فایل‌های حجیم در مخزن  pointerهای کوچکی به آن‌ها در repository ذخیره می‌شود و خود فایل‌های بزرگ در یک فضای ذخیره‌سازی جداگانه نگه‌داری می‌شوند.git lfs install

git lfs track &quot;*.pt&quot;
git lfs track &quot;*.bin&quot;

git add .gitattributes
git commit -m &quot;Git «إئ setup&quot;۳. استفاده از dvcبرای کنترل نسخه‌ی داده‌ها می‌توان از DVC (Data Version Control) استفاده کرد. DVC برای هر فایل داده‌ای که track می‌شود یک فایل کوچک با پسوند .dvc ایجاد می‌کند که حاوی اطلاعات متادیتا و آدرس ذخیره‌سازی داده‌ی اصلی است. خود داده‌ی اصلی می‌تواند روی دیسک محلی، سرور ریموت، یا سرویس‌های ابری (مثل S3، Google Drive و …) ذخیره شود.pip install dvc

# setup dvc and track data
dvc init

dvc add data/training_set.parquet

# after dvc, git must be setup and track dvc file and gitignore

git add data/training_set.parquet.dvc data/.gitignore
git commit -m &quot;Track training data with dvc&quot;</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Wed, 29 Apr 2026 16:40:47 +0330</pubDate>
            </item>
                    <item>
                <title>ابزار های کاربردی کد نویسی- بخش پنجم</title>
                <link>https://virgool.io/@sezavar/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%DA%A9%D8%AF-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%AE%D8%B4-%D9%BE%D9%86%D8%AC%D9%85-e8gtd91hfxjh</link>
                <description>داکر (Docker) — ناجی دردسرهای وابستگی در پروژه‌های برنامه‌نویسیحتماً برایتان پیش آمده که پروژه‌ای را روی سیستم خود بدون هیچ مشکلی اجرا کرده‌اید، اما به‌محض اینکه همان فایل‌ها را به سیستم همکار یا سرور دیگری منتقل کرده‌اید، با خطاهای عجیب‌وغریب مواجه شده‌اید.  خطاهایی مثل: ModuleNotFoundError، VersionMismatch و یا مشکلات هنگام اجرا در GPU  علت این اتفاق فقط یک چیز است: تفاوت در محیط برنامه‌نویسی.سناریو واقعیفرض کنید شما در پروژه خود از:- PyTorch 2.3  - CUDA 12.4استفاده می‌کنید.  اما سیستم همکارتان مجهز به نسخه‌های:- PyTorch 2.1  - CUDA 11.8است. همین تفاوت کوچک کافیست تا پروژه‌ی شما به‌طور کامل از کار بیفتد.راه‌حل: داکر (Docker)Docker ابزاری است که مشکل تفاوت محیط‌ها را حل می‌کند.  داکر با ایجاد یک محیط ایزوله (isolated environment) شامل تمام وابستگی‌ها، کتابخانه‌ها، کدها و تنظیمات اجرایی، باعث می‌شود پروژه شما روی هر سیستمی دقیقاً مثل سیستم اولیه کار کند.شما تنها کافیست فایل داکر خود را به همکارتان بدهید، و او با یک دستور ساده همان پروژه را اجرا می‌کند؛ بدون هیچ خطا یا دردسری.مفاهیم اصلی در Docker۱. Dockerfile — دستور پخت محیط اجراییفایل Dockerfile شامل مراحل و دستورات لازم برای ساخت محیط اجرایی مورد نیاز پروژه شماست.  این دستورات معمولاً شامل نصب کتابخانه‌ها، تنظیم نسخه‌ها و کپی فایل‌های پروژه در محیط داکر هستند.مثال:FROM python:3.10

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . .

CMD [&quot;python&quot;, &quot;main.py&quot;]در این مثال، یک محیط ایزوله پایتون نسخه ۳.۱۰ ساخته می‌شود و تمام وابستگی‌ها از فایل requirements.txt نصب خواهند شد.۲. Image — قالب آماده اجراپس از اجرای دستور docker build، خروجی عملیات ساخت یک Image است.  این Image یک قالب read-only محسوب می‌شود که شامل تمام کتابخانه‌ها، فایل‌ها و تنظیمات شماست.مثال:اگر فایل اسمش Dockerfile باشه و در مسیری باشی که این فایل وجود داره، کافی است:             docker build -t myapp:latest .اگر اسم فایل مثلاً Dockerfile.dev باشد یا در مسیر دیگری باشد، از فلگ -f استفاده می‌کنی:docker build -f Dockerfile.dev -t myapp:dev .این دستور یک image به نام myapp ایجاد می‌کند.فلگ -t برای تعیین نام و تگ (tag) image استفاده می‌شود، در دستورات فوق نام image را myapp انتخاب کرده و tag را روی نسخه dev تنظیم کردیم (میتواند latest, prod یا حتی v1, 1.2 و غیره باشد)فقط نام بدون تگ (تگ پیش‌فرض latest می‌شود):docker build -t myapp .
# نتیجه: image با نام myapp:latest ساخته می‌شود---۳. Container — نسخه در حال اجرا از Imageهر زمان که یک Image را اجرا کنید، یک Container ساخته می‌شود:  در واقع Container همان فرآیند فعال و زنده‌ای است که پروژه شما را اجرا می‌کند.مثال:docker run -d -p 5000:5000 myappاز ایمیج myapp یک کانتینر ایجاد و در پس‌زمینه (background) اجرا کن، و پورت ۵۰۰۰ داخل کانتینر را به پورت ۵۰۰۰ روی سیستم من (host) متصل کن.فلگ -d  یعنی اجرا در پس‌زمینه (Detached Mode) انجام می‌شود و فقط شناسه‌ی کانتینر را دریافت می‌کنی.۴. docker-compose — ارکستر چند کانتینرگاهی پروژه‌ها از چند سرویس مختلف تشکیل می‌شوند، مثل:سرویس بک‌اند (Python)پایگاه داده (PostgreSQL)وب‌سرور (Nginx)در این حالت مدیریت آنها با چند دستور Docker سخت می‌شود.  فایل docker-compose.yml برای همین هدف طراحی شده تا بتوانید چندین container را با یک فرمان راه‌اندازی کنید.مثال ساده:```yamlversion: &#039;3.8&#039;

services:
web:
  build: .
  ports:
      - &quot;5000:5000&quot;

  db:
    image: postgres:14
    environment:
      POSTGRES_PASSWORD: example    با اجرای docker-compose up -d تمام سرویس‌ها با هم بالا می‌آیند.مزایای استفاده از Dockerحذف اختلاف نسخه‌ها بین سیستم‌ها  سرعت بالای راه‌اندازی پروژه در محیط‌های جدید  سهولت در استقرار (Deploy) روی سرور  یکپارچگی در توسعه، تست و اجرا  در پایان، اگر بخواهیم در یک جمله Docker را تعریف کنیم:&gt; Docker ابزاری است که پروژه‌ی شما را در یک «جعبه قابل‌حمل» قرار می‌دهد تا در هرجا دقیقاً به همان شکل کار کند.دستورات مهم داکر1. مدیریت ایمیج‌ها (Images)- لیست ایمیج‌ها:  docker images- ساخت ایمیج از Dockerfile:  docker build -t &lt;image_name&gt;:&lt;tag&gt; .- حذف ایمیج:  docker rmi &lt;image_id&gt;2. مدیریت کانتینرها (Containers)- اجرای یک کانتینر:   docker run -d -p &lt;host_port&gt;:&lt;container_port&gt; &lt;image_name&gt;- لیست کانتینرهای فعال:  docker ps- لیست همه کانتینرها (فعال و غیر فعال):  docker ps -a- متوقف کردن یک کانتینر:  docker stop &lt;container_id&gt;- حذف یک کانتینر:   docker rm &lt;container_id&gt;- مشاهده لاگ‌های کانتینر:   docker logs &lt;container_id&gt;- دسترسی به ترمینال درون کانتینر:    docker exec -it &lt;container_id&gt; /bin/bash۳. مدیریت حجم‌ها (Volumes)- لیست حجم‌ها:  docker volume ls- ایجاد یک حجم جدید:  docker volume create &lt;volume_name&gt;- حذف یک حجم:  docker volume rm &lt;volume_name&gt;موفق باشید</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Wed, 29 Apr 2026 13:30:50 +0330</pubDate>
            </item>
                    <item>
                <title>ریاضیات مورد استفاده در هوش مصنوعی - بخش اول</title>
                <link>https://virgool.io/@sezavar/%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C%D8%A7%D8%AA-%D9%85%D9%88%D8%B1%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-xdqpbkfn8sl8</link>
                <description>در این مطلب می‌خواهیم کمی «جبر خطی» را نه به شکل خشک دانشگاهی، بلکه مثل جعبه‌ابزار ذهنی‌ای ببینیم که پشت صحنه‌ی هوش مصنوعی و شبکه‌های عصبی کار می‌کند. سعی می‌کنم هر مفهوم را با مثال ساده و شهودی توضیح بدهم.۱. بردار (Vector): فلش‌های چندبعدیبردار را می‌توانید مثل یک «فلش» در فضا تصور کنید.- تعریف ساده:    بردار یعنی یک لیست از عددها:v = [3, 4]

#  یعنی از مبدأ (۰،۰) ۳ واحد به راست، ۴ واحد به بالا حرکت می‌کنیم.برداشت شهودی:    هر بردار یک «نقطه» در فضا هم هست.  ۲. اندازه (Magnitude): طول برداراندازه یا طول بردار، فاصله‌ی آن نقطه از مبدأ است.v = [3, 4]   
# |v| = 5۳. ماتریس (Matrix): جدولِ تبدیل‌هاماتریس را می‌توانید مثل یک «تابع خطی» یا «ماشین تبدیل» برای بردارها ببینید.کار اصلی:   بردارها را از یک فضا به فضای دیگر نگاشت (تبدیل) می‌کند. مثلا:y = A x

# map vector x into another space by using matrix Aماتریس A بردارها را در جهت x دو برابر می‌کند، ولی جهت y را دست‌نخورده می‌گذارد.۴. ضرب داخلی (Dot Product): سنجش شباهتضرب داخلی بین دو بردار، ترکیبی از «طول‌ها» و «زاویه بین آن‌ها» است و معمولا برای سنجش شباهت استفاده می‌شود.برداشت شهودی- اگر زاویه بین دو بردار کم باشد (تقریباً هم‌جهت باشند)، ضرب داخلی بزرگ و مثبت است ⇒ مشابه هستند.- اگر عمود باشند ⇒ ضرب داخلی صفر است ⇒ مستقل/بی‌ربط.- اگر در جهت مخالف باشند ⇒ منفی می‌شود.۵. امبدینگ (Embedding): معنیِ فشرده در قالب یک بردارامبدینگ، یک بردار است که «معنی» چیزی را در خودش فشرده کرده:  کلمه، تصویر، کاربر، محصول و…- مثال:    یک کلمه مثل «گربه» را می‌توان به یک بردار ۳۰۰ بعدی تبدیل کرد:  embedding(&quot;cat&quot;)=[0.12,−0.87,0.03,…]  در این فضا:  - بردار «dog» نزدیک به «cat» است، چون معناشان مشابه است.  - بردار «car» از آن‌ها دور است.ضرب داخلی و فاصله‌ی بین امبدینگ‌ها در این فضا، مقدار «شباهت معنایی» را به ما می‌دهد.۶. رتبه (Rank): میزان اطلاعات مستقل در ماتریسرتبه‌ی یک ماتریس، تعداد ستون‌ها (یا سطرهای) «خطی مستقل» آن است.ستون‌های خطی مستقل یعنی هیچ ستونی را نمی‌توان با ترکیب خطی بقیه ساخت.- اگر:رتبه = تعداد ستون‌ها ⇒ تمام ستون‌ها اطلاعات جدید دارند.رتبه کم ⇒ برخی ستون‌ها تکراری یا وابسته‌اند.مثال:در ماتریس بالا ستون دوم دقیقا ۲ برابر ستون اول است. پس:فقط یک ستون «اطلاعات منحصربه‌فرد» دارد.رتبه‌ی این ماتریس: ۱    (rank = 1 ⇒ فقط یک ستون واقعا اطلاعات جدید دارد.)۷. دترمینان (Determinant): ضریب بزرگ‌نمایی فضادترمینان یک ماتریس مربعی، یک عدد است که میزان «گسترش یا جمع شدن فضا» توسط آن ماتریس را نشان می‌دهد.اگر:(det(A)| &gt; 1|) ⇒ ماتریس فضا را بزرگ می‌کند.(det(A)| &lt; 1|) ⇒ فضا را کوچک/فشرده می‌کند.(det(A)|= 0|) ⇒ فضا را روی بعد پایین‌تری می‌خواباند (مثلا صفحه به خط)، و ماتریس «وارون‌پذیر» نیست.مثال:import numpy as np 

matrix = np.array([[2, 0], [0, 2]])

det = np.linalg.det(matrix)  # نتیجه: 4ماتریس فوق هر شکل دوبعدی را ۴ برابر بزرگ‌تر می‌کند (مساحت‌ها ×۴ می‌شوند).۸. بردار ویژه و مقدار ویژه (Eigenvector &amp; Eigenvalue)بیشتر بردارها وقتی یک ماتریس به آن‌ها اعمال می‌شود، هم «طول» و هم «جهت»شان عوض می‌شود.  اما بردارهای ویژه خاص هستند:بردار ویژه (Eigenvector): برداری است که تحت عمل ماتریس، جهتش تغییر نمی‌کند، فقط طولش تغییر می‌کند.مقدار ویژه (Eigenvalue): همان ضریب کشیدگی است.استفاده در PCA (تحلیل مؤلفه‌های اصلی)در PCA، هدف این است که داده‌ی در ابعاد بالا را به فضای کم‌بعدتر ببریم، بدون اینکه زیاد از «اطلاعات مهم» از دست بدهیم.مراحل ساده:1. ماتریس کوواریانس داده را می‌سازیم.2. بردارهای ویژه‌ی این ماتریس را حساب می‌کنیم ⇒ این‌ها همان مؤلفه‌های اصلی هستند.3. مقدارهای ویژه می‌گویند هر مؤلفه چقدر از «واریانس» (پراکندگی/اطلاعات) را توضیح می‌دهد.4. بردارهای ویژه را بر اساس مقدار ویژه مرتب می‌کنیم، و مثلا فقط «k تا از بزرگ‌ترین‌ها» را نگه می‌داریم ⇒ کاهش بُعد.به زبان ساده:  بهترین جهت‌ها برای نگاه‌کردن به داده (با بیشترین اطلاعات) همان بردارهای ویژه‌ی با مقدار ویژه‌ی بزرگ‌تر هستند.۱۰. مشتق (Derivative): نرخ تغییرمشتق، سرعت تغییر تابع را در یک نقطه اندازه‌گیری می‌کند.- تعبیر هندسی: شیب خط مماس بر نمودار در آن نقطه.مثال:اگر تابع برابر f(x) = x^2  باشد مقدار مشتق تابع برابر f&#039;(x) = 2x است. به این معنی که اگر در نقطه x= 2 مقدار x  را یک مقدار خیلی کوچک تغییر کند، مقدار y حدوداً به اندازه‌ی ۴ برابر آن تغییر کوچک افزایش پیدا میکند زیر مشتق در ان نقطه برابر ۴ است.۱۱. گرادیان (Gradient): مشتق در ابعاد بالاتروقتی تابعی چند متغیر دارد، گرادیان آن تابع، یک بردار از مشتق‌های جزئی است.گرادیان جهت «بیشترین افزایش» تابع را نشان می‌دهد.برای کمینه کردن تابع (مثلا خطا در شبکه عصبی)، باید در «جهت مخالف گرادیان» حرکت کنیم ⇒ گرادیان نزولی (Gradient Descent).۱۲. ژاکوبین (Jacobian): ماتریس مشتق‌های جزئیوقتی تابع‌تان چند ورودی و چند خروجی دارد، ژاکوبین همان چیزی است که مشتق را به صورت ماتریس نشان می‌دهد.به فارسی: ماتریس مشتقات جزئی مرتبه اول.برداشت شهودی: شیب/حساسیت خروجی‌ها نسبت به ورودی‌ها در یک نقطه.در شبکه‌های عصبی، ژاکوبین وزن‌ها و خروجی لایه‌ها را به هم ربط می‌دهد و در محاسبه‌ی گرادیان‌ها نقش دارد.۱۳. هسین (Hessian): ماتریس انحناوقتی مشتق درجه دو بگیریم، به هسین می‌رسیم.نقش: توصیف «انحنا» یا «شکل محلی» تابع:اگر هسین مثبت‌معین باشد ⇒ در آن نقطه یک مینیمم موضعی داریم.اگر منفی‌معین باشد ⇒ ماکسیمم موضعی.اگر مخلوط باشد ⇒ نقطه زینی.در بهینه‌سازی پیشرفته (مثل نیوتن روش‌ها)، هسین کمک می‌کند سریع‌تر به مینیمم برسیم.۱۴. قانون زنجیره‌ای (Chain Rule): قلب بک‌پراپ در شبکه‌های عصبیوقتی تابعی به صورت ترکیب چند تابع نوشته شود، مشتق y نسبت به x با قانون زنجیره‌ای به دست می‌آید:y=f(g(x))قانون زنجیره‌ای می‌گوید:برای پیدا کردن مشتق نهایی، باید مشتق هر لایه را در مشتق لایه‌ی بعدی ضرب کنیم.این دقیقا همان کاری است که Backpropagation انجام می‌دهد.برای محاسبه‌ی مشتق‌های ترکیبی، دو راه اصلی داریم:1. Forward Mode (از ورودی به خروجی): از x شروع می‌کنیم، مشتق‌ها را جلو جلو می‌بریم تا به y برسیم.2. Reverse Mode (از خروجی به ورودی):از y (خروجی) شروع می‌کنیم و مشتق‌ها را به عقب، به سمت پارامترها برمی‌گردانیم.در شبکه‌های عصبی معمولا به دلیل وجود تعداد پارامتر های زیاد از روش Reverse Mode استفاده می شود و تمام گرادیان ها در یک مرحله backward pass محاسبه می شوند.با تشکر</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Tue, 28 Apr 2026 20:51:18 +0330</pubDate>
            </item>
                    <item>
                <title>ابزارهای مورد استفاده در کد نویسی - بخش چهارم</title>
                <link>https://virgool.io/@sezavar/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D9%85%D9%88%D8%B1%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-%DA%A9%D8%AF-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%AE%D8%B4-%DA%86%D9%87%D8%A7%D8%B1%D9%85-tqtb65zvyoh7</link>
                <description>رابط برنامه نویسی کاربردی (API)کلید واژه: API یا Application Programming Interfaceچرا به API نیاز داریم:تصور کنید برنامه‌ای نوشته‌اید که سرویسی را ارائه می‌دهد، مانند یک مدل زبانی بزرگ که بر روی داده‌های پزشکی آموزش دیده است. حال می‌خواهید دیگران بتوانند از این سرویس استفاده کنند، بدون اینکه به کد اصلی برنامه دسترسی داشته باشند یا امکان تغییر آن را داشته باشند. تنها چیزی که لازم است این است که بتوانند درخواست‌هایی ارسال کنند و پاسخ مورد نظر را دریافت نمایند.سناریوی دیگری را نیز می‌توان در نظر گرفت: شما می‌خواهید در برنامه خود از سرویسی مانند دریافت اطلاعات هواشناسی استفاده کنید. یک رویکرد، نوشتن این سرویس از ابتدا در کد خودتان است که بهینه نیست، وقت‌گیر است و ممکن است دقت کافی نداشته باشد. روش صحیح‌تر، استفاده از سرویسی است که برنامه‌نویس دیگری پیاده‌سازی کرده است. شما بدون دسترسی به کد او، می‌توانید درخواست‌هایی به سرور آن ارسال کنید و تنها پاسخ را دریافت نمایید.هر دو سناریوی فوق را می‌توان با کمک رابط برنامه نویسی کاربردی (API) پیاده‌سازی کرد.جزییات API Call:هر API برای ارسال درخواست (API call) شامل بخش‌های زیر است:*   API Endpoint: آدرس (URL) برای دسترسی به سرویس خاص.*   Method: عملیات مورد نظر مانند GET (دریافت)، POST (ارسال)، PUT (به‌روزرسانی)، DELETE (حذف).*   Header: اطلاعات اضافی همراه درخواست، مانند کلید API (API Key).*   Body: اطلاعات اصلی درخواست (در صورت نیاز).پس از ارسال درخواست، پاسخی دریافت می‌شود که معمولاً شامل موارد زیر است:*   Status Code: کدی که وضعیت پاسخ را مشخص می‌کند، مانند 200 (موفقیت) یا 500 (خطای سرور).*   Body: پاسخ، که معمولاً در قالب JSON ارائه می‌شود.پارامترها:برای ارسال پارامترها همراه با درخواست، دو روش اصلی وجود دارد:روش اول: Path Parameters (پارامترهای مسیر)در این روش، پارامتر مستقیماً در خود آدرس قرار می‌گیرد.مثال:https://api.weather.com/weather/Viennaدر آدرس بالا، Vienna به عنوان پارامتر در خود URL قرار گرفته است.روش دوم: Query Parameters (پارامترهای پرس‌وجو)این روش امکان ارسال تعداد بیشتری پارامتر را فراهم می‌کند و از سینتکس زیر استفاده می‌شود:https://api.weather.com/weather?city=Vienna&amp;year=2026*   علامت ? نشان می‌دهد که پارامترها شروع می‌شوند.*   هر پارامتر به صورت key=value تعریف می‌شود.*   پارامترها با علامت &amp; از یکدیگر جدا می‌شوند.استاندارد RESTful APIفرض کنید سرویس‌های مختلفی ایجاد کرده‌ایم:*   /getuser*   /deleteuser*   /updatename*   /updateageداشتن چندین آدرس متفاوت و عدم وجود یک الگوی مشخص، کار با سرویس‌ها را دشوار می‌کند. اما با ایجاد یک الگو و استفاده از متدهای HTTP (مانند GET، POST، PUT، DELETE)، می‌توانیم این فرآیند را استاندارد کنیم. این همان کاری است که RESTful API انجام می‌دهد.مثال:*   getuser?id=253/ (روش قدیمی) معادل GET /user/253 (روش RESTful)*   delete?user=123/ (روش قدیمی) معادل DELETE /user/123 (روش RESTful)در استاندارد RESTful، ما از متدهای HTTP برای انجام عملیات بر روی منابع (مانند کاربر) استفاده می‌کنیم و آدرس‌ها ساختار منظم‌تری دارند.نحوه کار با API در پایتون:ارسال درخواست با requests:import requests

url = &quot;https://api.example.com/users&quot;  # نمونه آدرس

response = requests.get(url)

print(f&quot;status code: {response.status_code}&quot;)
print(f&quot;headers: {response.headers}&quot;)
print(f&quot;data: {response.json()}&quot;)ایجاد داده با متد با POST:در صورتی که headers نداشتیم می توانیم آن را حذف کنیم و چیزی ارسال نکنیم.import requests

url = &quot;https://api.example.com/users&quot;  # نمونه آدرس

headers = {
    &quot;Authorization&quot;: &quot;Bearer YOUR_TOKEN_HERE&quot;
}

data = {&quot;name&quot; : &quot;Ahmadreza&quot;,
        &quot;family&quot; : &quot;Sezavar&quot;,
        &quot;job&quot; : &quot;AI engineer&quot;}

response = requests.post(url, headers = headers, json=data)

response.raise_for_status()

print(&quot;Data created successfully.&quot;)
print(&quot;Response:&quot;, response.json())
نحوه ایجاد یک سرویس WebAPIمی توانیم از فریمورک های مختلفی برای اینکار استفاده کنیم مانند Flask, FastAPIدر اینجا ما از FastAPI به دلیل سرعت بالا استفاده می کنیم، هم چنین از uvicorn برای ایجاد یک سرورfrom fastapi import FastAPI

app = FastAPI()

# یک دیکشنری ساده به عنوان حافظه موقت
db = {}

@app.get(&quot;/&quot;)
def root():
    return {&quot;message&quot;: &quot;This is the main page&quot;}

# برای ایجاد کاربر جدید
@app.post(&quot;/users/{user_id}&quot;)
def create_user(user_id: int, name: str):
    db[user_id] = name
    return {&quot;message&quot;: &quot;user added&quot;}

# برای دیدن کاربران اضافه شده
@app.get(&quot;/users&quot;)
def get_users():
    return dbنحوه اجرا:uvicorn main:app --reload</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Tue, 28 Apr 2026 10:41:29 +0330</pubDate>
            </item>
                    <item>
                <title>ابزار های کاربردی در کد نویسی - بخش سوم</title>
                <link>https://virgool.io/@sezavar/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%AF%D8%B1-%DA%A9%D8%AF-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%B3%D9%88%D9%85-nkkb0iquezcv</link>
                <description>درک سخت‌افزار کامپیوتر: آشپزخانه یک رستورانفرض کنید شما سرآشپز یک رستوران هستید.  با همین مثال ساده، همه‌ی مفاهیم RAM، CPU، GPU و حتی CUDA برایتان شفاف می‌شود.۱. RAM (حافظه موقت) = پیشخوان آشپزخانهچیست؟ حافظه‌ی معمولی سیستم شما (مثل ۸، ۱۶ یا ۳۲ گیگابایت RAM).چه می‌کند؟ تمام داده‌هایی را که در حال حاضر در حال استفاده هستید نگه می‌دارد.تشبیه رستوران: پیشخوانی که روی آن مواد اولیه پخش است و در حال آماده‌سازی غذا هستید.مثال:# این داده‌ها در RAM نگهداری می‌شوند

dataset = load_csv(&quot;10k_rows.csv&quot;)   # 100 MB

model_weights = load_model()         # 500 MB

intermediate_results = []            # 200 MB

# مجموع = حدود 800 مگابایت از 16 گیگابایت رم شما📘 در کاربرد واقعی هوش مصنوعی:  RAM همان جایی است که دیتاست، متغیرها و محاسبات میانی شما هنگام اجرا درون آن قرار می‌گیرند.۲. CPU (پردازنده مرکزی) = سرآشپز اصلیچیست؟ مغز اصلی کامپیوتر (مثل Intel i7 یا AMD Ryzen).چه می‌کند؟ کارهای عمومی و متنوع را به‌صورت گام‌به‌گام (sequential) انجام می‌دهد.تشبیه: سرآشپزی که همه کار بلد است (خرد کردن، هم زدن، چشیدن، تزئین)  ولی هر بار فقط یک کار را انجام می‌دهد.ویژگی‌ها:- تعداد کمی هسته (۴، ۸ یا ۱۶) – یعنی مثل داشتن چند «دست» قوی ولی محدود  - هر هسته هوشمند و همه‌فن‌حریف است  - اما نمی‌تواند هزاران کار را هم‌زمان انجام دهد  نمونه کارهای مناسب CPU در یادگیری ماشین:- بارگذاری فایل‌های CSV (کارهای I/O)- پیش‌پردازش متن (Tokenization)- اجرای محیط Jupyter Notebook- کنترل حلقه‌ی آموزش (training loop)- افزایش داده (Data Augmentation) برای بچ‌های کوچک۳. GPU (واحد پردازش گرافیکی) = هزار دستیار خردکنندهچیست؟ تراشه‌ای خاص با هزاران پردازنده‌ی کوچک (NVIDIA، AMD و ...)چه می‌کند؟ یک محاسبه‌ی ساده را روی حجم زیادی داده به‌صورت هم‌زمان انجام می‌دهد.تشبیه رستوران: ۱۰۰۰ کمک‌آشپز دارید که فقط بلدند سبزیجات خرد کنند —  اما همه‌شان در یک لحظه، روی صدها سبزی مختلف کار می‌کنند.ویژگی‌ها:- هزاران «هسته» (اغلب ۲۰۰۰ تا ۱۰۰۰۰ عدد) — مثل داشتن هزاران دست  - هر هسته بسیار ساده و سریع است  - همه به‌صورت هم‌زمان و موازی کار می‌کنند  نمونه کارهای مناسب GPU در هوش مصنوعی:GPU در این موارد عالی است (هم‌زمان انجام می‌دهد):- ضرب ماتریسی (W @ X)  ← میلیون‌ها عمل هم‌زمان!- عملیات Convolution در CNN- پردازش دسته‌ای (Batch Processing) مثلاً ۶۴ تصویر همزمان- فوروارد و بک‌پراپاگیشن در شبکه‌های عصبیمقایسه‌ی تقریبی:- CPU ≈ انجام ۱۰ عمل در ثانیه، ولی به‌صورت ترتیبی  - GPU ≈ انجام ۱۰٬۰۰۰ عمل در ثانیه، ولی هر کدام ساده و موازی  ۴. VRAM (حافظه‌ی گرافیکی) = تخته‌کار کمک‌آشپزهاچیست؟ حافظه‌ی اختصاصی GPU (۴، ۸، ۱۲ یا ۲۴ گیگابایت)چه می‌کند؟ داده‌هایی را نگه می‌دارد که GPU در همان لحظه با آن‌ها کار می‌کند.تشبیه رستوران:- رم (پیشخوان) پر از مواد اولیه است — مثلاً ۱۰۰۰ هویج، ۵۰۰ پیاز، ۳۰۰ سیب‌زمینی.  - اما تخته‌کار هر آشپز فقط مواد مربوط به خودش را دارد — مثلاً ۶۴ هویج، ۳۲ پیاز — یعنی همان داده‌هایی که GPU هم‌اکنون در حال پردازش آن‌هاست.۵. CUDA (معماری محاسباتی یکپارچه) = زبان دستور پخت!چیست؟ مجموعه ابزار و زبان مخصوص NVIDIA که به کد شما اجازه می‌دهد با GPU ارتباط برقرار کند.چه می‌کند؟ کد پایتون یا PyTorch شما را به زبانی تبدیل می‌کند که GPU آن را بفهمد.تشبیه رستوران: دستورپخت‌هایی که به زبانی نوشته شده‌اند که همه‌ی هزار کمک‌آشپز آن را درک می‌کنند و بر اساس آن هم‌زمان کار می‌کنند.جدول خلاصه: تشبیه کامل رستوران| مؤلفه‌ی کامپیوتر | تشبیه در رستوران | نقش || CPU | سرآشپز اصلی | باهوش، همه‌فن‌حریف، ولی فقط یک کار در هر لحظه انجام می‌دهد || RAM | پیشخوان آشپزخانه | جایی برای نگهداری همه‌ی مواد اولیه‌ی در حال استفاده || GPU | هزار کمک‌آشپز | ساده، اما هم‌زمان هزار کار مشابه انجام می‌دهند || VRAM | تخته‌کار دستیارها | محل نگهداری موادی که در لحظه‌ی کار روی آن‌هاست || CUDA | زبان دستورپخت | زبانی که همه‌ی کمک‌آشپزها (GPUها) آن را می‌فهمند |🎯 جمع‌بندی:  در دنیای کامپیوتر، درست مثل آشپزخانه‌ی رستوران، هر بخش وظیفه‌ی خاصی دارد. CPU برنامه‌ریزی می‌کند، RAM داده‌ها را نگه می‌دارد، GPU اجراهای موازی را پیش می‌برد، VRAM داده‌های فعال را نگه می‌دارد و CUDA زبان ارتباطی بین آن‌هاست.</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Mon, 27 Apr 2026 11:20:16 +0330</pubDate>
            </item>
                    <item>
                <title>ابزار های کاربردی کد نویسی- بخش اول</title>
                <link>https://virgool.io/@sezavar/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%DA%A9%D8%AF-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-mzbrqvajx7kd</link>
                <description>ابزار های مورد بررسی در این پست: uvgitمدیریت پایتون با ابزار uvتا حالا شده کلی وقت صرف نصب پکیج‌ها کنی و آخرش هم با خطای «پکیج پیدا نشد» توی Jupyter Notebook روبرو بشی؟ یا اینکه مدیریت محیط‌های مجازی (venv) برات کلافه‌کننده شده باشه؟ اگر جوابت &quot;بله&quot; است، وقتشه با uv آشنا بشی. uv یک ابزار فوق‌سریع برای مدیریت پایتون و پکیج‌هاست که توسط تیم Astral ساخته شده. برخلاف ابزارهای قدیمی، uv به زبان Rust نوشته شده که باعث میشه سرعتش ۱۰ تا ۱۰۰ برابر بیشتر از ابزارهای معمولی باشه.چطور شروع کنیم؟نصبش خیلی ساده‌ست. کافیه دستور زیر رو در ترمینال بزنی:*   لینوکس/macOS:    curl -LsSf https://astral.sh/uv/install.sh | sh*   ویندوز (PowerShell):    iwr https://astral.sh/uv/install.ps1 -useb | iexچند دستور کلیدی که کارت رو راه میندازه:همین که این چند تا دستور رو یاد بگیری، دیگه نیازی نیست نگران پیچیدگی‌های محیط پایتون باشی:1.  شروع یک پروژه جدید:uv init my-project    (این دستور نه تنها پوشه پروژه، بلکه فایل تنظیمات و محیط مجازی رو برات می‌سازه).2.  ساخت محیط مجازی (اگر دستی خواستی):uv venv3.  نصب سریع پکیج‌ها:uv add numpy pandas    (به همین سادگی! uv خودش پکیج‌ها رو نصب و توی فایل‌های پروژه‌ات ثبت می‌کنه).4.  اجرای هر چیزی در محیط مجازی (بدون دردسرِ فعال‌سازی):   فقط کافیه اول دستورت uv run بذاری:uv run python main.py5.  مدیریت پکیج‌های توسعه (dev):    اگر می‌خوای ابزارهایی مثل pytest یا black رو فقط برای زمان کدنویسی نصب کنی:uv add --dev pytestچرا از uv استفاده کنیم؟اصلی‌ترین دلیلش اینه که uv بهت آزادی می‌ده. دیگه لازم نیست نگرانِ فعال کردن محیط مجازی (venv) باشی؛ uv هوشمندانه محیط پروژه رو می‌شناسه و دستوراتت رو دقیقا در جای درست اجرا می‌کنه.نکته برای Jupyter: اگر از VS Code استفاده می‌کنی و نوت‌بوکت پکیج‌ها رو نمی‌شناسه، کافیه با uv add ipykernel پکیج کرنل رو نصب کنی و بعد در VS Code، اینترپتر (Interpreter) خودت رو روی مسیرِ ./.venv/bin/python قرار بدی. ورژن کنترل با gitفرض کن داری روی یک پروژه عالی کار می‌کنی، کلی کد نوشتی و ناگهان... یک جای کار می‌لنگه! یا شاید هم تیمت بزرگ شده و همه باید روی یک پروژه با هم کار کنید. اینجا جاییه که Git وارد می‌شه؛ سیستم کنترل ورژن (Version Control System) که مثل یک کپی‌بردار حرفه‌ای از کارهای تو، همیشه حواسش به تغییرات پروژه هست.Git بهت اجازه می‌ده:*   از کارهات نسخه پشتیبان داشته باشی.*   به عقب برگردی و نسخه‌های قبلی رو ببینی.*   با تیمت به صورت هماهنگ کار کنی.*   و کلی کارهای باحال دیگه!جاهای مهمی که در Git باید بشناسی:فکر کن داری یک گزارش آماده می‌کنی. Git هم سه تا «مکان» اصلی داره که باید بشناسیشون:1.  Working Directory (محیط کارت):  جایی که داری کد می‌زنی و فایل‌هات رو مستقیماً تغییر می‌دی. همون پوشه پروژه‌ات!2.   Staging Area (منطقه آماده‌سازی):  قبل از اینکه تغییرات رو «ذخیره» کنی، یک مرحله داری که انتخاب می‌کنی دقیقاً کدام تغییرات رو می‌خوای در «نسخه بعدی» ثبت کنی. 3.  Local Repository (مخزن محلی): اینجا جاییه که «نسخه‌های ذخیره شده» (Commits) کارهات نگهداری می‌شه. هر بار که مراحل رو کامل کنی، یک نسخه جدید اینجا اضافه می‌شه.دستورات کلیدی که باید یاد بگیری (با مثال‌های ساده):1. git add - آماده‌سازی برای ذخیره:فرض کن یک فایل جدید ساختی new_feature.py و یک فایل قبلی رو ویرایش کردی main.py. برای اینکه این تغییرات رو برای ذخیره بعدی آماده کنی، از git add استفاده می‌کنی:*   برای آماده کردن یک فایل خاص:git add main.py*   برای آماده کردن همه فایل‌هایی که تغییر دادی:git add .2. git commit - ثبت نسخه جدید:بعد از اینکه تغییرات رو با git add آماده کردی، وقتشه که یک «نسخه» ازشون بسازی و در مخزن محلی (Local Repository) ذخیره کنی:git commit -m &quot;describe the commit&quot;

Example:
git commit -m &quot;Add new features to main.py&quot;3. git status - ببین اوضاع چطوره؟این دستور خیلی مهمه! بهت نشون می‌ده کدام فایل‌ها تغییر کردن، کدام‌ها آماده ذخیره (Staged) هستن و کدام‌ها هنوز اصلاً Git نمی‌شناسه:git status4. git diff - ببین چه تغییراتی دادی؟می‌خوای بدونی دقیقا در فایلی که add کردی چه چیزهایی عوض شده؟ یا حتی قبل از add کردن؟برای دیدن تغییرات آماده شده (Staged):git diff --stagedبرای دیدن تغییرات در Working Directory که هنوز add نکردی:git diff5. git push - فرستادن تغییرات به دنیای بیرون (مخزن راه دور):فرض کن داری روی کامپیوتر خودت کار می‌کنی. ولی پروژه‌ات روی یک سرور دیگه (مثل GitHub, GitLab) هم هست (که بهش می‌گن Remote Repository). وقتی می‌خوای تغییرات ذخیره شده در کامپیوترت (Local Repository) رو بفرستی به اون سرور، از git push استفاده می‌کنی:git push origin main(یعنی: تغییرات رو از شاخه main کامپیوتر من، بفرست به شاخه main در مخزن راه دور با نام origin)6. git pull - گرفتن آخرین تغییرات از دنیای بیرون:برعکس push؛ وقتی هم‌تیمی‌هات تغییراتی رو به مخزن راه دور فرستادن، تو با git pull آخرین نسخه رو می‌گیری و روی کامپیوتر خودت اعمال می‌کنی (ادغام با working directory):git pull origin main7. git fetch - فقط نگاه کردن به تغییرات راه دور:این دستور هم مثل pull هست، ولی با یک فرق مهم: تغییرات رو دانلود می‌کنه ولی روی کد فعلی تو اعمال نمی‌کنه. این بهت فرصت می‌ده که اول ببینی چه خبره، بعد تصمیم بگیری که آیا می‌خوای اون تغییرات رو با merge با کدت ترکیب کنی یا نه.git fetch origin8. git merge - ترکیب کردن تغییرات:وقتی چند نفر روی یک پروژه کار می‌کنن، ممکنه شاخه‌های کاری (Branches) جداگانه‌ای داشته باشن. git merge بهت اجازه می‌ده تغییرات یک شاخه رو با شاخه دیگه ترکیب کنی. مثلاً بعد از اینکه از fetch استفاده کردی و خواستی تغییرات شاخه main رو با شاخه کاری خودت my-branch ترکیب کنی:مثال:فرض کن شما دو شاخه (Branch) داری:main: شاخه اصلی پروژه شما.my-feature: شاخه‌ای که داری روش یک قابلیت جدید کار می‌کنی.شما در my-feature کدهایی اضافه کردی و حالا می‌خوای اون‌ها رو به main اضافه کنی. مراحل کار به صورت محلی (روی کامپیوتر خودت) این شکلیه:برو به شاخه اصلی:git checkout mainتغییرات شاخه قابلیت رو با main ترکیب کن:git merge my-featureنتیجه: اگر همه چیز خوب پیش بره، تغییرات my-feature به main اضافه می‌شه. اما اگر در همان قسمت از فایل‌ها، هم در main و هم در my-feature تغییری داده باشی، Git نمی‌دونه کدام رو نگه داره و با Conflict (تداخل) روبرو می‌شی که باید دستی حلش کنی.git merge یک فرآیند محلی و مستقیم است. شما مستقیماً تغییرات را با هم ترکیب می‌کنید9. git clone - برداشتن یک پروژه از راه دور:اولین قدم برای کار روی یک پروژه که در GitHub یا جاهای مشابه هست، اینه که اون رو به کامپیوتر خودت بیاری:git clone [آدرس مخزن]# Example: 
git clone https://github.com/user/repo.git10. git rm - حذف فایل‌ها (و آماده‌سازی برای ثبت حذف):اگر یک فایل رو از Working Directory پاک کردی و می‌خوای این حذف رو هم Git ثبت کنه، باید از git rm استفاده کنی:git rm old_file.txtبعد مثل بقیه تغییرات، با git commit ثبتش می‌کنی.Pull Request (PR) .11 در GitHub - یک درخواست برای ترکیب کردن (با بازبینی!)Pull Request (که در پلتفرم‌هایی مثل GitHub، GitLab و Bitbucket وجود داره) یک ابزار مبتنی بر پلتفرم هست، نه فقط یک دستور Git. PR زمانی استفاده می‌شه که شما می‌خواید تغییراتی رو که در یک شاخه (معمولاً در یک Remote Repository) ایجاد کردید، به شاخه دیگری (معمولاً شاخه اصلی) در همان مخزن اضافه کنید.فرایند PR اینطوریه:توسعه در شاخه جداگانه: شما یک شاخه جدید (مثلاً feature-x) در مخزن GitHub خودتون ایجاد می‌کنید و تغییراتتون رو در اون شاخه انجام می‌دید و commit می‌کنید.Push کردن شاخه به GitHub:git push origin feature-xایجاد Pull Request در GitHub: حالا به وب‌سایت GitHub می‌رید، به مخزن پروژه خودتون سر می‌زنید و گزینه‌ی “New Pull Request” رو می‌زنید. در اینجا:شاخه مبدأ (Base Branch) رو main انتخاب می‌کنید (شاخه مقصدی که می‌خواید تغییرات به اون اضافه بشه).شاخه مقصد (Compare Branch) رو feature-x انتخاب می‌کنید (شاخه‌ای که تغییرات شما در اون هست).4.بازبینی (Review) کد: این مهم‌ترین بخش PR هست! هم‌تیمی‌های شما یا خودتون می‌تونید کد اضافه شده رو بررسی کنید. نظراتشون رو بگن، پیشنهاد بدن، و شما می‌تونید بر اساس بازخوردها، تغییراتی اعمال کنید (با commit زدن و push کردن مجدد به همون شاخه feature-x).5. تأیید و Merge: وقتی همه از کد راضی بودن، کسی که دسترسی لازم رو داره (یا خود شما)، PR رو با شاخه main Merge می‌کنه. این Merge هم می‌تونه به صورت خودکار توسط GitHub انجام بشه.نتیجه: تغییرات شما پس از بازبینی و تأیید، با merge (که در پشت صحنه توسط GitHub انجام می‌شه) به شاخه main اضافه می‌شه.Git شاید در ابتدا کمی ترسناک به نظر برسه، ولی با همین چند تا دستور کلیدی، می‌تونی کارهات رو خیلی منظم‌تر مدیریت کنی و دیگه نگران از دست رفتن هیچ کدی نباشی. پس شروع کن و از دنیای کنترل ورژن لذت ببر!</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Wed, 22 Apr 2026 20:04:33 +0330</pubDate>
            </item>
                    <item>
                <title>پایتون برای حرفه ای ها - بخش سوم</title>
                <link>https://virgool.io/@sezavar/%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AD%D8%B1%D9%81%D9%87-%D8%A7%DB%8C-%D9%87%D8%A7-%D8%A8%D8%AE%D8%B4-%D8%B3%D9%88%D9%85-xfb2dgct8sx5</link>
                <description>کتابخانه NumpyNumPy یکی از کتابخانه‌های اصلی و پایه‌ای در اکوسیستم علمی پایتون است که برای انجام محاسبات عددی و کار با داده‌های چندبعدی استفاده می‌شود. دلیل اصلی محبوبیت NumPy در بین برنامه‌نویسان و تحلیل‌گران داده، سرعت بالا و کارایی حافظه آن است. برخلاف لیست‌های معمولی پایتون که هر عنصر در حافظه به صورت جداگانه و با اشاره‌گر نگهداری می‌شود، NumPy داده‌ها را به‌صورت پیوسته و فشرده در یک بلوک حافظه ذخیره می‌کند و از نوع داده همگن (مثل float64 یا int32) استفاده می‌کند؛ همین ویژگی باعث می‌شود عملیات ریاضی، آماری و ماتریسی بسیار سریع‌تر اجرا شوند. علاوه بر این، NumPy از توابع و بردارهای بهینه‌شده در سطح زبان C استفاده می‌کند که اجرای محاسبات سنگین را تا چندین برابر سریع‌تر از پایتون خالص می‌سازد. به‌طور کلی، هر زمان که حجم داده زیاد باشد یا نیاز به تحلیل عددی دقیق و سریع داشته باشیم، NumPy بهترین انتخاب است.متد های مهم در Numpynp.arange(n)
np.array([])
np.reshape()

np.random.rand()
np.random.randn()
np.random.randint(start, stop, size)
np.random.choice(list, n)

np.min()
np.max()
np.mean()
np.std()

a[0]
a[-1]
a[-1][-1]

a + 3

a[a%2 == 0]مصرف حافظه لیست و ارایه numpyلیست‌های پایتون (Python Lists):اشاره‌گر (Pointer): هر عنصر در یک لیست پایتون در واقع یک اشاره‌گر به یک شیء دیگر در حافظه است. این خود شیء (مثلاً یک عدد اعشاری float) در جای دیگری از حافظه نگهداری می‌شود.سربار (Overhead): علاوه بر حافظه‌ای که خود شیء داده اشغال می‌کند، حافظه اضافی برای نگهداری این اشاره‌گرها و همچنین سربار مربوط به ساختار داده لیست (که باید قابلیت تغییر اندازه و افزودن/حذف عناصر را داشته باشد) مصرف می‌شود.عدم پیوستگی: عناصر یک لیست لزوماً در حافظه به صورت پیوسته قرار ندارند.آرایه‌های NumPy (NumPy Arrays):پیوستگی حافظه (Contiguous Memory): NumPy داده‌ها را در یک بلوک پیوسته از حافظه ذخیره می‌کند. این به این معنی است که تمام عناصر آرایه پشت سر هم در حافظه قرار می‌گیرند.نوع داده یکسان (Homogeneous Data Type): NumPy انتظار دارد که تمام عناصر آرایه از یک نوع داده مشخص باشند (مثلاً همه float64 یا همه int32). این اجازه می‌دهد تا حافظه به طور بسیار فشرده و بدون سربار اضافی برای هر عنصر، مدیریت شود.کاهش سربار: چون نیازی به ذخیره اشاره‌گر برای هر عنصر نیست و داده‌ها پیوسته هستند، سربار حافظه به شدت کاهش می‌یابد. sys.getsizeof() برای یک آرایه NumPy (غیر از حالت dtype=object) عمدتاً اندازه خود شیء آرایه (شامل متادیتای آن و اشاره‌گر به بلوک حافظه داده) را نشان می‌دهد، نه اندازه تک تک عناصر.نکته مهم در مورد dtype=object: زمانی که از dtype=object در NumPy استفاده می‌کنید، مزیت بهینگی حافظه از بین می‌رود. در این حالت، NumPy مانند یک لیست پایتون عمل می‌کند و به جای ذخیره مستقیم مقادیر، اشاره‌گرهایی به اشیاء پایتون (که می‌توانند از انواع مختلفی باشند) را ذخیره می‌کند. بنابراین، مصرف حافظه در این حالت مشابه لیست پایتون خواهد بود و حتی ممکن است کمی بیشتر هم باشد به دلیل سربار اضافی خود شیء آرایه NumPy.کتابخانه PandasPandas یک کتابخانه توانمند و پرکاربرد در زبان پایتون است که برای مدیریت، تحلیل و پردازش داده‌های جدولی و سری زمانی طراحی شده است. این کتابخانه بر پایه‌ی NumPy ساخته شده و ساختار اصلی آن یعنی DataFrame، مشابه جدول‌های داده در Excel یا دیتابیس‌ها است؛ هر ستون در آن می‌تواند نوع داده متفاوتی داشته باشد (عددی، متنی، تاریخ و غیره). دلیل اصلی استفاده از Pandas این است که بسیاری از کارهای رایج در تحلیل داده — مانند پاک‌سازی، فیلتر کردن، گروه‌بندی، ترکیب داده‌ها و محاسبات آماری — را به شکلی ساده، خوانا و بسیار سریع انجام می‌دهد. همچنین Pandas قابلیت خواندن و نوشتن مستقیم داده از فرمت‌های مختلفی مانند CSV، Excel، SQL و JSON را دارد. به طور خلاصه، Pandas ابزاری است که داده‌های خام را به داده‌های قابل تحلیل تبدیل می‌کند و در فرآیندهای علم داده (Data Science)، تحلیل کسب‌وکار (Business Analytics) و یادگیری ماشین (Machine Learning) نقش مرکزی دارد.دستورات مهم:# Series 
df.Series([1, 3, 5], index = [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;])

# DataFrame
df.DataFrames(data)

# see features and data types
df.info()

# missing values
df.isna()

# total missing values
df.isna().sum()

# fill missing values with mean
df[&quot;age&quot;].fillna(df[&quot;age&quot;].mean())

# filter
mask = df[&quot;age&quot;] &gt; 15
df[mask]

# remove 
mask = df[&quot;age&quot;] &lt; 10
df[mask]

# between
mask = df[&quot;age&quot;].between(12, 14)

# is
mask = df[&quot;city&quot;].isin(&quot;Tehran&quot;)

# groupby
df.groupby(&quot;city&quot;)[&quot;age&quot;].sum()

# aggregation
df.groupby(&quot;city&quot;)[&quot;age&quot;].agg([&quot;sum&quot;, &quot;count&quot;, &quot;min&quot;])</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Wed, 22 Apr 2026 16:56:39 +0330</pubDate>
            </item>
                    <item>
                <title>پایتون برای حرفه‌ای‌ها - بخش دوم</title>
                <link>https://virgool.io/@sezavar/%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AD%D8%B1%D9%81%D9%87-%D8%A7%DB%8C-%D9%87%D8%A7-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-h7msgsavhxy8</link>
                <description>خطاهای رایج در پایتونخطاهای پایتون در واقع پیام‌های سیستم برای هشدار دادن درباره بخشی از کد هستند که منطق یا نحو (Syntax) صحیحی ندارد. رایج‌ترین خطاها شامل SyntaxError (زمانی که قوانین نوشتن زبان پایتون را رعایت نکرده‌اید)، TypeError (زمانی که عملیاتی را روی نوع داده اشتباه انجام می‌دهید) و ValueError (وقتی مقدار داده برای تابع معتبر نیست) هستند. به عنوان مثال، اگر سعی کنید یک رشته (string) را با یک عدد (int) جمع کنید، با خطای TypeError روبرو می‌شوید:# مثال: ایجاد خطای TypeError
age = 25
message = &quot;I am &quot; + age + &quot; years old&quot; 
# خروجی: TypeError: can only concatenate str (not &quot;int&quot;) to strماژول OSماژول os در پایتون یک ابزار قدرتمند برای تعامل با سیستم‌عامل است و کارهای زیادی را می‌توان با آن انجام داد.مشکل: فرض کنید می‌خواهید لیست تمام فایل‌ها و پوشه‌های موجود در یک دایرکتوری خاص را بدانید، یا شاید یک پوشه جدید بسازید و بعد به آن دایرکتوری تغییر مسیر دهید. انجام این کارها به صورت دستی و از طریق خط فرمان می‌تواند وقت‌گیر و مستعد خطا باشد، مخصوصاً اگر در حال نوشتن اسکریپتی باشید که باید این عملیات را به صورت خودکار انجام دهد.راه‌حل: ماژول os این کار را برای شما آسان می‌کند. با استفاده از توابع این ماژول، می‌توانید مستقیماً از درون کد پایتون خود با فایل‌ها و پوشه‌ها تعامل داشته باشیدimport os

# گرفتن لیست تمام فایل‌ها و پوشه‌ها در دایرکتوری فعلی
print(&quot;محتویات دایرکتوری فعلی:&quot;, os.listdir(&#039;.&#039;))

# ساختن یک پوشه جدید (اگر وجود نداشته باشد)
folder_name = &quot;my_new_folder&quot;
if not os.path.exists(folder_name):
    os.makedirs(folder_name)
    print(f&quot;پوشه &#039;{folder_name}&#039; ساخته شد.&quot;)

# تغییر دایرکتوری کاری به پوشه جدید
os.chdir(folder_name)
print(&quot;دایرکتوری کاری فعلی:&quot;, os.getcwd())

# بازگشت به دایرکتوری قبلی (اختیاری)
# os.chdir(&#039;..&#039;)دستورات مهمos.mkdir(&quot;dir/&quot;)
os.makedirs(&quot;dir/dir2&quot;)
os.rmdir(&quot;dir&quot;)
os.path.exists(&quot;dir&quot;)
os.path.getsize(&quot;dir&quot;)
os.listdir(&quot;.&quot;)مفهوم *args و **kwargsمشکل: تابعی دارید که قرار است مجموع اعداد را حساب کند، اما نمی‌دانید کاربر ۲ عدد می‌دهد یا ۱۰۰ عدد! نوشتن توابع جداگانه برای هر تعداد ورودی غیرممکن است.راه‌حل:*args: به تابع اجازه می‌دهد هر تعداد ورودی (به صورت لیست) بپذیرد.**kwargs: به تابع اجازه می‌دهد ورودی‌های کلیدی (نام‌دار) را به صورت دیکشنری دریافت کند. با این‌ها، تابع شما در برابر تغییرات ورودی‌ها بسیار منعطف می‌شود.def get_sum(*args):
    cnt = 0
    for i in args:
        cnt += i
    return cnt
        

print(get_sum(1,2,3,4))
print(get_sum(1,2,3,4,5,6,7,8,9))دکوراتورها (Decorators)مشکل: می‌خواهید زمان اجرای چندین تابع مختلف را اندازه‌گیری کنید یا بررسی کنید آیا کاربر اجازه دسترسی به آن تابع را دارد یا نه. آیا باید داخل تک‌تک آن‌ها کد تکراری بنویسید؟راه‌حل: دکوراتورها مثل “بسته‌بندی هدیه” هستند. شما یک تابع خاص می‌سازید که دور توابع اصلی شما می‌پیچد و ویژگی‌های جدیدی (مثل لاگ‌گیری یا کنترل دسترسی) به آن‌ها اضافه می‌کند، بدون اینکه کد اصلی تغییر کند.import time

def calculate_time(func):
    def inner(n):                           # wrapper function 
        print(&quot;Function starts&quot;)
        start = time.time()

        result = func(n)

        end = time.time()
        print(f&quot;Ends in {end - start}&quot;)
        return result

    return inner

@calculate_time
def sum_values(n):
    return sum(list(range(n)))

@calculate_time
def sum_sq_values(n):
    return sum([n**2 for n in list(range(n))])ژنراتورها (Generators)مشکل: می‌خواهید داده‌های بسیار بزرگی (مثلاً ۱ میلیون رکورد) را پردازش کنید. اگر همه آن‌ها را یک‌باره در حافظه (RAM) بارگذاری کنید، کامپیوتر شما هنگ می‌کند!راه‌حل: ژنراتورها به جای ساختن کل لیست در حافظه، داده‌ها را “تولید” می‌کنند. هر بار که نیاز دارید، فقط یکی از آن‌ها را به شما می‌دهند. این کار باعث می‌شود برنامه شما با کمترین میزان حافظه، با داده‌های حجیم کار کند.def gen_num(n):
    for i in range(n):
        yield i

my_gen = gen_num(10)          # save generator function


print(next(my_gen))           # call it
print(next(my_gen))
print(next(my_gen))</description>
                <category>Ahmadreza Sezavar</category>
                <author>Ahmadreza Sezavar</author>
                <pubDate>Tue, 21 Apr 2026 23:06:08 +0330</pubDate>
            </item>
            </channel>
</rss>