Giải pháp chia dữ liệu dùng Học Tăng Cường (RDS)

classification
deep-learning
linear-regression

#1

Chào các bạn, trong bài này, mình giới thiệu qua với các bạn một nghiên cứu của nhóm làm về giải pháp chia dữ liệu cho các data challenge dùng học tăng cường. Bài nghiên cứu có tên Reinforced Data Sampling for Model Diversification [1].

1. Mục đích:

Do rất nhiều data challenge gặp phải vấn đề chia dữ liệu train/test không phù hợp, dẫn đến việc “shake-up” xảy ra khi so sánh kết quả trên public-test và private-test. Nguyên nhân cơ bản là việc chọn các samples cho tập train và tập test không dựa vào thông tin của dữ liệu, mà chủ yếu dựa vào nhãn (chẳng hạn dùng stratified splitting). Đi sâu hơn, kể cả khi đã dựa vào thông tin của dữ liệu, nhưng khi bản chất dữ liệu phức tạp (hoặc do độ khó của dữ liệu, hoặc do dữ liệu bị phân mảnh) thì việc chia các samples ra train/test cũng không hề dễ dàng. Trong nghiên cứu, 2 nguyên nhân phổ biến cho hiện tượng này được biết đến là do concept drift (trượt khái niệm) [2] và evidence ambiguity (bằng chứng mơ hồ/ nhập nhằng) [3]. Mình chỉ dịch để các bạn hiểu được ý chính của 2 nguyên nhân này, tuy nhiên mình vẫn dùng tiếng Anh cho thống nhất nhé.

Concept Drift (trượt khái niệm): vấn đề này xảy ra khi label cần predict bị thay đổi giữa các samples. Để dịch sát hơn, có lẽ nên dịch là “sự trôi khái niệm”, gần với việc “ghi nhớ mông lung”, lúc thế này, lúc thế khác. Nhưng suy cho cùng, đây cũng là vấn đề liên quan tới độ phức tạp của nhãn, có thể do không có tính đồng nhất trong dữ liệu. Ví dụ với bài toán image classification, khi nhìn hình ảnh con chó với lông rất giống con mèo, người gán nhãn hoàn toàn có thể gán nhãn sai do bản chất ảnh “con chó” rất giống “con mèo” gây ra.

Evidence Ambiguity (bằng chứng mơ hồ): điều này xảy ra khi không có đủ thông tin để đưa ra dự đoán chắc chắn. Ở trong bài [3], các tác giả cũng đưa ra ví dụ về các loài chó khác nhau, ngay cả con người cũng dễ bị nhầm lẫn trong việc phân biệt các giống chó khác nhau.

Image credit: Lee et al. [3].

Một ảnh ví dụ về evidence ambiguity (bằng chứng mơ hồ): các thành thành phần khác nhau của con Bò có độ nhập nhằng với label khác như từ con Ngựa.

2. Các giải pháp đã có về chia dữ liệu:

  1. Random: không quan tâm tới thông tin dữ liệu, chỉ chia random theo tỉ lệ cần lấy giữa train/test. Khi dùng sklearn, chính là hàm train_test_split.
  2. Stratified splitting: chia theo tỉ lệ cần lấy giữa train/test, nhưng cố gắng lấy tỉ lệ cân bằng giữa các nhãn theo phần trăm. Tuy nhiên điều này không thực hiện đc với bài toán regression. Hoặc cần có bước phân đoạn, chuyển từ regression sang categories để thực hiện việc chia dữ liệu (mặc dù cách này cũng là 1 vđề cần suy nghĩ).

Với các cách chia dữ liệu đã có, các bạn có thể thấy 2 vấn đề quan trọng: (1) không quan tâm tới thông tin của dữ liệu (đặc biệt là phân bố của dữ liệu), (2) không quan tâm tới việc các mô hình học máy sẽ response thế nào đối với dữ liệu train/test.

3. Giải pháp đề xuất:

Dùng học tăng cường để tận dụng response của các mô hình học máy đối với các data samples, từ đó quyết định việc chọn samples vào train/test. Giải pháp này có 2 lợi điểm quan trọng:

  1. Data distribution: khi dữ liệu train và test được chia ra mà bị khác distribution, thì việc học trên dữ liệu train hoàn toàn không khả thi để được đánh giá trên dữ liệu test. Điều này thấy rõ nhất khi các data challenge có 2 tập tests: public-test và private-test. Khi 2 tập tests này khác distribution, thì các mô hình cố optimise theo public-test sẽ bị overfit và không thể giải quyết bài toán trên private-test. Từ đó xẩy ra hiện tượng đảo lộn ranking giữa các đội. Và khiến các teams nghi ngờ sự chuẩn bị chu đáo của nhà tổ chức, từ đó thiếu quan tâm tới các bài toán, cuộc thi sau này. Quan trọng hơn nữa, là sự lãng phí tài nguyên tính toán vào các giải thuật mà chắc chắc sẽ không được quan tâm do “giải pháp random” lại đạt kết quả tốt hơn trên private-test.

  2. Model diversification: là vấn đề chia dữ liệu sao cho đa dạng hoá việc học giữa các mô hình. Để ví dụ cụ thể, khi một team sử dụng giải pháp dùng SVM trên public-test. Thì tương ứng, cũng giải pháp dùng SVM đó, sẽ thể hiện tốt trên tập private-test.

Chi tiết mô hình:

Image credit: Nguyen et al. [1].

RDS thực hiện việc chia dữ liệu bằng action chọn/không chọn dựa vào rewards được lấy từ response sau khi ensemble của các base models. Các base-models ở đây thường được kết hợp tổng hợp từ ít nhất 3 models phổ biến của task. Ví dụ với MNIST, 3 base-models được sử dụng là LR, RF, và CNN.

4. Ví dụ một thực nghiệm:

Image credit: Nguyen et al. [1].

Quá trình học để chia dữ liệu train/test của RDS đối với 4 datasets: MADELON, Drug Review (DR), MNIST, KLP (Kalapa Challenge).

Đối với hình trên, các bạn để ý thông tin của 3 hàng sau:

  1. Hàng thứ nhất là performance của các base-models đối với mỗi episode. Nhìn chung, performance cần ổn định hoặc tăng đối với từng episode.
  2. Hàng thứ 2 là số lượng samples được chọn ở mỗi episode. Nó sẽ hội tụ về tỉ lệ chia được định nghĩa từ ban đầu (ví dụ MNIST được chia theo tỉ lệ 0.85, tức 85% là train, 15% là test).
  3. Hàng cuối là thể hiện sự khác biệt về distribution giữa tập train và tập test. Theo lý thuyết, IID sẽ dần về 0, thể hiện cho distribution của train và test là tương tự nhau. Từ đó giảm thiểu các tình huống khác distribution giữa train/test như đã nói ở trên.

5. Kết luận:

  • Như vậy, mình đã giới thiệu sơ qua về giải pháp học tăng cường cho vấn đề chia dữ liệu train/test. Để hiểu sâu hơn về RDS, các bạn hãy xem chi tiết ở link [1].
  • Khi dùng RDS, tất nhiên, bạn hoàn toàn có thể chia dữ liệu thành nhiều phần bằng cách áp dụng nhiều lần. Ví dụ khi cần chia test-set thành public-test và private-test, bạn có thể chạy RDS với tập test với tỉ lệ 50%.
  • RDS đã được thử nghiệm với nhiều bài toán, từ binary classification, multi-class classification, linear regression. Team hy vọng sẽ có nhiều bạn ứng dụng RDS trong các task khác nữa.
  • RDS đã được hỗ trợ chạy trên các loại dữ liệu khác nhau, từ ảnh, text, đến tabular. Hy vọng sẽ giúp ích cho các data challenge tổ chức trên AIVIVN cũng như Kaggle.

Cảm ơn các bạn đã quan tâm và đọc bài giới thiệu. Có vấn đề gì cần hỗ trợ, mời các bạn tạo ISSUE qua github của RDS.

References:

[1] https://bit.ly/RDS-Paper, github: https://bit.ly/DATASAMPLING-RDS

[2] https://papers.nips.cc/paper/4129-a-bayesian-approach-to-concept-drift.pdf

[3] https://arxiv.org/pdf/1606.07839.pdf


#2

Update: bài chia sẻ trên medium [1] bằng t.anh về RDS và codes trên Kaggle kernel [2]:

[1] https://medium.com/@oliver_nguyen/rds-d89f7be5142d

[2] https://www.kaggle.com/oliverrnguyen/reinforced-data-sampling