DeepSeek-OCR 2: Visual Causal Flow - Phân Tích Chi Tiết Paper và Thực Nghiệm
Phân tích chi tiết paper DeepSeek-OCR 2 với Visual Causal Flow - kiến trúc mixed attention mới cho OCR, so sánh benchmark và thực nghiệm trên tiếng Việt.
DeepSeek-OCR 2: Visual Causal Flow - Phân Tích Chi Tiết Paper và Thực Nghiệm nhỏ với H100
TL;DR
DeepSeek-OCR 2 đề xuất Visual Causal Flow - thay vì quét ảnh theo thứ tự cố định trái→phải, trên→dưới (raster-scan), model dùng learnable queries với causal attention để tự học thứ tự đọc theo ngữ nghĩa.

Kiến trúc gồm 3 phần: SAM tokenizer (80M) → Qwen2 encoder với mixed attention (500M) → DeepSeek-3B MoE decoder
Kết quả: 91.09% trên OmniDocBench với chỉ 1120 visual tokens (ít nhất trong các model so sánh). Tôi test thực tế trên tiếng Việt: model mạnh với document tiêu chuẩn nhưng yếu với chữ viết tay và text trên surface khó (bia đá). Contribution chính theo tôi: chia bài toán 2D image understanding thành 2 subtask 1D causal - encoder lo "đọc theo thứ tự nào", decoder lo "nội dung là gì".
1. Mở bát:
Khi đọc paper này, điều đầu tiên khiến tôi ấn tượng là cách DeepSeek-OCR 2 đặt vấn đề: thay vì cải tiến OCR bằng cách tăng model size hay thêm data, họ quay lại câu hỏi cơ bản - con người đọc tài liệu như thế nào?
DeepSeek-OCR 2 giới thiệu khái niệm Visual Causal Flow - mô phỏng cách mắt người quét qua tài liệu theo ngữ nghĩa, không phải theo thứ tự vật lý.
"The human visual system closely mirrors transformer-based vision encoders: foveal fixations function as visual tokens, locally sharp yet globally aware. However, unlike existing encoders that rigidly scan tokens from top-left to bottom-right, human vision follows a causally-driven flow guided by semantic understanding."
Điểm đột phá chính mà tôi thấy: thay vì xử lý visual tokens theo thứ tự cố định raster-scan (từ trái sang phải, trên xuống dưới), model sẽ dynamic reorder các visual tokens dựa trên ngữ nghĩa của ảnh.

Cách tôi hiểu Figure 1:
Figure này so sánh 2 phiên bản encoder:
| Component | DeepEncoder (cũ) | DeepEncoder V2 (mới) |
|---|---|---|
| Vision backbone | CLIP ViT 300M | LM as Vision Encoder (Qwen2 500M) |
| Tokenizer | 80M, 16× compression | 80M, 16× compression (giữ nguyên) |
| Attention type | Non-causal (bidirectional) | Mixed: non-causal + causal |
| Output | Visual tokens trực tiếp | Learnable queries (new reading order) |
Tôi chú ý:
- Bên trái (DeepEncoder): CLIP xử lý visual tokens với bidirectional attention → output giữ nguyên thứ tự raster-scan
- Bên phải (DeepEncoder V2): Thêm learnable queries với causal attention → queries học cách reorder visual information theo semantic flow
- Các ô màu cam/xanh biểu thị visual tokens, ô màu tím/hồng biểu thị causal queries
2. Vấn Đề với Các Phương Pháp Truyền Thống
2.1 Raster-Scan Order
Hầu hết các Vision-Language Models (VLMs) hiện tại xử lý ảnh theo raster-scan order:

Vấn đề chính mà paper chỉ ra (và tôi đồng ý):
- Con người không đọc tài liệu theo thứ tự này
"Directly flattening image patches in a predefined raster-scan order introduces unwarranted inductive bias that ignores semantic relationships"
- Một tài liệu có thể có nhiều cột, bảng, hình ảnh xen kẽ
- Thứ tự đọc logic phụ thuộc vào nội dung không phải vị trí vật lý
2.2 Related Work: Parallelized Queries
Paper phân tích các phương pháp liên quan sử dụng parallelized queries:

Tôi thấy figure này rất hữu ích để hiểu context. Hai phương pháp đã dùng parallelized queries trước đây:

DETR (Object Detection):
- 100 object queries học priors về shape/position
- Queries interact với feature maps qua cross-attention
- Queries interact với nhau qua bidirectional self-attention
Nói đơn giản: DETR tạo ra 100 "câu hỏi" cố định kiểu "có object nào ở vùng này không?". Mỗi câu hỏi nhìn vào toàn bộ ảnh (cross-attention) và cũng nhìn thấy tất cả câu hỏi khác (bidirectional) để tránh detect trùng. Vì các câu hỏi nhìn thấy nhau nên không có khái niệm "thứ tự" - chúng hoạt động song song.
BLIP2 (Visual Token Compression):
- 32 learnable queries compress hàng trăm CLIP tokens thành 32 tokens
- Cũng dùng bidirectional attention cho queries
Tương tự, BLIP2 dùng 32 queries để "tóm tắt" hàng trăm visual tokens từ CLIP thành 32 tokens gọn hơn trước khi đưa vào LLM. Mục đích ở đây là nén thông tin, không phải sắp xếp lại - nên bidirectional attention là hợp lý vì thứ tự output không quan trọng.
Điểm chung của cả hai: queries đều dùng bidirectional attention với nhau, nghĩa là không có ràng buộc về thứ tự. Đây chính là điểm mà DeepEncoder V2 làm khác.
Điểm khác biệt quan trọng của DeepEncoder V2 mà tôi nhận ra:
| Aspect | DETR/BLIP2 | DeepEncoder V2 |
|---|---|---|
| Query attention | Bidirectional | Causal |
| Architecture | Cross-attention (separate) | Prefix concatenation (joint) |
| Purpose | Compress/decode | Semantic reordering |
DeepEncoder V2 dùng causal attention cho queries vì muốn queries học sequential reading order - query thứ i chỉ nhìn thấy queries 1..i-1, tạo ra implicit ordering. Đây là insight quan trọng nhất theo tôi.
3. Visual Causal Flow - Ý Tưởng Chính
3.1 Core Concept
Câu hỏi mà paper đặt ra:
"Can 2D image understanding be effectively achieved through two-cascaded 1D causal reasoning structures?"
Ý tưởng là sử dụng 2 giai đoạn causal reasoning cascade:

3.2 Kiến Trúc Tổng Quan

Khi tôi nhìn vào architecture tổng thể, pipeline rõ ràng:

Tôi hình dung pipeline này giống một dây chuyền 3 bước: Bước 1, ảnh được cắt nhỏ và nén - giống như bạn chia trang giấy thành nhiều ô nhỏ, mỗi ô thành 1 token. Bước 2, các tokens này đi vào encoder - đây là bước "đọc hiểu". Encoder vừa để các visual tokens trao đổi thông tin với nhau (bidirectional), vừa dùng learnable queries để sắp xếp lại theo thứ tự ngữ nghĩa (causal). Output của bước này chỉ là các query outputs - tức là thông tin đã được "đọc lại" theo đúng thứ tự. Bước 3, decoder nhận query outputs và sinh ra text - giống như bạn đọc xong tài liệu rồi viết lại nội dung.
Điểm thú vị là visual tokens gốc bị "bỏ lại" sau encoder - decoder chỉ nhận thông tin đã qua reorder. Điều này force encoder phải học cách tóm tắt và sắp xếp thông tin thật tốt, vì decoder không có cách nào "nhìn lại" ảnh gốc.
Những điểm tôi thấy hay:
- "cascade causal": Visual tokens đi qua 2 lần causal reasoning - lần 1 trong encoder (reorder), lần 2 trong decoder (generate). Giống như đọc sách 2 lượt: lượt 1 scan qua để biết cấu trúc, lượt 2 đọc kỹ để hiểu nội dung.
- "low activation": DeepSeek-3B là MoE model, chỉ ~570M params active mỗi forward pass. Tức là model 3B nhưng chạy nhanh như model 570M - tiết kiệm compute đáng kể.
- Chỉ query outputs được feed vào decoder, không phải visual tokens gốc. Đây là bottleneck có chủ đích - buộc encoder phải nén và reorder tốt.
Các thành phần chính:
| Component | Parameters | Function |
|---|---|---|
| SAM ViTDET + Conv | 80M | Vision tokenizer, 16× compression |
| Qwen2 LM Encoder | 500M | Visual causal flow, token reordering |
| DeepSeek-3B MoE | 3B (570M active) | Language decoder |
4. DeepEncoder V2
4.1 Vision Tokenizer
Vision tokenizer sử dụng SAM-base (80M params) với 2 convolutional layers:
- Output dimension: 896 (giảm từ 1024 của DeepEncoder)
- Đạt 16× token compression qua window attention
- Tương đương với ~100M params của text embeddings trong LLMs
Nếu bạn quên SAM là gì: SAM (Segment Anything Model) là model phân vùng ảnh của Meta, nổi tiếng với khả năng segment bất kỳ object nào trong ảnh. Phần được dùng ở đây là ViTDET backbone của SAM - về bản chất nó là một Vision Transformer đã được pre-train trên lượng data khổng lồ để extract visual features. DeepSeek-OCR 2 không dùng SAM để segment, mà chỉ "mượn" backbone của nó làm bộ tokenizer - biến ảnh thành chuỗi tokens. Cộng thêm 2 lớp convolution để nén từ resolution gốc xuống 16 lần, giúp giảm đáng kể số tokens mà encoder phải xử lý.
4.2 Language Model as Vision Encoder
Theo tôi đây là innovation quan trọng nhất - thay thế CLIP ViT bằng LLM-style architecture:
Tại sao decoder-only architecture?
Paper note rằng experiments với cross-attention (mBART-style encoder-decoder) fail to converge - điều này khiến tôi khá bất ngờ:
"We hypothesize this failure stems from insufficient visual token interaction when isolated in a separate encoder. In contrast, the prefix design keeps visual tokens active throughout all layers."
4.3 Causal Flow Query

Tôi tìm hiểu kỹ cách DeepSeek-OCR 2 xử lý ảnh với nhiều độ phân giải:

Local views:
- Resolution: 768×768 pixels
- Sau tokenizer: N1 = (768/16)² / 16 = 48² / 16 = 144 tokens
- Query embeddings: query_local (shared cho tất cả local views)
- Có thể có 0-6 local crops tùy ảnh
Global view:
- Resolution: 1024×1024 pixels
- Sau tokenizer: N3 = (1024/16)² / 16 = 64² / 16 = 256 tokens
- Query embeddings: query_global (riêng cho global)
- Luôn có đúng 1 global view
Tại sao cần cả local và global? Theo tôi hiểu:
- Local views: Chi tiết cao, đọc text nhỏ
- Global view: Context tổng thể, layout understanding
Công thức tính số visual tokens:
$$N_{tokens} = \frac{W \times H}{16^2 \times 16} = \frac{W \times H}{4096}$$
| Resolution | Tokens | Query Embeddings |
|---|---|---|
| 768×768 (local) | 144 | query_local (shared) |
| 1024×1024 (global) | 256 | query_global |
Dynamic resolution:
- 0-6 local crops (768×768) + 1 global view (1024×1024)
- Total: $k \times 144 + 256$ tokens, range [256, 1120]
- Maximum 1120 tokens = matches Gemini-3 Pro's visual token budget
4.4 Attention Mask - Core Innovation

Đây là phần tôi đọc kỹ nhất vì nó là core innovation của paper:

Để tôi giải thích figure này bằng ví dụ cho dễ hình dung. Hãy tưởng tượng bạn có 3 "mắt" (visual tokens) và 3 "tay ghi chép" (query tokens):
- Ô xanh lá (can attend) = "tôi nhìn thấy bạn". Ô hồng (cannot attend) = "tôi không biết bạn tồn tại".
- Bên trái figure cho thấy 2 kiểu attention truyền thống: ViT (ai cũng nhìn thấy ai - tất cả xanh) và LM (chỉ nhìn thấy người đến trước mình - tam giác xanh).
- Bên phải là cách DeepEncoder V2 kết hợp cả hai trong 1 ma trận 6×6. Nhìn vào từng góc:
- Góc trên-trái (3 mắt × 3 mắt): tất cả xanh → các mắt trao đổi tự do với nhau, "ê, bên tôi có cái bảng, bên bạn có gì?" Đây là kiểu ViT.
- Góc trên-phải (3 mắt × 3 tay): tất cả hồng → mắt không biết tay đang ghi gì. Quan trọng vì ta không muốn visual features bị "nhiễm" bởi quá trình ghi chép.
- Góc dưới-trái (3 tay × 3 mắt): tất cả xanh → mỗi tay nhìn thấy tất cả mắt, tức là có thể "hỏi" bất kỳ vùng nào trong ảnh.
- Góc dưới-phải (3 tay × 3 tay): tam giác xanh → tay thứ 2 chỉ biết tay thứ 1 đã ghi gì, tay thứ 3 biết tay 1 và 2. Đây là kiểu LM - tạo ra thứ tự đọc.
Nói cách khác: mắt thì nhìn tự do (bidirectional), nhưng tay thì ghi theo thứ tự (causal) - tay sau phải dựa vào tay trước đã ghi gì để quyết định ghi tiếp phần nào. Đó chính là cách model học reading order.
Tại sao thiết kế này quan trọng? Tôi phân tích như sau:
- Visual tokens giữ full context: Bidirectional attention cho phép extract features như CLIP/ViT truyền thống
- Queries học reading order: Causal attention force queries phải learn sequential dependency - query 5 phải dựa trên query 1-4 đã "đọc" gì
- Queries "hỏi" visual info: Mỗi query có thể attend to mọi visual token để tìm thông tin cần thiết
Công thức attention mask từ paper (Equation 1):
$$\mathbf{O} = \mathcal{D}\left(\pi_Q\left(\mathcal{T}^L(\mathcal{E}(\mathbf{I}) \oplus \mathbf{Q}_0; \mathbf{M})\right)\right)$$
Trong đó:
- $m$ = số visual tokens
- $n$ = số causal query tokens (bằng $m$)
- $\mathbf{1}_{m \times m}$ = all-ones matrix (bidirectional)
- $\text{LowerTri}(n)$ = lower triangular matrix (causal)
Tóm lại:
- Visual tokens có bidirectional attention - mỗi token nhìn thấy tất cả visual tokens khác
- Query tokens có causal attention - chỉ nhìn thấy queries trước đó
- Query tokens có thể attend to tất cả visual tokens
- Kết quả: queries học cách "hỏi" và reorder visual information theo semantic flow
5. Core Forward Pass
Equation 2 từ paper - forward pass chính:
$$\mathbf{O} = \mathcal{D}\left(\pi_Q\left(\mathcal{T}^L(\mathcal{E}(\mathbf{I}) \oplus \mathbf{Q}_0; \mathbf{M})\right)\right)$$
Tôi phân tích từng thành phần:
- $\mathbf{I} \in \mathbb{R}^{H \times W \times 3}$ = input image
- $\mathcal{E}$ = vision tokenizer → $m$ visual tokens $\mathbf{V} \in \mathbb{R}^{m \times d}$
- $\mathbf{Q}_0 \in \mathbb{R}^{n \times d}$ = learnable causal query embeddings
- $\oplus$ = sequence concatenation
- $\mathcal{T}^L$ = L-layer Transformer với masked attention $\mathbf{M}$
- $\pi_Q$ = projection operator lấy $n$ tokens cuối (queries sau khi process)
- $\mathcal{D}$ = language decoder
- $\mathbf{O} \in \mathbb{R}^{n \times |\mathcal{V}|}$ = output logits
Công thức trông phức tạp nhưng thực ra đọc từ trong ra ngoài nó kể đúng câu chuyện pipeline 3 bước mà tôi nói ở trên:
- $\mathcal{E}(\mathbf{I})$ — Bước trong cùng: ảnh $\mathbf{I}$ đi qua tokenizer $\mathcal{E}$, ra $m$ visual tokens. Giống như cắt trang giấy thành $m$ mảnh nhỏ.
- $\mathcal{E}(\mathbf{I}) \oplus \mathbf{Q}_0$ — Nối visual tokens với learnable queries $\mathbf{Q}_0$. Ký hiệu $\oplus$ chỉ là concat 2 chuỗi lại thành 1 chuỗi dài gấp đôi ($2m$ tokens). Giống như xếp $m$ mảnh giấy cạnh $m$ tờ giấy trắng (queries) thành 1 hàng dài.
- $\mathcal{T}^L(\cdot\;; \mathbf{M})$ — Chuỗi $2m$ tokens đi qua $L$ layers Transformer với attention mask $\mathbf{M}$ (ma trận xanh-hồng mà tôi vừa giải thích). Đây là bước "đọc hiểu" - mắt nhìn tự do, tay ghi theo thứ tự.
- $\pi_Q(\cdot)$ — Chỉ lấy $n$ tokens cuối (phần query outputs), bỏ visual tokens gốc. Lấy phần "ghi chép" ra, bỏ phần "mắt nhìn" đi.
- $\mathcal{D}(\cdot)$ — Query outputs đi vào decoder, sinh ra text. Đọc bản ghi chép và viết ra markdown.
Tóm lại: Ảnh → cắt nhỏ → ghép queries → transformer với mixed attention → lấy queries → decoder → text. Một đường thẳng, không có skip connection hay feedback loop nào.
6. Training Pipeline
Paper mô tả 3 giai đoạn training. Tôi thấy chiến lược này rất có hệ thống - mỗi stage freeze một phần và train một phần, giống như xây nhà từ móng lên mái:
Stage 1: Training DeepEncoder V2
- Objective: Language modeling (next token prediction)
- Initialization: Vision tokenizer từ DeepEncoder, LLM encoder từ Qwen2-0.5B-base
- Hardware: 160 A100 GPUs, batch size 640, 40k iterations
- Data: ~100M image-text pairs
Giai đoạn này tập trung dạy encoder "nhìn" - cho nó học cách biến ảnh thành tokens có ý nghĩa. Vision tokenizer (SAM) được lấy sẵn từ DeepEncoder v1, còn LLM encoder khởi tạo từ Qwen2-0.5B. Objective là next token prediction - giống cách train LLM thông thường nhưng input là visual tokens. 160 A100 GPUs với 100M image-text pairs - quy mô training không nhỏ.
Stage 2: Query Enhancement
- Freeze vision tokenizer (SAM-conv)
- Joint optimize LLM encoder + LLM decoder
- Multi-crop strategy unified
- 4-stage pipeline parallelism
Ở đây họ freeze tokenizer (phần cắt ảnh thành tokens đã ổn, không cần thay đổi nữa) và tập trung tối ưu phần encoder + decoder cùng lúc. Đây là bước quan trọng nhất theo tôi - vì encoder phải học output queries sao cho decoder hiểu được, và decoder phải học cách đọc queries output từ encoder. Hai phần này phải "nói chung một ngôn ngữ", nên train joint là hợp lý. Multi-crop strategy cũng được unified ở stage này - tức là model học cách xử lý cả local views (768×768) lẫn global view (1024×1024) cùng lúc.
Stage 3: Continue-training LLM
- Freeze all DeepEncoder V2 params
- Only update DeepSeek-LLM
- Learning rate decay: 1e-6 → 5e-8
2× training speed acceleration
Cuối cùng, freeze toàn bộ encoder (coi như "mắt" đã hoàn thiện) và chỉ train decoder. Vì encoder bị freeze nên forward pass qua encoder có thể cache lại, giúp tốc độ training tăng >2×. Learning rate giảm rất thấp (5e-8) - chỉ fine-tune nhẹ decoder để nó "quen" hơn với output format.
Tóm lại logic training: Dạy mắt nhìn trước (stage 1) → Dạy mắt và tay phối hợp (stage 2) → Chỉ polish kỹ năng viết (stage 3). Mỗi stage đều freeze phần đã ổn định, tránh catastrophic forgetting.
7. Benchmark Results

Tôi đọc kỹ bảng benchmark trên OmniDocBench v1.5 - đây là benchmark chuyên đánh giá khả năng OCR tài liệu.
Ý nghĩa các metrics:
| Metric | Ý nghĩa | Lower/Higher better |
|---|---|---|
| V-token_max | Số visual tokens tối đa model sử dụng | Lower = efficient hơn |
| Overall | Điểm tổng hợp (0-100%) | Higher better |
| Text_Edit↓ | Edit distance cho text extraction | Lower = chính xác hơn |
| R-order_Edit↓ | Edit distance cho reading order | Lower = layout tốt hơn |
Tôi thấy 2 metrics quan trọng nhất:
1. Text_Edit: Đo lường độ chính xác của việc trích xuất ký tự - càng thấp càng ít lỗi OCR
2. R-order_Edit: Đo lường khả năng reconstruct đúng thứ tự đọc - quan trọng với tài liệu multi-column, có bảng/hình
So sánh visual token efficiency:

Insight quan trọng mà tôi rút ra:
- DeepSeek-OCR 2 dùng ít visual tokens nhất (1120) nhưng đạt highest overall score (91.09%)
- So với phiên bản trước (DeepSeek-OCR): +3.73% overall, giảm 36 tokens
- R-order_Edit giảm từ 0.085 → 0.057 = Visual Causal Flow thực sự cải thiện reading order
Key results:
| Model | V-token_max | Overall | Text_Edit↓ | R-order_Edit↓ |
|---|---|---|---|---|
| DeepSeek-OCR | 1156 | 87.36 | 0.073 | 0.085 |
| DeepSeek-OCR 2 | 1120 | 91.09 | 0.048 | 0.057 |
| Improvement | ↓36 | +3.73% | ↓0.025 | ↓0.028 |
So sánh với các models khác (visual token budget tương tự):
| Model | V-token_max | Overall_Edit↓ |
|---|---|---|
| Gemini-3 pro | 1120 | 0.115 |
| DeepSeek-OCR 2 | 1120 | 0.100 |
8. Thực Nghiệm Cá Nhân
8.1 Setup
Sau khi đọc paper, tôi quyết định tự test DeepSeek-OCR 2 trên dữ liệu tiếng Việt để xem performance thực tế ra sao.
Hardware:
- MacBook Pro M4 (Gemini Flash - cloud API, dùng làm baseline so sánh)
- Google Colab H100 GPU (DeepSeek-OCR 2)
Test Images và Results:
Tôi chọn 3 loại ảnh khác nhau để test, từ dễ đến khó:
1. Crazy Handwriting (Bảng trắng viết tay lộn xộn)
| Gemini Flash | DeepSeek-OCR 2 |
|---|---|
![]() |
![]() |
Đây là case khó nhất - chữ viết tay tiếng Việt với nhiều gạch xóa, mũi tên, và layout không theo chuẩn. Gemini flash vẫn đọc được 1 phần nhưng DeepSeek-OCR 2 fail hoàn toàn.
2. Wild (Bia đá khắc chữ tiếng Việt)
| Gemini Flash | DeepSeek-OCR 2 |
|---|---|
![]() |
![]() |
Bia đá ngoài trời với chữ khắc - test khả năng đọc text trên surface không phẳng và font không chuẩn.
3. Document
| Gemini Flash | DeepSeek-OCR 2 |
|---|---|
![]() |
![]() |
Tài liệu text-heavy tiêu chuẩn, DeepSeekOCR v2 thể hiện tuy chưa bằng được với gemini flash nhưng ta thấy rằng kiến trúc Visual Causal Flow thể hiện tốt khi document đang nằm lệch, kết quả ra vẫn khá tốt.
8.2 Kết Quả DeepSeek-OCR 2 (Colab H100)
| Image | Time | Characters |
|---|---|---|
| wild.png | 2.55s | 78 chars |
| crazy-hand-writing.png | 12.27s | FAIL HOÀN TOÀN |
| Document.jpg | 15.28s | 994 chars |
8.3 DeepSeek-OCR 2 trên Colab
Inference Code tôi sử dụng:
Output format với grounding:
<|ref|>CÂY LỘC VỪNG<|/ref|><|det|>[[x1, y1, x2, y2]]<|/det|>
<|ref|>DO ĐẠI TƯỚNG TÔ LÂM<|/ref|><|det|>[[x1, y1, x2, y2]]<|/det|>
...
8.4 So Sánh Tổng Quan
| Metric | Gemini Flash | DeepSeek-OCR 2 |
|---|---|---|
| Speed | ~3s/image | ~5-8s/image |
| Hardware | CPU/Cloud API | GPU required (15GB) |
| Vietnamese diacritics | Sometimes wrong | Sometimes wrong |
| Handwriting | Đọc được 1 phần | Fail hoàn toàn |
| Layout preservation | Basic | Grounding support |
| Visual tokens | Unknown | 256-1120 |
| Cost | API fee | Free (self-host) |
Nhận xét cá nhân: Tôi thấy DeepSeek-OCR 2 mạnh với document tiêu chuẩn (tiếng Anh, layout rõ ràng) nhưng với tiếng Việt trên surface khó (bia đá, chữ viết tay) thì vẫn còn nhiều lỗi. Điều này có thể do training data thiếu tiếng Việt.
9. Điểm Mạnh và Hạn Chế
9.1 Điểm Mạnh (từ paper)
Sau khi đọc kỹ paper, tôi tổng kết các điểm mạnh:
- Visual Causal Flow: Xử lý ảnh theo semantic order thay vì rigid raster-scan
- Cascade causal reasoning: Encoder reorders tokens + Decoder generates text
- Efficient compression: Chỉ 256-1120 visual tokens, thấp hơn Gemini-3 Pro
- Reading order improvement: R-order Edit Distance giảm từ 0.085 → 0.057
- Towards unified multimodal encoder: Có thể mở rộng cho audio, text với modality-specific queries
9.2 Hạn Chế

Tôi phân tích bảng chi tiết theo loại tài liệu để hiểu rõ hơn strengths/weaknesses:
Loại tài liệu có performance tốt (Edit Distance < 0.1):
- Academic papers, books, textbooks
- Financial reports, government docs
- Notes, PPT slides
Loại tài liệu có performance yếu:
| Document Type | Edit Distance | Nguyên nhân |
|---|---|---|
| Newspapers | >0.13 | Thiếu training data, layout phức tạp |
| Exam papers | ~0.11 | Multiple columns, mixed orientations |
| Magazines | ~0.12 | Complex visual elements, ads |
Tại sao Newspapers khó?

- Multi-column với text flow phức tạp (nhảy page)
- Nhiều hình ảnh, quảng cáo xen kẽ
- Text sizes khác nhau (headline vs body)
- Training data bias: Newspapers ít hơn trong dataset
Các hạn chế chính mà tôi gặp khi test:
- GPU requirement: Cần CUDA, không chạy được trên CPU/MPS (MacBook Pro M4 của tôi không chạy được)
- Memory: ~15GB GPU RAM
- Newspapers weakness: Edit Distance > 0.13 (thiếu training data, layout phức tạp)
- Dependencies: Cần specific versions (
transformers==4.46.3,flash-attn==2.7.3) - Tiếng Việt: Dấu thanh tiếng Việt vẫn bị sai nhiều, đặc biệt trên surface khó
10. So Sánh DeepSeek-OCR v1 vs v2: Những Gì Đã Thay Đổi?
Sau khi đọc cả 2 paper (DeepSeek-OCR và DeepSeek-OCR 2), tôi muốn tổng hợp lại những thay đổi chính giữa 2 phiên bản. Đây không chỉ là upgrade model - mà là thay đổi triết lý thiết kế.
10.1 Thay Đổi Kiến Trúc
| Component | DeepSeek-OCR (v1) | DeepSeek-OCR 2 (v2) | Ý nghĩa |
|---|---|---|---|
| Vision backbone | CLIP ViT 300M | Qwen2 LM 500M | Chuyển từ vision-specific sang LM-style encoder |
| Tokenizer output dim | 1024 | 896 | Giảm nhẹ dimension, compact hơn |
| Attention | Non-causal (bidirectional hoàn toàn) | Mixed: non-causal + causal | Core innovation - thêm causal flow cho queries |
| Output mechanism | Visual tokens → decoder trực tiếp | Learnable queries → decoder | Thêm bước reordering trước khi decode |
| Cross-attention | Không | Không (prefix concatenation) | Cả 2 đều dùng prefix design, không dùng cross-attention |
Thay đổi quan trọng nhất theo tôi: Việc chuyển từ CLIP ViT sang LM-style encoder (Qwen2) không chỉ là thay backbone - nó cho phép áp dụng causal attention một cách tự nhiên, vì LM architecture vốn đã được thiết kế cho sequential processing. Nếu vẫn giữ CLIP ViT, việc thêm causal queries sẽ kém tự nhiên hơn nhiều.
10.2 Thay Đổi Cơ Chế Đọc
Đây là sự khác biệt cốt lõi:
V1 (DeepEncoder): Ảnh → tokenize → bidirectional attention → output tokens giữ nguyên thứ tự raster-scan → decoder sinh text.
V2 (DeepEncoder V2): Ảnh → tokenize → mixed attention (visual tokens bidirectional + learnable queries causal) → output chỉ lấy query tokens (đã reorder theo semantic flow) → decoder sinh text.
Nói đơn giản: v1 chỉ nén ảnh rồi đẩy cho decoder tự xoay xở. V2 thêm bước đọc hiểu và sắp xếp lại trước khi đưa cho decoder. Giống như sự khác biệt giữa "đưa nguyên tập tài liệu cho người dịch" vs "đọc qua, đánh dấu thứ tự quan trọng, rồi mới đưa cho người dịch".
10.3 Cải Thiện Benchmark
Từ Table 1 (OmniDocBench v1.5):
| Metric | v1 | v2 | Cải thiện |
|---|---|---|---|
| V-token_max | 1156 | 1120 | ↓36 tokens (ít hơn ~3%) |
| Overall | 87.36% | 91.09% | +3.73% |
| Text_Edit↓ | 0.073 | 0.048 | ↓34% (ít lỗi OCR hơn rõ rệt) |
| R-order_Edit↓ | 0.085 | 0.057 | ↓33% (reading order tốt hơn nhiều) |
Và từ Table 4 (production performance):
- Repetition rate giảm đáng kể - v1 hay bị lặp text khi gặp document dài, v2 khắc phục được nhờ causal flow giúp model "nhớ" đã đọc phần nào rồi.
Phân tích của tôi:
- Cải thiện lớn nhất là ở R-order_Edit (↓33%) - chứng minh Visual Causal Flow thực sự giúp model hiểu reading order tốt hơn. Đây đúng là mục tiêu chính của paper.
- Text_Edit cũng giảm 34% - bất ngờ vì paper focus vào reading order, nhưng semantic reordering cũng giúp OCR chính xác hơn. Tôi nghĩ là vì khi model đọc đúng thứ tự, context được build up tốt hơn, giúp decode chính xác hơn.
- Số visual tokens giảm nhẹ (1156 → 1120) nhưng performance tăng mạnh - chứng tỏ cải thiện đến từ architecture, không phải từ việc tăng input.
10.4 Điều Gì Không Thay Đổi?
Cũng quan trọng để note những gì giữ nguyên:
- Vision tokenizer: Vẫn dùng SAM-base 80M params với 16× compression - phần "cắt ảnh thành tokens" đã đủ tốt từ v1
- Decoder: Vẫn dùng DeepSeek MoE architecture - chỉ thay encoder
- Training data scale: Vẫn ~100M image-text pairs cho stage 1
- Prefix concatenation: Cả 2 version đều dùng prefix design thay vì cross-attention (vì cross-attention fail to converge)
- Multi-crop strategy: Concept local + global views giữ nguyên, chỉ thay đổi số tokens
10.5 Tổng Kết: Paradigm Shift Hay Incremental?
Theo tôi, đây là paradigm shift, không phải incremental improvement:
- V1 coi ảnh như sequence cố định cần nén → approach giống image compression
- V2 coi ảnh như document cần đọc hiểu → approach giống reading comprehension
Sự thay đổi từ "nén rồi gửi" sang "đọc, hiểu, sắp xếp, rồi gửi" là thay đổi về mặt tư duy, không chỉ kỹ thuật. Và kết quả benchmark confirm rằng tư duy này đúng - đặc biệt ở metric R-order_Edit, chính xác là thứ mà Visual Causal Flow được thiết kế để cải thiện.
11. Discussion và Future Work

Paper kết thúc với Table 4 (so sánh production performance giữa DeepSeek-OCR và DeepSeek-OCR 2) cùng 2 hướng phát triển tương lai. Bảng Table 4 cho thấy DeepSeek-OCR 2 vượt trội ở repetition rate (tỷ lệ lặp text giảm) - đây là vấn đề phổ biến ở các OCR model khi gặp tài liệu dài. Paper giải thích rằng causal flow giúp model "nhớ" đã đọc gì rồi, tránh đọc lại cùng một chỗ.
Tôi thấy 2 hướng future work đặc biệt thú vị:
11.1 Towards Genuine 2D Reasoning
Từ paper:
"Decomposing 2D understanding into two complementary/orthogonal 1D causal reasoning subtasks may represent a breakthrough toward genuine 2D reasoning."

- Encoder: reading logic reasoning (reorder visual tokens)
- Decoder: visual task reasoning (generate text)
Insight mà tôi thấy khả thi nhất:
Thay vì cố gắng giải quyết 2D reasoning trực tiếp (rất khó), paper chia thành 2 subtask 1D causal:
1. Encoder reorders: "Nên đọc phần nào trước?"
2. Decoder generates: "Nội dung là gì?"
Tại sao tôi thấy idea này hay? Vì ảnh 2D vốn không có thứ tự tự nhiên - khác với text vốn đọc từ trái sang phải. Mọi cách flatten ảnh thành 1D (raster-scan, spiral, zigzag...) đều là arbitrary. Nhưng paper này nói: thay vì chọn 1 thứ tự cố định, hãy để model tự học thứ tự. Và cách để "tự học" là dùng causal attention - bắt queries phải quyết định tuần tự "đọc phần nào tiếp". Đây không chỉ là trick cho OCR - tôi nghĩ approach này có thể apply cho bất kỳ bài toán nào cần hiểu layout 2D: đọc bản vẽ kỹ thuật, phân tích dashboard, hay thậm chí hiểu comic/manga (đọc panel theo thứ tự nào).
Paper cũng thừa nhận rằng mục tiêu cuối cùng - genuine 2D reasoning (hiểu ảnh thực sự theo 2 chiều, không chỉ flatten thành 1D) - vẫn còn xa. Nhưng cascade 2 lần 1D causal có thể là bước đệm tốt.
11.2 Towards Native Multimodality
DeepEncoder V2 có potential trở thành unified omni-modal encoder - đây là hướng tôi thấy cũng rất thú vị:

Key design principles:
- Single encoder với shared $W_k, W_v$ projections
- Modality-specific learnable query embeddings cho mỗi loại input
- Mỗi modality có tokenizer riêng nhưng share encoder weights
- Output: unified semantic representation space
Ý tưởng ở đây rất tự nhiên: nếu learnable queries có thể học cách "đọc" visual tokens theo semantic order, thì tại sao không tạo thêm các bộ queries riêng cho audio, text? Mỗi modality có tokenizer riêng (SAM cho ảnh, whisper-style cho audio, text embeddings cho văn bản), nhưng tất cả đều đi qua cùng một encoder với shared $W_k, W_v$. Chỉ khác ở query embeddings - mỗi modality có bộ queries riêng, học cách "hỏi" thông tin phù hợp với loại dữ liệu đó.
Tôi thấy điểm mạnh của thiết kế này là không cần train lại encoder khi thêm modality mới - chỉ cần thêm 1 tokenizer và 1 bộ query embeddings. Nếu thực sự hoạt động, đây sẽ là con đường tiết kiệm nhất để đi đến omni-modal AI.
Potential applications mà tôi thấy khả thi:
1. Text compression: Compress long documents thành fewer tokens - hữu ích cho context window hạn chế của LLMs
2. Speech features: Extract audio features với speech-specific queries - thay thế pipeline ASR truyền thống
3. Visual reorganization: Current use case (OCR)
4. Cross-modal understanding: Combined image+audio+text reasoning - ví dụ hiểu video lecture (slide + giọng nói + subtitle)
12. Vậy tóm lại thì
Sau khi đọc paper và tự thực nghiệm, tôi đánh giá DeepSeek-OCR 2 với Visual Causal Flow là một bước tiến quan trọng trong OCR và vision-language models.
Key takeaways của tôi:
- Mixed attention (non-causal cho images, causal cho queries) là thiết kế rất thông minh - cho phép visual tokens interact tự do trong khi vẫn maintain causal structure cho semantic reordering
- Learned query embeddings đóng vai trò "hỏi" visual features và tái cấu trúc thông tin theo semantic order - số queries bằng số visual tokens để có đủ capacity cho re-fixation
- Two-cascaded 1D causal reasoning có thể là approach hiệu quả cho 2D image understanding - đây là contribution lớn nhất của paper theo tôi
- Practical performance: +3.73% trên OmniDocBench với fewer visual tokens (1120 vs >6000 của nhiều models khác)
- Hạn chế thực tế: Với tiếng Việt và dữ liệu ngoài domain (bia đá, chữ viết tay), model vẫn còn yếu. Tôi nghĩ cần thêm fine-tuning trên data tiếng Việt.
References
- Wei, H., Sun, Y., Li, Y. (2026). DeepSeek-OCR 2: Visual Causal Flow. arXiv:2601.20552
- Wei, H., Sun, Y., Li, Y. (2025). DeepSeek-OCR: Contexts Optical Compression. arXiv:2510.18234
- Kirillov, A., et al. (2023). Segment Anything. ICCV 2023.
- Carion, N., et al. (2020). End-to-end Object Detection with Transformers (DETR). ECCV 2020.
- Li, J., et al. (2023). BLIP-2: Bootstrapping Language-Image Pre-training. ICML 2023.
Phân tích và thực nghiệm được chắp bút bởi Binh Nguyen, 2026.
Code và experiments: GitHub





