۲۹ شهریور ۱۳۹۹

بسته نرم افزاری Primitives

انیمیشنی که مشاهده می‌کنید، خروجی یک بسته نرم‌افزاری به نام Primitives است که به صورت متن‌باز در گیت‌هاب [+] در دسترس قرار دارد. کد این نرم‌افزار، با استفاده از زبان Go و توسط «مایکل فوگلمن» نوشته شده است.

خروجی این برنامه، می‌تواند به صورت رستری (فرمت PNG و JPG)، برداری (فرمت SVG) و یا انیمیشن (فرمت GIF) باشد. برای ساخت خروجی نیز، می‌توان مشخص کرد که شکل یا عنصر پایه (Primitive) چه باشد؛ خط، دایره، مستطیل، بیضی، مثلث، چندضلعی و حتی ترکیب همه این‌ها.

اما این نرم‌افزار چطور این کار را انجام می‌دهد؟ مسأله ما، یافتن یک نسخه تقریبی از تصویر ورودی است که در آن، از عناصر پایه مشخصی استفاده شده است. در واقع، این یک مسأله بهینه‌سازی است که البته پاسخ زیر-بهینه (sub-optimal) برای آن نیز، کار ما را راه می‌اندازد.

اما برای ساده‌تر کردن حل این مسأله بهینه‌سازی، یک ترفند جالب به کار رفته است. حل مسأله آن طور که هست، خیلی سخت است؛ اما می‌توان آن را تبدیل به یک فرایند بهینه‌سازی دنباله‌ای (Sequential Optimization) کرد. یعنی به جای حل یک مسأله بزرگ و سخت، چند مسأله ریز و متوالی را حل کنیم.

این تکنیک رایجی در حل مسائل بهینه‌سازی است و کاربردهای فراوانی در حوزه‌های مختلف دارد. در مورد این کاربرد خاص، مسأله اصلی به پیدا کردن فقط و فقط یک شکل یا عنصر پایه در هر مرحله، شکسته می‌شود. یعنی در هر مرحله، فقط یک عنصر افزوده می‌شود. البته پاسخ، غالبا زیر-بهینه خواهد بود.

مثلا فرض کنید که قصد داریم تصویری را فقط با دایره تخمین بزنیم. الگوریتم وقتی شروع به کار می‌کند، یک صفحه خالی دارد و بهترین دایره تنها را پیدا می‌کند که می‌تواند بهترین تقریب از تصویر را ارائه کند. محل، اندازه، زاویه، رنگ و شفافیت عناصر، متغیرهای تصمیم ما هستند. الگوریتم با تغییر این موارد، در فضای جواب به دنبال بهترین عنصری می‌گردد که می‌تواند اضافه کند و خطای تصویر تقریبی را کاهش دهد. تابع خطا نیز با معیارهایی مانند مجموع یا میانگین مربعات اختلاف رنگ، قابل محاسبه است.

در پروژه Primitive از الگوریتم‌های بهینه‌سازی ساده‌ای استفاده شده است و نتایج هم قابل قبولند؛ هم سرعت خوبی دارند و هم کیفیت پاسخ‌ها مطلوب است. در این برنامه نسخه تغییر یافته الگوریتم‌های تپه‌نوردی (Hill Climbing) و شبیه‌سازی تبرید (Simulated Annealing) به کار رفته‌اند.

الگوریتم بهینه‌سازی، در هر مرحله، بهترین شکل پایه جدیدی را که می‌تواند، پیدا می‌کند و به نتیجه بهینه‌سازی به دست آمده از مراحل قبل، اضافه می‌کند. به این ترتیب، به مرور و با افزوده شدن شکل‌های پایه به صورت متوالی، رفته رفته خطای تصویر اصلی و تصویر تقریبی، کاهش می‌یابد.

البته این فرایند کلا تصادفی است و پاسخ در دفعات مختلف اجرا، متفاوت خواهد بود. همین موضوع، می‌تواند به خلق تصاویر جالبی کمک کند. مثلا در تصویر زیر، نتیجه تقریب یک تصویر در دفعات مختلف، کمک کرده‌اند که چیزی شبیه انیمیشن استاتیک ایجاد شود.

با دو پادکست همراه شما هستم

با توجه به اینکه بسیاری از افراد، علاقه‌مند به گوش دادن پادکست و دنبال کردن مطالب از این طریق هستند و البته، مناسب بودن این روش برای انتقال اطلاعات و مفاهیم متعدد، مدتی است که دو پادکست «هوش مصنوعی» و «پرسش و پاسخ» را آماده و منتشر می‌کنم. در این مطلب، ضمن معرفی و بیان دلایل انتشار هر یک از این پادکست، راه‌های دسترسی به آن‌ها را نیز بیان کرده‌ام.

۲۳ آبان ۱۳۹۸

۲۳ اردیبهشت ۱۳۹۸

YPEA: الگوریتم‌های تکاملی یارپیز

زمستان سال ۱۳۹۵ بود که پیاده‌سازی یکی از ایده‌های قدیمی‌ام را شروع کردم که سال‌ها ذهنم را به خود مشغول کرده بود. هدفم ایجاد یک ساختار واحد و منسجم، برای مدل‌سازی، تعریف و حل «مسائل بهینه‌سازی» (Optimization Problem) با استفاده از روش‌های «محاسبات تکاملی» (Evolutionary Algorithm) و «فراابتکاری» (Metaheuristic) بود. انگیزه اصلی من برای انجام این کار، طی ارتباطم با دانشجوها شکل گرفت. سال‌ها، با صدها دانشجو به صورت مستقیم در ارتباط بوده‌ام و می‌دانم که یکی از بزرگ‌ترین مشکلات محققین و دانشجویان، به ویژه افرادی که در برنامه‌نویسی چندان توانمند نیستند، تعریف ساختار مسأله و متغیرهای آن است.

۱ بهمن ۱۳۹۷

پاسخ به پرسشی پیرامون الگوریتم ژنتیک و مسائل بهینه‌سازی — پادکست به همراه نسخه متنی

پرسشی توسط یکی از دانشجویان پیرامون «الگوریتم ژنتیک و مسائل بهینه‌سازی» مطرح شده بود که در یک پادکست به آن پاسخ داده‌ام. نسخه متنی این پادکست نیز در همین مطلب قرار گرفته است. البته، منبع اصلی همچنان فایل صوتی محسوب می‌شود. خوشحال می‌شوم در صورتی که مساله خاصی در رابطه با نسخه متنی وجود داشت، آن را از طریق بخش نظرات با من در میان بگذارید.

۱۰ بهمن ۱۳۹۶

مهم‌ترین دانش ما چیست؟

آیا تا کنون به این فکر کرده‌اید که مهم‌ترین دانش، تخصص و مهارت ما چیست؟ چیزی که مادر و پدید آورنده بخش مهمی از علم بشری است. آیا مانند «دو» که مادر ورزش‌ها شناخته می‌شود، دانشی وجود دارد که علوم مختلف، از آن منشعب شده باشند؟ باید بگویم چنین دانشی وجود دارد و در این نوشته، به این موضوع خواهم پرداخت.

مجموعه نکات و تجارب مرتبط با برنامه‌نویسی

از اواخر سال ۱۳۷۹ (و به طور غیر رسمی از تابستان ۱۳۷۸)، در مقاطع مختلف، مشغول به تدریس برنامه‌نویسی بوده‌ام. تا به حال (۲۵ مهر ۱۳۹۶)، فقط در بستر فرادرس، بیش از ۱۵ هزار دانشجو، در حوزه برنامه‌نویسی داشته‌ام. حاصل سال‌ها فعالیت آموزشی و کاری در حوزه برنامه‌نویسی، تجاربی هستند که بخشی از آن‌ها در قالب یک سری پادکست، در ادامه با شما به اشتراک گذاشته شده‌اند. پس از به راه افتادن «کانال پرسش و پاسخ» در تلگرام، فرصتی پیش آمد تا با دغدغه‌های بیشتری که برای دانشجویان و جوان‌ترها مطرح است، آشنا شوم. در این پست، پادکست‌هایی را که در کانال پرسش و پاسخ به اشتراک گذاشته‌ام و مربوط به حوزه برنامه‌نویسی هستند، جمع‌بندی کرده‌ام.

۲ خرداد ۱۳۹۶

قطره قطره جمع گردد …

تا کنون در نوشته‌های متعددی، بیش از هر چیز دیگری، بر اهمیت کارهای کوچک تأکید کرده‌ام؛ چه خوب و چه بد. معتقدم اگر قرار است بهبودی در چیزی ایجاد شود، بهتر است به تدریج با گام‌های کوچک باشد. چرا که گام‌های بزرگ و آنی، حتی اگر مقدور باشند، امکان شکست و ریسک بالایی دارند.

۲۳ اردیبهشت ۱۳۹۶

پروژه صدای عمیق

پیش از این در این پادکست [+]، به پروژه صدای عمیق (Deep Voice)، که محصول شرکت بایدو است، اشاره کرده بودم. این نرم افزار، یک سیستم تبدیل متن به گفتار (Text-to-Speech System)، یا به اختصار TTS است و در پیاده‌سازی آن، از روش‌های «یادگیری عمیق» استفاده شده است. در این پست صوتی، به معرفی کوتاه این پروژه پرداخته‌ام. در صورتی که علاقه‌مند به مطالعه بیشتر در خصوص این پروژه هستید، می‌توانید مقاله نوشته شده توسط اعضای تیم را، از این لینک [+] دریافت نمایید.

۶ اردیبهشت ۱۳۹۶

زبان روباتی و ارتباط درون سازمانی

اخیرا کلیپی تصویری دیدم که حاوی خبر مربوط به روبات‌هایی بود که، برای خودشان زبانی جدید را اختراع کرده‌اند. در این پست صوتی، با شروع از این موضوع، نکاتی در خصوص بهینگی ارتباط و اهمیت آن در کارایی یک سازمان و گروه، بیان شده‌اند.