فرق بین کانولوشن convolution و میان-همبستگی cross-correlation
اگه پردازش تصویر یا شبکه های عمیق کار کرده باشید حتما دو عبارت کانولوشن (convolution) و میان-همبستگی (cross-correlation) را شنیده اید. هر دو عملیات از لحاظ ریاضیاتی خیلی شبیه بهم هستند. اگه بخوایم یه تعریف کلی در مورد هر کدوم بگیم، کانولوشن اثر یک سیگنال در سیگنال دومی را بررسی میکند، در حالی که میان-همبستگی میزان شباهت بین دو سیگنال را بررسی میکند. در این پست میخواهیم با فرق بین کانولوشن و میان-همبستگی آشنا شویم و همچنین به این سوال پاسخ دهیم که در لایههای کانولوشن شبکه عصبی CNN از convolution استفاده میشود یا cross-correlation.
کانولوشن (convolution)
کانولوشن اثر یک سیگنال در سیگنال دیگری را محاسبه میکند. کانولوشن بین دو سیگنال طبق رابطه زیر محاسبه میشود.
میان-همبستگی (cross-correlation)
cross-correlation برای محاسبه میزان شباهت دو سیگنال استفاده می شود. هرچقدر میزان شباهت بین دو سیگنال بیشتر باشد، میان-همبستگی عدد بزرگتری خواهد بود. طبق رابطه زیر میزان میان-همبستگی بین دو سیگنال محاسبه می شود.
همانطور که از روابط مشخص هست، دو معیار میان-همبستگی و کانولوشن از لحاظ ریاضیاتی خیلی شبیه بهم هستند. تنها تفاوت جزئی که بین دو سیگنال وجود دارد چرخش 180 درجهای یکی از سیگنالها در کانولوشن هست. در شکل زیر کانولوشن و میان-همبستگی بین دو سیگنال یک بعدی نمایش داده شده است. همانطور که میبینم در کانولوشن قبل از ضرب دو سیگنال، اول روی یکی از سیگنالها چرخش 180 درجه ای اتفاق می افتد، بعدش ضرب بین دو سیگنال انجام می شود. ولی در cross-correlation چنین چرخشی انجام نمیشود.
نحوه محاسبه cross-correlation
فرض کنید که تصویر دو بعدی زیر (سمت چپ) را دارید و میخواهید میان-همبستگی آنرا با فیلتر (سمت راست) بدست بیاورید.
برای محاسبه cross-correlation بین تصویر و فیلتر لازم است که حاصلضرب فیلتر و تکههای مختلف تصویر محاسبه شود. به عبارتی لازمه که یک تصویر جدید به اندازه تصویر ورودی ساخته شود. که مقدار هرکدام از پیکسلهای تصویر جدید برابر باشد با مجموعه حاصل ضرب نظیر به نظیر عناصر فیلتر و پیکسلهای همسایگی هر پیکسل در تصویر اصلی است.
- به ازای هرپیکسل همسایگی آن در تصویر اصلی مشخص میشود
- سپس ضرب نظیر به نظیر عناصر اون پنجره با فیلتر محاسبه میشود
- حاصل جمع همه مقادیر محاسبه شده و در آدرس مورد نظر در تصویر خروجی قرار میگیرید
همانطور که میبینید برای پیکسلهای کناری تصویر ورودی نمیتوان ضرب رو انجام داد. چرا که همسایگی ندارند و عمل ضرب نظیر به نظیر امکان پذیر نیست.
برای حل این مسئله از padding استفاده می شود. به این ترتیب که به تعداد مورد نیاز، سطر و ستون ساختگی به تصویر اضافه می شود تا برای پیکسلهای کناری هم بشه پنجره گذاری کرد و فیلتر را اعمال کرد. از اونجا که اندازه فیلتر 3*3 هست، در این تصویر لازمه یک سطر/ستون برای ابتدای تصویر و یک سطر و ستون برای انتهای تصویر اضافه کرد.
حال این پنجره گذاری را میتوان روی تک تک پیکسلها در نظر گرفت و همسایگی 3*3 هر پیکسل را مشخص کرد و مجموع حاصل ضرب نظیر به نظیر آن با فیلتر را محاسبه کرد و مقدار حاصل را در آدرس متناظر در تصویر خروجی قرار داد. با این کار تصویر زیر حاصل می شود.
نحوه محاسبه convolution
عمل کانولوشن همانند cross-correlation انجام میشود، یعنی ضرب نظیر به نظیر همسایگی هر پیکسل با فیلتر انجام شده و حاصل آن در آدرس متناظر در تصویر خروجی قرار میگیرد. فقط باید توجه داشت که در کانولوشن در ابتدا فیلتر به صورت سطری ستونی چرخش 180 درجه ای میکند و بعدش روی تصویر اعمال میشود
کاربرد convolution
همانطور که در ابتدا بیان کردیم، از کانولوشن برای بررسی اثر یک سیگنال روی سیگنال دیگر استفاده می کنند. در تصویر زیر اثر فیلتر مکانی لاپلاسین روی تصویر ورودی نشان داده شده است. بسته به اینکه نوع فیلتر چی باشد، تاثیر متفاوتی روی تصویر خواهد گذاشت.
کاربرد cross-correlation
از cross-correlation برای محاسبه میزان شباهت بین دو سیگنال استفاده می شود. در زیر شباهت یک تکه با بخشهای مختلف تصویر نمایش داده شده است. همانطور که می بینیم، در جاهایی که شباهت زیاد بوده است، مقدار همبستگی زیاد بوده و در نتیجه در تصویر خروجی اون نواحی دامنه بیشتری دارند و روشنتر نمایش داده شده اند. از این خاصیت میتوان در تشخیص اشیاء استفاده کرد.
کانولوشن و cross-correlation چه زمانی نتیجه یکسانی دارند؟
اگر عناصر یک فیلتر متقارن باشد، نتیجه کانولوشن و cross-correlation دقیقا یکسان میشود. چرا که عناصر فیلتر بعد از چرخش همچنان همان مقدار قبلی میشوند.
در شبکه ی عمیق CNN در واقعیت عمل کانولوشن انجام میشود یا cross correlation ؟
درسته که اسم CNN (شبکهی عصبی کانولوشنی) را از عمل کانولوشن گرفته اند، اما از لحاظ محاسبات ریاضیاتی باید بگیم که عمل cross-correlation در لایه های کانولوشن انجام می شود. چرا که در اعمال فیلترهای مکانی در هر لایه کانولوشن، هیچ rotationی روی کرنلها اعمال نمیشود.
از آنجا که مقدار فیلترها (کرنالهای هر لایه کانولوشن) از روی داده آموزشی محاسبه می شوند، خروجیِ لایه های کانولوشن برای هر دوی کانولوشن یا cross-correlation یکسان خواهد بود. چرا که در شبکه عصبی لازمه در هر لایه کانولوشن به ازای هر نوع ورودی یک خروجی خاصی تولید شود. حال اگر در لایه کانولوشن از عمل کانولوشن استفاده شود، مقدار کرنلها در پروسه آموزشی طوری محاسبه می شوند که هنگام اعمال عمل کانولوشن خروجی مورد نظر محاسبه شود. یا اگر در لایه کانولوشن از عمل cross-correlation استفاده شود، باز مقدار کرنلها در پروسه آموزشی طوری محاسبه می شوند که هنگام اعمال cross-correlation خروجی مورد نظر محاسبه شود.
اجازه بدهید با یک مثال ساده این مسئله را توضیح دهیم. فرض کنید یک تصویر 8×6 (سمت چپ) داریم و خروجی این شبکه باید یک تصویر 8×6 به صورت زیر (سمت راست) باشد.
هدف شبکه تولید خروجی مدنظر است. اگر در ساختار شبکه، در لایه کانولوشن از عمل کانولوشن استفاده شود، باید شبکه کرنل1 (سمت چپ) را محاسبه کند. و اگر از cross-correlation استفاده کند باید شبکه کرنل 2 (سمت راست) را محاسبه کند.
اگر دقت کنید متوجه می شویم که کرنل یک حالت چرخش یافته کرنل دوم هست. برای همین است که نتیجه خروجی لایه های کانولوشن تحت تاثیر عمل کانولوشن یا cross-correlation قرار نمیگیرند. و شبکه به ازای هر کدام از عملیات میتواند کرنل مناسب برای تولید خروجی مدنظر استفاده کند. از این رو در CNN شاید بشه گفت به خاطر سادگی محاسبات برای کانولوشن از فرم ریاضیاتی cross-correlation در لایههای کانولوشن استفاده میکنند و موقع اعمال کرنلها روی تصاویر ورودی چرخشی روی آنها انجام نمیشود.
عالی
خوشحالیم که براتون مفید بوده
خیلی کیف کردم مرسی