ناوبری ابتدا
بسم الله الرحمن الرحیم

وبلاگ شخصی بهروز ودادیان

روزنوشته‌های من از هنر، ریاضیات و کامپیوتر

دوگان‌های لعنتی

توسط بهروز در نوزدهم شهریور ماه ۱۳۹۶ (داستانک)

این را من نمی‌گویم. خود خدا گفته است. هر کوفتی که در عالم هستی آفریده شده، حتماً دوگانش هم آفریده شده.

زشت، زیبا. بی‌خاصیت، مفید. بی‌قواره، خوش‌تیپ. زرنگ، کودن.

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

خیلی نشانه‌ی زرنگی نیست اگر حدس زده باشید که کسری به عربی مزخرف است و من به فارسی.

اولین بار سال ۱۳۷۲ بود که دیدمش. در کلاس اول ب. در یک میز کنار هم نشسته بودیم. درسش مثل من خوب بود. قدش هم مثل من متوسط. قیافه‌ای هم نداشت لاکردار. سرزبان را ولی – چرا دروغ بگویم؟ – داشت.

همه‌ی کلاس برای دوستی با او سر و دست می‌شکستند. وقتی هفت سال رقابت بی‌ثمر با او را در درس و معدل با موفقیت پشت سر گذاشتم، فهمیدم که حکایت من حکایت همانی است که کلید در زیرزمین گم‌شده‌اش را زیر نور چراغ جستجو می‌کند.

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

همان سال اول بود که آتوسا را دیدم. دختر خجالتی درس‌خوان هم‌دوره‌ای مان که نشستنش، ایستادنش، لبخندش، راه‌رفتنش … بودنش را دوست داشتم. هنوز ترم دوم تمام نشده بود که دیگر با او آشنا بودم. در درس کمکش می‌کردم. در پروژه‌های درسی کنارش بودم. فیلم‌های مورد علاقه‌اش را با کیفیت خوب گیر می‌آوردم و برایش می‌بردم. حتی یادم هست که بعد کلی جستجو یک موقعیت شغلی جذاب گیرم آمد که او را به مدیر عامل معرفی کردم برای استخدام.

سال سوم دانشگاه تمام شده بود که از آتوسا خواستگاری کردم. چیزی نگفت. مخالف نبود. لااقل من فکر نکردم که مخالف باشد. اما بعدش آتوسا عوض شد. شر و شورش کم شده بود. اگر این قدر که الآن دوگان‌ها را می‌شناسم، آن موقع می‌شناختم می‌دانستم که مربوط به دوگان غم و شادی می‌شود.

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

مدت زیادی نگذشت که فهمیدم در تمامی این سه سال، در کتابخانه، در محوطه‌ی دانشگاه و در کلاس همراه کسری بوده‌ام! تمامی این سه سال برای آتوسا، من بهانه بودم و کسری دلیل. این هم یکی دیگر از دوگان‌ها!

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

مدل‌های آموزش‌پذیر: ایستگاه آخر

توسط بهروز در نهم شهریور ماه ۱۳۹۶ (کامپیوتر،هوش مصنوعی)

حالا که در دو قسمت قبلی (اول و دوم) از نقطه‌ی آغاز به استفاده عملیاتی از ساده‌ترین تابع آموزش‌پذیر رسیدیم، بهتر است با شتاب بسیار زیاد پرونده‌ی این موضوع را ببندیم؛ زیرا اولاً سریال‌های طولانی حوصله‌ی آدم را سر می‌برد و ثانیاً حتی اگر یک کتاب هم اینجا در رابطه با توابع آموزش‌پذیر بنویسم، مباحث تمام نمی‌شود. البته از همین حالا اعتراف کنم که باز هم سراغ همین موضوع و به دفعات خواهم آمد – البته در آینده – چون یکی از علایق من هوش مصنوعی است که این مدل‌ها زیربنای آن است.

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

مدل‌های آموزش‌پذیر واقعی

اما اصل مطلب. توابعی که در عمل برای استفاده برگزیده می‌شوند، معمولاً خیلی خیلی پیچیده‌تر از یک خط راست هستند. توابعی که تعداد پارامترهای آن‌ها از مرتبه‌ی ده میلیون است. برای مثال در شبکه‌های عصبی عمیقی که برای ترجمه‌ی ماشینی مورد استفاده قرار می‌گیرند، بیش از ۸ میلیون پارامتر وجود دارد (این مقاله را ببینید.)

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

اما دنیای ما نسبت به اولین باری که روش اولیه-ثانویه در عمل مورد استفاده قرار گرفت پیشرفت زیادی کرده است. پیش از این سوای نیاز به دانش حداقلی برای محاسبه‌ی مشتق و مشتق‌مرتبه‌ی دوم توابع پیچیده، نیاز به منابع پردازشی دور از دسترس عموم بود تا آموزش توابع واقعی عملاً امکان‌پذیر شود. حالا اما با داشتن یک GPU مناسب به قیمت حدود ۱.۵ میلیون تومان، می‌توانید از کتابخانه‌های نرم‌افزاری جدیدی که خودشان همه‌ی کار مربوط به محاسبه‌ی مشتق و بهینه‌سازی را برایتان انجام می‌دهند استفاده کنید و برنامه‌های هیجان انگیز بنویسید.

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

چیز دیگری که جالب توجه است، مثال‌های کاربردی و خوبی است که تیم توسعه دهنده با استفاده از همین کتابخانه نوشته و در اختیار عموم قرار داده‌اند. این مثال‌ها از گیت‌هاب قابل دریافت هستند. پیش از تلاش برای اجرای مثال‌ها، یادتان نرود که خود PyTorch را نصب کنید! دستورات مربوط به نصب PyTorch در صفحه‌ی اول سایت در قسمت «Run this command:» قابل مشاهده‌اند.

برای اینکه انگیزه‌ی بیشتری برای سر زدن به مثال‌ها داشته باشید، عناوینی از میانشان که برای خودم جذاب‌تر بودند را همینجا لیست می‌کنم:

  1. Super Resolution (یک جورهایی افزایش کیفیت تصویر)
  2. Language Model (ابزاری برای تولید متن به سبکی خاص و امتیازدهی به کیفیت جملات)
  3. MNIST (بازشناسی ارقام دستنویس انگلیسی)

یک مثال با نمک دیگر هم انتقال سبک تصویر است:

انتقال سبک تصویر
که می‌توانید هم کد منبع و هم توضیحاتش را اینجا پیدا کنید.

چرا سریال مدل‌های آموزش‌پذیر بوجود آمد

در طول این چند سالی که در زمینه‌های مرتبط با هوش مصنوعی کار و تحقیق می‌کردم، خیلی پیش آمده بود که زاویه‌ی نگاه دوستان و همکارانم به یادگیری ماشین را نمی‌پسندیدم. منظورم این است که هنگامی که مسائل از فرم رایج آن خارج می‌شدند – مثلاً آموزش به شیوه‌ای جدید مطرح می‌شد و یا تابعی جدید پیشنهاد می‌شد و یا اصلاً ارتباط بین یادگیری مانیفلد و شبکه‌های عصبی مصنوعی مورد اشاره قرار می‌گرفت – آن زاویه‌ی نگاه مانع فهم عمیق می‌شد (لااقل من اینطوی فکر می‌کردم!)

برای همین سعی کردم فارغ از جزئیات فنی، چیزی بنویسم که با شفافیت بیشتری شیوه‌ی یادگیری ماشین را نشان دهد. اینکه یادگیری ماشین همان یافتن نقطه‌ی کمینه‌ی یک تابع ریاضی است که نوع ساده‌اش را در ریاضیات دبیرستانی هم می‌بینیم. اینکه اگر شبکه‌های عصبی را با گراف‌هایی زیبا که یادآور ارتباطات نرون‌های داخل مغز است نشان می‌دهیم، یادمان نرود که روابط ریاضی مربوط به ارتباط دو لایه‌ی آن به سادگی $y=\sigma\left(Wx+b\right)$ است.

مدل‌های آموزش‌پذیر: خط راست، تابع ساده‌ی راستکردار

توسط بهروز در چهاردهم مرداد ماه ۱۳۹۶ (کامپیوتر،هوش مصنوعی)

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

فکر می‌کنم الآن وقت آن باشد که برای دیدن نتیجه‌ی واقعی یک آموزش ساده با استفاده از این تابع راستکردار، کمی وقت بگذاریم.

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

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

نقشه‌ی منطقه

بنابراین تعدادی نقطه نماینده‌ی محل خانه‌های افراد قبیله‌ی آبی داریم و تعدادی نقطه نماینده‌ی خانه‌های افراد قبیله‌ی قرمز. خط راست را هم که در پست قبل دیدیم دو پارامتر دارد. یکی نماینده‌ی شیب خط و دیگری عرض از مبدأ آن ($a$ و $b$ در فرمول $y=f(x)=ax+b$.)

در کلاس درس باید مقادیر مناسب $a$ و $b$ یادگیری شود که بیشترین فاصله را از خانه‌های قبیله‌های قرمز و آبی داشته باشد و در عین حال هر قبیله در یک سمت خط مربوط به این پارامترها قرار گرفته باشد.

با یک نگاه به فرمول خط راست ($y-ax-b=0$) می‌توانیم نتیجه‌ی در یک سمت خط راست بودن چند نقطه را حدس بزنیم. اگر مختصات نقاطی که روی خط راست هستند را درون فرمول بگذاریم که مشخص است و عدد صفر بدست می‌آید. اما اگر چند نقطه در یک طرف خط باشند، علامت مقداری که از قرار دادن مختصات آن‌ها در فرمول بدست می‌آید برابر خواهد بود.

پس بیاییم قرار بگذاریم که علامت قبیله‌ی قرمز، منفی و علامت قبیله‌ی آبی مثبت باشد. ظاهراً کارها دارد پیش می‌رود. فقط یک نکته باقی مانده است. خطوط راستی که می‌توانند دو مجموعه نقطه را از هم جدا کنند بیشمارند.

خطوط ممکن

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

خطوط پشتیبان

چون گفتیم که خطوط پشتیبان موازی‌اند، پس پارامتر $a$ آن‌ها یکسان است. اما عرض از مبدأ یکسانی ندارند. مثلاً عرض از مبدأ یکی از آن‌ها $b_0$ و دیگری $b_1$ است.

مسأله‌ی مورد نظر ما را می‌شود بصورت زیر بیان کرد: $$\begin{array}{l l} \text{Maximize } \frac{\mid b_0-b_1 \mid}{1+a^2} & \\ \text{subject to} & l_i(y_i-ax_i-0.5(b_0+b_1)) > 0 \end{array}$$

مفهوم رابطه‌ی بالا این است که مقدار $\frac{\mid b_0-b_1 \mid}{1+a^2}$ را بیشینه کن در حالی که برای همه‌ی نقاط (چه مربوط به قبیله‌ی قرمز و چه آبی) مقدار علامت آن نقطه (علامت مربوط به قبیله – $l_i$) ضرب در مقداری که از قرار دادن مختصات نقطه در فرمول خط بدست می‌آید، مقداری مثبت باشد. این یعنی خط به درستی برچسب قبیله را پیش‌بینی کند.

آخ! باز هم یک مشکل دیگر! آنهم برای یک مسأله‌ی ساده مثل این. چیزی که تا اینجا بدست آمده یک مسأله‌ی محدب نیست و جعبه‌ابزارهای بهینه‌سازی نمی‌توانند با تضمین مناسب این مسأله را حل کنند. اما راه حل مسأله چیز دشواری نیست. کافی است فرمول خط راست‌مان را طور دیگری بنویسیم. این را هم در دبیرستان دیده‌ایم: $$ay+bx+c=0$$

با این کار یک درجه‌ی آزادی نالازم به فرمول خط اضافه می‌شود. اما همین درجه‌ی آزادی نالازم می‌تواند خیلی از مشکلات را حل کند. برای نمایش خطوط پستیبان، لازم نیست که عرض از مبدأ آن‌ها را در نظر داشته باشیم. اینبار خط اصلی جداکننده را $ay+bx+c=0$ در نظر می‌گیریم و دو خط پشتیبان را بصورت: $$\begin{array}{l} ay+bx+c-1=0 \Leftarrow y-(-\frac{b}{a})x-(-\frac{c-1}{a})=0\\ ay+bx+c+1=0 \Leftarrow y-(-\frac{b}{a})x-(-\frac{c+1}{a})=0 \end{array}$$ دقت کنید هرچند درجه‌ی آزادی به فرمول خط راست اضافه شده، درجات آزادی کل مسأله تغییری نکرده!

حالا مسأله‌ی ما تبدیل می‌شود به: $$\begin{array}{l l} \text{Maximize } \frac{\mid 2 \mid}{a^2+b^2} & \\ \text{subject to} & l_i(ay_i+bx_i+c) > 0 \end{array}$$ با برداشتن یک قدم دیگر به یک مسأله‌ی محدب می‌رسیم، کافیست که فرم تابع هدف معکوس شود: $$\begin{array}{l l} \text{Minimize } a^2+b^2 & \\ \text{subject to} & l_i(ay_i+bx_i+c) > 0 \end{array}$$

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

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

اگر برنامه را بگیرید و اجرا کنید، نتیجه‌ی زیر را می‌بینید

خروجی برنامه

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

sudo apt-get install python-opencv

کتابخانه‌های بعدی، matplotlib، numpy، cvxopt و cvxpy هستند. همه‌ی اینها را می‌توانید با دستورات زیر نصب کنید

sudo su
pip install --upgrade pip
pip install --upgrade matplotlib
pip install --upgrade numpy
pip install --upgrade cvxopt
pip install --upgrade cvxpy

حالا کافیست برنامه را از git کپی بگیرید و یا از آدرس گیت‌لب دانلود کنید و بعد با دستور زیر آن را اجرا نمایید

python doit.py

درون کد برنامه برای هر بخش یک توضیح مختصر هم گذاشته‌ام که امیدوارم مفید باشد.

مدل‌های آموزش‌پذیر: این کامپیوتر فهیم، چگونه می‌آموزد

توسط بهروز در بیست و سوم آبان ماه ۱۳۹۵ (کامپیوتر،هوش مصنوعی)

سال ۱۳۷۳ بود که اولین کامپیوتر شخصی خودم را خریدم. درست تر بگویم برایم خریدند. آن موقع‌ها، حافظه‌ی رم دستگاه‌ها در حد و اندازه ۱ مگابایت بود و هوشمندانه ترین کاری که این اختراع دوست داشتنی برای من می‌کرد، گرفتن کلیدها بود و از جا جهاندن علاءالدین از روی ماموران خلیفه.

از آن موقع‌ها تا حالا کامپیوترها خیلی پیشرفت کرده‌اند. اندازه‌شان هم کوچکتر شده است – درست مثل انسان‌ها. حالا دیگر می‌توانی با گوشی موبایلت حرف بزنی و از او چیزی بخواهی. یا تصویر یک تابلوی راهنما را در کشور غریب به او نشان دهی و از او بخواهی که برایت – به زبان تو – بخوانَدَش.

اما مگر می‌شود؟ یک مشت فیلیپ فلاپ نادان و چند ده گرم نیمه‌رسانا یاد بگیرند چگونه ببینند و چگونه بشنوند؟

توابع ریاضی از منظری دیگر

اولین گونه‌ای از توابع ریاضی که به ما می‌آموزند – اگر اشتباه نکنم – خط راست است. تابع $f(x)=ax+b$. لااقل این اولین تابع عملیاتی است که با آن آشنا می‌شویم. تابعی با یک متغیر که نماینده‌ی یک خط صاف در یک صفحه‌ی دو بعدی مانند یک ورق کاغذ است. بسته به اینکه مقادیر $a$ و $b$ چه باشد، محل و شیب خط، عوض می‌شود.

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

نمونه‌ی طبقه‌بندی توسط خط راست

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

محققان انواع و اقسام زیادی از این توابع کلّی را طراحی و آزمایش کرده‌اند. شبکه‌های عصبی[۱]، ماشین‌های بردار پشتیبان[۲]، توابع فازی، مدل‌های احتمالاتی گرافی[۳] و مانند این‌ها. باز هم تأکید می‌کنم که همه‌ی این‌ها – از منظر یادگیری ماشین – توابعی با تعداد زیاد پارامتر هستند. این‌ها مدل‌هایی هستند که در عمل روی فضاهایی با ابعاد بسیار بالا – در حد ده‌ها و صدها هزار بعد – کار می‌کنند و تعداد پارمترهاشان خیلی از این مقدار بیشتر هم هست.

چگونه تابع خود را آموزش دهیم

برای بررسی این موضوع بهتر است به مثال شیرین خط مستقیم برگردیم. تابع $f(x;a,b)=ax+b$. این دفعه ورودی‌های تابع را به دو بخش تقسیم کردم. بخش ورودی یا همان $x$ و بخش پارامترها $a$ و $b$. از منظر ریاضیات و محاسبات، این دو دسته ورودی هیچ تفاوتی ندارند. در عمل هم تفاوتی ندارند. این فقط به ما کمک می‌کند که هنگام طراحی بتوانیم مقادیر درست را به ورودی درست بفرستیم. اگر برنامه‌نویس باشید، حتماً با استانداردهای نام‌گذاری بر خورد کرده‌اید! استفاده‌ی هوشمندانه از این نکته می‌تواند مسأله‌ی آموزش دادن تابع را حل کند.

قبل از پریدن به درون استخر آموزش لازم است که بگویم آموزش دادن به کامپیوتر هم شباهت زیادی به آموزش دادن به انسان دارد. اینجا هم معلم لازم داریم و حجم قابل قبولی داده‌های آموزشی که کامپیوتر ببیند و از روی آن یادبگیرد که چه باید بکند. مثلاً باید یک مجموعه عکس آماده داشته باشیم که درون آن محل‌هایی که نوشته وجود دارد را علامت‌گذاری کرده باشیم. حالا اینها را به کامپیوتر نشان دهیم تا یاد بگیرد در عکس‌های جدید، محل نوشته‌ها را پیدا کند – شاید سپس بتواند متن نوشته را به زبان ما بخواند.

فرض کنیم مجموعه‌ی آموزشی ما شامل نمونه‌هایی بصورت $D=\left\{(x_1,f_1),(x_2,f_2),\ldots,(x_N,f_N)\right\}$ است. برای آموزش دادن، تابع جدیدی تعریف می‌کنیم که فقط $a$ و $b$ را به عنوان ورودی می‌گیرد. اسمش را هم می‌گذاریم تابع خطا و با $J$ نمایشش می‌دهیم.

$$J(a,b)=\sum_{i=1}^N \|f(x_i;a,b)-f_i\|^2$$

حالا به کمک معلم مربوطه $a$ و $b$ ای پیدا می‌کنیم که مقدار $J$ برایش کمترین باشد. این یعنی مقادیری که نتیجه‌ی مورد نظر ما را بهتر تأمین کند. اگر به فرم $J$ دقت کنید، تفاوت تابع یادگرفته شده از مقدار مورد نظر ما را محاسبه کرده، به توان ۲ رسانده و این اختلاف را برای همه‌ی نمونه‌هایی که به کامپیوتر نشان داده‌ایم، جمع زده. کوچک بودن مقدار $J$ یعنی، تک تک جملات درون سیگمای جمع کوچک بوده‌اند – چون همگی اعدادی مثبت‌اند.

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

سخن به درازا کشید و حوصله‌ها محدود است. پس زندگی‌تان سرشار از سرزندگی.


  1. Artificial Neural Network

  2. Support Vector Machine

  3. Probabilistic Graphical Model