ニューラルネットワークからの移行

TensorFlow デシジョン フォレスト( TF-DF ) は、TensorFlow で利用可能なデシジョン フォレスト ( DF ) アルゴリズムのコレクションです。デシジョン フォレストはニューラル ネットワーク ( NN ) とは動作が異なります。通常、DF はバックプロパゲーションやミニバッチでトレーニングしません。したがって、TF-DF パイプラインには他の TensorFlow パイプラインとはいくつかの違いがあります。

このドキュメントはそれらの相違点のリストであり、TF-DF を使用するように TF パイプラインを更新するためのガイドです。

このドキュメントは、初心者 colabに精通していることを前提としています。

データセットと特徴

検証データセット

標準のニューラル ネットワーク トレーニング パラダイムとは異なり、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 フレームワークは複数のアルゴリズムで構成されています。検証データセットを使用しないもの (ランダム フォレストなど) もあれば、使用するものもあります (勾配ブースト ツリーなど)。これを行うアルゴリズムは、さまざまな種類とサイズの検証データセットから恩恵を受ける可能性があります。したがって、検証データセットが必要な場合は、トレーニング データセットから自動的に抽出されます。

データセットI/O

正確に 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 ステップ (データセットを 1 回以上ループすることを伴う場合があります) でトレーニングします。 TF-DF は、データセット全体を読み取り、最後にトレーニングを実行することによってトレーニングします。データセット全体を読み取るには 1 エポックが必要で、余分なステップがあると不必要なデータ I/O が発生し、トレーニングが遅くなります。

データセットをシャッフルしないでください

データセットをシャッフルする必要はありません (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 のようなミニバッチ トレーニング アルゴリズムとは異なります)。したがって、ハイパーパラメータ スイープから削除する必要があります。バッチ サイズは、データセット I/O の速度にのみ影響します。

大規模なデータセット

大規模なデータセットのミニバッチを無限にループできるニューラル ネットワークとは異なり、デシジョン フォレストでは、トレーニング手順のためにメモリに収まる有限のデータセットが必要です。データセットのサイズは、パフォーマンスとメモリに影響します。

データセットのサイズを増やすと利益は減少し、DF アルゴリズムはおそらく、大規模な NN モデルよりも収束に必要なサンプルが少なくなります。 (NN のように) トレーニング ステップの数をスケーリングする代わりに、データ量をスケーリングして、計算のトレードオフがどこに意味があるのか​​を確認してみることができます。したがって、最初にデータセットの (小さな) サブセットでトレーニングを試みることをお勧めします。

別の解決策は、分散トレーニングを使用することです。分散トレーニングは、複数のマシンが利用可能な場合にデータセットのサイズを増やす優れた方法です。すべての分散アルゴリズムは計算を分散するために使用できますが、すべての分散アルゴリズムが RAM 使用量を分散できるわけではありません。詳細については、ドキュメントを確認してください。

使用する例の数

これは、モデルがトレーニングされているマシンのメモリに収まるはずです

  • これはディスク上のサンプルのサイズと同じではないことに注意してください。

  • 経験則として、1 つの数値またはカテゴリ値は 4 バイトのメモリを使用します。したがって、100 の特徴と 2,500 万のサンプルを含むデータセットには、最大 10 GB (= 100 * 25 *10^6 * 4 バイト) のメモリが必要になります。

  • カテゴリセットの特徴 (トークン化されたテキストなど) はより多くのメモリを必要とします (トークンごとに 4 バイト + 特徴ごとに 12 バイト)。

トレーニング時間の予算を考慮する

  • 一般に、小さいデータセット (例: 100,000 個未満のサンプル) では NN よりも高速ですが、DF トレーニング アルゴリズムはデータセットのサイズに応じて線形にスケールしません。むしろ、ほとんどの場合、~O(features x num_examples x log(num_examples)) になります。

  • トレーニング時間はハイパーパラメータによって異なります。最も影響力のあるパラメーターは次のとおりです: (1) ツリーの数 ( num_trees )、(2) サンプル サンプリング レート (GBT のsubsample )、および (3) 属性サンプリング レート ( num_candidate_attributes_ratio )

  • カテゴリセットの特徴は、他の特徴よりも高価です。コストはcategorical_set_split_greedy_samplingパラメーターによって制御されます。

  • スパースオブリーク特徴 (デフォルトで無効) は良好な結果をもたらしますが、計算コストが高くなります。

データをスケールアップするための経験則

データの小さなスライス (サンプル数 10,000 未満) から始めることをお勧めします。これにより、ほとんどの場合、数秒または数分で 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 はカテゴリ特徴量をネイティブにサポートしており、「変換された」語彙項目を内部語彙 (モデルのハイパーパラメーターを介して構成可能) 内の単なる別の項目として扱います。一部の変換 (ハッシュなど) には損失が発生する可能性があります。デシジョン フォレスト モデルは微分可能ではないため、事前トレーニングされていない限り、埋め込みはサポートされません (中間 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"),
- ]

画像と時系列の処理

デシジョン フォレストには画像または時系列の特徴を使用するための標準アルゴリズムがないため、それらを使用するには追加の作業が必要です。

理論的根拠:畳み込み、LSTM、attention およびその他のシーケンス処理アルゴリズムは、ニューラル ネットワーク固有のアーキテクチャです。

次の戦略を使用してこれらの機能を処理できます。

  • 特徴量エンジニアリング

    • 画像: ランダム フォレストで画像を使用することは、ある時点で人気がありました (例:

      Microsoft Kinectですが、今日ではニューラル ネットが最先端です。

    • 時系列: [移動統計] は、例が比較的少ない時系列データ (医療分野のバイタル サインなど) では驚くほどうまく機能します。

    • 埋め込みモジュール: ニューラル ネットワーク埋め込みモジュールは、デシジョン フォレスト アルゴリズムに豊富な機能を提供できます。中間のコラボでは、 tf-hub 埋め込みと TF-DF モデルを組み合わせる方法を示します。

トレーニング パイプライン

GPU、TPUなどのハードウェアアクセラレータを使用しないでください。

TF-DF トレーニングは (まだ) ハードウェア アクセラレータをサポートしていません。すべてのトレーニングと推論は CPU 上で行われます (SIMD を使用する場合もあります)。

CPU での TF-DF 推論 (特に Yggdrasil C++ ライブラリを使用して提供される場合) は驚くほど高速になる可能性があることに注意してください (CPU コアごとのサンプルあたりサブマイクロ秒)。

チェックポイント設定やトレーニング中のフックを使用しないでください

TF-DF は (現在) モデルのチェックポイントをサポートしていません。つまり、トレーニングが完了する前にモデルが使用可能であることを期待するフックはほとんどサポートされていません。モデルは、要求された数のツリーをトレーニングした後 (または早期に停止した後) にのみ使用可能になります。

トレーニング ステップに依存する Keras フックも機能しません。TF-DF トレーニングの性質により、モデルは最初のエポックの終わりにトレーニングされ、そのエポック以降は一定になります。このステップはデータセット I/O にのみ対応します。

モデル決定論

TF-DF トレーニング アルゴリズムは決定論的です。つまり、同じデータセットで 2 回トレーニングすると、まったく同じモデルが得られます。これは、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)

(高度な colabを参照)

TensorFlow 配布戦略を使用しないでください

TF-DF は、TF 配布戦略をまだサポートしていません。マルチワーカーの設定は無視され、トレーニングはマネージャーに対してのみ行われます。

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

スタッキングモデル

TF-DF モデルは勾配を逆伝播しません。そのため、NN がすでにトレーニングされていない限り、NN モデルを使用して構成することはできません。

tf.estimator.BoostedTrees {分類子/リグレッサー/推定子} からの移行

似ているように聞こえますが、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 では利用できません。

  • シャード サンプリングを使用したグラデーション ブースト ツリー。