نظریه‌ داروین با هوش مصنوعی چه می‌کند؟

به قلم مه‌رخ میرانی ورودی ۹۴ کارشناسی مهندسی نرم‌افزار دانشگاه صنعتی اصفهان

از ابتدا ظهور کامپیوترها در قرن گذشته بحث هوش مصنوعی و استفاده از کامپیوترها در انجام فعالیت‌های انسانی داغ بوده. به خصوص در چند سال اخیر، با زیاد شدن داده‌ها و قدرت پردازش کامپیوترها، پیشرفت‌های چشم‌گیری در این زمینه صورت گرفته است. برای بیش از ۳ دهه هوش مصنوعی با الهام از مغز و مسیرهای عصبی توسعه یافته و «فکر کردن» ماشین به معنای ارتباط توابع ریاضی به تقلید از نورون‌های مغزی بوده، ولی طبیعت ایده‌های بهتری هم دارد: تکامل! دانشمندان به تحقیقاتی قدیمی بازگشته‌اند که پیشنهاد می‌کنند هوش مصنوعی را در معرض تکامل و انتخاب طبیعی بگذاریم تا بدانیم همان روندی که مغز انسان را در طول میلیون‌ها سال شکل داده، اکنون چگونه کمک می‌کند تا الگوریتم‌هایی بهتر و کاراتر توسعه بدهیم.

چنین گفت داروین

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

شبکه‌ی عصبی در پوست گردو

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

یک بال صدا نداره

تاکنون شناسایی و دسته‌بندی تصاویر با استفاده از شبکه‌های عصبی عمیق پیشرفت زیادی داشته و تقریبا جزو مسائل حل‌شده محسوب می‌شود. گفتیم که شبکه‌های عصبی از پشت سر هم قرار گرفتن تعدادی نورون یا لایه تشکیل شده‌اند و تغییر در پارامترهای درون هر لایه به تدریج شبکه را در کار خود متخصص می‌کند. اما ساختار کلی شبکه مانند تعداد لایه‌ها و نوع آن‌ها و بسیاری موارد دیگر از قبل توسط انسان مشخص شده است. با این حال یافتن ساختار مناسب برای شبکه یک چالش جدی در این روش است. داروین در اینجا به کمک دانشمندان علوم کامپیوتر می‌آید. در سال ۲۰۱۷ محققان گوگل مقاله‌ای منتشر کردند که در آن از جمعیتی برابر ۱۰۰۰ شبکه‌ی بهینه‌شده آغاز کرده و بر روی ۲۵۰ کامپیوتر به طور هم‌زمان الگوریتم‌های یادگیری را اجرا کردند. سپس با ایجاد تغییراتی در ساختار شبکه‌ها سعی کردند آن‌ها را بهبود ببخشند. هر بار الگوریتمی که دقت کمتری داشت از بین می‌رفت و الگوریتم بهتر نگه داشته می‌شد، در حالی‌ که یک کپی از آن با یک تغییر تصادفی در لایه‌های شبکه به عنوان نسل بعد تولید شده، در بین ۱۰۰۰ الگوریتم اولیه قرار می‌گرفت و این روند بارها تکرار می‌شد.

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

پیشرفتِ دقت شبکه‌های تولید شده در طول زمان و ۴ نمونه از شبکه‌های تولید شده در طی مسیر رسم شده‌اند. نقاط خاکستری نشان‌دهنده‌ دقت شبکه‌های نسل قبلی هستند و نقاط بنفش شبکه‌هایی که در پایان الگوریتم جمعیت زنده را تشکیل می‌دهند. در این شبکه‌ها لایه‌های مختلف (c = Convolution, bn = Batch-Normalization, r = ReLU) که هر یک توابع و عملکرد خاص خود را دارند پشت هم قرار گرفته‌اند و تنها برخی از جزئیات آن‌ها به صورت تصادفی توسط الگوریتم تعیین شده است. شبکه‌ سمت راست بهترین عملکرد را در میان تمام شبکه‌ها یعنی دقت ۹۴.۶٪ داشته است.
پیشرفتِ دقت شبکه‌های تولید شده در طول زمان و ۴ نمونه از شبکه‌های تولید شده در طی مسیر رسم شده‌اند. نقاط خاکستری نشان‌دهنده‌ دقت شبکه‌های نسل قبلی هستند و نقاط بنفش شبکه‌هایی که در پایان الگوریتم جمعیت زنده را تشکیل می‌دهند. در این شبکه‌ها لایه‌های مختلف (c = Convolution, bn = Batch-Normalization, r = ReLU) که هر یک توابع و عملکرد خاص خود را دارند پشت هم قرار گرفته‌اند و تنها برخی از جزئیات آن‌ها به صورت تصادفی توسط الگوریتم تعیین شده است. شبکه‌ سمت راست بهترین عملکرد را در میان تمام شبکه‌ها یعنی دقت ۹۴.۶٪ داشته است.

بازگشت شبکه به دبستان

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

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

اتفاق جالبی که حین این تحقیق افتاده، این است که این روش توانسته تکنیک‌های پایه‌ای یادگیری ماشین مانند شبکه‌های عصبی کوچک، رگرسیون خطی[6] و پس‌انتشار خطا را پیدا کند. اتفاق جالب‌تر هنگامی افتاده که سعی شده عملکرد این روش تحت برخی محدودیت‌ها سنجیده شود. برای مثال هنگامی که داده‌های کمتری برای یادگیری در اختیار الگوریتم قرار داده شد الگوریتم توانست تابع noisy ReLU[7] را بیابد که توسط انسان نیز استفاده شده و به نوعی با ساده کردن شبکه جلوی سوگیری شبکه به نفع آن داده‌ محدود را می‌گیرد[8]. و نیز با کاهش تعداد قدم‌های یادگیری، جست‌و‌جو توانست تکنیک Learning rate decay[9] را بیابد که باعث می‌شود در ابتدای اجرا، گام‌های بزرگتری به سوی پاسخ برداشته شود و به تدریج این گام‌ها کوچک‌تر شوند. این تکنیک نیز هم‌اکنون مورد استفاده قرار می‌گیرد بنابراین چنین نتایجی ما را به یافتن الگوریتم‌ها و روش‌های موثری که هنوز به ذهن انسان‌ها نرسیده است امیدوار می‌کنند.

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


منابع:

مقاله اول - گزارش مقاله اول

مقاله دوم - گزارش مقاله دوم

پانویس‌ها:

[1] Evolutionary algorithm
[2] Genetic algorithm
[3] Local search (optimization)
[4] backpropagation of error
[5] فرآیند Learning
[6] Logistic Regression
[7] noisy ReLU
[8] در شبکه‌های عصبی هر چه ساختار یک شبکه پیچیده‌تر باشد قدرت یادگیری بیشتری دارد. اما در صورتی که داده‌هایی که به شبکه داده می‌شود کم و محدود باشد یا صرفا مربوط به نوع خاصی از مسائلی که شبکه با آن روبرو می‌شود باشد، شبکه با قدرت زیادی روی جزئیات این مثال‌ها متمرکز می‌شود و توانایی تعمیم دادن به شرایط کلی‌تر را از دست می‌دهد. این اتفاق که اورفیت شدن نام دارد، باعث می‌شود هنگام روبرو شدن با مثال‌هایی که تنها اندکی با مثال‌ها قبلی متفاوتند به خطا بیفتد و نتایج اشتباهی به بار آورد.
[9] Learning rate decay