Training Neural Networks - loss, gradient descent và backpropagation
Bài này trả lời hai câu hỏi đi cùng nhau: trọng số của một mạng neural từ đâu ra, và một loss đang giảm có nghĩa là mô hình đang đúng hay mới chỉ đúng trên phép tính vừa làm. Huấn luyện, hay training, ở đây là vòng lặp sửa tham số để một hàm loss nhỏ đi. Loss là một số đo độ sai của dự đoán so với nhãn.
Bạn có thể đọc bài này khi mới nhớ rằng một neuron tính tổng có trọng số, cộng bias, rồi đưa qua hàm kích hoạt. Phần tính tay dùng một loss bậc hai trên một trọng số, với tốc độ học , rồi một mạng hai tầng với các số giả định. Bài không dạy mạng nhìn ảnh, không dạy mạng đọc chuỗi, và không hướng dẫn viết một thư viện tối ưu.
Một loss giảm trên ví dụ vừa tính cho thấy bước đó đã đi xuống theo đúng công thức đã chọn. Nó chưa cho thấy mạng sẽ đúng trên dữ liệu chưa gặp. Phần thất bại tính một bước nhảy quá đà, nơi loss tăng từ lên , và nói gradient biến mất hoặc bùng bằng các tích lập lại.
Đườ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. Vòng lặp nhìn từ ngoài
Một mạng đã có trọng số thì chỉ cần đi xuôi: đầu vào thành dự đoán. Người ta gọi đó là forward pass, lượt đi tới. Huấn luyện thêm ba việc. So dự đoán với nhãn để ra loss. Tính xem mỗi tham số đang đẩy loss lên hay xuống. Rồi đổi tham số một bước nhỏ theo hướng làm loss giảm, trên chính công thức đang dùng.
data
-> forward pass
-> prediction
-> loss
-> backpropagation
-> update parameters
-> lặp lại
Backpropagation, thường gọi tắt là backprop, là cách tính các đạo hàm riêng của loss theo từng tham số, đi từ loss ngược về các tầng trước. Gradient descent là cách dùng các đạo hàm đó để cập nhật tham số. Hai việc nối nhau trong vòng lặp, và vẫn là hai việc: một việc tính độ dốc, một việc bước theo độ dốc. Optimizer là quy tắc bước, trong đó gradient descent là dạng đơn giản nhất.
Tham số, ký hiệu gộp là , gồm các ma trận trọng số và các bias. Kết luận của bài toán huấn luyện, viết cho một loss đã chọn, là tìm một bộ tham số làm loss đó nhỏ:
Không gian này có thể có rất nhiều chiều. Ta không thử hết các bộ trọng số. Ta đi từng bước, mỗi bước dùng độ dốc tại chỗ đứng.
Siêu tham số là số người thiết kế đặt trước khi vòng lặp chạy, hoặc chọn bằng một phép tìm bên ngoài: tốc độ học, cỡ batch, số vòng qua dữ liệu, số tầng. Bản thân vòng lặp không “học” tốc độ học theo cùng cách nó học trọng số, trừ khi ta dựng thêm một vòng ngoài. Giữ khác biệt này giúp đọc một báo cáo: weight là kết quả, learning rate là lựa chọn.
2. Loss biến độ sai thành một số
Nhãn và dự đoán phải cùng đơn vị thì hiệu mới có nghĩa. Với hồi quy, nhãn và dự đoán là số thực. Một loss đơn giản trên mẫu là trung bình các bình phương sai số, gọi là mean squared error. Kết luận của phép bình phương là sai số lớn bị phạt nặng hơn sai số nhỏ, trên cùng một mẫu:
Lấy hai tình huống giả định về giá thuê, đơn vị triệu. Giá ghi nhận . Dự đoán thì hiệu là , bình phương là . Dự đoán thì hiệu là , bình phương là . Tỉ số các hiệu tuyệt đối là . Tỉ số các bình phương là . Phép tính cho thấy, trên hai cặp số này, việc bình phương làm độ phạt của sai số lớn gấp lần độ phạt của sai số nhỏ, trong khi bản thân các hiệu chỉ gấp lần. Nó không cho thấy bình phương là loss đúng cho mọi bài giá thuê.
Với phân loại hai lớp, nhãn là hoặc và dự đoán là một số trong khoảng mở từ đến , cross-entropy nhị phân đọc độ bất ngờ của nhãn dưới dự đoán đó. Kết luận của công thức là dự đoán càng tự tin vào phía sai thì loss càng lớn:
Khi nhãn , biểu thức 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 này, một xác suất cho lớp đúng cho loss lớn hơn nhiều so với một xác suất . Các số là giá trị đã làm tròn của đúng biểu thức, không phải accuracy của một mô hình.
Accuracy, tức tỉ lệ mẫu gắn đúng nhãn, là một metric để báo cáo. Metric trả lời “kết quả có hữu ích không”. Loss trả lời “bước tối ưu đang theo số nào”. Hai câu khác nhau. F1, một metric cân bằng precision và recall, hữu ích khi lớp lệch, và thường không phải hàm mà ta lấy gradient trực tiếp trong vòng lặp chuẩn. Vì vậy một bài có thể huấn luyện bằng cross-entropy rồi báo cáo F1.
3. Ví dụ tính tay: một loss bậc hai và một bước cập nhật
Chỉ còn một trọng số . Loss giả định là một parabol có đáy tại :
Đạo hàm theo là độ dốc của parabol tại điểm đang đứng. Kết luận của phép đạo hàm này là độ dốc bằng không tại , âm khi còn nhỏ hơn , và dương khi đã lớn hơn :
Bắt đầu tại . Loss là . Đạo hàm là . Độ dốc âm nghĩa là, ngay quanh , tăng một chút thì giảm.
Tốc độ học là hệ số nhân vào độ dốc trước khi trừ khỏi tham số. Kết luận của một bước gradient descent là đi ngược độ dốc, với bước dài tỉ lệ với :
Chọn . Độ dốc đang là , nên lượng trừ là . Trừ một số âm là cộng: mới bằng . Viết đủ theo công thức: .
Loss tại là . Và . Loss đi từ xuống trên bước này. Phép tính cho thấy, với parabol này và , một bước từ tới làm loss giảm . Nó không cho thấy mọi mạng neural sẽ giảm loss sau một bước.
Bước thứ hai, vẫn , để thấy quy tắc lặp lại chứ không đổi công thức. Đạo hàm tại là . Lượng trừ là . Trọng số mới là . Loss tại là . Tính rồi chia : , nên . Loss đi từ xuống . Hai bước đều tiến về phía , và cả hai đều giảm loss trên hàm này. Đáy vẫn còn ở ; chưa phải điểm dừng.
4. Backpropagation qua hai tầng, bằng lời và bằng số
Parabol một biến cho thấy bước cập nhật. Mạng thật có nhiều tầng, và loss chỉ được tính ở cuối. Backprop trả lời: nếu tăng rất ít một trọng số ở tầng trước, loss cuối đổi bao nhiêu. Câu trả lời là một tích các đạo hàm dọc theo đường tính, tức quy tắc dây chuyền. Phần này tính trọn một mạng nhỏ, số giả định, không phải một mô hình đã học trên sinh viên thật.
Đầu vào . Tầng ẩn có một trọng số và bias . Tổng trước kích hoạt là . Hàm kích hoạt là ReLU, tức lấy . Vì , đầu ra ẩn là .
Tầng ra tuyến tính, không uốn thêm: , . Dự đoán . Nhãn giả định . Loss bậc hai trên một mẫu là .
Quy tắc dây chuyền nói bằng lời, từ trọng số tầng ra: làm đổi theo hệ số bằng , chính là nên hệ số sang dự đoán là , và dự đoán làm đổi loss theo . Nhân ba hệ số đó được đạo hàm của loss theo .
Tính số. Đạo hàm của loss theo dự đoán là . Đạo hàm của theo là . Vậy đạo hàm của loss theo là . Đạo hàm theo là , vì bias cộng vào với hệ số .
Sang tầng ẩn, vẫn bằng lời: loss phụ thuộc thông qua , với hệ số ; phụ thuộc với độ dốc ReLU; phụ thuộc với hệ số . Vì , độ dốc ReLU bằng , không phải .
Đạo hàm của loss theo là . Nhân độ dốc ReLU: , đó là đạo hàm theo . Nhân : đạo hàm theo là . Đạo hàm theo là , vì bias đi vào với hệ số .
Cập nhật với cùng , trừ lần đạo hàm.
Trọng số ẩn mới: . Bias ẩn mới: . Trọng số ra mới: . Bias ra mới: .
Chạy lại forward trên cùng và cùng nhãn , để xem loss của mẫu này đổi ra sao, không phải để tuyên bố mạng đã học xong. Tổng ẩn: . ReLU của là , nên . Dự đoán: . Loss: .
Loss trên mẫu này đi từ xuống . Đồng thời từ thành , nên đơn vị ẩn tắt trên đúng đầu vào . Phép tính cho thấy cả hai sự kiện sau một bước với . Nó không cho thấy bước tiếp theo sẽ tiếp tục giảm loss, vì lần sau độ dốc ReLU tại mẫu này bằng và tín hiệu về từ mẫu này tắt theo.
Đây là hình của backprop trên hai tầng: lỗi ở đầu ra được đổi đơn vị thành độ dốc của , rồi độ dốc đó được đổi đơn vị thành độ dốc của , miễn là hàm kích hoạt còn độ dốc khác không. Thêm tầng thứ ba thì thêm một khúc nhân nữa. Mục thất bại xét chuyện tích những khúc đó trở nên rất nhỏ hoặc rất lớn.
Khi cách này thất bại
Bước gradient descent giả định một bước đủ ngắn để độ dốc tại chỗ xuất phát còn nói đúng hướng trong cả bước. Trên parabol , điều đó phụ thuộc .
Giữ điểm xuất phát , đạo hàm , nhưng đặt . Trọng số mới là . Loss tại là . Loss không tăng, và cũng không giảm: nó bằng đúng loss ban đầu. Điểm và điểm cách đáy cùng một khoảng . Bước dài đã nhảy sang phía bên kia, đối xứng qua đáy. Phép tính cho thấy với trên hàm này, một bước từ không tiến gần hơn tới về mặt loss.
Đặt , vẫn từ . Lượng trừ là . Trọng số mới là . Hiệu tới đáy là . Loss là . So với loss ban đầu , bước này tăng . Phép tính cho thấy một tốc độ học quá lớn, trên đúng parabol này, làm loss tăng sau một bước. Nó không cho một ngưỡng an toàn cho mọi mạng.
Độ dốc tại điểm đáp , để đọc chứ không dùng cho bước vừa rồi, là . Dấu đã đảo so với tại điểm xuất phát. Bước tiếp theo, nếu vẫn dùng , sẽ trừ một số dương lớn và có thể phóng sang phía kia. Hiện tượng loss dao động hoặc tăng dần khi bước quá dài được gọi là phân kỳ trên hàm đang tối ưu. Dấu hiệu thực hành là đường loss huấn luyện nhảy lên thay vì đi xuống sau khi tăng tốc độ học.
Thất bại thứ hai nằm ở tích các độ dốc khi mạng dày hoặc khi cùng một trọng số được dùng lại nhiều lần. Giả sử mỗi tầng nhân tín hiệu ngược với hệ số , và mọi hàm kích hoạt đang ở đoạn có độ dốc đó. Mười tầng thì tín hiệu bị nhân mười lần, tức . Nếu độ dốc tại loss là , độ dốc tới tầng đầu của chuỗi mười tầng đó là . Hai mươi lần nhân ra . Một tín hiệu xuất phát bằng còn lại một phần triệu bậc này, nhỏ hơn . Trọng số ở xa gần như không được sửa bởi mẫu đó. Người ta gọi đây là gradient biến mất. Hệ số ở đây là một giả định để thấy tích, không phải đạo hàm đo được của mạng mục 4. Trong mục 4, một ReLU tắt còn mạnh hơn: hệ số là , và cả nhánh phía trước nhận từ mẫu đó.
Chiều ngược lại, giả sử mỗi tầng nhân . Tính lũy thừa bằng cách nhân đôi số mũ. . Bình phương tiếp: và , nên . Tiếp theo . Tách : bình phương là . Nhân thêm để được : và , cộng lại . Dạng phân số của cùng số này là . Nếu độ dốc tại loss là , mười tầng hệ số đưa tín hiệu tới . Cập nhật trừ lần một số lớn sẽ nhảy rất xa. Người ta gọi đây là gradient bùng. Trên máy tính, số còn có thể tràn thành giá trị không dùng được.
Hai thất bại này giải thích vì sao “thêm tầng” và “tăng tốc độ học” không phải hai núm luôn có lợi. Tầng nhiều giúp biểu diễn, như bài neuron đã tách XOR bằng một tầng ẩn, và cũng tạo một chuỗi nhân dài cho gradient. Tốc độ học đã giảm loss trên parabol; tốc độ học đã tăng loss trên cùng parabol. Chỗ đọc thực hành là vẽ loss theo bước, và dừng để giảm khi đường đi lên, chứ không thêm epoch với cùng một bước đang phân kỳ.
5. Batch, epoch, và dấu hiệu học quá
Đạo hàm trong mục 3 lấy trên một hàm của một trọng số. Trên một tập dữ liệu, loss thường là trung bình trên nhiều mẫu, nên đạo hàm cũng là trung bình, hoặc tổng, các đạo hàm từng mẫu. Ba cách lấy trung bình đó có tên riêng.
Batch gradient descent tính đạo hàm trên toàn bộ tập huấn luyện rồi mới cập nhật một lần. Hướng ít bị một mẫu cá biệt kéo lệch, và mỗi lần cập nhật phải đọc hết dữ liệu.
Stochastic gradient descent, viết tắt SGD trong cách dùng gốc, lấy một mẫu, tính đạo hàm, cập nhật ngay. Bước rẻ và nhiễu. Nhiễu đôi khi làm quỹ đạo rời một vùng loss phẳng kém; nó cũng làm đường loss giật.
Mini-batch lấy một nhóm nhỏ, ví dụ vài chục hoặc vài trăm mẫu, tính đạo hàm trung bình trên nhóm, rồi cập nhật. Đây là cách gặp thường xuyên khi dữ liệu không vừa một lần tính và khi máy tính vector hóa theo nhóm. Cỡ nhóm là siêu tham số.
| Cách | Mẫu cho một lần cập nhật | Độ dốc | Việc mỗi lần cập nhật phải đọc |
|---|---|---|---|
| Batch | cả tập huấn luyện | ít nhiễu hơn | nhiều |
| SGD một mẫu | mẫu | nhiễu nhiều | ít |
| Mini-batch | một nhóm | ở giữa | vừa |
Một epoch là một lượt mà mọi mẫu huấn luyện đã được dùng đúng một lần, theo cách chia batch đang chọn. Tập mẫu, cỡ batch , thì số lần cập nhật trong một epoch là . Tập mẫu, cỡ batch : vì , một epoch có lần cập nhật. Hai mươi epoch nghĩa là mỗi mẫu có hai mươi lần góp vào một bước, nếu nó luôn nằm trong tập huấn luyện. Số epoch lớn hơn không kéo theo loss trên dữ liệu mới nhỏ hơn.
Overfitting, học quá khớp, là tình huống loss trên tập đang dùng để sửa trọng số tiếp tục giảm trong khi loss trên một tập giữ lại để theo dõi bắt đầu tăng. Tập giữ lại đó gọi là validation, tách khỏi tập huấn luyện trước khi nhìn các quyết định sửa mô hình. Tập test, nếu có, dành cho một lần đánh giá sau khi các lựa chọn đã chốt. Nhìn test rồi sửa mô hình theo test biến test thành validation dưới một tên khác.
Một bảng minh họa, các ô là số giả định để tập đọc dấu hiệu, không phải log của một lần chạy thật:
| 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 cùng một lượng trên các số đã ghi. Dấu hai phía ngược nhau. Trên bảng này, epoch có loss validation cao hơn epoch . Giữ bộ trọng số của epoch chỉ vì nó là vòng cuối sẽ chọn điểm validation tệ hơn trong chính bảng minh họa. Early stopping là quy tắc dừng hoặc hoàn nguyên về vòng validation còn tốt, ở đây là vòng nếu chỉ so bốn dòng đã viết.
Dropout là một cách làm mạng đỡ dựa vào một đơn vị. Trong lúc huấn luyện, một số đơn vị bị tắt ngẫu nhiên theo một xác suất đã chọn, và mạng phải tạo dự đoán bằng các đơn vị còn bật. Hình dưới đây minh họa các đơn vị bị gạch trong một lượt.

Khi dự đoán trên dữ liệu mới, ta không tiếp tục tắt ngẫu nhiên theo kiểu lúc huấn luyện. Mạng dùng đầy đủ các đơn vị, với một phép co giãn mà thư viện thường gắn vào lúc tắt ở pha huấn luyện hoặc lúc suy ra. Nhầm hai pha này làm đầu ra lúc báo cáo không còn là đầu ra đã tối ưu.
Các cách khác cùng mục đích giảm học quá: thêm dữ liệu, biến đổi dữ liệu mà nhãn vẫn đúng, phạt độ lớn trọng số, giảm số tầng hoặc số đơn vị, và dừng sớm như bảng trên. Không có cách nào trong số đó thay cho một tập validation tách bạch.
Đào sâu: tham số, siêu tham số, và những gì một bước chưa nói
Trở lại mạng mục 4. Các số sau cập nhật là tham số. Số là siêu tham số: nó không có một đạo hàm trong phép tính vừa rồi, dù người ta có thể thử vài giá trị và so loss validation. Số đơn vị ẩn, ở ví dụ là một, cũng là lựa chọn kiến trúc. Kiến trúc là cách các phép tính nối nhau. Tham số là số nằm trên các mũi tên đó. Siêu tham số là núm của quá trình học và của kích thước khung.
Gradient descent thuần trừ lần đạo hàm. Các optimizer hay gặp thêm một vận tốc: hướng các bước trước được cộng dồn, để một vùng đạo hàm nhỏ nhưng đều vẫn trôi về một phía, và để một đạo hàm đổi dấu liên tục bị vận tốc làm dịu. Bài này không tính một bước có vận tốc. Điều cần nhận ra là tên optimizer trên một dòng lệnh không thay đổi nghĩa của loss, và không thay việc phải có tập validation.
Mini-batch làm đạo hàm thành một ước lượng nhiễu của đạo hàm trên cả tập. Với cùng một , một batch nhỏ cho bước giật hơn một batch lớn. Tăng cỡ batch rồi giữ nguyên đổi cả độ nhiễu lẫn độ lớn hiệu quả của bước, vì trung bình trên nhiều mẫu có thang khác một mẫu. Đó là lý do người ta không sao chép một bộ siêu tham số từ bài toán khác rồi kết luận kiến trúc mới kém: có thể bước đang quá dài, như trên parabol, trong khi hàm loss của mạng còn khó hơn parabol rất nhiều.
Loss giảm cũng có thể đến từ một lỗi dữ liệu. Nếu nhãn bị sao chép từ một cột đã nằm trong đầu vào, forward pass sẽ tìm ra mối nối tắt đó, backprop sẽ tăng các trọng số tương ứng, và loss huấn luyện xuống rất thấp. Validation, nếu được cắt từ cùng một bảng đã rò, cũng đẹp. Đây vẫn là một vòng lặp huấn luyện đúng công thức, trên một câu hỏi sai. Đọc loss mà không đọc nguồn từng cột là đọc nhầm một phép tối ưu thành một kết luận về sinh viên, bệnh, hay giá.
Chuẩn hóa đầu vào đổi thang của đạo hàm. Nếu một đặc trưng nằm trong khoảng đến và đặc trưng kia nằm trong khoảng đến , cùng một là bước rất khác nhau theo hai trọng số. Parabol mục 3 chỉ có một biến, nên không thấy chuyện này. Trên mạng mục 4, đi thẳng vào đạo hàm theo , hệ số có mặt trong đó. Đổi thành mà giữ mọi thứ khác sẽ đổi đạo hàm đó, và có thể biến bước thành một bước quá đà kiểu mục thất bại. Co các đầu vào về một thang gần nhau là phần chuẩn bị, trước khi so kiến trúc.
Tự kiểm tra
- Tại với và , trọng số mới bằng bao nhiêu, và loss mới bằng bao nhiêu?
- Với từ cùng điểm , vì sao loss thành ?
- Trong mạng hai tầng, đạo hàm của loss theo bằng đến từ tích nào?
- Sau một bước, . ReLU cho bằng bao nhiêu trên mẫu ?
- Tập mẫu, batch , một epoch có bao nhiêu lần cập nhật?
- Trên bảng loss minh họa, vì sao bộ trọng số epoch kém hơn epoch nếu tiêu chí là loss validation?
Mang đi
Huấn luyện là lặp: đi xuôi để có dự đoán, tính loss, tính đạo hàm bằng backprop, rồi cập nhật tham số. Trên , từ với , một bước tới và loss từ xuống ; bước tiếp tới và loss . Cùng parabol với nhảy tới và loss , tức là tăng. Trên mạng hai tầng với , loss một mẫu đi từ xuống sau một bước , đồng thời ReLU của tầng ẩn tắt vì . Nhân lặp lại hệ số qua hai mươi tầng còn ; nhân lặp lại qua mười tầng ra . Loss trên tập đang sửa trọng số có thể giảm trong khi loss validation tăng, như bảng minh họa từ epoch sang epoch .
Bài sau hỏi vì sao không trải một ảnh thành một vector dài rồi nối đầy đủ mọi pixel, và tính trọn một kernel đang có trên trang đó.
Nguồn tham khảo
- CS50 AI, Lecture 5 - Neural Networks: https://cs50.harvard.edu/ai/notes/5/
- Rumelhart, D. E., Hinton, G. E., Williams, R. J. (1986), Learning representations by back-propagating errors, Nature, DOI: 10.1038/323533a0.