Tutorial Vision Transformers (ViT): Arsitektur dan Contoh Kode
Pelajari bagaimana Vision Transformers (ViT) memanfaatkan patch embedding dan self-attention untuk mengungguli CNN dalam klasifikasi gambar modern. Tutorial mendalam ini menguraikan arsitektur ViT, menyediakan kode Python langkah demi langkah, dan menunjukkan kapan memilih ViT untuk proyek visi komputer dunia nyata.
Kita semua tahu bahwa Transformer telah menjadi fondasi dalam pemrosesan bahasa alami dan kini semakin populer di visi komputer. Vision Transformers (ViT) menawarkan pendekatan baru untuk memahami gambar dengan menggunakan prinsip yang sama seperti pada model berbasis teks; Large Language Models.
ViT pertama kali diperkenalkan pada 2020 oleh Google Research dalam paper “An Image is Worth 16×16 Words,” yang menunjukkan bahwa transformer yang dilatih pada dataset gambar besar dapat menyamai atau mengungguli CNN. Sejak itu, varian praktis seperti DeiT dan Swin telah memperluas penggunaannya di berbagai tugas visi.
Dalam tutorial ini, saya akan memandu Anda melalui konsep inti, komponen arsitektur, dan aplikasi praktis vision transformer (varian vanilla/original). Pada akhirnya, kita tidak hanya akan memahami cara kerja ViT, tetapi juga cara mengimplementasikannya dalam proyek visi komputer kita sendiri. Saya juga merekomendasikan panduan saya yang lain tentang multi-head attention.
Apa itu Vision Transformer (ViT)?
Mari mulai dengan pengenalan ringan tentang vision transformer.
Model-model ini memperlakukan sebuah gambar sebagai urutan data, mirip dengan cara model bahasa memproses kata dalam sebuah kalimat. Lalu gambar dibagi menjadi patch berukuran tetap, masing-masing diratakan (flatten) dan di-embed ke dalam sebuah vektor.
Vektor-vektor ini kemudian dilewatkan melalui encoder transformer standar, yang memodelkan hubungan antar patch secara global menggunakan mekanisme attention.
Perbandingan dengan convolutional neural networks
Ini secara fundamental berbeda dari convolutional neural networks (CNN), yang berfokus pada fitur lokal dan bergantung pada ekstraksi fitur hierarkis.
Karena kita sedang membahas CNN, mari bicarakan apa perbedaannya dengan ViT:
Fitur
Convolutional Neural Networks (CNN)
Vision Transformers (ViT)
Arsitektur
Menggunakan Lapisan Konvolusi + Pooling
Menggunakan Transformer Encoder dengan Self-Attention
Receptive Field
Receptive field lokal namun meluas seiring kedalaman
Global sejak awal
Kesadaran Posisi
Implisit melalui struktur
Eksplisit melalui positional encoding
Kebutuhan Data
Cukup efektif dengan dataset kecil
Memerlukan dataset skala besar
Inductive Bias
Kuat
Minimal namun lebih fleksibel
Potensi Paralelisme
Sedang
Sangat Tinggi
Skalabilitas Model
Kurang mudah diskalakan ke model besar
Sangat dapat diskalakan
Interpretabilitas
Melalui lapisan pooling namun tetap sulit.
Dapat ditingkatkan dengan visualisasi attention namun juga cukup sulit
Jelas kita belum membahas vision transformer secara mendalam, tetapi bermanfaat untuk meninjau beberapa poin yang mungkin belum langsung masuk akal.
Misalnya, istilah inductive bias dan receptive field adalah penting namun mungkin belum pernah Anda dengar sebelumnya.
Penjelasan inductive bias
Inductive bias berarti asumsi yang dibuat model untuk membantunya belajar dari data. Ini terdengar membingungkan, tetapi akan masuk akal setelah membaca analogi ini.
Bayangkan kita menyusun puzzle bersama. Kita mengira potongan-potongan akan saling terhubung berdasarkan bentuk dan warna. Asumsi ini membantu kita menyatukan potongan lebih cepat. Begitulah cara kerja model CNN.
Model tersebut membuat tebakan cerdas dengan mengasumsikan bahwa bagian-bagian yang berdekatan dalam gambar saling terkait, seperti potongan puzzle yang berdekatan sering kali berasal dari bagian gambar yang sama. Ia juga mengasumsikan bahwa jika kita memindahkan sebuah bentuk, bentuk itu tetap sama. Tebakan membantu ini disebut inductive bias yang kuat.
Sekarang bayangkan kita diberi setumpuk besar potongan puzzle, tetapi kita tidak tahu seperti apa gambar akhirnya. Kita bahkan tidak tahu apakah harus melihat bentuk atau warna atau mungkin hal lain sama sekali. Jadi kita mencoba semuanya dan perlahan mencari tahu apa yang berhasil.
Itulah yang dilakukan model Transformer. Ia tidak membuat asumsi yang kuat. Ia mempelajari pola dengan melihat banyak data. Ini disebut inductive bias minimal. Ini memberi model lebih banyak kebebasan tetapi membutuhkan lebih banyak data dan waktu untuk belajar.
Penjelasan receptive field
Gambar di atas menunjukkan bagaimana receptive field model CNN berubah. Ingat, ada banyak lapisan konvolusi dalam CNN, sehingga saat kita masuk lebih dalam ke jaringan, setiap neuron di lapisan dipengaruhi oleh area masukan yang semakin besar.
Perluasan receptive field ini memungkinkan lapisan yang lebih dalam mendeteksi fitur yang lebih kompleks dan global, seperti terlihat pada gambar di atas (dari telinga ke wajah ke seluruh anjing).
Ini cukup berbeda dari receptive field Vision Transformer:
Pada ilustrasi di atas, kita dapat melihat bahwa receptive field pada ViT (vanilla) bersifat global, sehingga semua patch saling memberi attention dengan besaran yang berbeda (ditunjukkan oleh ketebalan panah).
Untuk kesederhanaan, saya menunjukkan bahwa patch (berwarna hijau) diperhatikan (attended) oleh patch lain, tetapi pada kenyataannya, semua patch akan saling memberi attention (terlalu berantakan jika digambar semua!)
Kapan menggunakan CNN vs vision transformer
Memahami kapan menggunakan CNN versus vision transformer sangat penting untuk membuat pilihan arsitektur yang efektif dalam alur kerja visi komputer kita.
Keduanya memiliki kekuatan (dan kelemahan!), tetapi performanya lebih baik dalam kondisi yang berbeda tergantung pada ukuran data, sumber daya komputasi, dan kompleksitas pola visual yang ingin kita modelkan.
Saya biasanya merujuk pada poin-poin berikut saat memilih di antara keduanya:
Gunakan CNN saat:
Bekerja dengan data terbatas - Kita sudah menyebutkan bahwa CNN memiliki inductive bias yang kuat seperti locality, yang membantunya melakukan generalisasi dengan baik bahkan pada dataset kecil. Ini membuatnya menjadi pilihan andal untuk tugas di mana pengumpulan data berlabel dalam jumlah besar tidak praktis.
Kinerja real-time penting - CNN cenderung memiliki latensi inferensi yang lebih rendah dan lebih efisien secara komputasi pada perangkat keras standar, khususnya perangkat mobile dan edge. Arsitekturnya dioptimalkan untuk kinerja dengan parameter lebih sedikit dan penggunaan memori lebih rendah.
Anggaran komputasi terbatas - Melatih CNN dari nol atau fine-tuning model pra-latih membutuhkan sumber daya yang jauh lebih sedikit dibandingkan ViT. Kita bisa melatih CNN yang layak dengan satu GPU dan memori sedang, yang tidak selalu berlaku untuk model berbasis transformer.
Gunakan Vision Transformer saat:
Memiliki akses ke dataset berlabel skala besar dan infrastruktur komputasi yang andal - Seperti disebutkan pada tabel perbandingan, vision transformer haus data dan memerlukan waktu pelatihan serta memori yang signifikan, terutama dalam bentuk vanillanya. Dengan data dan komputasi yang cukup, mereka mampu mengungguli CNN di banyak tolok ukur.
Kita perlu menangkap hubungan spasial jarak jauh - Tidak seperti CNN, yang bersifat lokal dalam pemrosesannya (ingat bagian receptive field), ViT memanfaatkan self-attention untuk memodelkan hubungan antar semua patch gambar, sehingga sangat berguna untuk tugas di mana konteks spasial di seluruh gambar penting.
Ingin menggunakan model pra-latih dan transfer learning - Kita dapat mengakses ViT pra-latih (misalnya melalui HuggingFace atau timm) sehingga fine-tuning menjadi jauh lebih praktis. Dalam kasus ini, bahkan dataset berukuran menengah dapat memberikan hasil yang sangat baik tanpa melatih dari nol.
Jadi, untuk merangkum, jika Anda berada dalam lingkungan dengan sumber daya terbatas atau membutuhkan hasil cepat dan andal dengan data terbatas, CNN adalah pilihan yang lebih aman dan efisien.
Di sisi lain, jika proyek Anda menuntut penalaran global yang mendalam di ruang visual dan Anda memiliki daya komputasi yang memadai, vision transformer adalah opsi yang lebih baik.
Komponen Vision Transformer
Sekarang mari kita telusuri arsitektur Vision Transformer. Karena ada beberapa tahap (lima tepatnya), mari kita bahas satu per satu.
Tahap 1: Image patching
Ini adalah langkah transformasi pertama, di mana kita harus mengonversi gambar ke bentuk yang dapat dipahami transformer.
Misalkan kita memiliki gambar 224x224. Alih-alih memasukkannya secara utuh, kita membaginya menjadi patch berukuran tetap yang lebih kecil. Jika setiap patch berukuran 16x16 (seperti yang diusulkan di paper asli), maka gambar dibagi menjadi 14×14 = 196 patch, karena (224/16 = 14).
Cara mudah memahaminya adalah dengan membayangkan memotong foto menjadi ubin persegi yang sama persis. Setiap patch berisi informasi lokal dan akan bertindak seperti "kata" dalam sebuah kalimat.
Pada ilustrasi di atas, Anda dapat melihat bahwa gambar serigala dibagi menjadi patch persegi kecil (dan sama) — tepatnya 196 patch.
Namun Anda mungkin punya satu pertanyaan di sini:
“Gambarnya RGB, jadi bagaimana dengan 3 kanal warna?”
Ini poin penting: setiap patch sebenarnya adalah blok data, yang dalam kasus kita memiliki bentuk 16x16x3. 16x16 adalah tinggi dan lebar, dan 3 adalah kanal warna, menjadikan setiap patch sebagai tensor 3 dimensi.
Ini membuat setiap patch menjadi representasi ringkas dari informasi spasial dan warna dari area lokal gambar.
Pembagian menjadi patch ini mengubah struktur spasial 2D dari gambar menjadi urutan 1D data multi-dimensi, yang sesuai untuk model transformer.
Tahap 2: Patch embedding
Selanjutnya, kita perlu mengubah setiap patch gambar menjadi representasi numerik yang dapat digunakan transformer.
Setiap patch RGB 16x16 diratakan (flattened) menjadi satu vektor. Dalam contoh kita, 16×16×3 = 768 nilai. Intinya, kita mengurai semua nilai piksel dan warna menjadi satu deret angka.
Vektor mentah ini, meskipun informatif, belum berada di ruang yang cocok untuk pembelajaran. Jadi kita melewatkan masing-masing melalui lapisan proyeksi linear yang dapat dilatih. Anggap ini seperti layer dense yang memetakan setiap masukan berdimensi 768 ke ruang embedding baru berukuran D (sering juga 768, tetapi tidak selalu).
Mengapa?
Proyeksi ini penting karena menyelaraskan semua token patch ke dalam format yang konsisten dan dapat dipelajari yang diharapkan oleh transformer encoder. Hingga titik ini, kita memiliki urutan vektor berdimensi tetap, di mana setiap vektor merepresentasikan satu patch gambar.
Seluruh proses ini mengubah patch yang kaya akan informasi spasial dan warna menjadi urutan "token" terpadu (analog dengan word embedding dalam NLP), memungkinkan transformer memperlakukan gambar sebagai rangkaian entitas yang dapat dipelajari.
Tahap 3: Positional encoding
Ada satu hal yang tersisa sebelum kita mengirim token-token ini ke encoder. Anda mungkin sudah menebaknya jika sebelumnya mempelajari LLM!
Transformer pada dasarnya tidak peka terhadap posisi.
Ini berarti mereka memperlakukan urutan masukan sebagai kumpulan tak berurutan, sehingga tidak memiliki mekanisme bawaan untuk memahami urutan atau posisi token. Ini menjadi masalah besar dalam analisis gambar, di mana struktur dan tata letak spasial sangat krusial!
Mari bahas ini secara rinci.
Dalam konteks gambar, setiap patch mewakili area tertentu dari gambar asli. Jika kita memberi model urutan embedding patch tanpa menunjukkan dari mana setiap patch berasal, model tidak tahu apakah suatu patch berasal dari sudut kiri atas atau kanan bawah.
Kurangnya kesadaran spasial ini akan membatasi kemampuan model memahami pola, bentuk, struktur, dll.
Untuk mengatasinya, kita menambahkan sesuatu yang disebut positional encoding pada setiap embedding patch. Ini adalah vektor yang bertindak seperti tag spasial; vektor yang mengenkode posisi asal patch dalam gambar. Vektor posisi ini ditambahkan langsung ke embedding patch sebelum urutan memasuki transformer.
Ada dua jenis positional encoding yang umum:
Fixed (sinusoidal) positional encoding: Menggunakan fungsi sinus dan cosinus pada frekuensi berbeda untuk mengenkode informasi posisi. Deterministik dan tidak perlu dipelajari. Ini juga yang digunakan pada paper terkenal “Attention is all you need”.
Learned positional encoding: Parameter yang dapat dilatih dan dipelajari model selama pelatihan. Setiap posisi dalam urutan memiliki vektor yang dapat dipelajari sendiri.
Jika Anda bingung pada titik ini, cara mudah memahami konsep ini adalah dengan menganggap positional encoding sebagai koordinat GPS untuk patch.
Mereka memberi tahu transformer posisi asli token. Dengan menyertakan informasi ini, kita memungkinkan mekanisme self-attention memodelkan baik konten setiap patch maupun posisi relatif atau absolutnya dalam gambar.
Langkah ini krusial — tanpanya, Vision Transformer tidak akan mampu merekonstruksi struktur gambar, sekuat apa pun mekanisme attention-nya.
Tahap 4: Blok transformer encoder
Sekarang kita sampai pada titik di mana semua deep learning terjadi — penemuan pola, pemodelan konteks, dan penggabungan fitur.
Ada beberapa blok Encoder yang ditumpuk satu sama lain untuk membentuk keseluruhan Vision Transformer Encoder. Mari telusuri apa saja yang ada dalam setiap blok encoder:
Multi-head self-attention (MHSA): Mekanisme ini memungkinkan setiap patch berinteraksi dengan setiap patch lain. Ini membantu model menentukan bagian mana dari gambar yang paling relevan satu sama lain.
Alih-alih melihat patch secara terpisah, MHSA memberinya konteks global.
Banyak head attention melihat aspek berbeda dari hubungan sehingga memberi interpretasi gambar yang lebih kaya.
Feedforward neural network (FFN): Ini adalah Multi-Layer Perceptron kecil yang memproses setiap token secara independen setelah attention. Alasannya adalah untuk meningkatkan kemampuan model mempelajari pola nonlinier yang kompleks.
Residual connection dan layer norm: Menstabilkan pelatihan dan membantu aliran gradien melalui jaringan.
Secara keseluruhan, blok encoder ini ditumpuk berlapis-lapis (misalnya, 12 pada ViT-Base), di mana setiap lapisan mempelajari representasi gambar yang lebih dalam.
Tahap 5: Token klasifikasi dan kepala MLP
Kita hampir selesai! Sekarang mari beralih ke tahap terakhir dari ViT (vanilla).
Setelah semua lapisan encoder, kita memerlukan cara untuk merangkum semuanya dan membuat prediksi.
Jadi kita memperkenalkan token [CLS] khusus di awal urutan patch. Ini adalah embedding yang dapat dipelajari dan berinteraksi dengan semua token lain selama encoding.
Saat melalui lapisan transformer, ia mengumpulkan informasi global. Di akhir, kita mengekstrak token ini dan melewatkannya melalui kepala multilayer perceptron (MLP)lain, yang biasanya terdiri dari beberapa layer dense diikuti softmax (untuk klasifikasi).
Langkah terakhir ini memberi kita label prediksi, seperti mengatakan “gambar ini adalah anjing” berdasarkan informasi yang dikumpulkan oleh token [CLS]. Poin penting: hanya [CLS token] yang dikirim ke Kepala MLP terakhir ini dan karenanya digunakan untuk klasifikasi, bukan token lainnya!
Arsitektur Vision Transformer yang Menonjol
Sekarang mari kita lihat beberapa arsitektur Vision Transformer yang revolusioner.
ViT (Google Brain) - Inilah vision transformer asli (dan yang kita ikuti sepanjang artikel ini) yang memperkenalkan model transformer berbasis patch untuk klasifikasi gambar menggunakan dataset besar seperti ImageNet-21k.
DeiT (Data-efficient image Transformer) - Diperkenalkan oleh Facebook AI, DeiT meningkatkan efisiensi data dengan mengintegrasikan teknik knowledge distillation, memungkinkan pelatihan pada dataset yang lebih kecil.
Swin Transformer - Menggunakan arsitektur hierarkis dan jendela bergeser untuk mengurangi komputasi sambil mempertahankan akurasi. Sangat efektif pada tugas prediksi padat seperti deteksi objek.
Varian Lain - Model seperti BEiT, CvT, dan MobileViT menggabungkan berbagai peningkatan desain untuk meningkatkan efisiensi pelatihan, keringkasan model, atau kecepatan inferensi.
Menggunakan Vision Transformer Pra-Latih
Sering kali, kita tidak akan melatih ViT dari nol! Jadi mari jelajahi cara menggunakan model ViT pra-latih dari pustaka deep learning populer.
Pustaka Huggingface transformers
Salah satu cara termudah dan paling andal untuk menggunakan vision transformer adalah melalui pustaka Hugging Face Transformers. Pustaka ini menyediakan model ViT pra-latih yang siap digunakan hanya dengan beberapa baris kode.
Saya menulis sedikit kode untuk mengunduh dan menggunakan model ViT Base asli:
# 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()}")Didukung oleh
Mari bahas kode ini sedikit lebih dalam. Pertama, Anda mungkin bertanya-tanya mengapa harus mengunduh dua komponen terpisah. Keduanya terpisah, tetapi saling melengkapi:
ViTImageProcessor – Bertanggung jawab untuk prapemrosesan gambar sebelum diteruskan ke model. Menangani pengubahan ukuran, normalisasi, dan konversi gambar ke format yang diharapkan oleh vision transformer. Anggap ini sebagai padanan vision dari tokenizer dalam NLP!
ViTForImageClassification – Ini adalah model sebenarnya yang melakukan inferensi. Ia mengharapkan masukan dalam format tensor tertentu dan menghasilkan prediksi (misalnya, logit atau probabilitas kelas).
Pertanyaan lain yang mungkin muncul adalah tentang output.logitsdan lebih spesifik lagi tentang apa itu logit.
Dalam model machine learning — khususnya model klasifikasi — logit adalah keluaran mentah yang dihasilkan oleh lapisan terakhir model sebelum menerapkan fungsi aktivasi seperti softmax. Mereka merepresentasikan skor tak ternormalisasi untuk setiap kelas.
Cara berpikir yang baik adalah menganggapnya sebagai tingkat keyakinan internal model untuk setiap kelas. Nilai-nilai ini bisa positif atau negatif dan tidak dibatasi untuk berjumlah satu.
Untuk mengonversi logit menjadi probabilitas, kita harus menerapkan fungsi softmax, yang menskalakan nilai menjadi distribusi probabilitas.
Jadi, ketika kita menggunakan argmax(logits, -1), kita hanya memilih indeks (kelas) dengan skor mentah tertinggi, yang biasanya setara dengan yang memiliki probabilitas tertinggi setelah softmax.
Menggunakan pustaka timm
Pustaka hebat dan terkenal lainnya untuk menggunakan vision transformer adalah timm (oleh Ross Wightman). Pustaka ini juga menyediakan berbagai varian ViT pra-latih dan sangat cocok untuk eksperimen cepat atau fine-tuning. Berikut cara memuat dan menggunakan model ViT untuk inferensi:
# 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()}")Didukung oleh
Sekarang Anda seharusnya dapat melihat kesamaan antara timm dan pustaka transformers. Keduanya menyediakan model ViT pra-latih, memungkinkan pemrosesan gambar (meskipun pada timm kita menggunakan kode PyTorch standar), dan pada akhirnya, kita memperoleh kelas dengan logit tertinggi.
Kesimpulan
Secara keseluruhan, vision transformer telah membentuk ulang visi komputer dengan mengubah gambar menjadi “kalimat” patch dan menggunakan self-attention untuk menangkap konteks global sejak lapisan pertama. Dalam tutorial ini, kita telah mempelajari:
Mengapa ViT berbeda dari CNN – inductive bias minimal, receptive field global, skalabilitas besar, dll.
Kapan memilih masing-masing model – Sekali lagi, CNN unggul dengan data terbatas dan anggaran latensi ketat, sedangkan ViT lebih baik saat kita memiliki data berlimpah dan perangkat keras yang kuat.
Arsitektur dasar ViT – Kita membahas semua tahap berbeda mulai dari image patching dan learned positional encoding hingga multi-head self-attention, jalur residual, dan token [CLS] untuk klasifikasi.
Implementasi praktis – Cara memuat model pra-latih dari pustaka berbeda — Hugging Face atau timm, prapemrosesan gambar, dan mengekstraksi prediksi.
Untuk terus belajar, saya merekomendasikan artikel How Transformers Work, yang akan mengajarkan teori di balik Transformer. Untuk mengonsolidasikannya, saya kemudian merekomendasikan menjelajahi cara membangun transformer dari nol.
Jika Anda ingin mempelajari keduanya sekaligus sambil praktik langsung, maka kursus kami Transformer Models with PyTorch adalah tempat yang tepat.
Vision Transformer FAQs
Mengapa Vision Transformer memotong gambar menjadi patch 16 × 16 alih-alih membaca piksel mentah?⌄
Patching mengubah gambar 2-D menjadi “kalimat” 1-D berisi token, sehingga transformer dapat menerapkan trik self-attention yang sama seperti pada model bahasa.
Apakah ViT selalu membutuhkan jutaan gambar agar bekerja dengan baik?⌄
Tidak selalu, kita bisa mulai dari ViT pra-latih dan melakukan fine-tuning. Untuk ini, biasanya beberapa ribu gambar berlabel sudah cukup untuk hasil yang kuat.
Bagaimana ViT “mengetahui” dari mana setiap patch berasal?⌄
Mereka menambahkan positional encoding ke setiap token patch, memberi model rasa keteraturan spasial.
Kapan saya tetap harus memilih CNN daripada ViT?⌄
Kita sebaiknya memilih CNN saat data langka atau kita membutuhkan inferensi yang sangat cepat dan ringan memori pada perangkat edge.
Bisakah saya memvisualisasikan apa yang difokuskan oleh ViT?⌄
Ya, kita dapat mengekstrak peta attention, memperbesarnya, dan menimpakannya sebagai heatmap untuk menunjukkan patch mana yang mendorong prediksi.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Lintasan karier ini akan mengajarkan Anda segala hal yang perlu Anda ketahui tentang rekayasa pembelajaran mesin (machine learning engineering) dan MLOps.
Latih dan sempurnakan model AI terbaru untuk produksi, termasuk model bahasa besar (LLM) seperti Llama 3. Mulailah perjalanan Anda untuk menjadi seorang Insinyur Kecerdasan Buatan (AI) hari ini!
Kita semua tahu bahwa Transformer telah menjadi fondasi dalam pemrosesan bahasa alami dan kini semakin populer di visi komputer. Vision Transformers (ViT) menawarkan pendekatan baru untuk memahami gambar dengan menggunakan prinsip yang sama seperti pada model berbasis teks; Large Language Models.
ViT pertama kali diperkenalkan pada 2020 oleh Google Research dalam paper “An Image is Worth 16×16 Words,” yang menunjukkan bahwa transformer yang dilatih pada dataset gambar besar dapat menyamai atau mengungguli CNN. Sejak itu, varian praktis seperti DeiT dan Swin telah memperluas penggunaannya di berbagai tugas visi.
Dalam tutorial ini, saya akan memandu Anda melalui konsep inti, komponen arsitektur, dan aplikasi praktis vision transformer (varian vanilla/original). Pada akhirnya, kita tidak hanya akan memahami cara kerja ViT, tetapi juga cara mengimplementasikannya dalam proyek visi komputer kita sendiri. Saya juga merekomendasikan panduan saya yang lain tentang multi-head attention.
Apa itu Vision Transformer (ViT)?
Mari mulai dengan pengenalan ringan tentang vision transformer.
Model-model ini memperlakukan sebuah gambar sebagai urutan data, mirip dengan cara model bahasa memproses kata dalam sebuah kalimat. Lalu gambar dibagi menjadi patch berukuran tetap, masing-masing diratakan (flatten) dan di-embed ke dalam sebuah vektor.
Vektor-vektor ini kemudian dilewatkan melalui encoder transformer standar, yang memodelkan hubungan antar patch secara global menggunakan mekanisme attention.
Perbandingan dengan convolutional neural networks
Ini secara fundamental berbeda dari convolutional neural networks (CNN), yang berfokus pada fitur lokal dan bergantung pada ekstraksi fitur hierarkis.
Karena kita sedang membahas CNN, mari bicarakan apa perbedaannya dengan ViT:
Fitur
Convolutional Neural Networks (CNN)
Vision Transformers (ViT)
Arsitektur
Menggunakan Lapisan Konvolusi + Pooling
Menggunakan Transformer Encoder dengan Self-Attention
Receptive Field
Receptive field lokal namun meluas seiring kedalaman
Global sejak awal
Kesadaran Posisi
Implisit melalui struktur
Eksplisit melalui positional encoding
Kebutuhan Data
Cukup efektif dengan dataset kecil
Memerlukan dataset skala besar
Inductive Bias
Kuat
Minimal namun lebih fleksibel
Potensi Paralelisme
Sedang
Sangat Tinggi
Skalabilitas Model
Kurang mudah diskalakan ke model besar
Sangat dapat diskalakan
Interpretabilitas
Melalui lapisan pooling namun tetap sulit.
Dapat ditingkatkan dengan visualisasi attention namun juga cukup sulit
Jelas kita belum membahas vision transformer secara mendalam, tetapi bermanfaat untuk meninjau beberapa poin yang mungkin belum langsung masuk akal.
Misalnya, istilah inductive bias dan receptive field adalah penting namun mungkin belum pernah Anda dengar sebelumnya.
Penjelasan inductive bias
Inductive bias berarti asumsi yang dibuat model untuk membantunya belajar dari data. Ini terdengar membingungkan, tetapi akan masuk akal setelah membaca analogi ini.
Bayangkan kita menyusun puzzle bersama. Kita mengira potongan-potongan akan saling terhubung berdasarkan bentuk dan warna. Asumsi ini membantu kita menyatukan potongan lebih cepat. Begitulah cara kerja model CNN.
Model tersebut membuat tebakan cerdas dengan mengasumsikan bahwa bagian-bagian yang berdekatan dalam gambar saling terkait, seperti potongan puzzle yang berdekatan sering kali berasal dari bagian gambar yang sama. Ia juga mengasumsikan bahwa jika kita memindahkan sebuah bentuk, bentuk itu tetap sama. Tebakan membantu ini disebut inductive bias yang kuat.
Sekarang bayangkan kita diberi setumpuk besar potongan puzzle, tetapi kita tidak tahu seperti apa gambar akhirnya. Kita bahkan tidak tahu apakah harus melihat bentuk atau warna atau mungkin hal lain sama sekali. Jadi kita mencoba semuanya dan perlahan mencari tahu apa yang berhasil.
Itulah yang dilakukan model Transformer. Ia tidak membuat asumsi yang kuat. Ia mempelajari pola dengan melihat banyak data. Ini disebut inductive bias minimal. Ini memberi model lebih banyak kebebasan tetapi membutuhkan lebih banyak data dan waktu untuk belajar.
Penjelasan receptive field
Gambar di atas menunjukkan bagaimana receptive field model CNN berubah. Ingat, ada banyak lapisan konvolusi dalam CNN, sehingga saat kita masuk lebih dalam ke jaringan, setiap neuron di lapisan dipengaruhi oleh area masukan yang semakin besar.
Perluasan receptive field ini memungkinkan lapisan yang lebih dalam mendeteksi fitur yang lebih kompleks dan global, seperti terlihat pada gambar di atas (dari telinga ke wajah ke seluruh anjing).
Ini cukup berbeda dari receptive field Vision Transformer:
Pada ilustrasi di atas, kita dapat melihat bahwa receptive field pada ViT (vanilla) bersifat global, sehingga semua patch saling memberi attention dengan besaran yang berbeda (ditunjukkan oleh ketebalan panah).
Untuk kesederhanaan, saya menunjukkan bahwa patch (berwarna hijau) diperhatikan (attended) oleh patch lain, tetapi pada kenyataannya, semua patch akan saling memberi attention (terlalu berantakan jika digambar semua!)
Kapan menggunakan CNN vs vision transformer
Memahami kapan menggunakan CNN versus vision transformer sangat penting untuk membuat pilihan arsitektur yang efektif dalam alur kerja visi komputer kita.
Keduanya memiliki kekuatan (dan kelemahan!), tetapi performanya lebih baik dalam kondisi yang berbeda tergantung pada ukuran data, sumber daya komputasi, dan kompleksitas pola visual yang ingin kita modelkan.
Saya biasanya merujuk pada poin-poin berikut saat memilih di antara keduanya:
Gunakan CNN saat:
Gunakan Vision Transformer saat:
Jadi, untuk merangkum, jika Anda berada dalam lingkungan dengan sumber daya terbatas atau membutuhkan hasil cepat dan andal dengan data terbatas, CNN adalah pilihan yang lebih aman dan efisien.
Di sisi lain, jika proyek Anda menuntut penalaran global yang mendalam di ruang visual dan Anda memiliki daya komputasi yang memadai, vision transformer adalah opsi yang lebih baik.
Komponen Vision Transformer
Sekarang mari kita telusuri arsitektur Vision Transformer. Karena ada beberapa tahap (lima tepatnya), mari kita bahas satu per satu.
Tahap 1: Image patching
Ini adalah langkah transformasi pertama, di mana kita harus mengonversi gambar ke bentuk yang dapat dipahami transformer.
Misalkan kita memiliki gambar 224x224. Alih-alih memasukkannya secara utuh, kita membaginya menjadi patch berukuran tetap yang lebih kecil. Jika setiap patch berukuran 16x16 (seperti yang diusulkan di paper asli), maka gambar dibagi menjadi 14×14 = 196 patch, karena (224/16 = 14).
Cara mudah memahaminya adalah dengan membayangkan memotong foto menjadi ubin persegi yang sama persis. Setiap patch berisi informasi lokal dan akan bertindak seperti "kata" dalam sebuah kalimat.
Pada ilustrasi di atas, Anda dapat melihat bahwa gambar serigala dibagi menjadi patch persegi kecil (dan sama) — tepatnya 196 patch.
Namun Anda mungkin punya satu pertanyaan di sini:
“Gambarnya RGB, jadi bagaimana dengan 3 kanal warna?”
Ini poin penting: setiap patch sebenarnya adalah blok data, yang dalam kasus kita memiliki bentuk 16x16x3. 16x16 adalah tinggi dan lebar, dan 3 adalah kanal warna, menjadikan setiap patch sebagai tensor 3 dimensi.
Ini membuat setiap patch menjadi representasi ringkas dari informasi spasial dan warna dari area lokal gambar.
Pembagian menjadi patch ini mengubah struktur spasial 2D dari gambar menjadi urutan 1D data multi-dimensi, yang sesuai untuk model transformer.
Tahap 2: Patch embedding
Selanjutnya, kita perlu mengubah setiap patch gambar menjadi representasi numerik yang dapat digunakan transformer.
Setiap patch RGB 16x16 diratakan (flattened) menjadi satu vektor. Dalam contoh kita, 16×16×3 = 768 nilai. Intinya, kita mengurai semua nilai piksel dan warna menjadi satu deret angka.
Vektor mentah ini, meskipun informatif, belum berada di ruang yang cocok untuk pembelajaran. Jadi kita melewatkan masing-masing melalui lapisan proyeksi linear yang dapat dilatih. Anggap ini seperti layer dense yang memetakan setiap masukan berdimensi 768 ke ruang embedding baru berukuran D (sering juga 768, tetapi tidak selalu).
Mengapa?
Proyeksi ini penting karena menyelaraskan semua token patch ke dalam format yang konsisten dan dapat dipelajari yang diharapkan oleh transformer encoder. Hingga titik ini, kita memiliki urutan vektor berdimensi tetap, di mana setiap vektor merepresentasikan satu patch gambar.
Seluruh proses ini mengubah patch yang kaya akan informasi spasial dan warna menjadi urutan "token" terpadu (analog dengan word embedding dalam NLP), memungkinkan transformer memperlakukan gambar sebagai rangkaian entitas yang dapat dipelajari.
Tahap 3: Positional encoding
Ada satu hal yang tersisa sebelum kita mengirim token-token ini ke encoder. Anda mungkin sudah menebaknya jika sebelumnya mempelajari LLM!
Transformer pada dasarnya tidak peka terhadap posisi.
Ini berarti mereka memperlakukan urutan masukan sebagai kumpulan tak berurutan, sehingga tidak memiliki mekanisme bawaan untuk memahami urutan atau posisi token. Ini menjadi masalah besar dalam analisis gambar, di mana struktur dan tata letak spasial sangat krusial!
Mari bahas ini secara rinci.
Dalam konteks gambar, setiap patch mewakili area tertentu dari gambar asli. Jika kita memberi model urutan embedding patch tanpa menunjukkan dari mana setiap patch berasal, model tidak tahu apakah suatu patch berasal dari sudut kiri atas atau kanan bawah.
Kurangnya kesadaran spasial ini akan membatasi kemampuan model memahami pola, bentuk, struktur, dll.
Untuk mengatasinya, kita menambahkan sesuatu yang disebut positional encoding pada setiap embedding patch. Ini adalah vektor yang bertindak seperti tag spasial; vektor yang mengenkode posisi asal patch dalam gambar. Vektor posisi ini ditambahkan langsung ke embedding patch sebelum urutan memasuki transformer.
Ada dua jenis positional encoding yang umum:
Jika Anda bingung pada titik ini, cara mudah memahami konsep ini adalah dengan menganggap positional encoding sebagai koordinat GPS untuk patch.
Mereka memberi tahu transformer posisi asli token. Dengan menyertakan informasi ini, kita memungkinkan mekanisme self-attention memodelkan baik konten setiap patch maupun posisi relatif atau absolutnya dalam gambar.
Langkah ini krusial — tanpanya, Vision Transformer tidak akan mampu merekonstruksi struktur gambar, sekuat apa pun mekanisme attention-nya.
Tahap 4: Blok transformer encoder
Sekarang kita sampai pada titik di mana semua deep learning terjadi — penemuan pola, pemodelan konteks, dan penggabungan fitur.
Ada beberapa blok Encoder yang ditumpuk satu sama lain untuk membentuk keseluruhan Vision Transformer Encoder. Mari telusuri apa saja yang ada dalam setiap blok encoder:
Secara keseluruhan, blok encoder ini ditumpuk berlapis-lapis (misalnya, 12 pada ViT-Base), di mana setiap lapisan mempelajari representasi gambar yang lebih dalam.
Tahap 5: Token klasifikasi dan kepala MLP
Kita hampir selesai! Sekarang mari beralih ke tahap terakhir dari ViT (vanilla).
Setelah semua lapisan encoder, kita memerlukan cara untuk merangkum semuanya dan membuat prediksi.
Jadi kita memperkenalkan token [CLS] khusus di awal urutan patch. Ini adalah embedding yang dapat dipelajari dan berinteraksi dengan semua token lain selama encoding.
Saat melalui lapisan transformer, ia mengumpulkan informasi global. Di akhir, kita mengekstrak token ini dan melewatkannya melalui kepala multilayer perceptron (MLP) lain, yang biasanya terdiri dari beberapa layer dense diikuti softmax (untuk klasifikasi).
Langkah terakhir ini memberi kita label prediksi, seperti mengatakan “gambar ini adalah anjing” berdasarkan informasi yang dikumpulkan oleh token [CLS]. Poin penting: hanya [CLS token] yang dikirim ke Kepala MLP terakhir ini dan karenanya digunakan untuk klasifikasi, bukan token lainnya!
Arsitektur Vision Transformer yang Menonjol
Sekarang mari kita lihat beberapa arsitektur Vision Transformer yang revolusioner.
Menggunakan Vision Transformer Pra-Latih
Sering kali, kita tidak akan melatih ViT dari nol! Jadi mari jelajahi cara menggunakan model ViT pra-latih dari pustaka deep learning populer.
Pustaka Huggingface transformers
Salah satu cara termudah dan paling andal untuk menggunakan vision transformer adalah melalui pustaka Hugging Face Transformers. Pustaka ini menyediakan model ViT pra-latih yang siap digunakan hanya dengan beberapa baris kode.
Saya menulis sedikit kode untuk mengunduh dan menggunakan model ViT Base asli:
Mari bahas kode ini sedikit lebih dalam. Pertama, Anda mungkin bertanya-tanya mengapa harus mengunduh dua komponen terpisah. Keduanya terpisah, tetapi saling melengkapi:
ViTImageProcessor– Bertanggung jawab untuk prapemrosesan gambar sebelum diteruskan ke model. Menangani pengubahan ukuran, normalisasi, dan konversi gambar ke format yang diharapkan oleh vision transformer. Anggap ini sebagai padanan vision dari tokenizer dalam NLP!ViTForImageClassification– Ini adalah model sebenarnya yang melakukan inferensi. Ia mengharapkan masukan dalam format tensor tertentu dan menghasilkan prediksi (misalnya, logit atau probabilitas kelas).Pertanyaan lain yang mungkin muncul adalah tentang
output.logitsdan lebih spesifik lagi tentang apa itu logit.Dalam model machine learning — khususnya model klasifikasi — logit adalah keluaran mentah yang dihasilkan oleh lapisan terakhir model sebelum menerapkan fungsi aktivasi seperti softmax. Mereka merepresentasikan skor tak ternormalisasi untuk setiap kelas.
Cara berpikir yang baik adalah menganggapnya sebagai tingkat keyakinan internal model untuk setiap kelas. Nilai-nilai ini bisa positif atau negatif dan tidak dibatasi untuk berjumlah satu.
Untuk mengonversi logit menjadi probabilitas, kita harus menerapkan fungsi softmax, yang menskalakan nilai menjadi distribusi probabilitas.
Jadi, ketika kita menggunakan
argmax(logits, -1), kita hanya memilih indeks (kelas) dengan skor mentah tertinggi, yang biasanya setara dengan yang memiliki probabilitas tertinggi setelah softmax.Menggunakan pustaka timm
Pustaka hebat dan terkenal lainnya untuk menggunakan vision transformer adalah
timm(oleh Ross Wightman). Pustaka ini juga menyediakan berbagai varian ViT pra-latih dan sangat cocok untuk eksperimen cepat atau fine-tuning. Berikut cara memuat dan menggunakan model ViT untuk inferensi:Sekarang Anda seharusnya dapat melihat kesamaan antara
timmdan pustakatransformers. Keduanya menyediakan model ViT pra-latih, memungkinkan pemrosesan gambar (meskipun padatimmkita menggunakan kode PyTorch standar), dan pada akhirnya, kita memperoleh kelas dengan logit tertinggi.Kesimpulan
Secara keseluruhan, vision transformer telah membentuk ulang visi komputer dengan mengubah gambar menjadi “kalimat” patch dan menggunakan self-attention untuk menangkap konteks global sejak lapisan pertama. Dalam tutorial ini, kita telah mempelajari:
Untuk terus belajar, saya merekomendasikan artikel How Transformers Work, yang akan mengajarkan teori di balik Transformer. Untuk mengonsolidasikannya, saya kemudian merekomendasikan menjelajahi cara membangun transformer dari nol.
Jika Anda ingin mempelajari keduanya sekaligus sambil praktik langsung, maka kursus kami Transformer Models with PyTorch adalah tempat yang tepat.