Artificial Intelligence - هوش مصنوعی

Artificial Intelligence - هوش مصنوعی (http://artificial.ir/intelligence/)
-   شبکه های عصبی (Neural Networks) (http://artificial.ir/intelligence/forum10.html)
-   -   الگوریتم یادگیری نورون مصنوعی Adaline (http://artificial.ir/intelligence/thread10295.html)

mahdigh ۱۰-۱۲-۱۳۹۰ ۰۱:۵۱ قبل از ظهر

الگوریتم یادگیری نورون مصنوعی Adaline
 
دوستان سلام.

اگه میشه الگوریتم یادگیری نورون عصبی Adaline (تک نورون) رو شرح بدید.

ویکیپدیا یه چیزایی نوشته:
http://upload.wikimedia.org/wikipedi...64281a8409.png
(در اینجا)

میشه بگید این عمل ریاضی رو روی چی و چطور انجام بدم؟ منظورم اینه اینجا w کدوم یک از وزن ها هست؟ این کار رو چند بار باید روی چی انجام بدم؟ به ازای هر ورودی؟ یا ...

اگه میشه خوب توضیح بدید!‌ :دی

سپاس!

farshad_pickup ۱۰-۱۲-۱۳۹۰ ۱۱:۰۸ قبل از ظهر

سلام دوست من اگر منظورت اینه که این فرمول از کجا اومده که به صورت خلاصه بگم که همون طوری که میدونی گرادیان(مشتق جزئی روی هر درایه یک بردار) نرخ بیشترین تغییرات را نشان می دهد حال اگر منفی گرادیان رو داشته باشیم چیزی که به دست می آوریم بیشترین نرخ کاهش(یا همان نزول در امتداد گرادیان می باشد ) حال اگر شاخص را
least squares error
در نظر بگیریم و بر روی این شاخص نزول در امتداد گرادیان را انجام بدهیم پس کمترین نرخ خطا را خواهیم داشت
حال در این فرمولی که برای آموزش مطرح کرده اید یک ضریب اصلاح (اِتا) مطرح شده که وظیفه تعیین گام رو داره و اگه خیلی کوچیک باشه امکان داره در حین نزول در مینیمم های محلی گیر کنیم و اگر هم بزرگ باشه مشکلات دیگری به وجود میاد در سینتکس شما هم وo نشان دهنده خروجی واقعی و d نشان دهنده خروجی فعلی می باشد(چون ویدرو هاف یک یادگیری با نظارت می باشد ما خروجی های صحیح را میدانیم) پس با این ضرایب وزن را اصلاح می کنیم
البته من الان سر کارم !!!! نتونستم کامل تر توضیح بدم اگه جایی مشکل داشتیبگو رفتم خونه کامل تر توضیح میدم

میشه بگید این عمل ریاضی رو روی چی و چطور انجام بدم؟ این عمل برای آموزش شبکه(در اینجا تک نورون) و باید روی wها انجام بدی
منظورم اینه اینجا w کدوم یک از وزن ها هست؟
كد:

w new = w old + . . .
این کار رو چند بار باید روی چی انجام بدم؟ تا وقتی که شبکه همگرا بشه
به ازای هر ورودی؟ در اینجا هم دو روش داریم یکی بتچ و یکی یکی یکی:دی یعنی یک بار یک دور همه ورودی ها رو وارد می کنی بعد وزن به روز میشه ولی در حالت دیگه یکی یکی به روز میشه

mahdigh ۱۰-۱۲-۱۳۹۰ ۰۵:۳۹ بعد از ظهر

1(ها)ضميمه
میشه بگید تابع من چه مشکلی داره؟
كد:

  Dim Valid As Boolean
    Dim c As Integer = 0
    Do
        Valid = True
        c += 1

        For i As Integer = 0 To ListBox1.Items.Count - 1
            Dim s() As String = Microsoft.VisualBasic.Split(ListBox1.Items(i), " ")
            Dim y As Single = (W(1) * CInt(s(0)) + W(2) * CInt(s(1)) + W(3) * 1)
            W(1) += Alpha * CSng(CInt(s(2)) - y) * CSng(CInt(s(0)))
            W(2) += Alpha * CSng(CInt(s(2)) - y) * CSng(CInt(s(1)))
            W(3) += Alpha * CSng(CInt(s(2)) - y) * 1.0
        Next
        For i As Integer = 0 To ListBox1.Items.Count - 1
            Dim s() As String = Microsoft.VisualBasic.Split(ListBox1.Items(i), " ")
            Dim y As Single = (W(1) * CInt(s(0)) + W(2) * CInt(s(1)) + W(3) * 1)
            If CInt(s(2)) = 1 Then
                If y < 1 Then
                    Valid = False
                End If
            Else
                If y >= 1 Then
                    Valid = False
                End If
            End If
        Next
    Loop Until ((Valid) Or (c > 100000))
    If c > 10000 Then
        MsgBox("I Can't Learn!", MsgBoxStyle.Exclamation)
    End If

که در کد، هر کدوم اینا معنیشون اینه:
كد:

s(0) = voroodie avval
s(1) = voroodie dovom
s(2) = khoroojie matloob

این قراره یک AND یا OR ساده رو یاد بگیره. ولی یاد نمیگیره.

برنامه ی کامل رو هم پیوست کردم. (در برنامه Hebb و پرسپترون یاد میگیرن، ولی آدالاین نه...)
من نفهمیدم مشکلش چیه...

سپاس!

farshad_pickup ۱۰-۱۲-۱۳۹۰ ۱۱:۱۰ بعد از ظهر

قسمت آموزش کدتون درسته (البته من با سینتکس وی بی خیلی آشنا نیستم :60:)شما شرط valid بودن رو بردارید و فقط با تکرار مثلا 20 تست کنید اگه جواب داد اشکال از مقدار بایاسِ ، متاسفانه من VS ندارم تا کد رو چک کنم ولی اگه میشه تغییر وزن ها رو با ورودی و خروجی برای 12 تکرار اول اینجا بزارید تا دلیل واگرایی رو راحت تر با هم پیدا کنیم :111:
نقل قول:

نوشته اصلي بوسيله mahdigh (پست 22314)
میشه بگید تابع من چه مشکلی داره؟
كد:

  Dim Valid As Boolean
    Dim c As Integer = 0
    Do
        Valid = True
        c += 1

        For i As Integer = 0 To ListBox1.Items.Count - 1
            Dim s() As String = Microsoft.VisualBasic.Split(ListBox1.Items(i), " ")
            Dim y As Single = (W(1) * CInt(s(0)) + W(2) * CInt(s(1)) + W(3) * 1)
            W(1) += Alpha * CSng(CInt(s(2)) - y) * CSng(CInt(s(0)))
            W(2) += Alpha * CSng(CInt(s(2)) - y) * CSng(CInt(s(1)))
            W(3) += Alpha * CSng(CInt(s(2)) - y) * 1.0
        Next
        For i As Integer = 0 To ListBox1.Items.Count - 1
            Dim s() As String = Microsoft.VisualBasic.Split(ListBox1.Items(i), " ")
            Dim y As Single = (W(1) * CInt(s(0)) + W(2) * CInt(s(1)) + W(3) * 1)
            If CInt(s(2)) = 1 Then
                If y < 1 Then
                    Valid = False
                End If
            Else
                If y >= 1 Then
                    Valid = False
                End If
            End If
        Next
    Loop Until ((Valid) Or (c > 100000))
    If c > 10000 Then
        MsgBox("I Can't Learn!", MsgBoxStyle.Exclamation)
    End If

که در کد، هر کدوم اینا معنیشون اینه:
كد:

s(0) = voroodie avval
s(1) = voroodie dovom
s(2) = khoroojie matloob

این قراره یک AND یا OR ساده رو یاد بگیره. ولی یاد نمیگیره.

برنامه ی کامل رو هم پیوست کردم. (در برنامه Hebb و پرسپترون یاد میگیرن، ولی آدالاین نه...)
من نفهمیدم مشکلش چیه...

سپاس!


mahdigh ۱۰-۱۳-۱۳۹۰ ۱۲:۰۴ بعد از ظهر

آخه این کد کلا یاد نمیگیره. تا مثلا 100000 سایکل انجام میده ولی یاد نمیگیره.

اشکال از اینجا نیست؟ :
خروجی شبکه باید از تابع هم رد بشه؟
یعنی متغیر y باید همین باشه؟ یا اینکه شرط داشته باشه که اگه y بیشتر یا مساوی با یک بود٬ خروجی شبکه 1 توی رابطه یادگیری تأثیر داده بشه و اگه کمتر از یک بود٬ -1 تأثیر داده بشه؟

farshad_pickup ۱۰-۱۳-۱۳۹۰ ۰۷:۰۴ بعد از ظهر

آخه برای یک or یا AND ساده حد اکثر 4 تا 6 سایکل با alpha = 0.1 باید یاد بگیره
بعد یک موضوع دیگه چرا شرط valid بودن رو y>1 گرفتین ! این باید صفر باشه البته به نظر من در ورودی هاتون هم به جای صفر منطقی عدد 1- بگیرید تا سرعت همگرایی زیاد بشه
من الان کدتون رو تو متلب شبیه سازی !! می کنم ببینم جواب میده یا نه ;-)

mahdigh ۱۰-۱۳-۱۳۹۰ ۰۷:۱۸ بعد از ظهر

سپاس!
من منتظر پاسخ شما هستم!

farshad_pickup ۱۰-۱۳-۱۳۹۰ ۰۷:۲۳ بعد از ظهر

کدتون درست کار می کنه و همونجوری که گفتم توی چهار مرحله همگرا میشه
كد:

s = [-1 -1  1 1;
    -1  1 -1 1;
    -1 -1 -1 1];
 %first row of s show first input of AND
 %second row of s show second input of AND
 %3th row show out put
w = [rand();rand();1]
%set random initial weight
s_c = 1;
alpha = 0.1;
iteration_c = 1;

for iteration_c = 1:4
    for s_c = 1:4
        y = (w(1)*(s(1,s_c)))+(w(2)*(s(2,s_c)))+(w(3));
        w(1) = w(1) + (alpha.*(s(3,s_c) - y).*s(1,s_c));
        w(2) = w(2) + (alpha.*(s(3,s_c) - y).*s(2,s_c));
        w(3) = w(3) + (alpha.*(s(3,s_c) - y));
    end
end
w
for s_c = 1:4
    end_value = (w(1).*(s(1,s_c)))+(w(2).*(s(2,s_c)))+w(3)
end

خروجی هم اینه
كد:

w =

    0.9597
    0.3404
    1.0000


w =

    0.5926
    0.5525
  -0.2758


end_value =

  -1.4210


end_value =

  -0.3159


end_value =

  -0.2358


end_value =

    0.8693

که w اولی که نشون داده شده وزن اولیه است و w بعدی هم وزن بعد از آموزش
همونطوری که میبینی خروجی برای سه داده اول منفی شده یعنی صفر و برای 1 و 1 مثبت شده یعنی 1
اینم نمود گرافیکی این سلول
خط سبز وزن اولیه
خط های قرمز چهار مرحله آخر
(البته مال یک اجرای دیگه چون وزن ها تصادفی انتخاب میشن و من قسمت هار رسم شکل رو از کد حذف کردم که قابل فهم تر بشه)
http://farshadafshari68.persiangig.c...e/untitled.jpg

mahdigh ۱۰-۱۳-۱۳۹۰ ۰۷:۲۸ بعد از ظهر

یک سوالی
شما الان معیار رو منفی یا مثبت بودن خروجی گرفتید٬ ولی من کوچکتر یا بزرگتر از یک بودن٬ فکر کنم اشکال از اینجا باشه... الان وقت ندارم (فردا امتحان دارم :دی‌) بعدا اینو تست میکنم.

فقط سوالم اینه که اگه هدفم این باشه که معیار کوچک تر یا بزرگتر از یک بودن باشه٬ بخش یادگیری چه تفاوتی میکنه؟

سپاس!

mahdigh ۱۰-۱۳-۱۳۹۰ ۰۷:۳۹ بعد از ظهر

و یک درخواست دیگه
میشه برای xor هم یک نمودار مثل این بذارید؟
می دونم یاد نمیگیره. فقط می خوام ببینم این خطه چطور میشه.


زمان محلي شما با تنظيم GMT +3.5 هم اکنون ۱۲:۵۸ قبل از ظهر ميباشد.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 ©2007, Crawlability, Inc.