Nhập môn Trí tuệ Nhân tạo·Neural Networks - Mạng neural

Chế độ xem

Convolutional Neural Networks - CNN nhìn ảnh như thế nào?

Bài này trả lời vì sao không nên trải một ảnh thành một vector dài rồi nối mọi pixel vào một tầng dày, và thay vào đó một kernel nhỏ được trượt trên ảnh. Mạng làm vậy gọi là mạng neural tích chập, viết tắt CNN, từ convolutional neural network. Kernel, còn gọi là bộ lọc, là một ma trận trọng số nhỏ. Tích chập ở đây là đặt kernel lên từng mảng ảnh, nhân từng ô tương ứng, rồi cộng lại.

Bạn không cần thuộc bài neuron trước. Một trọng số là một số nhân với một đầu vào. Một tầng nối đầy đủ cho mỗi cặp đầu vào và đơn vị một trọng số riêng. Chia sẻ trọng số nghĩa là cùng một nhóm số của kernel được dùng lại ở mọi vị trí trên ảnh. Bài này tính trọn kernel 3×33 \times 3 bên dưới, từng tích và tổng, rồi nói pooling giữ gì và bỏ gì. Bài không thiết kế một kernel lớn hơn, không huấn luyện một mô hình ảnh thật, và không đi vào các họ kiến trúc thị giác sau này.

Các số pixel trong bài là số giả định để cộng tay. Tổng bằng 00 trên mảng đồng nhất và bằng 560560 trên mảng có tâm sáng hơn là kết quả của đúng các tích đó, không phải độ chính xác của một máy chẩn đoán.

Đường đọc nhanh: mục 1, mục 2, mục 3, mục 4, mục Khi cách này thất bại, mục 5, rồi phần Mang đi. Các mục Đào sâu nằm ngoài đường đó.

1. Ảnh là một lưới, và tầng dày bỏ cấu trúc lưới

Một ảnh màu có chiều cao, chiều rộng, và các kênh màu. Với ảnh 224×224224 \times 224 và ba kênh đỏ, xanh lục, xanh dương, số giá trị đầu vào là 224⋅224⋅3224 \cdot 224 \cdot 3. Trước hết 224⋅224=50176224 \cdot 224 = 50176, rồi 50176⋅3=15052850176 \cdot 3 = 150528. Nếu mỗi giá trị là một đầu vào độc lập của tầng nối đầy đủ, tầng đó không còn biết hai số nào từng đứng cạnh nhau trên ảnh.

Ba hệ quả đi cùng cách trải phẳng đó. Số mũi tên tăng theo số pixel nhân số đơn vị. Hai pixel ở hai góc đối diện được đối xử như hai đặc trưng bảng, dù trên ảnh chúng chẳng kề. Và cùng một nét sáng, nếu dịch sang phải vài pixel, rơi vào các đầu vào khác, nên cần các trọng số khác để nhận ra. CNN đưa vào kiến trúc hai giả định: tín hiệu hữu ích thường là mẫu cục bộ, và cùng một mẫu cục bộ đáng được dò ở nhiều chỗ. Giả định này hợp ảnh, bản đồ, và một số tín hiệu trên lưới. Nó không phải một định lý cho mọi bảng số.

Nối đầy đủ vẫn là một hàm hợp lệ. Với một vector vài chục đặc trưng đã được người ta tính sẵn, tầng dày là một lựa chọn gọn. Phần việc của CNN bắt đầu khi chính sự kề nhau của các ô là thông tin, và khi ta muốn một bộ trọng số nhỏ học mẫu đó thay vì một trọng số cho từng ô.

2. Ví dụ tính tay: chín tích của kernel 3×33 \times 3

Kernel trong mục này là ma trận 3×33 \times 3 cố định, kiểu một bộ dò biên đơn giản, chưa phải kết quả huấn luyện. Hàng một là −1,−1,−1-1, -1, -1. Hàng hai là −1,8,−1-1, 8, -1. Hàng ba là −1,−1,−1-1, -1, -1. Tám ô xung quanh mang −1-1, ô giữa mang 88. Kết luận của phép đặt kernel lên một mảng là một số: tổng chín tích của ô kernel với ô mảng cùng vị trí.

K=[−1−1−1−18−1−1−1−1]K = \begin{bmatrix} -1 & -1 & -1 \\ -1 & 8 & -1 \\ -1 & -1 & -1 \end{bmatrix}

Mảng đầu tiên toàn giá trị 2020, một vùng phẳng:

X=[202020202020202020]X = \begin{bmatrix} 20 & 20 & 20 \\ 20 & 20 & 20 \\ 20 & 20 & 20 \end{bmatrix}

Từng tích, theo thứ tự hàng từ trên xuống, trái sang phải:

Ô trên-trái: (−1)⋅20=−20(-1) \cdot 20 = -20. Ô trên-giữa: (−1)⋅20=−20(-1) \cdot 20 = -20. Ô trên-phải: (−1)⋅20=−20(-1) \cdot 20 = -20. Ô giữa-trái: (−1)⋅20=−20(-1) \cdot 20 = -20. Ô tâm: 8⋅20=1608 \cdot 20 = 160. Ô giữa-phải: (−1)⋅20=−20(-1) \cdot 20 = -20. Ô dưới-trái: (−1)⋅20=−20(-1) \cdot 20 = -20. Ô dưới-giữa: (−1)⋅20=−20(-1) \cdot 20 = -20. Ô dưới-phải: (−1)⋅20=−20(-1) \cdot 20 = -20.

Có tám tích −20-20 và một tích 160160. Tám lần −20-20 là −160-160. Cộng tâm: −160+160=0-160 + 160 = 0. Tổng trên mảng toàn 2020 là 00. Phép tính cho thấy kernel này tắt trên vùng không đổi độ sáng. Nó không cho thấy mọi vùng phẳng của mọi ảnh thật sẽ ra đúng 00 sau một mạng đã học, vì kernel học được có thể khác chín số này.

Mảng thứ hai giữ cùng kernel, chỉ đổi ảnh: tám ô rìa bằng 1010, ô tâm bằng 8080. Đây vẫn là một mảng 3×33 \times 3, không phải một kernel mới.

Từng tích: (−1)⋅10=−10(-1) \cdot 10 = -10 ở cả tám ô rìa, và 8⋅80=6408 \cdot 80 = 640 ở tâm. Tám lần −10-10 là −80-80. Cộng tâm: −80+640=560-80 + 640 = 560. Tổng là 560560, khác 00.

So hai mảng: mảng phẳng ra 00, mảng có tâm lệch khỏi rìa ra 560560. Hiệu hai tổng là 560−0=560560 - 0 = 560. Phép tính cho thấy cùng chín trọng số, đáp ứng lớn hơn khi ô giữa khác các ô xung quanh theo hướng mà trọng số tâm đang dương và trọng số rìa đang âm. Nếu tâm tối hơn rìa, các tích đổi dấu và tổng có thể âm; bài này không cần một mảng thứ ba để thấy dấu của tổng phụ thuộc dấu của độ lệch.

Trong CNN, chín số trong KK thường là tham số. Backpropagation, tức cách tính đạo hàm của loss theo từng tham số, sửa chúng cùng các tầng sau. Ta không bắt buộc phải tự điền −1-1 và 88. Kernel viết tay ở trên chỉ để thấy phép nhân-cộng. Một tầng có 3232 kernel thì có 3232 tổng kiểu này tại mỗi vị trí, tức 3232 kênh đặc trưng. Mỗi kernel có thể bật mạnh trên một kiểu mẫu khác nhau: biên đứng, biên ngang, một góc, một vệt màu. Không nên đọc mỗi kênh như một tên gọi đã biết trước khi nhìn trọng số và ảnh.

Khi kernel trượt khắp ảnh, mỗi vị trí cho một số, và các số đó xếp thành một ma trận mới gọi là feature map, bản đồ đặc trưng. Với stride bằng 11, kernel nhích một pixel mỗi lần. Với padding bằng 00, tức không thêm viền, một ảnh rộng 224224 và kernel rộng 33 cho chiều rộng đầu ra (224−3)+1=222(224 - 3) + 1 = 222. Cùng công thức cho chiều cao. Đếm vị trí là 222⋅222=49284222 \cdot 222 = 49284 ô trên một feature map. Mỗi ô là một lần chín tích, với cùng chín trọng số nếu có chia sẻ trọng số.

3. Chia sẻ trọng số: cùng chín số ở mọi vị trí

Giả sử kernel đang phản ứng với một biên đứng. Ta muốn phản ứng đó xảy ra ở góc trái, ở giữa, và ở góc phải, miễn là mẫu cục bộ giống nhau. Cách làm là dùng lại đúng ma trận KK tại mọi vị trí. Đó là chia sẻ trọng số. Các vị trí không học chín số riêng.

Hãy đếm, trên một kênh, với feature map 222×222222 \times 222 vừa tính và kernel 3×33 \times 3. Nếu mỗi vị trí có chín trọng số của riêng nó, số trọng số là 49284⋅949284 \cdot 9. Tính 49284⋅10=49284049284 \cdot 10 = 492840, rồi trừ một lần 4928449284 vì nhân 99 là nhân 1010 rồi trừ một lần: 492840−49284=443556492840 - 49284 = 443556. Chia sẻ trọng số giảm chín số đó xuống còn 99 cho một kernel trên một kênh vào. Cộng thêm bias cho kernel, nếu có, là thêm một số dùng chung cho cả feature map, không phải một bias mỗi pixel.

Tỉ số 443556/9=49284443556 / 9 = 49284. Đúng bằng số vị trí: mỗi vị trí được miễn một bản sao của kernel. Phép đếm cho thấy, trong cách bố trí này, nối cục bộ mà không chia sẻ vẫn tốn 443556443556 trọng số cho một bộ lọc, còn chia sẻ còn 99. Nó không cho thấy chất lượng phân loại sẽ gấp 4928449284 lần. Nó cho thấy bộ nhớ tham số không còn tỉ lệ với số vị trí.

Người chưa gặp neuron vẫn đọc được câu này: trọng số là số nhân với đầu vào; ở đây đầu vào của một lần đặt kernel là chín giá trị pixel, hoặc chín giá trị trên các kênh tương ứng; cùng một bộ nhân được kéo đi khắp ảnh. Tầng sau có thể là một kernel khác trên các feature map, hoặc một tầng dày sau khi bản đồ đã nhỏ. Huấn luyện vẫn là loss, đạo hàm, và cập nhật, áp vào chín số kia chứ không áp vào một trọng số cho từng pixel.

Chia sẻ trọng số đi cùng một giả định mạnh: mẫu cục bộ có cùng nghĩa ở các vị trí. Một dấu đậm ở ô kiểm góc phiếu và một dấu đậm ở giữa dòng chữ có thể cùng làm kernel bật. Tầng sau còn thấy vị trí trên feature map, nên vẫn có thể học “bật ở góc thì khác bật ở giữa”, miễn là ta chưa xóa tọa độ. Mục pooling và mục thất bại nói chỗ tọa độ bị xóa.

4. Pooling giữ đỉnh và bỏ phần còn lại của cửa sổ

Pooling giảm kích thước feature map bằng một hàm cố định trên từng cửa sổ, thường không có trọng số để học. Max-pooling lấy giá trị lớn nhất trong cửa sổ. Các giá trị còn lại không đi tiếp. Vì vậy pooling giữ độ mạnh của đáp ứng nổi bật nhất trong cửa sổ, và bỏ các đáp ứng yếu hơn cùng vị trí tương đối của đỉnh bên trong cửa sổ.

Ma trận minh họa 4×44 \times 4, stride 22, cửa sổ 2×22 \times 2, nên bốn cửa sổ không chồng nhau:

[304080902050100110010203010204030]\begin{bmatrix} 30 & 40 & 80 & 90 \\ 20 & 50 & 100 & 110 \\ 0 & 10 & 20 & 30 \\ 10 & 20 & 40 & 30 \end{bmatrix}

Cửa sổ trên-trái gồm 30,40,20,5030, 40, 20, 50. Số lớn nhất là 5050. Ba số bị bỏ là 30,40,2030, 40, 20. Cửa sổ trên-phải gồm 80,90,100,11080, 90, 100, 110. Số lớn nhất là 110110. Ba số bị bỏ là 80,90,10080, 90, 100. Cửa sổ dưới-trái gồm 0,10,10,200, 10, 10, 20. Số lớn nhất là 2020. Ba số bị bỏ là 0,10,100, 10, 10. Cửa sổ dưới-phải gồm 20,30,40,3020, 30, 40, 30. Số lớn nhất là 4040. Ba số bị bỏ là 20,30,3020, 30, 30.

Bốn đỉnh xếp lại thành

[501102040]\begin{bmatrix} 50 & 110 \\ 20 & 40 \end{bmatrix}

Từ 1616 số còn 44 số. Phép tính cho thấy mỗi cửa sổ giữ đúng một max và loại ba số kia. Nó không cho thấy ba số bị loại là vô ích với mọi câu hỏi. Nếu câu hỏi là “cửa sổ có đều sáng hay chỉ một ô sáng”, max không đủ, và mục thất bại đưa hai cửa sổ cùng max.

Trên ảnh 224×224224 \times 224, một lần pooling 2×22 \times 2 với stride 22 chia mỗi chiều cho 22: 224/2=112224 / 2 = 112. Lần thứ hai: 112/2=56112 / 2 = 56. Một chuỗi kích thước hay gặp, khi convolution có padding để giữ chiều trước pooling, là:

Input:   224 x 224 x 3
Conv:    224 x 224 x 32
Pool:    112 x 112 x 32
Conv:    112 x 112 x 64
Pool:     56 x  56 x 64

Chiều thứ ba là số kênh. Convolution đầu ra 3232 kênh vì có 3232 kernel. Pooling không đổi số kênh: nó thu từng bản đồ. Kiểm tra ba câu trước khi nối một tầng dày: chiều cao, chiều rộng, và số kênh. Nối sai một trong ba thì số tham số hoặc không khớp phép nhân ma trận.

Một pipeline đọc được sau khi đã có các mảnh trên: ảnh, convolution cộng ReLU, pooling, lặp lại, rồi gộp các kênh thành một vector, rồi một tầng ra. ReLU là hàm giữ số dương và đổi số âm thành 00, đặt sau tổng convolution để mạng không chỉ là một chuỗi các phép tuyến tính. Với nhiều lớp loại trừ nhau, tầng cuối thường là softmax, biến các điểm thành số dương có tổng 11. Với một câu hỏi đúng hoặc sai, sigmoid ở một đơn vị ra là đủ.

CNN học từ đặc trưng thấp đến đặc trưng cao

Hình gợi một thứ tự: các tầng đầu phản ứng với mẫu nhỏ, các tầng sau kết hợp chúng. Đó là cách đọc có ích, và là một hình ảnh chứ không phải một cam kết rằng kênh số 77 của một mạng bất kỳ là “bộ dò mép lá”. Biểu diễn thường phân tán trên nhiều kênh. Việc kiểm tra là nhìn feature map hoặc xem lỗi trên từng nhóm ảnh, không phải đặt tên trước cho từng kernel.

Khi cách này thất bại

Max-pooling thất bại khi nhãn phụ thuộc phần đã bị bỏ. Xét hai cửa sổ 2×22 \times 2 giả định. Cửa sổ A là 110,0,0,0110, 0, 0, 0. Max là 110110; ba số bị bỏ là 0,0,00, 0, 0. Cửa sổ B là 110,108,107,109110, 108, 107, 109. Max là 110110; ba số bị bỏ là 108,107,109108, 107, 109. Cả hai cửa sổ ra cùng một số 110110. Phép tính cho thấy bản đồ sau pooling không phân biệt một đỉnh đơn lẻ với một vùng gần như cùng sáng. Nếu câu hỏi là “vùng này có đồng đều sáng không”, đầu ra pooling đã xóa mất bằng chứng trong chính các số bị bỏ.

Một thất bại về vị trí, cùng kiểu. Cửa sổ C là 9,0,0,09, 0, 0, 0, đỉnh ở ô đầu. Cửa sổ D là 0,0,0,90, 0, 0, 9, đỉnh ở ô cuối. Max của cả hai là 99. Phép tính cho thấy max-pooling giữ 99 và bỏ việc đỉnh nằm ở góc nào trong cửa sổ. Một dấu nằm ở ô kiểm phía trên-trái và một dấu nằm ở ô kiểm phía dưới-phải có thể thành cùng một số sau pooling, dù nhãn phiếu khác nhau. Lúc đó pooling, hoặc một lần gộp toàn bản đồ lấy mỗi kênh một số, là bước làm mất câu trả lời.

Chia sẻ trọng số cũng có chỗ không hợp. Nếu cùng một mẫu cục bộ có nghĩa khác nhau ở các vùng và tầng sau không còn tọa độ để phân biệt, kernel dùng chung sẽ kéo các vùng đó về cùng một kiểu đặc trưng. Ảnh có watermark ở giữa, hoặc nền bàn khác nhau giữa các ngày chụp, có thể khiến kernel bật trên vật không phải đối tượng. Dấu hiệu là lỗi tập trung vào một kiểu nền, trong khi vật cần nhận vẫn rõ. Cách đọc là xem các mẫu bị sai, không phải tăng số kênh ngay.

CNN cũng là lựa chọn lệch khi dữ liệu không phải lưới. Một bảng điểm vài cột không có pixel kề để kernel trượt. Một chuỗi sự kiện có thứ tự thời gian cần một trạng thái theo bước, đó là bài mạng hồi tiếp. Một ảnh rất ít, với nhãn vừa đủ đếm, thường cần một mô hình đã học trên ảnh khác rồi chỉ chỉnh các tầng cuối, hơn là học mọi kernel từ đầu trên vài chục tấm. Các câu này là điều kiện dùng, không phải một bảng xếp hạng độ chính xác.

Cuối cùng, kernel 3×33 \times 3 của mục 2 nhìn một lân cận rất nhỏ. Một chữ viết chiếm cả trang không nằm gọn trong chín pixel. Tầng sau mới nhìn rộng hơn, và chỉ khi các tầng đó còn giữ được tín hiệu chứ không để pooling xóa mất nét mảnh. Nếu nét cần đọc mỏng hơn cửa sổ pooling, đỉnh có thể biến mất trước khi tầng dày nhìn thấy. Đó là lý do người ta kiểm tra kích thước từng tầng trên một ảnh mẫu, với vật nhỏ nhất mà nhãn còn phụ thuộc vào.

5. Đếm kênh, padding, và stride mà không thêm một kernel mới

Padding thêm một viền, thường bằng 00, quanh ảnh trước khi trượt. Không có viền, công thức chiều ra của convolution một chiều là (n−k)/s+1(n - k) / s + 1, với nn là độ dài đầu vào, kk là độ rộng kernel, và ss là stride, khi phép chia ra số nguyên. Với n=224n = 224, k=3k = 3, s=1s = 1, ta đã được 222222. Muốn giữ 224224 với kernel 33 và stride 11, cần tổng viền hai phía bằng 22, tức một pixel mỗi bên. Thay vào công thức có padding p=1p = 1: (224−3+2⋅1)/1+1=(224−3+2)+1=223+1=224(224 - 3 + 2 \cdot 1) / 1 + 1 = (224 - 3 + 2) + 1 = 223 + 1 = 224. Kết luận của phép này là padding 11 bù đúng phần kernel 33 bị hụt khi stride là 11, nên chiều ra bằng chiều vào.

Stride là số pixel kernel nhích. Stride 11 tính một đầu ra tại gần như mọi vị trí. Stride 22 nhích hai pixel, nên ít vị trí hơn. Pooling stride 22 ở trên là một dạng nhích như vậy trên cửa sổ max, và nó chia đôi chiều vì cửa sổ và bước cùng bằng 22 trên một chiều chẵn. Không cần thuộc mọi biến thể. Cần biết chiều ra trước khi viết tầng tiếp theo, và tính lại khi đổi stride hoặc padding.

Một tầng convolution với nhiều kênh vào không chỉ có chín trọng số. Nếu feature map phía trước có 3232 kênh và kernel không gian vẫn 3×33 \times 3 với 6464 bộ lọc ra, mỗi bộ lọc có 3⋅3⋅323 \cdot 3 \cdot 32 trọng số. Tính 3⋅3=93 \cdot 3 = 9, 9⋅32=2889 \cdot 32 = 288, rồi 288⋅64=18432288 \cdot 64 = 18432 trọng số, chưa kể 6464 bias nếu mỗi bộ lọc một bias. Công thức là tích của chiều kernel, số kênh vào, và số bộ lọc ra. Đây vẫn là chia sẻ theo vị trí: 1843218432 không nhân thêm với 112⋅112112 \cdot 112. Nếu quên chia sẻ và nhân tiếp với số vị trí, bạn đang đếm một tầng khác, nặng hơn rất nhiều.

So nhanh với một tầng dày trên cùng ảnh đã trải phẳng. Ảnh 224×224×3224 \times 224 \times 3 là 150528150528 đầu vào. Một tầng dày tới 3232 đơn vị có 150528⋅32150528 \cdot 32 trọng số. Tính 150528⋅30=4515840150528 \cdot 30 = 4515840 và 150528⋅2=301056150528 \cdot 2 = 301056, cộng được 48168964816896, chưa kể bias. Kernel 3×33 \times 3 một kênh vào và 3232 bộ lọc, nếu ảnh đầu chỉ có một kênh, là 9⋅32=2889 \cdot 32 = 288 trọng số. Phép đếm cho thấy hai cách nối không cùng thang tham số. Nó không cho thấy 288288 trọng số sẽ thắng 48168964816896 trọng số trên mọi ảnh. Nó cho thấy tầng dày đã chi rất nhiều tham số chỉ để nối từng pixel, trước khi học được một mẫu dịch chuyển.

Đào sâu: vùng nhìn rộng dần, và những chỗ CNN không phải lựa chọn đầu

Sau một kernel 3×33 \times 3 stride 11, mỗi số trên feature map phụ thuộc một mảng 3×33 \times 3 của ảnh. Đặt thêm một kernel 3×33 \times 3 stride 11 lên feature map đó. Đơn vị mới nhìn ba đầu ra kề nhau của tầng trước. Đầu ra bên trái của bộ ba nhìn các pixel 11 đến 33 của một hàng; đầu ra bên phải nhìn các pixel 33 đến 55. Quãng pixel là 55. Cùng cách cộng cho chiều dọc: 3+3−1=53 + 3 - 1 = 5. Vùng ảnh mà một đơn vị tầng hai phụ thuộc, với các giả định stride 11 và không có giãn kernel, là 5×55 \times 5. Đây là đếm độ phủ, không phải một ma trận trọng số 5×55 \times 5 thứ hai. Bài này không thêm kernel nào khác ngoài ma trận 3×33 \times 3 đã tính tích.

Pooling stride 22 làm bước nhảy trên ảnh gốc lớn hơn, vì một ô sau pooling đại diện cho một cửa sổ. Vùng nhìn vì vậy tăng nhanh hơn so với chỉ xếp kernel stride 11. Điều đáng nhớ khi gỡ lỗi là một đơn vị ở tầng sâu có thể phụ thuộc một vùng rộng, nên một lỗi ở biên ảnh hoặc một vật bị cắt có thể đổi đầu ra dù kernel từng tầng vẫn nhỏ.

Năm 1998, LeCun, Bottou, Bengio và Haffner mô tả các hệ thống nhận dạng tài liệu dùng mạng tích chập, trên chữ viết và ảnh tài liệu. Năm 2012, AlexNet là một mốc thường được nhắc trên ImageNet, với mạng tích chập sâu, GPU, ReLU và các kỹ thuật regularization. Hai mốc này nói rằng ý tưởng kernel trượt đã có trước làn sóng phần cứng sau này, và rằng dữ liệu cùng máy tính đã đổi mức bài toán giải được. Chúng không nói một CNN mới sẽ đạt cùng một kết quả trên một bộ ảnh lá cây hay bài thi của bạn.

Khi nào để CNN xuống hàng sau. Bảng số nhỏ, với cột đã có nghĩa, thường hợp một mô hình tuyến tính hoặc một mô hình cây, vì không có lưới để chia sẻ trọng số. Chuỗi thời gian và câu chữ có thứ tự; bài sau nói trạng thái theo bước. Ảnh mà camera và nhãn lệch nhau giữa ngày thu thập cần được tách validation theo ngày hoặc theo máy, nếu không kernel sẽ học dấu hiệu của máy ảnh. Và nếu một chỉ số tương phản tính bằng tay trên từng mảng đã tách được các lớp trong kiểm tra sơ bộ, chỉ số đó là baseline. CNN phải hơn baseline đó trên tập giữ lại thì phần kernel mới đang làm việc thêm, chứ không chỉ lặp lại một phép cộng bạn đã viết được.

Tự kiểm tra

  1. Trên mảng toàn 2020, tám tích −20-20 và một tích 160160 cộng lại bằng bao nhiêu?
  2. Trên mảng rìa 1010 và tâm 8080, tổng chín tích bằng bao nhiêu?
  3. Cửa sổ 80,90,100,11080, 90, 100, 110 giữ số nào, và ba số nào bị bỏ?
  4. Vì sao cửa sổ 110,0,0,0110, 0, 0, 0 và cửa sổ 110,108,107,109110, 108, 107, 109 trở nên giống nhau sau max-pooling?
  5. 222⋅222⋅9222 \cdot 222 \cdot 9 bằng bao nhiêu, và chia sẻ trọng số còn lại bao nhiêu trọng số cho một kernel 3×33 \times 3 một kênh?
  6. Padding 11, kernel 33, stride 11, ảnh rộng 224224: chiều ra bằng bao nhiêu?

Mang đi

Một ảnh 224×224×3224 \times 224 \times 3 có 150528150528 số. Trải phẳng rồi nối đầy đủ bỏ chuyện pixel nào kề pixel nào và tốn một trọng số mỗi mũi tên. Kernel 3×33 \times 3 với tám ô −1-1 và ô giữa 88, đặt lên mảng toàn 2020, cho chín tích gồm tám lần −20-20 và một lần 160160, tổng 00. Cùng kernel trên rìa 1010 và tâm 8080 cho tám lần −10-10 và một lần 640640, tổng 560560. Feature map là bảng các tổng đó khi kernel trượt. Chia sẻ trọng số dùng lại chín số tại mọi vị trí: 4928449284 vị trí trên một bản đồ 222×222222 \times 222 sẽ cần 443556443556 trọng số nếu mỗi chỗ một kernel, và chỉ cần 99 trọng số khi dùng chung. Max-pooling 2×22 \times 2 trên ma trận ví dụ giữ 50,110,20,4050, 110, 20, 40 và bỏ ba số còn lại trong mỗi cửa sổ. Hai cửa sổ cùng max 110110 cho thấy đỉnh được giữ và cấu trúc còn lại của cửa sổ bị bỏ. Đếm chiều cao, chiều rộng, và số kênh trước khi nối tầng sau.

Bài sau hỏi vì sao cùng một bộ trọng số phải chạy lại dọc theo một chuỗi, và tính hai bước trạng thái ẩn từ các số cho trước.

Nguồn tham khảo

  • CS50 AI, Lecture 5 - Neural Networks: https://cs50.harvard.edu/ai/notes/5/
  • LeCun, Y., Bottou, L., Bengio, Y., Haffner, P. (1998), Gradient-Based Learning Applied to Document Recognition, Proceedings of the IEEE, DOI: 10.1109/5.726791.
  • Krizhevsky, A., Sutskever, I., Hinton, G. E. (2012), ImageNet Classification with Deep Convolutional Neural Networks, NeurIPS.