img

تحلیلی بر یادگیری ماشین

/
/
/

سالهاست که انسان‌ها تلاش کرده اند تا رایانه‌ها را به گونه ای برنامه ریزی کنند که چیزی شبیه تفکر بشر را تقلید کند. تا مرزهای محدودی، این امر با بهره برداری از یادگیری عمیق و شبکه‌های عصبی مصنوعی محقق گشته است. این مقاله تحلیل هایی را درباره یادگیری ماشین(یادگیری عمیق) ارائه می‌دهد.
هنگام وب گردی یا صرف وقت در شبکه‌های اجتماعی، حتما این سوال به ذهنتان خطور کرده است که چگونه چیزهایی که مورد علاقه شماست ناگهان در برابر شما ظاهر می‌شود.آیا می‌دانستید که در پس صحنه فعل و انفعالات فراوانی در حال وقوع است؟ در حقیقت، الگوریتم‌ها و محاسبات بسیاری در پشت صحنه در حال اجرا هستند تا چیزهای مورد علاقه شما رو پیدا کرده و به نمایش در بیاورند، که اساس آنها تاریخچه ی جست و جوهای شما می‌باشد.اینجاست که یادگیری عمیق آغاز می‌شود.
یادگیری عمیق این روزها یکی از داغ ترین موضوعات محسوب می‌شود. اگر شما جست و جویی در گوگل انجام دهید، با نتایج بسیاری برخورد می‌کنید که گویای این مطلب است و خواهید فهمید که یادگیری عمیق هر روز در حال پیشرفت است، به گونه ای که اگر کسی “هوش مصنوعی: پیروزی alphaGo از گوگل در برابر استاد بازی Go (lee Se-dol)” را بخواند، تخمینی از اوضاع به دست خواهد آورد.
در این مقاله، نگاهی خواهیم داشت که چگونه می‌توان عملا یک شبکه سه لایه را برای یادگیری عمیق اجرا کرد، و پایه‌های این تمرین را برای درک این شبکه بررسی خواهیم کرد.

 

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

 

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

 

معماری
تحقیق در زمینه یادگیری ماشین یک قلمرو جدید محسوب می‌شود و تا به حال معماری‌های بسیاری در این رابطه پیشنهاد شده است. از جمله:
۱٫شبکه‌های عصبی عمیق
۲٫شبکه‌های باوری عمیق
۳٫شبکه‌های عصبی کلاسیک
۴٫شبکه‌های باوری کلاسیک عمیق
۵٫شبکه‌های عصبی حافظه‌های ذخیره سازی و یافتن داده‌های عظیم
۶٫ شبکه‌های پشته سازی عمیق
شبکه‌های عصبی عمیق
اجازه دهید نگاهی داشته باشیم بر چگونگی کارکرد شبکه‌های عصبی عمیق. کلمه «عصبی» در شبکه‌های عصبی عمیق مربوط به بیولوژی می‌شود. در واقع، روح این شبکه ها، همانند آنچه که در سیستم‌های عصبی روی می‌دهد می‌باشد. بنابراین اجازه دهید نیم نگاهی داشته باشیم به چگونگی ارتباط دو یاخته عصبی بیولوژیکی.

همانگونه که در تصویر شماره یک نشان داده شده است، یک یاخته عصبی بیولوژیکی از سه بخش تشکیل شده است.
۱٫ دندریت: این قسمت به عنوان ورودی یک یاخته از یاخته دیگر محسوب می‌شود.
۲٫ آسه: این قسمت اطلاعت را از یک یاخته به یاخته دیگر انتقال می‌دهد.
۳٫ ارتباط سیناپتیک: این قسمت به عنوان رابط بین دو یاخته عصبی عمل می‌کند. اگر شدت سیگنال دریافتی از آستانه معینی فراتر باشد، سبب فعال شدن یاخته دیگر می‌شود.

انواع یاخته‌های عصبی
اجازه دهید سعی کنیم تصمیات انسانی و شبکه‌های عصبی بیولوژیکی را به صورت ریاضی بیان کنیم تا رایانه‌ها بتوانند آنها را درک کنند.
فرض کنید که شما قصد دارید از شهر A به شهر B بروید. قبل از اقدام به سفر، سه عامل وجود دارد که تصمیم شما را در رابطه با سفر تحت الشعاع قرار می‌دهد که از این قرار هستند:
a- اگر هوا خوب است(x1) خوب است (نمایش داده شده با ۱( یا بد است (نمایش داده شده با ۰( وزنی معادل (w1) دارد.
b- اگر ترک کردن شما(x2) تایید شود(نمایش داده شده با ۱)، یا نه
(نمایش داده شده با ۰) دارای وزنی معادل (w2) می‌باشد.
c- اگر انتقال(x3) در دسترس باشد(نمایش داده شده با ۱) یا خیر (نمایش داده شده با ۰) وزنی معادل (w3) دارد و شما اینگونه تصمیم خواهید گرفت: بدون توجه به اینکه ترک شما تایید شود یا خیر و انتفال در دسترس باشد یا نه، اگر هوا مساعد باشد، شما خواهید رفت. این شرح مسئله در شکل ۲ ترسیم شده است. بنا بر این شکل، اگر مجموع نتیجه ورودی‌های (xi) و وزن‌های مربوط به آنها (wi) بزرگتر از آستانه (T) باشد، سپس شما خواهید رفت (۱)، در غیر این صورت شما نخواهید نرفت (۰). (فرمول مقابل)
زمانی که ورودی و خروجی شما معین است، شما مجبور هستید که وزن‌ها و آستانه‌ها را برای برقراری معادله انتخاب کنید.
برای مثال، اجازه دهید داشته باشیم
w1 = 6, w2 = 2, w3 = 2 و T = 5.
شما تصمیمی صحیح خواهید گرفت اگر ما به عنوان مثال مقادیر ذکر شده را برای معادله شماره (۱) انتخاب کنیم، اگر ترک شما تایید نشود (۰) و انتقال در دسترس نباشد (۰) ولی هوا مساعد باشد (۱)، شما باید بروید.
همین طور شما می‌توانید سایر شرایط را نیز بررسی کنید. محاسبه دستی این وزن‌ها و آستانه‌ها برای مسائل تصمیم گیری کوچک ساده خواهد بود، ولی به محض افزایش پیچیدگی، ما بایستی راه‌های بهتری را بیابیم – و اینجاست که ریاضیات و الگوریتم‌ها وارد عمل می‌شوند.
f(y)، تابعی که در شکل ۳ نمایان است، در حالت‌های ۰ و ۱ خروجی می‌دهد. معنی اش این است که تغییرات هر چند جزیی در ورودی، منجر به تغییرات بزرگ در خروجی می‌گردد – توسط یک تابع پلکانی نشان داده شده است. این می‌تواند در بسیاری از موارد مشکلاتی را ایجاد کند، از آنجایی که ما بایستی تابع f(y) را برای تغییرات کوچکی در ورودی تعریف کنیم، تغییرات در خروجی کوچک خواهند بود – نشان داده شده در تابع sigmoid وابسته به این شرایط، دو نوع عصب تعریف شده است که در شکل ۳ مشهود است.

تعریف کردن شبکه عصبی عمیق
در شکل شماره ۲، Xi نماینده عصب ورودی است در حالی که f(y) نماینده عصب خروجی می‌باشد. در حالی که لایه ها، به ترتیب لایه‌های وروی و خروجی نامیده نامیده شده اند.
در شبکه عصبی عمیق، همانگونه که در شکل ۴ نمایش داده شده است، چندین لایه پنهان از واحدها در میان لایه‌های ورودی و خروجی وجود دارند.
اجازه دهید ببینیم تئوری که تاکنون درباره اش بحث کردیم در عمل چگونه خواهد بود.

 

تعلیم یک شبکه
در شبکه عصبی عمیق دو مرحله را شامل می‌شود:
۱- تعلیم شبکه
۲- آزمودن شبکه تا عیار کیفیت تعلیم یافتگی آن ارزیابی شود
پیش از اینکه ادامه دهیم، اجازه دهید با کلمات و تعاریف ریاضی که قرار است با آنها سر و کار داشته باشیم آشنا شویم.
برای شروع می‌توانید به جعبه ۱ برای تمامی فرمول‌های مربوطه مراجعه کنید.
بعد، از گرادیان کاهشی برای یافتن کمینه موضعی تابع استفاده شده است(شکل ۵)

گرادیان کاهشی بدین شرح کار می‌کند:
* عملکرد تابع فرضی f(p) متکی بر w1 می‌باشد.
* ما بایستی کمینه یک تابع را محاسبه کنیم(مثلا مقداری که با آن تابع کم ترین را تحویل می‌دهد.)
* ما به صورت تصادفی مقدار w1 را عدد دهی اولیه می‌کنیم تا نقطه آغازین را به دست آوریم.
•سپس ما شیب تابع را با در نظر گرفتن w1 محاسبه می‌کنیم و وزن را به گونه ای در ادامه می‌بینید به روز می‌کنیم:
طبق شکل شماره ۵، شیب مثبت است، w1 کاهشی است، و ما در مسیر درست حرکت می‌کنیم(به سمت پایین). خطای انتشار برعکس از خروجی به لایه ورودی رخ می‌دهد. اکنون ببینیم چگونه می‌توان یک شبکه عصبی عمیق سه لایه را اجرا نمود.

درک تشریح مسئله ها
در شکل ۶، ما چهار تصویر در قالب دو دویی را داریم که به عنوان ورودی به شبکه داده شده اند. هر تصویر ۳ بیت طول دارد. با نظر گرفتن هر ورودی دو دویی، ما ورودی عصبی را تعریف نموده ایم. بنابراین سه عصب ورودی در لایه ورودی وجود دارد. چهار عصب در لایه پنهان وجود دارد. و یک عصب خروجی نیز وجود دارد.
با در نظر گرفتن هر تصویر، یک خروجی از پیش تعریف شده مطلوب وجود دارد(d)
تصاویر ۱ و ۴ را با رقم صفر و خروجی دو دویی مطلوب صفر در نظر بگیرید، و تصاویر ۲ و ۳ را با رقم ۱ و خروجی دو دویی مطلوب ۱ در نظر بگیرید.
در لایه L1 تعداد ۱۲ وزن و در لایه L2 تعداد ۴ تا برای ارتباط میان دو لایه وجود دارد.
از آنجایی که خروجی و ورودی ما تعیین شده اند، ما بایستی وزن‌های لایه L1-w1 و وزن‌های لایه L2-w2 به گونه ای که خروجی حقیقی (z) برابر با خروجی مطلوب (d) باشد.
شکل ۶ را می‌توان بصورت نمودار بلوکی نیز ترسیم نمود، برای مشتق گیری معادلات درخواست شده، همانگونه که در شکل ۷ مشهود است.
جعبه ۲ معادلات متفاوتی را برای شبکه‌های عصبی عمیق ارائه می‌دهد.

مراحل اجرای یک شبکه عصبی عمیق سه لایه ای
۱- وزن‌های w1 را به صورت تصادفی مقداردهی اولیه کنید. ضرب داخلی x-ورودی و وزن‌های w1 نیتجه می‌دهد P1، که به عنوان ورودی برای تابع sigmoid در لایه L1 عمل می‌کند.
۲- خروجی تابع سیگموئید y می‌باشد، که به عنوان ورودی برای لایه خروجی عمل می‌کند.
۳- دوباره، weights w2 را به طور تصادفی مقدار دهی اولیه کنید. ضرب داخلی y و weights w2 حاصلش می‌شود P2، به عنوان ورودی برای تابع سیگموئید ۲ در لایه L2 عمل می‌کند.
۴- خروجی تابع ۲ سیگموئید z می‌باشد، که خروجی حقیقی ما می‌باشد. این خروجی را به تابع عملکرد P بدهید در کنار خروجی مطلوب تا خطا بروز کند.
۵- این خطا را با انتشار بلعکس کردن آن به حداقل برسانید و با استفاده از الگوریتم گرادیان کاهشی، یعنی تغییر وزن‌های w1 و w2 به منظور یافتن کمینه ی تابع عملکرد.
۶- هنگامی که خطا حداقلی است، خروجی حقیقی به خروجی مطلوب نزدیک خواهد بود.
کد‌های به زبان پایتونی که در ادامه می‌بینید اجرای عملی را نشان می‌دهد:

import numpy as np
import matplotlib.pyplot as plt
def nonlin(x,deriv=False):
if(deriv==True):
return x*(1-x) #derivative of the
Sigmoid function
return 1/(1+np.exp(-x)) #Sigmoid
function
def show_error(l):
e=[];e1=[];e2=[];e3=[];e4=[]
count1=0;count2=1;count3=2;count4=3
for i in l:
for j in i:
for k in j:
e.append(k)
for i in range(10000):
e1.append(e[count1]);e2.append(e[count2]);e3.
append(e[count3]);e4.append(e[count4])
count1+=4;count2+=4;count3+=4;count4+=4
plt.plot(e1,label=’input1’);plt.
plot(e2,label=’input2’);plt.plot(e3,label=’input3’);plt.
plot(e4,label=’input4’)
plt.xlabel(‘Iteration’,fontsize=17);plt.
ylabel(‘Error’,fontsize=17)
plt.legend();plt.grid(True)
plt.show()
x = np.array([[0,0,1], #input dataset
[۰,۱,۱],
[۱,۰,۱],
[۱,۱,۱]])

d = np.array([[0], #desire output dataset
[۱],
[۱],
[۰]])
np.random.seed(1)
w1 = 2*np.random.random((3,4)) – 1 #Randomally initializing
weights in Layer1
w2 = 2*np.random.random((4,1)) – 1 #Randomally initializing
weights in Layer2
l=[] #list
for j in xrange(10000): #Find slop/Derivative for n
number of steps
l0 = x
y = nonlin(np.dot(l0,w1)) #dot product of inputs and
weights are given to Sigmoid function which produces output y
z = nonlin(np.dot(y,w2)) #dot product of inputs and
weights are given to Sigmoid function which produces output z
p = z – d #Error
l2_delta = p*nonlin(z,deriv=True)
l1_error = l2_delta.dot(w2.T)
l1_delta = l1_error * nonlin(y,deriv=True)
w2 -= y.T.dot(l2_delta) #new_weight(w2)=old_
weight(w2)-change in weight(i.e.derivative w.r.t w2)
w1 -= l0.T.dot(l1_delta) #new_weight(w1)=old_
weight(w1)-change in weight(i.e.derivative w.r.t w1)
arry_to_list=p.tolist()
l.append(arry_to_list)
show_error(l)

کد مقدماتی از

//iamtrask.github.io/2015/07/27/python-network-part2/

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

 

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

 

نرخ یادگیری
لطفا به شکل‌های ۸، ۹، و ۱۱ مراجعه کنید. نمودارهای گنجانده شده در این اشکال برای موارد آزمایشی گوناگونی به لحاظ تغییرات جزیی در کد ترسیم شده اند.

 

مورد اول (شکل ۸)
•وزن‌ها را با محاسبه شیب ۱۰۰۰۰ تکرار، به روز رسانی کنید(مشابه کد مذکور)
•در واقع ما به این تعداد تکرار برای رسیدن به یک خطای نزدیک به صفر نداریم.

 

مورد دوم(شکل ۹)
اگر تعداد تکرار‌ها بیش از حد کم باشد، که مورد ما ۱۰۰ تا بود، ما خطای نزدیک به صفر را نخواهیم گرفت. و خروجی حقیقی ما به خروجی مطلوب نزدیک نخواهد شد. این غیر قابل پیش بینی خواهد بود.

مورد سوم(شکل ۱۰)
برای کاهش خطای نزدیک به صفر در تکرار با تعداد کم یک راه وجود دارد.
تنها به روز رسانی که شما لازم است انجام دهید، ضرب کردن شیب با یک ضریب ثابت است.
اینجا من از ضریب ثابت ۲۰ استفاده کردم که نرخ یادگیری نامیده می‌شود.

مورد چهارم (شکل ۱۱)
•شما نمی توانید نرخ یادگیری را خیلی کوچک و یا خیلی بزرگ تعیین کنید.
•اگر نرخ یادگیری خیلی بزرگ باشد(من ۵۰ را انتخاب کردم)، این امکان وجود دارد که سامانه ناپایدار گردد، همان گونه که در شکل ۱۱ مشهود است.
* اگر نرخ یادگیری خیلی کوچک باشد، زمان یادگیری افزایش خواهد یافت
من علاقه مند هستم مقاله را با بحث درباره قدرت پردازش لازم برای ساخت شبکه‌های عصبی عمیق کلان خاتمه دهم، و اینکه دنیا به چه سمت و سویی در زمینه در حال رهسپاریست. مغز یک انسان معمولی دارای ۱۰۰ میلیارد یاخته عصبی می‌باشد در حالی یک شبکه عصبی عمیق مصنوعی که رقابت Imagenet را برد دارای ۶۵۰۰۰۰ عصب بود.
با افزایش تعداد عصب ها، پیچیدگی نیز افزایش می‌یابد و اینگونه نیاز به پردازش افزایش می‌یابد. مثال‌های مذکور تعلیم را در چند هزارم ثانیه انجام می‌دهند.
شبکه‌های عصبی عمیق با میلیون‌ها عصب و مجموعه‌های داده ای تعلیمی کلان(ورودی) ماه‌ها و سال‌ها برای تعلیم یک شبکه بر روی یک پردازنده به طول می‌انجامد. ما می‌توان این زمان پردازشی را به طور چشمگیری با استفاده از پردازنده گرافیکی کاهش دهیم.
مقداری داده مقایسه ای در شکل ۱۲ مشهود است. اینجا بازده cuDNN v2 با CAFFE با استفاده از چندین شبکه معروف مقایسه شده است. پردازنده یک ۱۶ هسته ای اینتل haswell E5-2698 2.3GHz با ۳٫۶GHz توربو می‌باشد. پردازنده گرافیکی NVIDIA Geforce GTX TITAN X می‌باشد.
(کتابخانه شبکه عصبی عمیق NVIDIA CUDA (cuDNN) یک کتابخانه مقدماتی شتاب دهنده پردازنده گرافیک است. جدید ترین کتابخانه cuDNN v4 عملکرد بهینه تری دارد.)
تمام کمپانی‌های عظیم مثل گوگل، فیس بوک، آی بی ام، اپل، و غیره (لیست این اسامی بسیار طویل است که در اینجا نمی گنجد) همگی در حال حرکت به سوی یادگیری عمیق می‌باشند، و استفاده از آن برای برنامه هایی از تشخیص مکالمات گرفته تا ماشین‌های خود هدایت شونده کاربرد دارد.

نظر بدهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

It is main inner container footer text