Kênh và tích chập 1 × 1
Kênh và tích chập 1 × 1
Chiều mà sinh viên hay bỏ quên. Hiểu đúng chiều kênh thì phần lớn mẹo làm nhẹ mạng tự nhiên sáng ra.
Trong bài phép tích chập bạn đã trượt một nhân 3x3 trên
một ảnh xám và thấy mỗi ô đầu ra sinh ra từ chín phép nhân rồi cộng. Ảnh xám
chỉ có một kênh, nên ở đó bộ lọc đúng là một ô vuông phẳng. Từ lớp thứ hai trở
đi thì không còn như vậy nữa: khối vào dày lên tới 64, 256, có khi cả nghìn
kênh, và một bộ lọc phải dày đúng bằng khối vào.
Đây là chỗ hiểu sai phổ biến nhất. Một bộ lọc của lớp tích chập 3x3 trên khối
vào 64 kênh không có 9 trọng số, nó có 3 x 3 x 64 = 576 trọng số. Nó là một
khối ba chiều, trượt trên khối vào, ở mỗi vị trí nhân từng phần tử với cả 64
lát rồi cộng tất cả lại thành đúng một con số. Muốn 128 kênh ra thì cần 128
khối như thế. Sim dưới đây cho bạn đổi mọi con số trong câu vừa rồi và xem hoá
đơn tham số tính lại ngay.
k × k phẳng. Không phải. Một bộ lọc của lớp này là một khối ba chiều 3 × 3 × 64, tức 576 trọng số cho một bộ lọc. Nó trượt trên khối vào, ở mỗi vị trí nhân từng phần tử với cả 64 lát rồi cộng hết lại thành một số. Một bộ lọc cho ra một kênh, nên muốn 128 kênh ra thì cần 128 khối như vậy.| Kiểu lớp | Thành phần | Trọng số | Bias | Tổng tham số | Phép nhân cộng | So với thường |
|---|---|---|---|---|---|---|
| Tích chập thường k × k | tích chập thường k × k 128 × 64 / 1 × 3 × 373.728 | 73.728 | 0 | 73.728 | 231,21 M | 1,00×bớt 0,0% |
| Tích chập 1 × 1 | tích chập 1 × 1 (điểm) 128 × 64 / 1 × 1 × 18.192 | 8.192 | 0 | 8.192 | 25,69 M | 9,00×bớt 88,9% |
| Tách theo chiều sâu | tích chập theo chiều sâu k × k 64 × 64 / 64 × 3 × 3576tích chập 1 × 1 (điểm) 128 × 64 / 1 × 1 × 18.192 | 8.768 | 0 | 8.768 | 27,50 M | 8,41×bớt 88,1% |
| Theo nhóm | tích chập theo nhóm k × k 128 × 64 / 4 × 3 × 318.432 | 18.432 | 0 | 18.432 | 57,80 M | 4,00×bớt 75,0% |
trọng số = C_out × (C_in / g) × k × k, với g = 1 cho kiểu thườngphép nhân cộng = trọng số × 56 × 56 = trọng số × 3.136(C_in × k² + C_in × C_out) / (C_out × C_in × k²) = 1/C_out + 1/k²1/128 + 1/9 = 0,1189241/C_out tắt dần, còn lại k² = 99,00×k = 3 thì bội số chỉ chạm 8 lần khi C_out đạt 72, và dù C_out có lớn tới đâu nó cũng không vượt 9.| k | Thường | Tách sâu | Bội số tiết kiệm | Trần k² |
|---|---|---|---|---|
| 1 | 8.192 | 8.256 | 0,99× | 1 |
| 3 | 73.728 | 8.768 | 8,41× | 9 |
| 5 | 204.800 | 9.792 | 20,92× | 25 |
| 7 | 401.408 | 11.328 | 35,44× | 49 |
| 9 | 663.552 | 13.376 | 49,61× | 81 |
| 11 | 991.232 | 15.936 | 62,20× | 121 |
k = 1: bội số bằng 0,99×, tức nhỏ hơn 1. Khi nhân đã là 1 × 1 thì tách ra chỉ tổ thêm việc, vì phần theo chiều sâu không còn gì để tách. Tiết kiệm sinh ra từ chỗ k² lớn, không phải từ phép tách.64 kênh xuống 16 kênh, làm 3 × 3 ở đó, rồi nở lên 128 kênh.| Bước | Công thức | Trọng số |
|---|---|---|
| Bóp bằng 1 × 1 | 16 × 64 × 1 × 1 | 1.024 |
| Nhân k × k trên kênh đã bóp | 16 × 16 × 3 × 3 | 2.304 |
| Nở lại bằng 1 × 1 | 128 × 16 × 1 × 1 | 2.048 |
| Cả khối | cộng ba dòng trên | 5.376 |
| Một lớp k × k thẳng, cùng vào cùng ra | 128 × 64 × 3 × 3 | 73.728 |
| Khối rẻ hơn lớp thẳng | 73.728 / 5.376 | 13,71× |
3 × 3 thẳng, tức rẻ hơn 13,71×. Phép nhân cộng cũng theo tỉ lệ đó: 16,86 M so với 231,21 M. Đây là lý do tích chập 1 × 1 có mặt gần như trong mọi mạng hiện đại: nó là cái van đổi số kênh với giá rẻ.3 × 3 × 2, nên lớp này có 36 trọng số và cho ra 2 kênh, mỗi kênh 2 × 2. Chú ý dòng cộng ở trên: hai kênh vào không được giữ riêng, chúng bị cộng thành một số duy nhất. Đó là lý do khối ra chỉ dày bằng số bộ lọc, không dày bằng số kênh vào nhân số bộ lọc.3 × 3 × 2. Ở ô (0, 0) nó tính 2·1 + -1·1 = 1. Bản đồ ra giữ nguyên 4 × 4 vì cửa sổ rộng đúng một điểm, và mỗi ô chỉ nhìn đúng cột kênh nằm dưới nó. Không thấy hàng xóm, chỉ trộn kênh. Đổi hai trọng số trên và nhìn cả bản đồ đổi theo.Đọc bảng so sánh thế nào
Ở trạng thái mặc định, lớp đang xét là 64 kênh vào, 128 kênh ra, nhân 3x3,
bản đồ ra 56 x 56. Bốn dòng trong bảng nói bốn chuyện khác nhau về cùng một
nhiệm vụ: biến khối 64 kênh thành khối 128 kênh.
- Tích chập thường tốn
128 x 64 x 3 x 3 = 73.728trọng số. Mỗi kênh ra nhìn cả 64 kênh vào trên một vùng3x3. Đây là mốc. - Tích chập 1 × 1 tốn
128 x 64 = 8.192trọng số, đúng bằng một phần chín. Nó không nhìn hàng xóm nào cả, cửa sổ của nó rộng đúng một điểm. Việc duy nhất nó làm là trộn kênh. - Tách theo chiều sâu tốn
8.768trọng số, gồm64 x 9 = 576cho phần chạy riêng từng kênh và64 x 128 = 8.192cho phần trộn kênh. Rẻ hơn8,41lần. - Theo nhóm với
g = 4tốn18.432, đúng bằng một phần tư. Chia kênh thành bốn nhóm thì mỗi bộ lọc chỉ còn nhìn một phần tư số kênh vào.
Hai quan hệ đáng ghim vào đầu, và cả hai đều kiểm được ngay trên sim. Thứ nhất,
đặt số nhóm về 1 thì dòng theo nhóm trùng khít dòng thường, từng chữ số.
Thứ hai, đặt C_out = C_in rồi cho số nhóm bằng C_in thì tích chập theo nhóm
chính là phần chạy riêng từng kênh của tách theo chiều sâu. Tích chập theo
nhóm không phải một họ riêng, nó là cái thước trượt giữa hai đầu mút quen thuộc.
Bội số tiết kiệm không phải hằng số
Nhiều bài viết nói gọn rằng tách theo chiều sâu rẻ hơn khoảng tám tới chín lần.
Con số đó có nguồn gốc rõ ràng, và nó phụ thuộc k:
(C_in x k² + C_in x C_out) / (C_out x C_in x k²) = 1/C_out + 1/k²
Nghịch đảo của tổng đó chính là bội số tiết kiệm. Khi C_out lớn dần thì
1/C_out tắt đi, chỉ còn 1/k², nên bội số tiến tới k² mà không bao giờ
đạt tới. Với k = 3 trần đó là 9, và bội số đạt đúng 8 khi C_out bằng 72, và chỉ vượt 8 từ 73 trở lên.
Hãy thử ca tính tay: chọn cấu hình mẫu lớp đầu 3 → 64, bạn sẽ thấy
64 x 3 x 3 x 3 = 1.728 trọng số cho tích chập thường, 27 + 192 = 219 cho
tách theo chiều sâu, và bội số 7,89, tức chưa tới 8. Đổi k sang 5 rồi 7
và nhìn cột trần k² chạy theo. Ngược lại, đặt k = 1 thì bội số tụt xuống
dưới 1: khi nhân đã là một điểm thì không còn gì để tách, tách ra chỉ tổ thêm
việc. Tiết kiệm sinh ra từ chỗ k² lớn, không sinh ra từ phép tách.
Vì sao 1 × 1 lại có mặt ở khắp nơi
Một lớp 1x1 không nhìn thấy không gian, nghe qua thì có vẻ vô dụng. Nhưng nó
đổi được số kênh với giá rẻ, và đó là thứ các kiến trúc hiện đại cần liên
tục. Mẹo chuẩn là bóp rồi nở: dùng một 1x1 kéo 64 kênh xuống 16 kênh, làm
phép 3x3 đắt tiền trên khối đã hẹp, rồi dùng một 1x1 nữa nở lên 128 kênh.
Ở trạng thái mặc định của sim, cả khối ba lớp đó tốn 5.376 trọng số so với
73.728 của một lớp 3x3 thẳng, tức rẻ hơn 13,71 lần.
Hãy kéo tỉ lệ bóp về 1 để thấy chuyện gì xảy ra khi không bóp gì, và kéo lên
bằng C_in để bóp xuống còn đúng một kênh. Đầu mút thứ nhất không cho một bài
học một chiều, và đó mới là chỗ thú vị: ở cấu hình mặc định 64 vào 128 ra,
tỉ lệ bóp 1 vẫn rẻ hơn 1,5 lần vì hai lớp 1x1 gánh việc đổi kênh; nhưng
đổi sang cấu hình mẫu tầng sâu 256 → 256 rồi đặt tỉ lệ bóp về 1 thì khối
ba lớp đắt hơn lớp thẳng và sim báo lỗ. Đầu mút thứ hai thì rõ một chiều:
bóp xuống một kênh rẻ tới mức vô lý, nhưng khối giữa gần như không còn chỗ chứa
thông tin. Sim đếm được cái giá, nhưng không đếm được cái mất, và đó là ranh
giới cần nhớ.
Cộng theo kênh, nhìn tận mắt
Mục cuối của sim tính thật trên một khối 4 x 4 x 2 với hai bộ lọc cố định.
Chọn một vị trí đầu ra và bạn thấy hai dòng riêng, mỗi dòng là tổng của chín
tích trên một kênh, rồi một dòng cuối cộng hai dòng đó lại. Chính bước cộng cuối
cùng là lý do khối ra chỉ dày bằng số bộ lọc, chứ không dày bằng số kênh vào
nhân số bộ lọc. Hai kênh vào không được giữ riêng, chúng bị gộp mất.
Ngay dưới đó là cùng khối ấy nhưng qua một bộ lọc 1x1 chỉ có hai trọng số. Đổi
hai trọng số và cả bản đồ 4 x 4 đổi theo, trong khi kích thước bản đồ không hề
suy suyển. Đó là toàn bộ tính cách của 1x1: không thấy hàng xóm, chỉ trộn kênh.
Một bộ lọc là khối k x k x C_in và có C_out khối như thế, nên số trọng số là
C_out x C_in x k². Tích chập 1x1 bỏ hẳn chiều không gian nên rẻ hơn đúng
k² lần và trở thành cái van đổi số kênh; tách theo chiều sâu rẻ hơn
1/(1/C_out + 1/k²) lần, một con số tiến tới k² chứ không phải hằng số 8. Chỉ
có điều tiết kiệm phép tính không tự động thành chạy nhanh hơn.
Số tham số và số phép nhân cộng trong sim là số học thuần, đúng từng chữ số. Nhưng tách theo chiều sâu có tỉ lệ phép tính trên byte bộ nhớ kém hơn tích chập thường, nên trên GPU nó thường không nhanh lên đúng bằng bội số tham số. Và không có con số nào ở đây nói được kiểu nào học tốt hơn: ít tham số vừa có thể là chính quy hoá tốt, vừa có thể là mất khả năng biểu diễn.
- 1Một lớp tích chập nhân 3 × 3 nhận khối vào dày 64 kênh. MỘT bộ lọc của lớp đó có bao nhiêu trọng số?
- 2Với k = 3, bội số tiết kiệm của tách theo chiều sâu so với tích chập thường sẽ ra sao khi C_out lớn dần?
- 3Điều gì là quan trọng nhất khi phân biệt tích chập 1 × 1 với tích chập 3 × 3?