الهجرة من الشبكات العصبية

غابات القرار TensorFlow ( TF-DF ) عبارة عن مجموعة من خوارزميات غابة القرار ( DF ) المتوفرة في TensorFlow. تعمل غابات القرار بشكل مختلف عن الشبكات العصبية ( NN ): لا يتم تدريب DFs عمومًا باستخدام الانتشار العكسي أو على دفعات صغيرة. ولذلك، فإن خطوط أنابيب TF-DF لديها بعض الاختلافات عن خطوط أنابيب TensorFlow الأخرى.

يمثل هذا المستند قائمة بهذه الاختلافات ودليلًا لتحديث خطوط أنابيب TF لاستخدام TF-DF

يفترض هذا المستند الإلمام بالكولاب المبتدئ .

مجموعة البيانات والميزات

مجموعة بيانات التحقق من الصحة

على عكس نموذج تدريب الشبكة العصبية القياسي، لا تحتاج نماذج TF-DF إلى مجموعة بيانات التحقق من الصحة لمراقبة التجهيز الزائد، أو إيقاف التدريب مبكرًا. إذا كان لديك بالفعل تقسيم تدريب/تحقق من الصحة/اختبار، وكنت تستخدم التحقق من الصحة لأحد هذه الأسباب، فمن الآمن تدريب TF-DF الخاص بك على التدريب + التحقق من الصحة (ما لم يتم استخدام تقسيم التحقق أيضًا لشيء آخر، مثل ضبط المعلمة الفائقة).

- model.fit(train_ds, validation_data=val_ds)
+ model.fit(train_ds.concatenate(val_ds))

# Or just don't create a validation dataset

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

إدخال/إخراج مجموعة البيانات

تدريب لمدة 1 عصر بالضبط

# Number of epochs in Keras
- model.fit(train_ds, num_epochs=5)

# Number of epochs in the dataset
- train_ds = train_ds.repeat(5)
- model.fit(train_ds)
+ model.fit(train_ds)

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

لا تقم بخلط مجموعة البيانات

لا يلزم تبديل مجموعات البيانات عشوائيًا (ما لم يكن input_fn يقرأ عينة من مجموعة البيانات فقط).

- train_ds = train_ds.shuffle(5)
- model.fit(train_ds)
+ model.fit(train_ds)

الأساس المنطقي: يقوم TF-DF بتبديل الوصول إلى البيانات داخليًا بعد قراءة مجموعة البيانات الكاملة في الذاكرة. تعتبر خوارزميات TF-DF حتمية (إذا لم يغير المستخدم البذرة العشوائية). سيؤدي تمكين التبديل العشوائي إلى جعل الخوارزمية غير حتمية. يكون الخلط منطقيًا إذا تم ترتيب مجموعة بيانات الإدخال وسيقوم input_fn بقراءة عينة منها فقط (يجب أن تكون العينة عشوائية). ومع ذلك، فإن هذا سيجعل إجراءات التدريب غير حتمية.

لا ضبط حجم الدفعة

لن يؤثر حجم الدفعة على جودة النموذج

- train_ds = train_ds.batch(hyper_parameter_batch_size())
- model.fit(train_ds)
# The batch size does not matter.
+ train_ds = train_ds.batch(64)
+ model.fit(train_ds)

الأساس المنطقي: بما أن TF-DF يتم تدريبه دائمًا على مجموعة البيانات الكاملة بعد قراءتها، فإن جودة النموذج لن تختلف بناءً على حجم الدفعة (على عكس خوارزميات تدريب الدفعة الصغيرة مثل SGD حيث يجب ضبط المعلمات مثل معدل التعلم بشكل مشترك). وبالتالي يجب إزالته من عمليات مسح المعلمة الفائقة. سيكون لحجم الدفعة تأثير فقط على سرعة الإدخال/الإخراج لمجموعة البيانات.

مجموعات البيانات الكبيرة

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

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

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

كم عدد الأمثلة للاستخدام

يجب أن يتناسب مع الذاكرة الموجودة على الجهاز الذي يتم تدريب النموذج عليه :

  • لاحظ أن هذا ليس نفس حجم الأمثلة الموجودة على القرص.

  • كقاعدة عامة، تستخدم القيمة العددية أو الفئوية 4 بايت من الذاكرة. لذا، فإن مجموعة البيانات التي تحتوي على 100 ميزة و25 مليون مثال ستستهلك حوالي 10 جيجابايت (= 100 * 25 * 10 ^ 6 * 4 بايت) من الذاكرة.

  • تستهلك ميزات المجموعة الفئوية (مثل النص المميز) المزيد من الذاكرة (4 بايت لكل رمز مميز + 12 بايت لكل ميزة).

النظر في ميزانية وقت التدريب الخاص بك

  • على الرغم من أنها أسرع بشكل عام من NN لمجموعات البيانات الأصغر (على سبيل المثال <100 ألف أمثلة)، إلا أن خوارزميات تدريب DF لا تتوسع خطيًا مع حجم مجموعة البيانات؛ بدلاً من ذلك، ~O(features x num_examples x log(num_examples)) في معظم الحالات.

  • يعتمد وقت التدريب على المعلمات المفرطة. المعلمات الأكثر تأثيرًا هي: (1) عدد الأشجار ( num_trees )، (2) معدل أخذ العينات النموذجي ( subsample لـ GBT)، و (3) معدل أخذ عينات السمات ( num_candidate_attributes_ratio )

  • تعتبر ميزات المجموعة الفئوية أكثر تكلفة من الميزات الأخرى. يتم التحكم في التكلفة بواسطة المعلمة categorical_set_split_greedy_sampling .

  • تعطي الميزات المائلة المتفرقة (المعطلة افتراضيًا) نتائج جيدة ولكن حسابها مكلف.

القواعد الأساسية لتوسيع نطاق البيانات

نقترح البدء بشريحة صغيرة من البيانات (أقل من 10 آلاف أمثلة)، والتي من المفترض أن تسمح لك بتدريب نموذج TF-DF في ثوانٍ أو بضع دقائق في معظم الحالات. بعد ذلك، يمكنك زيادة البيانات بمعدل ثابت (على سبيل المثال، 40% أكثر في كل مرة)، والتوقف عندما لا يتحسن أداء مجموعة التحقق من الصحة أو عندما لا تتناسب مجموعة البيانات مع الذاكرة.

ميزة التطبيع / المعالجة المسبقة

لا تقم بتحويل البيانات باستخدام أعمدة الميزات

لا تتطلب نماذج TF-DF توفير دلالات وتحويلات مميزة بشكل صريح. افتراضيًا، سيتم اكتشاف جميع الميزات الموجودة في مجموعة البيانات (بخلاف التسمية) واستخدامها بواسطة النموذج. سيتم اكتشاف دلالات الميزات تلقائيًا، ويمكن تجاوزها يدويًا إذا لزم الأمر.

# Estimator code
- feature_columns = [
-   tf.feature_column.numeric_column(feature_1),
-   tf.feature_column.categorical_column_with_vocabulary_list(feature_2, ['First', 'Second', 'Third'])
-   ]
- model = tf.estimator.LinearClassifier(feature_columns=feature_columnes)
# Use all the available features. Detect the type automatically.
+ model = tfdf.keras.GradientBoostedTreesModel()

يمكنك أيضًا تحديد مجموعة فرعية من ميزات الإدخال:

+ features = [
+   tfdf.keras.FeatureUsage(name="feature_1"),
+   tfdf.keras.FeatureUsage(name="feature_2")
+   ]
+ model = tfdf.keras.GradientBoostedTreesModel(features=features, exclude_non_specified_features=True)

إذا لزم الأمر، يمكنك فرض دلالات الميزة.

+ forced_features = [
+   tfdf.keras.FeatureUsage(name="feature_1", semantic=tfdf.keras.FeatureSemantic.CATEGORICAL),
+   ]
+ model = tfdf.keras.GradientBoostedTreesModel(features=features)

الأساس المنطقي: في حين أن بعض النماذج (مثل الشبكات العصبية) تتطلب طبقة إدخال موحدة (على سبيل المثال، تعيينات من أنواع مختلفة من الميزات → التضمين)، يمكن لنماذج TF-DF أن تستهلك الميزات الفئوية والعددية محليًا، بالإضافة إلى الكشف التلقائي عن الأنواع الدلالية للميزات بناء على البيانات.

لا تقم بمعالجة الميزات مسبقًا

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

لا تطبيع الميزات العددية

- def zscore(value):
-   return (value-mean) / sd

- feature_columns = [tf.feature_column.numeric_column("feature_1",normalizer_fn=zscore)]

عقلاني: تدعم خوارزميات غابة القرار في الأصل الميزات العددية غير المقيسة، نظرًا لأن خوارزميات التقسيم لا تقوم بأي تحويل رقمي للمدخلات. بعض أنواع التسوية (مثل تسوية zscore) لن تساعد في تحقيق الاستقرار العددي لإجراءات التدريب، وبعضها (مثل القطع الخارجي) قد يضر بتعبير النموذج النهائي.

لا تقم بتشفير الميزات الفئوية (مثل التجزئة أو التشغيل السريع أو التضمين)

- integerized_column = tf.feature_column.categorical_column_with_hash_bucket("feature_1",hash_bucket_size=100)
- feature_columns = [tf.feature_column.indicator_column(integerized_column)]
- integerized_column = tf.feature_column.categorical_column_with_vocabulary_list('feature_1', ['bob', 'george', 'wanda'])
- feature_columns = [tf.feature_column.indicator_column(integerized_column)]

الأساس المنطقي: يتمتع TF-DF بدعم أصلي للميزات الفئوية، وسيتعامل مع عنصر المفردات "المحول" باعتباره مجرد عنصر آخر في مفرداته الداخلية (والتي يمكن تكوينها عبر المعلمات الفائقة للنموذج). قد تكون بعض التحويلات (مثل التجزئة) خاسرة. لا يتم دعم عمليات التضمين إلا إذا تم تدريبها مسبقًا، نظرًا لأن نماذج Decision Forest غير قابلة للتمييز (راجع colab الوسيطة ). لاحظ أن استراتيجيات المفردات الخاصة بالمجال (مثل إزالة كلمة التوقف، وتطبيع النص) قد تظل مفيدة.

كيفية التعامل مع ميزات النص

يدعم TF-DF ميزات المجموعة الفئوية محليًا. لذلك، يمكن استهلاك أكياس n-grams المميزة محليًا.

وبدلاً من ذلك، يمكن أيضًا استهلاك النص من خلال عملية التضمين المدربة مسبقًا .

تعد المجموعات الفئوية فعالة في استخدام العينات في مجموعات البيانات الصغيرة، ولكنها مكلفة للتدريب على مجموعات البيانات الكبيرة. غالبًا ما يؤدي الجمع بين المجموعات الفئوية والتضمين المدرب مسبقًا إلى نتائج أفضل مما لو تم استخدام أي منهما بمفرده.

لا تستبدل الميزات المفقودة بقيم سحرية

الأساس المنطقي: يتمتع TF-DF بدعم أصلي للقيم المفقودة. على عكس الشبكات العصبية، التي قد تنشر NaNs إلى التدرجات إذا كان هناك NaNs في الإدخال، فإن TF-DF سوف يتدرب على النحو الأمثل إذا لاحظت الخوارزمية الفرق بين القيمة المفقودة والقيمة الحارسة.

- feature_columns = [
- tf.feature_column.numeric_column("feature_1", default_value=0),
- tf.feature_column.numeric_column("feature_1_is_missing"),
- ]

التعامل مع الصور والسلاسل الزمنية

لا توجد خوارزمية قياسية لاستهلاك ميزات الصور أو السلاسل الزمنية في Decision Forests، لذا يلزم القيام ببعض العمل الإضافي لاستخدامها.

الأساس المنطقي: تعد خوارزميات الالتواء وLSTM والانتباه وغيرها من خوارزميات معالجة التسلسل من البنى الخاصة بالشبكة العصبية.

من الممكن التعامل مع هذه الميزات باستخدام الاستراتيجيات التالية:

  • هندسة الميزات

    • الصور: كان استخدام الصورة مع Random Forest شائعًا في مرحلة ما (على سبيل المثال

      Microsoft Kinect ، ولكن اليوم أصبحت الشبكات العصبية من أحدث التقنيات.

    • السلاسل الزمنية: يمكن أن تعمل [ الإحصائيات المتحركة ] بشكل مدهش بالنسبة لبيانات السلاسل الزمنية التي تحتوي على أمثلة قليلة نسبيًا (مثل العلامات الحيوية في المجال الطبي).

    • وحدات التضمين: يمكن أن توفر وحدات تضمين الشبكة العصبية ميزات غنية لخوارزمية غابة القرار. يوضح colab الوسيط كيفية الجمع بين تضمين tf-hub ونموذج TF-DF.

خط أنابيب التدريب

لا تستخدم مسرعات الأجهزة مثل GPU وTPU

لا يدعم تدريب TF-DF (حتى الآن) مسرعات الأجهزة. يتم إجراء كل التدريب والاستدلال على وحدة المعالجة المركزية (أحيانًا باستخدام SIMD).

لاحظ أن استنتاج TF-DF على وحدة المعالجة المركزية (خاصة عند تقديمه باستخدام مكتبات Yggdrasil C++) يمكن أن يكون سريعًا بشكل مدهش (أقل من ميكروثانية لكل مثال لكل نواة وحدة المعالجة المركزية).

لا تستخدم نقاط التفتيش أو الخطافات في منتصف التدريب

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

خطافات Keras التي تعتمد على خطوة التدريب لن تعمل أيضًا - نظرًا لطبيعة تدريب TF-DF، يتدرب النموذج في نهاية العصر الأول، وسيكون ثابتًا بعد ذلك العصر. تتوافق الخطوة فقط مع مجموعة البيانات I/O.

الحتمية النموذجية

تعتبر خوارزمية تدريب TF-DF حتمية، أي أن التدريب مرتين على نفس مجموعة البيانات سيعطي نفس النموذج بالضبط. وهذا يختلف عن الشبكات العصبية المدربة باستخدام TensorFlow. وللحفاظ على هذه الحتمية، يجب على المستخدمين التأكد من أن قراءات مجموعة البيانات حتمية أيضًا.

تكوين التدريب

حدد مهمة (مثل التصنيف والتصنيف) بدلاً من الخسارة (مثل الإنتروبيا الثنائية)

- model = tf_keras.Sequential()
- model.add(Dense(64, activation=relu))
- model.add(Dense(1)) # One output for binary classification

- model.compile(loss=tf_keras.losses.BinaryCrossentropy(from_logits=True),
-               optimizer='adam',
-               metrics=['accuracy'])
# The loss is automatically determined from the task.
+ model = tfdf.keras.GradientBoostedTreesModel(task=tf_keras.Task.CLASSIFICATION)

# Optional if you want to report the accuracy.
+ model.compile(metrics=['accuracy'])

الأساس المنطقي: لا تستخدم جميع خوارزميات التعلم TF-DF الخسارة. بالنسبة لأولئك الذين يقومون بذلك، يتم اكتشاف الخسارة تلقائيًا من المهمة وطباعتها في ملخص النموذج. يمكنك أيضًا تجاوزها باستخدام معلمة الخسارة المفرطة.

المعلمات المفرطة مستقرة لغويا

جميع المعلمات الفائقة لها قيم افتراضية. هذه القيم هي أول المرشحين المعقولين للمحاولة. يتم ضمان عدم تغيير قيم المعلمات الفائقة الافتراضية أبدًا. لهذا السبب، يتم تعطيل المعلمات الفائقة الجديدة أو تحسينات الخوارزمية بشكل افتراضي.

يمكن للمستخدمين الذين يرغبون في استخدام أحدث الخوارزميات، ولكنهم لا يريدون تحسين المعلمات الفائقة بأنفسهم، استخدام "قوالب المعلمات الفائقة" التي يوفرها TF-DF. سيتم إصدار قوالب المعلمات الفائقة الجديدة مع تحديثات الحزمة.

# Model with default hyper-parameters.
model = tfdf.keras.GradientBoostedTreesModel()

# List the hyper-parameters (with default value) and hyper-parameters templates of the GBT learning algorithm (in colab)
?tfdf.keras.GradientBoostedTreesModel

# Use a hyper-parameter template.
model = tfdf.keras.GradientBoostedTreesModel(hp_template="winner_1")

# Change one of the hyper-parameters.
model = tfdf.keras.GradientBoostedTreesModel(num_trees=500)

# List all the learning algorithms available
tfdf.keras.get_all_models()

تصحيح الأخطاء النموذجية

يعرض هذا القسم بعض الطرق التي يمكنك من خلالها عرض/تصحيح/تفسير النموذج. يحتوي colab للمبتدئين على مثال شامل.

ملخص نموذج بسيط

# Text description of the model, training logs, feature importances, etc.
model.summary()

سجلات التدريب و Tensorboard

# List of metrics
logs = model.make_inspector().training_logs()
print(logs)

أو باستخدام TensorBoard:

% load_ext
tensorboard
model.make_inspector().export_to_tensorboard("/tmp/tensorboard_logs")
% tensorboard - -logdir
"/tmp/tensorboard_logs"

أهمية الميزة

model.make_inspector().variable_importances()

رسم الأشجار

tfdf.model_plotter.plot_model_in_colab(model, tree_idx=0)

الوصول إلى هيكل الشجرة

tree = model.make_inspector().extract_tree(tree_idx=0)
print(tree)

(انظر كولاب المتقدمة )

لا تستخدم استراتيجيات توزيع TensorFlow

لا يدعم TF-DF بعد استراتيجيات توزيع TF. سيتم تجاهل إعدادات تعدد العمال، ولن يتم التدريب إلا على المدير.

- with tf.distribute.MirroredStrategy():
-    model = ...
+ model = ....

نماذج التراص

لا تقوم نماذج TF-DF بإعادة نشر التدرجات. ونتيجة لذلك، لا يمكن أن تتكون من نماذج NN إلا إذا تم تدريب الشبكات العصبية بالفعل.

الترحيل من tf.estimator.BoostedTrees {Classifier/Regressor/Estimator}

على الرغم من تشابههما، إلا أن الأشجار المعززة TF-DF وEstimator عبارة عن خوارزميات مختلفة. ينفذ TF-DF أوراق الغابة العشوائية الكلاسيكية وآلة تعزيز التدرج (باستخدام الأشجار) . إن tf.estimator.BoostedTreesEstimator عبارة عن خوارزمية تقريبية للأشجار المعززة بالتدرج مع إجراء تدريب دفعة صغيرة موصوف في هذه الورقة

تحتوي بعض المعلمات الفائقة على دلالات متشابهة (على سبيل المثال num_trees)، ولكن لها آثار جودة مختلفة. إذا قمت بضبط المعلمات الفائقة على tf.estimator.BoostedTreesEstimator، فستحتاج إلى إعادة ضبط المعلمات الفائقة داخل TF-DF للحصول على أفضل النتائج.

لمستخدمي يغدراسيل

Yggdrasil Decision Forest هي مكتبة التدريب والاستدلال الأساسية التي يستخدمها TF-DF. تكوينات ونماذج التدريب متوافقة بشكل متبادل (أي يمكن استخدام النماذج المدربة باستخدام TF-DF مع استدلال Yggdrasil).

ومع ذلك، فإن بعض خوارزميات Yggdrasil غير متوفرة (بعد) في TF-DF.

  • شجرة معززة متدرجة مع أخذ عينات مجزأة.