TROISINH
Chuyên sâuKiến trúc Transformer

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

EncoderDecoder 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ểmEncoder (BERT/PhoBERT)Decoder (GPT/Claude)Encoder-Decoder (T5/BART)
Hướng attentionBidirectional (hai chiều)Unidirectional (causal, trái sang phải)Kết hợp: Encoder (bidirectional), Decoder (causal)
Mục đích chínhUnderstanding, RepresentationText GenerationSequence-to-Sequence (Translation, Summarization)
Input/OutputInput sequence → Context embeddingPrompt sequence → ContinuationSource sequence → Target sequence
Attention MaskingPadding mask onlyCausal mask (tam giác trên)Encoder: padding; Decoder: causal + cross-attention
Khả năng sinh văn bảnKhông thể (chỉ ra token [MASK])Có thể, từng token mộtCó thể, điều khiển tốt hơn GPT cho dịch thuật
Hiểu ngữ cảnh phức tạpXuấ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ệtPhoBERT, ViBERTVietGPT (nếu có), GPT-4 tiếng ViệtVietAI'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):

Đọ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

On this page