1. Hiểu về Transformers
Kiến trúc Transformer đã thể hiện tính linh hoạt của nó trong nhiều ứng dụng khác nhau. Mạng gốc ban đầu được giới thiệu dưới dạng kiến trúc mã hóa-giải mã (encoder-decoder) cho các nhiệm vụ dịch thuật. Sự phát triển tiếp theo của kiến trúc Transformer bắt đầu với sự ra đời của các mô hình chỉ sử dụng bộ mã hóa (encoder-only) như BERT, sau đó là sự xuất hiện của các mô hình chỉ sử dụng bộ giải mã (decoder-only) trong những phiên bản đầu tiên của GPT.
Sự khác biệt giữa các mô hình này không chỉ nằm ở thiết kế mạng mà còn ở các mục tiêu học tập. Những mục tiêu học tập khác nhau này đóng vai trò quan trọng trong việc định hình hành vi và kết quả của mô hình. Việc hiểu rõ những khác biệt này là điều cần thiết để lựa chọn kiến trúc phù hợp nhất cho từng nhiệm vụ cụ thể và đạt được hiệu suất tối ưu trong các ứng dụng khác nhau.
Trong chương này, chúng ta sẽ đi sâu vào tìm hiểu về transformers, cung cấp cái nhìn toàn diện về các thành phần khác nhau và cơ chế hoạt động bên trong của mạng. Chúng ta cũng sẽ xem xét bài báo nổi tiếng "Attention is All You Need".
Ngoài ra, chúng ta sẽ tải các mô hình đã được huấn luyện sẵn để làm nổi bật sự khác biệt giữa kiến trúc Transformer và GPT. Đồng thời, chúng ta cũng sẽ khám phá những đổi mới mới nhất trong lĩnh vực này với các mô hình đa phương thức lớn (Large Multimodal Models - LMMs).
1.1 Attention Is All You Need
Đây là một tiêu đề đáng nhớ trong lĩnh vực xử lý ngôn ngữ tự nhiên (NLP). Bài báo "Attention Is All You Need" đánh dấu một cột mốc quan trọng trong sự phát triển của các kiến trúc mạng nơ-ron dành cho NLP. Nghiên cứu này là kết quả hợp tác giữa Google Brain và Đại học Toronto, giới thiệu mô hình Transformer, một mạng mã hóa-giải mã (encoder-decoder) sử dụng cơ chế attention cho các nhiệm vụ dịch tự động.
Mô hình Transformer đã đạt được điểm số 41.8 trên bộ dữ liệu WMT 2014 trong nhiệm vụ dịch từ tiếng Anh sang tiếng Pháp, thiết lập một tiêu chuẩn mới (state-of-the-art). Đáng chú ý, mức hiệu suất này đạt được chỉ sau 3,5 ngày huấn luyện trên tám GPU, cho thấy một sự giảm đáng kể về chi phí huấn luyện so với các mô hình trước đó.
Transformers đã thay đổi hoàn toàn lĩnh vực NLP và thể hiện hiệu quả vượt trội trong nhiều tác vụ khác ngoài dịch thuật, bao gồm phân loại (classification), tóm tắt (summarization) và sinh ngôn ngữ (language generation). Một trong những đổi mới quan trọng nhất của Transformer là cấu trúc mạng được song song hóa cao (highly parallelized network structure), giúp cải thiện cả hiệu suất và hiệu quả trong quá trình huấn luyện.
1.2 Kiến trúc Transformer
Bây giờ, chúng ta sẽ xem xét chi tiết hơn về các thành phần quan trọng của mô hình Transformer. Như được minh họa trong sơ đồ, kiến trúc ban đầu được thiết kế cho các nhiệm vụ xử lý chuỗi sang chuỗi (sequence-to-sequence), nơi một chuỗi đầu vào được xử lý để tạo ra một chuỗi đầu ra tương ứng, chẳng hạn như trong bài toán dịch thuật. Trong quá trình này, bộ mã hóa (encoder) tạo ra một biểu diễn của cụm từ đầu vào, và bộ giải mã (decoder) sử dụng biểu diễn này để tạo ra đầu ra.
Mô hình Transformer bao gồm hai thành phần chính: bộ mã hóa ở bên trái, được kết nối với bộ giải mã thông qua cơ chế cross-attention. Sự phát triển tiếp theo của kiến trúc này đã dẫn đến việc phân chia nó thành ba loại riêng biệt, mỗi loại có khả năng chuyên biệt trong việc xử lý các tác vụ khác nhau:
- Mô hình chỉ sử dụng bộ mã hóa (encoder-only): Chuyên dùng để trích xuất các biểu diễn có ý nghĩa từ dữ liệu đầu vào. Một ví dụ tiêu biểu trong nhóm này là BERT, thường được sử dụng cho các nhiệm vụ như phân loại văn bản.
- Mô hình kết hợp bộ mã hóa và bộ giải mã (encoder-decoder): Thích hợp cho các nhiệm vụ xử lý chuỗi sang chuỗi như dịch thuật, tóm tắt văn bản và huấn luyện các mô hình đa phương thức (multimodal models) như hệ thống tạo phụ đề ảnh. Một ví dụ điển hình thuộc nhóm này là BART.
- Mô hình chỉ sử dụng bộ giải mã (decoder-only): Được thiết kế đặc biệt để tạo nội dung dựa trên hướng dẫn đầu vào, thường thấy trong các mô hình ngôn ngữ lớn (LLM). Một đại diện tiêu biểu của nhóm này là dòng mô hình GPT.
Tiếp theo, chúng ta sẽ thảo luận về những khác biệt giữa các thiết kế này và cách chúng ảnh hưởng đến các nhiệm vụ khác nhau. Tuy nhiên, như có thể thấy từ sơ đồ, nhiều thành phần cốt lõi như lớp nhúng (embedding layer) và cơ chế attention được sử dụng chung giữa cả encoder và decoder. Việc hiểu rõ những yếu tố này sẽ giúp nắm bắt cách mô hình hoạt động từ bên trong.
Phần tiếp theo sẽ trình bày chi tiết về các thành phần quan trọng và hướng dẫn cách tải một mô hình mã nguồn mở để theo dõi từng bước trong quá trình xử lý.
1.2.1 Nhúng đầu vào (Input Embedding)
Trong kiến trúc Transformer, bước đầu tiên là chuyển đổi các token đầu vào (từ hoặc phân đoạn từ) thành các vector nhúng (embeddings). Các vector này có kích thước cao và chứa thông tin ngữ nghĩa của token đầu vào. Có thể hình dung chúng như một danh sách lớn gồm nhiều đặc điểm mô tả từ được nhúng. Danh sách này bao gồm hàng nghìn số mà mô hình tự học để biểu diễn thế giới thực.
Thay vì làm việc trực tiếp với câu, từ và từ đồng nghĩa theo cách con người hiểu ngôn ngữ, mô hình Transformer so sánh các từ bằng cách thao tác trên các danh sách số. Bằng cách thực hiện các phép tính đơn giản như cộng và trừ các vector, mô hình có thể xác định xem hai từ có liên quan đến nhau hay không. Cách tiếp cận này phức tạp hơn nhiều so với việc chỉ hiểu nghĩa của từ một cách trực tiếp.
Do đó, kích thước của các vector nhúng thường rất lớn. Khi không thể hiểu trực tiếp ý nghĩa của từ, mô hình cần hàng nghìn giá trị để biểu diễn chúng. Kích thước này thay đổi tùy theo kiến trúc mô hình. Chẳng hạn, GPT-3 của OpenAI sử dụng vector nhúng có kích thước 12.000 chiều, trong khi các mô hình nhỏ hơn như BERT chỉ sử dụng vector 768 chiều. Lớp nhúng này đóng vai trò nền tảng, giúp mô hình xử lý đầu vào một cách hiệu quả cho các lớp tiếp theo.
1.2.2 Mã hóa vị trí (Positional Encoding)
Các mô hình trước đây như Mạng Nơ-ron Hồi quy (Recurrent Neural Networks - RNNs) xử lý đầu vào theo thứ tự tuần tự, từng token một, giúp chúng giữ nguyên thứ tự từ trong câu một cách tự nhiên. Tuy nhiên, Transformer không có khả năng xử lý tuần tự như vậy. Thay vào đó, nó sử dụng mã hóa vị trí (positional encoding) để duy trì thứ tự của các từ trong một cụm từ.
Các mã hóa vị trí này là các vector chứa các giá trị đặc biệt tại mỗi vị trí. Khi kết hợp với vector nhúng của đầu vào, chúng cung cấp thông tin về vị trí tương đối hoặc tuyệt đối của từng token trong chuỗi. Điều này giúp mô hình xác định thứ tự từ, một yếu tố quan trọng để hiểu được ngữ cảnh và ý nghĩa của câu.
1.2.3 Cơ chế Self-Attention
Cơ chế self-attention là trung tâm của mô hình Transformer, giúp tính toán tổng có trọng số của các vector nhúng của tất cả các từ trong một câu. Trọng số này được xác định dựa trên các điểm số attention được học giữa các từ. Những từ có liên quan chặt chẽ với nhau sẽ được gán trọng số attention cao hơn.
Cơ chế self-attention được triển khai thông qua ba loại vector: Query, Key và Value. Dưới đây là mô tả ngắn gọn về từng loại:
- Query Vector: Đây là vector đại diện cho từ (hoặc token) cần tính trọng số attention. Nó xác định những phần nào trong chuỗi đầu vào nên được ưu tiên. Khi nhân vector nhúng của từ với Query vector, mô hình đang hỏi: "Tôi nên tập trung vào điều gì?"
- Key Vector: Đây là tập hợp các từ hoặc token trong chuỗi đầu vào được so sánh với Query. Key vector giúp xác định thông tin quan trọng trong chuỗi đầu vào. Khi nhân vector nhúng với Key vector, mô hình đang tự hỏi: "Những thông tin nào là quan trọng?"
- Value Vector: Lưu trữ thông tin hoặc đặc điểm liên quan đến từng từ trong chuỗi đầu vào. Nó chứa dữ liệu thực tế sẽ được điều chỉnh theo trọng số attention giữa Query và Key. Value vector trả lời câu hỏi: "Chúng ta có thông tin gì?"
Trước khi Transformer ra đời, cơ chế attention chủ yếu được sử dụng để so sánh hai phần khác nhau của một văn bản. Ví dụ, trong bài toán tóm tắt văn bản, mô hình có thể tập trung vào các đoạn quan trọng trong bài viết gốc khi tạo ra bản tóm tắt.
Cơ chế self-attention cho phép mô hình xác định những phần quan trọng nhất của văn bản mà không cần một chuỗi tham chiếu khác. Nó có thể được sử dụng trong cả mô hình chỉ dùng bộ mã hóa (encoder-only) hoặc chỉ dùng bộ giải mã (decoder-only) để tạo ra biểu diễn mạnh mẽ cho đầu vào. Trong các mô hình chỉ sử dụng bộ mã hóa, văn bản đầu vào được chuyển thành các vector nhúng có ý nghĩa. Ngược lại, trong các mô hình chỉ sử dụng bộ giải mã, self-attention giúp tạo ra văn bản mới dựa trên dữ liệu đã học.
Một cải tiến quan trọng trong Transformer là multi-head attention, giúp tăng độ chính xác của mô hình. Trong cơ chế này, nhiều thành phần attention hoạt động song song trên cùng một đầu vào. Mỗi "head" học cách tập trung vào các đặc điểm khác nhau của văn bản, chẳng hạn như động từ, danh từ, số, hoặc các cấu trúc ngữ nghĩa khác trong quá trình huấn luyện và sinh văn bản. Nhờ đó, mô hình có khả năng xử lý thông tin một cách toàn diện và hiệu quả hơn.
1.3 Kiến trúc Transformer trong thực tế
Trong phần này, chúng ta sẽ xem cách các thành phần trên hoạt động trong một mô hình ngôn ngữ lớn đã được huấn luyện sẵn, sử dụng thư viện Transformers của Hugging Face. Quá trình này sẽ giúp hiểu rõ hơn về cách mô hình xử lý văn bản đầu vào và tạo ra đầu ra.
Chúng ta sẽ tải một bộ mã hóa (tokenizer) để chuyển đổi văn bản thành các mã token, sau đó đưa chúng vào từng lớp của mạng để quan sát đầu ra.
>_ Tải mô hình và Tokenizer
Chúng ta sẽ sử dụng mô hình OPT 1.3B của Facebook, tải ở định dạng 8-bit để tiết kiệm bộ nhớ GPU. Tokenizer giúp chuyển đổi văn bản đầu vào thành mã token cùng với attention mask.
Kết quả đầu ra:
input_ids
: Mã hóa văn bản thành các token ID.
attention_mask
: Vector giúp mô hình xác định những token nào cần được xử lý. Giá trị 1 nghĩa là token sẽ được sử dụng, 0 nghĩa là token bị bỏ qua.
>_ Kiến trúc của mô hình
Chúng ta sẽ kiểm tra kiến trúc của mô hình bằng cách in ra thông tin của nó.
Kết quả đầu ra (rút gọn):
- Mô hình decoder-only có 24 lớp xếp chồng lên nhau.
- Lớp nhúng (embedding) giúp chuyển đổi token ID thành vector có kích thước 2048 chiều.
- Mã hóa vị trí (positional encoding) giúp mô hình hiểu vị trí của từng từ trong câu.
>_ Xử lý lớp Nhúng
Chúng ta truy cập vào lớp nhúng bằng phương thức .embed_tokens()
và kiểm tra đầu ra của nó.
Kết quả đầu ra:
- Kích thước đầu vào:
[1, 10]
→ Danh sách token ID.
- Kích thước đầu ra:
[1, 10, 2048]
→ Mỗi token được chuyển thành vector 2048 chiều.
>_ Xử lý mã hóa vị trí
Chúng ta sử dụng .embed_positions()
để tạo mã hóa vị trí.
Kết quả đầu ra:
- Mã hóa vị trí là một vector đặc biệt, được cộng với vector nhúng để giữ nguyên thứ tự từ trong câu.
>_ Xử lý Self-Attention
Self-Attention được truy cập từ lớp đầu tiên của decoder.
Kết quả đầu ra:
- Self-attention nhận đầu vào là tổng của vector nhúng và mã hóa vị trí.
- Kết quả đầu ra vẫn giữ nguyên kích thước
[1, 10, 2048]
, nhưng giá trị đã được biến đổi qua self-attention.
2. Lựa chọn thiết kế trong mô hình Transformer
Kiến trúc Transformer đã chứng minh được khả năng thích ứng với nhiều loại ứng dụng khác nhau. Mô hình gốc ban đầu được giới thiệu để thực hiện nhiệm vụ dịch máy với kiến trúc mã hóa-giải mã (encoder-decoder). Sau đó, sự phát triển của Transformer tiếp tục với sự ra đời của các mô hình chỉ sử dụng bộ mã hóa, như BERT, và tiếp theo là các mô hình chỉ sử dụng bộ giải mã trong phiên bản đầu tiên của GPT.
Sự khác biệt giữa các mô hình này không chỉ nằm ở kiến trúc mạng mà còn ở mục tiêu học tập (learning objectives). Những mục tiêu này ảnh hưởng đáng kể đến cách mô hình hoạt động và tạo ra kết quả. Việc hiểu rõ các sự khác biệt này rất quan trọng để lựa chọn mô hình phù hợp nhất cho từng tác vụ và đạt hiệu suất tối ưu trong các ứng dụng khác nhau.
2.1 Kiến trúc mã hóa-giải mã (Encoder-Decoder)
Mô hình Transformer đầy đủ, thường được gọi là mô hình encoder-decoder, bao gồm nhiều lớp mã hóa được xếp chồng lên nhau, được kết nối với nhiều lớp giải mã thông qua cơ chế cross-attention. Kiến trúc này giống với phần đã trình bày trước đó.
Mô hình này đặc biệt hiệu quả trong các bài toán cần chuyển đổi một chuỗi đầu vào thành một chuỗi đầu ra khác, chẳng hạn như dịch thuật hoặc tóm tắt văn bản, nơi cả đầu vào và đầu ra đều ở dạng văn bản. Ngoài ra, nó cũng rất hữu ích trong các ứng dụng đa phương thức (multimodal applications), chẳng hạn như tạo chú thích ảnh (image captioning), trong đó đầu vào là một hình ảnh và đầu ra là câu mô tả ảnh. Trong các trường hợp này, cơ chế cross-attention đóng vai trò quan trọng, giúp bộ giải mã tập trung vào những phần nội dung có liên quan nhất trong quá trình tạo đầu ra.
Một ví dụ tiêu biểu cho phương pháp này là mô hình BART, một mô hình được huấn luyện trước theo cách tiếp cận mã hóa-giải mã. BART có một bộ mã hóa hai chiều (bidirectional encoder) giúp tạo ra biểu diễn chi tiết của đầu vào. Trong khi đó, bộ giải mã autoregressive tạo ra đầu ra theo từng token một cách tuần tự.
Mô hình này hoạt động bằng cách nhận một đầu vào có một số phần bị che đi (masked) cùng với một phiên bản đầu vào đã được dịch chuyển một token. Nhiệm vụ của mô hình là khôi phục lại văn bản gốc, đây chính là mục tiêu học tập của nó.
Dưới đây là đoạn mã tải mô hình BART để kiểm tra kiến trúc của nó:
Chúng ta đã quen thuộc với hầu hết các lớp trong mô hình BART. Mô hình bao gồm hai thành phần: bộ mã hóa và bộ giải mã, mỗi thành phần có 12 lớp. Đặc biệt, bộ giải mã có thêm một lớp encoder_attn, còn được gọi là cross-attention. Thành phần cross-attention này giúp điều chỉnh đầu ra của bộ giải mã dựa trên biểu diễn của bộ mã hóa.
Chúng ta có thể sử dụng chức năng pipeline của thư viện transformers cùng với phiên bản đã được tinh chỉnh của mô hình này để thực hiện nhiệm vụ tóm tắt văn bản.
Kết quả đầu ra:
2.2 Kiến trúc chỉ sử dụng bộ mã hóa (Encoder-Only Architecture)
Tổng quan về kiến trúc chỉ sử dụng bộ mã hóa bao gồm các thành phần attention và feedforward. Mô hình nhận đầu vào, thực hiện quá trình nhúng, đi qua nhiều khối mã hóa (encoder blocks) và đầu ra thường được gửi đến một khối giải mã (decoder) trong kiến trúc Transformer hoặc được sử dụng trực tiếp cho các nhiệm vụ hiểu ngôn ngữ và phân loại.
Các mô hình chỉ sử dụng bộ mã hóa được tạo ra bằng cách xếp chồng nhiều thành phần mã hóa. Vì đầu ra của bộ mã hóa không thể kết hợp với một bộ giải mã, nên nó chỉ có thể được sử dụng như một phương pháp chuyển đổi văn bản thành vector để đo lường mức độ tương đồng. Nó cũng có thể được kết hợp với một lớp phân loại (classification head) bằng cách thêm một lớp feedforward phía trên để hỗ trợ dự đoán nhãn (còn được gọi là lớp Pooler trong các thư viện như Hugging Face).
Điểm khác biệt cơ bản của kiến trúc chỉ có bộ mã hóa là không có lớp Masked Self-Attention. Do đó, bộ mã hóa có thể xử lý toàn bộ đầu vào cùng một lúc. (Trái ngược với bộ giải mã, nơi các token tương lai phải bị che đi trong quá trình huấn luyện để tránh "gian lận" khi tạo ra các token mới.) Đặc điểm này giúp mô hình đặc biệt phù hợp để tạo ra các biểu diễn vector từ văn bản, đảm bảo giữ lại đầy đủ thông tin.
Bài báo giới thiệu về BERT (hoặc các biến thể cải tiến như RoBERTa) đã giới thiệu một mô hình huấn luyện sẵn giúp cải thiện đáng kể các điểm số state-of-the-art trên nhiều tác vụ NLP. Mô hình này được huấn luyện với hai mục tiêu chính:
- Masked Language Modeling (MLM): Che đi các token ngẫu nhiên trong đầu vào và cố gắng dự đoán các token bị che.
- Next Sentence Prediction (NSP): Xác định xem câu thứ hai có hợp lý theo sau câu thứ nhất trong một chuỗi văn bản hay không.
2.2.1 Kiểm tra kiến trúc của mô hình BERT
Dưới đây là đoạn mã tải mô hình BERT-base-uncased và kiểm tra kiến trúc của nó:
Cấu trúc chính của mô hình BERT:
Mô hình BERT sử dụng kiến trúc Transformer tiêu chuẩn với 12 khối mã hóa được xếp chồng lên nhau. Tuy nhiên, đầu ra của mạng sẽ được truyền qua một lớp pooler, đây là một lớp feed-forward tuyến tính theo sau là một hàm phi tuyến tính (Tanh) để tạo biểu diễn cuối cùng. Biểu diễn này sẽ được sử dụng cho các tác vụ khác như phân loại và đánh giá mức độ tương đồng.
2.2.2 Sử dụng mô hình BERT để phân tích cảm xúc
Dưới đây là đoạn mã sử dụng phiên bản đã tinh chỉnh của mô hình BERT để thực hiện phân tích cảm xúc:
Kết quả đầu ra:
Mô hình dự đoán rằng câu "This restaurant is awesome." có xếp hạng 5 sao với độ tin cậy 85.5%.
2.3 Kiến trúc chỉ sử dụng bộ giải mã (Decoder-Only Architecture)
Tổng quan về kiến trúc chỉ sử dụng bộ giải mã bao gồm các thành phần attention và feedforward. Cả đầu vào và đầu ra được dự đoán gần đây đều được đưa vào mô hình, được nhúng, đi qua nhiều khối giải mã và tạo ra xác suất của token tiếp theo.
Hiện nay, các mô hình ngôn ngữ lớn chủ yếu sử dụng mạng chỉ có bộ giải mã làm nền tảng, đôi khi có một số điều chỉnh nhỏ. Do tích hợp cơ chế masked self-attention, các mô hình này chủ yếu tập trung vào việc dự đoán token tiếp theo, điều này dẫn đến khái niệm prompting.
Theo nghiên cứu, việc mở rộng các mô hình chỉ sử dụng bộ giải mã có thể cải thiện đáng kể khả năng hiểu ngôn ngữ và tổng quát hóa của mạng. Do đó, người dùng có thể thực hiện nhiều tác vụ chỉ bằng cách sử dụng các prompt khác nhau. Các mô hình huấn luyện sẵn lớn như GPT-4 và LLaMA 2 có thể thực hiện các nhiệm vụ như phân loại, tóm tắt, dịch thuật, v.v. bằng cách sử dụng các hướng dẫn phù hợp.
Các mô hình ngôn ngữ lớn (LLM), chẳng hạn như dòng GPT, được huấn luyện với mục tiêu Causal Language Modeling (CLM). Điều này có nghĩa là mô hình cố gắng dự đoán từ tiếp theo, trong khi cơ chế attention chỉ có thể tập trung vào các token trước đó bên trái. Điều này đảm bảo rằng mô hình chỉ dự đoán token tiếp theo dựa trên ngữ cảnh trước đó và không thể nhìn trước token trong tương lai, tránh "gian lận".
2.3.1 Kiểm tra kiến trúc của mô hình GPT-2
Dưới đây là đoạn mã tải mô hình GPT-2 và kiểm tra kiến trúc của nó:
Cấu trúc chính của mô hình GPT-2:
Khi quan sát kiến trúc, ta thấy khối decoder Transformer tiêu chuẩn nhưng không có lớp cross-attention.
Dòng mô hình GPT cũng sử dụng các lớp tuyến tính khác biệt (Conv1D) để chuyển đổi trọng số. (Lưu ý rằng đây không phải là lớp tích chập (convolutional layer) của PyTorch!). Đây là một lựa chọn thiết kế riêng của OpenAI; trong khi đó, các mô hình ngôn ngữ mã nguồn mở lớn khác sử dụng lớp tuyến tính thông thường.
2.3.2 Sử dụng GPT-2 để tạo văn bản
Dưới đây là cách sử dụng mô hình GPT-2 trong pipeline của Hugging Face để tạo văn bản. Mô hình sẽ đưa ra bốn khả năng khác nhau để hoàn thành câu:
Kết quả đầu ra:
3. Kiến trúc Generative Pre-trained Transformer (GPT)
Mô hình Generative Pre-trained Transformer (GPT) của OpenAI là một mô hình ngôn ngữ dựa trên kiến trúc transformer. Thành phần "transformer" trong tên gọi của nó liên quan trực tiếp đến thiết kế transformer, được giới thiệu trong bài báo nghiên cứu "Attention is All You Need" của Vaswani et al.
Trái ngược với các mạng Recurrent Neural Networks (RNNs) truyền thống, vốn gặp khó khăn trong việc xử lý các phụ thuộc dài hạn do vấn đề vanishing gradient, mạng Long Short-Term Memory (LSTM) đã được giới thiệu với kiến trúc phức tạp hơn, sử dụng memory cells để duy trì thông tin trong các chuỗi dài hơn. Tuy nhiên, cả RNNs và LSTMs vẫn dựa vào quá trình xử lý tuần tự, làm hạn chế hiệu suất và tốc độ tính toán.
Ngược lại, kiến trúc transformer loại bỏ hoàn toàn sự tuần tự bằng cách sử dụng cơ chế self-attention, cho phép mô hình xử lý toàn bộ chuỗi đầu vào song song. Điều này cải thiện đáng kể tốc độ và khả năng mở rộng, giúp GPT vượt trội hơn so với các mô hình dựa trên RNNs trước đây.
3.1 Kiến trúc GPT
Dòng mô hình GPT bao gồm các mô hình chỉ sử dụng bộ giải mã, với cơ chế self-attention kết hợp với mạng feed-forward hoàn toàn kết nối theo từng vị trí trong mỗi lớp của kiến trúc.
Cơ chế scaled dot-product attention là một kỹ thuật self-attention cho phép mô hình gán điểm quan trọng cho từng từ trong chuỗi đầu vào trong khi tạo ra các từ tiếp theo. Ngoài ra, masking trong quá trình self-attention là một yếu tố quan trọng của kiến trúc này. Masking giúp mô hình chỉ tập trung vào các phần cần thiết, ngăn không cho nó xem xét một số vị trí hoặc từ trong chuỗi.
Ở một thời điểm cụ thể, mô hình chỉ có thể dự đoán token tiếp theo bằng cách chỉ nhìn vào các token đã được tạo trước đó, trong khi các token tương lai bị che đi. Điều này giúp mô hình tránh "gian lận" bằng cách dự đoán và tận dụng các token mà lẽ ra nó chưa được phép thấy.
Dưới đây là đoạn mã triển khai cơ chế masked self-attention:
Bước đầu tiên là tạo ra các vector Query, Key và Value cho mỗi từ trong chuỗi đầu vào. Điều này được thực hiện bằng cách áp dụng các phép biến đổi tuyến tính riêng biệt cho vector đầu vào. Về bản chất, đây là một lớp mạng feed-forward đơn giản mà mô hình học được trong quá trình huấn luyện.
Tiếp theo, mô hình tính toán điểm attention bằng cách thực hiện phép nhân dot product giữa vector Query của mỗi từ với vector Key của tất cả các từ khác. Để đảm bảo mô hình bỏ qua một số từ trong quá trình tính toán attention, masking được áp dụng bằng cách gán các giá trị âm rất lớn cho điểm số tại các vị trí cụ thể.
Sau đó, hàm softmax chuyển đổi các điểm số attention thành xác suất, vô hiệu hóa tác động của các giá trị âm lớn. Tiếp theo, mỗi vector Value được nhân với trọng số tương ứng của nó và tổng hợp lại để tạo ra đầu ra của cơ chế masked self-attention cho mỗi từ.
Mặc dù mô tả trên minh họa cách một đầu self-attention hoạt động, nhưng trong thực tế, mỗi lớp thường có nhiều đầu attention, thường từ 16 đến 32, tùy thuộc vào kiến trúc của mô hình. Các đầu này hoạt động đồng thời, giúp tăng cường khả năng phân tích và diễn giải dữ liệu của mô hình.
3.2 Mô hình ngôn ngữ nhân quả (Causal Language Modeling)
Các mô hình ngôn ngữ lớn (LLMs) sử dụng phương pháp học tự giám sát (self-supervised learning) để huấn luyện trên dữ liệu mà không cần nhãn rõ ràng. Điều này giúp loại bỏ nhu cầu gán nhãn thủ công trong quá trình huấn luyện. Dữ liệu có thể là văn bản với các từ tiếp theo đã biết trước, hoặc thậm chí là hình ảnh kèm chú thích từ các nền tảng như Instagram. Nhờ đó, LLMs có thể tự học và tích lũy kiến thức.
Ví dụ, nếu sử dụng phương pháp học có giám sát để huấn luyện một mô hình tóm tắt văn bản, ta cần sử dụng các bài báo và bản tóm tắt của chúng làm dữ liệu tham chiếu. Ngược lại, LLMs sử dụng mục tiêu học causal language modeling để học từ dữ liệu văn bản mà không cần nhãn do con người cung cấp.
Tại sao gọi là "causal" (nhân quả)?
Bởi vì dự đoán ở mỗi bước chỉ dựa trên các bước trước đó trong chuỗi, thay vì sử dụng cả các từ trong tương lai.
Sau khi dự đoán một từ, mô hình nối từ đó vào đầu vào ban đầu và tiếp tục dự đoán token tiếp theo. Quá trình này diễn ra lặp lại liên tục, với mỗi token mới được đưa vào mạng để tiếp tục dự đoán.
Trong quá trình tiền huấn luyện, mô hình dần dần tích lũy kiến thức sâu rộng về ngôn ngữ và ngữ pháp. Sau đó, mô hình đã được huấn luyện có thể được tinh chỉnh bằng phương pháp giám sát để phục vụ cho các nhiệm vụ cụ thể hoặc trong các lĩnh vực khác nhau.
Phương pháp này có lợi thế so với các phương pháp khác vì nó mô phỏng sát hơn cách con người viết và nói tự nhiên. Không giống như masked language modeling (MLM), trong đó một số token bị che đi trong đầu vào, causal language modeling xây dựng câu theo trình tự từng từ một. Sự khác biệt này giúp mô hình hoạt động hiệu quả hơn khi xử lý văn bản thực tế, nơi không có các token bị che đi.
Ngoài ra, kỹ thuật này cho phép tận dụng một lượng lớn nội dung chất lượng cao do con người tạo ra, từ các nguồn như sách, Wikipedia, và các trang tin tức. Các tập dữ liệu uy tín này có thể dễ dàng truy cập thông qua các nền tảng như Hugging Face Hub.
3.3 MinGPT
Có nhiều phiên bản triển khai của kiến trúc GPT, mỗi phiên bản được thiết kế phù hợp với các mục đích cụ thể. Mặc dù các chương sau sẽ đề cập đến các thư viện khác phù hợp hơn cho môi trường sản xuất, nhưng một phiên bản thu gọn của mô hình GPT-2 của OpenAI, được phát triển bởi Andrej Karpathy, có tên là minGPT, rất đáng chú ý.
Karpathy mô tả minGPT như một công cụ giáo dục được thiết kế để đơn giản hóa cấu trúc của GPT. Điều đặc biệt là nó được cô đọng chỉ trong khoảng 300 dòng mã và sử dụng thư viện PyTorch. Với thiết kế đơn giản, minGPT là một tài nguyên tuyệt vời để hiểu rõ hơn về cách hoạt động bên trong của các mô hình GPT. Mã nguồn của nó được chú thích rõ ràng, giúp dễ dàng nắm bắt các quy trình liên quan.
Ba tệp quan trọng trong kho lưu trữ minGPT:
- model.py: Chứa kiến trúc chi tiết của mô hình.
- bpe.py: Xử lý quá trình mã hóa token bằng kỹ thuật Byte Pair Encoding (BPE).
- trainer.py: Chứa vòng lặp huấn luyện tổng quát có thể áp dụng cho bất kỳ mạng nơ-ron nào, bao gồm các mô hình GPT.
- demo.ipynb: Là notebook trình bày toàn bộ ứng dụng của mã nguồn, bao gồm cả quá trình suy luận (inference).
Mã nguồn này đủ nhẹ để chạy trên MacBook Air, giúp người dùng dễ dàng thử nghiệm ngay trên máy tính cá nhân. Đối với những ai thích sử dụng nền tảng đám mây, họ có thể fork kho lưu trữ và sử dụng nó trên các nền tảng như Google Colab.
Còn tiếp...
Bình luận