Forward Propagation in Chat Response
Mỗi token ChatGPT gõ ra là một lượt lan truyền thuận
Công ty nào đang ứng dụng Lan truyền thuận?
Bạn gõ “Chào bạn” vào ChatGPT (trợ lý chat của OpenAI) rồi nhấn Enter. Khoảng 20 mili-giây sau, token đầu tiên hiện ra. Rồi từng token kế tiếp, cứ đều đặn hơn chục mili-giây một cái. Câu trả lời dài 200 từ xuất hiện trong chưa tới 5 giây.
Trong mỗi 20 mili-giây đó, dữ liệu của bạn chạy xuyên qua hàng trăm tỉ tham số, con số mà model đã học từ hàng ngàn tỉ từ văn bản. Quá trình này gọi là lan truyền thuận (forward propagation): dữ liệu đi một chiều từ đầu vào qua các tầng, tới đầu ra, không quay lại. Bài này mở từng bước của một lượt lan truyền đó.
Bạn
Chào bạn, hôm nay thời tiết thế nào?
ChatGPT
Mỗi từ xuất hiện trên màn hình là một lượt lan truyền thuận đi xuyên qua hàng trăm tỉ tham số. Trong 20 mili-giây đó, model làm rất nhiều việc. Phần tiếp theo mở ra từng bước.
Vấn đề công ty cần giải quyết
ChatGPT cần đọc lại toàn bộ đoạn hội thoại đã có, rồi đoán token tiếp theo hợp nhất. Với mỗi token mới, quá trình lặp lại. Nói cách khác, một câu trả lời 200 từ cần khoảng 250 đến 300 lượt lan truyền.
Mỗi lượt đi qua hàng chục tới hàng trăm tầng Transformer (khối mạng chuyên xử lý chuỗi), thực hiện hàng trăm tỉ phép tính nhân-cộng. Trong khi đó, người dùng chỉ chịu được vài giây chờ. Lâu hơn nữa thì trải nghiệm chat thời gian thực coi như mất.
Còn một vấn đề khác đáng chú ý: cửa sổ ngữ cảnh (context window) có giới hạn. Model chỉ nhớ được một số token nhất định trong một lần gọi, vài nghìn tới vài trăm nghìn tuỳ phiên bản. Vì sao? Phần Deepen sẽ dẫn bạn tới đáp án qua một câu đố nhỏ.
Cách Lan truyền thuận giải quyết vấn đề
Pipeline tương tác: bấm mở từng giai đoạn
Mỗi khối dưới đây là một giai đoạn của lượt lan truyền thuận. Bấm vào khối để mở mini-viz tương ứng.
2/6Giai đoạn: Tokenize
Tách thành token
Câu bị cắt thành các mảnh gọi là token. Một token có thể là một từ, một nửa từ, hoặc vài ký tự. Mỗi token được gán một mã số duy nhất trong từ điển của model.
Chuỗi ký tự được cắt thành token, mỗi token có một mã số
Chào#7342bạn#1184,#11hôm#3098nay#652thời#4417tiết#5086Thuật toán BPE (Byte Pair Encoding) chọn cách cắt sao cho các cụm hay gặp như “ bạn” hay “ tiết” đều gói thành một token duy nhất. Một tiếng tiếng Việt có dấu thường tốn một token, còn dấu câu là một token riêng.
Tokenize. Câu hỏi được cắt thành các mảnh nhỏ gọi là token. Ví dụ “Chào bạn, hôm nay thời tiết” thành [“Chào”, “ bạn”, “,”, “ hôm”, “ nay”, “ thời”, “ tiết”]. Mỗi token có một mã số riêng trong từ điển của mô hình.
Embed. Mỗi mã số được thay bằng một vector embedding, một mảng vài nghìn con số mang ý nghĩa của token đó. Đây là dạng “ngôn ngữ” duy nhất mà mạng nơ-ron hiểu được. Model cộng thêm một vector vị trí để biết thứ tự các token trong câu.
Transformer. Chồng vector đi qua hàng chục đến hàng trăm tầng Transformer. Trong mỗi tầng, cơ chế attentioncho mỗi token “nhìn” các token khác và trộn thông tin. Sau đó là mạng feed-forward xử lý thêm. Vector của mỗi token ngày càng giàu ngữ cảnh hơn.
Softmax & sampling. Tầng cuối cho ra một danh sách điểm số (logit) trên toàn bộ từ điển. Softmax biến logit thành xác suất, tổng cộng 100%. Hệ thống bốc thăm một token theo xác suất này. Nhiệt độ càng cao, model càng sẵn sàng chọn token ít phổ biến. Token mới được gắn vào chuỗi và chu trình lặp lại cho token tiếp theo.
KV Cache, mẹo giúp nhanh lên rất nhiều. Thay vì tính lại từ đầu cho mỗi token, hệ thống lưu các khoá (key) và giá trị (value) của các token cũ vào bộ nhớ đệm. Mỗi bước chỉ cần tính phần gia tăng cho token mới, nhờ vậy tiết kiệm hàng tỉ phép tính.
Bộ nhớ đệm KV: so sánh hai cách tính#1#2#3#4#5#6#7#8mớiXanh là chỉ tính token mới. Các token cũ đã lưu key và value, nên chỉ cần tính cho token thứ 9. Mỗi bước tiết kiệm hàng tỉ phép tính.
Mở bên trong một lượt sinh token
Theo chân một token được sinh ra. Mỗi lần bấm Tiếp tục sẽ mở thêm một công đoạn. Dữ liệu dùng ở đây là câu gõ dở “Chào bạn, hôm nay thời tiết”, lúc này model đang cố đoán từ tiếp theo.
Đầu vào của lượt forward pass này
Model nhận vào tất cả token đã có cho tới lúc này: vừa là câu hỏi của bạn, vừa là các token mà chính nó vừa sinh ra.
Vì sao cửa sổ ngữ cảnh (context window) của model lại có giới hạn, không thể vô hạn?
Con số thật
- Mỗi lượt lan truyền thuận thực hiện khoảng 2N phép nhân-cộng với N là số tham số phi-embedding [2]
- KV Cache giúp lượt lan truyền cho token mới chỉ cần xử lý 1 token thay vì toàn bộ chuỗi [2]
- Kiến trúc Transformer gốc cho phép song song hoá hoàn toàn trên GPU, khác hẳn mạng hồi quy tuần tự trước đó [3]
- Một câu trả lời trung bình 200 từ cần khoảng 250 – 300 lượt lan truyền thuận liên tiếp [4]
- Mỗi token ChatGPT gõ ra là một lượt lan truyền thuận xuyên qua pipeline: tokenize → embed → transformer → softmax → sample.
- Nhiệt độ (temperature) điều chỉnh bước sampling. Thấp thì chọn chắc, cao thì dám chọn token hiếm.
- KV Cache và song song hoá GPU là lý do một lượt lan truyền qua hàng trăm tỉ tham số kết thúc trong khoảng 20 mili-giây.
Nếu không có Lan truyền thuận, app sẽ ra sao?
Nếu không có lan truyền thuận, tức là không có cơ chế đưa dữ liệu có hệ thống qua các tầng, mạng nơ-ron sẽ không biết biến đầu vào thành đầu ra. Không có lan truyền thuận, không có ChatGPT.
Nếu có lan truyền thuận nhưng không có KV Cache và GPU song song hoá, mỗi token mới sẽ phải tính lại từ đầu toàn bộ chuỗi. Một câu trả lời 200 token sẽ chậm gấp hàng trăm lần. Thay vì vài giây, bạn phải chờ vài phút. Trải nghiệm chat thời gian thực sẽ biến mất.
Mặt trái của tốc độ
Tốc độ sinh token nhanh tới mức người dùng dễ tin tưởng quá. Model đôi khi “bốc thăm” trúng một token ít phổ biến và rẽ cả câu trả lời sang hướng sai. Đó là nguyên nhân gốc của hiện tượng ảo giác (hallucination). Nhanh không đồng nghĩa đúng.