Kỹ thuật Dropout (Bỏ học) trong Deep Learning

Tram Ho


Trong bài viết này, mình xin phép giới thiệu về Dropout (Bỏ học) trong mạng Neural, sau đó là mình sẽ có 1 số đoạn code để xem Dropout ảnh hưởng thế nào đến hiệu suất của mạng Neural.

1. Lý thuyết

1.1. Dropout trong mạng Neural là gì

Theo Wikipedia
Thuật ngữ ‘Dropout’ đề cập đến việc bỏ qua các đơn vị (units) ẩn và hiện trong 1 mạng Neural.

Hiểu 1 cách đơn giản thì Dropout là việc bỏ qua các đơn vị (tức là 1 nút mạng) trong quá trình đào tạo 1 cách ngẫu nhiên. Bằng việc bỏ qua này thì đơn vị đó sẽ không được xem xét trong quá trình forward và backward.
Theo đó, p được gọi là xác suất giữ lại 1 nút mạng trong mỗi giai đoạn huấn luyện, vì thế xác suất nó bị loại bỏ là (1 – p).

1.2. Tại sao lại cần Dropout

Câu hỏi là: Tại sao phải tắt 1 số nút mạng theo đúng nghĩa đen trong quá trình huấn luyện ?
Câu trả lời là: Tránh học tủ (Over-fitting)

Nếu 1 lớp fully connected có quá nhiều tham số và chiếm hầu hết tham số, các nút mạng trong lớp đó quá phụ thuộc lẫn nhau trong quá trình huấn luyện thì sẽ hạn chế sức mạnh của mỗi nút, dẫn đến việc kết hợp quá mức.

1.3. Các kỹ thuật khác

Nếu bạn muốn biết Dropout là gì, thì chỉ 2 phần lý thuyết phía trên là đủ. Ở phần này mình cũng giới thiệu 1 số kỹ thuật có cùng tác dụng với Dropout.

Trong Machine Learning, việc chính quy hóa (regularization) sẽ làm giảm over-fitting bằng cách thêm 1 khoảng giá trị ‘phạt’ vào hàm loss. Bằng cách thêm 1 giá trị như vậy, mô hình của bạn sẽ không học quá nhiều sự phụ thuộc giữa các trọng số. Chắc hẳn nhiều người đã biết đến Logistic Regression thì đều biết đến L1 (Laplacian) và L2 (Gaussian) là 2 kỹ thuật ‘phạt’.

  • Quá trình training:
    Đối với mỗi lớp ẩn, mỗi example, mỗi vòng lặp, ta sẽ bỏ học 1 cách ngẫu nhiên với xác suất (1 – p) cho mỗi nút mạng.
  • Quá trình test:
    Sử dụng tất cả các kích hoạt, nhưng sẽ giảm đi 1 hệ số p (để tính cho các kích hoạt bị bỏ học).

1.4. Một số nhận xét

  • Dropout sẽ được học thêm các tính năng mạnh mẽ hữu ích
  • Nó gần như tăng gấp đôi số epochs cần thiết để hội tụ. Tuy nhiên, thời gian cho mỗi epoch là ít hơn.
  • Ta có H đơn vị ẩn, với xác suất bỏ học cho mỗi đơn vị là (1 – p) thì ta có thể có 2^H mô hình có thể có. Nhưng trong giai đoạn test, tất cả các nút mạng phải được xét đến, và mỗi activation sẽ giảm đi 1 hệ số p.

2. Thực hành

Nói thì hơi khó hiểu, nên mình sẽ code 2 phần để xem Dropout là như thế nào.

Đặt vấn đề: Bạn đi xem 1 trận đấu bóng đá và bạn thử dự đoán xem thủ môn sút vào vị trí nào thì cầu thủ nhà đánh đầu được quả bóng.

Mình import các thư viện cần thiết

Visualize dữ liệu 1 chút

Ta được kết quả

Dấu chấm đỏ là cầu thủ nhà đã từng đánh đầu, chấm xanh là cầu thủ bạn đánh đầu. Việc chúng ta là dự đoán xem thủ môn nên sút bóng vào khu vực nào để cầu thủ nhà đánh đầu được. Nhìn có vẻ như chỉ cần kẻ 1 đường thẳng để phân chia 2 khu vực là được.

2.1. Mô hình không có chính quy hóa

Hàm dự đoán

Xem kết quả

Có thể thấy độ chính xác ở tập training là 94% và tập test là 91% (khá cao). Ta sẽ visualize 1 chút

Khi không có chính quy hóa, ta thấy đường phân chia vẽ rất chi tiết, tức là nó đang over-fitting.

2.2. Mô hình chính quy hóa với Dropout

2.2.1. Quá trình Forward Propagation

2.2.2. Quá trình Backward Propagation

Sau khi có Forward và Backward, ta thay 2 hàm này vào hàm model của phần trước:

Kết quả:

Ta thấy, độ chính xác trong tập test đã lên đến 95%, mặc dù tập training bị giảm.
Thực hiện visualize:

Ta được

Ta thấy đường phân chia không quá chi tiết, nên đã tránh được over-fitting.

2.3. Chú ý

  • Không dùng Dropout cho quá trình test
  • Áp dụng Dropout cho cả quá trình Forward và Backward
  • Giá trị kích hoạt phải giảm đi 1 hệ số keep_prob, tính cả cho những nút bỏ học.

Nguồn: Medium

Cảm ơn mọi người đã xem bài viết

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo