신경망에서 마이그레이션

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 프레임워크는 여러 알고리즘으로 구성됩니다. 그 중 일부는 검증 데이터 세트(예: Random Forest)를 사용하지 않는 반면 일부는 사용합니다(예: Gradient Boosted Trees). 다양한 유형과 크기의 검증 데이터 세트를 활용하는 알고리즘이 도움이 될 수 있습니다. 따라서 검증 데이터 세트가 필요한 경우 훈련 데이터 세트에서 자동으로 추출됩니다.

데이터세트 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 사용량을 분산할 수 있는 것은 아닙니다. 자세한 내용은 설명서를 확인하세요.

사용할 예제 수

모델이 훈련 중인 머신의 메모리에 맞아야 합니다 .

  • 이는 디스크에 있는 예제의 크기와 동일하지 않습니다.

  • 경험상 하나의 숫자 또는 범주형 값은 4바이트의 메모리를 사용합니다. 따라서 100개의 특성과 2,500만 개의 예시가 포함된 데이터 세트는 ~10GB(= 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 매개변수에 의해 제어됩니다.

  • Sparse Oblique 기능(기본적으로 비활성화됨)은 좋은 결과를 제공하지만 계산 비용이 많이 듭니다.

데이터 확장을 위한 경험 법칙

대부분의 경우 몇 초 또는 몇 분 안에 TF-DF 모델을 학습할 수 있도록 작은 데이터 조각(<10,000개 예시)부터 시작하는 것이 좋습니다. 그런 다음 고정된 비율(예: 매번 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-gram 백을 기본적으로 사용할 수 있습니다.

또는 사전 훈련된 임베딩을 통해 텍스트를 사용할 수도 있습니다.

범주형 세트는 작은 데이터세트에서는 표본 효율적이지만 대규모 데이터세트에서는 훈련하는 데 비용이 많이 듭니다. 범주형 세트와 사전 훈련된 임베딩을 결합하면 둘 중 하나만 사용하는 것보다 더 나은 결과를 얻을 수 있는 경우가 많습니다.

누락된 기능을 마법의 값으로 대체하지 마세요

근거: 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, Attention 및 기타 시퀀스 처리 알고리즘은 신경망 특정 아키텍처입니다.

다음 전략을 사용하여 이러한 기능을 처리할 수 있습니다.

  • 기능 엔지니어링

    • 이미지: Random Forest에서 이미지를 사용하는 것은 어느 시점에서 인기가 있었습니다(예:

      Microsoft Kinect 이지만 오늘날 신경망은 최첨단입니다.

    • 시계열: [ 이동 통계 ]는 예시가 상대적으로 적은 시계열 데이터(예: 의료 영역의 활력 징후)에 놀라울 정도로 잘 작동할 수 있습니다.

    • 임베딩 모듈: 신경망 임베딩 모듈은 의사결정 포리스트 알고리즘을 위한 풍부한 기능을 제공할 수 있습니다. 중간 Colab에서는 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 훈련 알고리즘은 결정적입니다. 즉, 동일한 데이터 세트에 대해 두 번 훈련하면 완전히 동일한 모델이 제공됩니다. 이는 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()

훈련 로그 및 텐서보드

# 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와 Estimator Boosted Tree는 다른 알고리즘입니다. TF-DF는 고전적인 Random ForestGradient Boosted Machine(트리 사용) 논문을 구현합니다. tf.estimator.BoostedTreesEstimator는 이 문서 에 설명된 미니 배치 훈련 절차를 갖춘 대략적인 Gradient Boosted Trees 알고리즘입니다.

일부 하이퍼 매개변수는 유사한 의미(예: num_trees)를 갖지만 품질에 다른 영향을 미칩니다. tf.estimator.BoostedTreesEstimator에서 하이퍼파라미터를 조정한 경우 최적의 결과를 얻으려면 TF-DF 내에서 하이퍼파라미터를 다시 조정해야 합니다.

이그드라실 사용자의 경우

Yggdrasil Decision Forest는 TF-DF에서 사용하는 핵심 훈련 및 추론 라이브러리입니다. 훈련 구성과 모델은 상호 호환됩니다(예: TF-DF로 훈련된 모델을 Yggdrasil 추론과 함께 사용할 수 있음).

그러나 일부 Yggdrasil 알고리즘은 (아직) TF-DF에서 사용할 수 없습니다.

  • 샤딩 샘플링을 사용한 그래디언트 부스팅 트리.