|
אני חושב שהמצב בהנדסת תוכנה ובפיתוח רשתות-נוירונים מאד דומה. בסופו של דבר, כאשר יושבים אנשים ובונים רשת-נוירונים, הם יודעים מה האלטרנטיבות שעומדות מולן בהנתן בעיה ספציפית, ואיך לשקול אותן. הם יודעים למה לצפות, ויודעים להבין את הבעיות הצפויות. הם יכולים להמנע מראש מחלקן, ולזהות את האחרות שבכל זאת צצות. והם מכירים best practices כדי לפתור אותן. יש לרשותם מתודולוגיה עשירה, הנשענת בחלקה על ידע תאורטי וחלקה (הגדול יותר) על ניסיון מעשי. והמתודולוגיה כמובן משתנה עם הזמן, גם בזכות ידע שהולך ונצבר, וגם בשל אופנות וטרנדים.
בפיתוח תוכנה, נכון שכאשר מדובר ביישום של אלגוריתמיקה או business logic אין בכלל וודו באופן עקרוני, אבל כמעט תמיד הוא נמצא שם באופן מעשי, בגלל מנגנונים (עם סייד-אפקטס מורגשים) שמסתתרים מאחורי אבסטרקציה שאותה המתכנת לא ממש מכיר (ה-cache replacement policy של המעבד, ה-congestion control בראוטר, אופטימיזציות של הקומפיילר וכו'). הדרך להתמודד עם זה היא כמובן לדבוק בשיטות-פיתוח בדוקות ומקובלות בתקווה שהכל פשוט יעבוד, ולעבור לווריאציות של ניסוי-וטעייה כשזה לא עובד. וכאשר מדובר בעיצוב תוכנה - אז כבר כמעט כל ההחלטות נשענות על היוריסטיקות ומורשת קרב. זה אולי לא "וודו", אבל זה עונה לתיאור "מובנה, תכליתי ומנומק" רק במובן מאד רחב, שתקף באותה מידה גם לבנייה ואימון של רשתות נוירונים.
ואולי בכלל השוואה "הוגנת יותר" היא בין פיתוח רשתות-נוירונים לבין פיתוח פתרונות במסגרת "למידה ממוחשבת קלאסית" (באמצעים כמו gradient boosting או SVMs). שם אני חושב שהמצב לא שקול, אבל בכלל שלרשתות-נוירונים יש יתרון מתודולוגי ברור.
|
|