Tại sao chúng ta cần chuẩn hóa layer
Mình nghĩ, câu trả lời thỏa đáng nhất là bởi vì nó làm tăng độ chính xác của mô hình. Trong quá trình thực nghiệm, các nhà nghiên cứu nhận thấy rằng việc thêm Layer Normalization cho kết quả test tốt hơn/ chạy nhanh hơn, hội tụ sớm hơn … Và từ đó, các nhà nghiên cứu đổ hết tâm sức khai phá, đào bới nó ra thử sai , cải tiến, đề xuất các mô hình chuẩn hóa liên lục, tạo nên các mô hình mà mình sẽ liệt kê ở dưới.
Thật ra, một ý tưởng nào hay thì cũng có nhiều nhà nghiên cứu đổ hết tâm huyết vào nghiên cứu, đào sâu tận cùng nó ra, để cống hiến cho nhân loại.
Batch Normalization
Đây là một trong các phương pháp chuẩn hóa lâu đời và được sử dụng rộng rãi nhất. Ngay cả mình khi test các data mới cũng xài nó vì sự tiện lợi và nhanh chóng của nó. Các bạn có thể tìm đọc paper có tựa đề Batch normalization: Accelerating deep network training by reducing internal covariate shift. Những phần bên dưới, mình sẽ thay chữ Batch Normalization thành BN để cho câu chữ được ngắng gọn và tập trung vào ý chính hơn.
Batch Normalization (BN) đề cập đến việc chuẩn hóa giá trị input của layer bất kỳ. Chuẩn hóa có nghĩa là đưa phân phối của layer về xấp xỉ phân phối chuẩn với trung bình xấp xỉ 0 và phương sai xấp xỉ 1. Về mặc toán học, Batch Normalization (BN) thực hiện như sau: với mỗi layer, BN tính giá trị trung bình và phương sai của nó. Sau đó sẽ lấy giá trị đặc trưng trừ giá trị trung bình , sau đó chia cho độ lệch chuẩn. Thực tế, chúng ta hay chia tập train thành từng batch với kích thước là 16,32,64 ,128 … hình, hay còn gọi là 1 mini-batch size 16,32,64,128 …. BN được tính toán trên các mini-batch đó.
Công thức tính trung bình của mini-batch
$$ \mu_B \leftarrow \frac{1}{m}\sum^{m}_{i=1}x_i $$
Công thức tính phương sai của mini-batch
$$ \sigma^2_\beta \leftarrow \frac{1}{m}\sum^{m}_{i=1}(x_i-\mu_B)^2 $$
Chuẩn hóa
$$ \hat{x}_i \frac{x_i - \mu_B}{\sqrt{\sigma^2_B + \epsilon}} $$
Phía trên mà mô tả toán học phép biến đổi Batch Normalizing , sử dụng cho hàm kích hoạt x trên mini-batch.
Thực tế, đôi khi mô hình lại hoạt động hiệu quả với một giá trị trung bình và phương sai khác, nên tác giả thêm 2 siêu tham số là gamma - scale và beta - shift để có tính tổng quát.
$$ y_i \leftarrow \gamma\hat{x}_i + \beta $$
Batch Normalization hoạt động như thế nào
Về mặc trực quan, chúng ta biết rằng, trong gradient descent, mạng NN tính giá trị đạo hàm và giảm trọng số của nó dựa vào hướng đi của đạo hàm. Nhưng do các layer được xếp chồng lên nhau, phân phối của dữ liệu đầu vào sẽ bị thay đổi dần do việc cập nhật trọng số của các layer trước đó, làm cho phân phối của đầu vào của các layer phía sau sẽ khác xa so với phân phối của data input. BN giúp cố định phân phối của dữ liệu về phân phối chuẩn, qua tất cả các lớp, dẫn tới tính chất phân phối của dữ liệu không thay đổi qua các lớp.
Khuyết điểm của Batch Normalization
-
BN thực hiện lại các phép tính trình bày phía trên qua các lần lặp, cho nên, về lý thuyết, chúng ta cần batch size đủ lớn để phân phối của mini-batch xấp xỉ phân phối của dữ liệu. Điều này gây khó khăn cho các mô hình đòi hỏi ảnh đầu vào có chất lượng cao (1920x1080) như object detection, semantic segmentation, … Việc huấn luyện với batch size lớn làm mô hình phải tính toán nhiều và chậm.
-
Với Batch size = 1, giá trị phương sai sẽ là 0. Do đó BN sẽ không hoạt động hiệu quả.
-
BN không hoạt động tốt với RNN. Lý do là RNN có các kết nối lặp lại với các timestamps trước đó, và yêu cầu các giá trị beta và gamma khác nhau cho mỗi timestep, dẫn đến độ phức tạp tăng lên gấp nhiều lần, và gây khó khăn cho việc sử dụng BN trong RNN.
-
Trong quá trình test, BN không tính toán lại giá trị trung bình và phương sai của tập test. Mà sử dụng giá trị trung bình và phương sai được tính toán từ tập train. Điều này làm cho việc tính toán tăng thêm. Ỏ pytorch, hàm model.eval() giúp chúng ta thiết lập mô hình ở chế độ evaluation. Ở chế độ này, BN layer sẽ sử dụng các giá trị trung bình và phương sai được tính toán từ trước trong dữ liệu huấn luyện. Giúp cho chúng ta không phải tính đi tính lại giá trị này.
Weight Normalization
Tham khảo https://arxiv.org/pdf/1602.07868.pdf Do các bất lợi của BN, T. Saliman và P. Kingma đề xuất cách tính khác, và đặt tên là Weight Normalization. Ý tưởng của tác giả là tách trọng số thành 2 thành phần là giá trị của trọng số và hướng của trọng số. Nhằm mục đích tăng tốc tốc độ train.
Tác giả đề xuất sử dụng hai giá trị g( cho giá trị trọng số ) và v cho hướng của trọng số thay vì sử dụng 1 giá trị w nguyên thủy.
$$ w = \frac{g}{||v||}v $$
Với g là giá trị scala, v là vector. Công thức này nhanh do chúng ta đã fixed được giá trị chuẩn của w. Do chuẩn của w lúc này bằng g.
Không giống như BN, WN hoạt động được trong mô hình RNN. Tuy nhiên, về thực nghiệm cho thấy mô hình với WN thường không ổn định, nên ít khi được sử dụng trong thực tế
Layer Normalization
Tham khảo https://arxiv.org/pdf/1607.06450.pdf
Lấy cảm hứng từ BN, Geoffrey Hinton và các đồng sự đã đề xuất Layer Normalization. Phép chuẩn hóa được sử dụng trên từng layer như sau
$$ \mu^l =\frac{1}{H}\sum^{H}_{i=1}\alpha^l_i $$
$$ \sigma^l = \sqrt{\frac{1}{H}\sum^{H}_{i=1}(\alpha^l_i-\mu^l)^2} $$
Với H là số lượng phần tử trong một hidden layer.
Cái khác nhau chính giữa BN và LN là LN sử dụng chung một giá trị trung bình và phương sai trong 1 hidden layer. LN không phụ thuộc vào mini-batch, nên có thể train được với batch-size = 1 mà không gặp vấn đề gì cả.
Ngoài ra LN cũng có thể được sử dụng trong RNN mà không gặp trở ngại nào như BN.
Instance Normalization
Instance Normalization còn có tên gọi khác là contrast normalization
Ý tưởng ở đây là chúng ta sẽ chuẩn hoá trên từng channel của từng batch.
Group Normalization
Tham khảo https://arxiv.org/pdf/1803.08494.pdf
Được đề xuất bởi Kaiming He và cộng sự , Group Normalization có cách thức hoạt động tương tự LN, chỉ một khác biệt duy nhất là thuật toán sẽ chia các layer thành từng nhóm và thực hiện chuẩn hóa trên các nhóm đó. Chúng ta phải turning tham số num_groups để tìm số lượng nhóm cho kết quả tốt nhất.
Hai cái chuẩn hoá cuối khá đơn giản, mình không đề cập chi tiết nhiều. Nếu có bạn nào quan tâm thì vui lòng để lại lời nhắn, mình sẽ update thông tin các bạn cần.
Journalist: Tony Peng| Editor: Michael Sarazen
Nguồn tham khảo
@inproceedings{ioffe2015batch, title={Batch normalization: Accelerating deep network training by reducing internal covariate shift}, author={Ioffe, Sergey and Szegedy, Christian}, booktitle={International conference on machine learning}, pages={448–456}, year={2015}, organization={PMLR} }
https://analyticsindiamag.com/understanding-normalization-methods-in-deep-learning/
https://medium.com/techspace-usict/normalization-techniques-in-deep-neural-networks-9121bf100d8
https://towardsdatascience.com/different-normalization-layers-in-deep-learning-1a7214ff71d6
https://arxiv.org/pdf/1602.07868.pdf
https://arxiv.org/pdf/1607.06450.pdf
Comments