Vision Transformer (ViT)
Vision Transformer (ViT) chia hình ảnh thành các patch và liên kết chúng bằng self-attention. Bài viết trình bày kiến trúc, các biến thể và ưu nhược điểm so với CNN.
Vision Transformer (ViT) là mạng nơ-ron áp dụng kiến trúc Transformer từ mô hình hóa ngôn ngữ cho ảnh. ViT chia ảnh thành các mảnh kích thước cố định, chuyển mỗi mảnh thành embedding token, rồi xử lý chuỗi bằng self-attention, nhờ đó ngay từ lớp đầu tiên, mỗi mảnh đều có thể khai thác thông tin từ mọi mảnh khác. Các nhà nghiên cứu Google giới thiệu kiến trúc này trong bài báo “An Image is Worth 16x16 Words”, cho thấy Transformer thuần túy không có lớp tích chập có thể đạt kết quả ngang mạng nơ-ron tích chập (CNN) tiên tiến nhất về phân loại ảnh khi được tiền huấn luyện trên đủ dữ liệu. Hiện nay, ViT được dùng làm encoder ảnh cho model thị giác-ngôn ngữ, model nền tảng phân đoạn và backbone tự giám sát.
Cách thức hoạt động của Vision Transformer#
ViT chuyển ảnh thành chuỗi rồi xử lý chuỗi đó như văn bản. Các bước dưới đây dùng ViT-Base/16 trên ảnh 224×224:
- Tạo embedding cho patch: Ảnh được chia thành các patch 16×16 pixel, tạo thành lưới 14×14 gồm 196 patch. Mỗi patch được làm phẳng rồi nhân với một ma trận đã học để tạo thành một embedding có 768 chiều; thao tác này thường được triển khai dưới dạng phép tích chập 16×16 với stride 16.
- Token lớp và embedding vị trí: Một token lớp có thể học được được đặt ở đầu chuỗi, còn embedding vị trí có thể học được được cộng vào mọi token. Bản thân attention bỏ qua thứ tự, nên các embedding này là nguồn thông tin duy nhất về vị trí xuất phát của từng mảnh ảnh.
- Encoder Transformer: Một chồng các khối giống hệt nhau, gồm 12 khối trong ViT-Base, lần lượt áp dụng self-attention nhiều đầu để kết hợp thông tin giữa mọi token và MLP hai lớp dùng activation GELU để biến đổi riêng từng token. Chuẩn hóa lớp đứng trước mỗi lớp con, còn một kết nối dư bao quanh lớp con đó.
- Head: Đầu ra cuối cùng của token lớp được đưa vào bộ phân loại tuyến tính. Các tác vụ dày đặc như phân đoạn sử dụng token mảnh ảnh thay vào đó, rồi định hình lại thành lưới 14×14.
Đoạn mã PyTorch dưới đây tạo chuỗi token cho một ảnh và đưa chuỗi qua một khối encoder duy nhất.
import torch
from torch import nn
# Cấu hình ViT-Base/16: mảnh 16x16, token 768 chiều, 12 đầu attention
image = torch.randn(1, 3, 224, 224)
patch_embed = nn.Conv2d(3, 768, kernel_size=16, stride=16) # mỗi mảnh có một phép chiếu tuyến tính
# Chia ảnh thành lưới mảnh 14x14 rồi trải phẳng thành 196 token
tokens = patch_embed(image).flatten(2).transpose(1, 2)
# Thêm token lớp có thể học được vào đầu chuỗi và thêm embedding vị trí có thể học được
cls_token = nn.Parameter(torch.zeros(1, 1, 768))
pos_embed = nn.Parameter(torch.zeros(1, 197, 768))
tokens = torch.cat([cls_token, tokens], dim=1) + pos_embed
# Một khối encoder chuẩn hóa trước, trong đó mỗi token tập trung vào mọi token khác
block = nn.TransformerEncoderLayer(
d_model=768, nhead=12, dim_feedforward=3072, activation="gelu", batch_first=True, norm_first=True
)
print(block(tokens).shape)Đoạn mã in torch.Size([1, 197, 768]): 196 token mảnh ảnh cùng token lớp, mỗi token vẫn có 768 chiều, sẵn sàng cho khối tiếp theo trong 12 khối của ViT-Base.
Kích thước và biến thể model#
Tên ViT cho biết kích thước model và kích thước mảnh ảnh: ViT-B/16 là model Base 86 triệu tham số dùng mảnh 16×16; model Large và Huge có lần lượt 307 triệu và 632 triệu tham số. Mảnh nhỏ hơn tạo ra nhiều token hơn, giúp cải thiện độ chi tiết với chi phí tính toán cao hơn. Một số biến thể thay đổi cách huấn luyện hoặc cấu trúc ViT:
- DeiT: Quy trình huấn luyện dùng tăng cường mạnh và token chưng cất, giúp huấn luyện ViT có năng lực cạnh tranh chỉ trên ImageNet-1k mà không cần thêm dữ liệu tiền huấn luyện.
- Swin Transformer: Tính attention bên trong các cửa sổ cục bộ dịch chuyển và gộp các mảnh ảnh giữa những giai đoạn, tạo ra cấu trúc phân cấp giống CNN, phù hợp với phát hiện và phân đoạn.
- Autoencoder che khuất (MAE) và DINOv2: Các phương pháp tự giám sát tiền huấn luyện ViT trên ảnh không nhãn: MAE tái tạo các mảnh bị che khuất, còn DINOv2 khớp đầu ra của mạng teacher.
- CLIP và SigLIP: Encoder ảnh ViT được huấn luyện để khớp ảnh với chú thích, được tái sử dụng rộng rãi làm tháp thị giác trong các model đa phương thức.
Ứng dụng#
- Model thị giác-ngôn ngữ: Encoder ViT chuyển ảnh thành chuỗi token để model ngôn ngữ lớn xử lý cùng với văn bản, cho phép tạo chú thích và trả lời câu hỏi bằng hình ảnh.
- Dự đoán dày đặc: Token mảnh ảnh từ backbone ViT hỗ trợ phân đoạn ảnh và ước lượng độ sâu, trong đó mỗi pixel đầu ra cần ngữ cảnh từ những vùng cách xa trong ảnh.
- Hiểu video: ViT video chia clip thành các mảnh không-thời gian; các model video tự giám sát như V-JEPA học đặc trưng chuyển động và diện mạo từ video chưa gắn nhãn cho các tác vụ như nhận dạng hành động.
Vision Transformer và CNN#
CNN tích hợp hai giả định vào mọi lớp: tính cục bộ vì mỗi bộ lọc chỉ nhìn thấy một vùng lân cận nhỏ, và tính tương đương tịnh tiến vì cùng một bộ lọc được áp dụng tại mọi vị trí. Ngoài lưới mảnh ảnh, ViT phải học cấu trúc không gian từ dữ liệu. Trong bài báo gốc, ViT chỉ huấn luyện trên ImageNet (1,3 triệu ảnh) đạt điểm thấp hơn vài điểm phần trăm so với ResNet có kích thước tương đương; tiền huấn luyện trên tập dữ liệu JFT-300M gồm 300 triệu ảnh giúp ViT-H/14 đạt độ chính xác top-1 88,55% trên ImageNet. Chi phí là điểm khác biệt còn lại. Self-attention so sánh mọi token với mọi token khác, vì vậy tăng gấp đôi chiều dài cạnh ảnh khiến số token tăng gấp bốn và chi phí attention tăng gấp 16. Flash attention giảm lưu lượng bộ nhớ của phép tính này, còn attention theo cửa sổ giới hạn chính số phép so sánh. Ultralytics chạy Segment Anything Model của Meta; checkpoint sam_b.pt mã hóa mỗi ảnh 1024×1024 bằng backbone ViT-B: các mảnh 16×16 tạo thành lưới 64×64 gồm 4.096 token, vì vậy 8 trong 12 khối chỉ attention bên trong cửa sổ 14×14, còn 4 khối dùng attention toàn cục.










