بهینه سازی ساختاری شبکه عصبی با استفاده از روش های تکاملی جهت افزایش بهره وری

Evolutionary Structural Optimization to Rising Neural Processing Unit Utilization

  • جزئیات
  • خلاصه پژوهش
  • تعریف مسئله
  • اهمیت و ضرورت
  • اهداف
  • توضیحات تکمیلی
  • حمایت‌های موردنیاز
  • فایل‌های پیوست
  • پیام‌ها
  • حامیان پیشنهادیه
:   کاربردی
:  
کارشناسی ارشد
مهندسی کامپیوتر
مهندسی کامپیوتر - نرم افزار
:   9 ماه
:   1398/09/30

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

 

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

شبکه­های عصبی پرکاربرد شبکه عصبی پیشرو[3]، شبکه عصبی پیچشی[4] و شبکه‌های عصبی بازگشتی[5] هستند. شبکه‌های عصبی پیشرو از ساده‌ترین شبکه‌ها هستند که در آن هر نورون[6]، خروجی خود را به نورون لایه بعد از خود ارسال می‌کند. در ابتدا آموزش در این شبکه‌ها کاری دشوار بود که بعدها با توزیع گرادیان در لایه‌ها امکان پیاده‌سازی شبکه‌های پیشرو چندلایه و یا شبکه‌های پرسپترون چندلایه[7] فراهم گردیدZell, a, 1994)).

شبکه‌های عصبی پیچشی عموماً برای عملیات پردازش تصویر یا گفتار مورداستفاده قرار می‌گیرند. این نوع شبکه در لایه‌های ابتدایی خود از چندین فیلتر بهره می‌برد تا ویژگی‌های خاصی از تصاویر ورودی را استخراج نماید. سپس در لایه‌های بعد عملاً یک شبکه پیشرو جهت تشخیص روابط بین ویژگی‌ها و نتایج موردنظر تعبیه ‌شده است.(Lecun, Kavukcuoglu, Farabet, 2010)

شبکه‌های بازگشتی معمولاً برای پردازش سیگنال‌های دنباله­دار مورد استفاده قرار می‌گیرند. در یک شبکه عصبی همچون شبکه‌های پیشرو تمامی ورودی‌ها و خروجی‌ها مستقل از یکدیگر هستند اما در بسیاری از موارد این خواسته مسئله نیست. به‌عنوان‌مثال هنگامی‌که در یک جمله به دنبال پیش‌بینی کلمه بعدی هستیم درصورتی‌که شبکه نتواند روابط بین کلمات را یاد بگیرد هرگز نمی‌تواند کلمه بعدی را به‌درستی پیش‌بینی نماید. به‌طور خلاصه این شبکه‌ها دارای نوعی حافظه ضمنی هستند و اطلاعاتی که تاکنون دیده‌اند را تا حدودی ذخیره می­نمایند، شبکه‌های LSTM ازاین‌دست شبکه‌ها هست (Sak, Senior, Beaufays, 2014).

مسئله­ای که بین تمامی این شبکه‌ها مشترک است این است که هر شبکه ساختاری نیاز دارد، یعنی از چند لایه تشکیل‌شده است؟ معماری هر نورون به چه صورت است و در هر لایه چند نورون و چند ارتباط به نورون‌های دیگر دارد؟ مسئله دیگر اینکه چگونه به یک شبکه مسئله­ای را آموزش می­دهیم؟ و درنهایت باید در نظر گرفت که این شبکه بر روی چه بستری اجرا خواهد شد. رفته‌رفته با بزرگ‌تر شدن خواسته‌های جامعه از شبکه‌های عصبی، دیگر راهکارهای سنتی یادگیری ماشین و شبکه عصبی پاسخگو نبوده و نیازمند شبکه‌هایی عمیق‌تر هستیم (Mao, Hu, Hao, 2018) و (Buduma, Locascio, 2017).

یادگیری عمیق[8] یک زیرشاخه از یادگیری ماشین است که به ساخت و استفاده از شبکه‌های عصبی با تعداد لایه‌ها و نورون‌های زیاد پرداخته است. در این حوزه بیان گردیده است که هرچه حجم داده ورودی بیشتر باشد برای مسائل بزرگ، نتیجه بهتر است؛ اما بااین‌وجود آموزش این شبکه‌ها بسیار کند است. این در حالی است که برای یک مسئله کلان داده در حدود میلیون‌ها تا میلیاردها نمونه جهت آموزش وجود دارد (Chung, Sainath, Ramabhadran, Picheny, Gunnels, Austel, Kingsbury, 2017). از طرفی تعداد دفعات آموزش و نرخ آموزش را طوری انتخاب می‌کنند که در کمترین تعداد تکرار آموزش، شبکه موردنظر آموزش کافی را دریافت کرده باشد. در حوزه آموزش شبکه‌های عصبی عمیق، یکی از مسائل کند بودن الگوریتم آموزش است. از طرفی هرچه شبکه عمیق‌تر می‌شود زمان بیشتری برای استفاده از این شبکه نیاز است.

تاکنون کارهای زیادی با به‌کارگیری روش‌های تکاملی جهت پیدا کردن شبکه‌ای خوش­ساخت برای یک مسئله خاص، ارائه گردیده است؛ شبکه­ای را خوش‌ساخت می‌نامیم که ترجیحاً نورون‌های مرده نداشته باشد، تعداد لایه‌های آن حداقل باشد تا پردازش شبکه حداقل زمان را نیاز داشته باشد و درعین‌حال دقت خروجی شبکه کاهش پیدا نکند. معمولاً برای پیدا کردن شبکه خوش‌ساخت از روش‌های بهینه‌سازی استفاده می‌شود. یکی از این روش‌ها تحت عنوان NEAT در سال 2002 ارائه شد؛ این روش به‌صورت تکاملی تعداد نورون‌های شبکه را افزایش می‌داد و ارتباط بهینه بین نورون‌ها را نیز توسط الگوریتم ژنتیک جستجو می‌کرد (Stanley, Miikkulainen, 2002). سپس deepNEAT و درنهایت co-deepNEAt در سال 2016 ارائه گردید و همان روش پیدا کردن ساختار مناسب برای شبکه‌های عصبی را در حوزه یادگیری عمیق گسترش داد (Meyer-Lee, Uppili, Zhao, 2017). در این میان مقاله‌هایی نیز در بهبود زمان آموزش شبکه فعالیت کردند و از بسیاری از روش‌های موازی‌سازی بهره جستند. دریکی از این کارها، بر روی سیستم Blue Gene/Q از شرکت IBM، روشی برای پیاده‌سازی موازی الگوریتم آموزش شبکه عصبی مطرح گردیده است به‌طوری‌که می‌تواند سرعت آموزش را برای مسائل کلان داده بهبود دهد (Chung, et. al. 2017).

مسئله دیگر در حوزه یادگیری عمیق که موضوع بحث این پژوهش است، مسئله پردازنده مقصد است. کارهای زیادی در این حوزه انجام‌ گرفته، معماری‌های زیادی بر روی تراشه­های برنامه پذیر همچون FPGA و همچنین پردازنده‌های گرافیکی مطرح گردیده است. به‌عنوان‌مثال مقاله‌های (Hao, Quigley, 2017) و (Ovtcharov, Ruwase, Kim, Fowers, Strauss, Chung, 2015) معماری­هایی را برای اجرای محاسبات شبکه‌های عصبی روی تراشه‌های FPGA ارائه داده‌اند. در این راستا یکی از معماری‌های موفق که توسط شرکت گوگل مطرح گردیده است پردازنده­ی Tensor است (Jouppi, Young, Patil, Patterson, 2018). این پردازنده دارای چندین المان پردازشی است. ایده­ی اصلی این معماری این است که بتوان هر شبکه عصبی را به جمع کننده­ها و ضرب کننده­ها و همچنین توابع فعال‌ساز[9] تقسیم کند. با تقسیم شبکه عصبی به این المان‌های کوچک نیازمند یک کنترل‌کننده یا زمان‌بند هستیم تا هر بار بخشی از پردازش‌های یک‌ لایه از شبکه را خرد کرده و به‌عنوان فهرستی از دستورالعمل‌ها به سمت پردازنده شبکه عصبی ارسال نماییم.

 

 

شکل 1-1، معماری پردازنده شبکه عصبی Tensor (Jouppi, Young, Patil, Patterson, 2018).

از پردازنده Tensor اطلاعات زیادی به چاپ نرسیده و این مسئله به دلیل تجاری بودن محصول شرکت گوگل است، بنابراین ممکن است بسیاری از مشکلاتی که ما مشاهده می‌کنیم را در گروه‌های پژوهشی خود حل کرده باشند. بااین‌حال وجود معماری متن‌باز مشابه با پردازنده Tensor برای پردازش‌های شبکه‌های عصبی بسیار مفید خواهد بود. شکل 1-1 معماری پردازنده Tensor را به‌صورت مختصر نمایش می‌دهد. نکته­ای که در این پردازنده‌ها به چشم می‌خورد مسئله بهره­وری از پردازنده است. در رایانه­های امروزی بخشی از مسئله که مانیتور کردن منابع مصرفی و میزان بهره­وری است، به‌صورت سخت‌افزاری انجام می‌شود درحالی‌که سیستم‌عامل بخش اساسی این مهم را بر عهده دارد. برای استفاده از پردازنده‌های شبکه عصبی معمولاً از یک نرم­افزار تحت عنوان SDK بهره می‌جویند تا بتوان از این پردازنده‌ها با ارسال داده در زمان­های مشخص و همچنین وزن­های شبکه عصبی، به‌طور مناسب استفاده کرد.

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

حال در این تحقیق سؤالاتی مطرح می‌گردد. اصلی‌ترین این سؤالات عبارت‌اند از:

1- آیا می‌توان با استفاده از روش‌های تکاملی همچون الگوریتم ژنتیک با تغییر و جابجایی در زیر بخش‌های یک سیستم، بهره‌وری از منابع را در آن سیستم بهبود بخشید؟

2- آیا می‌توان با تغییر ساختار یک معماری پایه برای یک پردازنده مبتنی بر شبکه‌های عصبی (تغییر تراکم المان­های پردازنده شبکه عصبی) بهره­وری از پردازنده مذکور را افزایش داد؟

3- آیا می‌توان با استفاده از روش‌های تکاملی همچون الگوریتم ژنتیک، راهکاری یافت تا شبکه‌های عصبی منابع کمتری از واحدهای پردازنده‌ها را اشغال کنند و درنتیجه بتوان شبکه‌های عصبی بسیار بزرگ را با مصرف منابع کمتر، روی آن‌ها اجرا نمود؟



[1] Warren. McCulloh

[2] Walter Pitts

[3] Feedforward neural network

[4] Convolutional Neural Networks (CNN)

[5] Recurrent neural networks

[6] Neuron

[7] Multi-Layer Perceptron (MLP)

[8] Deep Learning

[9] Activation functions

[10] Fitness Function

 

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

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

هدف اصلی:

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

 اهداف فرعی:

-       مانیتورینگ بهره­وری از پردازنده‌های مبتنی بر شبکه عصبی

-       استفاده از قابلیت بازپیکربندی در تراشه‌های FPGA به منظوره پیاده‌سازی ساختار بهینه به‌دست‌آمده

استفاده‌كنندگان از نتیجه پایان‌نامه

-       محققان و پژوهشگران علوم کامپیوتر و علوم داده

-       مهندسین در حوزه یادگیری ماشین و هوش مصنوعی

-       شرکت­های ارائه‌دهنده خدمات مبتنی بر هوش مصنوعی

حامیان پیشنهادیه:

بدون حامی