מיטב ספריות הלמידה במכונה ולמידה עמוקה

אם אתה מתחיל פרויקט למידת מכונה חדשה או למידה עמוקה, אתה עלול להתבלבל באיזו מסגרת לבחור. כפי שנדון, יש כמה אפשרויות טובות לשני סוגי הפרויקטים.

יש הבדל בין מסגרת למידת מכונה למסגרת למידה עמוקה. בעיקרו של דבר, מסגרת למידת מכונה מכסה מגוון של שיטות למידה לסיווג, רגרסיה, אשכולות, זיהוי חריגות והכנת נתונים, והיא עשויה לכלול או לא לכלול שיטות רשת עצבית.

מסגרת למידה עמוקה או רשת עצבים עמוקה מכסה מגוון טופולוגיות רשת עצביות עם רבדים נסתרים רבים. Keras, MXNet, PyTorch ו- TensorFlow הן מסגרות למידה עמוקה. Scikit-learning ו- Spark MLlib הן מסגרות למידת מכונה. (לחץ על אחד מהקישורים הקודמים כדי לקרוא את הסקירה העצמאית שלי על המוצר.)

באופן כללי, חישובי רשת עצביים עמוקים פועלים מהר יותר על GPU (במיוחד על Nvidia CUDA GPU למטרות כלליות), TPU או FPGA, ולא על מעבד. באופן כללי, שיטות לימוד מכונה פשוטות יותר אינן נהנות מ- GPU.

בעוד שאתה יכול לאמן רשתות עצביות עמוקות על מעבד אחד או יותר, האימון נוטה להיות איטי, ובאיטיות אני לא מדבר על שניות או דקות. ככל שנדרש להכשיר יותר נוירונים ושכבות, וככל שיותר נתונים זמינים לאימון, כך לוקח יותר זמן. כאשר צוות המוח של גוגל אימן את מודלי התרגום לשפה לגרסה החדשה של גוגל טרנסלייט בשנת 2016, הם העבירו את מפגשי האימון שלהם במשך שבוע בכל פעם, במספר GPUs. ללא מחשבי GPU, כל ניסוי אימונים במודל היה לוקח חודשים.

מאז, ספריית ליבת המתמטיקה של אינטל (MKL) אפשרה להכשיר כמה רשתות עצביות במעבדים בפרק זמן סביר. בינתיים GPUs, TPUs ו- FPGAs נעשו אפילו מהר יותר.

מהירות האימון של כל חבילות הלמידה העמוקה הפועלות על אותם GPUs כמעט זהה. הסיבה לכך היא שלולאות האימון הפנימיות מבלות את מרבית זמנן בחבילת Nvidia CuDNN.

מלבד מהירות האימונים, לכל אחת מספריות הלמידה העמוקה יש מערכת יתרונות וחסרונות משלה, וזה נכון גם לגבי Scikit-learning ו- Spark MLlib. בואו נצלול פנימה.

קרס

Keras הוא מפרט ויישום ברמה גבוהה וחזיתית לבניית מודלים של רשת עצבית שנשלחת עם תמיכה בשלוש מסגרות למידה עמוקה של Back-end: TensorFlow, CNTK ו- Theano. אמזון עובדת בימים אלה על פיתוח עורף MXNet עבור Keras. אפשר גם להשתמש ב- PlaidML (פרויקט עצמאי) כ- back-end עבור Keras כדי לנצל את תמיכת OpenCL של PlaidML לכל GPUs.

TensorFlow הוא החלק האחורי המוגדר כברירת מחדל עבור Keras, וזה המומלץ למקרי שימוש רבים הכוללים האצת GPU בחומרת Nvidia באמצעות CUDA ו- cuDNN, כמו גם להאצת TPU ב- Google Cloud. TensorFlow מכיל גם tf.kerasמחלקה פנימית , נפרדת ממתקן חיצוני של Keras.

לקראס יש סביבה ברמה גבוהה שהופכת את הוספת שכבה לרשת עצבית לקלה כמו שורה אחת של קוד במודל הסיקוונטלי שלה, ודורשת שיחת פונקציה אחת בלבד כל אחת לצורך הידור והדרכה של מודל. Keras מאפשר לך לעבוד ברמה נמוכה יותר אם אתה רוצה, עם ה- Model או ה- API הפונקציונלי שלו.

Keras מאפשר לך לרדת למטה עוד יותר, לרמת קידוד Python, על ידי סיווג משנה keras.Model, אך מעדיף את ה- API הפונקציונלי במידת האפשר. ל- Keras יש גם scikit-learnממשק API, כך שתוכלו להשתמש בחיפוש רשת Scikit-learning כדי לבצע אופטימיזציה של היפר-פרמטר במודלים של Keras. 

עלות: קוד פתוח בחינם. 

פלטפורמה: Linux, MacOS, Windows או Raspbian; TensorFlow, Theano או CNTK אחורי. 

קרא את הביקורת שלי על Keras. 

MXNet

MXNet התפתחה והשתפרה לא מעט מאז שעברה תחת מטריית Apache Software Foundation בתחילת שנת 2017. אמנם הייתה עבודה על Keras עם מערכת אחורית של MXNet, אבל ממשק אחר ברמה גבוהה הפך לחשוב הרבה יותר: Gluon. לפני השילוב של Gluon, אתה יכול לכתוב קוד חובה קל או קוד סמלי מהיר ב- MXNet, אך לא את שניהם בבת אחת. באמצעות Gluon תוכלו לשלב את המיטב משני העולמות, באופן שמתחרה גם עם Keras וגם עם PyTorch.

היתרונות שנטענו עבור Gluon כוללים:

  • קוד פשוט וקל להבנה: Gluon מציע מערך מלא של אבני בניין רשתות עצביות מסוג Plug-and-Play, כולל שכבות מוגדרות מראש, אופטימיזציה ומתחילים.
  • מבנה גמיש, הכרחי: Gluon אינו דורש הגדרה נוקשה של מודל הרשת העצבית, אלא מקרב את אלגוריתם האימון והמודל זה לזה כדי לספק גמישות בתהליך הפיתוח.
  • גרפים דינמיים: Gluon מאפשר למפתחים להגדיר מודלים של רשת עצבית שהם דינמיים, כלומר ניתן לבנות אותם באופן תקיף, עם כל מבנה, ולהשתמש בכל זרימת הבקרה המקורית של Python.
  • ביצועים גבוהים: Gluon מספק את כל היתרונות שלעיל מבלי להשפיע על מהירות האימון שמספק המנוע הבסיסי.

ארבעת היתרונות הללו, יחד עם אוסף מורחב מאוד של דוגמאות למודל, מביאים את Gluon / MXNet לזוגיות גסה עם Keras / TensorFlow ו- PyTorch כדי להקל על הפיתוח ומהירות האימונים. אתה יכול לראות דוגמאות קוד עבור כל אלה בדף הראשי של Gluon וחוזר ונשנה בדף הסקירה הכללית עבור ה- API של Gluon.

ממשק ה- API של Gluon כולל פונקציונליות לשכבות רשת עצביות, רשתות עצביות חוזרות, פונקציות אובדן, שיטות מערך נתונים ומערכי נתונים של ראייה, גן חיות מודל ומערך שיטות רשת עצביות ניסיוניות שתרמו. ניתן לשלב גלואון בחופשיות עם מודולים MXNet ו numpy סטנדרטי, למשל module,autograd , ו ndarray, כמו גם עם שליטה Python זורם.

ל- Gluon מבחר טוב של שכבות לבניית מודלים, כולל שכבות בסיסיות (צפוף, נשירה וכו '), שכבות פיתול, שכבות איגום ושכבות הפעלה. כל אחד מאלה הוא שיחה אחת. אלה יכולים לשמש, בין היתר, בתוך מכולות רשת כגון gluon.nn.Sequential().

עלות: קוד פתוח בחינם. 

פלטפורמה: Linux, MacOS, Windows, Docker, Raspbian ו- Nvidia Jetson; Python, R, Scala, Julia, Perl, C ++ ו- Clojure (ניסיוני). MXNet כלול ב- AMI של למידה עמוקה של AWS.

קרא את הביקורת שלי על MXNet. 

PyTorch

PyTorch בונה על הלפיד הישן ומסגרת Caffe2 החדשה. כפי שאתה יכול לנחש מהשם, PyTorch משתמש בפייתון כשפת התסריט שלה, והיא משתמשת בקצה האחורי של לפיד C / CUDA. תכונות הייצור של Caffe2 משולבות בפרויקט PyTorch.

PyTorch מחויב כ"טנסורים ורשתות עצביות דינמיות בפייתון עם האצת GPU חזקה. " מה זה אומר?

טנזורים הם מבנה מתמטי שמשתמשים בו רבות בפיזיקה והנדסה. טנסור דרגה שתיים הוא סוג מיוחד של מטריצה; לקיחת התוצר הפנימי של וקטור עם הטנסור מניבה וקטור אחר בעוצמה חדשה ובכיוון חדש. TensorFlow לוקח את שמו מהדרך שבה זורמים טנזורים (של משקולות סינפסה) סביב מודל הרשת שלה. NumPy משתמש גם בטנזורים, אך מכנה אותם ndarray.

האצת GPU היא נתון למסגרות הרשת העצבית העמוקה ביותר. דינמי רשת עצבית היא אחת שיכול לשנות מן איטרציה כדי איטרציה, למשל המאפשר מודל PyTorch להוסיף ולהסיר שכבות נסתרות במהלך אימונים כדי לשפר את הדיוק והכלליות שלה. PyTorch משחזר את הגרף לטוס בכל שלב איטרציה. לעומת זאת, TensorFlow כברירת מחדל יוצר גרף זרימת נתונים יחיד, מייעל את קוד הגרף לביצועים ואז מאמן את המודל.

בעוד שמצב ביצוע נלהב הוא אפשרות חדשה למדי ב- TensorFlow, זו הדרך היחידה ש- PyTorch פועלת: שיחות API מבוצעות כאשר הן מופעלות, במקום להוסיף לתרשים להפעלה מאוחר יותר. זה אולי נראה כאילו זה יהיה יעיל פחות מבחינה חישובית, אבל PyTorch תוכננה לעבוד ככה, וזה לא מרושע כשמדובר במהירות אימונים או חיזוי.

PyTorch משלבת ספריות האצה כמו Intel MKL ו- Nvidia cuDNN ו- NCCL (Nvidia Collective Communications Library) כדי למקסם את המהירות. מעבד הליבה של המעבד וה- GPU טנסור ורשתות עצביות של הרשת - TH (Torch), THC (Torch CUDA), THNN (Torch Neural Network) ו- THCUNN (Torch CUDA Neural Network) - נכתבים כספריות עצמאיות עם ממשק API C99. יחד עם זאת, PyTorch אינו מחייב פיתון למסגרת C ++ מונוליטית - הכוונה היא שתשתלב עמוק עם Python ותאפשר שימוש בספריות Python אחרות.

עלות: קוד פתוח בחינם. 

פלטפורמה: Linux, MacOS, Windows; מעבדים ו- GPU של Nvidia. 

קרא את הביקורת שלי על PyTorch. 

סקיקיט-למד

למסגרת הפיתון של Scikit-learning יש מבחר רחב של אלגוריתמים חזקים של למידת מכונה, אך ללא למידה עמוקה. אם אתה אוהד Python, Scikit-learning עשוי בהחלט להיות האפשרות הטובה ביותר עבורך בין ספריות הלמידה המכונה הרגילות.

Scikit-learning היא ספריית למידת מכונות חזקה ומוכחת עבור Python עם מגוון רחב של אלגוריתמים מבוססים וגרפיקה משולבת. קל יחסית להתקין, ללמוד ולהשתמש, ויש לו דוגמאות טובות והדרכות.

מצד שני, Scikit-learning אינו מכסה למידה עמוקה או למידת חיזוק, חסר מודלים גרפיים וחיזוי רצף, ואין אפשרות להשתמש בה משפות אחרות מלבד פייתון. זה לא תומך ב- PyPy, מהדר ה- Python בדיוק בזמן או GPUs. עם זאת, למעט הפלישה הקטנה שלה לרשתות עצביות, אין לה ממש בעיות מהירות. הוא משתמש ב- Cython (מהדר ה- Python to C) עבור פונקציות שצריכות להיות מהירות, כגון לולאות פנימיות.

ל- Scikit-learning מבחר טוב של אלגוריתמים לסיווג, רגרסיה, אשכולות, הפחתת מימדיות, בחירת מודלים ועיבוד מקדים. יש לו תיעוד טוב ודוגמאות לכל אלה, אך חסר כל סוג של עבודה מודרכת לביצוע משימות אלה.

Scikit-learning זוכה לציונים עליונים על מנת להקל על הפיתוח, בעיקר מכיוון שהאלגוריתמים כולם עובדים כמתועדים, ממשקי ה- API עקביים ומעוצבים היטב, ויש מעט "אי התאמות עכבה" בין מבני הנתונים. זה תענוג לעבוד עם ספרייה שתכונותיה הוטלו ביסודיות ובאגיה נשטפו ביסודיות.

מצד שני, הספרייה אינה מכסה למידה עמוקה או למידת חיזוק, מה שמשאיר את הבעיות הקשות אך החשובות הנוכחיות, כגון סיווג תמונות מדויק וניתוח ותרגום אמין בזמן אמת של שפות. ברור שאם אתה מעוניין בלימוד עמוק, עליך לחפש מקום אחר.

עם זאת, ישנן בעיות רבות - החל מבניית פונקציית חיזוי המקשרת בין תצפיות שונות, לסיווג תצפיות, ללימוד מבנה של מערך נתונים ללא תווית - המעניקות לעצמן למידת מכונה ישנה רגילה ללא צורך בעשרות שכבות של נוירונים, ולגבי אזורים אלה Scikit-learning הוא אכן טוב מאוד.

עלות: קוד פתוח בחינם. 

פלטפורמה: דורש פייתון, NumPy, SciPy ו- ​​Matplotlib. מהדורות זמינות עבור MacOS, Linux ו- Windows.

קרא את הביקורת שלי על Scikit-learning. 

ניצוץ MLlib

Spark MLlib, ספריית למידת המכונה הפתוחה של Apache Spark, מספקת אלגוריתמים נפוצים של למידת מכונה כגון סיווג, רגרסיה, אשכולות וסינון שיתופי (אך לא רשתות עצביות עמוקות). הוא כולל גם כלים לחילוץ תכונות, טרנספורמציה, הפחתת מימדיות ובחירה; כלים לבניית, הערכה וכוונון צינורות למידת מכונה; וכלי עזר לשמירה וטעינה של אלגוריתמים, מודלים וצינורות, לטיפול בנתונים ולביצוע אלגברה וסטטיסטיקה לינארית.

Spark MLlib כתוב בסקאלה ומשתמש בחבילת האלגברה הליניארית Breeze. בריזה תלויה ב- netlib-java לצורך עיבוד מספרי אופטימלי, אם כי בהפצת קוד פתוח המשמעות היא שימוש אופטימלי במעבד. Databricks מציעה אשכולות Spark מותאמים אישית המשתמשים ב- GPUs, מה שעלול להביא לך שיפור מהיר של פי 10 יותר להכשרת מודלים מורכבים של למידת מכונה עם נתונים גדולים.

Spark MLlib מיישם משאית של אלגוריתמים ומודלים נפוצים לסיווג ולרגרסיה, עד כדי כך שמתחיל יכול להיות מבולבל, אך בסופו של דבר מומחה ימצא בחירה טובה של מודל לנתונים שניתחו, בסופו של דבר. לשפע הדגמים הזה Spark 2.x מוסיף את המאפיין החשוב של כוונון היפר-פרמטר, המכונה גם בחירת מודלים. כוונון Hyperparameter מאפשר לאנליסט להגדיר רשת פרמטרים, אומדן ומעריך, ולתת לשיטת אימות צולב (זמן רב אך מדויק) או לשיטת פיצול אימות רכבת (מהירה אך פחות מדויקת) למצוא את המודל הטוב ביותר עבור נתונים.

ל- Spark MLlib ממשקי API מלאים עבור Scala ו- Java, ממשקים מלאים מלאים עבור Python ו- API חלקי רישומי עבור R. תוכלו לקבל תחושה טובה של הכיסוי על ידי ספירת הדוגמאות: 54 דוגמאות Java ו- 60 Scala למידה, 52 דוגמאות למידה, וחמש דוגמאות R בלבד. מניסיוני, Spark MLlib הכי קל לעבוד איתם באמצעות מחברות Jupyter, אבל אתה בהחלט יכול להריץ אותו במסוף אם אתה מאלף את הודעות הסטטוס המפוארות של Spark.

Spark MLlib מספק כמעט כל דבר שתרצה בדרך של למידת מכונה בסיסית, בחירת תכונות, צינורות והתמדה. זה עושה עבודה די טובה עם סיווג, רגרסיה, אשכולות וסינון. בהתחשב בכך שהוא חלק מספארק, יש לו גישה נהדרת למסדי נתונים, זרמים ומקורות נתונים אחרים. מצד שני, Spark MLlib לא באמת מוגדר לתכנן ולאמן רשתות עצביות עמוקות כמו TensorFlow, PyTorch, MXNet ו- Keras.

עלות: קוד פתוח בחינם.

פלטפורמה: Spark פועל גם במערכות דומות ל- Windows וגם ל- Unix (למשל Linux, MacOS), עם Java 7 ואילך, Python 2.6 / 3.4 ואילך ו- R 3.1 ואילך. עבור ממשק ה- API של Scala, Spark 2.0.1 משתמש ב- Scala 2.11. Spark דורש Hadoop / HDFS.

קרא את הביקורת שלי על Spark MLlib.