Tối ưu theo sở thích trực tiếp
Tối ưu theo sở thích trực tiếp
Có hai câu trả lời và một người nói câu nào hơn. Biến đúng một mẩu thông tin đó thành một con số để tối ưu, rồi xem con số nào quyết định cặp ấy còn dạy được gì.
Sau khi huấn luyện trước, mô hình chỉ biết đúng một việc: tiếp chữ sao cho giống dữ liệu nó đã đọc. Nó không biết rằng người ta đang hỏi nó, cũng không biết câu trả lời nào là tử tế hơn. Bước tinh chỉnh có giám sát dạy nó cái khuôn hội thoại, tức thấy lời nhắc thì trả lời chứ không viết tiếp lời nhắc. Nhưng khuôn hội thoại không nói được câu nào hơn câu nào, mà đó lại chính là thứ người ta có sẵn rất nhiều: cho hai câu trả lời cho cùng một lời nhắc, người xếp hạng chỉ tay vào một câu.
Bài này không kể chuyện học tăng cường từ phản hồi con người. Nó dừng ở phần tính được: từ một cặp đã xếp hạng, làm sao ra được một con số để tối ưu, và con số nào trong đó quyết định cặp ấy còn hữu ích hay đã cạn.
Công thức chỉ có bốn bước, và bước nào cũng là số học phổ thông. Với câu được chọn y_w và câu bị loại y_l:
- tỉ số log của mỗi câu là
log πtrừlog π_ref, tức chính sách đang huấn luyện đã đẩy câu đó lên hay dìm xuống bao nhiêu so với mô hình tham chiếu đang bị đóng băng; - phần thưởng hàm ý là tỉ số log đó nhân
beta; - biên là phần thưởng hàm ý của câu được chọn trừ của câu bị loại;
- mất mát là
-log sigmoid(biên).
Nếu sigmoid còn lạ thì xem lại sigmoid và hồi quy logistic; phần -log của một xác suất thì đã gặp ở hàm mất mát dưới tên cross-entropy, và bài này là đúng cái hàm đó áp lên một phép so sánh hai lựa chọn thay vì một nhãn.
Có một cách đọc sigmoid(biên) làm mọi thứ khớp lại. Chạy softmax trên đúng hai điểm số, ở đây là hai phần thưởng hàm ý, thì xác suất của cái thứ nhất là e^r_w chia cho e^r_w + e^r_l, và chia cả tử lẫn mẫu cho e^r_w sẽ ra ngay sigmoid(r_w - r_l). Nghĩa là sigmoid ở đây không phải một hàm nén tuỳ chọn: nó chính là softmax trên hai lựa chọn, và mất mát -log sigmoid(biên) chính là cross-entropy của bài phân loại "người xếp hạng đã chọn câu nào".
1 · Một cặp đã được xếp hạng ✎ sửa được
| câu trả lời | log π | log π_ref | tỉ số log | phần thưởng hàm ý | token | log π mỗi token | log π_ref mỗi token |
|---|---|---|---|---|---|---|---|
| được chọn (y_w) | -28,00 | -30,00 | +2,0000 | +0,2000 | 40 | -0,7000 | -0,7500 |
| bị loại (y_l) | -31,50 | -32,00 | +0,5000 | +0,0500 | 45 | -0,7000 | -0,7111 |
Tỉ số log là log π trừ log π_ref, tức chính sách đã đẩy câu đó lên hay dìm xuống bao nhiêu so với mô hình tham chiếu đang bị đóng băng. Phần thưởng hàm ý chỉ là tỉ số đó nhân beta = 0,100. Hai cột cuối là log xác suất chia cho số token: chúng giúp bạn thấy độ lớn có hợp lý hay không, nhưng không tham gia vào mất mát, vì mất mát cộng dồn log xác suất trên cả câu chứ không lấy trung bình.
2 · Từ biên tới mất mát
Biên = +0,2000 - (+0,0500) = 0,1500. Rồi sigmoid(biên) = 0,5374 và mất mát = -log sigmoid(biên) = 0,620957.
sigmoid(biên), tức mô hình đang xếp cặp này đúng thứ tự với độ chắc bao nhiêu-log sigmoid(biên), càng nhỏ càng khớp thứ hạngsigmoid(-biên), tức cặp này còn dạy được bao nhiêubeta × trọng số = 0,100 × 0,462570 = 0,046257. Đây là chỗ beta có hai vai trò ngược nhau: beta nhỏ làm biên co lại nên trọng số tăng, mà beta cũng nhân vào phía trước nên bậc bước giảm. Kéo beta rồi xem con số này, đừng đoán.3 · Trọng số gradient tụt nhanh cỡ nào
0 là mốc kiểm: mất mát đúng log 2 ≈ 0,693147 và trọng số đúng 0,5, dù beta bằng bao nhiêu. Từ biên 2 trọng số đã xuống dưới 0,12, tới biên 6 chỉ còn 0,00247, tức khoảng một phần hai trăm của mốc. Cặp nào tới đó rồi thì vẫn tốn đủ phép tính mà gần như không đóng góp gì.4 · Cùng công thức, hai cách tính
log1p, tách hai nhánh)0,620957-log(1/(1+e^-x)))0,620957log π câu được chọn xuống thật sâu (hoặc đẩy beta lên 2) để biên rất âm, hoặc làm ngược lại để biên vượt 50.- Nó tính đúng một hàm mất mát cho đúng một cặp. Nó không chứng minh rằng huấn luyện theo cách này làm mô hình hữu ích hơn, trung thực hơn hay an toàn hơn. Những kết luận đó là thực nghiệm của người khác, đo trên tập đánh giá thật, và không có con số nào ở đây nói được về chúng.
- Bốn log xác suất là số tự đặt. Trong thực tế chúng là tổng log xác suất từng token do mô hình sinh ra, và lấy được chúng đòi hỏi chạy cả chính sách lẫn mô hình tham chiếu trên từng cặp.
- Trọng số gradient ở đây là hệ số vô hướng
sigmoid(-biên)đứng trước gradient. Nó không phải toàn bộ gradient: phần còn lại là gradient của log xác suất theo tham số, thứ mà số học trên trang này không chạm tới. - Trung bình mỗi token chỉ để bạn đọc độ lớn cho dễ. Hàm mất mát chuẩn cộng dồn log xác suất trên cả câu, nên hai núm số token không làm mất mát đổi, và cổng kiểm có khẳng định khoá đúng chuyện đó.
Bốn con số vào, năm con số ra
Ở trạng thái mở bài, cặp trông như thế này. Câu được chọn có log π = -28 và log π_ref = -30, nên tỉ số log là +2,0000. Câu bị loại có -31,5 và -32, tỉ số log +0,5000. Với beta = 0,1, hai phần thưởng hàm ý là +0,2000 và +0,0500, nên biên bằng 0,1500. Từ đó sigmoid(biên) ra 53,74%, mất mát ra 0,620957, và trọng số gradient ra 0,462570.
Có một chuyện trong cấu hình này đáng dừng lại. Câu được chọn dài 40 token, câu bị loại dài 45 token, và log xác suất trung bình mỗi token theo chính sách của cả hai đều bằng đúng -0,7000. Tính theo độ khớp tuyệt đối thì hai câu ngang nhau. Thế mà biên vẫn dương, vì biên không đo xác suất tuyệt đối: nó đo độ dịch chuyển so với tham chiếu. Theo tham chiếu, câu được chọn chỉ đạt -0,7500 mỗi token còn câu bị loại đạt -0,7111, nên phần chính sách đẩy lên ở câu được chọn nhiều hơn. Cả hàm mất mát này chỉ nhìn vào hiệu của hiệu, và đó là lý do nó cần một mô hình tham chiếu chứ không chỉ cần chính sách.
Hai núm số token thì có mặt để bạn đọc độ lớn cho dễ, chứ chúng không làm mất mát đổi: công thức chuẩn cộng dồn log xác suất trên cả câu, không lấy trung bình. Cổng kiểm số của bài có một khẳng định khoá đúng chuyện đó, để chỗ này là lựa chọn được ghi rõ chứ không phải một cái quên.
Trọng số gradient là chỗ đáng nhìn nhất
Mất mát nhỏ nghe như tin tốt, và ở đây nó là tin tốt hiểu theo nghĩa hẹp: cặp đã được xếp đúng thứ tự. Nhưng nó cũng là tin xấu, vì đạo hàm của -log sigmoid(biên) theo biên đúng bằng trừ sigmoid(-biên). Nói cách khác, hệ số vô hướng đứng trước gradient của cặp này là sigmoid(-biên), và nó tụt cùng lúc với mất mát.
Bảng ở mục 3 của sim cho thấy cả đường tụt một lượt. Ở biên 0 trọng số bằng 0,5. Tới biên 2 nó đã xuống 0,119203, dưới 0,12. Tới biên 6 nó chỉ còn 0,002473, tức khoảng một phần hai trăm của mốc. Tới biên 10 là 4,540e-5. Bấm preset cặp đã tách xa để tới đúng chỗ đó: biên 6, mất mát 0,002476, và trọng số 0,002473. So với cặp đang mở bài, trọng số của nó nhỏ hơn khoảng 187 lần, dù nó vẫn nằm trong lô, vẫn phải chạy qua cả chính sách lẫn mô hình tham chiếu, vẫn tốn đủ phép tính.
Hệ quả thực hành: cặp còn lẫn lộn mới là cặp có ích. Một tập dữ liệu sở thích mà phần lớn cặp đã tách xa thì mỗi lượt học gần như chỉ đốt máy. Bấm preset chính sách đi sai hướng để thấy đầu kia của thang: biên -1, mất mát 1,313262 vượt log 2, và trọng số lên 0,731059, tức cặp bị kéo mạnh hơn cả cặp ở mốc 0.
Mốc biên bằng 0 là chỗ tự kiểm được
Bấm preset biên đúng bằng 0. Ở đó cả hai câu dịch chuyển y hệt nhau so với tham chiếu, mỗi câu +2, nên hai phần thưởng hàm ý bằng nhau và biên triệt tiêu. sigmoid(0) bằng đúng một nửa, nên mất mát bằng -log(1/2) tức log 2, xấp xỉ 0,693147, và trọng số gradient bằng đúng 0,5.
Điểm đẹp của mốc này là nó không phụ thuộc beta: beta nhân vào cả hai phần thưởng nên nó không cứu được một hiệu bằng 0. Kéo beta từ 0,001 tới 2, hai con số đó không nhúc nhích. Đây là mốc mà cổng kiểm số khoá với sai số bằng không, không phải bằng một ngưỡng nới tay, và khoá qua cả bảy giá trị beta khác nhau.
Beta có hai vai trò ngược nhau
Dễ tưởng beta chỉ là một hệ số tỉ lệ, nhưng nó vào công thức ở hai chỗ đánh nhau. Nó nhân vào biên, nên beta nhỏ làm biên co lại, và biên co lại thì trọng số gradient tăng. Đồng thời nó cũng đứng trước gradient, nên bậc bước thật là beta nhân trọng số.
Preset beta rất nhỏ cho thấy hai lực đó cộng lại ra gì. Vẫn đúng cặp đã tách xa, chỉ hạ beta từ 0,1 xuống 0,01: biên co từ 6 về 0,6000, trọng số bật từ 0,002473 lên 0,354344, và bậc bước thật đi từ 0,000247 lên 0,003543, tức lớn hơn khoảng mười bốn lần. Nói gọn: beta không chỉ điều chỉnh cường độ, nó quyết định cặp nào bị coi là đã xong. Beta lớn làm cặp cạn nhanh, beta nhỏ giữ cặp lại lâu hơn.
Còn beta bằng bao nhiêu thì hợp? Tôi không nêu ở đây. Sim mặc định 0,1 chỉ vì con số đó cho biên dễ đọc, và giá trị nào là "thường dùng" trong thực tế thì tôi chưa kiểm được từ nguồn gốc, nên thà nói thẳng là chưa kiểm còn hơn dán một con số nghe có vẻ chuyên nghiệp. Đặt beta bằng 0 thì sim kẹp về 0,001 và báo cho bạn biết là nó đã kẹp, kèm lý do: beta bằng 0 làm biên luôn bằng 0, mất mát đóng băng ở log 2, và không còn gì để học.
Vì sao công thức phải viết khác cách nó đọc
Mục 4 của sim in mất mát hai lần. Một lần bằng dạng ổn định, một lần bằng đúng cách công thức đọc trên giấy là -log(1/(1+e^-x)). Ở vùng biên thông thường hai cột trùng nhau tới chữ số cuối, nên nếu chỉ thử với dữ liệu tử tế thì bạn sẽ không bao giờ thấy vấn đề.
Đẩy biên ra hai đầu thì thấy ngay. Ở biên -800, dạng viết thẳng phải tính e^800, vượt số thực lớn nhất biểu diễn được, nên sigmoid làm tròn về 0 rồi log 0 ra vô cực: một cặp như vậy trong lô là đủ để mất mát trung bình của cả lô thành vô cực và gradient thành không xác định. Dạng ổn định trả về đúng 800. Ở đầu kia, biên 50, dạng viết thẳng làm tròn sigmoid thành đúng 1 nên in ra 0, còn giá trị thật là 1,929e-22. Cái này nguy hơn cái trên: không có cảnh báo nào, chỉ có một con số đã mất hết ý nghĩa mà vẫn trông bình thường.
Cách vá là tách hai nhánh và dùng log1p: với x dương thì log1p(exp(-x)), với x âm thì -x + log1p(exp(x)). Hai nhánh gặp nhau ở x = 0 tại log 2, và không nhánh nào phải tính một hàm mũ lớn hơn 1. Cả hai đầu cực trị đều có khẳng định trong cổng kiểm, kèm ngưỡng sai số ghi rõ: 1e-12 tuyệt đối ở đầu âm, và 1e-30 tuyệt đối ở đầu dương để chứng minh con số 1,929e-22 còn nguyên từng chữ số chứ không bị làm tròn về 0.
Sim này không chứng minh được gì
Nói thẳng, vì đây là chỗ dễ đọc lố nhất. Sim tính đúng một hàm mất mát cho đúng một cặp, và mọi con số trên trang đều kiểm được bằng tay. Nó không chứng minh rằng huấn luyện theo cách này làm mô hình hữu ích hơn, trung thực hơn hay an toàn hơn. Nó cũng không nói gì về việc thứ hạng của người xếp có phản ánh cái gì đáng giá hay không, mà đó mới là câu hỏi khó: một hàm mất mát chỉ trung thành với nhãn nó được cho, nên nếu người xếp hạng thích câu trả lời dài dòng dễ nghe hơn câu trả lời đúng thì công thức này sẽ tối ưu đúng cái sở thích đó rất giỏi. Phần bàn về chuyện ai đặt tiêu chí và trách nhiệm nằm ở đâu thì ở an toàn và đạo đức.
Vài điểm nhỏ nhưng hay bị bỏ qua:
- Trọng số gradient ở đây là một hệ số vô hướng, không phải toàn bộ gradient. Phần còn lại là gradient của log xác suất theo tham số, thứ mà số học trên trang này không chạm tới.
- Bốn log xác suất là số tự đặt. Không preset nào dán tên mô hình, vì chúng là tình huống chứ không phải cấu hình có thật. Trong thực tế chúng là tổng log xác suất từng token, và lấy được chúng đòi hỏi chạy cả chính sách lẫn mô hình tham chiếu trên từng cặp, tức bộ nhớ và thời gian gấp đôi.
- Log xác suất không bao giờ dương. Gõ một số dương vào thì sim kẹp về
0và nói rõ là nó đã kẹp, vì xác suất không vượt quá1. - Cổng kiểm số canh phép tính, không canh khẳng định về mô hình ngoài kia. Nó có 450 khẳng định, tất cả về số học: nếu cấu hình là như vậy thì biên, mất mát và trọng số phải là như vậy.
Một cặp đã xếp hạng biến thành một con số qua bốn bước: tỉ số log so với mô hình tham chiếu, nhân beta thành phần thưởng hàm ý, trừ nhau thành biên, rồi -log sigmoid thành mất mát. Con số đáng nhìn nhất không phải mất mát mà là sigmoid(-biên), hệ số đứng trước gradient: ở biên 0 nó bằng đúng 0,5 cùng với mất mát log 2, tới biên 6 chỉ còn 0,002473, nên cặp đã tách xa gần như thôi dạy được gì trong khi vẫn tốn đủ phép tính. Cặp còn lẫn lộn mới là cặp có ích. Và beta không chỉ là hệ số cường độ, nó quyết định cặp nào bị coi là đã xong. Đếm đúng một hàm mất mát không có nghĩa là chứng minh được cách huấn luyện này làm mô hình tốt hơn: phần đó phải chạy thực nghiệm mới biết.
- 1Hai câu trả lời của một cặp dịch chuyển y hệt nhau so với mô hình tham chiếu, tức hai tỉ số log bằng nhau. Mất mát và trọng số gradient bằng bao nhiêu, và beta ảnh hưởng thế nào?
- 2Cặp A có biên 0,15 và mất mát 0,620957. Cặp B có biên 6 và mất mát 0,002476. Cặp nào đóng góp nhiều hơn vào bước cập nhật?
- 3Trong một lô huấn luyện có một cặp mà biên bằng -800. Nếu mất mát được tính đúng như công thức đọc trên giấy, tức trừ log của một chia cho một cộng e mũ trừ x, thì chuyện gì xảy ra?