ما عليك القيام به في Java لدعم التعلم الآلي بشكل كامل

مرحبا زملائي!

من آخر الأخبار حول ابتكاراتنا القادمة في مجال ML / DL:

نيشانت شكلا ، " التعلم الآلي مع Tensorflow " - كتاب في التخطيط ، متوقع في المتاجر في يناير

Delip Rao ، Brian McMahan ، " Natural Language Processing in PyTorch " - تم توقيع العقد ، ونخطط لبدء الترجمة في يناير.

في هذا السياق ، أردنا مرة أخرى العودة إلى موضوع مؤلم - دراسة ضعيفة لموضوع ML / DL بلغة جافا. نظرًا لعدم نضوج حلول وخوارزميات Java هذه ، قررنا ذات مرة التخلي عن كتاب DL4J لـ Gibson و Patterson ، وتشير مقالة همفري شيل المنشورة اليوم إلى أننا ربما كنا على حق. ندعوك للتعرف على أفكار المؤلف حول كيفية تنافس Java أخيرًا مع Python في التعلم الآلي

في الآونة الأخيرة ، ألقيت محاضرة عن حاضر ومستقبل الآلة والتعلم العميق (ML / DL) في المؤسسة. في سياق مؤسسة كبيرة ، تكون الموضوعات والقضايا المطبقة أكثر صلة بالموضوع من مؤتمر بحثي - على سبيل المثال ، كيف يمكنني أنا وفريقي البدء في استخدام ML ، وأفضل طريقة لدمج ML مع الأنظمة التي لدينا قيد التشغيل. ثم بدأت حلقة نقاش حول جافا وتعلم الآلة.

إن لغة Java غير موجودة عمليًا في قسم التعلم الآلي. لا يوجد تقريبًا أي إطارات عمل ML يتم كتابتها بلغة جافا (يوجد DL4J ، ولكن شخصيًا ، لا أعرف أي شخص سيستخدمها ، MXNet لديه واجهة برمجة تطبيقات في Scala ، ولكن ليس في Java ، وهذا الإطار نفسه غير مكتوب بلغة جافا) . يحتوي Tensorflow على Java API غير مكتمل ، ومع ذلك ، تتمتع Java بنصيب كبير في تطوير المشاريع ؛ على مدى السنوات الـ 20 الماضية ، تم استثمار تريليونات الدولارات في هذه اللغة في جميع المجالات التي يمكن تصورها تقريبًا: الخدمات المالية والمعاملات الإلكترونية والمتاجر عبر الإنترنت والاتصالات السلكية واللاسلكية - قائمة يمكن أن تستمر إلى الأبد. في التعلم الآلي ، "Python" هو الأول بين المتساويين وليس جافا. أنا شخصياً أحب حقًا البرمجة في كل من Python و Java ، لكن Frank Greco صاغ سؤالًا مثيرًا للاهتمام دفعني إلى التفكير:
لماذا يجب أن تتنافس جافا مع Python في ML؟ لماذا لا تتولى مهمة جلب دعم ML جاد إلى الذهن؟

هل هو مهم؟

دعونا نبرر هذا الموضوع. منذ عام 1998 ، كانت لغة جافا في الدوري الممتاز ، بدونها لم تكن هناك أحداث تطورية وثورية في المؤسسة. نحن نتحدث عن تقنيات الويب والأجهزة المحمولة ، حول مقارنة المستعرض والحلول الأصلية ، حول أنظمة المراسلة ، دعم العولمة i18n و l10n ، التحجيم الأفقي ودعم التخزين لأي معلومات مؤسسية يمكنك تخيلها - من قواعد البيانات العلائقية إلى بحث

يوفر هذا المستوى من الدعم غير المشروط ثقافة صحية للغاية تم تطويرها في أوامر Java: "نستطيع" ، "نشمر عن سواعدك ونكتب الرمز". لا يوجد مثل هذا المكون السحري أو واجهة برمجة التطبيقات التي لا يمكن استكمالها أو استبدالها بفريق جيد من مطوري Java.

لكن هذا المبدأ لا يعمل في التعلم الآلي. هنا ، أوامر جافا لها خياران:

  1. إعادة التدريب / إعادة التدريب في Python.
  2. استخدم واجهة برمجة تطبيقات تابعة لجهة خارجية لإضافة إمكانات تعلُم الآلة إلى نظام مؤسستك الحالي.

لا يمكن وصف أي من هذه الخيارات بأنها غير مؤذية حقًا. يتطلب الأول الكثير من الوقت والاستثمار مقدمًا ، بالإضافة إلى تكاليف الدعم المستمرة. في الخيار الثاني ، نواجه خطر الاعتماد على المورد ، وفقدان دعم المورد ، بالإضافة إلى الاضطرار إلى العمل مع مكونات الطرف الثالث (دفع ثمن انتقال الشبكة في نفس الوقت) ، والترحيل إلى نظام قد تكون فيه متطلبات أمان حرجة ويتعين عليها مشاركة المعلومات مع من قبل شخص خارج مؤسستك. هذا غير مقبول في بعض الحالات.

الأكثر تدميرا في هذه الحالة (في رأيي) هو احتمال التدهور الثقافي - لا يمكن للفرق تغيير الشفرة التي لا يفهمونها أو لا يمكنهم الحفاظ عليها ، وبالتالي فإن المسؤوليات غير واضحة ، ويجب تفويض العمل الرئيسي لشخص آخر. تتعرض الفرق المكونة فقط من مطوري Java لخطر فقدان الموجة الكبيرة التالية ، والتي ستغرق في حوسبة المؤسسة - موجة التعلم الآلي.

لذلك ، من المهم والمستصوب أن يظهر دعم من الدرجة الأولى لتعلم الآلة في اللغة وعلى منصة جافا. خلاف ذلك ، هناك خطر من أن جافا في السنوات 5-10 القادمة سيتم استبدالها بلغات أخرى حيث يتم دعم ML بشكل أفضل.

لماذا Python مهيمن جدا في ML؟

للبدء ، دعنا نناقش لماذا أصبحت Python رائدة في مجال التعلم الآلي والتعلم العميق.

أظن أن كل ذلك بدأ بميزة بريئة تمامًا - دعم تشريح القائمة. هذا الدعم قابل للتوسيع: يمكن قطع أي فئة Python تنفذ __getitem__ و __setitem__ باستخدام هذه البنية. توضح القائمة التالية مدى بساطة هذه الميزة في Python وطبيعتها.

 a = [1, 2, 3, 4, 5, 6, 7, 8] print(a[1:4]) # [2, 3, 4] –      print(a[1:-1]) #  [2, 3, 4, 5, 6, 7] -  0-    print(a[4:]) # [5, 6, 7, 8] –      print(a[:4]) # [1, 2, 3, 4] –      print(a[:4:2]) # [1, 3] (    ) 

بالطبع ، هذا ليس كل شيء. كود Python أكثر إحكاما وإيجازا مقارنة برمز Java "القديم". الاستثناءات مدعومة ، ولكن لم يتم التحقق منها ، ويمكن للمطورين بسهولة كتابة نصوص Python المناسبة كعنصر قابل للاستهلاك - جرب "كيف يعمل" دون الغرق في رؤية Java العالمية "كل شيء عبارة عن فئة". من السهل المشاركة في بايثون.

ومع ذلك ، في رأيي ، فإن أهم عامل للتفوق (الذي لا يمنعني من الاعتراف بالعمل الشاق الذي يقوم به مجتمع Python للحفاظ على الاتصال بين Python 2.7 و Python 3) هو أنهم تمكنوا من إنشاء مكتبة أفضل تصميمًا وأسرع للعمليات مع الأرقام - NumPy. تم بناء Numpy حول ndarray ، وهو كائن عبارة عن صفيف N-dimensional. أقتبس من الوثائق: " الكائن الرئيسي في NumPy هو مجموعة متعددة الأبعاد متجانسة. هذا جدول من العناصر (عادة أرقام) ، كلها من نفس النوع ، مفهرسة بمجموعة من الأعداد الصحيحة الموجبة " . تستند جميع أعمال NumPy على كتابة بياناتك إلى ndarray والعمليات اللاحقة عليها. يدعم NumPy مجموعة متنوعة من خيارات الفهرسة والبث والمتجه للسرعة ، ويسمح للمطورين عمومًا بإنشاء المصفوفات العددية الكبيرة ومعالجتها بسهولة.

تظهر القائمة التالية في الفهرسة العملية والبث في ndarray - هذه هي العمليات الرئيسية في ML / DL.

 import numpy as np #    a = np.array([1.0, 2.0, 3.0]) b = 2.0 c = a * b print(c) #  [ 2. 4. 6.] -  b   /        c #2-d (   2)   NumPy –     - .e.  > 2 y = np.arange(35).reshape(5,7) print(y) # array([[ 0, 1, 2, 3, 4, 5, 6], # [ 7, 8, 9, 10, 11, 12, 13], # [14, 15, 16, 17, 18, 19, 20], # [21, 22, 23, 24, 25, 26, 27], # [28, 29, 30, 31, 32, 33, 34]]) print(y[0,0]) #     –    ,  0 print(y[4,]) #    4: array([28, 29, 30, 31, 32, 33, 34]) print(y[:,2]) #    2: array([ 2, 9, 16, 23, 30]) 

من خلال العمل مع المصفوفات العددية الكبيرة متعددة الأبعاد ، نحتفل بصميم برمجة التعلم الآلي ، وعلى وجه الخصوص - التعلم العميق. الشبكات العصبية العميقة عبارة عن شبكات من العقد والحواف على غرار الأرقام. تتطلب عمليات وقت التشغيل عند تدريب شبكة أو إجراء إخراج بناءً عليها مضاعفة سريعة للمصفوفة.

بفضل NumPy ، تم إنجاز الكثير - scipy و pandas والعديد من المكتبات الأخرى التي تعتمد على NumPy. تعمل مكتبات التعلم العميق الرائدة ( Tensorflow من Google و PyTorch من Facebook) على تطوير Python بجدية. يحتوي Tensorflow على واجهات برمجة تطبيقات أخرى لـ Go و Java و JavaScript ، ولكنها غير مكتملة وتعتبر غير مستقرة. تم كتابة PyTorch في الأصل في Lua ، وشهدت طفرة حقيقية في الشعبية عندما انتقلت في عام 2017 من هذه اللغة المتخصصة بصراحة إلى النظام البيئي ML Python الرئيسي في عام 2017.

عيوب بيثون

بايثون ليست لغة مثالية ، ولا هي أكثر وقت التشغيل شعبية ، CPython. يحتوي على قفل مترجم عالمي ( GIL ) ، لذا فإن القياس ليس سهلاً. علاوة على ذلك ، لا تزال أطر التعلم العميق في Python مثل PyTorch و Tensorflow تمرر الطرق الرئيسية لعمليات التنفيذ المبهمة. على سبيل المثال ، كان لمكتبة cuDNN الخاصة بـ NVidia تأثير كبير على نطاق تنفيذ PyTorch RNN / LSTM . تعد RNN و LSTM (الشبكات العصبية المتكررة والذاكرة قصيرة المدى طويلة المدى) أدوات DL مهمة جدًا لتطبيقات الأعمال ، خاصة لأنها متخصصة في تصنيف والتنبؤ بسلسلة متتالية من الأطوال المتغيرة - على سبيل المثال. التنقل عبر الويب ، وتحليل النقر ، وتحليل أجزاء النص ، وأحداث المستخدم ، وما إلى ذلك.

من أجل الحياد في Python ، تجدر الإشارة إلى أن هذا التعتيم / التقييد ينطبق على أي إطار تقريبًا لـ ML / DL باستثناء ما هو مكتوب في C أو C ++. لماذا؟ لأنه من أجل تحقيق أقصى أداء للعمليات الأساسية المحملة بشكل كبير ، مثل ضرب المصفوفة ، يقترب المطورون من المعدن قدر الإمكان.

ما الذي تحتاجه Java للتنافس في هذا المجال؟

أفترض أن منصة جافا تحتاج إلى ثلاث إضافات رئيسية. إذا تم تنفيذ ذلك ، فسيبدأ النظام البيئي الصحي والمزدهر للتعلم الآلي في الانتشار:

  1. أضف دعم فهرسة / تشريح أصلي إلى جوهر اللغة بحيث يمكنك التنافس مع Python بكل سهولة في الاستخدام والتعبير. من الممكن أن يتم بناء هذه القدرات في Java حول مجموعة مرتبة موجودة ، واجهة List <E> . للحصول على مثل هذا الدعم ، سيكون من الضروري أيضًا إدراك الحاجة إلى الحمل الزائد - هناك حاجة لتحقيق النقطة رقم 2.
  2. قم بإنشاء تطبيق موتر - ربما في حزمة java.math ، ولكن أيضًا مع الخروج إلى Collections API. يمكن أن تعمل هذه المجموعة من الفئات والواجهات بما يعادل ndarray وتوفر دعمًا إضافيًا للفهرسة ، على وجه الخصوص ، الأنواع الثلاثة للفهرسة المتوفرة في NumPy: الوصول إلى الحقول ، والشرائح البسيطة ، والفهرسة المتقدمة اللازمة للبرمجة.
  3. توفير البث - مقاييس وموترات ذات أبعاد اعتباطية (ولكنها متوافقة).

إذا كان من الممكن تنفيذ هذه المهام الثلاث في صميم لغة جافا ووقت التشغيل ، فقد فتحنا الطريق لإنشاء "NumJava" ، وهو ما يعادل NumPy . يمكن أن يكون مشروع بنما مفيدًا أيضًا لتوفير وصول متجه منخفض المستوى لعمليات الموتر السريع التي يتم إجراؤها على وحدة المعالجة المركزية ، GPU ، TPU وليس فقط بحيث يمكن أن تصبح Java ML الأسرع من نوعه.

لا أقول على الإطلاق أن هذه الإضافات تافهة - لا ، بعيدًا عنها ، ولكن فوائدها المحتملة لمنصة جافا بأكملها هائلة.

توضح القائمة التالية كيف يمكن أن يبدو مثال البث والفهرسة الخاص بنا من NumPy في NumJava مع فئة Tensor ، مع دعم بناء الجملة التشريح القائم على اللغة والقيود الحالية على التحميل الزائد للمشغل.

 //      Java    //  var-  Java 10   //  Java    ,      "a * b" //       ? var a = new Tensor([1.0, 2.0, 3.0]); var b = 2.0; var c = a.mult(b); /** *    , ,      Tensor  Java. */ import static java.math.Numeric.arange; //arange   ,  reshape    var y = arange(35).reshape(5,7); System.out.println(y); // tensor([[ 0, 1, 2, 3, 4, 5, 6], // [ 7, 8, 9, 10, 11, 12, 13], // [14, 15, 16, 17, 18, 19, 20], // [21, 22, 23, 24, 25, 26, 27], // [28, 29, 30, 31, 32, 33, 34]]) System.out.println(y[0,0]); //     –    ,  0 System.out.println(y[4,]); //    4-  (5-     0): tensor([28, 29, 30, 31, 32, 33, 34]) System.out.println(y[:,2]); //    2-  (3-     0): tensor([ 2, 9, 16, 23, 30]) 

المنظور والدعوة إلى العمل

نعلم جميعًا أن التعلم الآلي سيغير عالم الأعمال بما لا يقل عن وقته - قواعد البيانات العلائقية والإنترنت وتقنيات الهاتف المحمول. هناك الكثير من الضجيج حوله ، ولكن تظهر بعض المقالات والاستنتاجات المقنعة للغاية. على سبيل المثال ، تصف هذه المقالة المستقبل عندما يمكن للنظام التعرف على التكوينات المثلى لخادم قاعدة البيانات وخادم الويب وخادم التطبيقات ، في الخلفية ، باستخدام التعلم الآلي. لست مضطرًا حتى لنشر ML بنفسك في نظامك الخاص - بالتأكيد ، سيتمكن أحد البائعين من القيام بذلك.

استنادًا إلى المواقف البراغماتية الواردة في هذه المقالة ، يمكنك الكتابة في Java على الأقل أطر للتعلم الآلي والتعلم العميق (العمل على JRE) من الأطر الموجودة للويب أو التخزين على المدى الطويل أو تحليل XML - تخيل فقط! يمكنك تخيل أطر Java مع دعم الشبكات العصبية التلافيفية (CNN) لعمليات تنفيذ رؤية الكمبيوتر المتطورة ، مثل تطبيقات الشبكات العصبية المتكررة LSTM لمجموعات البيانات التسلسلية (التي لها أهمية رئيسية للأعمال) ، مع ميزات ML الأكثر تقدمًا ، مثل التمايز التلقائي والمزيد. ثم ستساعد هذه الأطر على تنفيذ وتغذية الجيل التالي من أنظمة المؤسسة التي يمكن دمجها بسلاسة مع أنظمة Java الحالية باستخدام جميع الأدوات نفسها - IDEs ، وأطر الاختبار ، والتكامل المستمر. الأهم من ذلك ، أنها سوف يكتبها ويدعمها شعبنا. إذا كنت من محبي جافا - ألا تحب هذا الاحتمال؟

Source: https://habr.com/ru/post/ar429596/


All Articles