ایده شبکه های کپسولی جفری هینتون | بخش نهایی:‌ معماری CapsNet

مقدمه

در این بخش، مروری بر جزئیات معماری شبکه های کپسولی خواهیم داشت. همچنین تلاش خواهیم کرد که تعداد پارامترهای محاسبه شده طی فرآیند آموزش CapsNet را برآورد کنیم. عدد نهایی ای که ما به دست آوردیم معادل ۸.۲ میلیون پارامتر قابل آموزش است که با ۱۱.۳۶ میلیون پارامتر اعلام شده در مقاله علمی منتشر شده از سوی توسعه دهندگان این الگوریتم متفاوت است. البته مثل خیلی از مقالات علمی دیگر، مقاله جفری هینتون و همکاران اش نیز وارد همه جزئیات نمی شود (گاهاً به دلیل محدودیت های تعداد کلمات یا صفحات مقالات برای انتشار در ژورنال های علمی). به همین دلیل سوالات زیادی بدون پاسخ باقی مانده اند از جمله جزئیات و نحوه پیاده سازی شبکه چرا که کُدهای مربوطه توسط پژوهش گران منتشر نشده اند. با این حال،‌ من فکر می کنم که شمارش پارامترها در یک شبکه تمرینی خوب برای یادگیری اهداف معماری طراحی شده و شناخت بلوک های سازنده این معماری است.

شبکه CapsNet دارای دو بخش است: رمزگذار (Encoder) و رمزگشا (Decoder). سه لایه نخست شبکه، رمزگذار بوده و سه لایه بعدی نقش رمزگشا را ایفاء می کنند.

  • لایه ۱: لایه درهم پیچیده (Convolutional Layer)
  • لایه ۲: لایه کپسولی اولیه (PrimaryCaps Layer)
  • لایه ۳:‌ لایه کپسولی-رقمی (DigitCaps Layer)
  • لایه ۴: لایه تمام-متصل (Fully Connected) شماره ۱
  • لایه ۵:‌ لایه تمام-متصل شماره ۲
  • لایه ۶:‌ لایه تمام-متصل شماره ۳

بخش اول: رمزگذار

معماری رمزگذار CapsNet (منبع: مقاله پژوهشی اصلی)

بخش رمزگذار شبکه یک ورودی ۲۸ در ۲۸ پیکسل از مجموعه داده تصاویر MNIST را گرفته و می آموزد تا آن را به یک بردار ۱۶ بعدی از پارامترهای نمونه تبدیل کند (در بخش های قبلی درباره این فرآیند بحث کردیم). در واقع این مرحله ای است که کپسول ها کار خود را به انجام می رسانند. خروجی شبکه در طی فرآیند پیش بینی (Prediction) برداری ۱۰ بعدی از طول خروجی های رقمی-کپسولی (DigiCaps) است. قسمت رمزگشا دارای سه لایه است که دو تای آن ها درهم پیچیده (Convolutional) و آخرین آن ها تمام-متصل (Fully Connected) است.

لایه اول: لایه درهم پیچیده

  • ورودی: تصویر ۲۸ در ۲۸ پیکسل (با تنها یک کانال رنگی خاکستری)
  • خروجی: تنسور ۲۰ در ۲۰ در ۲۵۶
  • تعداد پارامترها: ۲۰،۹۹۲

وظیفه لایه درهم پیچیده شناسایی ویژگی های ابتدایی تصویر دوبعدی ورودی است. در CapsNet، این لایه دارای ۲۵۶ هسته (Kernel) یا صافی (Filter) با ابعاد ۹ در ۹ در ۱ و گام (Stride)‌ معادل ۱ است. تابع فعال سازی این لایه ReLU (یا Rectified Linear Unit)‌ است. اگر نمی دانید که هسته، گام و تابع فعال سازی چه هستند می توانید با مراجعه به این منابع به سرعت ایده اصلی شبکه های درهم پیچیده را فرا بگیرید (منبع ۱، منبع ۲، منبع ۳ و منبع ۴). برای محاسبه تعداد پارامترها، لازم است به یاد داشته باشیم که هر هسته در یک لایه درهم پیچیده یک عنصر اُریب (Bias Term) به همراه دارد. از این رو،‌ این لایه مجموعاً (9*9+1)*256=20992 پارامتر قابل آموزش دارد.

لایه دوم: لایه کپسولی اولیه

  • ورودی: تنسور ۲۰ در ۲۰ در ۲۵۶
  • خروجی: تنسور ۶ در ۶ در ۸ در ۳۲
  • تعداد پارامترها: ۵،۳۰۸،۶۷۲

این لایه ۳۲ کپسول اولیه دارد که وظیفه آن ها این است که ویژگی های ابتدایی شناسایی شده توسط لایه درهم پیچیده را دریافت کرده و ترکیباتی از این ویژگی ها را تولید کنند. طبیعت این ۳۲ «کپسول اولیه» بسیار شبیه به لایه های درهم پیچیده است. هر کپسول، ۸ هسته پیچشی ۹ در ۹ در ۲۵۶ را با گام (Stride) برابر ۲ به ورودی های ۲۰ در ۲۰ در ۲۵۶ اعمال می کند و در نتیجه، تنسورهایی با ابعاد ۶ در ۶ در ۸ به عنوان خروجی ایجاد می کند. به دلیل وجود ۳۲ کپسول، تنسور خروجی ابعادی معادل ۶ در ۶ در ۸ در ۳۲ خواهد داشت. با انجام محاسباتی شبیه آن چه برای لایه قبلی انجام دادیم، ما ۵،۳۰۸،۶۷۲ پارامتر قابل آموزش در لایه فعلی خواهیم داشت.

لایه سوم: لایه کپسولی-رقمی

  • ورودی: تنسور ۶ در ۶ در ۸ در ۳۲
  • خروجی: ماتریس ۱۶ در ۱۰
  • تعداد پارامترها: ۱،۴۹۷،۶۰۰ پارامتر

این لایه ۱۰ کپسول رقمی (یکی برای هر رقم) دارد. هر کپسول تنسوری با ابعاد ۶ در ۶ در ۸ در ۳۲ را به عنوان ورودی می پذیرد. می توانید ورودی را به صورت ۶ در ۶ در ۳۲ (مجموعاً ۱۱۵۲) بردارد ۸ بعدی تصور کنید. بر حسب عملیاتی که درون کپسول صورت می پذیرد (مشابه آن چه در این جا توضیح داده شد)، به هر یک از این بردارهای ورودی ماتریس وزن دهی با ابعاد ۸ در ۱۶مخصوص به خود تخصیص می یابد که فضای ورودی ۸ بعدی را به فضای خروجی ۱۶ بعدی کپسول تصویر می کند. پس ۱۱۵۲ ماتریس برای هر کپسول خواهیم داشت و همین طور ۱۱۵۲ ضریب c و ۱۱۵۲ ضریب b که در مسیریابی پویا مورد استفاده قرار می گیرند. با انجام محاسبه 1152*8*16+1152+1152، در مجموع به ۱۴۹،۷۶۰ پارامتر قابل آموزش برای هر کپسول می رسیم. البته تعداد نهایی پارامترهای این لایه ۱۰ برابر این عدد خواهد بود.

تابع زیان (Loss Function)

تابع زیان در شبکه های کپسولی ممکن است در نگاه اول پیچیده به نظر برسد، اما در حقیقت این طور نیست. این تابع بسیار شبیه به تابع زیان ماشین های بردار پشتیبان (Support Vector Machines یا SVM)‌ است. برای درک ایده اصلی نحوه عمل این تابع، به یاد آورید که خروجی لایه کپسولی-رقمی، ۱۰ بردار ۱۶ بعدی بود. در طول پروسه آموزش، یک مقدار زیان برای هر یک از ۱۰ بردار (به ازای هر نمونه) محاسبه خواهد شد و این مقادیر با هم جمع زده می شوند تا زیان کلی محاسبه گردد. با توجه به این که ما درباره یادگیری نظارت شده (Supervised Learning)‌ صحبت می کنیم، هر نمونه در مجموعه داده آموزش ما، برچسبی صحیح دارد که در این جا، یک بردار One-Hot با ۹ عنصر صفر و ۱ عنصر معادل یک در موقعیت صحیح است. در فرمول محاسبه تابع زیان، برچسب صحیح مقدار T_c را تعیین می کند. این مقدار چنان چه برچسب صحیح به رقمِ این رقم-کپسول (DigiCap) خاص مربوط باشد برابر ۱ خواهد بود و در غیر آن صورت برابر صفر.

معادله ریاضی تابع زیان (منبع: نویسنده، بر اساس مقاله پژوهشی اصلی)

فرض کنید که برچسب صحیح برابر یک است. این نشان می دهد که رقم-کپسول نخست مسئول رمزگذاری حضور رقم ۱ در تصویر خواهد بود. برای این رقم-کپسول، مقدار T_c برابر یک بوده و برای همه ۹ رقم-کپسول باقی مانده، T_c برابر صفر خواهد بود. وقتی T_c برابر یک است، بخش اول تابع زیان محاسبه می شود و بخش دوم برابر صفر خواهد بود. در مثال ما، برای محاسبه زیان رقم-کپسول نخست، ما بردار خروجی این رقم-کپسول را دریافت کرده و آن را از m+ کم می کنیم (که مقدار ثابت ۰.۹ را داراست). سپس مقدار حاصل را چنان چه مقداری بیشتر از صفر باشد نگه می داریم و مجذورش را محاسبه می کنیم. در غیر این صورت، مقدار صفر برگردانده می شود. به زبانی دیگر، اگر رقم-کپسول صحیح برچسب صحیح را با احتمال بالای ۰.۹ پیش بینی کند، زیان برابر صفر خواهد بود و اگر احتمال کمتر از ۰.۹ باشد، زیانی غیرصفر خواهیم داشت.

مقدار تابع زیان (Loss Function) برای رقم-کپسول صحیح و غیرصحیح. در نظر داشته باشید که گراف قرمز در مقایسه با گراف سبز در راستای عمودی حالت «لهیده» پیدا کرده است. ریشه این اتفاق در ضریب \lambda در فرمول تابع زیان است. (منبع:‌ نویسنده)

بخش دوم: رمزگشا

معماری رمزگشای CapsNet (منبع: مقاله پژوهشی اصلی)

رمزگشا، یک بردار ۱۶ بعدی را از رقم-کپسول (DigiCap) صحیح دریافت کرده و می آموزد که آن را به تصویر یک رقم ترجمه کند (توجه داشته باشید که رمزگشا تنها بردار رقم-کپسول صحیح را در طول پروسه آموزش در نظر می گیرد و از موارد غیرصحیح چشم پوشی می کند). رمزگشا به عنوان یک تنظیم کننده (Regularizer)‌ مورد استفاده قرار می گیرد. خروجی صحیح رقم-کپسول را دریافت کرده و می آموزد تا یک تصویر ۲۸ در ۲۸ پیکسل را متناظر با آن بازسازی کند. تابع هزینه این کار، فاصله اقلیدسی (Euclidean Distance) بین تصویر بازسازی شده و تصویر ورودی (اصلی)‌ است. رمزگشا کپسول ها را مجبور می کند که ویژگی هایی را بیاموزند که برای بازسازی تصویر اصلی مفید هستند. هر چه تصویر بازسازی شده به تصویر ورودی اصلی نزدیک تر باشد، طبیعتاً نتیجه بهتری حاصل شده است. نمونه هایی از تصاویر ارقام بازسازی شده در زیر آمده است.

ردیف بالا: تصاویر ورودی اصلی. ردیف پایین: تصاویر بازسازی شده (منبع: مقاله پژوهشی اصلی)

لایه چهارم: لایه تمام-متصل (Fully Connected) شماره ۱

  • ورودی: ماتریس ۱۶ در ۱۰
  • خروجی: بردار با ۵۱۲ عنصر
  • تعداد کل پارامترها: ۸۲،۴۳۲

هر خروجی سطح پایین تر وزن دهی شده و به سوی نورون های (Neuron) لایه تمام-متصل به عنوان ورودی هدایت می شود. هر نورون دارای یک ترم اُریب (Bias) است. برای این لایه تعداد 16*10 ورودی داریم که همگی به سمت هر یک از نورون های لایه تمام-متصل هدایت می شوند. بنابراین، تعداد پارامترهای قابل آموزش برابر (16*10+1)*512 است.

برای دو لایه نهایی محاسبات به شکل زیر خواهد بود:
تعداد پارامترها = (تعداد ورودی ها + ترم اُریب) * تعداد نورون های لایه

لایه پنجم: لایه تمام-متصل (Fully Connected) شماره ۲

  • ورودی: بردار با ۵۱۲ عنصر
  • خروجی: بردار با ۱۰۲۴ عنصر
  • تعداد پارامترها: ۵۲۵،۳۱۲

لایه ششم: لایه تمام-متصل (Fully Connected) شماره ۳

  • ورودی: بردار با ۱۰۲۴ عنصر
  • خروجی:‌ بردار با ۷۸۴ عنصر (که در نهایت به یک ماتریس ۲۸ در ۲۸ نمایشگر تصویر بازسازی شده تغییر شکل می یابد)
  • تعداد پارامترها: ۸۰۳،۶۰۰

در کل شبکه تعداد ۸،۲۳۸،۶۰۸ پارامتر قابل آموزش وجود دارد.

نتیجه گیری

در این جا، مجموعه مطالب ما در مورد CapsNet به پایان خود می رسد. منابع بسیار خوبی برای مطالعه در مورد شبکه های کپسولی بر روی اینترنت وجود دارد. چنان چه علاقه مند به دانستن بیشتر هستید، بد نیست به این مجموعه بی نظیر از لینک های مرتبط با موضوع CapsNet مراجعه کنید.

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

گام اول: ادراک
گام دوم: کپسول ها چگونه کار می کنند
گام سوم: مسیریابی پویا بین کپسول ها