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


ترجمه: پرهام ايزدپناه
ماهنامه شبکه

اشاره :

شايد اين سؤال ساده و ابتدايي به نظر برسد، اما واقعاً يك شبكه عصبي چيست؟ يك حدس كلي در اين‌باره آن است كه يك شبكه عصبي به طور سنتي شبيه يك مغز كامپيوتري مينياتوري تصور مي‌شود كه شامل سلول‌هاي مستقلي است كه مي‌توانند با يكديگر ارتباط داشته باشند تا بتوانند يك مسئله بزرگ‌تر را حل كنند. با اين حال از منظر كدنويسي، چگونه مي‌توان برنامه‌اي نوشت كه به اندازه‌اي عمومي و جامع باشد كه بتواند با مجموعه‌اي از اجزاي كوچك و منفرد يا نورون‌ها، هر مسئله‌اي را كه به آن واگذار مي‌كنيد، حل كند؟ در واقع آنچه در عمل اتفاق مي‌افتد آن است كه شما دو نوع شبكه خواهيد داشت: شبكه‌هايي كه تلا‌ش مي‌كنند از نظر بيولوژيكي دقيق باشند و از نورون‌ها يا گره‌هاي مغز تقليد كنند و شبكه‌هايي كه روي يك وظيفه خاص متمركزند. شبكه‌هاي عصبي در حالتي متعادل داراي هر دو خصلت صحت بيولوژيكي و كاربردي بودن، هستند. بديهي است ايده‌آل‌ترين حالت، داشتن شبكه‌اي است كه به طور كامل كاركرد مغز را مدل‌سازي مي‌كند. در مقاله پيش‌رو (برگرفته از سايتcodeproject.com) ضمن اشاره به ويژگي‌هاي يك شبكه عصبي با ساختار يك نمونه ساده از اين شبكه‌ها آشنا مي‌شويم.


‌‌ويژگي‌هاي يك شبكه‌عصبي‌
Robert Callan در كتاب <ماهيت شبكه‌‌هاي عصبي> مجموعه‌اي از ويژگي‌هاي يك شبكه عصبي را معرفي كرده است كه در ادامه بررسي مي‌شوند.

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

براي هدف ما با توجه به كدهاي ضميمه، در اينجا يك نورون مجموعه‌اي از گره‌ها در ساده‌ترين شكل خود است. يعني مجموعه‌اي شامل چهارگره: دو گره براي ورودي، يك گره bias و يك گره شبكه كه مثال در مورد بررسي نورون شامل يك گره Adaline است.


الگويي براي اتصال
اين همان راهي است كه شبكه ساخته شده و داده‌ها در آن جريان مي‌يابد. به عنوان مثال، يك شبكه از نوع (1) Adaline (سرنام Adaptive Linear Neuron) شامل دو گره ورودي، يك گره bias و يك گره Adaline است. گره Adaline همان گرهي است كه فراخواني توابع اجرايي و يادگيري را برعهده دارد. هيچ محدوديت مشخصي براي تعداد گره‌هايي كه مي‌توانيد در هر نورون داشته باشيد و نيز در نحوه جاري شدن داده‌ها وجود ندارد. داده‌ در ابتدا در گره‌هاي ورودي قرار دارد، اما با بزرگ شدن شبكه مي‌تواند براي پردازش وارد گره‌هاي ديگر شود.


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


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


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

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


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

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

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

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

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

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

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

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


















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

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

پي‌نوشت:
1 - شبكه‌هاي نوع ADALINE شبكه‌هاي عصبي تك لا‌يه‌اي هستند كه در سال 1960 توسط پروفسور Bernard Widrow و يكي از دانشجويانش به نام Ted Hoff توسعه داده شدند. اين شبكه‌هاي تك لا‌يه شامل چند گره هستند كه هر گره مي‌تواند چند ورودي را پذيرفته و يك خروجي توليد كند. به عنوان مثال يك شبكه Adaline با دو ورودي به شكل زير است:

ماتريس وزن W در اين مثال داراي يك سطر است. به اين ترتيب خروجي شبكه به صورت زير است:
يا: