רשת קונבולוציה

רשת קונבולוציה (לפי האקדמיה ללשון העברית: רשת עֲצַבִּית מתקפלת; באנגלית: CNN – Convolutional Neural Network, נקראת גם Space Invariant Artificial Neural Networks או SIANN) היא סוג של רשת נוירונים המשתמשת בפעולת הקונבלוציה במקום בכפל מטריצות כללי לפחות באחת מהשכבות שלה. סוג זה של רשת נוירונים משמש בעיקר לעיבוד תמונה וראיה ממוחשבת, אך יש לו שימושים גם במערכות המלצה, עיבוד שפה טבעית וממשק מוח-מחשב. הליבה של הרשת מבוססת על שכבות כינוס (באנגלית: convolution layers) הממומשות על ידי העברת מסננת (filter) או ליבה (kernel) על גבי הקלט וביצוע כפל מטריצות. הפלט נקרא feature map. ההשראה לרשתות קונבולציה מגיעה מתהליכים ביולוגים, במובן זה שדפוס החיבור בין נוירונים ברשת דומה לארגון בקליפת הראייה אצל חיות: נוירונים בודדים של קליפת המוח מגיבים לגירוי רק באזור מוגבל של שדה הראיה, הידוע כשדה הקלט. שדות הקלט של נוירונים שונים עולים אלה על אלה בצורה חלקית כך שביחד הם מכסים את שדה הראיה במלואו. רשת קונבולוציה עושה שימוש בדרך כלל בשכבות בְּקִשּׁוּר מָלֵא (fully connected), שכבות כינוס (convolution) שכבות אגרגציה (pooling) ופונקציית שפעול (activation function). בדרך כלל תחילה תכיל מספר שכבות כינוס, אגרגציה (pooling) ו-ReLU נוספות אחריה, ולאחר מכן מספר שכבות בקישור מלא. הקלט לשכבה זאת הוא טנזור המייצג את התמונה, בגודל (מספר קלטים) x (מספר ערוצי קלט) x ( גובה הקלט) x (רוחב הקלט). לאחר שהקלט מסיים לעבור בשכבה מתקבל טנזור המייצג תמונה מופשטת יותר הנקראת feature map, בגודל (מספר קלטים) x (מספר ערוצי ה-feature map) x ( גובה ה-feature map) x (רוחב ה-feature map). שכבת כינוס מקבלת טנזור ומוציאה טנזור חדש שישמש כקלט עבור שכבת הכינוס הבאה, ממש כמו שכבות fully connected ברשת עצבית מלאכותית. אחד מיתרונות שכבות הכינוס הוא הוזלת עלות החישוב של תמונות וכתוצאה מכך אפשור העמקת הרשת. לדוגמה, שכבה fully connected לתמונה בגודל 100x100 תיצור לנו כ-10,000 משקולות חדשות עבור כל נוירון בשכבה הבאה, דבר שיכול מהר מאוד להפוך ל"יקר" מאוד. לעומת זאת, שכבת כינוס עם ליבה (kernel) בגודל 5x5 תיצור לנו רק כ-25 משתנים למידים חדשים. שימוש במשקולות שעברו נרמול על פחות משתנים עוזר להימנע מבעיית הגרדיאנט הנעלם. שכבה זאת נועדה על מנת לצמצם את גודל הטנזור. היא מקבלת טנזור בגודל מסוים בתור קלט ומחזירה טנזור קטן יותר בתור פלט. יש כמה סוגי שכבות אגרגציה, כגון max pooling, average pooling ו-min pooling, כאשר max ו-average הם הפופולריים ביותר. סיבת השימוש באגרגציה היא בעיקר על מנת להוריד את "עלות" החישוב ולחסוך בזמן עיבוד. מכילה מערך נוירונים; מקבלת כקלט מערך נוירונים ומחברת בין כל נוירון במערך זה לכל נוירון הנמצא בתוכה (לפירוט נוסף ראה ערך רשת עצבית מלאכותית). רשת קונבולוציה הומצאה בשנת 1980 על ידי המדען קוניהיקו פוקושימה, שהמציא מודל בשם ניוקוגניטרון - רשת עצבית מלאכותית דיי בסיסית. בשנת 1988 יאן לקון, חוקר ממעבדות נוקיה בל, שידרג את המודל למצב שבו ידע לזהות ספרות בכתב יד ונעשה בו שימוש בבנקים ומערכות דואר אך לא יותר מכך, מכיוון שבזמן זה היה מחסור במאגרי מידע גדולים ומפותחים - דבר הכרחי על מנת לאמן בינה מלאכותית מסוג זה. בעיה נוספת הייתה החומרה שבזמנו לא הייתה מספיק חזקה על מנת לאמן בינה מלאכותית מסוג זה. בשנת 2012 חלה תפנית כאשר ארכיטקטורת AlexNet הראתה שיש מקום לחזור לרשתות קונבולוציה עם הטכנולוגיה של ימינו, שהתפתחו הרבה מאוד. רשת קונבולוציה מורכבת ממספר שכבות כגוון שכבת כינוס, שכבת אגרגציה ושכבה קישור מלא. יכול להיות שימוש בעוד סוגי שכבות רבים אבל אלה הנפוצות והבסיסיות ביותר. עוברים על הטנזור ומכפילים עם הליבה (באנגלית: kernel) שהיא טנזור בגודל   k 1 × k 2 {\displaystyle \ k_{1}\times k_{2}} עם קפיצות בגודל ( s 1 , s 2 ) {\displaystyle (s_{1},s_{2})} כאשר   s 1 {\displaystyle \ s_{1}} מייצג את גודל הקפיצה בציר ה-   x {\displaystyle \ x} ו-   s 2 {\displaystyle \ s_{2}} מייצג את גודל הקפיצה בציר ה-   y {\displaystyle \ y} (בדרך כלל   k 1 {\displaystyle \ k_{1}} ו-   k 2 {\displaystyle \ k_{2}} יהיו באותו גודל ולכן פשוט יקראו   k {\displaystyle \ k} כנ"ל לגבי   s {\displaystyle \ s} ), כאשר כל ליבה יכולה לשמש לצורך מטרה שונה. או פשוט g ( x , y ) = ω ∗ f ( x , y ) = ∑ d x = − a a ∑ d y = − b b ω ( d x , d y ) f ( x + d x , y + d y ) {\displaystyle g(x,y)=\omega *f(x,y)=\sum _{dx=-a}^{a}{\sum _{dy=-b}^{b}{\omega (dx,dy)f(x+dx,y+dy)}}} . כאשר g ( x , y ) {\displaystyle g(x,y)} מייצג את התמונה החדשה, f ( x , y ) {\displaystyle f(x,y)} מייצג את התמונה המקורית ו- ω {\displaystyle \omega } מייצג את הליבה. גודל הפלט של שכבת כינוס עם חלון בגודל   k w × k h {\displaystyle \ k_{w}\times k_{h}} וקפיצות (strides) בגודל   s w × s h {\displaystyle \ s_{w}\times s_{h}} טנזור קלט בגודל   t w × t h {\displaystyle \ t_{w}\times t_{h}}   o w = ⌊ t w − k w s w ⌋ + 1 {\displaystyle \ o_{w}=\lfloor {\frac {t_{w}-k_{w}}{s_{w}}}\rfloor +1}   o h = ⌊ t h − k h s h ⌋ + 1 {\displaystyle \ o_{h}=\lfloor {\frac {t_{h}-k_{h}}{s_{h}}}\rfloor +1} כאשר   o w × o h {\displaystyle \ o_{w}\times o_{h}} הם ממדיי הפלט. עוברים עם חלון בגודל   p w × p h {\displaystyle \ p_{w}\times p_{h}} ועושים פעולה מתמטית המוציאה מספר אחד. למשל, במקרה של max pooling ניקח את המספר הגדול ביותר שיצא בגבולות החלון שלנו בכל החלקה. במקרה של average pooling ניקח את כל המספרים שיצאו בגבולות החלון שלנו ונעשה להם ממוצע. ביצוע max pooling עם חלון בגודל   p w × p h {\displaystyle \ p_{w}\times p_{h}} וקפיצות (strides) בגודל   s w × s h {\displaystyle \ s_{w}\times s_{h}} טנזור קלט בגודל   t w × t h {\displaystyle \ t_{w}\times t_{h}} כאשר   o w × o h {\displaystyle \ o_{w}\times o_{h}} הם ממדיי הפלט ו-   0 ≤ x < t w {\displaystyle \ 0\leq x<t_{w}}   0 ≤ y < t h {\displaystyle \ 0\leq y<t_{h}} . o x , y = m a x ( ∑ i = ( x − 1 ) ∗ p w x ∗ p w ∑ j = ( y − 1 ) ∗ p h y ∗ p h t i , j ) {\displaystyle o_{x,y}=max(\sum _{i=(x-1)*p_{w}}^{x*p_{w}}\sum _{j=(y-1)*p_{h}}^{y*p_{h}}t_{i,j})} גודל הפלט של שכבת אגרגציה עם חלון בגודל   p w × p h {\displaystyle \ p_{w}\times p_{h}} וקפיצות (strides) בגודל   s w × s h {\displaystyle \ s_{w}\times s_{h}} טנזור קלט בגודל   t w × t h {\displaystyle \ t_{w}\times t_{h}}   o w = ⌊ t w − p w s w ⌋ + 1 {\displaystyle \ o_{w}=\lfloor {\frac {t_{w}-p_{w}}{s_{w}}}\rfloor +1}   o h = ⌊ t h − p h s h ⌋ + 1 {\displaystyle \ o_{h}=\lfloor {\frac {t_{h}-p_{h}}{s_{h}}}\rfloor +1} כאשר   o w × o h {\displaystyle \ o_{w}\times o_{h}} הם ממדיי הפלט. זוהי פונקציית שפעול מאוד פופולרית בקרב רשתות קונבולוציה. הפונקציה עוברת על כל נוירון ומבצעת בו פונקציית יחידה ליניארית מתוקנת. הפונקציה עבור כל נוירון היא: f ( x ) = { 0 for  x < 0 x for  x ≥ 0 {\displaystyle f(x)={\begin{cases}0&{\text{for }}x<0\\x&{\text{for }}x\geq 0\end{cases}}} הטווח של פונקציה זאת הוא [ 0 , ∞ ) {\displaystyle [0,\infty )} . נועדה למנוע התאמת יתר (overfitting), תופעה שבה המודל מתאים את עצמו לסוג הנתונים הספציפי שבעזרתו הוא אומן, ולא יודע להכליל אוסף נתונים רחב יותר (למשל, להבדיל בין תמונות של חתולים לתמונות של כלבים). אם יתרחש overfitting המודל יוכל לסווג את כל תמונות החתולים שאימנו אותו עליהם בצורה טובה אך ברגע שניתן לו תמונות של חתולים שהוא לא מכיר הוא יתחיל לטעות בסיווג. השכבה פועלת בצורה כזו: היא מקבלת את   0 < p ≤ 1 {\displaystyle \ 0<p\leq 1} וקלט של שכבת נוירונים, והיא תתעלם מנוירונים אקראיים, כלומר, לכל נוירון יש   p {\displaystyle \ p} סיכוי להישמר או   1 − p {\displaystyle \ 1-p} סיכויים להישמט. הליבה היא טנזור, וצריך לבחור את ממדי הטנזור. בדרך כלל הגדלים יהיו   3 × 3 {\displaystyle \ 3\times 3} או   5 × 5 {\displaystyle \ 5\times 5} או   7 × 7 {\displaystyle \ 7\times 7} אבל אפשר לבחור כל גודל רצוי כל עוד הוא גדול מאפס. ריפוד (באנגלית: padding) נועד על מנת לפתור שתי בעיות: במהלך ביצוע כינוס נוצרת בעיה. הבעיה נובעת מכך שלמעשה עוברים פחות פעמים על קצוות התמונה וכתוצאה מכך מאבדים מידע יקר ערך. אמנם זה יכול להראות שולי אבל לאחר שימוש בהרבה שכבות כינוס במודל, זה מצטבר להרבה. לאחר כל שימוש בכינוס התמונה תקטן ולמעשה אם נשתמש בכמה שכבות כינוס נוכל באיזשהו שלב להגיע למצב שבו צמצמנו את התמונה עד כדי מחיקתה. תהליך הריפוד בעצם "מרפד" את התמונה באפסים מצדדיה ובכך פותר את שתי הבעיות: כעת אנו עוברים גם על הקצוות כמו שצריך וגם לאחר כינוס התמונה תישאר באותו הגודל (בהנחה שהוספנו את הריפוד בגודל המתאים). למשל, לתמונה בגודל של 5 × 5 {\displaystyle 5\times 5} עם ליבה בגודל 3 × 3 {\displaystyle 3\times 3} וקפיצות בגודל של אחד, אם נוסיף שכבת ריפוד אחת מכל כיוון לאחר כינוס נשאר עם תמונה בגודל 5 × 5 {\displaystyle 5\times 5} כלומר לא הקטנו אותה. מפני שריפדנו באפסים אין לחשוש להטיית/עיוות התוצאות כתוצאה מהריפוד. משתנה זה מייצג את גודל הפסיעה/קפיצה שנעשית בכל פעם עם הליבה. בדרך כלל יהיה בגודל   2 × 2 {\displaystyle \ 2\times 2} או   1 × 1 {\displaystyle \ 1\times 1} אבל יכול להיות בכל גודל רצוי כל עוד הוא גדול מאפס. שכבת כינוס יכולה להכיל מספר ליבות כדי להגדיל את יכולת הזיהוי שלה. בדרך כלל בשכבות הראשונות כשטנזור הקלט עדיין גדול נשתמש במעט ליבות וככל שנתקדם ונגיע לשכבות מאוחרות יותר שבהן הטנזור קטן יותר, נשתמש ביותר ליבות. כל זה כדי להוריד זמני ריצה. אגרגציה היא הרי טנזור העובר על תמונת הקלט וצריך לבחור את ממדיי הטנזור. בדרך כלל הגדלים יהיו   2 × 2 {\displaystyle \ 2\times 2} או   4 × 4 {\displaystyle \ 4\times 4} אבל אפשרי לבחור כל גודל רצוי כל עוד הוא גדול מאפס. ישנם כמה סוגי אגרגציה: אגרגציה מקסימלית (max pooling) אגרגציה מינימלית (min pooling) אגרגציה ממוצעת (average pooling) מודל רשת קונבולוציה ב-TensorFlow: def build_classifier(): model = Sequential(name="classifier") model.add(Conv2D(64, kernel_size=5, strides=2, input_shape=img_shape, padding='same')) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.3)) model.add(Conv2D(128, kernel_size=5, strides=2, padding='same')) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.3)) model.add(Conv2D(256, kernel_size=5, strides=2, padding='same')) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.3)) model.add(Conv2D(512, kernel_size=5, strides=2, padding='same')) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.3)) model.add(Flatten()) model.add(Dense(1, activation='sigmoid')) model.summary() image = Input(shape=img_shape) validity = model(image) return Model(image, validity) רֶשֶׁת עֲצַבִּית מִתְקַפֶּלֶת במילון טכנולוגיית המידע: רשתות עצביות (תשע"א), באתר האקדמיה ללשון העברית M. V. Valueva, N. N. Nagornov, P. A. Lyakhov, G. V. Valuev, Application of the residue number system to reduce hardware costs of the convolutional neural network implementation, Mathematics and Computers in Simulation 177, 2020-11-01, עמ' 232–243 doi: 10.1016/j.matcom.2020.04.031 Zhang, Wei, Shift-invariant pattern recognition neural network and its optical architecture, Proceedings of Annual Conference of the Japan Society of Applied Physics. Zhang-1990-AppliedOptics-SIANN.pdf, Google Docs Hamed Habibi Aghdam, Elnaz Jahani Heravi, Guide to convolutional neural networks: a practical application to traffic-sign detection and classification, 2017, ISBN 978-3-319-57550-6. (בenglish) Alastair Hudson, Ten things you need to know about company law, Second edition. | Abingdon, Oxon; New York, NY: Routledge, 2017.: Routledge, 2017-07-06, עמ' 9–12 K. Fukushima, Neocognitron: a self organizing neural network model for a mechanism of pattern recognition unaffected by shift in position, Biological Cybernetics 36, 1980, עמ' 193–202 doi: 10.1007/BF00344251 Dan Ciregan, Ueli Meier, Jürgen Schmidhuber, Multi-column deep neural networks for image classification, 2012 IEEE Conference on Computer Vision and Pattern Recognition, 2012-06, עמ' 3642–3649 doi: 10.1109/CVPR.2012.6248110 Yann LeCun, Yoshua Bengio, Geoffrey Hinton, Deep learning, Nature 521, 2015-05-28, עמ' 436–444 doi: 10.1038/nature14539 T. Kitamura, S. Takei, Speaker recognition model using two-dimensional mel-cepstrum and predictive neural network, Proceeding of Fourth International Conference on Spoken Language Processing. ICSLP '96, IEEE doi: 10.1109/icslp.1996.607972 Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton, ImageNet classification with deep convolutional neural networks, Communications of the ACM 60, 2017-05-24, עמ' 84–90 doi: 10.1145/3065386 Håkan Wieslander, Philip J. Harrison, Gabriel Skogberg, Sonya Jackson, Deep Learning With Conformal Prediction for Hierarchical Analysis of Large-Scale Whole-Slide Tissue Images, IEEE Journal of Biomedical and Health Informatics 25, 2021-02, עמ' 371–380 doi: 10.1109/JBHI.2020.2996300 Y. W. Chow, R. Pietranico, A. Mukerji, Studies of oxygen binding energy to hemoglobin molecule, Biochemical and Biophysical Research Communications 66, 1975-10-27, עמ' 1424–1431 doi: 10.1016/0006-291x(75)90518-5