Làm thế nào để đào tạo một mô hình BERT từ Scratch

Nút nguồn: 1013329

Làm thế nào để đào tạo một mô hình BERT từ Scratch

Gặp anh em họ người Ý của BERT, FiliBERTo.


By James Briggs, Nhà khoa học dữ liệu



BERT, nhưng ở Ý — hình ảnh của tác giả

 

Nhiều bài viết của tôi tập trung vào BERT - mô hình đã xuất hiện và thống trị thế giới xử lý ngôn ngữ tự nhiên (NLP) và đánh dấu một thời đại mới cho các mô hình ngôn ngữ.

Đối với những người chưa từng sử dụng các mô hình máy biến áp (ví dụ BERT là gì), quy trình sẽ giống như sau:

  • pip install transformers
  • Khởi tạo một mô hình máy biến áp được đào tạo trước — from_pretrained.
  • Kiểm tra nó trên một số dữ liệu.
  • Có thể tinh chỉnh mô hình (đào tạo nó thêm một số).

Bây giờ, đây là một cách tiếp cận tuyệt vời, nhưng nếu chúng ta chỉ làm điều này, chúng ta sẽ thiếu hiểu biết đằng sau việc tạo ra các mô hình máy biến áp của riêng mình.

Và, nếu chúng tôi không thể tạo các mô hình máy biến áp của riêng mình — chúng tôi phải dựa vào việc có một mô hình được đào tạo trước phù hợp với vấn đề của chúng tôi, điều này không phải lúc nào cũng đúng:



Một vài comment hỏi về mô hình BERT không phải tiếng Anh

 

Vì vậy, trong bài viết này, chúng ta sẽ khám phá các bước chúng ta phải thực hiện để xây dựng mô hình máy biến áp của riêng mình — cụ thể là một phiên bản BERT được phát triển thêm, được gọi là RoBERTa.

Một cái nhìn tổng quan

 
 
Có một vài bước trong quy trình, vì vậy trước khi đi sâu vào, trước tiên chúng ta hãy tóm tắt những gì chúng ta cần làm. Tổng cộng, có bốn phần chính:

  • Lấy dữ liệu
  • Xây dựng mã thông báo
  • Tạo một đường ống đầu vào
  • Đào tạo người mẫu

Khi chúng tôi đã làm việc qua từng phần này, chúng tôi sẽ lấy mã thông báo và mô hình mà chúng tôi đã tạo — và lưu cả hai để sau đó chúng tôi có thể sử dụng chúng theo cách chúng tôi thường làm với from_pretrained.

Lấy dữ liệu

 
 
Như với bất kỳ dự án học máy nào, chúng tôi cần dữ liệu. Về dữ liệu để đào tạo một mô hình máy biến áp, chúng tôi thực sự tha hồ lựa chọn - chúng tôi có thể sử dụng hầu hết mọi dữ liệu văn bản.



Video hướng dẫn tải xuống bộ dữ liệu OSCAR bằng thư viện bộ dữ liệu của HuggingFace

 

Và, nếu có một thứ mà chúng ta có rất nhiều trên internet — đó là dữ liệu văn bản phi cấu trúc.

Một trong những bộ dữ liệu lớn nhất trong lĩnh vực văn bản được lấy từ internet là bộ dữ liệu OSCAR.

Bộ dữ liệu OSCAR tự hào có một số lượng lớn các ngôn ngữ khác nhau — và một trong những trường hợp sử dụng rõ ràng nhất để đào tạo từ đầu là để chúng tôi có thể áp dụng BERT cho một số ngôn ngữ ít được sử dụng hơn, chẳng hạn như Telugu hoặc Navajo.

Thật không may, ngôn ngữ duy nhất tôi có thể nói với bất kỳ mức độ năng lực nào là tiếng Anh — nhưng bạn gái của tôi là người Ý, và vì vậy cô ấy — Laura, sẽ đánh giá kết quả của mô hình BERT nói tiếng Ý của chúng tôi — FiliBERTo.

Vì vậy, để tải xuống phân đoạn tiếng Ý của bộ dữ liệu OSCAR, chúng tôi sẽ sử dụng HuggingFace's datasets thư viện - mà chúng ta có thể cài đặt với pip install datasets. Sau đó, chúng tôi tải xuống OSCAR_IT với:

Hãy nhìn vào dataset vật.

Tuyệt vời, bây giờ hãy lưu trữ dữ liệu của chúng tôi ở định dạng mà chúng tôi có thể sử dụng khi tạo mã thông báo của mình. Chúng ta cần tạo một tập hợp các tệp văn bản gốc chỉ chứa text tính năng từ tập dữ liệu của chúng tôi và chúng tôi sẽ chia từng mẫu sử dụng một dòng mới n.

Trong của chúng tôi data/text/oscar_it thư mục chúng tôi sẽ tìm thấy:


Ảnh chụp màn hình hiển thị cửa sổ Windows explorer chứa đầy các tệp .txt — đại diện cho dữ liệu OSCAR dạng văn bản gốc
Thư mục chứa các tệp OSCAR văn bản gốc của chúng tôi

 

Xây dựng Tokenizer

 
 
Tiếp theo là mã thông báo! Khi sử dụng máy biến áp, chúng tôi thường tải một bộ mã thông báo, cùng với mô hình máy biến áp tương ứng của nó — bộ mã thông báo là thành phần chính trong quy trình.



Video hướng dẫn xây dựng mã thông báo tùy chỉnh của chúng tôi

 

Khi xây dựng bộ mã thông báo của chúng tôi, chúng tôi sẽ cung cấp cho nó tất cả dữ liệu OSCAR của mình, chỉ định kích thước từ vựng của chúng tôi (số lượng mã thông báo trong bộ mã thông báo) và bất kỳ mã thông báo đặc biệt nào.

Bây giờ, các mã thông báo đặc biệt của RoBERTa trông như thế này:

Vì vậy, chúng tôi đảm bảo bao gồm chúng trong special_tokens tham số của mã thông báo của chúng tôi train cuộc gọi phương thức.

Mã thông báo của chúng tôi hiện đã sẵn sàng và chúng tôi có thể lưu tệp để sử dụng sau:

Bây giờ chúng tôi có hai tệp xác định tệp mới của chúng tôi FiliBERTo mã thông báo:

  • hợp nhất.txt - thực hiện ánh xạ ban đầu của văn bản thành mã thông báo
  • vocab.json — ánh xạ mã thông báo tới ID mã thông báo

Và với những thứ đó, chúng tôi có thể chuyển sang khởi tạo mã thông báo của mình để chúng tôi có thể sử dụng nó như chúng tôi sẽ sử dụng bất kỳ thứ gì khác from_pretrained mã thông báo.

Đang khởi tạo Tokenizer

 
 
Trước tiên, chúng tôi khởi tạo trình mã thông báo bằng cách sử dụng hai tệp mà chúng tôi đã tạo trước đó — sử dụng một cách đơn giản from_pretrained:

Bây giờ mã thông báo của chúng tôi đã sẵn sàng, chúng tôi có thể thử mã hóa một số văn bản với nó. Khi mã hóa, chúng tôi sử dụng hai phương thức giống nhau mà chúng tôi thường sử dụng, encode và encode_batch.

Từ đối tượng mã hóa tokens chúng tôi sẽ trích xuất input_ids và attention_mask tenxơ để sử dụng với FiliBERTo.

Tạo đường ống đầu vào

 
 
Quy trình đầu vào của quy trình đào tạo của chúng tôi là phần phức tạp hơn trong toàn bộ quy trình. Nó bao gồm việc chúng tôi lấy dữ liệu đào tạo OSCAR thô của mình, chuyển đổi và tải nó vào một DataLoader sẵn sàng cho đào tạo.



Video hướng dẫn về quy trình đầu vào MLM

 

Chuẩn bị dữ liệu

 
 
Chúng tôi sẽ bắt đầu với một mẫu duy nhất và làm việc thông qua logic chuẩn bị.

Trước tiên, chúng tôi cần mở tệp của mình — chính những tệp mà chúng tôi đã lưu dưới dạng . Txt tập tin trước đó. Chúng tôi chia từng cái dựa trên các ký tự dòng mới n vì điều này chỉ ra các mẫu riêng lẻ.

Sau đó, chúng tôi mã hóa dữ liệu của mình bằng cách sử dụng tokenizer — đảm bảo bao gồm các tham số chính như max_lengthpaddingvà truncation.

Và bây giờ chúng ta có thể chuyển sang tạo các tenxơ của mình - chúng ta sẽ đào tạo mô hình của mình thông qua mô hình hóa ngôn ngữ ẩn (MLM). Vì vậy, chúng ta cần ba tensors:

  • input_ids - của chúng tôi token_ids với ~15% mã thông báo được che bằng cách sử dụng mã thông báo mặt nạ <mask>.
  • chú ý_mặt nạ - một tenxơ của 1s và 0s, đánh dấu vị trí của mã thông báo/mã thông báo đệm 'thực' — được sử dụng trong tính toán mức độ chú ý.
  • nhãn - của chúng tôi token_ids với Không đắp mặt nạ.

Nếu bạn chưa quen với MLM, tôi đã giải thích về nó tại đây.

Của chúng tôi attention_mask và labels tensors được trích xuất đơn giản từ chúng tôi batch. Các input_ids Tuy nhiên, các tenxơ cần được chú ý nhiều hơn, đối với tenxơ này, chúng tôi che dấu ~15% số mã thông báo — gán cho chúng ID mã thông báo 3.

Trong đầu ra cuối cùng, chúng ta có thể thấy một phần của mã hóa input_ids tenxơ. ID mã thông báo đầu tiên là 1 - Các [CLS] mã thông báo. Chấm xung quanh tenxơ, chúng tôi có một số 3 ID mã thông báo - đây là những ID mới được thêm vào của chúng tôi [MASK] thẻ.

Xây dựng DataLoader

 
 
Tiếp theo, chúng tôi xác định Dataset lớp — mà chúng tôi sử dụng để khởi tạo ba tenxơ được mã hóa dưới dạng PyTorch torch.utils.data.Dataset các đối tượng.

Cuối cùng, của chúng tôi dataset được tải vào một PyTorch DataLoader đối tượng - mà chúng tôi sử dụng để tải dữ liệu của mình vào mô hình của mình trong quá trình đào tạo.

Đào tạo người mẫu

 
 
Chúng tôi cần hai điều để đào tạo, của chúng tôi DataLoader và một người mẫu. Các DataLoader chúng tôi có - nhưng không có mô hình.



Khởi tạo mô hình

 
 
Để đào tạo, chúng tôi cần một bản thô (không được đào tạo trước) BERTLMHeadModel. Để tạo điều đó, trước tiên chúng ta cần tạo một đối tượng cấu hình RoBERTa để mô tả các tham số mà chúng ta muốn khởi tạo FiliBERTo.

Sau đó, chúng tôi nhập và khởi tạo mô hình RoBERTa của mình bằng đầu mô hình hóa ngôn ngữ (LM).

Chuẩn bị đào tạo

 
 
Trước khi chuyển sang vòng lặp đào tạo, chúng ta cần thiết lập một số thứ. Đầu tiên, chúng tôi thiết lập mức sử dụng GPU/CPU. Sau đó, chúng tôi kích hoạt chế độ đào tạo của mô hình — và cuối cùng, khởi tạo trình tối ưu hóa của chúng tôi.

Hội thảo

 
 
Cuối cùng - thời gian đào tạo! Chúng tôi đào tạo giống như chúng tôi thường làm khi đào tạo qua PyTorch.

Nếu chúng ta chuyển sang Tensorboard, chúng ta sẽ nhận thấy sự mất mát của mình theo thời gian - điều đó có vẻ đầy hứa hẹn.



Mất mát / thời gian — nhiều buổi đào tạo đã được xâu chuỗi lại với nhau trong biểu đồ này

 

Bài kiểm tra thực tế

 
 
Bây giờ là lúc cho bài kiểm tra thực sự. Chúng tôi thiết lập một hệ thống MLM — và yêu cầu Laura đánh giá kết quả. Các bạn có thể xem video review lúc 22:44 tại đây:



Đầu tiên chúng ta khởi tạo một pipeline đối tượng, sử dụng 'fill-mask' lý lẽ. Sau đó, bắt đầu thử nghiệm mô hình của chúng tôi như sau:

“chào Đến được không?” là câu trả lời đúng! Đó là trình độ nâng cao trong tiếng Ý của tôi — vì vậy, hãy giao nó cho Laura.

Chúng tôi bắt đầu với “buongiorno, đi nào?” - hoặc là "ngày tốt lành, bạn thế nào?":

Câu trả lời đầu tiên, “buongiorno, chi va?” có nghĩa là "ngày tốt lành, ai ở đó?" - ví dụ như vô nghĩa. Nhưng, câu trả lời thứ hai của chúng tôi là chính xác!

Tiếp theo, một cụm từ khó hơn một chút, “ciao, dove ci incontriamo oggi pomeriggio?” - hoặc là "Xin chào, chúng ta sẽ gặp nhau ở đâu vào chiều nay?":

Và chúng tôi trả lại một số kết quả tích cực hơn:

✅ "hi, where do we see each other this afternoon?"
✅ "hi, where do we meet this afternoon?"
❌ "hi, where here we are this afternoon?"
✅ "hi, where are we meeting this afternoon?"
✅ "hi, where do we meet this afternoon?"

Cuối cùng, một câu nữa, khó hơn, “Có sarebbe thành công se avessimo scelto un altro giorno?” — hoặc “điều gì sẽ xảy ra nếu chúng ta chọn một ngày khác?”:

Chúng tôi cũng trả lại một vài câu trả lời hay ở đây:

✅ "what would have happened if we had chosen another day?"
✅ "what would have happened if I had chosen another day?"
✅ "what would have happened if they had chosen another day?"
✅ "what would have happened if you had chosen another day?"
❌ "what would have happened if another day was chosen?"

Nhìn chung, có vẻ như mô hình của chúng tôi đã vượt qua các bài kiểm tra của Laura — và chúng tôi hiện có một mô hình ngôn ngữ tiếng Ý thành thạo có tên là FiliBERTo!

Vậy là xong hướng dẫn đào tạo mô hình BERT từ đầu này!

Chúng tôi đã khám phá rất nhiều điều cơ bản, từ việc lấy và định dạng dữ liệu của mình — cho đến việc sử dụng mô hình hóa ngôn ngữ để đào tạo mô hình BERT thô của chúng tôi.

Tôi hy vọng bạn thích bài viết này! Nếu bạn có bất kỳ câu hỏi nào, hãy cho tôi biết qua Twitter hoặc trong các ý kiến ​​​​dưới đây. Nếu bạn muốn nhiều nội dung như thế này, tôi đăng trên YouTube quá.

Nhờ đọc!

 

Giảm 70! Xử lý ngôn ngữ tự nhiên: NLP với Transformers trong Python

Các mô hình máy biến áp là tiêu chuẩn thực tế trong NLP hiện đại. Họ đã chứng tỏ mình là người biểu cảm nhất…
 

*Tất cả các hình ảnh là của tác giả trừ khi có quy định khác

 
Tiểu sử: James Briggs là một nhà khoa học dữ liệu chuyên về xử lý ngôn ngữ tự nhiên và làm việc trong lĩnh vực tài chính, có trụ sở tại London, Vương quốc Anh. Anh ấy cũng là một cố vấn tự do, nhà văn và người sáng tạo nội dung. Bạn có thể liên hệ với tác giả qua email (jamescalam94@gmail.com).

Nguyên. Đăng lại với sự cho phép.

Liên quan:

Nguồn: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Dấu thời gian:

Thêm từ Xe đẩy