Di chuyển từ mạng thần kinh

Rừng quyết định TensorFlow ( TF-DF ) là tập hợp các thuật toán Rừng quyết định ( DF ) có sẵn trong TensorFlow. Rừng quyết định hoạt động khác với Mạng thần kinh ( NN ): DF thường không huấn luyện bằng phương pháp lan truyền ngược hoặc theo đợt nhỏ. Do đó, đường ống TF-DF có một số điểm khác biệt so với các đường ống TensorFlow khác.

Tài liệu này là danh sách những khác biệt đó và hướng dẫn cập nhật quy trình TF để sử dụng TF-DF

Tài liệu này giả định bạn đã quen với colab dành cho người mới bắt đầu .

Bộ dữ liệu và tính năng

Tập dữ liệu xác thực

Không giống như mô hình đào tạo Mạng thần kinh tiêu chuẩn, các mô hình TF-DF không cần tập dữ liệu xác thực để giám sát việc trang bị quá mức hoặc ngừng đào tạo sớm. Nếu bạn đã có phần tách đào tạo/xác thực/kiểm tra và bạn đang sử dụng phân tách xác thực vì một trong những lý do đó, thì việc huấn luyện TF-DF của bạn về đào tạo+xác thực là an toàn (trừ khi phân tách xác thực cũng được sử dụng cho mục đích khác, như điều chỉnh siêu tham số).

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

# Or just don't create a validation dataset

Cơ sở lý luận: Khung TF-DF bao gồm nhiều thuật toán. Một số trong số chúng không sử dụng tập dữ liệu xác thực (ví dụ: Rừng ngẫu nhiên) trong khi một số khác thì sử dụng (ví dụ: Cây tăng cường độ dốc). Các thuật toán có thể được hưởng lợi từ các loại và kích thước khác nhau của bộ dữ liệu xác thực. Do đó, nếu cần một tập dữ liệu xác thực, nó sẽ được trích xuất tự động từ tập dữ liệu huấn luyện.

I/O tập dữ liệu

Huấn luyện đúng 1 kỷ nguyên

# 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)

Cơ sở lý luận: Người dùng mạng thần kinh thường huấn luyện một mô hình cho N bước (có thể liên quan đến việc lặp qua tập dữ liệu > 1 lần), do tính chất của SGD . TF-DF huấn luyện bằng cách đọc toàn bộ tập dữ liệu rồi chạy huấn luyện ở cuối. Cần 1 epoch để đọc toàn bộ tập dữ liệu và mọi bước bổ sung sẽ dẫn đến I/O dữ liệu không cần thiết cũng như quá trình đào tạo chậm hơn.

Đừng xáo trộn tập dữ liệu

Các tập dữ liệu không cần phải xáo trộn (trừ khi input_fn chỉ đọc một mẫu của tập dữ liệu).

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

Lý do: TF-DF xáo trộn quyền truy cập vào dữ liệu nội bộ sau khi đọc toàn bộ tập dữ liệu vào bộ nhớ. Thuật toán TF-DF mang tính xác định (nếu người dùng không thay đổi hạt giống ngẫu nhiên). Việc kích hoạt tính năng xáo trộn sẽ chỉ làm cho thuật toán không mang tính xác định. Việc xáo trộn sẽ có ý nghĩa nếu tập dữ liệu đầu vào được sắp xếp và input_fn sẽ chỉ đọc một mẫu của nó (mẫu phải là ngẫu nhiên). Tuy nhiên, điều này sẽ làm cho quá trình đào tạo không mang tính quyết định.

Không điều chỉnh kích thước lô

Kích thước lô sẽ không ảnh hưởng đến chất lượng mô hình

- 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)

Lý do: Vì TF-DF luôn được huấn luyện trên toàn bộ tập dữ liệu sau khi đọc nên chất lượng mô hình sẽ không thay đổi tùy theo kích thước lô (không giống như các thuật toán huấn luyện lô nhỏ như SGD trong đó các tham số như tốc độ học cần phải được điều chỉnh cùng nhau). Vì vậy, nó nên được loại bỏ khỏi quá trình quét siêu tham số. Kích thước lô sẽ chỉ có tác động đến tốc độ I/O của tập dữ liệu.

Bộ dữ liệu lớn

Không giống như các mạng thần kinh, có thể lặp vô hạn các lô nhỏ của một tập dữ liệu lớn, các khu rừng quyết định yêu cầu một tập dữ liệu hữu hạn phù hợp với bộ nhớ cho quy trình huấn luyện của chúng. Kích thước của tập dữ liệu có ý nghĩa về hiệu suất và bộ nhớ.

Lợi nhuận giảm dần khi tăng kích thước của tập dữ liệu và các thuật toán DF được cho là cần ít ví dụ hơn để hội tụ so với các mô hình NN lớn. Thay vì chia tỷ lệ số bước huấn luyện (như trong NN), bạn có thể thử chia tỷ lệ lượng dữ liệu để xem sự cân bằng điện toán có ý nghĩa ở đâu. Do đó, trước tiên bạn nên thử huấn luyện trên một tập hợp con (nhỏ) của tập dữ liệu.

Giải pháp thay thế là sử dụng đào tạo phân tán . Đào tạo phân tán là một cách tuyệt vời để tăng kích thước của tập dữ liệu nếu có sẵn nhiều máy. Mặc dù tất cả các thuật toán phân tán đều có sẵn để phân phối tính toán nhưng không phải tất cả chúng đều có thể phân phối mức sử dụng RAM. Kiểm tra tài liệu để biết thêm chi tiết.

Có bao nhiêu ví dụ để sử dụng

Nó phải vừa với bộ nhớ trên máy mà mô hình đang đào tạo :

  • Lưu ý rằng kích thước này không giống với kích thước của các ví dụ trên đĩa.

  • Theo nguyên tắc chung, một giá trị số hoặc phân loại sử dụng 4 byte bộ nhớ. Vì vậy, một tập dữ liệu có 100 tính năng và 25 triệu ví dụ sẽ chiếm ~ 10GB (= 100 * 25 *10^6 * 4 byte) bộ nhớ.

  • Các tính năng được thiết lập theo phân loại (ví dụ: văn bản được mã hóa) chiếm nhiều bộ nhớ hơn (4 byte cho mỗi mã thông báo + 12 byte cho mỗi tính năng).

Xem xét ngân sách thời gian đào tạo của bạn

  • Mặc dù nhìn chung nhanh hơn NN đối với các tập dữ liệu nhỏ hơn (ví dụ: <100k ví dụ), thuật toán đào tạo DF không chia tỷ lệ tuyến tính theo kích thước tập dữ liệu; đúng hơn, ~O(features x num_examples x log(num_examples)) trong hầu hết các trường hợp.

  • Thời gian đào tạo phụ thuộc vào các siêu tham số. Các thông số có tác động mạnh nhất là: (1) số lượng cây ( num_trees ), (2) tốc độ lấy mẫu mẫu ( subsample cho GBT) và (3) tốc độ lấy mẫu thuộc tính ( num_candidate_attributes_ratio )

  • Các tính năng được phân loại đắt hơn các tính năng khác. Chi phí được kiểm soát bởi tham số categorical_set_split_greedy_sampling .

  • Các tính năng Xiên thưa thớt (bị tắt theo mặc định) cho kết quả tốt nhưng tốn kém khi tính toán.

Quy tắc chung để mở rộng quy mô dữ liệu

Chúng tôi khuyên bạn nên bắt đầu với một phần dữ liệu nhỏ (<10 nghìn ví dụ), điều này sẽ cho phép bạn huấn luyện mô hình TF-DF trong vài giây hoặc vài phút trong hầu hết các trường hợp. Sau đó, bạn có thể tăng dữ liệu ở tốc độ cố định (ví dụ: tăng thêm 40% mỗi lần), dừng khi hiệu suất của bộ xác thực không được cải thiện hoặc tập dữ liệu không còn vừa trong bộ nhớ.

Chuẩn hóa/Tiền xử lý tính năng

Không chuyển đổi dữ liệu bằng các cột tính năng

Các mô hình TF-DF không yêu cầu cung cấp rõ ràng ngữ nghĩa và chuyển đổi tính năng. Theo mặc định, tất cả các tính năng trong tập dữ liệu (trừ nhãn) sẽ được mô hình phát hiện và sử dụng. Ngữ nghĩa của tính năng sẽ được tự động phát hiện và có thể được ghi đè theo cách thủ công nếu cần.

# 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()

Bạn cũng có thể chỉ định một tập hợp con các tính năng đầu vào:

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

Nếu cần, bạn có thể buộc ngữ nghĩa của một tính năng.

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

Cơ sở lý luận: Trong khi một số mô hình nhất định (như Mạng thần kinh) yêu cầu lớp đầu vào được tiêu chuẩn hóa (ví dụ: ánh xạ từ các loại tính năng khác nhau → phần nhúng), các mô hình TF-DF có thể sử dụng các tính năng phân loại và số nguyên bản, cũng như tự động phát hiện các loại ngữ nghĩa của các tính năng dựa trên dữ liệu.

Không xử lý trước các tính năng

Các thuật toán cây quyết định không được hưởng lợi từ một số tính năng tiền xử lý cổ điển được sử dụng cho Mạng thần kinh. Dưới đây, một số chiến lược xử lý tính năng phổ biến hơn được liệt kê rõ ràng, nhưng điểm khởi đầu an toàn là loại bỏ tất cả quá trình xử lý trước được thiết kế để hỗ trợ đào tạo mạng thần kinh.

Không bình thường hóa các đặc tính số

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

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

Hợp lý: Các thuật toán rừng quyết định về cơ bản hỗ trợ các tính năng số không chuẩn hóa, do các thuật toán phân tách không thực hiện bất kỳ phép biến đổi số nào của đầu vào. Một số loại chuẩn hóa (ví dụ chuẩn hóa zscore) sẽ không giúp ổn định số của quy trình huấn luyện và một số (ví dụ cắt bớt ngoại lệ) có thể ảnh hưởng đến tính biểu cảm của mô hình cuối cùng.

Không mã hóa các tính năng phân loại (ví dụ: băm, một nóng hoặc nhúng)

- 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)]

Cơ sở lý luận: TF-DF có hỗ trợ riêng cho các tính năng phân loại và sẽ coi một mục từ vựng “được chuyển đổi” chỉ là một mục khác trong từ vựng nội bộ của nó (có thể được định cấu hình thông qua siêu tham số mô hình). Một số phép biến đổi (như băm) có thể bị mất. Các phần nhúng không được hỗ trợ trừ khi chúng được đào tạo trước, vì các mô hình Rừng quyết định không thể phân biệt được (xem colab trung gian ). Lưu ý rằng các chiến lược từ vựng dành riêng cho từng miền (ví dụ: loại bỏ từ khóa, chuẩn hóa văn bản) vẫn có thể hữu ích.

Cách xử lý các tính năng văn bản

TF-DF hỗ trợ các tính năng được thiết lập theo phân loại nguyên bản . Do đó, các túi n-gram được mã hóa có thể được tiêu thụ nguyên bản.

Ngoài ra, văn bản cũng có thể được sử dụng thông qua nhúng được đào tạo trước .

Các tập phân loại có hiệu quả lấy mẫu trên các tập dữ liệu nhỏ, nhưng tốn kém khi huấn luyện trên các tập dữ liệu lớn. Việc kết hợp các tập hợp phân loại và nhúng được đào tạo trước thường có thể mang lại kết quả tốt hơn so với việc chỉ sử dụng một trong hai.

Không thay thế các tính năng bị thiếu bằng các giá trị kỳ diệu

Lý do: TF-DF có hỗ trợ riêng cho các giá trị bị thiếu. Không giống như các mạng thần kinh, có thể truyền NaN tới các gradient nếu có NaN trong đầu vào, TF-DF sẽ huấn luyện tối ưu nếu thuật toán nhận thấy sự khác biệt giữa giá trị bị thiếu và giá trị trọng tâm.

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

Xử lý hình ảnh và chuỗi thời gian

Không có thuật toán tiêu chuẩn nào để sử dụng các tính năng hình ảnh hoặc chuỗi thời gian trong Rừng Quyết định, vì vậy cần phải thực hiện thêm một số công việc để sử dụng chúng.

Cơ sở lý luận: Convolution, LSTM, sự chú ý và các thuật toán xử lý trình tự khác là các kiến ​​trúc dành riêng cho mạng thần kinh.

Có thể xử lý các tính năng này bằng các chiến lược sau:

  • Kỹ thuật tính năng

    • Hình ảnh: Việc sử dụng hình ảnh với Random Forest đã phổ biến ở một thời điểm nào đó (ví dụ:

      Microsoft Kinect , nhưng ngày nay, mạng lưới thần kinh là công nghệ tiên tiến nhất.

    • Chuỗi thời gian: [ Thống kê di chuyển ] có thể hoạt động tốt một cách đáng ngạc nhiên đối với dữ liệu chuỗi thời gian có tương đối ít ví dụ (ví dụ: các dấu hiệu quan trọng trong lĩnh vực y tế).

    • Mô-đun nhúng: Các mô-đun nhúng mạng thần kinh có thể cung cấp các tính năng phong phú cho thuật toán rừng quyết định. Colab trung gian cho thấy cách kết hợp mô hình nhúng tf-hub và mô hình TF-DF.

Quy trình đào tạo

Không sử dụng các bộ tăng tốc phần cứng như GPU, TPU

Đào tạo TF-DF không (chưa) hỗ trợ bộ tăng tốc phần cứng. Tất cả việc đào tạo và suy luận được thực hiện trên CPU (đôi khi sử dụng SIMD).

Lưu ý rằng suy luận TF-DF trên CPU (đặc biệt là khi được cung cấp bằng thư viện Yggdrasil C++) có thể nhanh đến mức đáng ngạc nhiên (dưới micro giây cho mỗi ví dụ trên mỗi lõi cpu).

Không sử dụng móc kiểm tra hoặc móc giữa quá trình luyện tập

TF-DF không (hiện tại) hỗ trợ điểm kiểm tra mô hình, có nghĩa là các hook mong đợi mô hình có thể sử dụng được trước khi quá trình đào tạo hoàn tất phần lớn không được hỗ trợ. Mô hình sẽ chỉ khả dụng sau khi huấn luyện đủ số cây được yêu cầu (hoặc dừng sớm).

Các hook Keras dựa vào bước huấn luyện cũng sẽ không hoạt động – do tính chất của quá trình huấn luyện TF-DF, mô hình sẽ huấn luyện vào cuối kỷ nguyên đầu tiên và sẽ không đổi sau kỷ nguyên đó. Bước này chỉ tương ứng với tập dữ liệu I/O.

Chủ nghĩa quyết định mô hình

Thuật toán huấn luyện TF-DF có tính xác định, tức là huấn luyện hai lần trên cùng một tập dữ liệu sẽ cho cùng một mô hình. Điều này khác với các mạng thần kinh được đào tạo bằng TensorFlow. Để duy trì tính xác định này, người dùng nên đảm bảo rằng việc đọc tập dữ liệu cũng mang tính xác định.

Cấu hình đào tạo

Chỉ định một nhiệm vụ (ví dụ: phân loại, xếp hạng) thay vì mất mát (ví dụ: entropy chéo nhị phân)

- 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'])

Cơ sở lý luận: Không phải tất cả các thuật toán học TF-DF đều sử dụng mất mát. Đối với những trường hợp đó, tổn thất sẽ tự động được phát hiện từ tác vụ và được in trong bản tóm tắt mô hình. Bạn cũng có thể ghi đè nó bằng siêu tham số mất.

Siêu tham số ổn định về mặt ngữ nghĩa

Tất cả các siêu tham số đều có giá trị mặc định. Những giá trị đó là những ứng cử viên hợp lý đầu tiên để thử. Giá trị siêu tham số mặc định được đảm bảo không bao giờ thay đổi. Vì lý do này, các cải tiến thuật toán hoặc siêu thông số mới bị tắt theo mặc định.

Người dùng muốn sử dụng các thuật toán mới nhất nhưng không muốn tự tối ưu hóa siêu tham số có thể sử dụng "mẫu siêu tham số" do TF-DF cung cấp. Các mẫu siêu tham số mới sẽ được phát hành cùng với các bản cập nhật cho gói.

# 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()

Gỡ lỗi mô hình

Phần này trình bày một số cách bạn có thể xem/gỡ lỗi/diễn giải mô hình. Colab dành cho người mới bắt đầu chứa một ví dụ hoàn chỉnh.

Tóm tắt mô hình đơn giản

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

Nhật ký đào tạo và Tensorboard

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

Hoặc sử dụng TensorBoard:

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

Tầm quan trọng của tính năng

model.make_inspector().variable_importances()

Vẽ cây

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

Truy cập cấu trúc cây

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

(Xem colab nâng cao )

Không sử dụng chiến lược phân phối TensorFlow

TF-DF chưa hỗ trợ chiến lược phân phối TF. Việc thiết lập nhiều nhân viên sẽ bị bỏ qua và việc đào tạo sẽ chỉ diễn ra đối với người quản lý.

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

Mô hình xếp chồng

Các mô hình TF-DF không truyền ngược gradient. Kết quả là chúng không thể được kết hợp với các mô hình NN trừ khi các NN đã được huấn luyện.

Di chuyển từ tf.estimator.BoostedTrees {Phân loại/Bộ hồi quy/Công cụ ước tính}

Mặc dù nghe có vẻ giống nhau nhưng cây tăng cường TF-DF và Công cụ ước tính là các thuật toán khác nhau. TF-DF triển khai các bài báo về Rừng ngẫu nhiênMáy tăng cường độ dốc (sử dụng Cây) cổ điển. tf.estimator.BoostedTreesEstimator là một thuật toán Cây tăng cường độ dốc gần đúng với quy trình đào tạo theo đợt nhỏ được mô tả trong bài viết này

Một số siêu tham số có ngữ nghĩa tương tự (ví dụ: num_trees), nhưng chúng có ý nghĩa chất lượng khác nhau. Nếu bạn đã điều chỉnh các siêu tham số trên tf.estimator.BoostedTreesEstimator, bạn sẽ cần phải điều chỉnh lại các siêu tham số trong TF-DF để thu được kết quả tối ưu.

Dành cho người dùng Yggdrasil

Rừng quyết định Yggdrasil là thư viện suy luận và đào tạo cốt lõi được TF-DF sử dụng. Cấu hình và mô hình đào tạo tương thích chéo (tức là các mô hình được đào tạo bằng TF-DF có thể được sử dụng với suy luận Yggdrasil).

Tuy nhiên, một số thuật toán Yggdrasil chưa có trong TF-DF.

  • Cây tăng cường độ dốc với lấy mẫu được phân đoạn.