LLM P1 - Pre-training / Tiền huấn luyện

Pre-training / Tiền huấn luyện

Sự phát triển của các mô hình chuỗi thần kinh, chẳng hạn như Transformers [Vaswani et al., 2017], kết hợp cùng những tiến bộ trong học tự giám sát quy mô lớn, đã mở ra cánh cửa cho khả năng hiểu ngôn ngữ và sinh ngôn ngữ ở mức độ tổng quát. Thành tựu này phần lớn đến từ kỹ thuật tiền huấn luyện: chúng ta tách các thành phần dùng chung từ nhiều hệ thống mạng nơ-ron, rồi huấn luyện chúng trên lượng dữ liệu không gán nhãn khổng lồ bằng phương pháp tự giám sát. Các mô hình đã được tiền huấn luyện này đóng vai trò như những “mô hình nền tảng” (foundation models) có thể dễ dàng thích ứng với nhiều tác vụ khác nhau thông qua tinh chỉnh (fine-tuning) hoặc prompt. Kết quả là phương pháp luận trong NLP đã thay đổi rất đáng kể. Trong nhiều trường hợp, người ta không còn cần huấn luyện có giám sát quy mô lớn cho mỗi tác vụ cụ thể nữa, mà chỉ cần điều chỉnh các mô hình nền tảng đã được tiền huấn luyện.

Dù tiền huấn luyện chỉ mới phổ biến trong nghiên cứu NLP vài năm trở lại đây, khái niệm này thực tế đã xuất hiện từ nhiều thập kỷ trước, vào thời kỳ đầu của học sâu. Chẳng hạn, những nỗ lực ban đầu để tiền huấn luyện các hệ thống học sâu bao gồm học không giám sát cho RNNs, mạng feedforward sâu, autoencoder, v.v. [Schmidhuber, 2015]. Trong kỷ nguyên học sâu hiện đại, chúng ta chứng kiến sự hồi sinh của tiền huấn luyện, một phần là do phương pháp học không giám sát quy mô lớn cho các mô hình nhúng từ (word embedding) [Mikolov et al., 2013b; Pennington et al., 2014]. Cùng giai đoạn đó, tiền huấn luyện cũng thu hút sự quan tâm đáng kể trong lĩnh vực thị giác máy tính, khi các mô hình backbone được huấn luyện trên những bộ dữ liệu có gán nhãn tương đối lớn như ImageNet, rồi sau đó áp dụng cho các tác vụ “downstream” khác nhau [He et al., 2019; Zoph et al., 2020]. Các nghiên cứu quy mô lớn về tiền huấn luyện trong NLP bắt đầu với việc phát triển những mô hình ngôn ngữ bằng phương pháp học tự giám sát. Dòng mô hình này bao gồm một số ví dụ nổi tiếng như BERT [Devlin et al., 2019] và GPT [Brown et al., 2020], đều dựa trên ý tưởng rằng khả năng hiểu và sinh ngôn ngữ tổng quát có thể đạt được bằng cách huấn luyện mô hình dự đoán những từ bị che (masked words) trong một lượng văn bản khổng lồ. Mặc dù cách tiếp cận này có vẻ đơn giản, các mô hình thu được lại thể hiện năng lực đáng kể trong việc mô hình hoá cấu trúc ngôn ngữ, dù chúng không được huấn luyện tường minh cho mục tiêu này. Tính tổng quát của các tác vụ tiền huấn luyện giúp các hệ thống đạt hiệu suất cao trên nhiều bài toán NLP, thậm chí vượt qua các hệ thống có giám sát trước đây. Gần đây hơn, các mô hình ngôn ngữ lớn đã được tiền huấn luyện đã gặt hái thành công lớn hơn, mở ra tiềm năng thú vị cho trí tuệ nhân tạo tổng quát hơn [Bubeck et al., 2023].

Trong bài này, chúng thảo luận về khái niệm tiền huấn luyện trong bối cảnh NLP. Mở đầu bằng phần giới thiệu tổng quát về các phương pháp tiền huấn luyện và ứng dụng của chúng. BERT được dùng làm ví dụ để minh hoạ cách một mô hình chuỗi được huấn luyện thông qua tác vụ tự giám sát gọi là masked language modeling. Sau đó, chương sẽ bàn về các phương pháp để điều chỉnh (adapt) những mô hình chuỗi đã được tiền huấn luyện cho các tác vụ NLP khác nhau. Lưu ý rằng trong phần này, chúng ta chủ yếu tập trung vào phương pháp tiền huấn luyện trong NLP, và do đó, không đề cập chi tiết đến các mô hình ngôn ngữ lớn mang tính tạo sinh (generative large language models). Việc thảo luận chi tiết những mô hình này sẽ được dành cho các bài tiếp theo.

1.1 Tiền huấn luyện (Pre-training) các mô hình NLP

Việc thảo luận về các vấn đề tiền huấn luyện trong Xử lý Ngôn ngữ Tự nhiên (NLP) thường xoay quanh hai loại bài toán chính: mô hình hoá chuỗi (hay mã hoá chuỗi) và sinh chuỗi. Mặc dù hai bài toán này có hình thức khác nhau, để đơn giản, chúng ta mô tả chúng dựa trên một mô hình duy nhất được định nghĩa như sau:

$$ \mathbf{o} = g(x_0, x_1, \ldots, x_m; \theta) \;=\; g_{\theta}(x_0, x_1, \ldots, x_m) \quad (1.1) $$

Trong đó $\{x_0, x_1, \ldots, x_m\}$ là một dãy các token đầu vào, $x_0$ là một ký hiệu đặc biệt (chẳng hạn $\langle s \rangle$ hoặc $[CLS]$) được gắn vào đầu chuỗi. Hàm $g(\cdot;\theta)$ (thường được ký hiệu là $g_{\theta}(\cdot)$) biểu diễn một mạng nơ-ron với tham số $\theta$, còn $\mathbf{o}$ là đầu ra của mạng này. Hình thức của $\mathbf{o}$ tuỳ thuộc vào bài toán cụ thể. Ví dụ, trong bài toán dự đoán token (như mô hình ngôn ngữ), $\mathbf{o}$ có thể là phân phối xác suất trên từ vựng; trong các bài toán mã hoá chuỗi, $\mathbf{o}$ thường là biểu diễn dạng vector thực của chuỗi đầu vào.

Có hai vấn đề then chốt ở đây:

  • Tối ưu $\theta$ trên một tác vụ tiền huấn luyện. Khác với các bài toán học tiêu chuẩn trong NLP, tiền huấn luyện không giả định một bài toán “downstream” (bài toán đích) cụ thể để áp dụng mô hình. Thay vào đó, mục tiêu là huấn luyện được một mô hình có khả năng khái quát hoá trên nhiều tác vụ khác nhau.
  • Áp dụng mô hình $g_{\hat{\theta}}(\cdot)$ đã được tiền huấn luyện vào các tác vụ “downstream.” Để thích nghi với những tác vụ này, chúng ta cần điều chỉnh nhẹ tham số $\hat{\theta}$ bằng dữ liệu có gán nhãn, hoặc cung cấp thêm lời nhắc (prompt) mô tả tác vụ cho mô hình.

Dưới đây, chúng ta sẽ tìm hiểu những ý tưởng cơ bản để giải quyết hai vấn đề trên.

1.1.1 Tiền huấn luyện không giám sát, có giám sát và tự giám sát

Trong học sâu (deep learning), tiền huấn luyện là quá trình tối ưu một mạng nơ-ron trước khi tiếp tục huấn luyện (fine-tune) nó cho các tác vụ cụ thể. Cách tiếp cận này dựa trên giả định rằng một mô hình đã được huấn luyện cho một tác vụ có thể thích nghi để thực hiện một tác vụ khác. Nhờ đó, ta không cần xây dựng mạng nơ-ron sâu phức tạp ngay từ đầu trên những tác vụ ít dữ liệu gán nhãn. Thay vào đó, ta có thể tận dụng các tác vụ mà tín hiệu “giám sát” (supervision) dễ dàng thu thập hơn, qua đó giảm bớt sự phụ thuộc vào dữ liệu gán nhãn riêng cho từng bài toán, và phát triển các mô hình mang tính tổng quát hơn.

Trong giai đoạn bùng nổ của mạng nơ-ron sâu, nhiều nỗ lực đầu tiên nhằm đạt được tiền huấn luyện tập trung vào học không giám sát. Ở đó, các tham số của mạng nơ-ron được tối ưu theo một tiêu chí không liên quan trực tiếp đến tác vụ cụ thể. Chẳng hạn, ta có thể tối thiểu hoá hàm mất mát dạng cross-entropy tái tạo (reconstruction cross-entropy) của vector đầu vào tại mỗi tầng (theo Bengio et al., 2006). Phương pháp này thường được sử dụng như một bước tiền xử lý trước khi thực hiện học có giám sát, giúp khám phá những cực tiểu tốt hơn và thêm hiệu ứng chuẩn hoá (regularization) vào quá trình huấn luyện (Erhan et al., 2010). Những lợi ích này khiến giai đoạn học có giám sát kế tiếp trở nên dễ dàng và ổn định hơn.

Bên cạnh đó, một hướng khác là tiền huấn luyện có giám sát, tức huấn luyện mạng nơ-ron trên các tác vụ có sẵn nhãn. Ví dụ, hãy xem xét một mô hình chuỗi (sequence model) được thiết kế để mã hoá chuỗi đầu vào thành các biểu diễn. Trong giai đoạn tiền huấn luyện, mô hình này được kết hợp với một tầng phân loại để tạo thành hệ phân loại, rồi huấn luyện trên một tác vụ sơ bộ (chẳng hạn phân loại cảm xúc của câu: tích cực hay tiêu cực). Sau đó, ta thích nghi mô hình chuỗi này cho một tác vụ “downstream” khác. Ta xây dựng một hệ phân loại mới dựa trên mô hình chuỗi đã được tiền huấn luyện và một tầng phân loại mới (ví dụ: phân loại câu mang tính chủ quan hay khách quan). Thông thường, ta cần fine-tune tham số của mô hình bằng dữ liệu gán nhãn đặc thù cho tác vụ, nhằm tối ưu hoá hiệu suất trên dữ liệu mới. Ưu điểm của cách tiếp cận có giám sát là quá trình huấn luyện (dù ở giai đoạn tiền huấn luyện hay tinh chỉnh) đều khá trực quan, tuân theo quy trình học có giám sát quen thuộc trong máy học. Tuy nhiên, khi mô hình càng phức tạp, nhu cầu về dữ liệu gán nhãn càng lớn, dẫn đến khó khăn nếu không có dữ liệu quy mô lớn.

Một cách tiếp cận thứ ba để tiền huấn luyện là học tự giám sát (self-supervised learning). Ở đây, mạng nơ-ron được huấn luyện dựa trên tín hiệu giám sát do chính nó tạo ra, thay vì do con người cung cấp. Thông thường, hệ thống sẽ tự xây dựng các bài toán huấn luyện ngay từ dữ liệu không gán nhãn, ví dụ sinh nhãn giả (pseudo labels). Mặc dù học tự giám sát mới nổi gần đây và rất phổ biến trong NLP, ý tưởng này không hề mới. Trong học máy, một khái niệm liên quan là tự huấn luyện (self-training), trong đó mô hình được cải tiến dần bằng cách học từ các nhãn giả áp cho tập dữ liệu. Ta cần một lượng dữ liệu ban đầu để huấn luyện ra mô hình khởi đầu, rồi mô hình sẽ gán nhãn giả cho dữ liệu chưa gán nhãn. Sau đó, các nhãn giả này tiếp tục được dùng để cải tiến và “bootstrapping” mô hình. Phương pháp này đã được dùng thành công trong nhiều lĩnh vực NLP, như rút gọn đa nghĩa từ vựng (word sense disambiguation) (Yarowsky, 1995) hay phân loại văn bản (Blum and Mitchell, 1998). Điểm khác biệt là trong học tự giám sát ở NLP, ta không cần mô hình khởi đầu để gán nhãn dữ liệu. Thay vào đó, toàn bộ tín hiệu giám sát đều được sinh ra từ chính văn bản, và mô hình được huấn luyện từ đầu. Một ví dụ nổi tiếng là huấn luyện mô hình chuỗi bằng cách lần lượt dự đoán một từ bị che (masked word) dựa trên các từ trước hoặc sau nó trong văn bản. Phương pháp này cho phép học tự giám sát trên quy mô lớn cho mạng nơ-ron sâu, góp phần đem lại thành công cho tiền huấn luyện trong nhiều tác vụ đọc hiểu, sinh văn bản và suy luận.

Hình 1.1 (xem ở dưới) minh hoạ sự so sánh giữa ba cách tiếp cận tiền huấn luyện trên. Tiền huấn luyện tự giám sát hiện nay nổi bật đến mức hầu hết các mô hình NLP tiên tiến đều sử dụng phương pháp này. Vì vậy, trong chương này và xuyên suốt cuốn sách, chúng ta sẽ tập trung vào phương pháp tự giám sát, chỉ ra cách các mô hình chuỗi được huấn luyện nhờ tự giám sát và cách sử dụng các mô hình đã được tiền huấn luyện.

1.1.2 Điều chỉnh mô hình tiền huấn luyện

Như đã đề cập ở trên, có hai loại mô hình chính được sử dụng rộng rãi trong tiền huấn luyện NLP.

  • Mô hình mã hóa chuỗi. Khi nhận một chuỗi từ hoặc token, mô hình mã hóa chuỗi biểu diễn chuỗi này dưới dạng một vector giá trị thực hoặc một chuỗi các vector, và thu được biểu diễn của chuỗi. Biểu diễn này thường được sử dụng làm đầu vào cho một mô hình khác, chẳng hạn như hệ thống phân loại câu.

Hình 1.1: Minh họa tiền huấn luyện không giám sát, có giám sát và tự giám sát.

Trong tiền huấn luyện không giám sát, việc huấn luyện được thực hiện trên dữ liệu không gán nhãn quy mô lớn. Quá trình này có thể được coi là một bước sơ bộ để có một điểm khởi đầu tốt cho quá trình tối ưu hóa tiếp theo, mặc dù vẫn cần nỗ lực đáng kể để tiếp tục huấn luyện mô hình với dữ liệu có gán nhãn sau khi tiền huấn luyện. Trong tiền huấn luyện có giám sát, giả định chính là các bài toán học có giám sát khác nhau có liên quan đến nhau. Do đó, chúng ta có thể huấn luyện mô hình trên một tác vụ trước, rồi chuyển mô hình đó sang một tác vụ khác với một số điều chỉnh hoặc tinh chỉnh. Trong tiền huấn luyện tự giám sát, mô hình được huấn luyện trên dữ liệu không gán nhãn quy mô lớn thông qua cơ chế tự giám sát. Cách này giúp huấn luyện mô hình một cách hiệu quả và có thể dễ dàng điều chỉnh nó cho các tác vụ mới thông qua fine-tuning hoặc prompting.

  • Mô hình sinh chuỗi. Trong NLP, sinh chuỗi thường đề cập đến bài toán tạo ra một chuỗi token dựa trên một ngữ cảnh nhất định. Thuật ngữ ngữ cảnh có các ý nghĩa khác nhau tùy vào ứng dụng. Ví dụ, trong mô hình ngôn ngữ, nó có thể là các token đứng trước, còn trong dịch máy, nó là chuỗi từ ngôn ngữ nguồn.

Chúng ta cần các kỹ thuật khác nhau để áp dụng những mô hình này vào các tác vụ “downstream” sau khi tiền huấn luyện. Dưới đây là hai phương pháp mà chúng ta quan tâm.

1.1.2.1 Tinh chỉnh mô hình tiền huấn luyện

Đối với tiền huấn luyện mô hình mã hóa chuỗi, một phương pháp phổ biến để điều chỉnh mô hình tiền huấn luyện là fine-tuning. Giả sử Encodeθ(⋅) là một bộ mã hóa với tham số θ, ví dụ như một bộ mã hóa Transformer tiêu chuẩn. Nếu chúng ta đã tiền huấn luyện mô hình theo một cách nào đó và có được tham số tối ưu θ̂, chúng ta có thể sử dụng nó để mô hình hóa bất kỳ chuỗi nào và tạo ra biểu diễn tương ứng, như sau:

H = Encodeθ̂(x)

Trong đó x là chuỗi đầu vào {x0, x1, ..., xm}, và H là biểu diễn đầu ra, bao gồm một chuỗi vector có giá trị thực {h0, h1, ..., hm}. Do bộ mã hóa không hoạt động như một hệ thống NLP độc lập, nó thường được tích hợp làm một thành phần trong hệ thống lớn hơn.

Chúng ta có thể xây dựng một hệ thống phân loại văn bản bằng cách thêm một bộ phân loại phía trên bộ mã hóa. Giả sử Classifyω(⋅) là một mạng nơ-ron với tham số ω. Khi đó, mô hình phân loại có thể biểu diễn như sau:

Prω,θ̂(⋅|x) = Classifyω(H) = Classifyω(Encodeθ̂(x))

Ở đây, Prω,θ̂(⋅|x) là phân phối xác suất trên tập nhãn {tích cực, tiêu cực, trung tính}, và nhãn có xác suất cao nhất sẽ được chọn làm đầu ra. Để đơn giản, ta ký hiệu Fω,θ̂(⋅) thay thế cho Classifyω(Encodeθ̂(⋅)).

Do các tham số ωθ̂ chưa được tối ưu hóa cho tác vụ phân loại, chúng ta không thể sử dụng trực tiếp mô hình này. Thay vào đó, chúng ta cần điều chỉnh lại mô hình sao cho phù hợp với tác vụ cụ thể. Một phương pháp phổ biến là tinh chỉnh mô hình bằng cách sử dụng nhãn rõ ràng trong các tác vụ downstream. Chúng ta có thể huấn luyện Fω,θ̂(⋅) trên một tập dữ liệu có gán nhãn, coi đây là một bài toán học có giám sát thông thường. Kết quả của quá trình tinh chỉnh là các tham số ω̃θ̃ được tối ưu hóa thêm. Ngoài ra, ta cũng có thể đóng băng tham số của bộ mã hóa θ̂ để giữ nguyên trạng thái đã được tiền huấn luyện và chỉ tập trung tối ưu hóa tham số ω. Điều này giúp bộ phân loại thích nghi hiệu quả với bộ mã hóa tiền huấn luyện.


Phân loại văn bản bằng mô hình tinh chỉnh

Sau khi có mô hình đã tinh chỉnh, chúng ta có thể sử dụng nó để phân loại văn bản mới. Giả sử chúng ta có một bình luận trên trang web du lịch như sau:

"Tôi rất thích đồ ăn ở đây. Thật tuyệt vời!"

Chúng ta đầu tiên sẽ mã hóa văn bản này thành các token, sau đó đưa chuỗi token xnew vào mô hình đã tinh chỉnh Fω̃,θ̃(⋅). Mô hình sẽ sinh ra phân phối xác suất trên các lớp nhãn như sau:

Fω̃,θ̃(xnew) = [ Pr(tích cực | xnew) Pr(tiêu cực | xnew) Pr(trung tính | xnew) ]

Nhãn có xác suất lớn nhất sẽ được chọn làm đầu ra. Trong ví dụ này, nhãn được chọn là tích cực.

Nhìn chung, lượng dữ liệu được gắn nhãn được sử dụng trong tinh chỉnh là nhỏ so với dữ liệu tiền huấn luyện, do đó tinh chỉnh ít tốn kém hơn về mặt tính toán. Điều này làm cho việc điều chỉnh các mô hình được đào tạo trước trở nên rất hiệu quả trong thực tế: với một mô hình được đào tạo trước và một tác vụ hạ nguồn, chúng ta chỉ cần thu thập một số dữ liệu được gắn nhãn và điều chỉnh nhẹ các tham số mô hình trên dữ liệu này. Có thể tìm thấy thảo luận chi tiết hơn về tinh chỉnh trong Phần 1.4.

1.1.2.2 Sử dụng Mô hình Tiền huấn luyện (Prompting of Pre-trained Models)

Không giống như các mô hình mã hóa chuỗi (sequence encoding models), các mô hình sinh chuỗi (sequence generation models) thường được sử dụng độc lập để giải quyết các bài toán tạo sinh ngôn ngữ, chẳng hạn như trả lời câu hỏi và dịch máy, mà không cần thêm các mô-đun bổ sung. Do đó, việc tinh chỉnh (fine-tune) các mô hình này trở nên đơn giản hơn.

Ví dụ, chúng ta có thể tinh chỉnh một mô hình đa ngôn ngữ mã hóa-giải mã (encoder-decoder multilingual model) trên một tập dữ liệu song ngữ để cải thiện hiệu suất dịch của nó.

Một ví dụ điển hình về mô hình sinh chuỗi là các mô hình ngôn ngữ lớn (LLM) được huấn luyện trên một lượng dữ liệu khổng lồ. Những mô hình này được huấn luyện để dự đoán từ tiếp theo dựa trên các từ trước đó. Mặc dù bài toán này rất đơn giản, nhưng thực tế đã giúp mô hình học được kiến thức chung về ngôn ngữ.

"Tôi rất thích đồ ăn ở đây. Nó thật tuyệt vời! Tôi cảm thấy ___"

Tại đây, khoảng trống "___" biểu thị từ hoặc cụm từ mà chúng ta muốn dự đoán (hoàn chỉnh câu). Nếu từ được dự đoán là vui vẻ, hài lòng, hoặc tích cực, chúng ta có thể phân loại câu này là tích cực.

Ứng dụng gợi ý để phân loại cảm xúc

Giả sử rằng cảm xúc của một văn bản là một nhãn được chọn từ {tích cực, tiêu cực, trung lập}. Hãy xác định cảm xúc của đầu vào.

Đầu vào: Tôi rất thích đồ ăn ở đây. Nó thật tuyệt vời!

Cảm xúc: _______

Hai câu đầu tiên mô tả nhiệm vụ. Đầu vàoCảm xúc lần lượt biểu thị dữ liệu đầu vào và đầu ra mong muốn. Chúng ta mong muốn mô hình hoàn chỉnh câu để đưa ra nhãn cảm xúc chính xác.

Học ngữ cảnh trong mô hình LLM

Ví dụ này cũng minh họa khả năng học không có mẫu (zero-shot learning) của các mô hình ngôn ngữ lớn, tức là có thể thực hiện các tác vụ chưa từng gặp trong quá trình huấn luyện. Một phương pháp khác là học có ít mẫu (few-shot learning), thường được thực hiện thông qua học ngữ cảnh (in-context learning - ICT).

Cụ thể, chúng ta thêm một số ví dụ minh họa cách đầu vào liên quan đến đầu ra. Những ví dụ này, được gọi là mẫu minh họa (demonstrations), giúp mô hình học cách thực hiện nhiệm vụ.

Giả sử rằng cảm xúc của một văn bản là một nhãn được chọn từ {tích cực, tiêu cực, trung lập}. Hãy xác định cảm xúc của đầu vào.

Đầu vào: Giao thông rất tệ vào giờ cao điểm, khiến tôi khó đến sân bay đúng giờ.

Cảm xúc: Tiêu cực

Đầu vào: Thời tiết hôm nay thật tuyệt vời.

Cảm xúc: Tích cực

Đầu vào: Tôi rất thích đồ ăn ở đây. Nó thật tuyệt vời!

Cảm xúc: _______

Học ngữ cảnhgợi ý đóng vai trò quan trọng trong sự phát triển gần đây của các mô hình ngôn ngữ lớn. Mặc dù gợi ý là một cách mạnh mẽ để sử dụng các mô hình này, nhưng vẫn cần một số điều chỉnh để đảm bảo chúng có thể làm theo hướng dẫn một cách chính xác. Ngoài ra, quá trình tinh chỉnh vẫn rất quan trọng để mô hình phù hợp hơn với giá trị của con người.

Chi tiết hơn về quá trình tinh chỉnh sẽ được đề cập trong Chương 4.

Liên hệ

Tên

Email *

Thông báo *