Encoder vs Decoder
Phân biệt Encoder và Decoder trong Transformer: từ cơ chế Attention hai chiều và tự hồi quy đến ứng dụng với BERT, GPT và T5. Hiểu sâu để chọn đúng kiến trúc cho bài toán NLP.
Định nghĩa
Encoder và Decoder là hai khối kiến trúc cốt lõi trong Transformer, phân biệt bởi hướng xử lý thông tin: Encoder đọc hiểu toàn bộ ngữ cảnh theo hai chiều để tạo representation, Decoder sinh văn bản từng từ một theo thứ tự tuần tự dựa trên ngữ cảnh đã có. Sự khác biệt này quyết định việc BERT chỉ hiểu được ngôn ngữ nhưng không thể viết tiếp câu chuyện, trong khi GPT có thể viết tiếp nhưng lại kém hơn trong việc hiểu ngữ cảnh phức tạp đòi hỏi nhìn từ tương lai về quá khứ.
Giải thích chi tiết
Encoder: Kiến trúc hai chiều
Encoder sử dụng bidirectional self-attention — mỗi token trong câu có thể "nhìn thấy" tất cả các token khác, cả bên trái và bên phải, trong cùng một lượt tính toán. Điều này tạo ra contextualized embedding giàu thông tin ngữ cảnh.
Trong mã nguồn PyTorch, cơ chế này thể hiện qua việc không sử dụng causal mask (mask tam giác trên). Attention score được tính trên toàn bộ sequence:
# Encoder self-attention: full visibility
def encoder_attention(x):
Q, K, V = linear_qkv(x)
scores = Q @ K.transpose(-2, -1) / sqrt(dim)
# Chỉ mask padding, không mask tương lai
attn_weights = softmax(scores + padding_mask)
return attn_weights @ VỨng dụng điển hình là BERT và PhoBERT (phiên bản cho tiếng Việt), dùng cho các bài toán understanding như phân loại sentiment, nhận diện thực thể (NER), hay trả lời câu hỏi.
Decoder: Sinh tuần tự tự hồi quy
Decoder hoạt động theo nguyên lý autoregressive: để sinh token thứ i, nó chỉ được phép nhìn các token từ 1 đến i-1. Điều này đảm bảo tính nhân quả trong generation, tránh rò rỉ thông tin từ tương lai.
Cơ chế này đạt được thông qua causal masking — một ma trận tam giác trên che chắn các vị trí tương lai:
def create_causal_mask(seq_len):
# True tại vị trí bị cấm (tương lai)
mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1).bool()
return mask # Shape: [seq_len, seq_len]
# Trong decoder attention
scores = scores.masked_fill(causal_mask, float('-inf'))GPT, Claude, và các mô hình sinh văn bản hiện đại đều là decoder-only architectures. Chúng lặp lại quá trình: dự đoán token tiếp theo → thêm vào input → dự đoán token kế tiếp.
Encoder-Decoder: Kết hợp Cross-Attention
Kiến trúc đầy đủ trong paper "Attention Is All You Need" ban đầu kết hợp cả hai: Encoder xử lý input sequence (ví dụ: câu tiếng Anh), tạo ra một bộ key-value pairs dày đặc. Decoder không chỉ dùng self-attention mà còn sử dụng cross-attention để truy vấn thông tin từ Encoder.
# Cross-attention trong decoder
Q = linear_q(decoder_hidden) # Query từ decoder
K, V = linear_kv(encoder_output) # Key, Value từ encoder
cross_attn_scores = Q @ K.transpose(-2, -1)T5, BART, và mT5 (multilingual T5) sử dụng kiến trúc này cho các bài toán sequence-to-sequence: dịch máy, tóm tắt văn bản, chuyển đổi định dạng (ví dụ: SQL từ câu hỏi tiếng Việt).
Khác biệt cốt lõi về Attention Masking
Điểm phân biệt kỹ thuật quan trọng nhất nằm ở attention mask pattern:
- Encoder: Full attention matrix (tất cả token nhìn tất cả token)
- Decoder: Lower-triangular matrix (token i chỉ nhìn 1..i-1)
- Encoder-Decoder: Decoder dùng causal mask cho self-attention và full mask cho cross-attention với Encoder output
Ví dụ thực tế
Dịch máy Anh-Việt (VinAI, VietAI): Hệ thống dịch tự động sử dụng Encoder đọc câu tiếng Anh "The contract is terminated" và tạo representation ngữ nghĩa. Decoder sau đó sinh từng từ tiếng Việt "Hợp đồng", rồi "được", rồi "chấm dứt", dựa trên cả ngữ cảnh đã dịch và representation từ Encoder.
Chatbot đa ngôn ngữ cho thị trường Việt Nam: Khi người dùng hỏi "Grab có khuyến mãi gì không?", một hệ thống hybrid có thể dùng Encoder-only (PhoBERT) để phân loại intent là "hỏi khuyến mãi", sau đó dùng Decoder-only (GPT fine-tuned) để sinh câu trả lời tự nhiên bằng tiếng Việt.
Tóm tắt văn bản pháp luật: Encoder-Decoder architecture được VietLaw AI và các nhóm nghiên cứu trong nước áp dụng để đọc điều khoản dài trong hợp đồng lao động hoặc văn bản quy phạm pháp luật (input), sau đó tạo bản tóm tắt ngắn gọn (output) giữ nguyên ý nghĩa pháp lý.
Ứng dụng
Sinh viên nghiên cứu: Hiểu sự khác biệt để lựa chọn mô hình fine-tuning phù hợp. Nếu bài toán là phân loại đánh giá sản phẩm trên Shopee/Tiki thành "tích cực/tiêu cực", dùng Encoder-only (PhoBERT) hiệu quả hơn vì không cần sinh văn bản mới. Nếu cần viết lại đánh giá theo phong cách trang trọng hơn, cần Decoder hoặc Encoder-Decoder.
Developer xây dựng sản phẩm: Khi xây dựng chatbot nội bộ, lựa chọn kiến trúc ảnh hưởng đến latency và chi phí. Decoder-only (GPT-style) cho phép streaming response (trả về từng token), trong khi Encoder-Decoder thường phải chờ Encoder xử lý xong toàn bộ input trước khi Decoder bắt đầu sinh.
Doanh nghiệp triển khai AI: Các ngân hàng như VietinBank, Techcombank triển khai Encoder-only models để phân loại ticket hỗ trợ khách hàng tự động, trong khi dùng Encoder-Decoder cho hệ thống dịch thuật nội bộ tài liệu tài chính Anh-Việt. Việc hiểu rõ giới hạn của từng kiến trúc giúp tránh lỗi "dùng BERT để viết email" hay "dùng GPT để phân loại văn bản pháp lý phức tạp cần hiểu ngữ cảnh hai chiều".
So sánh
| Đặc điểm | Encoder (BERT/PhoBERT) | Decoder (GPT/Claude) | Encoder-Decoder (T5/BART) |
|---|---|---|---|
| Hướng attention | Bidirectional (hai chiều) | Unidirectional (causal, trái sang phải) | Kết hợp: Encoder (bidirectional), Decoder (causal) |
| Mục đích chính | Understanding, Representation | Text Generation | Sequence-to-Sequence (Translation, Summarization) |
| Input/Output | Input sequence → Context embedding | Prompt sequence → Continuation | Source sequence → Target sequence |
| Attention Masking | Padding mask only | Causal mask (tam giác trên) | Encoder: padding; Decoder: causal + cross-attention |
| Khả năng sinh văn bản | Không thể (chỉ ra token [MASK]) | Có thể, từng token một | Có thể, điều khiển tốt hơn GPT cho dịch thuật |
| Hiểu ngữ cảnh phức tạp | Xuất sắc (nhìn cả hai phía) | Hạn chế (chỉ nhìn quá khứ) | Tốt (Encoder xử lý sâu trước khi Decoder sinh) |
| Ví dụ tiếng Việt | PhoBERT, ViBERT | VietGPT (nếu có), GPT-4 tiếng Việt | VietAI's BARTpho |
Kết luận: Encoder thích hợp khi bạn cần "hiểu" văn bản để phân loại hoặc trích xuất thông tin. Decoder phù hợp khi cần "viết" hoặc "tiếp nối" văn bản. Encoder-Decoder là lựa chọn cho các bài toán chuyển đổi từ sequence này sang sequence khác, đặc biệt khi input và output có cấu trúc ngữ pháp khác nhau như trong dịch máy.
Bài viết liên quan
Cùng cụm (transformer-architecture):
- Transformer là gì? — Tổng quan kiến trúc Transformer từ paper gốc "Attention Is All You Need"
- Attention mechanism là gì? — Hiểu sâu cơ chế Attention trước khi phân biệt Encoder/Decoder
- Self-attention hoạt động thế nào? — Chi tiết toán học và code của Self-Attention, nền tảng của cả hai kiến trúc
- GPT hoạt động ra sao? — Phân tích chuyên sâu về kiến trúc Decoder-only qua các phiên bản GPT-1 đến GPT-4
Đọc tiếp:
- LLM Fundamentals — Nền tảng về Large Language Models, hiểu rõ hơn về scaling laws và pre-training objectives của các kiến trúc trên
- NLP Deep Dive — Tokenization và các kỹ thuật xử lý ngôn ngữ tự nhiên nâng cao cho tiếng Việt, nền tảng để hiểu cách Encoder/Decoder xử lý input đầu vào
Self-attention hoạt động thế nào?
Self-attention là trái tim của Transformer. Hiểu cách Query, Key, Value tương tác để nắm bắt ngữ cảnh trong mọi khoảng cách, từ đó tối ưu kiến trúc LLM.
GPT hoạt động ra sao?
Tìm hiểu cơ chế bên trong GPT: từ việc dự đoán token tiếp theo đến kiến trúc Transformer decoder-only, self-attention và quá trình sinh văn bản tự động.