Pooling, window by window


Image
What gets pooled
Pooling
Window (= stride)
Shift the picture
Slide the window
one window of the input
→
keep the biggest

الفكرة كلّها.
قطّع الـ map إلى بلاطات — هنا 2×2 أو 3×3 أو 4×4 — واستبدل كلّ بلاطة برقمٍ واحد. يُبقي max pooling أكبر رقم في البلاطة؛ ويُبقي average pooling المتوسّط. ثمّ تقفز النافذة بلاطةً كاملة إلى اليمين (الـ stride يساوي النافذة)، فلا يُنظَر إلى أيّ رقم مرّتين. ونافذة 2×2 تُبقي رقمًا واحدًا من كلّ أربعة.

وعلى خلاف الـ filter، ليس للـ pooling أيّ weights. لا شيء يُتعلَّم ولا شيء يُضبَط سوى حجم النافذة — إنّها قاعدة ثابتة.

أين يقع في الـ CNN.
الترتيب المعتاد filter → ReLU → pool، ثمّ الشيء نفسه مجدّدًا. وللـ pooling عملان. يصغّر الـ map، فيكون أمام الطبقة التالية أرقامٌ أقلّ تعمل عليها. ويجعل كلّ pixel في الطبقة التالية يمثّل رقعةً أكبر من الصورة الأصلية، فالـ filter ذو 3×3 بعد طبقتين ينظر في الحقيقة إلى مساحة أكبر بكثير. ويطرح max pooling أيضًا سؤالًا أبسط من “أين هذه الحافّة بالضبط؟” — إنّه يسأل “هل في هذه البلاطة حافّةٌ ما في مكانٍ ما؟”

أمور تستحقّ التجربة:
1. Cat، Outline + ReLU، Whole map، وبدّل بين Max وAverage. الشوارب بعرض pixel أو اثنين فقط، فتملأ جزءًا من كلّ بلاطة. يُبقيها Max بكامل سطوعها، 255؛ ويمزجها Average بالعتمة حولها، فتنخفض أسطع بلاطة شوارب إلى نحو نصف ذلك.

2. ابقَ على Max، 2×2، واضغط Pool again بعد كلّ مسحة. يصير الـ map 118×88 → 59×44 → 29×22 → 14×11 → 7×5. في مكانٍ ما على الطريق يكفّ عن أن يشبه قطّة، لكنّك ما تزال ترى أين كانت الحوافّ — وحين تكبر البلاطات بما يكفي يُطبَع كلّ رقم عليها.

3. House، Vertical edges + ReLU، Max، 2×2، ثمّ أزِح الصورة بمقدار 1 pixel. يُقال كثيرًا إنّ الـ pooling يجعل الشبكة تتجاهل الإزاحات الصغيرة، فتحقّق: سطر الحالة يعدّ ما تغيّر. يتغيّر نحو 5% من أرقام الـ input — ونحو 5% من الأرقام بعد الـ pooling أيضًا. جولة واحدة من الـ pooling لا تشتري إلّا القليل؛ وAverage أسوأ، عند 8%. ومهما كان تحمّل الـ CNN الحقيقيّ للإزاحة، فهو لا يأتي من طبقة pooling واحدة.

4. اختر نافذة 3×3 أو 4×4 على map لا ينقسم عرضه بالتساوي. الأعمدة المتبقّية على اليمين لا تملأ نافذةً كاملة، فتُحذَف ببساطة.