TensorFlow Decision Forests ( TF-DF ) مجموعه ای از الگوریتم های Decision Forest ( DF ) است که در TensorFlow موجود است. جنگلهای تصمیمگیری متفاوت از شبکههای عصبی ( NN ) کار میکنند: DFها معمولاً با انتشار پسپشتی یا در دستههای کوچک آموزش نمیدهند. بنابراین خطوط لوله 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)
دلیل: کاربران شبکههای عصبی به دلیل ماهیت SGD ، اغلب مدلی را برای N مرحله آموزش میدهند (که ممکن است شامل حلقه زدن بیش از یک بار در مجموعه داده باشد). TF-DF با خواندن کل مجموعه داده و سپس اجرای آموزش در پایان تمرین می کند. 1 دوره برای خواندن مجموعه داده کامل مورد نیاز است و هر مرحله اضافی منجر به ورودی/خروجی داده های غیر ضروری و همچنین آموزش کندتر می شود.
مجموعه داده را به هم نریزید
مجموعه داده ها نیازی به مخلوط کردن ندارند (مگر اینکه 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)، میتوانید میزان دادهها را مقیاسبندی کنید تا ببینید که مبادله محاسباتی کجا منطقی است. بنابراین، ایده خوبی است که ابتدا آموزش یک زیر مجموعه (کوچک) از مجموعه داده را امتحان کنید.
راه حل جایگزین استفاده از آموزش توزیع شده است. آموزش توزیع شده یک راه عالی برای افزایش اندازه مجموعه داده در صورت وجود چندین ماشین است. در حالی که همه الگوریتم های توزیع شده برای توزیع محاسبات در دسترس هستند، همه آنها قادر به توزیع استفاده از RAM نیستند. برای جزئیات بیشتر اسناد را بررسی کنید.
چند مثال برای استفاده
باید در حافظه دستگاهی که مدل در حال آموزش در آن است قرار گیرد :
توجه داشته باشید که این اندازه با نمونه های روی دیسک یکسان نیست.
به عنوان یک قاعده کلی، یک مقدار عددی یا مقوله ای از 4 بایت حافظه استفاده می کند. بنابراین، یک مجموعه داده با 100 ویژگی و 25 میلیون نمونه، 10 گیگابایت (= 100 * 25 * 10^6 * 4 بایت) حافظه خواهد داشت.
ویژگیهای دستهبندیشده (مثلاً متن نشانهگذاریشده) حافظه بیشتری را اشغال میکنند (4 بایت در هر نشانه + 12 بایت در هر ویژگی).
بودجه زمان آموزش خود را در نظر بگیرید
در حالی که به طور کلی سریعتر از NN برای مجموعه داده های کوچکتر (به عنوان مثال <100k مثال)، الگوریتم های آموزشی DF به صورت خطی با اندازه مجموعه داده مقیاس نمی شوند. بلکه، ~O (ویژگی های x num_examples x log(num_examples)) در اکثر موارد.
زمان آموزش به پارامترهای فوق بستگی دارد. تأثیرگذارترین پارامترها عبارتند از: (1) تعداد درختان (
num_trees
)، (2) نرخ نمونهبرداری نمونه (subsample
برای GBT)، و (3) نرخ نمونهبرداری ویژگی (num_candidate_attributes_ratio
)ویژگیهای دستهبندیشده گرانتر از سایر ویژگیها هستند. هزینه توسط پارامتر
categorical_set_split_greedy_sampling
کنترل می شود.ویژگیهای Sparse Oblique (به طور پیشفرض غیرفعال شده) نتایج خوبی به دست میدهد اما محاسبه آن گران است.
قوانین کلی برای افزایش مقیاس داده ها
ما پیشنهاد می کنیم با یک تکه کوچک از داده ها (<1000 مثال) شروع کنید، که به شما امکان می دهد یک مدل 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-گرم توکن شده را می توان به صورت بومی مصرف کرد.
متناوباً میتواند از طریق جاسازی از پیش آموزشدیده نیز مصرف شود.
مجموعههای دستهبندی در مجموعه دادههای کوچک نمونه کارآمد هستند، اما آموزش روی مجموعه دادههای بزرگ گران است. ترکیب مجموعههای دستهبندی و تعبیه از قبل آموزشدیده اغلب میتواند نتایج بهتری نسبت به زمانی که هر کدام به تنهایی استفاده شود، به همراه داشته باشد.
ویژگی های از دست رفته را با مقادیر جادویی جایگزین نکنید
دلیل: TF-DF دارای پشتیبانی بومی برای مقادیر از دست رفته است. برخلاف شبکههای عصبی، که ممکن است در صورت وجود NaN در ورودی، NaNها را به گرادیانها منتشر کنند، اگر الگوریتم تفاوت بین مقدار گمشده و یک مقدار نگهبان را ببیند، 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 در برخی مواقع رایج بود (به عنوان مثال
مایکروسافت کینکت ، اما امروزه، شبکه های عصبی پیشرفته هستند.
سری های زمانی: [ آمار متحرک ] می تواند برای داده های سری زمانی که نمونه های نسبتا کمی دارند (مثلاً علائم حیاتی در حوزه پزشکی) به طرز شگفت آوری خوب کار کند.
ماژولهای تعبیهشده: ماژولهای تعبیهشده در شبکه عصبی میتوانند ویژگیهای غنی را برای الگوریتم جنگل تصمیمگیری فراهم کنند. کولب میانی نشان می دهد که چگونه می توان تعبیه یک هاب tf و مدل TF-DF را ترکیب کرد.
خط لوله آموزشی
از شتاب دهنده های سخت افزاری مانند GPU، TPU استفاده نکنید
آموزش TF-DF (هنوز) از شتاب دهنده های سخت افزاری پشتیبانی نمی کند. تمام آموزش ها و استنباط ها بر روی CPU انجام می شود (گاهی اوقات با استفاده از SIMD).
توجه داشته باشید که استنتاج TF-DF بر روی CPU (به ویژه زمانی که با استفاده از کتابخانه های Yggdrasil C++ ارائه می شود) می تواند به طرز شگفت انگیزی سریع باشد (زیر میکروثانیه در هر نمونه در هر هسته cpu).
از قلاب های بازرسی یا میانه تمرین استفاده نکنید
TF-DF (در حال حاضر) از checkpointing مدل پشتیبانی نمی کند، به این معنی که قلاب هایی که انتظار دارند مدل قبل از تکمیل آموزش قابل استفاده باشد، عمدتاً پشتیبانی نمی شوند. این مدل تنها پس از آموزش تعداد درختان درخواستی (یا توقف زود هنگام) در دسترس خواهد بود.
قلابهای Keras با تکیه بر مرحله آموزش نیز کار نمیکنند - به دلیل ماهیت آموزش TF-DF، مدل در پایان دوره اول تمرین میکند و پس از آن دوره ثابت خواهد بود. مرحله فقط با مجموعه داده ورودی/خروجی مطابقت دارد.
جبرگرایی مدل
الگوریتم آموزشی 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()
اشکال زدایی مدل
این بخش راه هایی را ارائه می دهد که می توانید مدل را نگاه کنید/اشکال زدایی/تفسیر کنید. کولب مبتدی شامل یک مثال سرتاسری است.
خلاصه مدل ساده
# 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)
(به colab پیشرفته مراجعه کنید)
از استراتژی های توزیع TensorFlow استفاده نکنید
TF-DF هنوز از استراتژی های توزیع TF پشتیبانی نمی کند. تنظیمات چندکاره نادیده گرفته می شود و آموزش فقط روی مدیر انجام می شود.
- with tf.distribute.MirroredStrategy():
- model = ...
+ model = ....
مدل های انباشته
مدل های TF-DF شیب ها را پس انتشار نمی دهند. در نتیجه، آنها را نمی توان با مدل های NN ترکیب کرد، مگر اینکه NN ها قبلاً آموزش داده شده باشند.
مهاجرت از tf.estimator.BoostedTrees {Classifier/Regressor/Estimator}
علیرغم اینکه شبیه به نظر می رسد، درختان تقویت شده TF-DF و برآوردگر الگوریتم های متفاوتی هستند. TF-DF کاغذهای کلاسیک Random Forest و Gradient Boosted Machine (با استفاده از Trees) را پیاده سازی می کند. tf.estimator.BoostedTreesEstimator یک الگوریتم تقریبی Gradient Boosted Trees با یک روش آموزشی مینی دسته ای است که در این مقاله توضیح داده شده است.
برخی از فراپارامترها معنایی مشابهی دارند (مثلاً num_trees)، اما مفاهیم کیفیت متفاوتی دارند. اگر هایپرپارامترها را در tf.estimator.BoostedTreesEstimator خود تنظیم کرده اید، برای به دست آوردن نتایج بهینه، باید هایپرپارامترهای خود را در TF-DF دوباره تنظیم کنید.
برای کاربران Yggdrasil
Yggdrasil Decision Forest هسته اصلی آموزش و کتابخانه استنتاج مورد استفاده توسط TF-DF است. پیکربندی و مدل های آموزشی با یکدیگر سازگار هستند (یعنی مدل های آموزش دیده با TF-DF را می توان با استنتاج Yggdrasil استفاده کرد).
با این حال، برخی از الگوریتمهای Yggdrasil (هنوز) در TF-DF موجود نیستند.
- درخت تقویتشده با گرادیان با نمونهبرداری خرد شده.