[Nhập môn Deep Learning] Dropout: Cho các neural đi nghỉ mát
Dropout là câu hỏi ưa thích của một người anh tôi mỗi khi phỏng vấn ứng viên. Anh giải thích là vì nó dễ!
Nếu ví mạng thần kinh nhân tạo như một đội bóng thì việc phát triển đồng đều của tất cả các thành viên trong đội là tối cần thiết. Vì nếu chỉ có một người xuất sắc, có thể làm hết mọi việc, thì dễ sinh ra sự kiêu căng, chủ quan mà dẫn đến kết quả đấu tệ hại. Hoặc nếu người đó đột nhiên bị chấn thương thì cả đội bóng sẽ không còn chỗ dựa nữa dẫn đến hậu quả là những trận thua. Trong phép so sánh này, mỗi thành viên của đội bóng chính là một neural. Không thiếu các trường hợp mà một phần nhỏ các neural lại là sức mạnh chính của cả một mạnh thần kinh nhân tạo [1]. Hậu quả là mô hình dễ bị “tự tin thái quá” (overfitting) vì chỉ cần một lượng nhỏ các neural được kích hoạt thì sẽ có được kết quả. Một ý tưởng đơn giản mà hiệu quả đã được giới thiệu vào năm 2014 có tên là Dropout đã giải quyết vấn đề này với một ý tưởng rất đơn giản:
“Cho các neural nghỉ phép”.
Về mặt ý tưởng: Cho các neural nghỉ phép thì tất cả các neural sẽ có trách nhiệm giải quyết vấn đề chứ không chỉ một vài neural. Như thế, mục tiêu cuối cùng là có được một “đội” mà ở đó mọi thành viên đều có khả năng giải quyết vấn đề, đưa ra quyết định, dẫn đến một “đội” mạnh thực sự.
Đấy là tất cả về ý tưởng của Dropout. Về mặt toán học, cũng như cách thực sự nó được hiện thực dưới máy tính sẽ được bàn tiếp ở phần phía sau đây.
![Hình 1: Bắt đầu từ một mô hình cơ bản, chúng ta thêm các đơn vị bổ sung sau mỗi lớp quan tâm, được hiển thị màu xanh lam. Tại thời điểm huấn luyện, mỗi đơn vị Dropout được ngẫu nhiên gán một giá trị nhị phân (tức là 0 hoặc 1), che đi một phần của các lớp trước đó. Do đó, chúng ta chọn một trong số vô số các mô hình có thể có một tập hợp con các đơn vị ẩn hoạt động mỗi khi thực hiện một lần chuyển tiếp. Hình từ [3].](https://images.spiderum.com/sp-images/3e6a1490d67211efaacc8fea808d3363.png)
Hình 1: Bắt đầu từ một mô hình cơ bản, chúng ta thêm các đơn vị bổ sung sau mỗi lớp quan tâm, được hiển thị màu xanh lam. Tại thời điểm huấn luyện, mỗi đơn vị Dropout được ngẫu nhiên gán một giá trị nhị phân (tức là 0 hoặc 1), che đi một phần của các lớp trước đó. Do đó, chúng ta chọn một trong số vô số các mô hình có thể có một tập hợp con các đơn vị ẩn hoạt động mỗi khi thực hiện một lần chuyển tiếp. Hình từ [3].
Dropout là một loại nhiễu thông tin trong quá trình huấn luyện
Nếu bạn huấn luyện được một chú chó chỉ nghe lời bạn trong một môi trường có rất nhiều tiếng ồn (nhiễu) thì bạn sẽ có được một chú chó tốt. Tương tự đối với mạng neural, chúng thường được huấn luyện với các dữ liệu bị làm nhiễu nhằm đạt được sức mạnh tốt hơn khi đem ra ứng dụng vào đời thực. Đây có thể được gọi là một cách làm giàu dữ liệu (chữ “giàu” trong ngữ cảnh này có thể tương tự với chữ giàu trong “làm giàu uranium”). Tuy nhiên, thuật ngữ đúng tiếng anh là “Data Augmentation”. Với cách này, nhiễu thường được thêm vào thẳng data để huấn luyện mô hình. Tuy nhiên, tác giả của Dropout đã đặt ra một câu hỏi khác: sẽ như thế nào nếu nhiễu được thêm vào ngay trong chính các biểu diễn tạo ra bởi các lớp mô ở giữa của mô hình.
Có rất nhiều loại nhiễu có thể nghĩ đến: White noise, pink noise, brown noise (đúng v, chính là mấy cái âm thanh “giúp bạn thông minh/tập trung hơn khi học và làm việc” ở trên youtube). Tuy nhiên, Dropout sử dụng một loại nhiễu đơn giản hơn, đó là đơn giản loại bỏ kết quả của một số neural tại mỗi lần học. Điều đó sẽ khiến cho các neural còn lại cũng sẽ học được thông tin cần thiết để “mạnh” lên. Việc loại bỏ tạm thời này đơn giản là bật và tắt neural. Nếu bạn học khoa học máy tính, sẽ liên tưởng ngay đến 0 và 1, và vì thế cách làm khá đơn giản là nhân kết quả đầu ra của lớp (layer) với một ma trận “mask” cùng kích cỡ với chỉ các giá trị là 0 và 1.
Một chút toán
Giả sử đầu ra của lớp đó là X có số chiều là 2, ta sẽ tạo ra một ma trận M (mask) có cùng kích cỡ với ích, mà tại đó mỗi giá trị tại M(i,j) có giá trị 0 hoặc 1. Các giá trị này sẽ được quyết định ngẫu nhiên bằng phân phối Bernoulli với giá trị p được định sẵn bởi người dùng. Khi đó, phép toán dropout sẽ là:
Dropout(X) = X * M(element-wise, nhân từng phần tử tương ứng với nhau)
(Một giải thích đơn giản về việc chọn giá trị từ phân phối Bernoulli: Hãy chú ý đến giá trị p! p chính là xác suất giá trị được chọn là 1, tức là có (1-p) xác suất giá trị đó là 0. Mỗi lần tính toán sẽ được chọn lại giá trị một lần.)
Như vậy, kết quả sau khi dropout đơn giản là giá trị ban đầu của X nhưng một số phần tử đã thành 0 (do bị nhân với 0). Thành thử, một số kết nối bị “cho đi nghỉ phép” (không cần làm việc) trong quá trình huấn luyện.
Tuy nhiên, đấy là huấn luyện mà thôi, lúc phải thực sự làm việc thì làm thế nào?
Dropout khi sử dụng
Cách 1: Huấn luyện sao thì làm như vậy
Cách này đơn giản là làm y hệt như lúc huấn luyện, cũng tắt một vài kết nối khi phải làm việc thật. Với mỗi lần tắt/bật như vậy, chúng ta có một tập hợp kết nối khác nhau trên cùng một mô hình. Mỗi tập hợp neural như vậy sẽ cho một kết quả độc lập. Để chính xác thì ta chỉ cần lấy trung bình của chúng [4]. Chú ý đến đoạn “lấy trung bình”. Ta sẽ phải có một vài kết quả để có thể lấy trung bình. Điều này rất tốn kém khi mô hình lớn, hoặc rất phiến toái nếu ứng dụng yêu cầu tốc độ xử lý cao.
Cách 2: Cùng nhau làm việc (Cách được hiện thực trong các framework)
Cách này đơn giản là không có tắt bất kỳ kết nối nào trong quá trình huấn luyện mô hình. Để làm được điều đó, ta cần quan tâm đến một thuật ngữ tên là invert dropout. Ý tưởng khá đơn giản mà tôi hy vọng bạn đọc có thể tự khai triển các phép toán. Sau đây là ý tưởng:
Xét phép Dropout bình thường, một phần tử của X sẽ có xác suất p bị xoá đi, tức là có (1 - p) xác suất được giữ lại. Tức là, nếu làm như cách 1, tính trung bình tất cả kết quả của các tập hợp neural có thể. Giá trị trung bình của M * X thực tế là (1 - p) * X. Vậy, nếu đầu vào của Dropout là X/(1 - p) thì giá trị trung bình sẽ là X, đúng không? Và với chỉ việc nhân một lượng 1/(1-p) vào đầu vào trong quá trình huấn luyện, khi dự đoán / tính toán, chúng ta có thể loại bỏ hoàn toàn cái gọi là “dropout”.
Kết luận
Trên thực tế, các giá trị p khá nhỏ như 0.1, 0.2 hoặc 0.3 thường được sử dụng và có hiệu quả rõ rệt. Kỹ thuật này rất phổ biến và ưa chuộng vì gần như không gây thêm quá nhiều phiền phức, đặc biệt là không yêu cầu thêm gì trong quá trình kiểm thử. Có nhiều biến thể của dropout tuỳ vào bài toán cũng cho thấy hiệu quả như: spatial dropout [5] ngắt kết nổi của hẳn một chiều của một tensor, cutout dropout [6] ngắt kết nối của các vùng vuông nhỏ trong một chiều cảu một tensor. Ngoài ra cũng có một số kỹ thuật thú vị như: DropConnect [7].
Reference
[1] Cheng, Hongrong, Miao Zhang, and Javen Qinfeng Shi. "A survey on deep neural network pruning: Taxonomy, comparison, analysis, and recommendations." IEEE Transactions on Pattern Analysis and Machine Intelligence (2024).
[2] N. Srivastava, G. Hinton, A. Krizhevsky, I. Sutskever, and R. Salakhutdinov. Dropout: a
simple way to prevent neural networks from overfitting. The Journal of Machine Learning Research, 15(1):1929–1958, 2014. 152
[3] Scardapane, Simone. "Alice's Adventures in a Differentiable Wonderland--Volume I, A Tour of the Land." arXiv preprint arXiv:2404.17625 (2024).
[4] Y. Gal and Z. Ghahramani. Dropout as a bayesian approximation: Representing model uncertainty in deep learning. In ICML, pages 1050–1059, 2016. 154
[5] J. Tompson, R. Goroshin, A. Jain, Y. LeCun, and C. Bregler. Efficient object localization using convolutional networks. In IEEE/CVF CVPR, pages 648–656, 2015. 155
[6] T. DeVries and G. W. Taylor. Improved regularization of convolutional neural networks with cutout. arXiv preprint arXiv:1708.04552, 2017. 155
[7] L. Wan, M. Zeiler, S. Zhang, Y. Le Cun, and R. Fergus. Regularization of neural networks using DropConnect. In ICML, pages 1058–1066, 2013. 155

Khoa học - Công nghệ
/khoa-hoc-cong-nghe
Bài viết nổi bật khác
- Hot nhất
- Mới nhất