Bạn đúng rằng một khi chúng ta có các kích hoạt tính năng trung bình trên một tập hợp các hình ảnh, chúng ta sẽ bình thường hóa mạng theo trình tự, từng lớp một. Có một sự tinh tế liên quan, mặc dù. Bạn không thể bán lại trọng lượng lớp độc lập với các lớp trước.
Đặt và là trọng số và độ lệch của bộ lọc tích chập thứ trong lớp . Hạt nhân có hình dạng 3D với kích thước (chiều cao, chiều rộng, kênh_in), nhưng để ký hiệu dễ dàng hơn trên đường, hãy định hình lại nó thành , trong đó .WlibliilWlih×w×cp×cp=h×w
Ftôitôi j≡ m a x ( 0 , WtôiTôi∙Pl - 1j+btôiTôi) là kích hoạt bộ lọc thứ trong lớp ở vị trí thứ trong bản đồ kích hoạt. Ở đây chỉ định thao tác tích chập (hoặc sản phẩm bên trong Frobenius hoặc thêm bội; Tôi đã sử dụng ký hiệu từ câu trả lời của Baba) và là cửa sổ của kích hoạt trong đầu ra của lớp mà bộ lọc kết hợp với tại vị trí đang xem xét.Tôitôij∙Pl - 1jh × w × c = p × cl - 1
Hãy để là kích hoạt trung bình của bộ lọc thứ trong lớp trên tất cả các hình ảnh trong tập dữ liệu và tất cả các vị trí trong bản đồ kích hoạt của bộ lọc. Đây rõ ràng là một con số không âm và nó thực sự dương đối với tất cả các bộ lọc trong mạng VGG (khi kích hoạt trung bình được thu thập trên một tập dữ liệu có kích thước vừa phải).μtôiTôi≡EX, jFtôitôi j= =1NMtôiΣXΣj = 1MtôiFtôitôi j= =1NMtôiΣXΣj = 1Mtôim a x ( 0 , WtôiTôi∙Pl - 1j+btôiTôi)
TôitôiNXMtôi
Bây giờ, giả sử chúng ta "bình thường hóa" các kích hoạt bằng cách chia trọng số và độ lệch cho . Điều này sẽ làm cho giá trị trung bình của kích hoạt bằng 1, nếu kích hoạt đến giống như kích hoạt ban đầu không chuẩn hóa . Đó là, , nhưng chỉ khi các kích hoạt của lớp trước giống như trong mạng không chuẩn hóa ban đầu - mạng mà chúng tôi đã tínhμtôiTôiEX, jm a x ( 0 , WtôiTôiμtôiTôi∙Pl - 1j+btôiTôiμtôiTôi) = 1Pl - 1jμtôiTôitrong. Điều này chỉ đúng với lớp đối lưu đầu tiên trong mạng được chuẩn hóa, lớp kết hợp với hình ảnh đầu vào. Đối với các lớp khác, điều này không chỉ dẫn đến sai tỷ lệ, mà nó thực sự có thể đảo ngược dấu hiệu của tích chập và do đó, không kích hoạt sau khi đi qua ReLU. Nói cách khác, nó thay đổi đầu ra của mạng .
Để khắc phục điều này, chúng tôi cần khôi phục các kích hoạt đến: nhưng chúng tôi không thể tự thay đổi các giá trị đến, chúng tôi phải hoàn tác việc chuẩn hóa của lớp trước bằng cách sử dụng trọng số của lớp hiện tại. Lưu ý rằng trọng số trong bộ lọc chỉ tương tác với một kênh trong lớp trước. Vì vậy, chúng tôi đã bán lại tất cả các trọng số trong tương tác với kênh thứ trong lớp bằng cách nhân chúng với . Điều này hủy bỏ sự chuẩn hóa của lớp trước.WtôiTôikl - 1μl - 1k
Để chính thức hóa, hãy để
Dl -1≡⎡⎣⎢⎢⎢⎢⎢⎢μl - 110⋮00μl - 12Giáo dụcGiáo dụcGiáo dục⋱000μl - 1c⎤⎦⎥⎥⎥⎥⎥⎥ là ma trận đường chéo xây dựng bằng cách sử dụng tất cả các kích hoạt trung bình từ lớp .c × ccl - 1
Sau đó, . (Và đây là lý do chúng tôi định hình lại trọng số thành 2D, để chúng tôi có thể nhân ma trận thay vì tenxơ, vì mục đích rõ ràng.)EX, jm a x ( 0 , WtôiTôiDl - 1μtôiTôi∙Pl - 1j+btôiTôiμtôiTôi) = 1
Cũng lưu ý rằng các lớp gộp tối đa và trung bình sẽ không can thiệp vào sơ đồ này, vì chúng không làm thay đổi tỷ lệ.
Ở trên có lẽ trông phức tạp hơn so với mã thực tế. Tôi đã đẩy một repo GitHub bằng cách triển khai Keras ngắn: https://github.com/corleypc/vgg-n normalize . Nhìn vào mã mẫu có thể sẽ làm sáng tỏ mọi thứ hơn nữa.