# Sự khác biệt giữa Local Response Normalization và Batch Normalization Đây là một bản dịch mình dịch từ bài viết [này](https://towardsdatascience.com/difference-between-local-response-normalization-and-batch-normalization-272308c034ac). Mình thấy trong post này, tác giả đã giải thích rất dễ hiểu cả về mặt công thức. Đây là một bài viết rất hay. --- ### 1. Tại sao lại cần Normalization ? Normalization đã trở thành một phần rất quan trọng trong các mạng học sâu nhằm bù đắp cho sự không giới hạn của một vài hàm activation cụ thể như : ReLU, ELU ... .Với những hàm activation này, lớp output không bị chặn trong một phạm vi giới hạn (ví dụ như $[-1, 1]$ với hàm tanh), vì vậy chúng có thể tăng rất cao vì quá trình training cho phép điều đó. Để giới hạn các activation này khỏi việc gia tăng quá trớn cho các giá trị đầu ra của lớp output, normalization được sử dụng ngay trước các hàm activation. Trong bài viết này, tác giả sẽ giải thích chi tiết cả hai kĩ thuật Local Response Normalization và Batch Normalization và làm nổi bật lên sự khác nhau chính của chúng. ### Local Response Normalization Local Response Normalization (LRN) lần đầu tiên được giới thiệu trong kiến trúc AlexNet, trong đó hàm activation được dùng là ReLU, trái ngược với sự phổ biến của sigmoid và tanh tại thời điểm đó. Ngoài lí do đã được nêu ở trên (trong phần 1), một lí do khác để dùng LRN là gia tăng sự ức chế biên (lateral inhibition, cái này là thuật ngữ, không biết mình dịch có đúng không). Sự ức chế biên là một khái niệm trong khoa học thần kinh nói về khả năng của một tế bào thần kinh ức chế sự hoạt động của các tế bào thần kinh lân cận. Trong DNNs, mục đích của ức chế biên là thực hiện tăng cường độ tương phản cục bộ (local contrast enhancement) để cho những pixel cực đại cục bộ (locally maximum pixel) được sử dụng để kích thích cho layers tiếp theo. Note : Đoạn này hơi khó hiểu, tuy nhiên tí nữa đi vào công thức cụ thể, bạn sẽ hiểu ý tác giả nói gì. LRN là một non-trainable layer (tức là không thể huấn luyện) mà chuẩn hóa bình phương giá trị của pixel trong feature map với những lân cận cục bộ của nó. Có hai loại LRN dựa trên định nghĩa lân cận mà bạn có thể thấy trong ví dụ dưới đây : ![](https://i.imgur.com/P0yx22M.png) **Inter-Channel LRN** : là phiên bản chính được sử dụng trong AlexNet paper. Lân cận ở đây được định nghĩa dọc theo các channel. Với mỗi điểm $(x, y)$, nomalization được thực hiện dựa theo công thức sau : \begin{align*} b^i_{x, y} = \frac{a^i_{x, y}}{(k + \alpha \sum_{j=\max(0,i-\frac{n}{2})}^{\min(N-1,i+\frac{n}{2})}(a^j_{x,y})^2)^{\beta}} \end{align*} Note : Nom trông công thức rất kinh khủng nhưng thực ra rất đơn giản, đừng hoảng sợ, just keep reading. Các kí hiệu : * $i$ : chỉ số output của filter $i$ * $a_{x, y}, b_{x,y}$ : pixel tại tọa độ $(x, y)$ trước và sau khi normalize, tương ứng. * N : tổng số channel Bộ hằng số $(k, \alpha, \beta, n)$ là các hyperparameter: * $k$ : được dùng để tránh các điểm kì dị (chia cho $0$) * $\alpha$ : được dùng như một hằng số của normalization * $\beta$ : hằng số tương phản * $n$ : độ dài của các lân cận cần quan tâm (sẽ rõ hơn qua các ví dụ bên dưới) Trường hợp đặc biệt $(k, \alpha, \beta, n) = (0, 1, 1, N)$ là standard normalization. Xem xét một ví dụ về LRN dưới đây : ![](https://i.imgur.com/AzRG0bf.png) Các màu sắc khác nhau đại diện cho các channel khác nhau và ta có $4$ channel, tương ứng với $N=4$. Xét trường hợp ta chọn các hyperparameter như sau : $(k, \alpha, \beta, n) = (0, 1, 1, N)$. Giá trị $n=2$ có nghĩa là trong quá trình normalize cho vị trí $(i, x, y)$, ta định nghĩa các lân cận của nó là $(i - 1, x, y)$ và $(i + 1, x, y)$ theo đúng như công thức bên trên. Đối với các lân cận không tồn tại (tức là $i-1$ hoặc $i+1$ vượt qua khỏi các channel, ta xem nó như $0$). Bạn có thể tính toán thử trên ví dụ này để có cái nhìn rõ hơn. **Intra-Channel LRN** : Trong Intra-Channel LRN, các lân cận được định nghĩa là trong cùng một channel. Công thức trong trường hợp này là : \begin{align*} b^k_{x,y} = \frac{a^k_{x,y}}{(k + \alpha \sum^{\min(W,x+\frac{n}{2})}_{i=\max(0,x-\frac{n}{2})} \sum^{\min(H,y+\frac{n}{2})}_{j=max(0,y-\frac{n}{2})}(a^k_{i,j})^2)^{\beta}} \end{align*} Với các tham số như đã định nghĩa ở trên và $(W, H)$ là chiều rộng và chiều cao của feature map. Với $n=2$, các lân cận giống như một kernel trong Convol2d, chỉ khác công thức định nghĩa : ![](https://i.imgur.com/71SHvyF.png) ### Batch Normalization: Ngược lại với LRN, Batch Normalization (BN) là một **trainable layer** (tức là có thể huấn luyện được), thường được sử dụng để giải quyết vấn đề Internal Covariate Shift (ICF) (tạm dịch là dịch chuyển hiệp phương nội bộ, tức là thay đổi phân phối). ICF xuất hiện do sự thay đổi phân phối trong các lớp neurons/activation ẩn. Xem xét ví dụ dưới đây trong bài toán phân loại nhị phân khi chúng ta cần phân loại hai class là roses và non-roses. ![](https://i.imgur.com/iAWO0Qs.png) Hai lớp roses và non-roses. Phần features map bên phải biểu diễn phân phối của hai batch dữ liệu. Giả sử chúng ta đang train một mạng neural và bây giờ ta cần chọn hai batch mà trông khác nhau một cách đáng kể để train. Nếu ta cứ thế mà truyền hai batch này vào mô hình, chúng ta sẽ thấy sự dịch chuyển hiệp phương sai của input neural. Nó ảnh hưởng thế nào đến quá trình training ? Trong suốt quá trình training, nếu ta chọn các batch khác nhau mà mỗi batch lại thuộc về một phân phối khác nhau, quá trình train sẽ bị chậm lại do nó cố gắng học một phân phối nhất định trên mỗi batch. Do đó, nó sẽ tiếp tục nảy qua nảy lại giữa các phân phối cho đến khi nó hội tụ (tương tự như vector đạo hàm trong gradient descend). Chúng ta có thể giảm nhẹ sự dịch chuyển hiệp phương sai này bằng cách làm cho các điểm dữ liệu trong mỗi batch không thuộc về một phân phối nhất định nào cả. Việc này có thể làm bằng cách chọn random điểm dữ liệu cho các batch. Tuy nhiên Covariate Shift cũng xuất hiện trong các hidden layer. Mặc cho việc batches được chọn ngẫu nhiên, các hidden neuron cũng vẫn có thể dẫn đến một phân phối cố định, điều mà làm chậm lại quá trình học. Sự dịch chuyển hiệp phương sai này trong các hidden layer được gọi là Internal Covariate Shift. Vấn đề là ta không thể trực tiếp kiểm soát phân phối của các hidden neron như cách chúng ta đã làm cho input neurons bởi vì nó liên tục thay đổi vì training sẽ update các tham số. Batch Normalization sẽ giúp chúng ta giải quyết vấn đề này bằng cách giảm bớt nó đi. Trong batch normalization, output của hidden neurons được xử lí như ngay bên dưới đây trước khi cho nó vào hàm activation : 1. Normalize toàn bộ batch B về mean $0$ và $1$ variance * Tính mean của toàn bộ mini batch B : $u_B$ * Tính phương sai của toàn bộ mini batch B : $\sigma_B$ * Normalize mini batch bằng cách trừ đi mean và chia cho phương sai 2. Giới thiệu thêm hai trainable parameters ($\gamma :$ scale_variable và $\beta :$ shift_variable) để scale và dịch chuyển normalize mini-batch output. 3. Feed scale và shifted normalized mini-batch vào hàm activation. Thuật toán BN có thể được hiểu qua giả mã như sau : ![](https://i.imgur.com/K1jHVEy.png) Normalization được thực hiện cho mỗi pixel trên tất cả các ativations trong một batch. Xem xét ví dụ bên dưới. Giả sử rằng chúng ta đang có mini-batch size $= 3$. Một hidden layer có activation size $= (C, H, W ) = (4, 4 4)$. Vì batch size $= 3$, chúng ta sẽ có $3$ activation. Bây giờ với mỗi pixel trong activation, ta sẽ normalize nó bằng cách tìm mean và variance của chính pixel này như phần bên trái trong hình bên dưới. Khi đã có mean và variance, ta sẽ trừ đi mean và chia cho variance. Phần bên phải hình dưới mô tả thao tác này. Phép trừ và phép chia này là point-wise. ![](https://i.imgur.com/4XxihoL.png) Scaling và shifting là để training quyết định xem chúng ta có cần normalize hay không. Có một vài trường hợp kết quả sẽ tốt hơn khi không có normalize. Vì vậy, thay vì thủ công chọn có hay không các lớp normalize, BN để cho training quyết định điều đó (do đó có 2 tham số học được). Khi $\gamma = \sigma_B$ và $\beta = u_B$, normalization sẽ không được thực hiện, và activation sẽ được sử dụng như bình thường. Bạn có thể tham khảo một video chi tiết về BN được thực hiện bởi thầy Andrew Ng tại [đây](https://www.coursera.org/lecture/deep-neural-network/why-does-batch-norm-work-81oTm) ### Comparsion LRN có nhiều hướng để normalize (Inter hoặc Intra Channel), mặt khác, BN chỉ có thể thực hiện theo một hướng (với mỗi pixel cho toàn bộ activation). Bảng bên dưới đây so sánh hai phương pháp normalize : ![](https://i.imgur.com/RALicUd.png) References: [1] https://www.learnopencv.com/batch-normalization-in-deep-networks/ [2] Ioffe, Sergey, and Christian Szegedy. “Batch normalization: Accelerating deep network training by reducing internal covariate shift.” arXiv preprint arXiv:1502.03167 (2015).