Chuyển tới nội dung chính

Trường tiếp nhận

Hai công thức truy hồiStride nhân đôi tốc độNhân nhỏ xếp chồng

Trường tiếp nhận

Một nơ-ron ở lớp thứ mười nhìn được bao nhiêu pixel của ảnh gốc? Đây là câu hỏi trực giác hay đoán sai nhất của CNN, mà lại tính ra được con số chính xác.

Ở bài phép tích chập bạn đã thấy một nhân 3x3 chỉ đọc chín ô ngay dưới nó, và ở bài pooling bạn đã thấy bản đồ đặc trưng nhỏ lại sau mỗi lần gộp. Bây giờ ghép hai chuyện đó lại: một nơ-ron ở lớp sâu đọc vài ô của lớp trước, mỗi ô đó lại đọc vài ô của lớp trước nữa, cứ thế truy ngược về ảnh gốc. Tập pixel gốc mà nó chạm tới được gọi là trường tiếp nhận.

Người ta hay đoán rằng nhân 3x3 thì nơ-ron chỉ nhìn được vùng nhỏ. Sai. Và người ta cũng hay đoán rằng chồng thêm lớp là trường tiếp nhận tăng đều đều. Cũng sai, vì chỉ cần một lớp stride 2 nằm ở giữa là mọi lớp phía sau đổi hẳn tốc độ lớn. Hãy tự dựng chồng lớp rồi đọc bảng.

Trường tiếp nhận · một nơ-ron sâu nhìn được bao nhiêu pixel gốc
Trường tiếp nhận 14 pxBước nhảy 2Tham số 147.712
Cùng số lớp tích chập như trên, nhưng chèn một lớp pooling stride 2. Từ lớp 4 trở đi mỗi lớp cộng 4 chứ không phải 2, nên đuôi bảng chạy tới 14 thay vì 11.

1 · Chồng lớp và hai công thức truy hồi ✎ sửa được

lớploạinhânstridedilationnhân hiệu dụngrkcông thức rkjkcỡ bản đồtham số
0ảnh vàomột pixel là chính nó1r0 = 11640
133r_1 = 1 + (3 - 1) × 1 × 1 = 316236.928
235r_2 = 3 + (3 - 1) × 1 × 1 = 516036.928
326r_3 = 5 + (2 - 1) × 1 × 1 = 62300
4310r_4 = 6 + (3 - 1) × 1 × 2 = 1022836.928
5314r_5 = 10 + (3 - 1) × 1 × 2 = 1422636.928

Số tham số giả định mọi lớp tích chập giữ nguyên C kênh, nên một nhân k×k tốn k × k × C × C trọng số cộng C bias. Lớp pooling không có tham số nào. Đổi C thì cột tham số chạy còn cột r_k đứng yên: hình học và số tham số là hai câu hỏi khác nhau.

2 · Nơ-ron này nhìn thấy đúng những pixel nào ✎ sửa được

Một hàng 64 pixel của ảnh gốc (một chiều cho gọn)Nơ-ron số 10 ở lớp 5 nhìn từ pixel 20 tới 33, tức 14 pixel081624324048566310

3 · Nhân nhỏ xếp chồng rẻ hơn nhân to

cùng trường tiếp nhậncách làmsố lớptrọng sốbiastổng tham sốsố phi tuyếntỉ lệ tham số
5×51 lớp 5×51102.40064102.46411,00×
2 lớp 3×3273.72812873.85620,72×
7×71 lớp 7×71200.70464200.76811,00×
3 lớp 3×33110.592192110.78430,55×
9×91 lớp 9×91331.77664331.84011,00×
4 lớp 3×34147.456256147.71240,45×

Với C = 64 kênh, hai lớp 3×3 phủ đúng 5 pixel như một lớp 5×5, nhưng chỉ tốn 73.856 tham số thay vì 102.464, tức tiết kiệm 28.608, và còn thêm một phi tuyến ở giữa. Càng chồng sâu càng lời: ở 9×9 thì bốn lớp 3×3 chỉ tốn 0,45× so với một lớp 9×9. Đó là lý do các mạng hiện đại gần như chỉ dùng nhân nhỏ.

Sim này không làm được gì
  • Nó tính trường tiếp nhận lý thuyết, tức tập pixel có thể ảnh hưởng tới nơ-ron. Trong một mạng đã huấn luyện, ảnh hưởng thật tập trung ở giữa và tắt dần ra rìa, nên trường tiếp nhận hiệu dụng nhỏ hơn nhiều, thường chỉ bằng một phần của con số ở đây. Muốn đo nó phải lấy đạo hàm của đầu ra theo từng pixel đầu vào trên một mô hình thật. Sim không làm được chuyện đó và không giả vờ làm được.
  • Hình vẽ một chiều. Ảnh thật hai chiều, và mọi con số ở đây áp cho từng trục: trường tiếp nhận 14 nghĩa là một vùng 14×14 pixel, không phải 14 pixel.
  • Mọi lớp ở đây dùng valid padding, không đệm. Có đệm thì cỡ bản đồ đặc trưng khác đi, nhưng trường tiếp nhận không đổi: đệm thêm pixel giả chứ không cho nơ-ron nhìn xa hơn.
  • Số tham số giả định mọi lớp tích chập giữ nguyên C kênh vào và ra, và một bias cho mỗi kênh ra. Mạng thật đổi số kênh theo độ sâu, nên con số tuyệt đối chỉ để so tương đối giữa hai cách xếp, đừng đem đi báo cáo.

Hai công thức, đọc một lần là nhớ

Gọi r_k là trường tiếp nhận sau k lớp, j_kbước nhảy tích luỹ, tức khoảng cách trên ảnh gốc giữa hai nơ-ron cạnh nhau ở lớp k. Khởi đầu r_0 = 1j_0 = 1: một nơ-ron ở lớp 0 chính là một pixel.

r_k = r_(k-1) + (nhân_k - 1) × dilation_k × j_(k-1)
j_k = j_(k-1) × stride_k

Câu quan trọng nằm ở thừa số cuối của dòng trên: phần lớn thêm của lớp k được nhân với j_(k-1), tức tích mọi stride của các lớp đứng trước nó, chứ không phải stride của chính nó. Một lớp không tự làm mình nhìn xa hơn, nó chỉ hưởng cái mà các lớp trước đã làm thưa ra.

Chồng nhân nhỏ thì lớn tuyến tính. Với k lớp 3x3 stride 1, mỗi lớp cộng đúng (3 - 1) × 1 × 1 = 2, nên r_k = 2k + 1: dãy 1, 3, 5, 7, 9, 11. Muốn nhìn được 101 pixel thì cần 50 lớp. Chậm.

Một lớp stride 2 đổi hẳn cuộc chơi. Sau nó j thành 2, nên mỗi lớp 3x3 phía sau cộng 4 chứ không phải 2. Trong sim, bấm preset Năm lớp 3×3 stride 1 rồi bấm Một lớp stride 2 ở giữa: vẫn năm lớp, mà đuôi bảng chạy từ 11 lên 14, và cái đó còn rẻ hơn chứ không đắt hơn, vì lớp pooling không có trọng số nào nên tổng tham số tụt từ 184.640 xuống 147.712. Thêm một lớp stride 2 nữa thì các lớp sau cộng 8. Đây là lý do mọi mạng phân loại ảnh đều giảm độ phân giải vài lần trên đường đi: đó là cách rẻ nhất để nhìn xa.

Muốn tách bạch hẳn thì giữ nguyên chồng mặc định và chỉ đổi stride của lớp 3 từ 2 về 1, không đụng gì khác: trường tiếp nhận cuối tụt từ 14 xuống 10, số tham số không đổi một chút nào. Cái làm nên chênh lệch là bước nhảy, không phải trọng số.

Cái giá phải trả nằm ở cột cỡ bản đồ. Chồng phẳng giữ 54 vị trí đầu ra trên hàng 64 pixel, chồng có stride 2 chỉ còn 26. Nhìn xa hơn nhưng thô hơn.

Nhân nhỏ xếp chồng rẻ hơn nhân to

Hai lớp 3x3 nối tiếp phủ đúng 5 pixel như một lớp 5x5. Nhưng với C = 64 kênh, một lớp 5x5 tốn 102.464 tham số, còn hai lớp 3x3 chỉ tốn 73.856, tiết kiệm 28.608. Lý do là số trọng số đi theo k × k, mà 9 + 9 thì nhỏ hơn 25. Chồng càng sâu càng lời: bốn lớp 3x3 phủ 9 pixel chỉ tốn 0,45 lần một lớp 9x9.

Thêm một điểm nữa mà bảng tham số không nói ra: giữa hai lớp 3x3 có một hàm phi tuyến, còn lớp 5x5 chỉ có một. Hai phép biến đổi phi tuyến nối tiếp diễn tả được nhiều thứ hơn một phép. Rẻ hơn và mạnh hơn cùng lúc, nên từ VGG trở đi gần như không ai dùng nhân lớn ở giữa mạng nữa.

Dilation: nhìn xa mà không trả gì

Đổi cột dilation của một lớp trong sim. Nhân 3x3 với dilation 4 vẫn chỉ có 9 trọng số, vẫn không giảm độ phân giải, nhưng phủ 9 pixel thay vì 3. Preset Giãn nở 1, 2, 4 chỉ ba lớp mà đã tới 15, trong khi ba lớp 3x3 thường mới tới 7, và hai bên tốn đúng bằng nhau: 110.784 tham số.

Chỗ này có một cái bẫy mà sim vẽ ra cho bạn thấy. Một lớp dilation 4 đứng riêng chỉ chạm 3 pixel trong khoảng 9 pixel của nó, sáu pixel còn lại là lỗ. Công thức r_k đo bề rộng khoảng, không đo số pixel thật sự chạm được. Xếp dilation theo bậc 1, 2, 4 thì các lỗ lấp lẫn nhau và tập pixel trở lại liền mạch, còn xếp 2, 2, 2 thì lỗ chồng lên lỗ. Trong sim, chỗ tô đậm là pixel chạm thật, chỗ tô nhạt là lỗ.

Lý thuyết và thực tế: hai con số khác nhau

Mọi con số trong sim là trường tiếp nhận lý thuyết, tức tập pixel có thể ảnh hưởng tới nơ-ron. Trong một mạng đã huấn luyện, ảnh hưởng thật không trải đều: nó tập trung mạnh ở giữa và tắt dần ra rìa, gần như hình chuông. Phần rìa của khoảng đóng góp rất ít, nên trường tiếp nhận hiệu dụng thường nhỏ hơn hẳn con số lý thuyết.

Sim không đo được chuyện đó, và cũng không giả vờ đo được. Muốn biết trường tiếp nhận hiệu dụng thì phải lấy đạo hàm của một nơ-ron đầu ra theo từng pixel đầu vào trên một mô hình thật rồi nhìn độ lớn của nó, chứ không có công thức đóng nào cho ra. Hãy đọc con số r_k như một giới hạn trên hình học: xa nhất thì tín hiệu có thể đi tới đó. Nó không hứa rằng mạng của bạn thật sự dùng hết tầm đó.

Điều rút ra

Trường tiếp nhận chạy theo r_k = r_(k-1) + (nhân_k - 1) × dilation_k × j_(k-1), nên chồng nhân 3x3 stride 1 chỉ lớn tuyến tính 2k + 1, còn một lớp stride 2 làm mọi lớp phía sau lớn nhanh gấp đôi. Muốn nhìn xa mà rẻ thì chồng nhân nhỏ, giảm độ phân giải vài lần, hoặc dùng dilation. Và nhớ rằng con số này là giới hạn lý thuyết: trường tiếp nhận hiệu dụng của một mạng đã huấn luyện nhỏ hơn nhiều.

Kiểm tra nhanh0/3 đúngchưa trả lời
  1. 1Chồng ba lớp theo thứ tự: conv 3x3 stride 1, conv 3x3 stride 2, conv 3x3 stride 1. Trường tiếp nhận cuối cùng là bao nhiêu pixel?
  2. 2So một lớp 5x5 với hai lớp 3x3 nối tiếp, cùng C kênh vào và ra. Điều nào đúng?
  3. 3Sim báo trường tiếp nhận của lớp cuối là 94 pixel. Kết luận nào là đúng?