Pooling
Pooling
Lớp duy nhất trong mạng tích chập không có một trọng số nào để học. Nó gộp mỗi cửa sổ thành một con số theo một quy tắc cố định, và chỗ đáng học nhất không phải chiều đi lên mà là chiều gradient chảy ngược về.
Sau một lớp tích chập, bản đồ đặc trưng vẫn còn khá lớn. Pooling đi qua bản đồ theo từng cửa sổ nhỏ và gộp mỗi cửa sổ thành đúng một con số. Câu đó thì ai cũng đọc được. Cái đáng học nằm ở bốn hệ quả của nó: lớp này không học gì cả, hai chế độ max và trung bình giữ lại hai thứ khác nhau, gradient chảy ngược qua chúng theo hai cách khác nhau hẳn, và việc mất thông tin là chủ ý chứ không phải tác dụng phụ.
Bài này ở lại trên một kênh duy nhất và một cửa sổ 2x2, để mọi con số tính tay được. Chuyện cỡ đầu ra và số tham số của một lớp tích chập thuộc về bài kích thước đầu ra và số tham số, chuyện trường tiếp nhận lớn nhanh ra sao khi giảm độ phân giải thuộc về bài trường tiếp nhận, và chuyện gộp trung bình toàn cục thay cho lớp nối đầy đủ thuộc về bài đi hết một kiến trúc CNN. Ở đây không nhắc lại chúng.
Ở trạng thái mở bài, sim đang nói gì
Bản đồ vào là 6x6, tức 36 ô, giá trị nguyên từ 0 tới 9, tổng cộng 79. Cửa sổ là 2x2 và bước nhảy là 2, nên các cửa sổ không chồng lên nhau: có đúng 9 vị trí đặt cửa sổ, mỗi cửa sổ phủ 4 ô, và bản đồ ra là 3x3, tức 9 ô. Pooling ở cấu hình này giữ lại đúng một phần tư số ô.
Ô đọc trên thanh công cụ còn một con số nữa, và nó là con số quan trọng nhất của cả bài: 0 tham số học được.
Chế độ mở bài là Max, và bản đồ ra đọc
8 2 9
3 7 4
5 3 8
Bấm sang Trung bình thì cùng bản đồ vào cho
2.25 1.5 3.25
1.5 3.5 1.75
1.75 1.75 2.5
Hai bảng đó cộng lại cho hai con số rất khác nhau: 49 với max và 19.75 với trung bình. Con số thứ hai không phải trùng hợp, nó đúng bằng 79 / 4, vì khi các cửa sổ phủ kín và không chồng nhau thì trung bình pooling chỉ là phép lấy trung bình từng khối. Còn 49 thì lớn hơn 2.48 lần, vì max chỉ đếm những đỉnh.
Lớp này không có tham số học được nào
Đây là chỗ phân biệt cốt lõi với tích chập, và nó đáng nói trước mọi thứ khác. Một lớp tích chập tính ra con số của nó từ trọng số, và những trọng số ấy đổi trong lúc huấn luyện. Một lớp pooling tính ra con số của nó từ một quy tắc cố định: lấy cực đại, hoặc lấy trung bình. Không có gì để khởi tạo, không có gì để điều chuẩn, không có gì đổi giữa lúc bắt đầu huấn luyện và lúc kết thúc.
Hệ quả thẳng thắn: lớp này không thể học để giữ đúng thứ bạn cần. Muốn đổi cái nó giữ thì chỉ có ba núm, và cả ba đều do người thiết kế mạng đặt tay chứ không do dữ liệu quyết định: cỡ cửa sổ, bước nhảy, và chọn max hay trung bình.
Hệ quả thứ hai, và nó dẫn thẳng sang mục sau: nếu lớp không có trọng số thì chiều đi ngược của nó không tính đạo hàm theo trọng số nào cả, nó chỉ chuyển gradient về chỗ khác. Toàn bộ nội dung của phép lan truyền ngược qua một lớp pooling là câu hỏi "gradient của một ô đầu ra chảy về ô đầu vào nào".
Max và trung bình trên cùng một cửa sổ
Bấm Bước tới ô (1,1) của bản đồ ra. Cửa sổ ở đó phủ bốn ô 0, 7, 6, 1.
Max trả về 7, tức nó giữ tín hiệu mạnh nhất và bỏ hẳn ba ô còn lại. Trung bình cộng bốn số thành 14 rồi chia 4 được 3.5, tức nó pha loãng: cái 7 bị ba ô yếu hơn kéo xuống một nửa. Hai chế độ chênh nhau đúng 3.5 trên cùng một cửa sổ, và không có ô nào trong ảnh thay đổi cả.
Cửa sổ đầu tiên, ô (0,0) của bản đồ ra, còn rõ hơn: bốn giá trị là 1, 0, 0, 8. Max cho 8, trung bình cho 2.25. Một đỉnh cao nằm giữa ba ô gần như trống thì với max nó vẫn là một đỉnh cao, còn với trung bình nó gần như biến mất.
Một cách khác để thấy sự khác nhau: max luôn trả lại đúng một trong những số nó nhận vào, còn trung bình thì thường không. Ở trạng thái mở bài, 0 trong 9 ô của bản đồ trung bình trùng với một ô mà cửa sổ của nó phủ.
Còn quan hệ thứ tự thì chính xác hơn câu "max lớn hơn" thường được nói: max pooling luôn lớn hơn hoặc bằng trung bình pooling trên cùng cửa sổ, và bằng nhau đúng khi cửa sổ phẳng. Cổng kiểm của bài đo điều đó trên 9127 cửa sổ, gồm chín dạng bản đồ với mọi cỡ, mọi cửa sổ và mọi bước nhảy trong dải cho phép: 7398 cửa sổ phẳng và cả 7398 đều cho hai giá trị bằng nhau, 1729 cửa sổ không phẳng và cả 1729 đều cho max lớn hẳn, 0 phản ví dụ. Đó là một tương đương hai chiều đã đo, không phải một câu nói cho hay.
Một chi tiết nhỏ về hiển thị. Trung bình của một cửa sổ 2x2 luôn rơi vào một phần tư, tức x.0, x.25, x.5 hoặc x.75, nên hai chữ số thập phân in nó ra chính xác. Nếu ô hiển thị chỉ giữ một chữ số thập phân thì 5 trong 9 ô của bản đồ trung bình sẽ hiện một con số sai: 2.25 thành 2.3, 1.75 thành 1.8. Người học vừa cộng bốn số nguyên bằng tay sẽ không tìm ra lỗi của mình ở đâu, vì lỗi không nằm ở họ.
Gradient: max chảy về đúng một ô, trung bình chia đều cho mọi ô
Hàng Gradient chảy về trong khung giữa và lưới gradient dưới bản đồ ra là chỗ đáng xem nhất của cả sim. Cho mỗi ô đầu ra gửi về đúng 1 đơn vị gradient rồi xem 1 đó rơi vào đâu.
Với Max, lưới gradient trên bản đồ vào 6x6 đọc
0 0 1 0 0 0
0 1 0 0 1 0
1 0 0 1 0 0
0 0 0 0 0 1
0 1 0 0 1 0
0 0 1 0 0 0
Đúng 9 ô trong 36 ô nhận được gì đó, mỗi ô nhận đúng 1, và 27 ô còn lại nhận 0. Chín ô sáng đó chính là chín ô thắng của chín cửa sổ. Nói cách khác, với max pooling thì ba phần tư bản đồ vào không nhận một chút gradient nào ở lượt này, và một ô thua thì không nhận gì kể cả khi nó chỉ kém ô thắng đúng một đơn vị.
Bấm sang Trung bình và lưới đổi hẳn: cả 36 ô đều nhận, và mỗi ô nhận đúng 0.25. Con số 0.25 là 1/4, và 4 là số ô trong cửa sổ. Tổng quát, với cửa sổ k×k thì trung bình pooling chia gradient thành 1/k² cho mỗi ô: cửa sổ 2x2 cho 1/4 = 0.25, cửa sổ 3x3 cho 1/9, xấp xỉ 0.111.
Cả hai chế độ đều bảo toàn tổng: chín ô đầu ra gửi về tổng 9, và tổng gradient nhận được trên bản đồ vào cũng đúng 9 với cả max và trung bình. Cổng kiểm đo điều đó trên 2080 cấu hình, không có cấu hình nào lệch.
Đây là chỗ nên nói rõ một điều dễ nghĩ sai. Trung bình pooling có phép chia, nên câu hỏi tự nhiên là nó có sai số dấu phẩy động hay không, và câu trả lời khác nhau ở hai vế.
- Giá trị đi lên thì đúng tuyệt đối. Cài đặt ở đây cộng các giá trị trước rồi chia đúng một lần, nên một cửa sổ phẳng toàn số nguyên trả về đúng số đó, kể cả với
k = 3nơi1/9không phải phân số nhị phân:63 / 9bằng đúng7, không sai một bit. Cổng kiểm đo trên11240ô đầu ra của bản đồ hằng và khe lệch lớn nhất là0. - Còn tổng các phần gradient thì không. Các phần chia là
k²bản sao của1/k², và cộng chúng lại chỉ đúng bằng1khik²là luỹ thừa của hai. Vớik = 1,k = 2vàk = 4thì đúng tuyệt đối; vớik = 3thì tổng là1.0000000000000002.
Chênh lệch đó không phải chuyện của số học mà là chuyện của đường đi. Nếu tính trung bình theo cách hiển nhiên khác, cộng từng v/k² một, thì kết quả không còn đúng tuyệt đối nữa: trong 40 ca bản đồ hằng mà cổng kiểm thử, 5 ca cho ra sai số, và cả 5 đều ở k = 3. Nên câu "trung bình pooling đúng tuyệt đối" chỉ đúng với cài đặt cộng trước chia sau, và đó là một lựa chọn cài đặt chứ không phải một định lý.
Còn một hệ quả rất thực tế của chuyện gradient. Ở trạng thái mở bài, hạ ô (0,0) từ 1 xuống 0 thì bản đồ max không đổi một ô nào, còn bản đồ trung bình đổi 1 ô. Điều đó khớp đúng với lưới gradient: ô (0,0) nhận 0 dưới max và 0.25 dưới trung bình, nên chỉ một trong hai chế độ có thể cảm nhận được thay đổi ấy.
Nếu bước nhảy nhỏ hơn cỡ cửa sổ thì các cửa sổ chồng lên nhau và gradient cộng dồn chứ không ghi đè. Ở cửa sổ 2x2 bước 1 trên bản đồ 6x6 có 25 cửa sổ, tổng gradient là 25, ô giữa nằm dưới 4 cửa sổ nên nhận 1, còn ô góc nằm dưới 1 cửa sổ nên nhận 0.25. Sim này để bước nhảy bằng cỡ cửa sổ, nhưng con số đó cổng kiểm vẫn đo.
Ca hoà: hai ô cùng giá trị lớn nhất
Trạng thái mở bài có sẵn đúng 1 cửa sổ hoà, và bạn không phải dựng nó lên. Bấm Bước một lần để tới ô (0,1) của bản đồ ra. Bốn giá trị của cửa sổ là 2, 1, 1, 2, tức hai ô cùng giữ giá trị lớn nhất là 2.
Giá trị đi lên thì không có gì phải bàn, 2 là 2 bất kể chọn ô nào. Nhưng gradient thì phải chọn, và đo được cài đặt ở đây làm gì: nó đưa cả 1 đơn vị cho ô đầu tiên theo thứ tự đọc, tức ô hàng 0 cột 2 của bản đồ vào. Ô hoà còn lại, hàng 1 cột 3, nhận đúng 0. Trong khung giữa, cả hai ô hoà đều được đánh dấu là đỉnh nhưng chỉ một ô có vòng viền, và dòng chữ dưới đó nói thẳng là hoà.
Hãy đọc chuyện này cho đúng: đây là một quy ước, không phải một chân lý. Lấy ô cuối cùng theo thứ tự đọc cũng hợp lý y như vậy, chia đôi gradient cho hai ô hoà cũng hợp lý. Ba cách cho ba gradient khác nhau và cùng một bản đồ đi lên, nên hai cài đặt có thể in ra mọi con số giống nhau mà vẫn huấn luyện ra hai mô hình khác nhau. Đó là loại khác biệt không lộ ra khi bạn so đầu ra.
Và ca hoà không phải chuyện hiếm gặp. Trên lưới cấu hình mà cổng kiểm quét, 4937 trong 9127 cửa sổ có cực đại không duy nhất, tức 54,1 phần trăm, phần lớn là vì bản đồ đặc trưng thật có rất nhiều ô bằng nhau, đặc biệt sau một hàm kích hoạt cắt âm về 0. Trong mọi cửa sổ hoà đó, quy ước "lấy ô cuối" sẽ chọn một ô khác, đúng theo định nghĩa của chữ hoà.
Mất thông tin là chủ ý, và nó đổi lấy cái gì
Pooling đánh đổi độ phân giải để lấy tính bất biến với dịch chuyển nhỏ. Câu đó thường được nói gọn thành "pooling làm mạng bất biến với dịch chuyển", và câu gọn ấy sai. Sim này đo được nó sai bao nhiêu.
Bấm Dịch phải 1 ô. Cả bản đồ trượt sang phải một cột, cột trống bên trái điền 0, và cột cuối rơi ra ngoài chứ không quay vòng. Bản đồ max thành
1 8 9
3 6 7
1 5 8
So với bảng ban đầu thì 6 trong 9 ô đã đổi. Đổi sang Trung bình rồi làm lại: cả 9 trên 9 ô đổi. Dịch xuống một hàng thay vì sang phải thì max đổi 5 ô, trung bình vẫn đổi cả 9.
Vậy kết luận đúng là: max pooling ổn định hơn trung bình pooling dưới một phép dịch một điểm, nhưng cả hai đều còn rất xa bất biến. Cổng kiểm quét 944 cấu hình và trong mọi cấu hình max đổi ít hơn hoặc bằng trung bình, tổng cộng 1531 ô đổi dưới max so với 3293 ô dưới trung bình, tức hơn gấp đôi. Nhưng 6 trên 9 thì không ai gọi là bất biến được.
Một phần của thay đổi ấy còn không phải lỗi của pooling: phép dịch tự nó đã làm 33 trong 36 ô của bản đồ vào khác đi, và cột bị đẩy ra ngoài mang theo tổng 9. Nói cách khác, phép thử này đo pooling cộng với việc mất một cột, và nên đọc nó như vậy.
Thế thì pooling bất biến với cái gì? Với việc di chuyển giá trị bên trong đúng một cửa sổ. Một đỉnh đơn độc nằm ở ô (0,0) hay ở ô (1,1) đều cho cùng bản đồ ra, vì cả hai ô nằm trong cùng một cửa sổ; đẩy nó thêm một ô nữa sang (0,2) là nó sang cửa sổ kế bên và bản đồ ra đổi ngay. Nhưng chỗ này có một bẫy mà tôi tự sa vào rồi cổng kiểm bắt được: tính bất biến ấy không phải đặc sản của max. Cả hai chế độ chỉ đọc tập giá trị của cửa sổ chứ không đọc thứ tự, nên mọi phép đảo chỗ bên trong một cửa sổ đều để nguyên cả hai bản đồ. Đo trên trạng thái mở bài: đổi chỗ hai ô chéo nhau trong cả chín cửa sổ, cả bản đồ max lẫn bản đồ trung bình đều không đổi một ô nào.
Cái mà max có mà trung bình không có là chuyện khác: max không thấy gì cả khi một ô thua thay đổi, còn trung bình thấy mọi thay đổi. Đó đúng là ví dụ hạ ô (0,0) từ 1 xuống 0 ở mục trên.
Về mặt kích thước thì pooling dùng đúng phép đếm vị trí cửa sổ của bài phép tích chập với số ô đệm bằng 0, nên ở đây chỉ cần một câu: bản đồ 6x6 với cửa sổ 2 bước 2 cho 3x3 và không bỏ rơi ô nào, còn bản đồ 7x7 cùng cấu hình vẫn cho 3x3 và bỏ rơi hẳn một hàng với một cột, tức chỉ 36 trong 49 ô từng nằm dưới một cửa sổ. Thư viện thật cũng vứt đúng như vậy và không báo gì.
Vì sao nhiều kiến trúc mới thay pooling bằng tích chập bước nhảy 2
Một lớp tích chập bước nhảy 2 cũng giảm mỗi chiều đi khoảng một nửa, đúng như một lớp pooling 2x2 bước 2. Khác biệt nằm ở chỗ nó có trọng số: nó học được nên giữ tổ hợp nào của bốn ô, thay vì bị bắt phải lấy cực đại hoặc lấy trung bình. Với pooling thì cái nó giữ đã bị chốt từ trước khi thấy dữ liệu, và con số 0 tham số học được trên thanh công cụ chính là cách nói khác của câu đó.
Cái phải trả là một lớp tích chập bước nhảy 2 thêm tham số vào mô hình, còn pooling thêm 0. Phần kế toán ấy nằm ở bài kích thước đầu ra và số tham số, còn ảnh hưởng của một lớp bước nhảy 2 lên trường tiếp nhận của mọi lớp phía sau nằm ở bài trường tiếp nhận.
Và nói cho rõ giới hạn: sim này không huấn luyện gì cả, nên không câu nào ở đây chứng minh được lựa chọn nào học tốt hơn. Chuyện các kiến trúc gần đây hay dùng tích chập bước nhảy 2 là một quan sát về thực tiễn của người khác, không phải điều bài này đo được.
Những con số trong bài được kiểm bằng gì
Mọi con số bạn vừa đọc bị một cổng kiểm khoá lại, hiện là 392 khẳng định, và cổng không tin phép tính của engine. Nó dựng lại kết quả bằng những đường độc lập.
Đường thứ nhất đếm vị trí cửa sổ trong một vòng lặp không có phép chia và không có phần nguyên, nên nó không thể thừa hưởng lỗi của công thức đóng. Đường thứ hai tính lại max và trung bình bằng vòng lặp viết riêng, đi qua mỗi cửa sổ theo cột trong khi engine đi theo hàng, giữ cực đại bằng một biến chạy thay vì bằng một chỉ số, và đếm số ô thay vì hỏi độ dài. Đối chiếu từng ô trên 18254 ô đầu ra, gồm chín dạng bản đồ, tám cỡ, bốn cỡ cửa sổ, bốn bước nhảy và hai chế độ, không lệch một bit nào. Đường thứ ba dựng lại chiều đi ngược từ đầu và đối chiếu 73856 ô gradient. Đường thứ tư là những bất biến không cần cài đặt tham chiếu nào: bản đồ hằng phải trả về đúng hằng đó, tổng gradient phải bảo toàn, và max phải lớn hơn hoặc bằng trung bình.
Cổng cũng tự kiểm chính nó. Nó cố tình phá engine mười lần rồi đòi mình phải báo đỏ: đổi quy ước hoà từ ô đầu sang ô cuối, đổi phần nguyên thành phần nguyên trên, hoán hàng với cột trong phép quét, bỏ phép chia của phần gradient trung bình, cho gradient chảy về mọi ô hoà thay vì một ô, đổi trung bình sang cách cộng từng v/k², kéo dải màu ô đầu ra trở lại mức cũ, đổi bước nhảy mặc định, cắt bớt một chữ số thập phân của hàm hiển thị, và cho phép dịch quay vòng thay vì rơi ra ngoài. Cả mười đều làm cổng đỏ với mã thoát 1, và hoàn nguyên thì cổng xanh lại với mã thoát 0.
Bài này còn sửa một lỗi tương phản có thật trên chính trang này. Ô của bản đồ ra trước đây tô tới 85 phần trăm sắc đỏ và đảo mực sang trắng khi giá trị vượt một nửa dải, nên ô đọc 5 là chữ trắng trên nền hồng nhạt và đo được 2,81:1, dưới ngưỡng AA gần một nửa. Chỗ sửa là màu nền: dải tô dừng ở 50 phần trăm và bỏ hẳn nhánh mực trắng, để một mực duy nhất phục vụ cả dải. Đo lại: 5,52:1 ở chế độ sáng và 10,91:1 ở chế độ tối.
Cuối cùng, những gì bài này không nói. Không có huấn luyện nào ở đây, nên không câu nào chứng minh pooling giúp mạng chính xác hơn, cũng không câu nào nói max tốt hơn trung bình. Bản đồ vào là bản đồ do người viết đặt tay, không phải đầu ra thật của một lớp tích chập đã huấn luyện. Và quy ước phá hoà thì bài đã nói rõ là quy ước.
Pooling là lớp không có tham số học được nào, nên toàn bộ nội dung của chiều đi ngược là chuyện gradient chảy về đâu. Với max, đúng 9 trong 36 ô của bản đồ vào nhận gradient, mỗi ô nhận 1, còn 27 ô nhận 0; với trung bình, cả 36 ô nhận, mỗi ô 0.25, tức 1/k² với cửa sổ k×k. Hai chế độ đều bảo toàn tổng gradient, nhưng giá trị đi lên của trung bình đúng tuyệt đối trong khi tổng các phần 1/k² thì không, cụ thể 1.0000000000000002 ở k = 3. Trên cùng một cửa sổ, max luôn lớn hơn hoặc bằng trung bình và bằng nhau đúng khi cửa sổ phẳng. Ca hoà thì cài đặt lấy ô đầu theo thứ tự đọc, và đó là quy ước. Còn "pooling bất biến với dịch chuyển" là sai: dịch một cột làm 6 trong 9 ô của bản đồ max đổi giá trị.
- 1Cho mỗi ô của bản đồ ra 3x3 gửi về 1 đơn vị gradient. Trên bản đồ vào 6x6, max pooling và trung bình pooling để lại gì?
- 2Một cửa sổ 2x2 chứa bốn giá trị 2, 1, 1, 2, tức hai ô cùng lớn nhất. Max pooling xử lý thế nào?
- 3Bấm Dịch phải 1 ô ở trạng thái mở bài. Bản đồ max 3x3 đổi bao nhiêu ô, và kết luận nào đúng?