Một mô hình ngôn ngữ không viết cả câu trả lời một lúc: ở mỗi bước, nó chấm điểm cho mọi token có thể xuất hiện tiếp theo, dùng hàm softmax biến các điểm đó thành một phân phối xác suất, rồi chọn một token theo phân phối ấy. Lặp lại bước này hàng trăm lần là có một đoạn văn. Tham số nhiệt độ mà nhiều công cụ cho chỉnh là một con số chia vào điểm số trước khi qua softmax, làm phân phối nhọn hơn hoặc bẹt hơn.
Hiểu phần toán nhỏ này giúp giải thích nhiều hiện tượng quen thuộc: vì sao cùng một câu hỏi mà mỗi lần hỏi lại ra câu trả lời khác, vì sao hạ nhiệt độ thì câu trả lời đều đều hơn, và vì sao một câu văn trôi chảy, tự tin vẫn có thể sai sự thật. Bài này tính tay softmax với ba lựa chọn, thử ba mức nhiệt độ và giải thích các cách chọn token như tham lam, top-k, top-p.
Mô hình ngôn ngữ thật ra đang tính cái gì
Về mặt xác suất, mô hình ngôn ngữ ước lượng xác suất của token tiếp theo khi biết mọi token phía trước. Xác suất của cả một câu được phân tích bằng quy tắc nhân: xác suất token thứ nhất, nhân xác suất token thứ hai khi đã biết token thứ nhất, nhân xác suất token thứ ba khi đã biết hai token trước, và cứ thế. Mô hình chỉ cần học tốt từng thừa số có điều kiện đó.
Ở mỗi vị trí, lớp cuối của mạng trả về một vector điểm số thô, mỗi token trong từ vựng một điểm. Từ vựng của các mô hình hiện nay thường có hàng chục nghìn đến vài trăm nghìn token. Điểm số thô có thể âm hoặc dương, không có tổng cố định, nên chưa phải xác suất. Người ta gọi chúng là logit.
Bước biến logit thành xác suất là softmax. Sau đó là bước giải mã: chọn ra một token cụ thể từ phân phối. Hai bước này tách biệt, và các tham số như nhiệt độ, top-k, top-p chỉ tác động lên bước giải mã, không thay đổi những gì mô hình đã học. Vì vậy chỉnh nhiệt độ không làm mô hình “biết” thêm hay bớt điều gì; nó chỉ đổi cách chọn từ những gì đã có.
Tính tay softmax với ba lựa chọn
Công thức: xác suất của lựa chọn thứ i bằng e mũ logit thứ i, chia cho tổng e mũ của mọi logit. Ví dụ giả định: sau cụm “Hôm nay trời”, mô hình cho ba token ứng viên “mưa”, “nắng”, “đẹp” các logit lần lượt là 2, 1 và 0.
- Tính e mũ từng logit: e² xấp xỉ 7,389; e¹ xấp xỉ 2,718; e⁰ = 1.
- Cộng lại: 7,389 + 2,718 + 1 = 11,107.
- Chia từng số cho tổng: “mưa” được 7,389 : 11,107, xấp xỉ 0,665; “nắng” được 2,718 : 11,107, xấp xỉ 0,245; “đẹp” được 1 : 11,107, xấp xỉ 0,090.
- Kiểm: 0,665 + 0,245 + 0,090 = 1,000. Tổng các xác suất luôn bằng 1, đó là việc của phép chia cho tổng.
- Nhận xét: logit chỉ chênh nhau 1 đơn vị, nhưng xác suất chênh nhau khoảng 2,7 lần giữa hai lựa chọn liền kề, vì e xấp xỉ 2,718. Hàm mũ khuếch đại khoảng cách giữa các điểm số.
Trong mô hình thật, phép tính giống hệt, chỉ là tổng ở mẫu số chạy qua toàn bộ từ vựng. Phần lớn token nhận xác suất rất gần 0, chỉ vài chục token có xác suất đáng kể ở mỗi bước.
Vì sao lại dùng hàm mũ, và một mẹo tính toán quan trọng
Có nhiều cách biến một dãy số thành xác suất, nhưng hàm mũ có những tính chất rất tiện. Thứ nhất, e mũ một số luôn dương, nên logit âm vẫn cho xác suất dương. Thứ hai, hàm mũ đồng biến, nên logit lớn hơn luôn cho xác suất lớn hơn, giữ nguyên thứ tự. Thứ ba, khi kết hợp với entropy chéo trong lúc huấn luyện, đạo hàm theo logit có dạng rất gọn: xác suất dự đoán trừ nhãn đúng.
Một tính chất nữa: cộng cùng một hằng số vào mọi logit không đổi kết quả softmax. Lý do là e mũ (a + c) bằng e mũ a nhân e mũ c, và thừa số e mũ c xuất hiện ở cả tử và mẫu nên triệt tiêu. Logit (1002; 1001; 1000) cho đúng xác suất như (2; 1; 0).
Tính chất này được dùng ngay trong mã nguồn. Nếu tính thẳng e mũ 1002, máy tính sẽ tràn số vì kết quả vượt xa giới hạn của số thực dấu phẩy động. Cách làm chuẩn là trừ mọi logit cho logit lớn nhất trước khi tính mũ, biến (1002; 1001; 1000) thành (0; −1; −2), kết quả không đổi mà không bao giờ tràn. Nếu bạn tự viết softmax mà quên bước này, mã sẽ chạy đúng với ví dụ nhỏ và hỏng với dữ liệu thật.
Nhiệt độ: cùng logit, ba kiểu phân phối
Nhiệt độ T là một số dương. Trước khi qua softmax, mọi logit được chia cho T. Với ba logit (2; 1; 0) như trên, kết quả ở ba mức nhiệt độ như sau:
| Nhiệt độ T | Logit sau khi chia T | Xác suất “mưa” | Xác suất “nắng” | Xác suất “đẹp” |
|---|---|---|---|---|
| 0,5 | (4; 2; 0) | xấp xỉ 0,867 | xấp xỉ 0,117 | xấp xỉ 0,016 |
| 1 | (2; 1; 0) | xấp xỉ 0,665 | xấp xỉ 0,245 | xấp xỉ 0,090 |
| 2 | (1; 0,5; 0) | xấp xỉ 0,506 | xấp xỉ 0,307 | xấp xỉ 0,186 |
Nhiệt độ thấp kéo giãn khoảng cách giữa các logit, phân phối nhọn lên, lựa chọn đứng đầu áp đảo. Khi T tiến về 0, xác suất dồn hết vào lựa chọn có logit lớn nhất, tương đương luôn chọn token đứng đầu. Nhiệt độ cao co khoảng cách lại, phân phối bẹt ra, các lựa chọn ít khả năng có nhiều cơ hội hơn. Khi T rất lớn, mọi lựa chọn gần như ngang nhau, văn bản trở nên lộn xộn.
Tên gọi nhiệt độ mượn từ vật lý thống kê, nơi phân phối Boltzmann có dạng giống hệt softmax với năng lượng chia cho nhiệt độ: nóng thì các trạng thái được chiếm đều hơn, lạnh thì dồn về trạng thái năng lượng thấp nhất.
Các cách chọn token từ phân phối
Tham lam. Luôn chọn token có xác suất cao nhất. Kết quả ổn định, nhưng văn bản dài dễ lặp lại và đơn điệu, vì lựa chọn tốt nhất ở từng bước chưa chắc tạo ra đoạn văn tốt nhất về tổng thể.
Lấy mẫu thuần. Chọn ngẫu nhiên đúng theo xác suất: trong ví dụ, “mưa” được chọn khoảng 66,5% số lần. Đa dạng hơn, nhưng thỉnh thoảng sẽ bốc trúng một token xác suất rất thấp và câu văn trượt khỏi mạch.
Top-k. Chỉ giữ k token có xác suất cao nhất, chia lại cho tổng bằng 1, rồi lấy mẫu trong nhóm đó. Với k = 2 trong ví dụ, “đẹp” bị loại; “mưa” và “nắng” được chuẩn hoá lại thành khoảng 0,731 và 0,269.
Top-p. Còn gọi là lấy mẫu hạt nhân. Xếp token theo xác suất giảm dần, giữ nhóm nhỏ nhất có tổng xác suất đạt ngưỡng p, rồi lấy mẫu trong nhóm. Với p = 0,9 trong ví dụ, “mưa” cộng “nắng” mới được 0,910, đủ ngưỡng, nên “đẹp” bị loại. Ưu điểm so với top-k là số token được giữ tự co giãn: khi mô hình chắc chắn thì nhóm nhỏ, khi phân vân thì nhóm lớn.
Kết hợp. Các công cụ thường áp nhiệt độ trước, rồi top-k hoặc top-p, rồi mới lấy mẫu. Tên và giá trị mặc định của các tham số khác nhau giữa các nhà cung cấp và thay đổi theo phiên bản, nên khi cần chỉnh hãy đọc tài liệu hiện hành của công cụ bạn dùng.
Trôi chảy không có nghĩa là đúng
Mô hình được huấn luyện để token tiếp theo có xác suất cao theo văn bản nó đã học, không phải để câu văn đúng với thực tế. Hai mục tiêu này thường trùng nhau với kiến thức phổ biến, nhưng tách nhau ở những chỗ hiếm gặp: một con số cụ thể, một năm sự kiện ít được nhắc, một trích dẫn tài liệu. Ở đó, token “nghe hợp lý” có thể có xác suất cao hơn token đúng.
Hạ nhiệt độ về 0 làm câu trả lời ổn định hơn, nhưng không làm nó đúng hơn về sự thật: mô hình chỉ chọn nhất quán lựa chọn đứng đầu, kể cả khi lựa chọn đứng đầu sai. Ngược lại, hỏi lại nhiều lần với nhiệt độ cao và thấy các câu trả lời mâu thuẫn nhau là một tín hiệu hữu ích rằng mô hình không chắc về chi tiết đó.
Với toán học, điều này đặc biệt đáng nhớ. Một lời giải nhiều bước là chuỗi rất nhiều lựa chọn token, mỗi bước có một xác suất nhỏ trượt khỏi đường đúng. Chuỗi càng dài, khả năng có ít nhất một bước sai càng tăng. Đây là lý do mọi kết quả số do chatbot đưa ra nên được tự kiểm bằng tay hoặc bằng công cụ tính toán, như các bài khác của trang vẫn nhắc.
Chọn nhiệt độ cho việc thật
Không có giá trị đúng cho mọi việc. Dưới đây là định hướng chung, khi công cụ của bạn cho phép chỉnh tham số này:
- Giải toán, viết mã, trích xuất thông tin theo mẫu, phân loại văn bản: nhiệt độ thấp, để kết quả nhất quán và dễ kiểm.
- Tóm tắt, viết lại cho gọn, dịch: nhiệt độ thấp đến vừa phải.
- Gợi ý ý tưởng, đặt tên, viết nháp sáng tạo: nhiệt độ cao hơn, rồi chọn lọc bằng con người.
- Khi cần đánh giá độ tin cậy: hỏi cùng một câu vài lần ở nhiệt độ vừa, so các câu trả lời; chỗ nào lệch nhau là chỗ cần tự kiểm.
- Khi dùng giao diện trò chuyện thông thường không có ô chỉnh nhiệt độ: thêm yêu cầu rõ ràng trong câu lệnh, ví dụ “chỉ trả lời khi chắc chắn, nếu không chắc thì nói không chắc”, dù cách này không thay được việc tự kiểm.
Nếu bạn gửi dữ liệu thật của cơ quan hay khách hàng qua giao diện lập trình để thử các mức nhiệt độ, nhớ che tên, số giấy tờ, số tài khoản trước, như với mọi thao tác đưa dữ liệu vào AI.
Câu hỏi thường gặp
Nhiệt độ bằng 0 có làm câu trả lời luôn giống hệt nhau không?
Về nguyên tắc, nhiệt độ 0 nghĩa là luôn chọn token có xác suất cao nhất nên kết quả phải giống nhau. Trên thực tế, một số hệ thống vẫn cho kết quả lệch nhẹ giữa các lần chạy do chi tiết tính toán số thực song song trên phần cứng. Nếu cần tái lập chính xác, hãy đọc tài liệu của nhà cung cấp về chế độ tất định.
Softmax khác gì với việc chia từng điểm cho tổng các điểm?
Chia trực tiếp chỉ dùng được khi mọi điểm đều dương, và nó không khuếch đại khoảng cách. Softmax dùng hàm mũ nên xử lý được điểm âm, giữ thứ tự, và làm chênh lệch nhỏ về điểm trở thành chênh lệch lớn hơn về xác suất. Đạo hàm của nó khi ghép với entropy chéo cũng gọn hơn nhiều.
Xác suất mô hình đưa ra có phải là độ tin cậy của câu trả lời không?
Không hẳn. Đó là xác suất của token theo những gì mô hình học được, không phải xác suất câu trả lời đúng. Mô hình có thể gán xác suất rất cao cho một token sai. Một số nghiên cứu dùng xác suất token làm tín hiệu để đoán độ chắc chắn, nhưng cần hiệu chỉnh và không nên coi là bảo đảm.
Vì sao gọi là logit?
Trong thống kê, logit là logarit của tỉ số odds, đại lượng đi vào hàm sigmoid trong hồi quy logistic. Trong học sâu, tên này được mở rộng để chỉ mọi điểm số thô trước khi qua sigmoid hoặc softmax. Cách dùng mở rộng này không hoàn toàn khớp định nghĩa gốc nhưng đã thành quen.
Top-k và top-p nên dùng cái nào?
Top-p thường được ưa hơn vì tự điều chỉnh số lựa chọn theo mức chắc chắn của mô hình ở từng bước. Top-k đơn giản và dễ dự đoán hơn. Nhiều công cụ cho dùng cả hai cùng lúc. Với người dùng thông thường, chỉnh nhiệt độ và để mặc định các tham số còn lại thường là đủ.
Softmax có dùng ở chỗ nào khác ngoài đầu ra không?
Có. Trong cơ chế chú ý của Transformer, softmax biến điểm tương đồng giữa các token thành trọng số chú ý có tổng bằng 1. Nó cũng dùng ở đầu ra của mọi mô hình phân loại nhiều lớp, ví dụ nhận dạng ảnh thuộc loại nào trong một nghìn loại.