شبکه عصبی – 11

9 05 2009

چگونگي يادگيري شبكه:
پاسخ اين سؤال، آزمون و خطاست. اما اين كار به اين سادگي‌ها هم نيست. به عنوان نمونه، بخشي از خروجي يك شبكه عصبي فرضي ساده از نوع Adaline به شكل كد زیر است.

همانطور كه در اين مثال مي‌بينيد، اين شبكه قبل از رسيدن به پاسخ صحيح، 190 (به خط بالا در شکل بالا توجه کنید) بار تلاش كرده ‌است. اساسا برنامه Adaline دو مقدار را كه هركدام بين 1- و 1 هستند، مقايسه مي‌كند. اين مقادير به صورت تصادفي توليد و در يك فايل ذخيره مي‌شوند. كاري كه اين برنامه انجام مي‌دهد اين است كه اگر اولين عدد داده شده به آن كمتر از عدد دوم باشد، آن‌گاه خروجي آن 1 و در غير اينصورت 1- خواهد بود. به بيان فني، اين شبكه، ورودي‌ها و وزن‌هاي مربوط به هر يك از گره‌هاي شبكه (Nodes) را جمع مي‌كند.

سپس حاصل‌ جمع را از طريق تابع انتقال (Transfer Function) به عنوان خروجي گره، برمي‌گرداند. داده‌‌‌هايي نيز كه براي آموزش شبكه به آن داده مي‌شوند، پاسخ‌هاي صحيح براي مسئله توليد مي‌كنند و شبكه خودش را مي‌آزمايد تا ببيند آيا به جواب صحيح رسيده‌است يا خير.

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

اين كد مرتبا روي پيوندهاي مربوط به يك گره تكرار مي‌شود، مقدار ورودي وزن‌دار را مي‌گيرد و حاصل جمع نهايي را به متغيري از نوع double به نام total اضافه مي‌‌كند. در اين مرحله، آنچه كه بايد بدانيد اين است كه مقدار nID با ثابت nodevalue كه در كلاس Values ذخيره شده برابر است و اين متغير، اولين مقدار در گره ورودي را (كه در اينجا با آرايه InputLinks و شاخص  i ا رجاع داده شده است) مي‌گيرد(شکل زیر)

بخش مهم مقدار ورودي وزن‌دار به شكل كد بالا است، كه به معني حاصلضرب مقدار گره در مقدار وزن پيوند است. مقدار وزن پيوند نيز در واقع اولين مقدار در پيوند است كه به صورت كد شکل زیر در تابع Constructor كلاس Adaline Link مقداردهي اوليه شده است.

اين مقدار يك عدد تصادفي بين 1- و 1 است. اين بدين‌معناست كه اولين فعاليت شبكه براي رسيدن به پاسخ صحيح، چيزي بيش از يك حدس نيست. البته همان‌طور كه در چرخه بالا‌ مي‌بينيد، تابع اجرا چرخه دستورات را تكرار مي‌كند و از مقدار وزن براي محاسبات استفاده مي‌كند و مجموع حاصل را به dTotal اضافه مي‌كند. متغير dTotal سپس از تابع انتقال Transfer Function عبور مي‌كند كه اين تابع نيز شامل كدهاي ساده‌اي است. (با توجه به شکل زیر)

در صورتي كه مقدار dTotal كوچك‌تر از صفر باشد، خروجي آن 1- و در صورتي كه اين مقدار بزرگ‌تر از صفر باشد، خروجي آن 1 خواهد بود. بنابراين فرض كنيد كه در dTotal مقداري داريم و براساس مجموعه آموزش‌ها پاسخ 1- است، اما شبكه 1 را بازمي‌گرداند. پاسخ غلط است و برنامه يكي از خطوط نشان داده‌شده در كد شکل 9‌ را چاپ مي‌كند كه مي‌گويد تاكنون يك عدد معين را مي‌گرفته است، اما اكنون بايد تابع آموزش را فراخواني كند؛ چراكه اين مورد اخير اشتباه از آب در آمده است.

تابع Learn از قواعد دلتا يا Widrow-Hoff استفاده مي‌كند كه از نظر برنامه‌نويسي به صورت كد شکل زیر است. در اين قسمت از كد، ابتدا مقدار خطاي گره مساوي حاصلضرب مقدار گره در عدد 0.2- قرارداده مي‌شود.

كد سپس روي همه پيوندهاي ورودي گره فعلي مي‌چرخد و مقدار وزن هر پيوند را مساوي مقدار dDelta قرار مي‌دهد كه خود حاصل نرخ يادگيري مقادير گره‌ها است و در هنگام تشكيل گره Adaline مساوي 45.0 قرارداده شده بود. البته شما در تعيين اين مقدار اوليه مختار هستيد. مي‌توانيد آن را تغيير دهيد تا ببينيد چه تاثيري روي نرخ يادگيري برنامه مي‌گذارد. به هرحال اگر به حاصلضرب فوق برگرديم، مي‌بينيم كه نرخ يادگيري گره در مقدار ورودي پيوندها ضرب شده است و حاصلضرب نيز در مقدار خطاي گره كه در ابتداي كد مقداردهي شده بود ضرب شده است.(این یک مورد از شبکه عصبی ساده بود)

(ادامه دارد)





شبکه عصبی – 9

9 05 2009

ساختار يك شبكه عصبي ساده:

مجموعه‌اي از واحدهاي پردازشي ساده
يك شبكه عصبي از نرون‌ها يا گره‌ها ساخته مي‌شود. اين اجزا در واقع واحدهاي پردازش ساده‌اي محسوب مي‌شوند، اما در صورتي كه قابليت‌هاي نهفته بعضي از آن‌ها را ببينيد، مي‌توانيد بپرسيد <ساده براي چه كسي؟> اساساً گره‌ها از ديد يك برنامه‌‌نويس يك كلا‌س محسوب مي‌شوند كه وظيفه انجام كار يا هدف خاصي را برعهده دارند. مانند هر كلا‌سي در برنامه‌نويسي، وظيفه يا هدف براساس آنچه شما تعيين مي‌كنيد و از طريق كدها تعريف مي‌شود.

الگويي براي اتصال
اين همان راهي است كه شبكه ساخته شده و داده‌ها در آن جريان مي‌يابد. به عنوان مثال، يك شبكه از نوع Adaline (سرنام Adaptive Linear Neuron:شبكه‌هاي نوع ADALINE شبكه‌هاي عصبي تك لا‌يه‌اي هستند كه در سال 1960 توسط پروفسور Bernard Widrow و يكي از دانشجويانش به نام Ted Hoff توسعه داده شدند. اين شبكه‌هاي تك لا‌يه شامل چند گره هستند كه هر گره مي‌تواند چند ورودي را پذيرفته و يك خروجي توليد كند.) شامل دو گره ورودي، يك گره bias و يك گره Adaline است. گره Adaline  همان گرهي است كه فراخواني توابع اجرايي و يادگيري را برعهده دارد. هيچ محدوديت مشخصي براي تعداد گره‌هايي كه مي‌توانيد در هر نرون داشته باشيد و نيز در نحوه جاري شدن داده‌ها وجود ندارد. داده‌ در ابتدا در گره‌هاي ورودي قرار دارد، اما با بزرگ شدن شبكه مي‌تواند براي پردازش وارد گره‌هاي ديگر شود.

قاعده‌اي براي انتشار سيگنال‌ها در شبكه‌
اين صرفاً عرف (Common sence) محسوب مي‌شود. شبكه مورد نظر از هر نوعي كه باشد، نتايج مشخصي وجود دارد كه مي‌خواهيم به آن‌ها دست پيدا كنيم. اين دستيابي از طريق پردازش‌داده‌ها در شبكه‌اي كه با آن سروكار دارد، به روشي خاص امكانپذير است. اين روش مي‌تواند انتقال داده به گره خروجي يا بازگرداندن يا گاهي جلو راندن آن در شبكه به منظور پردازش بيشتر باشد. در هر حال، همچون هر برنامه كامپيوتري ديگر، گام‌هاي مشخصي وجود دارند كه بايد پيموده شوند و معمولا‌ً يكي از دو روش مذكور در نهايت منجر به كسب نتيجه صحيح مي‌گردد.

قواعدي براي تركيب سيگنال‌هاي ورودي‌
اين اساساً همان كاري است كه قصد داريم روي داده‌هاي وارد شده به شبكه عصبي انجام دهيم. در اين لحظه اين‌كه پاسخ چه خواهد بود، براي ما اهميت چنداني ندارد. در اينجا فقط مي‌دانيم در وهله نخست با اطلا‌عات چه كاري مي‌خواهيم انجام دهيم. اين كار مي‌تواند يك عمليات رياضي يا مقايسه رشته‌اي از اشيا باشد.

قاعده‌اي براي تجميع يك سيگنال خروجي‌
اين خروجي لزوماً خروجي نهايي برنامه نيست، بلكه خروجي بخش خاصي از كدها است. اگر به اين خروجي از ديد تابع نگاه كنيم، مقدار خروجي يك گره شبكه در واقع مقدار بازگشت تابع است. اين خروجي معمولا‌ً يك مقدار عددي است. اما همواره هم اين طور نيست. مثلا‌ً شبكه Adaline مي‌تواند به راحتي گزينه درست يا غلط را بازگرداند كه به خودي خود ممكن است تناسبي با عملكرد صحيح يا غلط گره نداشته باشد.

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

(ادامه دارد)