Chuyển đến nội dung chính

Hướng dẫn Vision Transformers (ViT): Kiến trúc và Ví dụ Mã

Tìm hiểu cách Vision Transformers (ViT) tận dụng patch embeddings và self-attention để vượt CNN trong phân loại ảnh hiện đại. Hướng dẫn chuyên sâu này phân tích kiến trúc ViT, cung cấp mã Python theo từng bước và chỉ ra khi nào nên chọn ViT cho các dự án thị giác máy tính thực tế.
· 15 phút đọc

Khám phá cùng AI

Ai cũng biết Transformers đã trở thành nền tảng trong xử lý ngôn ngữ tự nhiên và hiện đang dần chiếm lĩnh thị giác máy tính. Vision Transformers (ViT) mang đến một cách tiếp cận mới để hiểu ảnh bằng cách áp dụng các nguyên lý giống với mô hình xử lý văn bản; Mô hình ngôn ngữ lớn.

ViT lần đầu được giới thiệu vào năm 2020 bởi Google Research trong bài báo “An Image is Worth 16×16 Words,” cho thấy transformers được huấn luyện trên các bộ dữ liệu ảnh lớn có thể sánh ngang hoặc vượt CNN. Kể từ đó, các biến thể thực tiễn như DeiT và Swin đã mở rộng phạm vi ứng dụng trên nhiều tác vụ thị giác.

Trong hướng dẫn này, tôi sẽ dẫn bạn qua các khái niệm cốt lõi, các thành phần kiến trúc và ứng dụng thực tiễn của vision transformers (biến thể gốc/vanilla). Cuối cùng, chúng ta sẽ không chỉ hiểu ViT hoạt động thế nào mà còn biết cách triển khai cho các dự án thị giác máy tính của riêng mình. Tôi cũng khuyến nghị xem thêm bài hướng dẫn về multi-head attention.  

Vision Transformer (ViT) là gì?

Hãy bắt đầu bằng cách giới thiệu nhẹ nhàng về vision transformers. 

Các mô hình này coi một bức ảnh như một chuỗi dữ liệu, tương tự cách mô hình ngôn ngữ xử lý các từ trong câu. Ảnh được chia thành các mảnh (patch) kích thước cố định, mỗi mảnh được làm phẳng và nhúng thành một vector. 

Các vector này sau đó được đưa qua bộ mã hoá (encoder) transformer tiêu chuẩn, mô hình hoá quan hệ giữa các mảnh một cách toàn cục bằng cơ chế attention. 

So sánh với mạng nơ-ron tích chập

Điều này khác biệt một cách căn bản so với mạng nơ-ron tích chập (CNN), vốn tập trung vào đặc trưng cục bộ và dựa vào trích xuất đặc trưng theo thứ bậc.

Nhân nói về CNN, hãy cùng bàn về những khác biệt giữa chúng và ViT:

Tính năng

Convolutional Neural Networks (CNNs)

Vision Transformers (ViT)

Kiến trúc

Dùng lớp Tích chập + Gộp (Pooling)

Dùng Bộ mã hoá Transformer với Self-Attention

Trường tiếp nhận (Receptive Field)

Cục bộ, nhưng mở rộng theo độ sâu

Toàn cục ngay từ đầu

Nhận thức vị trí

Ngầm thông qua cấu trúc

Tường minh qua mã hoá vị trí

Yêu cầu dữ liệu

Hiệu quả với bộ dữ liệu nhỏ

Cần bộ dữ liệu quy mô lớn

Thiên kiến quy nạp (Inductive Bias)

Mạnh

Tối thiểu nhưng linh hoạt hơn

Tiềm năng song song hoá

Trung bình

Rất cao

Khả năng mở rộng mô hình

Khó mở rộng lên mô hình rất lớn

Mở rộng rất tốt

Dễ diễn giải

Qua các lớp pooling nhưng vẫn khó.

Có thể tăng cường bằng trực quan hoá attention nhưng cũng khá khó

Rõ ràng chúng ta chưa đi sâu hết về vision transformers, nhưng sẽ hữu ích khi điểm qua vài khái niệm có thể chưa rõ ngay từ đầu. 

Ví dụ, inductive bias và trường tiếp nhận là các thuật ngữ quan trọng nhưng có thể bạn chưa từng nghe. 

Giải thích về inductive bias

Inductive Bias là các giả định mà mô hình đưa ra để giúp nó học từ dữ liệu. Nghe có vẻ mơ hồ nhưng sẽ hợp lý hơn qua phép ẩn dụ sau.

Hãy tưởng tượng chúng ta đang ghép một bức tranh xếp hình. Ta cho rằng các mảnh sẽ khớp dựa trên hình dạng và màu sắc. Giả định này giúp ghép nhanh hơn. CNN hoạt động theo cách này. 

Mô hình đưa ra phỏng đoán thông minh rằng các phần gần nhau trong ảnh có liên quan, giống như các mảnh ghép kề nhau thường thuộc cùng một vùng của bức tranh. Nó cũng giả định rằng nếu ta di chuyển một hình dạng, thì nó vẫn là hình dạng đó. Những phỏng đoán hữu ích này được gọi là inductive bias mạnh.

Giờ hãy tưởng tượng ta có một đống mảnh ghép mà không biết bức tranh hoàn chỉnh trông thế nào. Ta cũng không biết nên dựa vào hình dạng, màu sắc hay thứ gì khác. Vậy ta thử mọi cách và dần dần rút ra điều hiệu quả.

Đó là điều một mô hình Transformer làm. Nó không đưa ra giả định mạnh. Nó học mẫu bằng cách quan sát rất nhiều dữ liệu. Điều này gọi là inductive bias tối thiểu. Mô hình tự do hơn nhưng cần nhiều dữ liệu và thời gian để học.

Giải thích về trường tiếp nhận

Hình trên cho thấy cách trường tiếp nhận của CNN thay đổi. Hãy nhớ rằng CNN có nhiều lớp tích chập, nên càng đi sâu, mỗi nơ-ron bị ảnh hưởng bởi vùng đầu vào ngày càng lớn. 

Sự mở rộng trường tiếp nhận này cho phép các lớp sâu hơn phát hiện đặc trưng phức tạp và toàn cục hơn, như trong hình (từ tai đến mặt rồi cả con chó). 

Điều này khác khá nhiều so với trường tiếp nhận của Vision Transformer:

Receptive Field of Vision Transformer - Image by Author.

Trong minh hoạ trên, trường tiếp nhận ở ViT (vanilla) là toàn cục, nên mọi mảnh đều chú ý lẫn nhau với mức độ khác nhau (độ dày mũi tên thể hiện cường độ). 

Để đơn giản, tôi minh hoạ mảnh (tô màu xanh lá) được các mảnh khác chú ý tới, nhưng thực tế tất cả các mảnh sẽ chú ý lẫn nhau (vẽ ra sẽ rất rối!)

Khi nào dùng CNN và khi nào dùng vision transformer

Hiểu khi nào nên dùng CNN hay vision transformer rất quan trọng để đưa ra lựa chọn kiến trúc hiệu quả cho quy trình thị giác máy tính. 

Cả hai mô hình đều có điểm mạnh (và yếu!), nhưng sẽ nổi trội trong các điều kiện khác nhau tuỳ vào quy mô dữ liệu, tài nguyên tính toán và độ phức tạp của mẫu thị giác mà ta muốn mô hình hoá.

Tôi thường tham chiếu những điểm sau khi lựa chọn giữa chúng:

Bạn nên dùng CNN khi:

  1. Làm việc với dữ liệu hạn chế - Chúng ta đã nói CNN có inductive bias mạnh như tính địa phương, giúp tổng quát hoá tốt ngay cả với bộ dữ liệu nhỏ. Điều này khiến CNN là lựa chọn đáng tin cậy khi khó thu thập lượng lớn dữ liệu gán nhãn.
  2. Cần hiệu năng thời gian thực - CNN thường có độ trễ suy luận thấp hơn và hiệu quả tính toán hơn trên phần cứng tiêu chuẩn, đặc biệt là thiết bị di động và biên. Kiến trúc của chúng tối ưu cho hiệu năng với ít tham số và ít bộ nhớ hơn.
  3. Ngân sách tính toán hạn chế - Huấn luyện CNN từ đầu hoặc fine-tune mô hình pretrained cần ít tài nguyên hơn đáng kể so với ViT. Ta có thể huấn luyện một CNN ổn với một GPU và bộ nhớ vừa phải, điều không phải lúc nào cũng đúng với các mô hình dựa trên transformer.

Bạn nên dùng Vision Transformer khi:

  1. Có sẵn bộ dữ liệu gán nhãn quy mô lớn và hạ tầng tính toán mạnh - Như đã đề cập trong bảng so sánh, vision transformer “háu dữ liệu” và cần nhiều thời gian, bộ nhớ để huấn luyện, nhất là ở dạng vanilla. Với đủ dữ liệu và tính toán, chúng có thể vượt CNN ở nhiều thước đo.
  2. Cần nắm bắt quan hệ không gian tầm xa - Không như CNN xử lý cục bộ (nhớ phần trường tiếp nhận), ViT dùng self-attention để mô hình hoá quan hệ giữa mọi mảnh ảnh, đặc biệt hữu ích khi ngữ cảnh không gian trên toàn ảnh là quan trọng.
  3. Muốn dùng mô hình pretrained và học chuyển giao - Ta có thể truy cập ViT pretrained (như qua HuggingFace hoặc timm) nên fine-tuning trở nên thực tế hơn. Khi đó, kể cả bộ dữ liệu tầm trung cũng có thể cho kết quả rất tốt mà không cần huấn luyện từ đầu.

Tóm lại, nếu bạn đang ở môi trường tài nguyên hạn chế hoặc cần kết quả nhanh, ổn định với dữ liệu ít, CNN là lựa chọn an toàn và hiệu quả hơn. 

Ngược lại, nếu dự án của bạn đòi hỏi lý luận toàn cục sâu trên không gian thị giác và có đủ năng lực tính toán, vision transformer là lựa chọn tốt hơn. 

Các thành phần của Vision Transformer

Giờ hãy đi vào kiến trúc thực tế của Vision Transformer. Vì có nhiều giai đoạn (cụ thể là năm), ta sẽ khám phá từng giai đoạn. 

Giai đoạn 1: Chia ảnh thành mảnh (patching)

Đây là bước biến đổi đầu tiên, nơi ta chuyển ảnh sang dạng mà transformer có thể hiểu.

Giả sử ta có ảnh 224x224. Thay vì đưa nguyên ảnh vào, ta chia nó thành các mảnh vuông kích thước cố định. Nếu mỗi mảnh là 16x16 (như đề xuất trong bài báo gốc), ảnh sẽ được chia thành 14×14 = 196 mảnh, vì (224/16 =14).

Cách dễ hiểu là tưởng tượng cắt một bức ảnh thành các ô vuông bằng nhau. Mỗi mảnh chứa thông tin cục bộ và đóng vai trò như một “từ” trong câu.

Trong minh hoạ trên, bạn thấy ảnh con sói được chia thành các mảnh vuông (bằng nhau) — chính xác là 196 mảnh.

Bạn có thể có một câu hỏi:

“Ảnh là RGB, vậy chuyện gì xảy ra với 3 kênh màu?”

Điểm quan trọng là mỗi mảnh thực chất là một khối dữ liệu, trong trường hợp này có kích thước 16x16x3. 16x16 là chiều cao và rộng, 3 là các kênh màu, khiến mỗi mảnh là một tensor 3 chiều. 

Nhờ vậy, mỗi mảnh là một biểu diễn gọn của thông tin cả về không gian lẫn màu sắc từ một vùng cục bộ của ảnh.

Việc chia mảnh này chuyển cấu trúc không gian 2D của ảnh thành một chuỗi 1D của dữ liệu đa chiều, phù hợp với mô hình transformer.

Giai đoạn 2: Nhúng mảnh (patch embedding)

Tiếp theo, ta cần biến mỗi mảnh ảnh thành biểu diễn số mà transformer có thể sử dụng.

Mỗi mảnh RGB 16x16 được làm phẳng (flatten) thành một vector. Trong ví dụ này, 16×16×3 = 768 giá trị. Về cơ bản, ta “trải” toàn bộ giá trị điểm ảnh và màu thành một dãy số.

Các vector thô này tuy giàu thông tin nhưng chưa ở không gian phù hợp để học. Vì vậy ta đưa mỗi vector qua một lớp chiếu tuyến tính có thể huấn luyện. Hãy hình dung như một dense layer ánh xạ đầu vào 768 chiều sang không gian embedding mới kích thước D (thường cũng là 768, nhưng không bắt buộc).

Tại sao?

Vì phép chiếu này giúp căn chỉnh mọi token mảnh vào một định dạng có thể học thống nhất mà bộ mã hoá transformer mong đợi. Đến điểm này, ta đã có một chuỗi các vector độ dài cố định, trong đó mỗi vector đại diện cho một mảnh ảnh.

Toàn bộ quá trình này chuyển các mảnh giàu thông tin không gian và màu sắc thành một chuỗi “token” thống nhất (tương tự word embedding trong NLP), cho phép transformer coi ảnh như một chuỗi có cấu trúc gồm các thực thể có thể học.

Giai đoạn 3: Mã hoá vị trí (positional encoding)

Còn một việc trước khi đưa các token này vào encoder. Bạn có thể đoán ra nếu đã học về LLM!

Transformers vốn dĩ không nhận biết vị trí.

Chúng coi chuỗi đầu vào như một tập hợp không có thứ tự, nghĩa là không có cơ chế tích hợp để hiểu thứ tự hay vị trí của token. Đây là vấn đề lớn trong phân tích ảnh, nơi cấu trúc và bố cục không gian đều rất quan trọng!

Hãy bàn kỹ hơn. 

Trong ngữ cảnh ảnh, mỗi mảnh đại diện cho một vùng cụ thể của ảnh gốc. Nếu ta đưa vào mô hình một chuỗi embedding mảnh mà không chỉ ra nguồn gốc từng mảnh, mô hình sẽ không biết mảnh đó đến từ góc trên-trái hay dưới-phải. 

Thiếu nhận thức không gian sẽ hạn chế khả năng hiểu mẫu, hình dạng, cấu trúc, v.v.

Để giải quyết, ta thêm positional encoding vào mỗi embedding mảnh. Đây là một vector như “thẻ không gian”; mã hoá vị trí gốc của mảnh trong ảnh. Các vector vị trí này được cộng trực tiếp vào embedding mảnh trước khi chuỗi đi vào transformer.

Có hai dạng positional encoding phổ biến:

  • Cố định (hình sin): Dùng hàm sin và cos ở các tần số khác nhau để mã hoá vị trí. Tính quyết định và không cần học. Đây cũng là cách trong bài “Attention is all you need”.
  • Học được: Là các tham số có thể học trong quá trình huấn luyện. Mỗi vị trí trong chuỗi có một vector học riêng.

Nếu bạn đang bối rối, hãy nghĩ positional encoding như toạ độ GPS cho các mảnh. 

Chúng cho transformer biết vị trí gốc của token. Nhờ thông tin này, cơ chế self-attention có thể mô hình hoá cả nội dung của mỗi mảnh và vị trí tương đối hay tuyệt đối của nó trong ảnh.

Bước này là then chốt — thiếu nó, Vision Transformer sẽ không thể tái dựng cấu trúc ảnh, dù cơ chế attention có mạnh đến đâu.

Giai đoạn 4: Khối mã hoá Transformer

Giờ ta đến nơi diễn ra học sâu — khám phá mẫu, mô hình hoá ngữ cảnh và trộn trộn đặc trưng.

Có nhiều khối Encoder như vậy xếp chồng để tạo thành toàn bộ Encoder của Vision Transformer. Hãy xem mỗi khối gồm những gì:

  • Multi-head self-attention (MHSA): Cơ chế cho phép mỗi mảnh tương tác với mọi mảnh khác. Nó giúp mô hình xác định những phần nào của ảnh liên quan nhất với nhau.
    • Thay vì nhìn mảnh đơn lẻ, MHSA cung cấp ngữ cảnh toàn cục.
    • Nhiều “đầu” attention nhìn vào các khía cạnh khác nhau của quan hệ, mang lại diễn giải phong phú hơn. 
  • Mạng nơ-ron truyền thẳng (FFN): Một MLP nhỏ xử lý từng token độc lập sau khi attention. Lý do là để tăng khả năng học các mẫu phi tuyến, phức tạp.
  • Kết nối tàn dư và chuẩn hoá lớp: Ổn định quá trình huấn luyện và giúp gradient lan truyền tốt hơn.

Tổng thể, các khối encoder được xếp theo tầng (ví dụ, 12 tầng ở ViT-Base), với mỗi tầng học biểu diễn ảnh sâu hơn.

Giai đoạn 5: Token phân loại và đầu MLP

Gần xong rồi! Giờ chuyển sang giai đoạn cuối của ViT (vanilla). 

Sau tất cả các tầng encoder, ta cần cách để tóm lược thông tin và đưa ra dự đoán.

Vì vậy, ta đưa vào một token [CLS] đặc biệt ở đầu chuỗi mảnh. Đây là một embedding có thể học, tương tác với mọi token khác trong quá trình mã hoá.

Khi đi qua các tầng transformer, nó thu thập thông tin toàn cục. Cuối cùng, ta trích token này và đưa qua đầu multilayer perceptron (MLP) khác, thường là vài lớp dense theo sau softmax (cho phân loại).

Bước cuối này cho ta nhãn dự đoán, như “ảnh này là chó” dựa trên thông tin được [CLS] thu thập. Lưu ý rất quan trọng: chỉ token [CLS] được gửi vào đầu MLP cuối cùng và được dùng để phân loại, không phải các token khác!

Các kiến trúc Vision Transformer đáng chú ý

Giờ hãy xem một số kiến trúc Vision Transformer mang tính cách mạng. 

  • ViT (Google Brain) - Vision transformer nguyên bản (và là mô hình ta theo suốt bài) giới thiệu mô hình transformer dựa trên mảnh cho phân loại ảnh dùng các bộ dữ liệu lớn như ImageNet-21k. 
  • DeiT (Data-efficient image Transformer) - Do Facebook AI giới thiệu, DeiT cải thiện hiệu quả dữ liệu nhờ kỹ thuật tri nhận tri thức (knowledge distillation), cho phép huấn luyện trên bộ dữ liệu nhỏ hơn.
  • Swin Transformer - Dùng kiến trúc phân cấp và cửa sổ dịch chuyển để giảm tính toán trong khi vẫn giữ độ chính xác. Đặc biệt hiệu quả ở các tác vụ dự đoán dày đặc như phát hiện vật thể.
  • Biến thể khác - Các mô hình như BEiT, CvT, và MobileViT tích hợp nhiều cải tiến thiết kế để nâng cao hiệu quả huấn luyện, độ gọn mô hình, hoặc tốc độ suy luận.

Sử dụng Vision Transformer đã huấn luyện sẵn 

Phần lớn thời gian, ta sẽ không huấn luyện ViT từ đầu! Hãy xem cách dùng mô hình ViT pretrained từ các thư viện học sâu phổ biến.

Thư viện HuggingFace Transformers

Một cách dễ và đáng tin cậy để dùng vision transformer là qua thư viện Hugging Face Transformers. Thư viện cung cấp các ViT pretrained sẵn dùng chỉ với vài dòng mã. 

Tôi đã viết một đoạn mã để tải và dùng mô hình ViT Base gốc:

# Imports neededfrom transformers import ViTImageProcessor, ViTForImageClassificationfrom PIL import Imageimport torchimport requests# Here I am loading and preprocessing an image - but you can use any image of your choiceimage = Image.open(requests.get(https://huggingface.co/datasets/huggingface/cats-image?image-viewer=ED6CB286C90CF5F1FAF278077DF091477DF05416', stream=True).raw)# Here, we load and process the ViT modelprocessor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')# Preprocessing the image so it gets it into the necessary formatinputs = processor(images=image, return_tensors='pt')# Forward pass - with no backpropagationwith torch.no_grad():    outputs = model(**inputs)# Here we get the predicted labels (since we are performing classification)logits = outputs.logits	predicted_class = logits.argmax(-1) # Selects the index of the class with the highest logit score (highest predicted probability)print(f("Predicted class index: {predicted_class.item()}"))

Hãy bàn sâu hơn về đoạn mã này. Đầu tiên, bạn có thể thắc mắc vì sao phải tải hai thành phần riêng. Chúng là riêng biệt nhưng bổ trợ cho nhau:

  1. ViTImageProcessor – Chịu trách nhiệm tiền xử lý ảnh trước khi đưa vào mô hình. Nó xử lý thay đổi kích thước, chuẩn hoá và chuyển ảnh sang định dạng mà vision transformer mong đợi. Hãy coi đây là tương đương với tokenizer trong NLP nhưng cho thị giác!
  2. ViTForImageClassification – Đây là mô hình thực hiện suy luận. Nó kỳ vọng đầu vào ở định dạng tensor cụ thể và xuất ra dự đoán (ví dụ: logits hoặc xác suất lớp).

Một thắc mắc khác có thể là về output.logits và cụ thể hơn, logits là gì. 

Trong các mô hình học máy — đặc biệt là mô hình phân loại — logits là các giá trị đầu ra thô từ lớp cuối trước khi áp dụng hàm kích hoạt như softmax. Chúng biểu diễn điểm số chưa chuẩn hoá cho mỗi lớp.

Bạn có thể coi đó là mức độ tự tin nội bộ của mô hình cho từng lớp. Các giá trị này có thể dương hoặc âm và không bị ràng buộc tổng bằng một.

Để chuyển logits thành xác suất, ta áp dụng hàm softmax, hàm sẽ chuẩn hoá thành một phân phối xác suất.

Vậy nên, khi dùng argmax(logits, -1), ta chỉ đơn giản chọn chỉ số (lớp) có điểm thô cao nhất, thường tương đương với lớp có xác suất cao nhất sau softmax.

Dùng thư viện timm

Một thư viện tuyệt vời và nổi tiếng khác để dùng vision transformer là timm (bởi Ross Wightman). Thư viện cũng cung cấp nhiều biến thể ViT pretrained và rất phù hợp cho thử nghiệm nhanh hoặc fine-tuning. Sau đây là cách tải và dùng ViT để suy luận:

# Relevant importsimport timmimport torchfrom torchvision import transformsfrom PIL import Imageimport requests# Loading an imageurl = 'https://huggingface.co/datasets/huggingface/cats-image?image-viewer=ED6CB286C90CF5F1FAF278077DF091477DF05416'image = Image.open(requests.get(url, stream=True).raw)# Here we have defined the transformation we are going to do on the imagetransform = transforms.Compose([    transforms.Resize((224, 224)),    transforms.ToTensor(),    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])])image_tensor = transform(image).unsqueeze(0)  # Adding batch dimension# Loading the ViT modelmodel = timm.create_model('vit_base_patch16_224', pretrained=True)model.eval() # Setting it to evaluation mode# Inference componentwith torch.no_grad():    outputs = model(image_tensor)    predicted_class = outputs.argmax(dim=1) # Obtaining the class with the highest probabilityprint(f("Predicted class index: {predicted_class.item()}"))

Bạn sẽ thấy sự tương đồng giữa timm và thư viện transformers. Cả hai đều cung cấp ViT pretrained, cho phép xử lý ảnh (mặc dù với timm ta dùng mã PyTorch tiêu chuẩn), và cuối cùng, ta thu được lớp có logit cao nhất.

Kết luận

Tổng quan, vision transformer đã tái định hình thị giác máy tính bằng cách biến ảnh thành “câu” gồm các mảnh và dùng self-attention để nắm bắt ngữ cảnh toàn cục ngay từ tầng đầu. Trong hướng dẫn này, chúng ta đã học về:

  1. Vì sao ViT khác CNN – inductive bias tối thiểu, trường tiếp nhận toàn cục, khả năng mở rộng lớn, v.v.
  2. Khi nào chọn mỗi mô hình – CNN vượt trội khi dữ liệu hạn chế và yêu cầu độ trễ chặt chẽ, còn ViT phù hợp khi có nhiều dữ liệu và phần cứng mạnh.
  3. Kiến trúc ViT nền tảng – Ta đã bao quát các giai đoạn từ chia mảnh, mã hoá vị trí học được, đến multi-head self-attention, đường tàn dư và token [CLS] cho phân loại.
  4. Triển khai thực tiễn – Cách tải mô hình pretrained từ các thư viện khác nhau — Hugging Face hoặc timm, tiền xử lý ảnh và trích xuất dự đoán.

Để tiếp tục học, tôi khuyên bạn xem bài viết Cách Transformer hoạt động, giúp bạn nắm lý thuyết nền tảng. Sau đó, hãy khám phá cách tự xây một transformer từ đầu.  

Nếu bạn muốn học cả hai đồng thời với trải nghiệm thực hành, thì khoá học Transformer Models with PyTorch của chúng tôi là nơi dành cho bạn.

Câu hỏi thường gặp về Vision Transformer

Vì sao ViT chặt ảnh thành các mảnh 16 × 16 thay vì đọc pixel thô?

Việc chia mảnh biến ảnh 2D thành một “câu” 1D gồm các token, cho phép transformer áp dụng cùng các thủ thuật self-attention vốn làm nên sức mạnh của mô hình ngôn ngữ.

ViT có luôn cần hàng triệu ảnh để hoạt động tốt không?

Không phải lúc nào cũng vậy, ta có thể bắt đầu từ một ViT pretrained và fine-tune. Khi đó, vài nghìn ảnh gán nhãn thường đã đủ để có kết quả mạnh.

ViT “biết” mỗi mảnh đến từ đâu bằng cách nào?

Chúng thêm mã hoá vị trí vào mỗi token mảnh, giúp mô hình có cảm nhận về trật tự không gian.

Khi nào tôi vẫn nên chọn CNN thay vì ViT?

Ta nên chọn CNN khi dữ liệu khan hiếm hoặc cần suy luận siêu nhanh, nhẹ bộ nhớ trên thiết bị biên.

Tôi có thể trực quan hoá ViT tập trung vào đâu không?

Có, ta có thể trích bản đồ attention, phóng to và chồng như một heatmap để thấy các mảnh tác động đến dự đoán.

Vaibhav Mehra

Tác giả

Vaibhav Mehra

Chủ đề

Liên quan