مقدمه
اگر حتی کمی در حوزه یادگیری عمیق (Deep Learning) یا هوش مصنوعی فعالیت کرده باشید، احتمالاً نام شبکههای عصبی کانولوشنی (Convolutional Neural Networks یا CNN) را شنیدهاید. این معماری سالهاست که یکی از قدرتمندترین روشها برای پردازش تصاویر، تشخیص اشیا و بینایی ماشین محسوب میشود و در بسیاری از پروژههای هوش مصنوعی مورد استفاده قرار میگیرد.
با وجود موفقیت فوقالعاده CNNها، این شبکهها یک ضعف مهم دارند؛ آنها معمولاً زمانی که یک شیء با زاویه، چرخش یا جهت متفاوتی نسبت به دادههای آموزشی دیده شود، عملکرد مطلوبی ندارند.
برای رفع همین محدودیت، جفری هینتون (Geoffrey E. Hinton) به همراه Sara Sabour و Nicholas Frosst معماری جدیدی را معرفی کردند که با نام Capsule Networks یا شبکههای کپسولی شناخته میشود.
در این مقاله با مفهوم شبکههای کپسولی، نحوه عملکرد آنها، تفاوتشان با CNNها و دلیل ایجاد این معماری آشنا خواهید شد.
پیشنیازها
برای درک بهتر مطالب این مقاله، بهتر است با مفاهیم زیر آشنایی اولیه داشته باشید.
۱. شبکههای عصبی (Neural Networks)
شبکههای عصبی از مجموعهای از نورونهای مصنوعی تشکیل شدهاند که در چندین لایه به یکدیگر متصل هستند. این شبکهها با فرآیندی به نام آموزش (Training)، وزنها و بایاسها را بهروزرسانی میکنند تا بتوانند الگوهای موجود در دادهها را یاد بگیرند و پیشبینی انجام دهند.
اگر با مفاهیم زیر آشنا باشید، مطالعه این مقاله برایتان سادهتر خواهد بود:
- لایه ورودی (Input Layer)
- لایههای مخفی (Hidden Layers)
- لایه خروجی (Output Layer)
- توابع فعالسازی (Activation Functions)
- توابع هزینه (Loss Functions)
- الگوریتمهای بهینهسازی مانند Gradient Descent
۲. شبکههای عصبی کانولوشنی (CNN)
شبکههای کپسولی در واقع توسعهای بر پایه CNNها هستند.
اگر بدانید لایههای زیر چه وظیفهای دارند، بهتر میتوانید دلیل ایجاد Capsule Network را درک کنید:
- Convolution Layer
- Pooling Layer
- Feature Extraction
۳. جبر خطی (Linear Algebra)
از آنجایی که Capsule Network با بردارها (Vectors) و ماتریسها (Matrices) سروکار دارد، آشنایی مقدماتی با جبر خطی به فهم روابط ریاضی مقاله کمک زیادی میکند.
شبکههای عصبی کانولوشنی و مشکل تشخیص جهت (Orientation Problem)
شبکههای CNN امروزه یکی از اصلیترین ابزارهای حوزه بینایی ماشین هستند.
کاربردهای مهم آنها شامل موارد زیر است:
- طبقهبندی تصاویر (Image Classification)
- تشخیص اشیا (Object Detection)
- تقسیمبندی تصاویر (Image Segmentation)
- تشخیص چهره
- پردازش تصاویر پزشکی
تقریباً هرجا صحبت از تحلیل تصویر باشد، احتمال زیادی وجود دارد که از CNN استفاده شده باشد.
نگاهی به تاریخچه CNN
اولین شبکه عصبی کانولوشنی توسط یان لوکان (Yann LeCun) در سال ۱۹۸۹ معرفی شد.
او با استفاده از یک شبکه پنجلایه موفق شد ارقام دستنویس موجود در دیتاست معروف MNIST را که بیش از ۶۰ هزار تصویر دارد با دقت بالایی شناسایی کند.
ایده کلی CNN بسیار ساده است:
- تصاویر به شبکه داده میشوند.
- شبکه ویژگیهای مهم تصویر را استخراج میکند.
- در نهایت تصویر را در کلاس مناسب قرار میدهد.
سالها بعد معماریهای بسیار پیشرفتهتری مانند EfficientNet-B7 معرفی شدند که روی دیتاست ImageNet توانستند به دقتی بیش از 84 درصد در طبقهبندی بیش از ۱.۲ میلیون تصویر برسند.
این پیشرفت نشان میدهد که CNNها در استخراج ویژگیهای پیچیده از تصاویر عملکرد فوقالعادهای دارند.
اما CNNها بینقص نیستند
با وجود تمام موفقیتها، این شبکهها یک مشکل اساسی دارند.
فرض کنید تصویری از یک چهره را به شبکه آموزش دادهاید.
حالا همان تصویر را:
- ۱۸۰ درجه بچرخانید.
- یا محل چشم و بینی را با یکدیگر جابهجا کنید.
رفتار CNN در این شرایط چندان ایدهآل نیست.
در بسیاری از مواقع:
- تصویر چرخیده را دیگر بهدرستی تشخیص نمیدهد.
- اما ممکن است تصویری که اجزای آن بهشکل غیرواقعی جابهجا شدهاند را همچنان یک چهره واقعی تشخیص دهد.
به عبارت دیگر، CNN بیشتر الگوهای آماری را یاد میگیرد، نه ساختار واقعی اجزای یک شیء.
یک مثال ساده
فرض کنید شبکه هزاران تصویر از سگ نژاد Pug دیده است.
اگر تصویر همان سگ را کمی بچرخانید یا زاویه دوربین تغییر کند، احتمال دارد دقت مدل کاهش پیدا کند.
اما اگر اجزای صورت سگ را به شکل غیرواقعی جابهجا کنید، ممکن است هنوز هم آن را یک سگ Pug تشخیص دهد.
این اتفاق نشان میدهد که CNNها ارتباط فضایی بین اجزای تصویر را به خوبی درک نمیکنند.
شبکههای عصبی کانولوشنی و مشکل Pooling
در بخش قبل دیدیم که CNNها در تشخیص تصاویر عملکرد فوقالعادهای دارند، اما در درک جهت، چرخش و ارتباط فضایی اجزای تصویر دچار مشکل میشوند. حالا سؤال مهم این است:
چرا چنین مشکلی به وجود میآید؟
یکی از مهمترین دلایل، استفاده از عملیاتی به نام Pooling است.
Pooling در CNN چیست؟
برای درک بهتر، ابتدا باید ساختار کلی یک شبکه CNN را بشناسیم.
یک CNN معمولاً از این بخشها تشکیل میشود:
-
لایههای کانولوشن (Convolution Layers)
-
لایههای Pooling
-
لایههای Fully Connected
لایههای کانولوشن وظیفه استخراج ویژگیهای تصویر را دارند. آنها مواردی مانند:
-
لبهها (Edges)
-
منحنیها (Curves)
-
بافت (Texture)
-
رنگها
-
الگوهای پیچیدهتر
را شناسایی میکنند.
اما بعد از استخراج این ویژگیها، معمولاً از Pooling استفاده میشود.
هدف Pooling چیست؟
Pooling برای کاهش اندازه دادهها استفاده میشود.
بهعنوان مثال، اگر یک Feature Map با اندازه 28×28 داشته باشیم، با استفاده از Max Pooling میتوان آن را به 14×14 تبدیل کرد.
مزایای این کار:
-
کاهش مصرف حافظه
-
افزایش سرعت پردازش
-
کاهش تعداد پارامترها
-
کمک به جلوگیری از Overfitting
به همین دلیل Pooling سالها یکی از اجزای اصلی CNNها بوده است.
اما مشکل Pooling چیست؟
Pooling هنگام کوچک کردن Feature Map، بخشی از اطلاعات تصویر را حذف میکند.
برای مثال در Max Pooling، از هر ناحیه فقط بزرگترین مقدار نگه داشته میشود و بقیه اطلاعات دور ریخته میشوند.
این موضوع باعث میشود شبکه:
-
بداند یک ویژگی وجود دارد
-
اما دقیقاً نداند کجا قرار دارد
به بیان ساده، CNN کمکم اطلاعات مربوط به موقعیت و جهت اجزا را از دست میدهد.
نظر جفری هینتون درباره Pooling
جفری هینتون، یکی از پیشگامان یادگیری عمیق، در یکی از سخنرانیهای خود جمله معروفی گفت:
«عملیات Pooling در شبکههای کانولوشنی یک اشتباه بزرگ است و اینکه تا این حد خوب کار میکند، خودش یک فاجعه است!»
منظور او این بود که Pooling اگرچه از نظر تجربی نتایج خوبی میدهد، اما از دیدگاه مدلسازی ساختار واقعی جهان، اطلاعات بسیار ارزشمندی را حذف میکند.
Capsule Network چگونه این مشکل را حل میکند؟
ایده اصلی هینتون این بود که شبکه باید فقط تشخیص ندهد چه چیزی وجود دارد، بلکه باید بداند:
-
کجا قرار دارد
-
چه اندازهای دارد
-
در چه جهتی قرار گرفته است
-
چقدر چرخیده است
-
چه رابطهای با سایر اجزا دارد
برای همین او مفهوم Capsule را معرفی کرد.
Capsule چیست؟
در شبکههای عصبی معمولی، هر نورون فقط یک عدد (Scalar) تولید میکند.
اما در Capsule Network، هر کپسول یک بردار (Vector) تولید میکند.
این بردار فقط وجود یک ویژگی را نشان نمیدهد، بلکه اطلاعاتی مانند:
-
موقعیت
-
جهت
-
اندازه
-
چرخش
-
تغییر شکل
را نیز در خود نگه میدارد.
یک مثال ساده
فرض کنید شبکه میخواهد یک چهره را تشخیص دهد.
کپسولهای سطح پایین ممکن است ویژگیهای زیر را تشخیص دهند:
-
چشم چپ
-
چشم راست
-
بینی
-
دهان
اگر همه این اجزا در موقعیت و جهت مناسبی نسبت به هم قرار داشته باشند، کپسول سطح بالاتر نتیجه میگیرد که یک چهره واقعی وجود دارد.
برخلاف CNN، اگر جای چشم و بینی عوض شود، Capsule Network متوجه میشود که این ساختار دیگر یک چهره طبیعی نیست.
ایده کلیدی Capsule Network
CNN:
«این ویژگیها در تصویر وجود دارند.»
Capsule Network:
«این ویژگیها وجود دارند و با این موقعیت، اندازه و جهت کنار هم قرار گرفتهاند.»
کپسولها (Capsules) چگونه کار میکنند؟
تا اینجا متوجه شدیم که تفاوت اصلی Capsule Network با CNN در این است که بهجای استفاده از نورونهای معمولی و عملیات Pooling، از کپسولها (Capsules) و الگوریتم Dynamic Routing استفاده میکند.
اما سؤال مهم اینجاست:
یک کپسول دقیقاً چگونه اطلاعات را پردازش میکند؟
کپسول چیست؟
در شبکههای عصبی معمولی، هر نورون تنها یک عدد (Scalar) تولید میکند.
برای مثال ممکن است خروجی یک نورون چنین باشد:
0.92
این مقدار فقط نشان میدهد که احتمال وجود یک ویژگی چقدر است.
اما هیچ اطلاعاتی درباره موارد زیر ارائه نمیکند:
- موقعیت ویژگی
- زاویه آن
- اندازه
- چرخش
- ارتباط آن با سایر اجزا
در مقابل، هر Capsule یک بردار (Vector) تولید میکند.
برای مثال:
[0.24, 0.78, -0.31, 0.92, ...]
این بردار تنها نشاندهنده احتمال وجود یک ویژگی نیست.
بلکه اطلاعات مهمی مانند موارد زیر را نیز در خود نگه میدارد:
- موقعیت (Position)
- اندازه (Scale)
- زاویه (Orientation)
- چرخش (Rotation)
- میزان تغییر شکل (Deformation)
به همین دلیل است که شبکههای کپسولی در درک ساختار اشیا عملکرد بسیار بهتری دارند.
تفاوت نورون معمولی و کپسول
| نورون معمولی | کپسول |
|---|---|
| خروجی یک عدد | خروجی یک بردار |
| فقط وجود ویژگی را تشخیص میدهد | ویژگی و وضعیت آن را توصیف میکند |
| اطلاعات فضایی محدود | اطلاعات فضایی کاملتر |
| ارتباط ضعیف بین اجزای تصویر | ارتباط سلسلهمراتبی بین اجزا |
مراحل پردازش اطلاعات در یک کپسول
هر کپسول برای تولید خروجی خود چهار مرحله اصلی را طی میکند.
مرحله اول: ضرب بردارهای ورودی در ماتریس وزن
در اولین مرحله، بردارهای ورودی در ماتریسهای وزن (Weight Matrices) ضرب میشوند.
برخلاف شبکههای عصبی معمولی که تنها از وزنهای عددی استفاده میکنند، در Capsule Network از ماتریس وزن استفاده میشود.
هدف این ماتریسها یادگیری رابطه فضایی بین ویژگیهای ساده و ویژگیهای پیچیدهتر است.
برای مثال فرض کنید در لایه پایینتر این ویژگیها تشخیص داده شدهاند:
- چشم چپ
- چشم راست
- بینی
- دهان
هر کدام از این ویژگیها یک بردار تولید میکنند.
سپس این بردارها توسط ماتریسهای وزن تبدیل میشوند تا مشخص شود اگر این اجزا در کنار هم قرار بگیرند، آیا احتمال تشکیل یک «چهره» وجود دارد یا خیر.
به این فرآیند Affine Transformation گفته میشود.
Affine Transformation چیست؟
Affine Transformation نوعی تبدیل ریاضی است که روابط هندسی بین اجزای تصویر را حفظ میکند.
به کمک این تبدیل، شبکه میتواند یاد بگیرد:
- اگر بینی پایینتر از چشمها باشد
- و دهان پایینتر از بینی قرار گرفته باشد
- و فاصله اجزا منطقی باشد
احتمالاً این اجزا متعلق به یک چهره هستند.
در نتیجه شبکه فقط وجود اجزا را بررسی نمیکند، بلکه نحوه قرار گرفتن آنها نسبت به یکدیگر را نیز در نظر میگیرد.
مرحله دوم: اعمال وزنها (Routing Weights)
پس از انجام تبدیل اولیه، خروجیها باید مشخص کنند به کدام کپسول در لایه بالاتر ارسال شوند.
در شبکههای عصبی معمولی این کار توسط وزنهایی انجام میشود که با Backpropagation آموزش میبینند.
اما در Capsule Network شرایط متفاوت است.
اینجا الگوریتم Dynamic Routing تصمیم میگیرد هر خروجی به کدام کپسول ارسال شود.
Dynamic Routing چگونه تصمیم میگیرد؟
ایده بسیار ساده است.
اگر چند کپسول پایینتر پیشبینیهای مشابهی داشته باشند، یعنی همگی وجود یک شیء خاص را تأیید کنند، آنوقت کپسول مربوط به همان شیء در لایه بالاتر وزن بیشتری دریافت میکند.
برای مثال:
فرض کنید سه کپسول این نتایج را تولید کردهاند:
- چشم
- بینی
- دهان
اگر هر سه نشان دهند که این اجزا در موقعیت مناسب قرار دارند، کپسول «چهره» بیشترین وزن را دریافت خواهد کرد.
اما اگر یکی از آنها موقعیت متفاوتی پیشبینی کند، تأثیر آن کمتر خواهد شد.
به همین دلیل به این فرآیند Dynamic Routing گفته میشود؛ زیرا مسیر انتقال اطلاعات در هر بار پردازش، بهصورت پویا تعیین میشود.
مرحله سوم: محاسبه مجموع وزندار
بعد از تعیین وزنها، تمام بردارهای ورودی با توجه به وزنشان با یکدیگر جمع میشوند.
به بیان ساده:
بردارهایی که اهمیت بیشتری دارند، سهم بیشتری در خروجی نهایی خواهند داشت.
نتیجه این مرحله یک بردار جدید است که خلاصهای از تمام اطلاعات دریافتی را در اختیار کپسول قرار میدهد.
مرحله چهارم: اعمال تابع Squash
اگر خروجی همینجا متوقف شود، طول بردارها ممکن است بسیار بزرگ شود.
برای جلوگیری از این مشکل، از تابعی به نام Squash Function استفاده میشود.
این تابع دو ویژگی مهم دارد:
- طول بردار را بین صفر و یک نگه میدارد.
- جهت بردار را حفظ میکند.
این موضوع اهمیت زیادی دارد.
در Capsule Network:
- طول بردار نشاندهنده احتمال وجود ویژگی است.
- جهت بردار مشخصکننده ویژگیهای فضایی آن شیء است.
اگر احتمال وجود شیء زیاد باشد، طول بردار به عددی نزدیک به ۱ میرسد.
اگر احتمال کم باشد، طول بردار به صفر نزدیک میشود.
در عین حال اطلاعات مربوط به موقعیت و زاویه شیء همچنان حفظ خواهد شد.
چرا Squash بهجای ReLU استفاده میشود؟
در شبکههای عصبی معمولی معمولاً از توابع فعالسازی مانند:
- ReLU
- Sigmoid
- Tanh
استفاده میشود.
اما این توابع برای خروجیهای اسکالر طراحی شدهاند.
از آنجایی که خروجی Capsule یک بردار است، باید تابعی استفاده شود که روی کل بردار عمل کند، نه فقط روی یک عدد.
به همین دلیل تابع Squash معرفی شد.
نتیجه نهایی عملکرد یک کپسول
در پایان این چهار مرحله، هر کپسول برداری تولید میکند که هم احتمال وجود یک ویژگی را نشان میدهد و هم اطلاعات فضایی آن ویژگی را در خود نگه میدارد.
به همین دلیل شبکههای کپسولی میتوانند روابط بین اجزای تصویر را بسیار دقیقتر از CNNهای معمولی یاد بگیرند.
الگوریتم Dynamic Routing چگونه کار میکند؟
تا اینجا دیدیم که هر کپسول یک بردار تولید میکند و این بردار اطلاعات بسیار بیشتری نسبت به خروجی یک نورون معمولی در اختیار شبکه قرار میدهد.
اما هنوز یک سؤال مهم باقی مانده است:
اگر یک کپسول چندین کپسول در لایه بعدی را پیش روی خود داشته باشد، چگونه تصمیم میگیرد خروجی خود را به کدامیک ارسال کند؟
پاسخ این سؤال در الگوریتم Dynamic Routing Between Capsules نهفته است؛ مهمترین نوآوری شبکههای کپسولی.
چرا به Dynamic Routing نیاز داریم؟
در شبکههای عصبی کانولوشنی، تقریباً مسیر حرکت اطلاعات از قبل مشخص است.
اما در Capsule Network این مسیر ثابت نیست.
هر کپسول باید بررسی کند:
«کدام کپسول در لایه بعدی بیشترین شباهت را به پیشبینی من دارد؟»
به همین دلیل مسیر انتقال اطلاعات در هر بار پردازش تصویر میتواند متفاوت باشد.
ایده اصلی Dynamic Routing
فرض کنید در لایه پایین شبکه چهار کپسول وجود دارند که ویژگیهای زیر را تشخیص دادهاند:
- چشم چپ
- چشم راست
- بینی
- دهان
اکنون این چهار کپسول باید تصمیم بگیرند خروجی خود را برای کدام کپسول ارسال کنند.
ممکن است در لایه بعد سه کپسول وجود داشته باشد:
- چهره
- سگ
- گربه
اگر خروجی چهار کپسول اول با ویژگیهای یک چهره سازگار باشد، تقریباً تمام اطلاعات به کپسول «چهره» ارسال میشود.
اما اگر اجزا بیشتر شبیه صورت یک حیوان باشند، مسیر انتقال اطلاعات تغییر خواهد کرد.
به همین دلیل این الگوریتم را Dynamic یا «پویا» مینامند.
مراحل اجرای Dynamic Routing
الگوریتم Routing چند بار بین دو لایه اجرا میشود تا بهترین ارتباط بین کپسولها پیدا شود.
به طور کلی مراحل آن به شکل زیر است.
مرحله اول: مقداردهی اولیه وزنها
در ابتدای کار، هیچ کپسولی نمیداند باید به کدام کپسول سطح بالاتر متصل شود.
بنابراین تمام وزنهای ارتباطی مقدار یکسانی دارند.
در این مرحله همه کپسولهای مقصد تقریباً احتمال برابری برای دریافت اطلاعات دارند.
مرحله دوم: محاسبه احتمال اتصال
در ادامه روی وزنها تابع Softmax اعمال میشود.
هدف Softmax این است که:
- تمام وزنها مثبت شوند.
- مجموع آنها برابر با ۱ باشد.
در نتیجه هر وزن را میتوان بهعنوان احتمال ارسال اطلاعات در نظر گرفت.
برای مثال:
| کپسول مقصد | احتمال دریافت اطلاعات |
|---|---|
| چهره | 0.82 |
| سگ | 0.12 |
| گربه | 0.06 |
مشخص است که بیشترین احتمال مربوط به کپسول «چهره» است.
مرحله سوم: محاسبه مجموع وزندار
اکنون خروجی تمام کپسولهای پایین با توجه به همین وزنها با یکدیگر ترکیب میشوند.
به بیان ساده:
کپسولهایی که توافق بیشتری با یکدیگر دارند، تأثیر بیشتری روی خروجی خواهند گذاشت.
مرحله چهارم: اعمال تابع Squash
بردار حاصل دوباره توسط تابع Squash نرمالسازی میشود.
در این مرحله:
- طول بردار احتمال وجود شیء را مشخص میکند.
- جهت بردار اطلاعات فضایی شیء را حفظ میکند.
مرحله پنجم: بررسی میزان توافق (Agreement)
حالا شبکه بررسی میکند:
آیا پیشبینی کپسولهای پایین با خروجی کپسول مقصد همخوانی دارد یا خیر؟
اگر پاسخ مثبت باشد،
وزن اتصال بین آنها افزایش پیدا میکند.
اگر خیر،
وزن کاهش مییابد.
این همان چیزی است که هینتون آن را Agreement یا «توافق بین کپسولها» مینامد.
مرحله ششم: تکرار فرآیند
این مراحل چندین بار (معمولاً ۳ بار) تکرار میشوند.
در هر تکرار:
- ارتباطهای درست قویتر میشوند.
- ارتباطهای نادرست ضعیفتر میشوند.
در پایان، هر کپسول تقریباً فقط اطلاعات خود را به مناسبترین کپسول در لایه بالاتر ارسال میکند.
چرا Dynamic Routing از Pooling بهتر است؟
در Max Pooling بخش زیادی از اطلاعات حذف میشود.
اما در Dynamic Routing هیچ اطلاعات مهمی دور ریخته نمیشود.
بلکه شبکه تصمیم میگیرد:
«این اطلاعات برای کدام شیء مفیدتر هستند؟»
به همین دلیل روابط بین اجزای تصویر حفظ میشوند.
یک مثال ساده
فرض کنید تصویر زیر را داریم:
- دو چشم
- یک بینی
- یک دهان
اگر این اجزا در جای درست قرار گرفته باشند:
تمام کپسولها روی وجود یک «چهره» توافق میکنند.
در نتیجه تقریباً تمام اطلاعات به کپسول Face ارسال میشود.
اما اگر بینی کنار گوش قرار گرفته باشد یا دهان بالای چشمها باشد،
میزان توافق کاهش پیدا میکند.
در نتیجه کپسول Face فعال نخواهد شد.
این دقیقاً همان قابلیتی است که CNNهای معمولی در آن ضعف دارند.
مزیت اصلی Dynamic Routing
به کمک این الگوریتم، شبکه دیگر فقط وجود اجزا را بررسی نمیکند.
بلکه روابط بین آنها را نیز یاد میگیرد.
برای مثال:
- آیا بینی بین دو چشم قرار گرفته است؟
- آیا دهان زیر بینی است؟
- آیا اندازه اجزا با یکدیگر سازگار است؟
- آیا زاویه قرارگیری آنها منطقی است؟
تمام این اطلاعات در فرآیند Routing لحاظ میشوند.
چرا این روش شبیه مغز انسان است؟
هینتون اعتقاد داشت مغز انسان نیز دقیقاً به همین شکل عمل میکند.
وقتی به یک چهره نگاه میکنیم، صرفاً وجود چشم یا بینی را تشخیص نمیدهیم.
بلکه رابطه بین تمام اجزای صورت را بررسی میکنیم.
شبکههای کپسولی نیز تلاش میکنند همین فرآیند را شبیهسازی کنند و به همین دلیل در تشخیص تصاویر با چرخش، تغییر زاویه یا تغییر مقیاس عملکرد بهتری نسبت به CNNهای کلاسیک دارند.
معماری کامل Capsule Network (CapsNet)
اکنون که با مفهوم کپسولها و الگوریتم Dynamic Routing آشنا شدیم، وقت آن رسیده است که ساختار کامل یک Capsule Network را بررسی کنیم.
در مقاله اصلی هینتون و همکارانش، معماری CapsNet از دو بخش اصلی تشکیل شده است:
- Encoder
- Decoder
هر کدام از این دو بخش وظیفه متفاوتی بر عهده دارند.
نمای کلی معماری CapsNet
به طور خلاصه، جریان پردازش تصویر در شبکه به این صورت است:
تصویر ورودی
│
▼
Convolution Layer
│
▼
PrimaryCaps
│
Dynamic Routing
│
▼
DigitCaps
│
▼
طبقهبندی تصویر
│
▼
Decoder
│
▼
بازسازی تصویر
قسمت بالایی شبکه مسئول تشخیص تصویر است.
قسمت پایینی نیز بررسی میکند که آیا شبکه واقعاً تصویر را درک کرده است یا خیر.
بخش اول: Encoder
Encoder مسئول استخراج ویژگیها و تشخیص کلاس تصویر است.
این بخش از سه لایه تشکیل شده است:
- Convolution Layer
- PrimaryCaps Layer
- DigitCaps Layer
لایه اول: Convolution Layer
در اولین مرحله، تصویر وارد یک لایه کانولوشن معمولی میشود.
این لایه تقریباً همان کاری را انجام میدهد که در CNNها انجام میشود.
وظیفه آن استخراج ویژگیهای اولیه تصویر است.
برای مثال:
- لبهها
- خطوط
- منحنیها
- بافت
- رنگ
در مقاله اصلی CapsNet این لایه دارای مشخصات زیر است:
- 256 فیلتر
- اندازه Kernel برابر 9×9
- Stride برابر 1
- تابع فعالسازی ReLU
این لایه تنها ویژگیهای اولیه را استخراج میکند.
خروجی Convolution
فرض کنید تصویر ورودی یک تصویر 28×28 از دیتاست MNIST باشد.
پس از عبور از لایه Convolution، شبکه نقشهای از ویژگیهای تصویر تولید میکند.
این خروجی هنوز یک Capsule نیست.
بلکه تنها مجموعهای از ویژگیهای استخراجشده است.
لایه دوم: PrimaryCaps
اینجا اولین تفاوت جدی بین CNN و Capsule Network آغاز میشود.
در این مرحله، خروجی Convolution به مجموعهای از کپسولها تبدیل میشود.
به همین دلیل این لایه را PrimaryCaps مینامند.
PrimaryCaps چه کاری انجام میدهد؟
هر کپسول در این لایه تلاش میکند ویژگیهای ساده تصویر را به صورت برداری نمایش دهد.
به جای اینکه فقط بگوید:
«لبه وجود دارد»
خواهد گفت:
«این لبه در این موقعیت، با این زاویه و این اندازه قرار گرفته است.»
در مقاله اصلی:
PrimaryCaps شامل:
- 32 کانال کپسول
است.
هر کپسول نیز یک بردار 8 بعدی تولید میکند.
بنابراین خروجی این لایه دیگر یک ماتریس ساده نیست.
بلکه مجموعهای از بردارها است.
چرا خروجی برداری اهمیت دارد؟
فرض کنید شبکه یک چشم را تشخیص داده است.
در CNN معمولی:
Eye = 0.94
اما در Capsule Network:
Eye =
[
وجود ویژگی
موقعیت
زاویه
اندازه
چرخش
...
]
در نتیجه اطلاعات بسیار بیشتری حفظ میشود.
Inverse Graphics
هینتون درباره PrimaryCaps از اصطلاحی به نام Inverse Graphics استفاده میکند.
منظور او چیست؟
وقتی یک تصویر ساخته میشود، عوامل مختلفی روی آن اثر میگذارند:
- زاویه دوربین
- نور
- فاصله
- اندازه
- چرخش
PrimaryCaps تلاش میکند برعکس این فرآیند را انجام دهد.
یعنی از روی تصویر حدس بزند:
- شیء کجاست؟
- چقدر چرخیده؟
- اندازه آن چیست؟
- زاویه آن چگونه است؟
به همین دلیل این فرآیند را Reverse Graphics یا Inverse Graphics مینامند.
لایه سوم: DigitCaps
بعد از اینکه ویژگیهای اولیه استخراج شدند،
تمام آنها وارد مهمترین بخش شبکه میشوند:
DigitCaps
در این لایه، هر کپسول نماینده یک کلاس است.
برای مثال در دیتاست MNIST که شامل ارقام صفر تا نه است:
DigitCaps شامل 10 کپسول خواهد بود.
هر کپسول مسئول یک عدد است.
مثلاً:
- Capsule 0
- Capsule 1
- Capsule 2
- …
- Capsule 9
خروجی DigitCaps
هر کپسول یک بردار 16 بعدی تولید میکند.
طول این بردار احتمال وجود آن کلاس را مشخص میکند.
برای مثال:
| کلاس | طول بردار |
|---|---|
| 0 | 0.01 |
| 1 | 0.04 |
| 2 | 0.98 |
| 3 | 0.03 |
در این مثال، شبکه تشخیص داده است که تصویر مربوط به عدد ۲ است.
Dynamic Routing بین PrimaryCaps و DigitCaps
بین این دو لایه همان الگوریتم Dynamic Routing اجرا میشود.
PrimaryCaps بررسی میکند:
«کدام DigitCaps بیشترین شباهت را به خروجی من دارد؟»
سپس اطلاعات خود را به همان کپسول ارسال میکند.
در نتیجه:
ویژگیهایی که متعلق به یک کلاس هستند، بهصورت خودکار کنار هم جمع میشوند.
چرا DigitCaps بردار 16 بعدی تولید میکند؟
این بردار تنها احتمال وجود عدد را مشخص نمیکند.
بلکه ویژگیهایی مانند:
- ضخامت خطوط
- میزان چرخش
- اندازه
- موقعیت
- تغییر شکل
را نیز در خود نگه میدارد.
به همین دلیل حتی اگر تصویر کمی بچرخد، شبکه همچنان قادر به تشخیص صحیح خواهد بود.
خلاصه عملکرد Encoder
به طور خلاصه، Encoder این مراحل را طی میکند:
- استخراج ویژگیهای اولیه توسط Convolution
- تبدیل ویژگیها به بردارهای کپسولی در PrimaryCaps
- ارسال اطلاعات با Dynamic Routing
- تشخیص کلاس تصویر در DigitCaps
Decoder Network در Capsule Network چگونه کار میکند؟
تا اینجا دیدیم که Encoder موفق شد کلاس تصویر را تشخیص دهد.
اما یکی از جالبترین بخشهای مقاله هینتون از همین نقطه آغاز میشود.
برخلاف اکثر شبکههای عصبی، Capsule Network بعد از تشخیص تصویر کارش تمام نمیشود.
بلکه تلاش میکند همان تصویر را دوباره از روی اطلاعاتی که یاد گرفته است بازسازی کند.
این دقیقاً وظیفه Decoder Network است.
چرا تصویر دوباره بازسازی میشود؟
شاید اولین سؤال این باشد:
وقتی شبکه تصویر را تشخیص داده، چرا باید دوباره آن را بسازد؟
دلیل این کار بسیار مهم است.
اگر شبکه واقعاً ساختار یک شیء را درک کرده باشد، باید بتواند دوباره آن را تولید کند.
در واقع بازسازی تصویر نوعی آزمون برای سنجش کیفیت یادگیری شبکه است.
اگر بازسازی دقیق باشد، یعنی شبکه ویژگیهای تصویر را بهدرستی یاد گرفته است.
Decoder چگونه کار میکند؟
پس از پایان مرحله DigitCaps، فقط خروجی کپسولی که بیشترین احتمال را دارد وارد Decoder میشود.
برای مثال فرض کنید تصویر مربوط به عدد ۷ باشد.
خروجی DigitCaps ممکن است به شکل زیر باشد:
| کلاس | احتمال |
|---|---|
| 0 | 0.01 |
| 1 | 0.02 |
| 2 | 0.03 |
| 3 | 0.01 |
| 4 | 0.04 |
| 5 | 0.01 |
| 6 | 0.02 |
| 7 | 0.98 |
| 8 | 0.01 |
| 9 | 0.02 |
در این حالت تنها کپسول مربوط به عدد ۷ وارد Decoder خواهد شد.
تمام کپسولهای دیگر نادیده گرفته میشوند.
معماری Decoder
Decoder بسیار سادهتر از Encoder است.
در مقاله اصلی از سه لایه Fully Connected استفاده شده است.
ساختار آن به شکل زیر است:
DigitCaps
│
▼
Fully Connected (512)
│
▼
Fully Connected (1024)
│
▼
Fully Connected (784)
لایه اول
اولین لایه شامل:
512 نورون
است.
این لایه اطلاعات بردار 16 بعدی DigitCaps را دریافت کرده و آن را گسترش میدهد.
لایه دوم
لایه دوم دارای:
1024 نورون
است.
در این مرحله شبکه جزئیات بیشتری از تصویر را بازسازی میکند.
لایه سوم
خروجی نهایی Decoder دارای:
784 نورون
است.
چرا 784؟
زیرا در دیتاست MNIST اندازه تصاویر برابر است با:
28 × 28 = 784
بنابراین هر نورون متناظر با یک پیکسل تصویر خواهد بود.
در نهایت شبکه یک تصویر 28×28 تولید میکند.
هدف Decoder چیست؟
هدف Decoder تولید زیباترین تصویر نیست.
هدف این است که تصویر بازسازیشده تا حد ممکن شبیه تصویر اصلی باشد.
هرچه این شباهت بیشتر باشد، یعنی شبکه اطلاعات بیشتری درباره شیء ذخیره کرده است.
Reconstruction Loss
برای اندازهگیری کیفیت بازسازی از معیاری به نام Reconstruction Loss استفاده میشود.
این معیار اختلاف بین تصویر اصلی و تصویر بازسازیشده را اندازهگیری میکند.
اگر دو تصویر تقریباً یکسان باشند،
مقدار خطا بسیار کوچک خواهد بود.
اگر تفاوت زیادی داشته باشند،
خطا افزایش پیدا میکند.
چگونه خطا محاسبه میشود؟
در مقاله اصلی از فاصله اقلیدسی (Euclidean Distance) یا همان Mean Squared Error (MSE) برای مقایسه دو تصویر استفاده شده است.
به بیان ساده:
تصویر اصلی
│
▼
مقایسه
▲
│
تصویر بازسازیشده
هرچه اختلاف پیکسلها کمتر باشد،
Loss نیز کمتر خواهد بود.
Reconstruction Loss چه فایدهای دارد؟
این بخش یکی از مهمترین دلایل موفقیت Capsule Network است.
اگر فقط از خطای طبقهبندی استفاده شود،
شبکه ممکن است صرفاً الگوهای آماری را حفظ کند.
اما وقتی مجبور باشد تصویر را نیز بازسازی کند،
ناچار است واقعاً ساختار شیء را یاد بگیرد.
به همین دلیل Capsule Network نسبت به CNNها نمایش غنیتری از اشیا یاد میگیرد.
ترکیب دو تابع خطا
در آموزش شبکه، دو نوع خطا به طور همزمان محاسبه میشود:
- Margin Loss برای تشخیص صحیح کلاس تصویر
- Reconstruction Loss برای بازسازی تصویر
در نهایت مجموع این دو مقدار به عنوان خطای نهایی شبکه در نظر گرفته میشود.
به این ترتیب مدل هم در تشخیص تصویر دقیقتر میشود و هم نمایش داخلی بهتری از ویژگیهای آن یاد میگیرد.
مزیت استفاده از Decoder
وجود Decoder باعث میشود شبکه:
- روابط بین اجزای تصویر را بهتر یاد بگیرد.
- اطلاعات فضایی را حفظ کند.
- در برابر چرخش و تغییر زاویه مقاومتر باشد.
- کمتر دچار بیشبرازش (Overfitting) شود.
- ویژگیهای واقعی تصویر را بهجای حفظ کردن دادهها بیاموزد.
چرا در زمان پیشبینی از Decoder استفاده نمیشود؟
نکته جالب این است که Decoder معمولاً فقط هنگام آموزش (Training) استفاده میشود.
پس از پایان آموزش، برای پیشبینی کلاس تصویر تنها بخش Encoder کافی است.
بنابراین وجود Decoder باعث افزایش دقت آموزش میشود، اما در زمان استفاده از مدل، هزینه محاسباتی اضافی ایجاد نمیکند.
نظرات کاربران