Neural Networks Practice - chọn kiến trúc và đọc một pipeline Deep Learning
Bài này trả lời một câu hỏi thực hành: gặp một bộ dữ liệu mới thì chọn mạng nối đầy đủ, mạng tích chập, hay mạng hồi tiếp, và dựa vào dấu hiệu nào để biết lựa chọn đó đang sai. Câu chuyện chính là một lớp giả định, nơi trợ giảng có ảnh chụp bài kiểm tra viết tay và muốn biết trang nào mờ đến mức không chấm được. Mọi số đếm, mọi pixel, và mọi dòng loss đều là số bịa để tính và để tập quyết định. Không có sinh viên thật, không có bài làm thật, và không có một mô hình đã được huấn luyện trong bài này.
Bạn đọc được mà không cần mở các bài trước, vì các từ trọng số, kernel, trạng thái ẩn, loss và tập validation được nói lại bằng lời tại chỗ chúng xuất hiện. Bài không báo cáo accuracy của một hệ thống chấm thi, không tinh chỉnh một mạng có sẵn, và không đi vào attention hay Transformer.
Phần tính tay cho thấy hai mảng cùng độ sáng trung bình nhưng độ lệch bình phương trung bình là và . Phần đếm tham số cho thấy một tầng dày nhỏ đã có số, trong khi một lớp tích chập với tám bộ lọc có số, tỉ số . Các phép đó ủng hộ việc giữ phép đo cục bộ trên lưới ảnh. Chúng không cho thấy một CNN sẽ chấm đúng trang mờ.
Đường đọc nhanh: mục 1, mục 2, mục 3, mục Khi cách này thất bại, rồi phần Mang đi. Mục Đào sâu nằm ngoài đường đó.
1. Câu hỏi, đầu vào, và một baseline làm bằng phép chia
Câu hỏi của hồ sơ giả định này là: trong ảnh chụp trang bài viết tay, ảnh nào quá mờ để chấm. Nhãn có hai giá trị, “mờ” và “rõ”. Trong ảnh bịa, ảnh rõ và ảnh mờ. Nếu một quy tắc luôn trả lời “rõ”, nó đúng ảnh. Tỉ lệ là , vì và cùng chia hết cho và . Bất kỳ mô hình nào cũng phải được đọc cạnh con số này. Một accuracy trên cả ảnh, với cách đếm này, trùng quy tắc không thèm nhìn ảnh.
Ảnh được coi là lưới mức xám, tức một kênh. Số ô là . Mỗi ô là một số độ sáng, chưa phải một đặc trưng do người ta đặt tên. Đầu ra mong muốn là một xác suất cho nhãn “mờ”, một số trong khoảng từ đến . Đây là phân loại hai lớp trên một lưới, không phải dự đoán điểm số, và không phải một chuỗi tuần.
Chia tập trước khi nhìn bất kỳ đường loss nào. Quy ước giả định: ảnh để huấn luyện và ảnh để validation. và . Trong ảnh huấn luyện có rõ và mờ. Trong ảnh validation có rõ và mờ. Tổng rõ là , tổng mờ là , khớp các số toàn cục. Trên validation, quy tắc luôn nói “rõ” đúng trên , và . Baseline của tập giữ lại vì vậy cũng là . Validation là tập không được dùng để sửa trọng số. Nếu ta nhìn validation rồi đổi kiến trúc nhiều lần, nó dần thành một tập đã bị dùng để chọn, và cần một tập test chưa đụng tới. Bài này dừng ở chỗ có một tập giữ lại để đọc dấu hiệu chọn sai.
Ba họ kiến trúc, nói đủ để loại. MLP, multilayer perceptron, là mạng các tầng nối đầy đủ: mỗi đơn vị nhìn một tổng có trọng số của cả vector đầu vào. CNN, mạng tích chập, trượt một kernel nhỏ, tức một ma trận trọng số dùng lại tại mọi vị trí, trên lưới. RNN, mạng hồi tiếp, cập nhật một trạng thái ẩn theo từng bước của một chuỗi, với cùng trọng số tại mỗi bước. Câu hỏi “trang này có mờ không” có đầu vào là lưới pixel. Láng giềng tự nhiên là các ô kề, không phải thứ tự thời gian, và không phải một vector vài cột đã có tên. Ứng viên kiến trúc là CNN. Phần tính tay kiểm tra xem một số tóm tắt quá thô có bỏ mất độ mờ hay không, và đếm xem tầng dày phải trả bao nhiêu tham số để nối ô.
2. Ví dụ tính tay: cùng độ sáng trung bình, khác độ tương phản
Lấy hai cửa sổ bịa, cắt từ hai kiểu trang. Cửa sổ nét gồm . Cửa sổ mờ gồm . Cả hai sẽ được tóm tắt bằng trung bình và bằng trung bình các bình phương độ lệch, để thấy trung bình thì trùng còn độ lệch thì không.
Cửa sổ nét. Tổng là . Nhóm và , tổng . Trung bình là . Độ lệch từng ô so với : , , , . Bình phương: , , , . Cộng: và , tổng . Chia cho : . Độ lệch bình phương trung bình của cửa sổ nét là .
Cửa sổ mờ. Tổng là . Trung bình cũng là . Độ lệch: , , , . Bình phương: . Tổng bình phương là . Chia cho được . Độ lệch bình phương trung bình của cửa sổ mờ là .
Hai cửa sổ cùng trung bình . Một chỉ số chỉ giữ độ sáng trung bình không tách được chúng. Chỉ số độ lệch thì khác nhau: so với , hiệu . Phép tính cho thấy, trên hai cửa sổ này, độ mờ theo nghĩa “các ô kề nhau gần nhau” hiện ở độ lệch, không hiện ở trung bình. Nó không cho thấy là ngưỡng y khoa hay ngưỡng chấm thi; đây chỉ là hai mảng số bịa.
Đặt một ngưỡng minh họa trên chính chỉ số độ lệch, chỉ để đọc hai mảng: và . Cửa sổ nét nằm trên ngưỡng, cửa sổ mờ nằm dưới. Bây giờ giả sử một trang có cả hai vùng, và ai đó lấy trung bình hai chỉ số vùng trước khi quyết định. Trung bình là . So với cùng ngưỡng minh họa, , nên cả trang bị đọc như “có nét”, dù vùng mờ vẫn có chỉ số . Phép tính cho thấy trung bình hai vùng đã kéo lên thành và làm mất việc một vùng nằm dưới ngưỡng. Muốn giữ được vùng mờ, bước đầu của mô hình phải còn các đáp ứng cục bộ, chứ không sụp cả trang thành một số quá sớm.
Đó là lý do kiến trúc cho câu hỏi này đi theo lưới. Một kernel là chín trọng số dùng lại trên từng chỗ của trang, mỗi chỗ cho một số. Max-pooling sau đó giữ đỉnh trong từng cửa sổ và bỏ các số còn lại; nếu dùng pooling, phải chắc việc bỏ đó không xóa đúng vùng mờ mỏng, đúng bài học của hai cửa sổ cùng một max. Với hồ sơ này, lựa chọn là một hoặc vài lớp tích chập để có bản đồ tương phản cục bộ, rồi một tầng nhỏ đọc các bản đồ đó thành một xác suất “mờ”. Hàm ở đầu ra là sigmoid: nó ép một số thực về khoảng từ đến . Hàm ở các tầng ẩn có thể là ReLU, tức giữ số dương và đổi số âm thành , để các lớp tích chập không chỉ là một phép tuyến tính dài.
Loss dùng để sửa trọng số, với nhãn hoặc và dự đoán trong khoảng mở , là cross-entropy nhị phân. Khi nhãn bằng , loss rút thành . Làm tròn nửa lên tới bốn chữ số thập phân từ logarit tự nhiên: và . Trên hai dự đoán giả định cho một trang thật sự mờ, xác suất cho lớp đúng chịu loss lớn hơn xác suất . Các số là giá trị đã làm tròn của biểu thức, không phải loss đo trên ảnh.
Một so sánh bình phương, tách khỏi loss huấn luyện, giúp thấy cùng hướng mà không cần logarit. Với nhãn , dự đoán có hiệu và bình phương . Dự đoán có hiệu và bình phương . Tỉ số các hiệu là . Tỉ số các bình phương là , vì và phần dư . Phép tính cho thấy sai lệch lớn bị bình phương phóng mạnh hơn trên hai cặp này. Cross-entropy mới là loss sẽ gắn vào sigmoid trong pipeline; bình phương chỉ là một thước đo phụ để đọc bằng tay.
3. Đếm tham số, rồi chốt pipeline
Tầng nối đầy đủ từ ô tới đơn vị có một trọng số cho mỗi cặp. Số trọng số là . Tính và , cộng được . Thêm bias, mỗi đơn vị một số, được tham số, chỉ riêng tầng đầu, chưa có tầng sau.
Một lớp tích chập , một kênh vào, tám bộ lọc, dùng chung trọng số tại mọi vị trí. Mỗi bộ lọc có trọng số. Tám bộ lọc có trọng số. Thêm tám bias được tham số. Tỉ số , vì và , cộng . Phép đếm cho thấy, trên ảnh một kênh và với hai cách nối này, tầng dày tới đơn vị có số tham số gấp lần lớp tích chập tám bộ lọc. Nó không cho thấy chất lượng sẽ gấp lần. Nó cho thấy tầng dày phải học một trọng số riêng cho từng ô, nên một nét chữ dịch đi vài pixel rơi vào các trọng số khác. Kernel dùng lại chín số, nên cùng một kiểu biên có cùng bộ nhân ở góc trên và ở giữa trang.
Pipeline được chọn cho câu hỏi giả định, viết theo thứ tự dữ liệu chảy:
ảnh 32 x 32
-> chuẩn hóa độ sáng
-> tích chập 3 x 3, 8 bộ lọc, rồi ReLU
-> pooling hoặc một stride để bản đồ nhỏ lại
-> một tầng dày nhỏ
-> sigmoid
-> xác suất "mờ"
-> cross-entropy với nhãn
Chuẩn hóa độ sáng, chẳng hạn trừ một trung bình và chia một độ lệch tính trên tập huấn luyện, giữ các tích kernel trên một thang mà tốc độ học còn có nghĩa. Các số trung bình và độ lệch đó phải lấy từ ảnh huấn luyện, rồi áp vào ảnh validation, không tính lại trên validation. Làm ngược là để tập giữ lại tham gia vào đầu vào.
Tầng dày ở cuối chỉ nên nhìn bản đồ đã nhỏ, hoặc một vector đã gộp có kiểm soát, chứ không nhìn lại ô với trọng số nếu ta vừa mới từ chối tầng đó ở cửa vào. Số kênh sau tám bộ lọc là , nếu stride và padding giữ thì còn số trước khi gộp. Tính , rồi . Pooling stride chia mỗi chiều cho , còn . Và , . Kiểm tra ba chiều, cao, rộng, kênh, trước khi nối. Sai một chiều là sai bài toán tối ưu, dù câu chuyện kiến trúc đúng.
Baseline để CNN phải vượt, trên chính các số này, gồm hai mức. Mức thứ nhất là tỉ lệ của quy tắc luôn nói “rõ”. Mức thứ hai là chính chỉ số độ lệch bình phương, tính trên từng vùng hoặc trên cả trang, với một ngưỡng chọn trên tập huấn luyện. Hai cửa sổ đã cho thấy chỉ số đó tách khỏi . Nếu trên ảnh validation một ngưỡng như vậy đã hơn một cách rõ với đủ cả hai loại lỗi, thì CNN chỉ đáng giữ khi nó hơn tiếp chỉ số đó. Bài này không có dự đoán thật để so. Điều có là tiêu chí: kiến trúc phức tạp hơn phải thắng baseline trên tập không dùng để sửa trọng số.
Những việc cố ý không chọn. Không đưa pixel vào một RNN bằng cách đọc từng hàng như một chuỗi thời gian. Hàng pixel là thứ tự quét ảnh, không phải thứ tự sự kiện; dịch trang đi một pixel đổi toàn bộ chuỗi. Không dùng softmax hai đầu ra rồi diễn giải như hai nhãn độc lập: câu hỏi là một xác suất cho “mờ”, sigmoid một đơn vị là khớp kiểu nhãn. Không lấy một cột “điểm mờ do người chấm” làm đầu vào nếu cột đó chính là nguồn sinh ra nhãn; đó là rò nhãn, loss sẽ xuống vì mô hình đọc đáp án. Và không khởi đầu bằng một mạng lớn vì chương đang học mạng. Với ảnh huấn luyện, số tham số ở tầng dày đã cùng bậc với số ảnh nhân vài trăm; lớp tích chập tham số nhỏ hơn nhiều so với ảnh, và vẫn có thể quá nếu các tầng sau phình ra. Cỡ mô hình là một lựa chọn, đọc cùng số mẫu.
Khi cách này thất bại
Các dấu hiệu dưới đây là checklist. Một dấu hiệu một mình chưa kết tội cả họ CNN. Nhiều dấu hiệu cùng lúc nghĩa là câu hỏi, dữ liệu, hoặc cách gộp không còn khớp kiến trúc vừa chọn. Các dòng loss là bảng bịa để tập đọc dấu, không phải nhật ký một lần chạy.
Accuracy validation bằng baseline. Nếu ảnh validation có ảnh rõ, và mô hình đúng ảnh bằng cách gần như luôn nói “rõ”, tỉ lệ là , trùng quy tắc không nhìn ảnh. Lúc đó đường loss có thể vẫn giảm trên tập huấn luyện vì ảnh mờ trong tập huấn luyện bị mô hình học thuộc, trong khi validation không khá hơn . Việc cần làm là đếm riêng hai loại lỗi: trang rõ bị gọi là mờ, và trang mờ bị gọi là rõ. Accuracy gộp che ảnh mờ trong ảnh.
Loss huấn luyện xuống, loss validation lên. Bảng minh họa:
| Epoch | Loss huấn luyện | Loss validation |
|---|---|---|
Từ epoch sang epoch , loss huấn luyện đổi , tức giảm . Loss validation đổi , tức tăng . Hai dấu ngược nhau. Trên bảng này, giữ bộ trọng số epoch vì đó là vòng cuối là chọn điểm validation tệ hơn epoch . Dấu hiệu này là học quá: mô hình khớp ảnh chặt hơn và khớp ảnh giữ lại kém đi. Cách ứng xử là hoàn nguyên về vòng validation thấp hơn trong các vòng đã ghi, giảm số bộ lọc, hoặc thêm ảnh giả định bằng các phép xoay và cắt mà nhãn “mờ” vẫn còn đúng. Thêm epoch với cùng kiến trúc không sửa dấu của hai hiệu và .
Dịch trang làm đổ accuracy. Nếu nét chữ trên các ảnh validation dịch vài pixel so với tập huấn luyện và các trang đúng trở thành sai, trong khi mắt người vẫn đọc được, tầng đang nhớ vị trí tuyệt đối nhiều hơn mẫu cục bộ. Đó là dấu đã chọn, hoặc đã vô tình dùng, một tầng dày trên pixel thô. Kernel dùng chung được đưa vào pipeline đúng để giảm kiểu lỗi này. Nếu CNN vẫn đổ khi dịch, hãy kiểm tra xem một tầng gộp toàn cục đã xóa vị trí cần thiết, hoặc ngược lại một tầng dày rất lớn sau bản đồ vẫn nhớ tọa độ nhiễu.
Vùng mờ bị trung bình hóa mất. Hai cửa sổ đã cho trung bình chỉ số trong khi vùng mờ là . Nếu lỗi của mô hình tập trung vào trang chỉ mờ một góc, còn trang mờ đều thì đúng, bước gộp đang kéo về phía trước khi sigmoid nhìn thấy. Checklist mục này là: xem từng vùng, không chỉ một xác suất cho cả trang. Có thể cần một đầu ra theo vùng, hoặc tạm tắt bớt pooling để chỉ số cục bộ còn tới tầng cuối.
Nền bàn và bóng đèn khác nhau giữa hai tập. Nếu ảnh huấn luyện chụp trên một mặt bàn và ảnh validation chụp trên mặt bàn khác, kernel có thể bật trên vân gỗ chứ không trên nét mực. Dấu hiệu là lỗi dính theo mẻ chụp, không dính theo độ mờ. Cách tách đúng là chia validation theo ngày hoặc theo máy ảnh, không xáo ngẫu nhiên từng ảnh của cùng một mẻ vào cả hai tập. Accuracy cao trên một lần xáo trộn ngẫu nhiên không phân biệt hai chuyện đó.
Nhãn rò, hoặc nhãn không phải câu hỏi. Nếu đầu vào có một cột điểm mờ do người gán, mô hình sẽ dùng cột đó và các pixel trở thành phụ. Nếu nhãn thật ra là “trang này thuộc đề số ” chứ không phải “trang này mờ”, CNN vẫn học được một khác biệt hình học của đề, loss vẫn giảm, và ta sẽ tưởng mình đã phát hiện độ mờ. Đọc vài ảnh bị sai, đối chiếu với định nghĩa nhãn viết ra trước khi thu thập, là phần kiểm tra mà đường loss không làm thay.
Chọn RNN hoặc MLP cho đúng bài toán này. RNN là sai họ khi thứ tự duy nhất là thứ tự quét pixel. MLP trên ô là họ có thể chạy được, và mục cho thấy nó trả tham số ngay tầng đầu so với của lớp tích chập; dấu hiệu đi kèm là mô hình tệ ngay khi chữ dịch. MLP vẫn là họ đúng nếu sau này đầu vào là một bảng đã có cột, ví dụ tỉ lệ buổi học và điểm giữa kỳ, không còn pixel. RNN là họ đúng nếu câu hỏi đổi thành một chuỗi tám tuần điểm danh và nhãn phụ thuộc thứ tự các tuần. Đổi câu hỏi thì đổi checklist; đừng giữ CNN vì pipeline ảnh đã viết xong.
Tóm lại, các dấu hiệu chọn sai trong hồ sơ này là: validation kẹt ở ; loss huấn luyện giảm trong khi loss validation tăng trên bảng minh họa từ epoch đến ; lỗi xuất hiện khi chỉ dịch trang; trang mờ một góc bị gộp mất như cách bị kéo thành ; lỗi dính theo mẻ chụp; một cột đầu vào trùng nguồn nhãn; và họ mạng không trùng cấu trúc lưới của ảnh.
Đào sâu: loss, metric, lúc học và lúc đoán
Loss là số mà bước cập nhật đi xuống. Metric là số người đọc báo cáo. Với hồ sơ trang mờ, loss huấn luyện là cross-entropy, còn bản báo cáo nên có ít nhất tỉ lệ đúng cạnh baseline , cùng số trang mờ bị bỏ sót trên trang mờ của validation nếu ta đang nhìn tập ảnh. Một metric không cần phải là hàm lấy đạo hàm được. Đưa F1 vào bản báo cáo vẫn hợp khi hai lớp lệch, như mờ trên ảnh, tức là phần lớp mờ. Accuracy có thể đến từ việc không bao giờ nói “mờ”.
Lúc huấn luyện, mỗi bước gồm đi xuôi, loss, đạo hàm ngược, và cộng một lượng trừ vào trọng số. Lúc đoán, chỉ còn đi xuôi: ảnh thành xác suất, không sửa trọng số của kernel. Dropout, nếu có dùng trong các tầng dày, tắt ngẫu nhiên một số đơn vị lúc học và không tắt ngẫu nhiên lúc đoán. Nhầm hai pha làm xác suất lúc báo cáo không còn là xác suất đã tính loss.
Kiến trúc là sơ đồ các phép tính: có tích chập hay không, bao nhiêu bộ lọc, có vòng trạng thái hay không. Tham số là các số trong kernel và các bias, được vòng lặp sửa. Siêu tham số là tốc độ học, cỡ batch, số epoch, số bộ lọc. Ba lớp này giải thích một cuộc nói chuyện hay lẫn. “Đổi mô hình” có thể nghĩa là đổi họ kiến trúc, hoặc chỉ đổi tốc độ học. Trên parabol một biến, đổi tốc độ học có thể làm loss tăng sau một bước; trên hồ sơ này, cùng chuyện đó có thể xảy ra mà kernel vẫn là họ đúng. Thấy loss tăng vọt thì giảm bước cập nhật trước khi kết luận CNN không hợp ảnh.
Mạng sâu nghĩa là nhiều tầng ẩn, không nghĩa là đúng hơn. Với ảnh, một chuỗi dài các lớp tích chập tăng vùng mà một đơn vị nhìn trên trang, và cũng tăng chỗ để khớp nhiễu của tấm. Tiêu chí dừng vẫn là validation so với baseline và so với chỉ số độ lệch tính tay, không phải số tầng.
Giải thích một CNN sau khi đã có trọng số là một việc khác với việc chọn họ. Nhìn bản đồ kênh, tắt thử một tầng, hoặc xem gradient theo pixel, cho các manh mối về chỗ mô hình đang nhìn. Các manh mối đó hỗ trợ việc gỡ lỗi, và không tự biến một tương quan trên ảnh giả định thành một kết luận về mọi bài thi. Bài này thậm chí không có trọng số đã học để mà nhìn.
Tự kiểm tra
- Trên ảnh với ảnh rõ, quy tắc luôn nói “rõ” đạt tỉ lệ bao nhiêu?
- Trung bình độ sáng của cửa sổ bằng bao nhiêu, và độ lệch bình phương trung bình bằng bao nhiêu?
- Vì sao trung bình hai chỉ số vùng làm mất vùng có chỉ số , nếu ngưỡng minh họa là ?
- và bằng bao nhiêu, và tỉ số của chúng bằng bao nhiêu?
- Trên bảng loss bịa, từ epoch đến , loss huấn luyện đổi bao nhiêu và loss validation đổi bao nhiêu?
- Dấu hiệu nào cho thấy thứ tự quét pixel đã bị đem vào một RNN một cách không cần thiết?
Mang đi
Câu hỏi giả định là tìm trang bài viết tay quá mờ để chấm, trên ảnh bịa gồm trang rõ và trang mờ. Luôn đoán “rõ” đạt , và trên ảnh validation với trang rõ thì cũng . Hai cửa sổ cùng trung bình : cửa sổ nét có độ lệch bình phương trung bình , cửa sổ mờ có . Trung bình hai chỉ số là , lớn hơn ngưỡng minh họa , nên một số gộp cả trang có thể không còn thấy vùng mờ. Tầng dày từ ô tới đơn vị có tham số; lớp tích chập với tám bộ lọc có tham số; tỉ số là . Pipeline được chọn là chuẩn hóa, tích chập, một bước thu nhỏ có kiểm tra, sigmoid, và cross-entropy, rồi so với baseline trên tập không sửa trọng số. Chọn sai khi validation kẹt ở , khi loss huấn luyện giảm mà loss validation tăng trên bảng từ epoch đến , khi dịch trang làm đổ kết quả, khi vùng mờ cục bộ bị gộp mất, khi lỗi dính theo mẻ chụp, khi nhãn bị rò vào đầu vào, hoặc khi chuỗi điểm danh hay bảng vài cột lại bị nhét vào đúng pipeline ảnh này.
Bài Language dùng lại vòng đi xuôi, loss, và cập nhật tham số khi đầu vào là câu chữ thay vì một trang giấy.
Nguồn tham khảo
- CS50 AI, Lecture 5 - Neural Networks: https://cs50.harvard.edu/ai/notes/5/
- CS50 AI, Week 5: https://cs50.harvard.edu/ai/weeks/5/