Đây là một chuỗi bài viết của mình dùng để (giới thiệu/nói về) Transformers (một trong những “phát minh” đỉnh nhất thời điểm hiện tại) đồng thời mình cũng muốn giới thiệu về Mechanistic Interpretability
1. Từ và nghĩa
(1) Làm sao để ta biết 2 từ, hay nhiều từ có nghĩa tương tự nhau (similar) ? (2) Nhưng mà tại sao ta lại cần biết nếu 2 từ tương tự nhau về nghĩa ?
Trả lời câu hỏi (2), một trong những ứng dụng chính của các mô hình ngôn ngữ là dịch máy, giả sử ta có câu “Nhà này to” và “Nhà này bự”, khi đưa qua tiếng anh, ta có thể dịch thành “This house is huge” và “This house is big”. Để có thể dịch được, mô hình phải biết được từ “House” và “Nhà” có nghĩa tương tự nhau, cũng như vậy, “To” và “Big” có nghĩa tương tự nhau, “Bự” và “Huge” có nghĩa tương tự nhau.
Quay lại câu hỏi (1), ý tưởng chính sẽ được dựa vào Distributional Hypothesis 1, giả thuyết này được đưa ra như sau:
Từ mà xuất hiện trong ngữ cảnh (context) tương tự nhau thường sẽ có nghĩa tương tự nhau.
Lại thêm câu hỏi, (3) ngữ cảnh hay context của từ là gì ? (4) Và thế nào là context tương tự nhau ?
Đầu tiên, ở (3), thì các context (ngữ cảnh) đơn giản là những từ xung quanh từ mà ta đang quan tâm (ta gọi từ ấy là target word), các từ nằm trong ngữ cảnh được gọi là context word của target word. Ví dụ ta có thể xem các context word là từ trước và từ sau, hoặc toàn bộ từ trong câu cùng với target word, hoặc toàn bộ từ trong cả một văn bản cùng với target word, bla bla.
Tiếp theo, để xét “context” tương tự nhau ở (4), ta cần một cách nào đó để so sánh giữa các context với nhau, đương nhiên là mô hình không thể như hu mần được, ta cần các con số. Dễ hiểu hơn, ta xem xét một ví dụ giữa hai từ to và bự, trong một văn bản nào đó, ta có các context word của 2 từ là [nhà,cây,học,ăn]
.
Thực hiện đếm số lần các context word xuất hiện chung với target word, ta sẽ có một vector như sau:
Có thể thấy giữa hai vector và rất giống nhau (ta có thể dùng cosine similarity để check lại cái này), vì vậy dựa theo distributional hypothesis, ta nói rằng to
và bự
có nghĩa tương tự nhau. Ta gọi các vector này là distributional vector. Ở các mô hình phức tạp hơn, các vector này không chỉ đơn giản là đếm mà là các high-dimensional (nhiều chiều) vector được tính thông qua một cơ chế “phức tạp” nào đó, ta gọi các vector này là word embedding. Vì vậy những từ có nghĩa tương tự nhau nếu có các vector embedding tương tự nhau.
2. Một chút về RNN
Một Recurrent Neural Networks (RNN) là bất kì mạng neural nào mà chứa vòng (tức là node output có thể là input của một node trước nó). Ta sẽ xét đến một class RNN gọi là Elman Networks

Có thể thấy ở hình trên, kiến trúc của mạng Elman đơn giản là rất nhiều mạng linear 2 copy với nhau và được stack theo chiều ngang, các mạng linear này sẽ được kết nối thông qua một vector gọi là , ví dụ giữa hai mạng ở bước thời gian 3 và thì được nối bởi vector . Hơn nữa, ta thấy là các clone (hay copy) của vector hidden state trong mạng linear tại bước thời gian , vì vậy nếu bỏ đi bước trung gian mà sử dụng thẳng ta sẽ có mạng RNN (như hình dưới).

Khác với các mạng trước đó (MLP, Linear Regression, etc.) thì RNN tận dụng được representation (biểu diễn) của các từ trước đó (hay nói cách khác chính là context của target word của tại hiện tại). Có thể thấy, RNN đang tận dụng distributional hypothesis một cách “gián tiếp”. Nói cách khác để hiểu nghĩa một từ ở time step , RNN phải có được representation (hay distributional vector) của context word trước đó.
Các representation của context word được encode vào một vector hidden state, ví dụ cho từ trước đó. Ta xem vector hidden state này như một memory. Memory này sẽ chứa toàn bộ thông tin trước đó và đóng góp vào thông tin ở bước thời gian hiện tại. Việc các hidden layer tích lũy thông tin từ các hidden layer trước dẫn đến ta có memory rất dài (đến cả đầu sequence).
Ví dụ như ta có chuỗi “bạn là con chó” thì tại bước thời gian , ta sẽ “đứng” ở từ “con” (bắt đầu từ ) và hidden state trước đó là sẽ chứa thông tin của toàn bộ chuỗi trước đó là “bạn là”. Nhưng thông tin sẽ được “chứa” như nào, hay nói cách khác, RNN nhét toàn bộ thông tin của chuỗi trước đó vào một vector hidden state như nào ?
Tại một bước thời gian , RNN sẽ thực hiện hai việc: (1) Tính toán hidden state hiện tại bằng thông tin của hidden state trước đó và input (2) Dùng hidden state hiện tại để đưa ra output của bước thời gian hiện tại. Công thức ở như phía dưới:
Trong đó và là các hàm kích hoạt (thường được sử dụng là hàm tanh
), , , là các trọng số của mạng linear tại từng bước thời gian . Riêng input của mạng Linear là hai vector gồm hidden state trước đó và input hiện tại. Ngoài ra các ma trận trọng số , , sẽ giống nhau ở toàn bộ mạng Linear ở từng bước thời gian , ta còn gọi là weight tying.
Tuy nhiên, việc phải encode quá nhiều thông tin vào một vector dẫn đến các từ ở các bước thời gian đầu sẽ dần bị thông tin của các từ ở bước thời gian sau “ghi đè” lên và dẫn đến mất mát thông tin. Hiện tượng này còn có tên là Vanishing Gradient, các bạn có thể tự tìm hiểu thêm.
3. Dịch máy và mô hình Encoder-Decoder
Có thể thấy, kiến trúc RNN mà ta tìm hiểu trước đó sẽ có số lượng output bằng với số lượng token input (ở đây ta xem một token = một từ), ngoài ra input tại bước thời gian sẽ tương ứng với output tại bước thời gian . Hoặc đôi khi ta có thể dùng output cuối cùng (ở bước thời gian cuối), ví dụ ở tác vụ text classification (phân loại văn bản), ta có thể dùng output ở hidden state cuối cùng và dựa vào output ấy để dự đoán nhãn của văn bản.
Nhưng với bài toán như Dịch máy (Machine Translation) thì sao?
- Vấn đề độ dài: Câu gốc và câu dịch hiếm khi có cùng độ dài.
- “This house is big.” (4 từ) → “Nhà này to.” (3 từ)
- Vấn đề trật tự từ: Trật tự từ trong hai ngôn ngữ có thể hoàn toàn khác nhau do đó một input ở bước thời gian sẽ không tương ứng với output ở bước thời gian .
- “I love red cats.” → “Tôi yêu những con mèo màu đỏ.” (Từ “red” được dịch thành “màu đỏ” và nằm ở cuối câu).
Do đó ta cần mô hình output không phụ thuộc vào độ dài hay bước thời gian ở input. Vì vậy ta dùng đến mô hình Encoder-Decoder hay còn được gọi là mô hình Sequence-to-Sequence (seq2seq).

Kiến trúc này bao gồm hai mạng RNN (thật ra có thể sử dụng các version khác của RNN như LSTM, GRU, …):
-
Encoder: Là một mạng RNN mà đọc toàn bộ câu input (ví dụ: “This house is big”) và nén toàn bộ ý nghĩa của nó vào một vector duy nhất ở bước cuối cùng.
-
Context Vector: Là vector ở bước cuối cùng của Encoder, vector này thường được gọi là context vector (vector ngữ cảnh), kí hiệu là . Vector này chính là “bản tóm tắt” của cả câu input. Ngoài ra vector “tóm tắt” câu input dựa vào hidden state ở từng bước thời gian, do đó ta có thể nói là một hàm của các hidden state của Encoder, tức là .
-
Decoder: Là một mạng RNN hoàn toàn khác so với Encoder, nhận context vector từ Encoder làm điểm khởi đầu (làm hidden state ban đầu ). Nhiệm vụ của nó là tạo ra câu output (“Nhà”, “này”, “to”) từng từ một, sử dụng “bản tóm tắt” đó làm kim chỉ nam.
Câu hỏi tiếp theo, ta chọn context vector như nào cho đủ tốt bởi vì chất lượng dịch hay performance của Decoder phụ thuộc hoàn toàn vào vector này.
- Đầu tiên ta có thể dùng hidden state cuối làm luôn, tức là . Điều này sẽ dẫn đến hiện tượng gọi là bottleneck, tức là hidden state cuối cùng bắt buộc phải encode được toàn bộ thông tin từ input text (hay từ encoder stage), ngoài ra thông tin duy nhất mà decoder biết về input text chính là hidden state cuối cùng.
- Ta có thể lấy trung bình các hidden state, tức là:
- Nhưng ở cách này, ta lại đang giả định rằng mỗi hidden state đều có tính quan trọng như nhau thông qua việc mỗi hidden state đều có trọng số đóng góp vào thông tin cuối cùng là .
- Vì vậy ta phải có một cách nào đó để có thể đánh giá được độ quan trọng (hay khả năng đóng góp) của từng hidden state vào input của Decoder. Ta sẽ dùng đến cơ chế Attention. Và thay vì chỉ duy nhất một context vector cuối cùng , ta sẽ có các context vector cho từng bước thời gian của Decoder và các context vector ấy sẽ biết cách để đánh giá độ quan trọng của các hidden state trên Decoder (hay nói cách khác, chú ý vào những từ input phù hợp nhất cho từ output).
Thay vì bắt Decoder phải dựa vào một bản tóm tắt nghèo nàn duy nhất, tại sao chúng ta không cho phép nó ‘nhìn lại’ toàn bộ câu input ở mỗi bước tạo từ. Tại sao không để nó tự chú ý (pay attention) vào những từ input phù hợp nhất cho từ output mà nó sắp tạo ra.
4. Attention, Attention, Attention
Ta sẽ có context vector (là context vector tại hidden state hay bước thời gian của Decoder), cơ chế này sẽ weight (đánh giá độ quan trọng/khả năng đóng góp) tất cả hidden state của Encoder cho context vector (hay nói cách khác Decoder sẽ chú ý bao nhiêu đến từng hidden state của Encoder):
Trong đó là hidden state của Decoder tại bước thời gian còn là toàn bộ hidden state của Encoder (gồm bước thời gian).
Đầu tiên, ta xác định độ liên quan (hay nói cách khác độ tương đồng) giữa hidden state trước đó của decoder với từng hidden state của encoder, gọi là , thông qua hàm score:
Dựa theo paper của Luong et al
Còn dựa theo bài báo của Bahdanau et al
trong đó là các ma trận tham số và là vector tham số.
Sau khi đã có score của từng hidden state của encoder với hidden state hiện tại của decoder, ta chuẩn hoá (normalized) score về khoảng thông qua hàm softmax (mục đích này là đưa vector score về thành một phân phối xác suất, lúc này mỗi hidden state của Encoder sẽ có giá trị từ đến , giá trị càng gần tức là hidden state ấy càng quan trọng đối với hidden state hiện tại của Decoder):
Cuối cùng, context vector của bước thời gian hiện tại chính là weighted average sum (trung bình cộng có trọng số) của các hidden state với trọng số là các softmax score được tính trước đó:
References
- Speech and Language Processing: An Introduction to Natural Language Processing, Computational Linguistics, and Speech Recognition with Language Models, Daniel Jurafsky and James H. Martin2025https://web.stanford.edu/~jurafsky/slp3/
- Mechanistic Interpretability for AI Safety -- A Review, Leonard Bereska and Efstratios Gavves2024https://arxiv.org/abs/2404.14082
- Distributed representations, simple recurrent networks, and grammatical structure, Elman, Jeffrey L.Machine Learning, 1991https://doi.org/10.1007/BF00114844
- Effective Approaches to Attention-based Neural Machine Translation, Minh-Thang Luong and Hieu Pham and Christopher D. Manning2015https://arxiv.org/abs/1508.04025
- Neural Machine Translation by Jointly Learning to Align and Translate, Dzmitry Bahdanau and Kyunghyun Cho and Yoshua Bengio2016https://arxiv.org/abs/1409.0473
- Attention Is All You Need, Ashish Vaswani and Noam Shazeer and Niki Parmar and Jakob Uszkoreit and Llion Jones and Aidan N. Gomez and Lukasz Kaiser and Illia Polosukhin2023https://arxiv.org/abs/1706.03762
- Advancing Transformer Architecture in Long-Context Large Language Models: A Comprehensive Survey, Yunpeng Huang and Jingwei Xu and Junyu Lai and Zixu Jiang and Taolue Chen and Zenan Li and Yuan Yao and Xiaoxing Ma and Lijuan Yang and Hao Chen and Shupeng Li and Penghao Zhao2024https://arxiv.org/abs/2311.12351
- A Mathematical Framework for Transformer Circuits, Elhage, Nelson and Nanda, Neel and Olsson, Catherine and Henighan, Tom and Joseph, Nicholas and Mann, Ben and Askell, Amanda and Bai, Yuntao and Chen, Anna and Conerly, Tom and DasSarma, Nova and Drain, Dawn and Ganguli, Deep and Hatfield-Dodds, Zac and Hernandez, Danny and Jones, Andy and Kernion, Jackson and Lovitt, Liane and Ndousse, Kamal and Amodei, Dario and Brown, Tom and Clark, Jack and Kaplan, Jared and McCandlish, Sam and Olah, ChrisTransformer Circuits Thread, 2021https://transformer-circuits.pub/2021/framework
- Zoom In: An Introduction to Circuits, Olah, Chris and Cammarata, Nick and Schubert, Ludwig and Goh, Gabriel and Petrov, Michael and Carter, ShanDistill, 2020https://distill.pub/2020/circuits/zoom-in
Footnotes
-
Một mạng neural network Linear hay còn gọi là MLP sẽ gồm một input layer, một hoặc nhiều hidden layer và output layer. Ở RNN, ta chỉ có một hidden layer duy nhất, và được tính như sau: với là trọng số của hidden layer, là bias và là một hàm kích hoạt nào đó. ↩
-
Bước thời gian là đang nói đến, hiện tại, ta đang ở từ thứ mấy trong câu. Ví dụ câu “tôi đẹp trai phết” thì ở bước thời gian thứ 2 hay (bước thời gian khởi đầu là ), ta đang xem xét từ “trai” và ta cũng xem từ đó là target word ở bước thời gian hiện tại. ↩