Tổng quan về Transformer
Lý do ra đời của Transformer và tác giả của biện pháp
Transformer là một kiến trúc mạng nơ-ron được giới thiệu trong bài báo có tựa đề
"Attention is All You Need," được công bố tại hội nghị Advances in Neural Information Processing Systems (NeurIPS) vào năm 2017 Dưới đây là danh sách các tác giả của bài báo: Ashish Vaswani, Noam Shazeer, Nini Parmar, Jakob Uszkoreit, Llion Jones, Aidan
N Gomez, Lukasz Kaiser, Illia Polosukhin Tổ chức xuất bản của bài báo này là Neural Information Processing Systems Foundation, và nó được công bố trong Proceedings of the 31st International Conference on Neural Information Processing Systems (NeurIPS 2017).
Năm 2017, Google công bố bài báo “Attention Is All You Need” thông tin về Transformer như tạo ra bước ngoặt mới trong lĩnh vực NLP: “𝑻𝒓𝒂𝒏𝒔𝒇𝒐𝒓𝒎𝒆𝒓 𝑵𝒆𝒖𝒓𝒂𝒍 𝑵𝒆𝒕𝒘𝒐𝒓𝒌 𝒊𝒔 𝒕𝒉𝒆 𝒄𝒖𝒓𝒓𝒆𝒏𝒕 𝒔𝒕𝒂𝒕𝒆-𝒐𝒇-𝒕𝒉𝒆-𝒂𝒓𝒕 𝒕𝒆𝒄𝒉𝒏𝒊𝒒𝒖𝒆 𝒊𝒏 𝒕𝒉𝒆 𝒇𝒊𝒆𝒍𝒅 𝒐𝒇 𝑵𝑳𝑷” Trước khi Transformer ra đời, hầu như các tác vụ xử lý ngôn ngữ tự nhiên, đặc biệt trong mảng Machine Translation (dịch máy) đều sử dụng kiến trúc Recurrent Neural Networks (RNNs) Do phải xử lý câu đầu vào một cách tuần tự nên nhược điểm của RNNs là tốc độ xử lý chậm và hạn chế trong việc biểu diễn sự phụ thuộc xa giữa các từ trong một câu.
Transformer giải quyết những vấn đề này bằng cách sử dụng cơ chế chú ý, nơi mà mỗi phần tử đầu ra của mạng có thể chú ý đến một phần tử cụ thể nào đó trong đầu vào, với trọng số được xác định dựa trên mức độ quan trọng của phần tử đó đối với việc tạo ra đầu ra Cơ chế chú ý cho phép Transformer xử lý các phần tử của dữ liệu đầu vào đồng thời, không cần phải tuân theo thứ tự tuần tự như các mô hình trước đó.
Khi Transformer xuất hiện, các vấn đề mà RNNs gặp phải gần như đã được giải quyết triệt để Sau này, Transformer là nền tảng cho các mô hình nổi tiếng khác như Bidirectional Encoder Representations from Transformer – BERT (2019), mô hình mà Google đã áp dụng cho cỗ máy tìm kiếm của mình hay trong AlphaStar của DeepMind – một chương trình có khả năng đánh bại những người chơi đỉnh cao của Starcraft.
Transformer cũng có khả năng dễ dàng mở rộng đến các nhiệm vụ khác nhau và có thể áp dụng cho các loại dữ liệu khác nhau, không chỉ giới hạn trong lĩnh vực xử lý ngôn ngữ tự nhiên
Do đó, tính linh hoạt và hiệu quả của Transformer đã làm nó trở thành một công cụ quan trọng trong nhiều ứng dụng trong lĩnh vực trí tuệ nhân tạo.
Ứng dụng chính của Transformer
Tranformer chủ yếu được sử dụng trong xử lý ngôn ngữ tự nhiên (NLP) và thị giác máy tính (CV) Trong thực tế, bất kỳ dữ liệu văn bản, hình ảnh hoặc video tuần tự nào cũng có thể trở thành ứng cử viên cho mô hình Tranformer Trong những năm qua, Tranformer đã đạt được thành công lớn trong việc dịch ngôn ngữ, nhận dạng giọng nói, dịch giọng nói và dự đoán chuỗi thời gian Các mô hình được đào tạo trước như GPT-3, ứng dụng trong thế giới thực như tóm tắt tài liệu, tạo tài liệu, phân tích trình tự sinh học và hiểu video.
Vào năm 2020, người ta đã chứng minh rằng GPT-2 có thể được điều chỉnh để chơi cờ vua Tranformer đã được ứng dụng vào lĩnh vực xử lý hình ảnh và cho kết quả có tính cạnh tranh với mạng nơ ron tích chập (CNN).
Do được áp dụng rộng rãi trong thị giác máy tính và mô hình ngôn ngữ, chúng đã bắt đầu được áp dụng trong các lĩnh vực mới như hình ảnh y tế và nhận dạng giọng nói.
Các nhà nghiên cứu đang sử dụng máy biến thế để hiểu sâu hơn về mối quan hệ giữa gen và axit amin trong DNA và protein Điều này cho phép thiết kế và phát triển thuốc nhanh hơn Máy biến áp cũng được sử dụng trong nhiều lĩnh vực khác nhau để xác định mô hình và phát hiện hoạt động bất thường nhằm ngăn chặn gian lận, tối ưu hóa quy trình sản xuất, đề xuất đề xuất được cá nhân hóa và nâng cao dịch vụ chăm sóc sức khỏe Những công cụ mạnh mẽ này cũng thường được sử dụng trong các ứng dụng hàng ngày như công cụ tìm kiếm như Google và Bing.
Dưới đây là một số ứng dụng phổ biến của mô hình Transformer:
- Dịch máy và Xử lý ngôn ngữ tự nhiên (NLP): Transformer đã đạt được hiệu suất xuất sắc trong các nhiệm vụ như dịch máy, tóm tắt văn bản, và các tác vụ NLP khác như phân loại văn bản, gán nhãn từ ngữ, và hiểu ý đồng nghĩa.
- Mô hình ngôn ngữ: Các biến thể của Transformer như GPT (Generative Pre-trained Transformer) đã được sử dụng để huấn luyện mô hình ngôn ngữ tự nhiên lớn, có khả năng tạo ra văn bản tự nhiên và có khả năng giải quyết nhiều nhiệm vụ khác nhau mà không cần huấn luyện riêng biệt.
- Hình ảnh và Video: Transformer cũng đã được áp dụng trong lĩnh vực xử lý ảnh và video, đặc biệt là trong các nhiệm vụ như nhận diện vật thể, phân đoạn hình ảnh, và sinh hình ảnh.
- Âm thanh và Ngôn ngữ tự nhiên: Transformer có thể được sử dụng trong xử lý âm thanh, như chuyển đổi giọng nói thành văn bản (ASR) và tổ chức thông tin trong dữ liệu âm thanh.
- Tính toán song song và hiệu suất: Kiến trúc self-attention trong Transformer cũng mang lại lợi ích về tính toán song song, giúp nó trở thành một lựa chọn hấp dẫn cho việc xử lý dữ liệu lớn và tăng tốc các tác vụ học máy trên phạm vi rộng.
- Học chuyển giao (Transfer Learning): Mô hình Transformer thường được sử dụng trong các mô hình học chuyển giao, nơi một mô hình đã được huấn luyện trên một nhiệm vụ lớn có thể được chuyển giao để giúp đỡ trong việc giải quyết các nhiệm vụ tương tự khác mà không cần huấn luyện lại từ đầu.
Kỹ thuật của Transformer
Kiến trúc chung
- Máy tính không hiểu câu chữ mà chỉ đọc được số, vector, ma trận; vì vậy ta phải biểu diễn câu chữ dưới dạng vector, gọi là input embedding.
- Position Encoding dùng để đưa thông tin về vị trí của các từ vào mô hình
Transformer. o Các từ được biểu diễn bằng một vector sử dụng một ma trận word embedding có số dòng bằng kích thước của tập từ vựng Sau đó các từ trong câu được tìm kiếm trong ma trận này, và được nối nhau thành các dòng của một ma trận 2 chiều chứa ngữ nghĩa của từng từ riêng biệt.
Word embeddings phần nào cho giúp ta biểu diễn ngữ nghĩa của một từ, tuy nhiên cùng một từ ở vị trí khác nhau của câu lại mang ý nghĩa khác nhau. o Positional Encoding để inject thêm thông tin về vị trí của một từ
- Là cơ chế giúp Transformer “hiểu” được sự liên quan giữa các từ trong một câu
- Có thể khẳng định rằng Self-Attention chính là thành phần quan trọng nhất của transformer Sự khác biệt là trong khi cơ chế attention sẽ tính toán dựa trên trạng thái của decoder ở time-step tiện tại và tất cả trạng thái ẩn của encoder Còn self-attention có thể hiểu là attention trong một câu, khi từng thành phần trong câu tương tác với nhau Từng token sẽ “quan sát” các tokens còn lại, thu nhập ngữ cảnh của câu và cập nhật vector biểu diễn b Encoder-Decoder Architecture
Transformer bao gồm 2 phần lớn là encoder và decoder Encoder dùng để học vector biểu của cẫu với mong muốn vector này mang thông tin hoàn hảo của câu đó Decoder thực hiện chức năng chuyển vector biểu diễn kia thành ngôn ngữ đích. Ưu điểm xử lý song song các từ nhờ nhiều lớp Encoder
Chi tiết Self-Attention Mechanism
a Query, Key và Value Để xây dựng cơ chế self-attention ta cần chú ý đến hoạt động của 3 vector biểu diễn cho mỗi từ lần lượt là:
- Key: trả lời rằng nó có một số thông tin
- Value: trả về thông tin đó
Query được sử dụng khi một token “quan sát” những tokens còn lại, nó sẽ tìm kiếm thông tin xung quanh để hiểu được ngữ cảnh và mối quan hệ của nó với các tokens còn lại Key sẽ phản hồi yêu cầu của Query và được sử dụng để tính trọng số attention Cuối cùng, Value được sử dụng để tính trọng số attention Cuối cùng, Value được sử dụng trọng số attention vừa rồi để tính ra vector đại diện (attention vector) Trong ảnh 3 ma trận WQ, WK và WV chính là các hệ số mà mô hình cần huấn luyện.
Biểu thức để tính attention vector như sau:
Với dk là số chiều của vector Key với mục đích tránh tràn luồng
Kỹ thuật này giúp kiểm soát độ phức tạp tính toán và tránh vấn đề gradient bùng nổ Bên cạnh đó có thể tính toán song song trên nhiều key vectors, giúp tăng cường hiệu suất. b Multi-Head Attention
Thông thường, để có thể hiểu được vai trò của một từ trong một câu ta cần hiều được sự liên quan giữa từ đó và các thành phần còn lại trong câu Điều này rất quan trọng trong quá trình xử lí câu đầu vào ở ngôn ngữ A và cả trong quá trình tạo ra câu ở ngôn ngữ B Vì vậy, mô hình cần phải tập trung vào nhiều thứ khác nhau, cụ thể là thay vì chỉ có một cơ chế self attention như đã giới thiệu hay còn gọi là 1 "head" thì mô hình sẽ có nhiều "heads" mỗi head sẽ tập trung vào khía cạnh về sự liên quan giữa từ và các thành phần còn lại Đó chính là multi-head attention.
Khi triển khai, ta cần dựa vào query, key và value để tính toán cho từng head Sau đó ta sẽ concat các ma trận thu được để thu được ma trận của multi-head attention Để có đầu ra có cùng kích thước của đầu vào thì cần nhân với ma trận W.
Multi-Head Attention cho phép mô hình chú ý đến đồng thời những pattern dễ quan sát được như sau:
- Chú ý đến từ kế trước của một từ
- Chú ý đến từ kế sau của một từ
- Chú ý đến những từ liên quan của một từ c Masked-Self Attention
Là cơ chế được sử dụng cho decoder trong transformer, cụ thể nó thực hiện nhiệm vụ chỉ cho phép target token tại timestep hiện tại chỉ được phép dùng các tokens ở time-step trước đó Về hoạt động nó cũng giống như đã giới thiệu ở trên, ngoại trừ việc nó không tính đến attention của những tokens trong tương lai.
Giả sử bạn muốn Transformer thực hiện bài toán English-France translation, thì công việc của Decoder là giải mã thông tin từ Encoder và sinh ra từ tiếng Pháp dựa trên những từ trước đó Vậy nên, nếu ta sử dụng multi-head attention trên cả câu như ở Encoder, Decoder sẽ “thấy” luôn từ tiếp theo mà nó cần dịch Để ngăn điều đó, khi Decoder dịch đến từ thứ i, phần sau của câu tiếng Pháp sẽ bị che lại (masked) và Decoder chỉ được phép “nhìn thấy” phần nó đã dịch trước đó.
Decoder về cơ bản là giống với encode, chỉ khác là Decoder decode từng từ một và input của Decoder (câu tiếng Pháp) bị masked.
Encoder và decoder
a Cấu trúc và chức năng
- Lớp Multi-Head Self Attention (MSP): Lớp này nối tất cả các kết quả đầu ra của Cơ chế Attention một cách tuyến tính theo đúng kích thước Nhiều Attention head sẽ giúp huấn luyện những yếu tố phụ thuộc cục bộ và toàn bộ trong một hình ảnh.
- Lớp Multi-Layer Perceptrons (MLP): Lớp này chứa một hàm Gaussian Error Linear Unit hai lớp.
- Lớp thường: Lớp này được thêm vào trước mỗi khối, vì nó không bao gồm bất kỳ yếu tố phụ thuộc mới nào giữa các hình ảnh huấn luyện Điều này giúp cải thiện thời gian đào tạo và hiệu suất tổng thể.
Encoder đầu tiên sẽ nhận ma trận biểu diễn của các từ đã được cộng với thông tin vị trí thông qua positional encoding Sau đó, ma trận này sẽ được xử lý bởi Multi Head Attention Multi Head Attention thật chất là self-attention, nhưng mà để mô hình có thể có chú ý nhiều pattern khác nhau, tác giả đơn giản là sử dụng nhiều self-attention.
- Giả sử bạn muốn Transformer thực hiện bài toán English-France translation, thì công việc của Decoder là giải mã thông tin từ Encoder và sinh ra từ tiếng Pháp dựa trên những từ trước đó Vậy nên, nếu ta sử dụng multi-head attention trên cả câu như ở Encoder, Decoder sẽ “thấy” luôn từ tiếp theo mà nó cần dịch Để ngăn điều đó, khi Decoder dịch đến từ thứ i, phần sau của câu tiếng Pháp sẽ bị che lại (masked) và Decoder chỉ được phép “nhìn thấy” phần nó đã dịch trước đó.
- Decode về cơ bản là giống với encode, chỉ khác là Decoder decode từng từ một và input của Decoder (câu tiếng Pháp) bị masked. b Layer Normalization và Residal Connections
- Là một kỹ thuật chuẩn hóa dữ liệu đầu ra của mỗi layer trong mạng nơ-ron Mục tiêu của nó là giảm thiểu hiện tượng "covariate shift", tức là sự thay đổi trong phân phối của đầu vào cho mỗi layer Bằng cách này, Layer Normalization giúp đảm bảo rằng các đầu vào cho mỗi layer đều ở cùng một khoảng giá trị, giảm thiểu sự biến động và giúp mô hình học tốt hơn.
- Công thức của Layer Normalization cho một đầu vào x trong một layer nhất định là:
Trong đó: μ là giá trị trung bình của x. σ là độ lệch chuẩn của x γ vàβ là các tham số có thể học được.
- Residual Connections (hoặc còn gọi là skip connections) là một kiến trúc trong các mô hình nơ-ron sâu để giải quyết vấn đề của việc huấn luyện mô hình sâu Khi mô hình trở nên quá sâu, việc lan truyền ngược và học các trọng số có thể trở nên khó khăn Residual Connections giúp giải quyết vấn đề này bằng cách thêm một đường dẫn trực tiếp từ đầu vào của một layer đến đầu ra của layer tiếp theo.
- Residual Connections được biểu diễn bằng công thức:
Input : Input là đầu vào của layer hiện tại.
F(Input) : F(Input) là hàm biểu diễn phần học của layer.
Activation : Activation là hàm kích hoạt, thường là ReLU.
Residual Connections giúp qua mô hình thông tin từ layer trước đó mà không làm mất thông tin, giúp lan truyền ngược hiệu quả hơn và giảm nguy cơ vanishing gradient (đạo hàm tiệm cận 0) Điều này làm cho việc huấn luyện các mô hình sâu trở nên dễ dàng hơn và giúp tăng cường hiệu suất của mạng.
Ứng dụng kiến trúc Transformer trong việc xử lý ảnh
Tiền xử lý dữ liệu
- Dữ liệu sử dụng : num_classes = 100 input_shape = (32, 32, 3)
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar100.load_data() print(f"x_train shape: {x_train.shape} - y_train shape:
{y_train.shape}") print(f"x_test shape: {x_test.shape} - y_test shape: {y_test.shape}") Downloading data from https://www.cs.toronto.edu/~kriz/cifar-100- python.tar.gz
169001437/169001437 [==============================] - 3s 0us/step x_train shape: (50000, 32, 32, 3) - y_train shape: (50000, 1) x_test shape: (10000, 32, 32, 3) - y_test shape: (10000, 1)
Tải xuống và sử dụng tập dữ liệu cifar100 bao gồm 60000 hình ảnh 32x32 được phân ra 100 lớp nhỏ, các lớp nhỏ lại thuộc 20 siêu lớp lớn hơn Mỗi lớp chứa 600 hình ảnh Bộ được chia ra hai phần 50000 hình ảnh cho training và 10000 ảnh cho test.
- Đặt các siêu tham số( hyperparameter)
- image_size = 72 # We'll resize input images to this size
- patch_size = 6 # Size of the patches to be extract from the input images
- num_patches = (image_size // patch_size) ** 2
- ] # Size of the transformer layers
- mlp_head_units = [2048, 1024] # Size of the dense layers of the final classifier Ở đây có các tham số cần lưu ý như image_size để đưa kích thước hình ảnh từ 32x32 lên 72x72 và kích thước của các patch nhỏ là 6x6 từ đó suy ra số lượng patch mà hình ảnh sẽ có Điều này là quan trọng vì transformer cần embedding để có thể hoạt động chính xác Project_dim là số chiều vector đầu ra của từng patch ảnh từ đó đưa vào input cho encoder của Transformer Num_heads là số lượng heads trong multi- head self-attention đơn giản là chia tách thành các heads lần lượt Transdormer_units là tham số overide lại hàm multilayer perceptron để thêm vào skip connection trong của quá trình transformer và encoder Mlp_head_units là số chiều ẩn của lớp nulti- layer perceptron
III.2 Tăng cường dữ liệu data_augmentation = keras.Sequential(
[ layers.Normalization(), layers.Resizing(image_size, image_size), layers.RandomFlip("horizontal"), layers.RandomRotation(factor=0.02), layers.RandomZoom( height_factor=0.2, width_factor=0.2
# Compute the mean and the variance of the training data for normalization. data_augmentation.layers[0].adapt(x_train)
Do đã nói về điểm yếu của ViT là overfitting, ta sẽ sử dụng tăng cường dữ liệu cho tập dữ liệu Đầu tiên là lớp normalization sẽ chuẩn hóa (normalization) lên đầu ra dựa trên Mean (trung bình) và Standard Deviation (độ lệch chuẩn) Kế đó là lật ảnh, xoay ảnh ngẫu nhiên và ngẫu nhiên phóng to
III.3 MLP def mlp(x, hidden_units, dropout_rate): for units in hidden_units: x = layers.Dense(units, activation=tf.nn.gelu)(x) x = layers.Dropout(dropout_rate)(x) return x
Thêm một skip connection giữa các heads của các layer để chuẩn hóa thông tin khi chuyển giữa các heads. class Patches(layers.Layer): def init (self, patch_size): super(). init () self.patch_size = patch_size def call(self, images): batch_size = tf.shape(images)[0] patches = tf.image.extract_patches( images=images, sizes=[1, self.patch_size, self.patch_size, 1], strides=[1, self.patch_size, self.patch_size, 1], rates=[1, 1, 1, 1], padding="VALID",
) patch_dims = patches.shape[-1] patches = tf.reshape(patches, [batch_size, -1, patch_dims]) return patches
Lớp trên đưa vào hình ảnh layer ở đây là hình ảnh 72x72 và đưa ra đầu ra là một grid lưới tách hình ảnh ra thành các patch Các chỉ số như sizes và strides dựa vào tham số patch_size để quyết định Sử dụng hàm extract_patches được sử dụng như một phương pháp chuẩn hóa dữ liệu để căn chỉnh hình ảnh và tách hình ảnh Mục đích cuối là biến đổi tensor trên từ một đối tượng giờ trở thành một chuỗi các đối tượng hay như tên gọi đầu ra là patches
III.4 Trực quan hóa import matplotlib.pyplot as plt plt.figure(figsize=(4, 4)) image = x_train[np.random.choice(range(x_train.shape[0]))] plt.imshow(image.astype("uint8")) plt.axis("off") resized_image = tf.image.resize( tf.convert_to_tensor([image]), size=(image_size, image_size)
) patches = Patches(patch_size)(resized_image) print(f"Image size: {image_size} X {image_size}") print(f"Patch size: {patch_size} X {patch_size}") print(f"Patches per image: {patches.shape[1]}") print(f"Elements per patch: {patches.shape[-1]}") n = int(np.sqrt(patches.shape[1])) plt.figure(figsize=(4, 4)) for i, patch in enumerate(patches[0]): ax = plt.subplot(n, n, i + 1) patch_img = tf.reshape(patch, (patch_size, patch_size, 3)) plt.imshow(patch_img.numpy().astype("uint8")) plt.axis("off") Đoạn mã trên cho ta thấy được dữ liệu hình ảnh và cách các patch được chia ra sử dụng matplotlib để tạo một vòng lặp đưa các patch ra theo trình tự dựa theo index của chiều cao và chiều rộng ảnh gốc input.
Cho ra được chiều của hình ảnh, chiều của patch và số patch tách ra từ hình ảnh là 144 Elements per patch là giá trị của từng patch ta có 6x6x3 = 108 tức chiều rông và chiều cao cùng với giá trị màu rgb x3 là red, green, blue.
III.5 Lớp encoder class PatchEncoder(layers.Layer): def init (self, num_patches, projection_dim): super(). init () self.num_patches = num_patches self.projection = layers.Dense(units=projection_dim) self.position_embedding = layers.Embedding( input_dim=num_patches, output_dim=projection_dim
) def call(self, patch): positions = tf.range(start=0, limit=self.num_patches, delta=1) encoded = self.projection(patch) + self.position_embedding(positions) return encoded Đây là bước thêm các giá trị learnable embedding vào các patch do Transformer không thể tự nhận biết được vị trí các patch được sắp xếp Code trên ta sử dụng một bảng embedding đánh số từ 0 tới 144 biểu thị vị trí của các patch trong dãy để từ đó đưa vào Encoder.
III.6 Bắt đầu xây dựng ViT def create_vit_classifier(): inputs = layers.Input(shape=input_shape)
# Augment data. augmented = data_augmentation(inputs)
# Create patches. patches = Patches(patch_size)(augmented)
# Encode patches. encoded_patches = PatchEncoder(num_patches, projection_dim)(patches)
# Create multiple layers of the Transformer block. for _ in range(transformer_layers):
# Layer normalization 1. x1 = layers.LayerNormalization(epsilon-6)(encoded_patches) # Create a multi-head attention layer. attention_output = layers.MultiHeadAttention( num_heads=num_heads, key_dim=projection_dim, dropout=0.1
# Skip connection 1. x2 = layers.Add()([attention_output, encoded_patches])
# Layer normalization 2. x3 = layers.LayerNormalization(epsilon-6)(x2)
# MLP. x3 = mlp(x3, hidden_units=transformer_units, dropout_rate=0.1) # Skip connection 2. encoded_patches = layers.Add()([x3, x2])
# Create a [batch_size, projection_dim] tensor. representation = layers.LayerNormalization(epsilon-6)
(encoded_patches) representation = layers.Flatten()(representation) representation = layers.Dropout(0.5)(representation)
# Add MLP. features = mlp(representation, hidden_units=mlp_head_units, dropout_rate=0.5)
# Classify outputs. logits = layers.Dense(num_classes)(features)
# Create the Keras model. model = keras.Model(inputs=inputs, outputs=logits) return model
Trong đoạn mã ta sử dụng các khối multi-head attention và xếp chồng chúng lên Thông qua vòng lặp for lặp qua số lần transformer_layers, ở trong các khối mlp này ta có các lớp normalization 1, lớp MLP, skip connection 1, normalization 2, skip connection 2. Các khối Transformer cho ra output là một tensor [batch_size, num_patches, projection_dim] được xử lý với softmax cho ra kết quả đầu ra khả năng.
III.7 Bước cuối def run_experiment(model): optimizer = tfa.optimizers.AdamW( learning_rate=learning_rate, weight_decay=weight_decay
) model.compile( optimizer=optimizer, loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=[ keras.metrics.SparseCategoricalAccuracy(name="accuracy"), keras.metrics.SparseTopKCategoricalAccuracy(5, name="top-5- accuracy"),
) checkpoint_filepath = "/tmp/checkpoint" checkpoint_callback = keras.callbacks.ModelCheckpoint( checkpoint_filepath, monitor="val_accuracy", save_best_only=True, save_weights_only=True,
) history = model.fit( x=x_train, y=y_train, batch_sizetch_size, epochs=num_epochs, validation_split=0.1, callbacks=[checkpoint_callback],
) model.load_weights(checkpoint_filepath)
_, accuracy, top_5_accuracy = model.evaluate(x_test, y_test) print(f"Test accuracy: {round(accuracy * 100, 2)}%") print(f"Test top 5 accuracy: {round(top_5_accuracy * 100, 2)}%") return history vit_classifier = create_vit_classifier() history = run_experiment(vit_classifier)
Ta huấn luyện model với optimizer chứa các tham số đầu vào, kết quả cho ra là độ chính xác và top 5 độ chính xác Lý do sử dụng thêm top 5 độ chính xác là để xác định rõ thêm về khả năng của mô hình khi mà dự đoán đầu ra có thể nằm trong top 5 giá trị được dự đoán
176/176 [==============================] - 33s 136ms/step - loss: 4.8863 - accuracy: 0.0294 - top-5-accuracy: 0.1117 - val_loss: 3.9661 - val_accuracy: 0.0992 - val_top-5-accuracy: 0.3056
176/176 [==============================] - 22s 127ms/step - loss: 4.0162 - accuracy: 0.0865 - top-5-accuracy: 0.2683 - val_loss: 3.5691 - val_accuracy: 0.1630 - val_top-5-accuracy: 0.4226
176/176 [==============================] - 22s 127ms/step - loss: 3.7313 - accuracy: 0.1254 - top-5-accuracy: 0.3535 - val_loss: 3.3455 - val_accuracy: 0.1976 - val_top-5-accuracy: 0.4756
176/176 [==============================] - 23s 128ms/step - loss: 3.5411 - accuracy: 0.1541 - top-5-accuracy: 0.4121 - val_loss: 3.1925 - val_accuracy: 0.2274 - val_top-5-accuracy: 0.5126
176/176 [==============================] - 22s 127ms/step - loss: 3.3749 - accuracy: 0.1847 - top-5-accuracy: 0.4572 - val_loss: 3.1043 - val_accuracy: 0.2388 - val_top-5-accuracy: 0.5320
176/176 [==============================] - 22s 127ms/step - loss: 3.2589 - accuracy: 0.2057 - top-5-accuracy: 0.4906 - val_loss: 2.9319 - val_accuracy: 0.2782 - val_top-5-accuracy: 0.5756
176/176 [==============================] - 22s 125ms/step - loss: 0.7692 - accuracy: 0.7689 - top-5-accuracy: 0.9599 - val_loss: 1.8928 - val_accuracy: 0.5506 - val_top-5-accuracy: 0.8184
176/176 [==============================] - 22s 126ms/step - loss: 0.7783 - accuracy: 0.7661 - top-5-accuracy: 0.9597 - val_loss: 1.8646 - val_accuracy: 0.5490 - val_top-5-accuracy: 0.8166
176/176 [==============================] - 22s 125ms/step - loss: 0.7547 - accuracy: 0.7711 - top-5-accuracy: 0.9638 - val_loss: 1.9347 - val_accuracy: 0.5484 - val_top-5-accuracy: 0.8150
176/176 [==============================] - 22s 125ms/step - loss: 0.7603 - accuracy: 0.7692 - top-5-accuracy: 0.9616 - val_loss: 1.8966 - val_accuracy: 0.5522 - val_top-5-accuracy: 0.8144
176/176 [==============================] - 22s 125ms/step - loss: 0.7595 - accuracy: 0.7730 - top-5-accuracy: 0.9610 - val_loss: 1.8728 - val_accuracy: 0.5470 - val_top-5-accuracy: 0.8170
176/176 [==============================] - 22s 125ms/step - loss: 0.7542 - accuracy: 0.7736 - top-5-accuracy: 0.9622 - val_loss: 1.9132 - val_accuracy: 0.5504 - val_top-5-accuracy: 0.8156
176/176 [==============================] - 22s 125ms/step - loss: 0.7410 - accuracy: 0.7787 - top-5-accuracy: 0.9635 - val_loss: 1.9233 - val_accuracy: 0.5428 - val_top-5-accuracy: 0.8120
313/313 [==============================] - 4s 12ms/step - loss: 1.8487 - accuracy: 0.5514 - top-5-accuracy: 0.8186
Sau 100 epoch ta có được độ chính xác là 55.14%, top 5 chính xác là 81.86% Khi so sánh với ResNet50V2 train trên cùng bộ dữ liệu thì ta thấy độ chính xác không cao bằng. Như đã nhắc tới từ trước về việc ViT chỉ làm tốt hơn vượt trội và đạt tới trạng thái state of art khi mà được train trên bộ dữ liệu lớn trên 300 triệu
III.8 Những ứng dụng khác ngoài xử lý ảnh
Mô hình Transformer đã được áp dụng thành công trong nhiều bài toán xử lý hình ảnh khác ngoài image classification, bao gồm:
- Object Detection: Mô hình Transformer có thể được sử dụng để giải quyết bài toán object detection, trong đó mục tiêu là xác định vị trí và lớp của các đối tượng trong ảnh. Một số phương pháp như DETR (DEtection TRansformer) đã sử dụng mô hình Transformer để thay thế cho phần encoder trong các kiến trúc truyền thống như Faster R- CNN hay SSD Các mô hình này đã chứng minh khả năng xử lý object detection hiệu quả và đạt được kết quả tốt trên nhiều bộ dữ liệu.
Những ứng dụng khác ngoài xử lý ảnh
- Phát hiện người đi bộ: Sử dụng mô hình PED (Pedestrian End-to-end Detector) để hỗ trợ phát hiện người đi bộ trong môi trường mật độ cao và che khuất.
- Phát hiện làn đường: Sử dụng mô hình LSTR (Lane Segmentation Transformer) để tăng cường hiệu suất phát hiện làn đường cong bằng cách học thông tin ngữ cảnh toàn cầu.
- Scene Graph (Biểu đồ cảnh): Sử dụng mô hình Graph R-CNN hoặc Texema để tạo ra biểu đồ cảnh, biểu thị đối tượng, thuộc tính và mối quan hệ giữa các đối tượng trong cảnh.
- Theo dõi (Tracking): Sử dụng kiến trúc Transformer Encoder-Decoder trong các mô hình Theo dõi dựa trên mẫu như TMT, TrTr và TransT để theo dõi vật thể trong video.
- Nhận dạng lại (Re-Identification): Sử dụng mô hình TransReID để xác định lại đối tượng, đạt được hiệu suất tương đương với các mô hình dựa trên CNN.
Đánh giá
Ưu điểm và đặc điểm độc đáo
- Hiệu suất xuất sắc: Transformer đã đạt được hiệu suất xuất sắc trên nhiều nhiệm vụ NLP và các ứng dụng khác, thậm chí vượt qua các phương pháp truyền thống sử dụng các kiến trúc như Recurrent Neural Networks (RNNs) và Long Short-Term Memory (LSTM).
- Quan hệ dài hạn hiệu quả: Mô hình self-attention trong Transformer cho phép xử lý các mối quan hệ dài hạn một cách hiệu quả, giúp nó hiểu được bối cảnh rộng hơn trong dữ liệu đầu vào.
- Tính tương tác global: Cơ chế self-attention của Transformer cho phép mỗi phần tử trong chuỗi tương tác với tất cả các phần tử khác, tạo nên sự tương tác toàn cục giữa các từ hoặc token.
- Dễ paralellization: Transformer có thể dễ dàng được parallelized, giúp tăng tốc quá trình đào tạo và dự đoán, đặc biệt là trên các thiết bị phần cứng hiện đại có khả năng xử lý đa luồng.
- Khả năng tái sử dụng cao: Cấu trúc modulized của Transformer làm cho nó dễ dàng tái sử dụng và cấu hình cho nhiều mục đích khác nhau, từ dịch máy đến phân loại ngôn ngữ. Đặc điểm độc đáo:
- Self-Attention Mechanism: Mô hình có cơ chế tự chú ý (self-attention) mạnh mẽ, giúp nó tập trung vào các phần tử quan trọng của dữ liệu đầu vào một cách linh hoạt.
- Không gian và thời gian độc lập: Transformer không yêu cầu thứ tự cụ thể của dữ liệu đầu vào, điều này làm cho nó thích hợp cho việc xử lý dữ liệu không có tính chất chuỗi, như hình ảnh.
- Đa tác vụ (Multi-head Attention): Cơ chế multi-head attention của Transformer cho phép mô hình tập trung vào các khía cạnh khác nhau của dữ liệu đầu vào đồng thời, tăng khả năng học và biểu diễn.
Nhược điểm và thách thức
- Đòi hỏi năng lượng và tài nguyên lớn: Mô hình Transformer thường yêu cầu năng lượng và tài nguyên tính toán lớn, đặc biệt là với các mô hình lớn như GPT-3 Điều này có thể làm tăng chi phí đào tạo và triển khai.
- Sự phức tạp của mô hình: Kiến trúc Transformer có nhiều tham số và sự phức tạp cao, làm tăng khả năng overfitting đặc biệt là khi dữ liệu huấn luyện không đủ lớn.
- Đối mặt với hiện tượng không đồng đều (Uneven Attention): Các tầng self-attention có thể dẫn đến hiện tượng attention không đồng đều, trong đó một số từ quan trọng được tập trung quá nhiều, trong khi những từ khác được xem xét ít.
- Khả năng hiểu bản ngữ: Mặc dù Transformer có khả năng tạo ra các biểu diễn ngôn ngữ mạnh mẽ, nhưng đôi khi chúng không hiểu ngôn ngữ một cách như con người, đặc biệt là khi đối mặt với các nhiệm vụ yêu cầu kiến thức cụ thể.
- Hiểu biểu đồ và dữ liệu đa dạng: Mặc dù Transformer hiệu quả trong việc xử lý dữ liệu chuỗi, nhưng đối mặt thách thức khi phải xử lý dữ liệu có biểu đồ hoặc dạng không chuỗi.
- Xử lý dữ liệu liên tục: Trong khi Transformer được thiết kế để xử lý chuỗi dữ liệu, nhưng đối mặt thách thức khi phải xử lý dữ liệu liên tục, như âm thanh và video.
- Khả năng diễn giải: Mô hình Transformer, đặc biệt là những mô hình lớn, thường khó diễn giải Việc hiểu rõ lý do mà một mô hình đưa ra một quyết định cụ thể có thể là một thách thức.
- Dữ liệu không đầy đủ và không chính xác: Transformer có thể nhạy cảm với dữ liệu huấn luyện không đầy đủ hoặc không chính xác, có thể dẫn đến kết quả dự đoán không chính xác.
- Vấn đề đa ngôn ngữ: Trong một số trường hợp, đặc biệt là khi đối mặt với ngôn ngữ ngôn ngữ hiếm hoặc dữ liệu đa ngôn ngữ, hiệu suất của Transformer có thể bị giảm.
So sánh với các mô hình khác
a Recurrent Neural Networks (RNNs) và Long Short-Term Memory (LSTM) Ưu điểm Nhược điểm
Transformer - Khả năng xử lý mối quan hệ dài hạn tốt hơn
- Có thể được parallelized dễ dàng, không bị ảnh hưởng bởi vấn đề vanishing/exploding gradients Đôi khi không giữ được thứ tự tuần tự tự nhiên
RNNs và LSTM Giữ được thông tin tuần tự, phù hợp cho nhiều tác vụ như dự đoán chuỗi thời gian. Đối mặt với vấn đề vanishing/exploding gradients, khả năng parallelization kém. b Convolutional Neural Networks (CNNs) Ưu điểm Nhược điểm
Transformer Phù hợp cho xử lý dữ liệu không có tính chất lưới (grid-like) như ngôn ngữ tự nhiên.
Yêu cầu một lượng lớn dữ liệu để đào tạo hiệu quả.
CNNs Hiệu quả cho việc xử lý ảnh và dữ liệu có tính chất lưới.
Không thích hợp cho dữ liệu không có cấu trúc lưới. c Gated Recurrent Units (GRUs) Ưu điểm Nhược điểm
Transformer Xử lý mối quan hệ dài hạn tốt, có khả năng parallelization Không giữ thứ tự tự nhiên của dữ liệu.
GRUs Giữ được thông tin quan trọng trong chuỗi một cách linh hoạt, giảm vấn đề vanishing gradients.
Vẫn đối mặt với vấn đề vanishing gradients, không thể parallelized hoàn toàn. d Bidirectional Encoder Representations from Transformers (BERT) Ưu điểm Nhược điểm
Transformer Dễ parallelize, phù hợp cho nhiều mục đích khác nhau Cần lượng lớn dữ liệu để đào tạo hiệu quả.
BERT Hiểu bối cảnh của từ/ngữ từ cả Đòi hỏi tài nguyên tính vụ NLP hợp cho môi trường có tài nguyên hạn chế.
Transformer đang dần trở thành một chủ đề lớn và quan trọng trong lĩnh vực thị giác máy tính nhờ hiệu suất cạnh tranh và tiềm năng lớn so với mạng CNN Để khám phá và tận dụng sức mạnh của transformer, như được tóm tắt trong trong bài nghiên cứu này, một số phương pháp đã được đề xuất trong những năm gần đây Các phương pháp này đã cho thấy hiệu suất xuất sắc trên nhiều bài toán thị giác, bao gồm cả các bài toán sử dụng transformer, thị giác cấp cao/ mức trung, thị giác cấp thấp và xử lý video.
Tuy nhiên, tiềm năng của transformer trong thị giác máy tính vẫn chưa được khai thác đầy đủ, điều này đồng nghĩa với việc cần giải quyết một số thách thức Trong phần này, chúng ta thảo luận về những thách thức và đưa ra cái nhìn về triển vọng trong tương lai.
Một hướng nghiên cứu là tính hiệu quả và hiệu suất của transformers trong thị giác máy tính Mục tiêu là phát triển vision transformers với hiệu suất và tài nguyên tối ưu; cụ thể là transformers có hiệu năng cao và tài nguyên thấp Hiệu suất sẽ xác định xem mô hình có thể áp dụng trong các ứng dụng thực tế, trong khi tài nguyên ảnh hưởng đến việc triển khai trên các thiết bị Hiệu quả thường có liên quan đến hiệu suất, do đó, xác định cách đạt được sự cân bằng tốt hơn giữa hai yếu tố này là một chủ đề tốt cho nghiên cứu trong tương lai.