Mình nén một tấm ảnh xuống bốn con số, rồi hỏi chúng đã giữ lại được gì
Latent space không giữ cái bạn cho là quan trọng. Nó giữ cái mà hàm mất mát bắt nó giữ. Một bài có công thức, có thí nghiệm chạy được, và vài con số 2026 khó chịu.
Công thức, sơ đồ, và một thí nghiệm nhỏ bạn chạy lại được trong ba phút
Mình dựng một bộ dữ liệu đồ chơi để tự kiểm tra một thứ mình tưởng đã hiểu.
Mỗi mẫu là một ảnh 16x16, trong đó có đúng một vệt sáng hình tròn mờ dần ra rìa. Mình sinh nó ra từ bốn con số: vệt sáng nằm ở đâu theo chiều ngang, nằm ở đâu theo chiều dọc, to cỡ nào, và sáng cỡ nào. Bốn số đó là toàn bộ sự thật về tấm ảnh. Ảnh có 256 pixel, nhưng số bậc tự do thật sự chỉ là bốn.
Rồi mình train một autoencoder ép 256 pixel đó qua một chỗ hẹp bốn chiều, và bắt nó dựng lại ảnh ban đầu. Nếu mọi thứ diễn ra như sách vở, bốn con số trong chỗ hẹp phải tương ứng với bốn yếu tố kia.
Sau khi train xong, mình làm một việc mà lẽ ra ai cũng nên làm: lấy bốn con số đó ra và hỏi từng câu một. Từ bốn số này, hồi quy tuyến tính đoán lại được vị trí ngang không? Được, \(R^2=0{,}96\). Vị trí dọc? \(0{,}96\). Kích thước? \(0{,}83\).
Độ sáng? \(0{,}19\).
Mình ngồi nhìn con số cuối khá lâu, và mình đã có sẵn một lời giải thích rất gọn cho nó. Trong hàm mất mát bình phương, dịch vệt sáng lệch vài pixel gây sai số lớn hơn nhiều so với làm nó nhạt đi một chút, nên model ưu tiên vị trí và hy sinh độ sáng. Latent space giữ cái mà loss bắt nó giữ. Câu chuyện khép lại đẹp đẽ.
Rồi mình đổi cách hỏi. Vẫn bốn con số đó, không train lại gì cả, chỉ thay hồi quy tuyến tính bằng một bộ đoán phi tuyến tầm thường: tìm vài điểm gần nhất trong không gian latent rồi lấy trung bình độ sáng của chúng.
\(R^2 = 0{,}89\).
Thông tin về độ sáng nằm nguyên trong đó, gần như đầy đủ. Nó chỉ không nằm dọc theo một đường thẳng. Cái mà mình vừa suýt viết thành một kết luận về model hoá ra là một kết luận về cái thước mình dùng để đo model.
Đó là lý do bài này dài hơn dự định. Câu hỏi "latent space giữ thông tin gì" nghe như một câu hỏi, nhưng thật ra là ba câu hỏi chồng lên nhau, và trộn chúng vào nhau là cách nhanh nhất để rút ra một kết luận sai mà vẫn thấy tự tin.

Ba câu hỏi này thường được trả lời chung bằng một câu "latent space mã hoá ngữ nghĩa". Tách ra thì mỗi câu có một cách đo riêng, và câu thứ ba phụ thuộc hoàn toàn vào câu thứ hai.
Chỗ hẹp, và vì sao nó hoạt động
Autoencoder là hai hàm nối đuôi nhau. Encoder \(f_\theta:\mathbb{R}^D\to\mathbb{R}^d\) ép dữ liệu xuống ít chiều, decoder \(g_\phi:\mathbb{R}^d\to\mathbb{R}^D\) dựng lại, và bạn phạt nó theo khoảng cách giữa đầu vào với bản dựng lại:
\[z=f_\theta(x),\qquad \hat{x}=g_\phi(z),\qquad \mathcal{L}(\theta,\phi)=\mathbb{E}_{x\sim p_{\text{data}}}\big\|x-g_\phi(f_\theta(x))\big\|_2^2\]

Toàn bộ ý tưởng nằm ở ô đỏ. Nếu \(d \ge D\) thì mạng chỉ cần học hàm đồng nhất và không học được gì cả. Sức ép chỉ xuất hiện khi đường đi bắt buộc phải qua chỗ hẹp hơn dữ liệu.
Chỗ này có một kết quả cổ điển mà mình nghĩ ai làm việc với latent space cũng nên biết, vì nó nói rõ autoencoder tự nó không phải phép màu. Nếu bạn cho encoder và decoder đều tuyến tính, \(f(x)=Ax\) và \(g(z)=Bz\), thì Baldi và Hornik chứng minh từ năm 1989 rằng mặt lỗi không có cực tiểu địa phương nào ngoài cực tiểu toàn cục, và tại mọi cực tiểu toàn cục thì ánh xạ hợp thành \(BA\) đúng bằng phép chiếu trực giao lên không gian con sinh bởi \(d\) vector riêng đầu tiên của ma trận hiệp phương sai [1].
Nói gọn: autoencoder tuyến tính chính là PCA. Một kỹ thuật từ năm 1901. Nếu bạn bỏ hàm phi tuyến đi, cái "không gian tiềm ẩn" của bạn không có gì mới hơn thứ mà nhà thống kê đã dùng suốt một thế kỷ.
Có một chi tiết hay bị nói sai ở đây, và nói sai theo hướng có lợi cho autoencoder: nó span cùng một không gian con với PCA, nhưng nó không khôi phục từng trục chính. Nghiệm chỉ xác định sai khác một ma trận khả nghịch bất kỳ \(C \in GL(d)\), vì cặp \((CA, BC^{-1})\) cho ra đúng cùng một ánh xạ. Các cột của \(B\) nói chung không trực giao và không được sắp theo phương sai giảm dần. Đây là lần đầu tiên trong bài, nhưng không phải lần cuối, ta gặp cùng một hiện tượng: cái được xác định là không gian con, không phải hệ trục trong đó.
Vậy phi tuyến mua được gì? Mình đo thử. Cùng bộ dữ liệu vệt sáng, mình quét số chiều của chỗ hẹp từ 1 tới 8, mỗi lần train lại từ đầu, và so với PCA cùng số chiều.

Điểm gãy nằm đúng ở 4, tức đúng số bậc tự do mà mình dùng để sinh dữ liệu. Từ 3 chiều lên 4 chiều, sai số giảm tám lần; từ 4 lên 5 thì gần như không đổi. Và ở đúng chỗ đó, autoencoder phi tuyến sai ít hơn PCA sáu mươi mốt lần, vì PCA buộc phải trải một mặt cong bằng một mặt phẳng.
Hai điều đọc được từ hình này. Thứ nhất, cái khuỷu tay nằm đúng chỗ nó phải nằm. Bạn không cần biết trước dữ liệu có bao nhiêu bậc tự do, bạn quét và nhìn chỗ đường cong gãy. Đó là một cách ước lượng số chiều nội tại của dữ liệu, và nó liên quan trực tiếp tới giả thuyết đa tạp: dữ liệu thật tuy nằm trong không gian rất nhiều chiều nhưng thực sự chỉ trải trên một mặt cong ít chiều hơn nhiều.

Cuộn giấy này sống trong không gian ba chiều nhưng chỉ có hai bậc tự do. Việc của encoder là tìm phép trải phẳng đó. PCA không làm được vì phép trải này cong; muốn duỗi nó thẳng thì cần hàm phi tuyến.
Con số cho dữ liệu thật đáng nhớ hơn nhiều. Pope và cộng sự đo số chiều nội tại bằng ước lượng hợp lý cực đại và ra khoảng 26 tới 43 cho ImageNet, trong khi một ảnh 224x224x3 có 150.528 chiều [2]. MNIST rơi vào khoảng 7 tới 13. Phát hiện thứ hai của họ đáng giá hơn phát hiện thứ nhất: chính số chiều nội tại, chứ không phải số chiều ambient, mới là thứ điều khiển việc cần bao nhiêu mẫu để học.
Thứ hai, và đây là chỗ trả lời cho câu "nén mạnh thì tốt hơn": đường cong phẳng ra sau điểm gãy. Nén thêm nữa không mua thêm gì, và nén quá thì mất thông tin thật. Chuyện này không chỉ đúng với đồ chơi. Chính paper Latent Diffusion gọi tầng autoencoder của họ là bộ nén tri giác chỉ loại bỏ chi tiết mắt không nhìn thấy, và ghi rõ rằng nén không gian quá tay làm giảm chất lượng [3]. Nén không phải cái núm cứ vặn to là thông minh ra.
Câu hỏi một: nó giữ lại được gì
Đây là câu hỏi duy nhất trong ba câu có cách đo thẳng thừng. Bạn lấy latent \(z\) ra, rồi thử đoán ngược lại từng yếu tố bạn quan tâm. Nếu đoán được thì thông tin còn trong đó. Nếu không đoán được thì hoặc nó mất rồi, hoặc nó nằm ở dạng mà bộ đoán của bạn không với tới.
Sự phân biệt "hoặc" đó quan trọng hơn vẻ ngoài của nó rất nhiều. Mình chạy hai loại probe trên cùng một latent: một cái tuyến tính, tức chỉ được phép lấy tổ hợp tuyến tính của bốn số rồi cộng hằng số; một cái phi tuyến, cụ thể là lấy trung bình của các điểm láng giềng gần nhất trong không gian latent.

Hàng dưới cùng là thứ khiến bốn hàng trên có nghĩa: probe một biến nhiễu hoàn toàn không liên quan tới ảnh thì cả hai thước đều về 0. Và hàng đáng nhìn nhất là độ sáng: \(0{,}19\) với thước tuyến tính, \(0{,}89\) với thước phi tuyến, trên cùng một latent, cùng một model, cùng một lần train.
Ba điều rút ra.
Thứ nhất, khoảng cách giữa hai cột. Thông tin nằm trong latent nhưng không nằm ở dạng tuyến tính. Một probe tuyến tính trượt không có nghĩa là thông tin đã mất; nó chỉ có nghĩa là thông tin không được xếp dọc theo một đường thẳng. Đây chính xác là chỗ mà rất nhiều tuyên bố kiểu "model không biểu diễn khái niệm X" bị hớ: người ta đo bằng probe tuyến tính rồi kết luận về sự tồn tại.
Thứ hai, cột đối chứng. Mình cố tình probe một biến ngẫu nhiên hoàn toàn không liên quan tới ảnh, và \(R^2\) về quanh không hoặc âm. Nghe thì hiển nhiên, nhưng cái baseline hiển nhiên này là thứ mà cả một nhánh nghiên cứu 2026 sẽ dùng để đánh sập một công cụ đang được cả ngành tin dùng, ở phần sau của bài.
Thứ ba, quay lại chuyện độ sáng ở đầu bài, giờ đã đủ số để nói cho đúng. Cả bốn yếu tố đều được giữ lại, đó là điều probe kNN cho thấy. Nhưng chúng không được giữ theo cùng một kiểu: vị trí nằm sẵn dọc theo các hướng thẳng, còn độ sáng thì bị cuốn vào một dạng cong mà chỉ bộ đoán phi tuyến mới lấy ra được.
Và chuyện đó không ngẫu nhiên. Trong hàm mất mát bình phương, dịch vệt sáng lệch vài pixel gây sai số lớn hơn nhiều so với làm nó nhạt đi một chút, nên vị trí là thứ model phải mã hoá cho thật rõ ràng, còn độ sáng thì mã hoá kiểu gì cũng được miễn là dựng lại được. Hàm mất mát không chỉ quyết định giữ gì. Nó quyết định luôn cái gì được đặt ở chỗ dễ với tới và cái gì bị nhét vào góc.
Đây là chỗ mình nghĩ đáng nhớ nhất của cả phần này, vì nó áp thẳng lên mọi tuyên bố dạng "model không biểu diễn khái niệm X": một hướng thẳng chỉ tìm thấy thứ đã được xếp thẳng.
Nhưng nếu câu hỏi là "nó giữ được bao nhiêu nội dung?"
Ở trên mình hỏi latent có giữ được vài yếu tố mình quan tâm không. Có một cách hỏi khác, phũ hơn: từ latent, dựng lại nguyên văn dữ liệu gốc được tới đâu?
Với embedding văn bản, câu trả lời không dễ chịu chút nào.
Từ vector embedding của một câu, khôi phục lại được nguyên văn câu đó trong phần lớn trường hợp
https://arxiv.org/abs/2310.06816
Morris và cộng sự, EMNLP 2023. Với văn bản 32 token và embedding GTR-base, phương pháp vec2text đạt BLEU 97,3, token F1 99, và khôi phục chính xác từng chữ 92,0% số trường hợp.
Trên ghi chú lâm sàng MIMIC-III: khôi phục đúng 94,2% tên và 95,3% họ của bệnh nhân.
Cơ chế: model đoán một câu, tự embed lại câu mình vừa đoán, so với embedding đích, rồi sửa. Lặp lại nhiều vòng.

Điểm đáng chú ý về mặt kỹ thuật là cơ chế lặp. Đoán một phát thì kém; nhưng nếu cho model tự embed phỏng đoán của mình rồi so với đích và sửa dần, độ chính xác nhảy lên hơn chín mươi phần trăm. Embedding không phải cái băm một chiều. Nó là mã hoá có mất mát nhưng đảo ngược được, và cái mất mát đó nhỏ hơn nhiều so với trực giác của phần lớn người đang lưu embedding vào cơ sở dữ liệu.
Phản xạ tự nhiên lúc này là: "không sao, embedding của mình do model riêng sinh ra, ai lấy được vector cũng không biết giải mã bằng gì." Đó chính xác là chỗ mà một kết quả 2025 bước vào.
Dịch được embedding từ không gian của model này sang model khác mà không cần một cặp dữ liệu tương ứng nào
https://arxiv.org/abs/2505.12540
vec2vec, NeurIPS 2025. Phát biểu Strong Platonic Representation Hypothesis, nguyên văn: "neural networks trained with the same objective and modality, but with different data and model architectures, converge to a universal latent space such that a translation between their respective representations can be learned without any pairwise correspondence."
Cosine similarity đạt tới 0,92, khớp hoàn hảo 8.000 embedding đã bị xáo trộn, mean rank thấp tới 1,0 so với baseline ngẫu nhiên khoảng 4.096. Không cần dữ liệu ghép cặp, không cần truy cập encoder.
https://arxiv.org/abs/2510.02348 mini-vec2vec cho thấy phép căn chỉnh đó thực chất chỉ cần một biến đổi tuyến tính, rẻ hơn nhiều bậc mà kết quả ngang hoặc hơn.

Chỗ đáng chú ý là chữ "conjecture". Đây là giả thuyết mà nhóm tác giả tự đặt ra để biện minh cho việc thử, không phải kết quả họ chứng minh được. Cái được chứng minh là phép dịch chạy thật.
Hiện tượng nền dưới chuyện này đã có tên từ 2024: giả thuyết rằng model càng lớn thì biểu diễn càng hội tụ về cùng một mô hình thống kê của thực tại, bất kể kiến trúc hay loại dữ liệu [4]. Phiên bản mạnh của nó là thứ vec2vec dựa vào, và có một hệ quả gọn tới mức khó tin: nếu hai không gian chỉ khác nhau một phép biến đổi tuyến tính thì cái gọi là "latent space riêng của model tôi" không riêng tới mức bạn tưởng [5]. Năm 2026, một nhóm có chung tác giả với vec2vec đem đúng câu hỏi đó sang dữ liệu fMRI và báo cáo rằng biểu diễn trong não của những người khác nhau cũng dịch được cho nhau bằng phép quay trực giao, không cần mẫu ghép cặp [6].
Ghép hai kết quả lại thì ra một chuỗi hoàn chỉnh, và cả hai đầu chuỗi đều có Vitaly Shmatikov cùng John Morris trong danh sách tác giả. Kẻ có được một dump vector từ vector database, không biết encoder nào sinh ra chúng, dùng vec2vec dịch sang không gian của một encoder mình có, rồi dùng vec2text đảo ngược về chữ [7] [8].

Không chặng nào trong ba chặng này cần bạn biết encoder gốc, và không chặng nào cần dữ liệu ghép cặp. Chỗ duy nhất kẻ tấn công phải có là chính đống vector, thứ mà nhiều hệ thống coi là an toàn nên đem lưu ở nơi lỏng hơn hẳn so với chỗ cất văn bản gốc.
Nên nếu ai đó nói với bạn rằng lưu embedding thay vì lưu văn bản gốc là một biện pháp ẩn danh hoá, người đó đang nhầm, và cái nhầm đó có thể phải khai báo với cơ quan bảo vệ dữ liệu. Embedding là dữ liệu cá nhân được viết bằng một bảng chữ cái khác, mà bảng chữ cái đó thì học lại được.
Chuyện hội tụ về một hình học chung nghe quá đẹp để là thật, và nếu nó không thật thì cả chuỗi tấn công kia sụp
Đây là phản biện đúng chỗ, và có một paper 2026 làm thẳng việc đó. Gröger và cộng sự chỉ ra rằng các thước đo tương đồng biểu diễn bị nhiễu một cách hệ thống bởi quy mô mạng: cứ tăng độ sâu hoặc độ rộng là điểm tương đồng tự tăng, không cần có hội tụ thật nào cả. Sau khi hiệu chỉnh bằng khung null-calibration hoán vị, phần lớn "hội tụ toàn cục" mà các thước đo phổ toàn cục báo cáo biến mất; thứ sống sót là quan hệ láng giềng cục bộ [9].
Họ đề xuất đổi tên giả thuyết thành Aristotelian thay vì Platonic, và mình nghĩ cái tên đó chính xác hơn thật.
Nhưng để ý chuyện này không cứu được ai: retrieval, matching và dịch embedding chỉ cần cấu trúc láng giềng cục bộ. Đúng cái phần sống sót sau hiệu chỉnh lại đúng là phần đủ để vec2vec chạy. Phản biện này hạ thấp tuyên bố triết học về sự hội tụ, và không hạ thấp chút nào rủi ro thực tế. Nếu bạn đang lưu embedding của dữ liệu nhạy cảm, kết quả 2026 này không cho bạn ngủ ngon hơn.
Câu hỏi hai: thông tin đó được xếp theo hình gì
Giờ tới phần mà mình nghĩ là bị hiểu sai nhiều nhất, và cũng là phần quyết định mọi thứ ở câu hỏi thứ ba.
Ép latent có hình: VAE và cái giá của nó
Autoencoder thường không hứa hẹn gì về hình dạng của latent space. Nó chỉ hứa dựng lại được. Hệ quả là giữa hai điểm hợp lệ có thể là một vùng chết: bạn lấy một điểm ở giữa, giải mã ra, và nhận về rác. Muốn sinh dữ liệu mới bằng cách bốc một điểm ngẫu nhiên rồi giải mã, bạn cần latent space phủ kín và trơn. Đó là việc của VAE.
VAE đặt một prior \(p(z)=\mathcal{N}(0,I)\) lên latent, và thay vì cho encoder trả về một điểm, nó cho encoder trả về một phân phối \(q_\phi(z\mid x)\). Điểm đẹp của cách đặt vấn đề này là ta có một đẳng thức chính xác, không phải xấp xỉ:
\[\log p_\theta(x)=\underbrace{\mathbb{E}_{q_\phi(z\mid x)}\!\left[\log\frac{p_\theta(x,z)}{q_\phi(z\mid x)}\right]}_{\text{ELBO}}\;+\;D_{\mathrm{KL}}\big(q_\phi(z\mid x)\,\|\,p_\theta(z\mid x)\big)\]
Vì KL luôn không âm, ELBO là cận dưới của log-likelihood, và khoảng hở đúng bằng KL giữa posterior xấp xỉ với posterior thật. Viết lại dưới dạng dùng để train:
\[\mathcal{L}=\underbrace{\mathbb{E}_{q_\phi(z\mid x)}\big[\log p_\theta(x\mid z)\big]}_{\text{dựng lại}}\;-\;\underbrace{D_{\mathrm{KL}}\big(q_\phi(z\mid x)\,\|\,p(z)\big)}_{\text{ép về prior}}\]
Số hạng thứ hai có dạng đóng khi \(q\) là Gauss chéo, nên tính được thẳng:
\[D_{\mathrm{KL}}\big(\mathcal{N}(\mu,\mathrm{diag}(\sigma^2))\,\|\,\mathcal{N}(0,I_d)\big)=\frac{1}{2}\sum_{j=1}^{d}\Big(\mu_j^2+\sigma_j^2-1-\log\sigma_j^2\Big)\]
Còn chỗ bí về mặt kỹ thuật, là làm sao lấy gradient qua một phép lấy mẫu ngẫu nhiên, được gỡ bằng một mẹo viết lại: đẩy tính ngẫu nhiên ra khỏi đường đi của gradient [10].
\[z=\mu_\phi(x)+\sigma_\phi(x)\odot\epsilon,\qquad \epsilon\sim\mathcal{N}(0,I_d)\]

Toàn bộ VAE là hai lực kéo ngược nhau buộc vào cùng một chỗ hẹp. Bỏ KL đi thì thành autoencoder thường và latent lỗ chỗ. Tăng KL quá tay thì latent trơn tuyệt đối và rỗng tuếch.
Chính chỗ "hai lực kéo ngược" đó dẫn tới điều mình nghĩ là hiểu biết quan trọng nhất về VAE, và nó đến từ một bài có tựa rất thẳng thắn là Fixing a Broken ELBO. Đặt \(D\) là distortion, tức phần dựng lại, và \(R\) là rate, tức phần KL, thì
\[-\text{ELBO}=D+R\]
ELBO chỉ ràng buộc tổng của hai số đó. Vô số cặp \((D,R)\) khác nhau cho ra cùng một giá trị ELBO [11]. Nghĩa là hai model có ELBO y hệt nhau có thể ở hai thái cực: một cái latent chứa gần như toàn bộ thông tin về dữ liệu, cái kia latent rỗng hoàn toàn.
Trường hợp thứ hai có tên riêng là posterior collapse, và nó không phải lỗi tối ưu hoá. Khi decoder đủ mạnh để tự mô hình hoá \(p(x)\) mà không cần \(z\), số hạng KL trở thành hình phạt thuần tuý không đổi lại được gì, nên nghiệm tối ưu là đẩy \(q_\phi(z_j\mid x)\) về đúng prior với mọi \(x\). Lúc đó \(I_q(X;Z_j)=0\): latent không mang một bit thông tin nào về dữ liệu, và ELBO vẫn đẹp. Đây là góc \(R=0\) của đường cong rate-distortion, một nghiệm hợp lệ chứ không phải một cái bug.
Nên nếu bạn chỉ nhìn loss để đánh giá chất lượng latent space, bạn có thể đang nhìn vào một con số không nói gì về latent space cả. Cách duy nhất để biết là đo trực tiếp, đúng như phần probe ở trên.
Hệ VQ-VAE tránh được chuyện này theo một đường vòng khá gọn: nó lượng tử hoá latent về một codebook hữu hạn, và với posterior xác định cùng prior đều thì \(D_{\mathrm{KL}}=\log K\), một hằng số, nên nó biến mất khỏi gradient [12]. Không có sức ép KL thì không có collapse. Cái giá là gradient không chảy qua phép \(\arg\min\) được, phải nối tắt bằng straight-through estimator, tức copy thẳng gradient từ đầu vào decoder sang đầu ra encoder.
Hình cầu rỗng ruột
Bắt đầu bằng một sự thật hình học mà ai nghịch latent space cũng nên nhớ. Lấy \(z\sim\mathcal{N}(0,I_d)\), tức latent phân phối chuẩn chuẩn tắc trong \(d\) chiều. Khi đó \(\|z\|^2\sim\chi^2_d\), nên
\[\mathbb{E}\big[\|z\|^2\big]=d,\qquad \mathrm{Var}\big(\|z\|^2\big)=2d,\qquad \frac{\mathrm{sd}(\|z\|^2)}{\mathbb{E}[\|z\|^2]}=\sqrt{\frac{2}{d}}\ \xrightarrow[d\to\infty]{}\ 0\]
Độ dài trung bình tăng theo \(\sqrt{d}\) trong khi độ lệch chuẩn của độ dài tiến tới một hằng số. Chặt hơn, vì \(z\mapsto\|z\|\) là hàm 1-Lipschitz nên bất đẳng thức tập trung Gauss cho
\[\Pr\Big(\big|\,\|z\|-\mathbb{E}\|z\|\,\big|\ge t\Big)\ \le\ 2e^{-t^2/2}\]
Nghĩa là: trong nhiều chiều, gần như toàn bộ khối lượng xác suất của một phân phối chuẩn nằm trong một lớp vỏ cầu mỏng quanh bán kính \(\sqrt{d}\), chứ không nằm gần gốc toạ độ như hình dung hai chiều mách bảo. Gốc toạ độ, tức điểm có mật độ xác suất cao nhất, lại là nơi hầu như không có mẫu nào rơi vào.
Hệ quả thực tế xuất hiện ngay khi bạn nội suy. Lấy hai latent \(z_1,z_2\) độc lập rồi nối thẳng, \(z(t)=(1-t)z_1+tz_2\). Vì hai vector ngẫu nhiên trong nhiều chiều gần như luôn vuông góc nhau,
\[\mathbb{E}\big\|z(t)\big\|^2=\big((1-t)^2+t^2\big)\,d \quad\Longrightarrow\quad \big\|z(\tfrac12)\big\|\approx\frac{\sqrt{d}}{\sqrt{2}}\approx 0{,}707\sqrt{d}\]
Điểm giữa đường nối bị hụt khoảng \(0{,}29\sqrt{d}\) so với vỏ cầu, trong khi vỏ cầu chỉ dày cỡ hằng số. Với \(d=512\), đó là khoảng chín lần độ lệch chuẩn. Bạn vừa đưa cho decoder một điểm mà nó chưa từng thấy loại nào như thế trong suốt quá trình train, nên ảnh giữa đường bị nhạt, xám và mất tương phản. Đây là lý do thật của hiện tượng đó, không phải "model không hiểu khái niệm ở giữa".
Cách sửa là đi vòng theo cung cầu thay vì cắt ngang qua ruột, tức slerp [13]:
\[\mathrm{slerp}(z_1,z_2;t)=\frac{\sin\big((1-t)\Omega\big)}{\sin\Omega}\,z_1+\frac{\sin\big(t\Omega\big)}{\sin\Omega}\,z_2,\qquad \Omega=\arccos\frac{z_1^\top z_2}{\|z_1\|\,\|z_2\|}\]
Với \(\|z_1\|=\|z_2\|=r\), đặt \(a=(1-t)\Omega\) và \(b=t\Omega\), khai triển bình phương chuẩn cho ra \((\sin a\cos b+\cos a\sin b)^2=\sin^2(a+b)=\sin^2\Omega\), nên \(\|\mathrm{slerp}(t)\|=r\) với mọi \(t\). Đường nội suy nằm trọn trên mặt cầu.

Trái: đo trên 12.000 mẫu mỗi mức. Hệ số biến thiên của độ dài rơi từ \(0{,}52\) ở 2 chiều xuống \(0{,}089\) ở 64 chiều và \(0{,}011\) ở 4.096 chiều, trong khi độ dài trung bình bám sát \(\sqrt{d}\) tới ba chữ số. Phải: latent trong thí nghiệm của mình chỉ có 4 chiều nên hiệu ứng còn nhẹ, chuẩn tụt từ \(1{,}23\) xuống \(1{,}05\) ở giữa đường, khoảng 15 phần trăm. Ở 512 chiều thì mức tụt lý thuyết là 29 phần trăm, và đó là lúc ảnh giữa đường bắt đầu hỏng thấy rõ.
Một lưu ý thực hành để khỏi áp dụng máy móc: slerp đúng cho latent nhiễu phân phối đẳng hướng, tức là trường hợp của diffusion và rectified flow. Với latent lấy từ encoder của một VAE đã train thì phân phối không đẳng hướng, không căn giữa, và nối thẳng ở đó có cơ sở hơn nhiều.
Chồng chất: vì sao không có trục nào là một "trục" cả
Bây giờ tới câu hỏi cốt lõi cho việc can thiệp: các khái niệm được xếp vào latent theo kiểu nào? Hình dung ngây thơ là mỗi chiều một khái niệm. Chiều 1 là tuổi, chiều 2 là giới tính, và cứ thế.
Hình dung đó hấp dẫn tới mức có hẳn một dòng nghiên cứu đi ép nó thành sự thật. beta-VAE nhân số hạng KL với một hệ số \(\beta>1\) để siết mạnh hơn, với hy vọng sức ép đó buộc model xếp mỗi yếu tố sinh dữ liệu vào một toạ độ riêng [14]. Ý tưởng hợp lý, và nó có hiệu quả trên vài bộ dữ liệu đồ chơi.
Có hai lý do khiến hình dung đó vẫn sai, một lý do lý thuyết và một lý do thực nghiệm.
Lý do lý thuyết là một định lý bất khả thi. Locatello và cộng sự chứng minh rằng với \(d>1\) và prior có mật độ tích \(p(z)=\prod_i p(z_i)\), tồn tại một họ vô hạn các song ánh \(f\) sao cho \(f(z)\) có cùng phân phối biên với \(z\) nhưng mọi đạo hàm riêng \(\partial f_i/\partial u_j\) đều khác không hầu khắp nơi, tức là hai hệ toạ độ rối hoàn toàn vào nhau [15]. Vì hai mô hình sinh tương ứng cho ra cùng một phân phối \(p(x)\), mà thuật toán học không giám sát thì chỉ quan sát được \(x\), nên không có cách nào phân biệt đâu mới là phân rã "thật".
Cách dựng \(f\) đơn giản đến mức khó chịu: đưa từng toạ độ về chuẩn tắc qua CDF, quay bằng một ma trận trực giao có mọi phần tử khác không, rồi đưa ngược lại. Vì phân phối chuẩn đẳng hướng bất biến với phép quay nên phân phối được bảo toàn. Họ vô hạn chính là nhóm quay.
Nói cách khác: disentanglement không giám sát là bất khả thi nếu không có thiên kiến quy nạp, và đây là định lý chứ không phải quan sát thực nghiệm. Phần thực nghiệm của cùng bài báo, hơn 12.000 model, còn đưa ra một kết luận cay hơn cho người làm thực hành: random seed ảnh hưởng tới kết quả mạnh hơn việc chọn model nào.
Đây cũng đúng là chuyện đã gặp ở phần PCA: cái được xác định là không gian con, không phải hệ trục. Chỉ là lần này nó được phát biểu thành định lý.
Lý do thực nghiệm thì thú vị hơn, và mình dựng lại được nó bằng một thí nghiệm nhỏ. Ý tưởng là của Anthropic, họ gọi hiện tượng này là superposition, tạm dịch là chồng chất: nếu các feature thưa, tức mỗi mẫu chỉ kích hoạt vài cái trong rất nhiều feature khả dĩ, thì model có động cơ nhét nhiều feature hơn số chiều nó có, chấp nhận cho chúng chồng lấn lên nhau [16].
Mình train một model nén 20 feature vào đúng 5 chiều, ở các mức thưa khác nhau.

Khi mọi feature đều xuất hiện thường xuyên, model giữ đúng 5 trên 20, bằng đúng số chiều nó có, và vứt thẳng 15 cái còn lại. Khi feature thưa dần, nó cất được 16 trên 20 trong vẫn đúng 5 chiều đó. Cái giá là các hướng không còn trực giao: độ giao thoa trung bình giữa các cặp feature quanh \(0{,}34\).
Khi dữ liệu dày, model làm đúng thứ đại số tuyến tính cho phép: giữ đúng 5 feature quan trọng nhất, vứt phần còn lại. Khi dữ liệu thưa, nó nhồi nhiều hơn hẳn số chiều, bằng cách đặt các feature ở những hướng không trực giao. Cái giá phải trả là giao thoa: kích hoạt feature này thì feature kia cũng nhấp nháy theo một chút. Model chấp nhận cái giá đó vì xác suất hai feature cùng sáng một lúc rất thấp.
Kho năm kệ nhưng bán hai mươi mặt hàng
Đời thường
Bạn có một cái kho chỉ đủ chỗ cho năm kệ, mà cửa hàng thì bán hai mươi mặt hàng. Nếu ngày nào cũng phải có đủ cả hai mươi thứ trên quầy, bạn chịu thua: chỉ giữ được năm thứ bán chạy nhất, bỏ mười lăm thứ còn lại.
Nhưng nếu mỗi ngày khách chỉ hỏi một hai món, và món nào được hỏi thì gần như không bao giờ trùng ngày với món khác, bạn xếp chung nhiều mặt hàng vào một kệ được. Thỉnh thoảng có ngày hai món cùng được hỏi và bạn lấy nhầm. Hiếm thôi, và bạn chấp nhận đổi cái hiếm đó lấy chuyện bán được hai mươi món thay vì năm.
Kỹ thuật
Năm kệ là năm chiều của không gian biểu diễn. Hai mươi mặt hàng là hai mươi feature. "Khách chỉ hỏi một hai món mỗi ngày" chính là tính thưa: mỗi mẫu dữ liệu chỉ kích hoạt một nhúm nhỏ feature. Khi thưa, model đặt các feature ở những hướng không trực giao và cất được nhiều feature hơn số chiều nó có, đổi lại là nhiễu giao thoa khi hai feature vô tình cùng sáng.
Hệ quả
Nhìn vào một neuron rồi thấy nó phản ứng với ba thứ chẳng liên quan gì tới nhau, đó không phải model bị hỏng. Đó là cái kệ đang chứa ba mặt hàng, và nó chứa ba mặt hàng vì làm thế thì lời hơn. Mọi công cụ diễn giải hiện đại, kể cả sparse autoencoder ở phần sau, đều sinh ra để gỡ đúng cái kệ này.
Điều này giết chết hình dung "một chiều một khái niệm" một cách dứt khoát, và nó giết theo kiểu không cứu được: số khái niệm mà một model cất giữ lớn hơn số chiều của nó, nên kể cả khi bạn tìm được một hệ trục hoàn hảo thì vẫn không đủ trục để phát cho từng khái niệm một.
Câu hỏi ba: can thiệp vào được không
Nếu thông tin nằm trong latent, và nếu ta biết nó nằm theo hướng nào, thì về nguyên tắc ta sửa được. Đây là phần vui nhất, và cũng là phần nhiều ảo tưởng nhất.
Cách đơn giản nhất là đi dọc từng trục và xem chuyện gì xảy ra.

Cùng một ảnh gốc, mỗi hàng chỉ đổi một trong bốn số rồi giải mã lại. Model có tự tìm ra cấu trúc thật: \(z_1\) điều khiển kích thước, \(z_2\) và \(z_4\) điều khiển vị trí. Nhưng không trục nào sạch: đẩy \(z_2\) sang phải thì vệt sáng vừa dời chỗ vừa nhỏ lại. Và ở hai đầu mỗi hàng, ảnh bắt đầu rã thành nhiễu, vì đó là vùng latent mà decoder chưa từng gặp lúc train. Hàng \(z_4\) là ví dụ rõ nhất.
Muốn can thiệp có mục đích thì phải tự tìm hướng. Cách rẻ nhất: hồi quy tuyến tính từ latent ra yếu tố cần điều khiển, lấy vector hệ số làm hướng, rồi cộng vào latent với hệ số \(\alpha\). Đây đúng là công thức của activation steering trong LLM, chỉ khác quy mô.
Mình làm thế, rồi đo xem vệt sáng có dịch đúng bằng lượng mình yêu cầu không.

Trái: ở cường độ nhỏ, hướng tìm được hoạt động gần đúng như hứa hẹn. Yêu cầu dịch 6 ô thì chỉ nhận về 2,8 ô, chưa tới một nửa. Phải: tổng độ sáng, thứ mình không hề yêu cầu động tới, phình lên gấp rưỡi ở cùng cường độ đó. Cả hai đường đều không đối xứng, vì không có gì bắt latent space phải đối xứng cả.
Hai hiện tượng ở đây lặp lại gần như y nguyên khi người ta steer một model ngôn ngữ thật.
Thứ nhất là bão hoà. Đẩy nhẹ thì model nghe lời gần như tuyến tính. Đẩy mạnh thì nó ngày càng lì, vì bạn đã đi ra khỏi vùng latent mà decoder từng thấy lúc train. Hướng bạn tìm được chỉ là xấp xỉ tuyến tính cục bộ của một mặt cong; đi xa khỏi điểm khai triển thì xấp xỉ hết đúng.
Thứ hai là tác dụng phụ. Mình chỉ yêu cầu dịch ngang, nhưng tổng độ sáng của ảnh đi lạc theo. Không có gì trong cách dựng hướng đó ràng buộc rằng những thuộc tính khác phải giữ nguyên, và vì các feature chồng lấn lên nhau chứ không trực giao, chuyện đẩy một cái mà kéo theo cái khác là mặc định chứ không phải ngoại lệ.
Nếu bạn từng thấy một model bị steer mạnh rồi bắt đầu nói năng lảm nhảm, đó là cùng một hiện tượng với cái vệt sáng phình lên ở hình bên phải.
Phiên bản có thật của trò này thì đã chạy được vài năm. Anthropic kẹp một feature ứng với cầu Golden Gate lên mười lần giá trị kích hoạt tối đa của nó, và model bắt đầu tự nhận mình là cây cầu [17]. Cũng nhóm đó sau này trích ra các persona vector ứng với những tính cách như độc ác, nịnh bợ hay hay bịa, rồi dùng chúng để theo dõi tính cách model trôi đi lúc chạy thật [18]. Ở tầng công cụ bình dân, llama.cpp có sẵn ba cờ dòng lệnh cho control vector, kèm cả tham số chọn dải layer để áp. Còn về mặt hiệu năng, một hướng 2025 chuyển can thiệp từ activation sang thẳng KV cache, để chỉ phải làm một lần thay vì mỗi bước sinh token [19].
Bên phía sinh ảnh, cách tìm hướng ngữ nghĩa cũng đã đổi hẳn triết lý. Thời GAN, người ta chạy PCA trên không gian latent hoặc phân rã trị riêng của lớp affine đầu tiên, tức giả định các hướng đáng quan tâm thì ít và trực giao. Từ 2025, công cụ mặc định chuyển sang từ điển thưa quá đầy đủ, tức giả định ngược lại: có rất nhiều khái niệm, chúng chồng lấn nhau, và mỗi ảnh chỉ kích hoạt một nhúm [20]. Sự đổi ngôi đó là hệ quả trực tiếp của chuyện chồng chất mà mình vừa dựng lại ở trên.
Cái kính hiển vi cũng cần được kiểm tra
Đây là chỗ mà bài viết này lẽ ra đã kết thúc gọn ghẽ, nếu mình không kiểm cái công cụ mà mình vừa khen.
Sparse autoencoder là ý tưởng đẹp nhất trong ngành diễn giải model mấy năm qua, và nó đẹp vì nó tấn công đúng bài toán chồng chất. Nếu model nhồi nhiều khái niệm hơn số chiều bằng cách cho chúng chồng lấn, thì hãy học một từ điển rộng hơn số chiều cùng ràng buộc rằng mỗi mẫu chỉ kích hoạt vài phần tử, rồi hy vọng từng phần tử ứng với một khái niệm sạch. Anthropic scale ý tưởng này lên tới 34 triệu feature trên Claude 3 Sonnet [17].

Chỗ ngược đời làm nên ý tưởng: tầng giữa rộng hơn đầu vào, chứ không hẹp hơn như autoencoder thường. Nó không nén gì cả. Đánh đổi là ràng buộc chỉ vài vạch được sáng một lúc, và chính ràng buộc đó, chứ không phải kích thước, mới là thứ ép mỗi vạch phải mang một nghĩa riêng.
Mình thử làm đúng thế trên toy model chồng chất của chính mình, nơi mình biết trước 64 hướng feature thật vì tự tay dựng ra chúng. Train một sparse autoencoder với từ điển 128 phần tử trên activation 16 chiều, rồi đếm xem nó tìm lại được bao nhiêu hướng thật.
Và vì đã học được bài từ cột đối chứng ở phần probe, mình làm thêm hai việc. Một là so với một từ điển gồm toàn hướng ngẫu nhiên, không train gì cả. Hai là quét mức phạt thưa qua bảy giá trị, thay vì chọn một mức rồi báo cáo con số đẹp nhất.

Bảy điểm là bảy mức phạt thưa. Phạt quá mạnh, góc trái dưới, thì SAE gần như không kích hoạt gì và không tìm được gì. Nới dần ra thì cả hai trục cùng lên. Nhưng từ khoảng 78 phần trăm phương sai trở đi, trục dọc đứng yên ở 33 trong khi trục ngang vẫn bò lên tới 99,9.
Kết quả này có hai mặt và mình muốn nói cả hai, vì bỏ mặt nào đi cũng thành tuyên truyền.
Mặt bênh vực SAE thì rõ ràng và mình không định giảm nhẹ nó: từ điển ngẫu nhiên tìm lại được 0 trên 64 hướng thật, SAE tìm được 33. Cosine trung bình \(0{,}87\) so với \(0{,}64\) của ngẫu nhiên. Đây không phải hiệu ứng ảo do chiều cao chiều thấp; SAE thật sự học được cấu trúc mà một từ điển ngẫu nhiên không có. Ai bảo sparse autoencoder chỉ là ngẫu nhiên đội lốt thì trong thí nghiệm này, sai.
Mặt kia là hình dạng của đường cong. Ở mức phạt cho ra 95,6 phần trăm phương sai, tức dựng lại gần như hoàn hảo và số feature kích hoạt trung bình mỗi mẫu là \(1{,}39\) so với con số thật \(1{,}28\), tức gần đúng luôn cả độ thưa, nó vẫn chỉ tìm lại được 33 trên 64. Đúng một nửa. Và khi mình nới thêm để nó dựng lại tới 99,9 phần trăm, số hướng thật tìm được tụt xuống 29, vì lúc đó nó bắt đầu tiêu từ điển vào việc mô tả nhiễu.
Nói cách khác: trong một bài toán mà mình biết chắc có đúng 64 hướng, tự tay dựng ra chúng, biết luôn cả độ thưa, và đưa cho SAE một từ điển rộng gấp đôi số chiều, thì nó vẫn bỏ sót một nửa. Sai số dựng lại không báo cho bạn biết chuyện đó. Nếu mình chỉ nhìn con số 99,9 phần trăm, mình đã kết luận là xong việc.

Đây là file thô mà hai con số trên lấy ra từ đó, không cắt dòng nào. Nếu mình có ý cherry-pick thì chỗ để làm chuyện đó là ở đây, nên mình để nguyên cả bảy dòng.
Mình không phải người đầu tiên đâm vào chuyện này, và những người đâm trước thì đâm ở quy mô nghiêm túc hơn nhiều.
Trên dữ liệu tổng hợp biết trước đáp án, SAE dựng lại tín hiệu rất tốt nhưng tìm lại được rất ít feature thật, và baseline đơn giản thì ngang ngửa nó ở mọi tác vụ
https://arxiv.org/abs/2602.14111
Korznikov và cộng sự, tháng 2/2026, nguyên văn:
"On a synthetic setup with known ground-truth features, we demonstrate that SAEs recover only 9% of true features despite achieving 71% explained variance, showing that they fail at their core task even when reconstruction is strong."
Và phần so với baseline:
"we show that our baselines match fully-trained SAEs in interpretability (0.87 vs 0.90), sparse probing (0.69 vs 0.72), and causal editing (0.73 vs 0.72). Together, these results suggest that SAEs in their current state do not reliably decompose models' internal mechanisms."
https://arxiv.org/abs/2502.16681 2025-02-23 - Trước đó một năm, Kantamneni, Engels, Rajamanoharan, Tegmark và Neel Nanda (ICML 2025): "although SAEs occasionally perform better than baselines on individual datasets, we are unable to design ensemble methods combining SAEs with baselines that consistently outperform ensemble methods solely using baselines."

Chín phần trăm feature thật, với bảy mươi mốt phần trăm phương sai được giải thích [21]. Hai con số đó đứng cạnh nhau là toàn bộ vấn đề, và nó không phải vấn đề của riêng SAE. Dựng lại tốt không chứng minh phân rã đúng. Một mô hình có thể tái tạo tín hiệu gần như hoàn hảo bằng một hệ toạ độ hoàn toàn không phải hệ toạ độ mà tự nhiên đã dùng để sinh ra tín hiệu đó. Ta đã gặp đúng mệnh đề này ba lần trong bài: ở PCA, ở định lý Locatello, và giờ ở đây. Nó là cùng một sự thật mặc lại ba bộ quần áo.
Chuyện thú vị là ba phòng lab lớn phản ứng với khủng hoảng này theo ba hướng khác nhau, và mình nghĩ đó là chi tiết đáng nhớ nhất của cả giai đoạn 2025 tới 2026.
DeepMind hạ ưu tiên hướng SAE sau khi chính nhóm của Neel Nanda công bố kết quả âm tính [22]. OpenAI đi đường vòng qua kiến trúc: thay vì phân rã một model dày đặc đã train xong, họ train thẳng model thưa từ đầu, và báo cáo rằng ở cùng mức pretraining loss thì mạch tính toán nhỏ hơn khoảng mười sáu lần [23]. Còn Anthropic thì giữ SAE và sửa nó. Trong bản cập nhật tháng 6/2026, họ viết rằng SAE "have become a valuable tool for characterizing important safety behaviors in our models", đồng thời nêu thẳng hai chỗ đau: nó chỉ chạy trên một vị trí token nên một đoạn hội thoại ngắn cũng đẻ ra hàng triệu kích hoạt cần diễn giải, và rất nhiều feature thì "boring", chỉ nói về cú pháp chứ không nói gì về quyết định của model [24].
Nên câu tóm tắt đúng cho tình hình hiện nay không phải "SAE đã chết". Nó là: SAE hữu ích để phát hiện thứ bạn chưa biết mình cần tìm, và không đáng tin để kết luận rằng bạn đã tìm đúng.
2026: latent space đang phình ra, và có người đang bỏ nó
Trong lúc phía diễn giải bận nghi ngờ chính công cụ của mình, phía sinh ảnh đi một đường mà bốn năm trước ít ai đoán: latent space to dần lên.
Latent Diffusion 2022 nén ảnh xuống 4 kênh, tức tỉ lệ nén 48 lần. Rồi Stability chạy ablation cho SD3 và thấy tăng lên 16 kênh hạ reconstruction FID từ 2,41 xuống 1,06, nên họ chốt 16 [25]. FLUX.2 cuối 2025 dùng 32 kênh, và Black Forest Labs mô tả bài toán bằng một cái tên rất đúng: trilemma giữa học được, chất lượng, và nén [26].
Nghĩa là suốt bốn năm, sức ép chất lượng thắng sức ép nén, đều đặn. Cái "không gian tiềm ẩn" mà người ta hay mô tả như nơi cô đọng tinh tuý của dữ liệu thì trên thực tế ngày càng ít cô đọng đi.
Không phải ai cũng đi hướng đó. Qwen đi ngược lại: nén không gian mạnh hơn hẳn, hệ số 32 thay vì 8, rồi bù bằng chiều sâu kênh, 192 kênh, kèm ràng buộc căn chỉnh ngữ nghĩa với đặc trưng của DINOv2 để latent dễ học hơn cho tầng diffusion phía trên [27]. Và một nhóm khác thì rút phích luôn.
Có model 2026 bỏ hẳn VAE và chạy diffusion thẳng trên pixel, mà vẫn cạnh tranh được
https://arxiv.org/abs/2605.11061
HiDream-O1-Image, nguyên văn abstract: "The evolution of visual generative models has long been constrained by fragmented architectures relying on disjoint text encoders and external VAEs... a natively unified generative foundation model via pixel-space Diffusion Transformer... This native encoding paradigm eliminates the need for separate VAEs or disjoint pre-trained text encoders."
Nguyên văn về quy mô: "with only 8B parameters, HiDream-O1-Image (8B) achieves performance parity with or even surpasses established state-of-the-art models with significantly larger parameters (e.g., 27B Qwen-Image)", và kiến trúc này được scale lên trên 200 tỉ tham số.

Số kênh lấy từ file cấu hình công bố của từng model; tỉ lệ nén là tính ra từ số kênh và hệ số thu nhỏ không gian, theo công thức \(3f^2/C\). Qwen đứng riêng vì nó nén không gian mạnh gấp bốn lần phần còn lại rồi bù bằng chiều sâu kênh, nên con số 16 lần không so trực tiếp được với cột bên trái.
Ba lời giải khác nhau cho cùng một trilemma, cùng một năm [28]. Đó là dấu hiệu khá rõ rằng chưa ai biết câu trả lời đúng, và cũng là lời nhắc rằng latent space là một lựa chọn kỹ thuật có đánh đổi, không phải một chân lý kiến trúc.
Suy nghĩ chưa nói ra
Còn một chỗ nữa mà latent space đang là tâm điểm, và nó là chỗ mình thấy quan trọng nhất.
Ý tưởng đã có từ cuối 2024: thay vì bắt model viết ra từng chữ khi suy luận, hãy để nó suy luận thẳng trong không gian liên tục. Coconut lấy hidden state cuối cùng đưa ngược lại làm input embedding thay vì giải mã thành chữ, với lập luận rằng một trạng thái liên tục mã hoá được nhiều nhánh kế tiếp cùng lúc thay vì phải chốt sớm một nhánh [29]. Đầu 2025 có hướng lặp một khối recurrent để tăng độ sâu tính toán lúc chạy mà không cần sinh thêm token, với lập luận rằng có những kiểu suy luận khó diễn đạt bằng lời [30].

Hai bên cho ra cùng một loại đáp án. Khác biệt duy nhất là các bước ở giữa có tồn tại dưới dạng chữ hay không, và đó cũng đúng là toàn bộ thứ mà việc giám sát dựa vào.
Cả hai lập luận đều hợp lý. Và cả hai đều dẫn thẳng tới một vấn đề mà bốn mươi tác giả từ UK AISI, OpenAI, Google DeepMind, Anthropic, METR, Redwood và Mila cùng ký tên vào giữa 2025.
Nếu model suy luận trong không gian liên tục thì nó không cần nói ra suy nghĩ nào nữa, và ta mất luôn cơ hội giám sát mà chain-of-thought đang cho
https://arxiv.org/abs/2507.11473
Chain of Thought Monitorability, 40 tác giả. Về kiến trúc suy luận tiềm ẩn, nguyên văn:
"Such latent reasoning models might not need to verbalize any of their thoughts and would thus lose the safety advantages that CoT confers."
Và: "Models that reason in continuous latent spaces naturally limit our visibility into their thought processes, even absent any optimization pressure."
Cái chữ đáng chú ý nhất trong câu thứ hai là "even absent any optimization pressure" [31]. Ý họ là chuyện này không cần ai cố tình giấu gì cả. Chỉ cần đổi chỗ suy luận từ chữ sang vector, và khả năng đọc được suy nghĩ của model biến mất như một tác dụng phụ của kiến trúc.
Chuyện đó đáng lo tới đâu thì còn tuỳ, và có hai dữ kiện kéo ngược nhau.
Kéo về phía "bớt lo": một khảo sát 2026 lấy hai model suy luận tiềm ẩn tốt nhất hiện có ra mổ, và thấy hai chuyện. Một, token suy luận tiềm ẩn thường không cần thiết, model bỏ chúng đi vẫn cho ra cùng đáp án trên các bộ suy luận logic. Hai, khi chúng thật sự cần thiết thì vẫn giải mã ra được chuỗi lập luận chuẩn trong 65 tới 93 phần trăm số ca đúng [32]. Latent reasoning hiện tại, ít nhất, chưa phải hộp đen kín.
Kéo về phía "lo hơn": chuyện model không nói hết những gì nó dùng thì đã xảy ra rồi, ngay trong chain-of-thought bằng chữ mà ta đang đọc được. Anthropic dựng một kịch bản mà model có thể khai thác lỗ hổng chấm điểm để ăn điểm bằng đáp án sai, và model học được cách khai thác trong hơn 99 phần trăm số ca. Câu hỏi đặt ra là nó có nói ra chuyện đó trong phần suy luận không. Cùng nghiên cứu ấy còn thử huấn luyện Claude dựa trên kết quả để nó dùng chuỗi suy luận thực chất hơn: tính trung thực có tăng thật, rồi chững lại và không vượt quá 28 phần trăm trên một bài đo, 20 phần trăm trên bài còn lại [33].
Nói cách khác, phần chưa nói ra vốn đã tồn tại. Latent reasoning không tạo ra vấn đề đó, nó chỉ bỏ đi cái vỏ chữ khiến ta tưởng mình đang đọc được suy nghĩ.
Và đây là chỗ đóng vòng của cả bài, vì công trình mới nhất mình đọc được lại đi đúng theo hướng ngược lại: thay vì bỏ cuộc trước latent, đọc thẳng vào nó.
Anthropic tìm được một tập biểu diễn nhỏ đóng vai trò không gian làm việc của model, đọc ra được suy nghĩ chưa nói và sửa được nó
https://www.anthropic.com/research/global-workspace
J-space, tháng 7/2026. Nguyên văn về quy mô: "the J-space holds only a few dozen concepts at a time, and accounts for less than a tenth of the overall activity in Claude's internal processing."
Khi xoá hẳn J-space đi: "Without its J-space, Claude speaks fluently, classifies sentiment, answers multiple-choice questions, and pulls facts out of passages roughly as well as before. What it loses, though, are the tasks that require some higher-order thinking: multi-step reasoning drops to near zero."
Và về ý nghĩa của một pattern đang sáng: "when one of these patterns lights up, it doesn't mean the model is saying that word - just that the word is on its mind."

Chưa tới một phần mười hoạt động nội tại, vài chục khái niệm một lúc. Xoá đi thì model vẫn nói trôi chảy, vẫn phân loại cảm xúc, vẫn rút được sự kiện ra khỏi đoạn văn, nhưng suy luận nhiều bước rơi về gần bằng không [34].
Nếu điều đó đúng, thì cái phần latent space thật sự đáng quan tâm nhỏ hơn nhiều so với kích thước của model, và nó định vị được. Đây là câu trả lời cụ thể nhất tính tới hôm nay cho câu hỏi mở đầu bài, chỉ là ở một quy mô khác: latent giữ rất nhiều thứ, nhưng phần mà model thật sự dùng để suy nghĩ, phần mà can thiệp vào thì thay đổi được kết quả suy luận, chỉ là một lát rất mỏng.
Và có một nghịch lý gọn ghẽ trong bức tranh giữa 2026 mà mình chưa dứt ra được. Suy luận trong latent space, thứ khiến bốn mươi tác giả phải viết chung một bài cảnh báo, tính tới hôm nay vẫn chưa có model production nào chạy. Mọi model suy luận đang bán đều nghĩ bằng chữ mà bạn đọc được. Trong khi đó, công cụ để đọc và sửa thẳng latent state của một model production thì đã có rồi, và mã nguồn nằm công khai trên GitHub.
Cái ta sợ thì chưa tới. Cái ta cần để đối phó với nó thì tới trước. Đó là một trật tự dễ chịu bất thường, và mình không chắc nó sẽ giữ được lâu.
Còn lại gì
Nếu phải rút cả bài xuống một câu thì là câu đã nói ở đầu: latent space giữ cái mà hàm mất mát bắt nó giữ. Không hơn, không có thiện chí, không có ý niệm nào về việc cái gì đáng giữ.
Ba hệ quả mình nghĩ đáng mang đi.
Cái thước cũng là một giả thuyết. Mình suýt viết rằng model vứt bỏ độ sáng, và mình đã có sẵn một lời giải thích rất hợp lý cho kết luận đó. Thứ chặn mình lại không phải sự cẩn thận, mà là tình cờ đổi bộ đoán tuyến tính sang phi tuyến rồi thấy \(0{,}19\) biến thành \(0{,}89\). Mỗi lần bạn đọc một câu dạng "model không biểu diễn X", hãy hỏi người ta đã đo bằng cái gì.
Luôn có cột đối chứng. Cột nhiễu ngẫu nhiên trong hình probe, và từ điển ngẫu nhiên trong hình SAE, là hai thứ tầm thường nhất bài này. Chúng cũng chính là loại đối chứng mà cả một dòng nghiên cứu 2025 tới 2026 dùng để lật lại công cụ diễn giải đang thịnh hành nhất. Một con số không có baseline thì không phải bằng chứng, nó là một con số.
Dựng lại được không có nghĩa là hiểu đúng. PCA nói thế bằng đại số tuyến tính, Locatello nói thế bằng một định lý bất khả thi, và sparse autoencoder nói thế bằng chín phần trăm trên bảy mươi mốt phần trăm. Ba lần, cùng một sự thật: dựng lại tín hiệu đúng không chứng minh bạn đã tìm ra hệ toạ độ mà tự nhiên đã dùng.
Chỗ mình vẫn chưa yên, và nói ra vì nó là chỗ yếu nhất của bài: toàn bộ thí nghiệm ở đây chạy trên dữ liệu đồ chơi mà mình tự sinh ra, nên mình biết trước đáp án. Đó vừa là điểm mạnh, vì có đáp án mới đo được sai lệch, vừa là điểm yếu, vì dữ liệu thật không có ai phát sẵn đáp án. Cái khoảng cách giữa hai thứ đó chính là chỗ mà ngành diễn giải model đang mắc kẹt, và mình không nghĩ nó sẽ được gỡ bằng một công cụ nào sắp ra.
Nếu bạn định lưu embedding của người dùng ở đâu đó, hãy đọc lại phần vec2text trước. Đó là phần duy nhất trong bài này mà đọc chậm hai phút có thể tiết kiệm cho bạn một cuộc gọi rất khó chịu về sau.
Toàn bộ số liệu trong bài đến từ materials/autoencoder_lab.py, chạy bằng numpy thuần, không cần GPU, khoảng ba phút trên một máy tính bình thường. Dữ liệu thô nằm ở materials/results/ket-qua.json. Nếu bạn chạy lại và ra khác, mình muốn biết.
Phụ lục: Citations (34)
- Pierre Baldi, Kurt Hornik. Neural networks and principal component analysis: Learning from examples without local minima. Neural Networks 2(1):53-58. 1989. Autoencoder tuyến tính với MSE hội tụ về phép chiếu lên subspace của d thành phần chính đầu tiên; mặt lỗi không có cực tiểu địa phương ngoài cực tiểu toàn cục
- Phil Pope, Chen Zhu, Ahmed Abdelkader, Micah Goldblum, Tom Goldstein. The Intrinsic Dimension of Images and Its Impact on Learning. ICLR 2021. 2021-04-18. Ước lượng MLE số chiều nội tại: MNIST 7-13, CIFAR-10 13-26, ImageNet 26-43, trong khi số chiều ambient của ImageNet 224x224x3 là 150.528
- Robin Rombach, Andreas Blattmann, Dominik Lorenz, Patrick Esser, Björn Ommer. High-Resolution Image Synthesis with Latent Diffusion Models. CVPR 2022. 2021-12-20. Tầng autoencoder được chính tác giả gọi là nén tri giác nhẹ, chỉ loại bỏ chi tiết mắt không thấy; phần ngữ nghĩa do model diffusion phía trên làm
- Minyoung Huh, Brian Cheung, Tongzhou Wang, Phillip Isola. The Platonic Representation Hypothesis. ICML 2024. 2024-05-13. Giả thuyết: model càng lớn thì biểu diễn càng hội tụ về cùng một mô hình thống kê của thực tại, bất kể kiến trúc hay modality
- Guy Dar. mini-vec2vec: Scaling Universal Geometry Alignment with Linear Transformations. 2025-09-27. Phép căn chỉnh giữa hai không gian embedding hoá ra chỉ cần một biến đổi tuyến tính, rẻ hơn vec2vec nhiều bậc
- Marcos-Manchón, Jha, Fuentemilla. Platonic Representations in the Human Brain. 2026-05-19. Biểu diễn fMRI của từng người xấp xỉ đẳng cự với nhau, dịch được qua phép quay trực giao không cần mẫu ghép cặp
- Rishi Jha, Collin Zhang, Vitaly Shmatikov, John X. Morris. Harnessing the Universal Geometry of Embeddings. NeurIPS 2025. 2025-05-18. Dịch embedding giữa các model khác kiến trúc mà không cần một cặp tương ứng nào; cosine tới 0,92, khớp hoàn hảo 8.000 embedding đã xáo trộn
- John X. Morris, Volodymyr Kuleshov, Vitaly Shmatikov, Alexander M. Rush. Text Embeddings Reveal (Almost) As Much As Text. EMNLP 2023. 2023-10-10. Khôi phục nguyên văn 92% văn bản 32 token từ embedding GTR-base; trên ghi chú lâm sàng MIMIC khôi phục được 94,2% tên và 95,3% họ
- Gröger, Wen, Brbić. Revisiting the Platonic Representation Hypothesis: An Aristotelian View. 2026-02-16. Các thước đo tương đồng biểu diễn bị nhiễu bởi quy mô mạng; sau khi hiệu chỉnh bằng null-calibration thì hội tụ toàn cục biến mất, chỉ còn quan hệ láng giềng cục bộ
- Diederik P. Kingma, Max Welling. Auto-Encoding Variational Bayes. 2013-12-20. VAE gốc: ELBO và reparameterization trick
- Alexander A. Alemi, Ben Poole, Ian Fischer, Joshua V. Dillon, Rif A. Saurous, Kevin Murphy. Fixing a Broken ELBO. ICML 2018. 2017-11-01. Phân rã -ELBO = distortion + rate; ELBO chỉ ràng buộc tổng nên hai model cùng ELBO có thể có latent chất lượng hoàn toàn khác nhau
- Aaron van den Oord, Oriol Vinyals, Koray Kavukcuoglu. Neural Discrete Representation Learning. NeurIPS 2017. 2017-11-02. VQ-VAE: lượng tử hoá latent về codebook, straight-through estimator, không có posterior collapse vì KL là hằng số
- Tom White. Sampling Generative Networks. 2016-09-14. Đưa spherical linear interpolation (slerp) vào nội suy latent, vì nối thẳng đi xuyên vùng có xác suất thấp
- Irina Higgins, Loic Matthey, Arka Pal, Christopher Burgess, Xavier Glorot, Matthew Botvinick, Shakir Mohamed, Alexander Lerchner. beta-VAE: Learning Basic Visual Concepts with a Constrained Variational Framework. ICLR 2017. 2017. Thêm hệ số beta vào số hạng KL để ép latent tách bạch từng yếu tố
- Francesco Locatello, Stefan Bauer, Mario Lucic, Gunnar Rätsch, Sylvain Gelly, Bernhard Schölkopf, Olivier Bachem. Challenging Common Assumptions in the Unsupervised Learning of Disentangled Representations. ICML 2019 (Best Paper). 2018-11-29. Định lý bất khả thi: tồn tại họ vô hạn song ánh giữ nguyên phân phối biên nhưng làm mọi toạ độ rối vào nhau; hơn 12.000 model cho thấy random seed ảnh hưởng mạnh hơn lựa chọn model
- Nelson Elhage, Tristan Hume, Catherine Olsson và cộng sự. Toy Models of Superposition. Anthropic, Transformer Circuits Thread. 2022-09-14. Model cất được nhiều feature hơn số chiều nếu feature thưa, đổi lại là nhiễu giao thoa giữa các feature không trực giao
- Scaling Monosemanticity: Extracting Interpretable Features from Claude 3 Sonnet. Anthropic, Transformer Circuits Thread. 2024-05-21. Ba sparse autoencoder tới 34 triệu feature trên Claude 3 Sonnet; kẹp feature cầu Golden Gate lên 10 lần giá trị kích hoạt tối đa thì model tự nhận mình là cây cầu
- Runjin Chen, Andy Arditi, Henry Sleight, Owain Evans, Jack Lindsey. Persona Vectors: Monitoring and Controlling Character Traits in Language Models. Anthropic. 2025-07-29. Trích xuất hướng trong không gian activation ứng với các tính cách như độc ác, nịnh bợ, bịa đặt; dùng để theo dõi tính cách model lúc chạy thật
- Max Belitsky, Dawid Kopiczko, Michael Dorkenwald, M. Jehanzeb Mirza, Cees G. M. Snoek, Yuki M. Asano. KV Cache Steering for Controlling Frozen LLMs. 2025-07-11. Can thiệp một lần thẳng vào key-value cache thay vì phải chỉnh activation liên tục ở mỗi bước sinh
- Ronen Kamenetsky, Sara Dorfman, Daniel Garibi, Roni Paiss, Or Patashnik, Daniel Cohen-Or. SAEdit: Token-level control for continuous image editing via Sparse AutoEncoder. 2025-10-06. Dùng sparse autoencoder để tìm hướng ngữ nghĩa tách bạch trong text embedding, chỉnh ảnh mà không đụng vào quá trình diffusion
- Anton Korznikov, Andrey Galichin, Alexey Dontsov, Oleg Rogov, Ivan Oseledets, Elena Tutubalina. Sanity Checks for Sparse Autoencoders: Do SAEs Beat Random Baselines?. 2026-02-15. Trên dữ liệu tổng hợp biết trước feature thật, SAE chỉ tìm lại được 9% feature dù đạt 71% phương sai giải thích; baseline ngẫu nhiên ngang ngửa SAE ở cả ba tác vụ
- Subhash Kantamneni, Joshua Engels, Senthooran Rajamanoharan, Max Tegmark, Neel Nanda. Are Sparse Autoencoders Useful? A Case Study in Sparse Probing. ICML 2025. 2025-02-23. SAE thỉnh thoảng thắng baseline trên vài bộ dữ liệu lẻ, nhưng không có cách ghép nào cho kết quả vượt baseline một cách nhất quán
- Weight-sparse transformers have interpretable circuits. OpenAI. 2025-11-13. Thay vì phân rã activation của model dense đã train xong, train thẳng model thưa từ đầu; cùng mức pretraining loss thì circuit nhỏ hơn khoảng 16 lần
- Kevin Der, Harish Kamath, Ben Thompson. Circuits Updates - June 2026: Turn-Averaged Sparse Autoencoders. Anthropic, Transformer Circuits Thread. 2026-06. SAE vẫn là công cụ có giá trị để mô tả hành vi an toàn, nhưng gặp hai vấn đề: chỉ chạy trên một vị trí token, và nhiều feature chỉ nói về cú pháp
- Patrick Esser, Sumith Kulal, Andreas Blattmann và cộng sự. Scaling Rectified Flow Transformers for High-Resolution Image Synthesis. ICML 2024, Stability AI. 2024-03-05. Tăng số kênh latent từ 4 lên 16 hạ reconstruction FID từ 2,41 xuống 1,06; nguyên văn choose d=16
- FLUX.2: Frontier Visual Intelligence. Black Forest Labs. 2025-11-25. VAE mới 32 kênh latent, train lại latent space từ đầu; tác giả gọi bài toán là trilemma Learnability-Quality-Compression
- Qwen Team. Qwen-Image-VAE-2.0. 2026-05-13. Hướng ngược lại FLUX.2: nén không gian f32 với 192 kênh, căn chỉnh ngữ nghĩa với feature DINOv2 để latent dễ học hơn cho diffusion
- HiDream-O1-Image: A Natively Unified Image Generative Foundation Model with Pixel-level Unified Transformer. 2026-05-11. Bỏ hẳn VAE, diffusion thẳng trên pixel; bản 8B đạt ngang hoặc vượt Qwen-Image 27B, và scale được lên trên 200 tỉ tham số
- Shibo Hao, Sainbayar Sukhbaatar, DiJia Su, Xian Li, Zhiting Hu, Jason Weston, Yuandong Tian. Training Large Language Models to Reason in a Continuous Latent Space. Meta FAIR, COLM 2025. 2024-12-09. Coconut đưa hidden state cuối quay lại làm input embedding thay vì giải mã ra chữ; suy nghĩ liên tục mã hoá được nhiều nhánh kế tiếp cùng lúc
- Jonas Geiping, Sean McLeish, Neel Jain và cộng sự. Scaling up Test-Time Compute with Latent Reasoning: A Recurrent Depth Approach. 2025-02-07. Lặp một khối recurrent để tăng độ sâu lúc chạy thay vì sinh thêm token; nắm được kiểu suy luận khó diễn đạt bằng lời
- Tomek Korbak, Mikita Balesni, Elizabeth Barnes, Yoshua Bengio và 36 tác giả khác. Chain of Thought Monitorability: A New and Fragile Opportunity for AI Safety. UK AISI, Apollo Research, OpenAI, Google DeepMind, Anthropic, METR, Redwood Research, Mila. 2025-07-15. Model suy luận trong không gian liên tục có thể không cần nói ra suy nghĩ nào, và như vậy mất luôn lợi thế an toàn mà chain-of-thought đang cho
- Connor Dilgren, Sarah Wiegreffe. Are Latent Reasoning Models Easily Interpretable?. 2026-04-06. Token suy luận tiềm ẩn thường không cần thiết cho dự đoán; khi cần thì vẫn giải mã ra được chuỗi lập luận chuẩn 65-93% số ca đúng
- Reasoning Models Don't Always Say What They Think. Anthropic. 2025-04-03. Model học cách khai thác lỗ hổng chấm điểm trong hơn 99% số ca; huấn luyện theo kết quả làm tính trung thực của chuỗi suy luận tăng rồi chững, không vượt quá 28% trên một bài đo và 20% trên bài còn lại
- Wes Gurnee và cộng sự. Verbalizable Representations Form a Global Workspace in Language Models. Anthropic. 2026-07-06. J-space chứa vài chục khái niệm một lúc, chiếm chưa tới một phần mười hoạt động nội tại; xoá nó đi thì model vẫn nói trôi chảy nhưng suy luận nhiều bước rơi về gần bằng không