Nối hai bộ dữ liệu python

Đã sửa đổi vào ngày 20/3/20 - Đã chuyển sang

!pip install wget
0 và thêm mất xác thực. Xem Lịch sử sửa đổi ở cuối để biết chi tiết

Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách sử dụng BERT với thư viện ôm sát PyTorch để tinh chỉnh mô hình một cách nhanh chóng và hiệu quả nhằm đạt được hiệu suất gần như hiện đại trong phân loại câu. Nói rộng hơn, tôi mô tả ứng dụng thực tế của học chuyển đổi trong NLP để tạo ra các mô hình hiệu suất cao với nỗ lực tối thiểu trong một loạt các nhiệm vụ NLP

Bài đăng này được trình bày ở hai dạng–dưới dạng bài đăng trên blog tại đây và dưới dạng Sổ tay Colab tại đây

Nội dung giống hệt nhau trong cả hai, nhưng

  • Bài đăng trên blog bao gồm một phần bình luận để thảo luận
  • Colab Notebook sẽ cho phép bạn chạy mã và kiểm tra mã khi bạn đọc qua

Tôi cũng đã xuất bản video hướng dẫn về bài đăng này trên kênh YouTube của mình

nội dung
  • nội dung
  • Giới thiệu
    • Lịch sử
    • BERT là gì?
    • Ưu điểm của tinh chỉnh
      • Một sự thay đổi trong NLP
  • 1. Thành lập
    • 1. 1. Sử dụng GPU Colab để đào tạo
    • 1. 2. Cài đặt thư viện ôm mặt
  • 2. Đang tải tập dữ liệu CoLA
    • 2. 1. Tải xuống & Giải nén
    • 2. 2. phân tích cú pháp
  • 3. Tokenization & định dạng đầu vào
    • 3. 1. Mã thông báo BERT
    • 3. 2. Định dạng bắt buộc
      • Mã thông báo đặc biệt
      • Độ dài câu & Mặt nạ chú ý
    • 3. 3. Bộ dữ liệu Tokenize
    • 3. 4. Phân chia đào tạo & xác thực
  • 4. Đào tạo mô hình phân loại của chúng tôi
    • 4. 1. BertForSequencePhân loại
    • 4. 2. Trình tối ưu hóa và Trình lập lịch tốc độ học tập
    • 4. 3. vòng lặp đào tạo
  • 5. Hiệu suất trên bộ thử nghiệm
    • 5. 1. Chuẩn bị dữ liệu
    • 5. 2. Đánh giá trên Bộ kiểm tra
  • Sự kết luận
  • ruột thừa
    • A1. Lưu và tải mô hình tinh chỉnh
    • A. 2. Suy giảm cân nặng
  • Lịch sử sửa đổi
    • Công việc tiếp theo
      • trích dẫn
Giới thiệu

Lịch sử

2018 là một năm đột phá trong NLP. Chuyển giao học tập, đặc biệt là các mô hình như Allen AI's ELMO, Open-GPT của OpenAI và Google's BERT cho phép các nhà nghiên cứu phá vỡ nhiều điểm chuẩn với sự tinh chỉnh tối thiểu dành riêng cho từng nhiệm vụ và cung cấp cho phần còn lại của cộng đồng NLP các mô hình được đào tạo trước có thể dễ dàng (với ít dữ liệu hơn) . Thật không may, đối với nhiều người mới bắt đầu với NLP và ngay cả đối với một số nhà thực hành có kinh nghiệm, lý thuyết và ứng dụng thực tế của các mô hình mạnh mẽ này vẫn chưa được hiểu rõ.

BERT là gì?

BERT (Đại diện bộ mã hóa hai chiều từ Transformers), được phát hành vào cuối năm 2018, là mô hình chúng tôi sẽ sử dụng trong hướng dẫn này để cung cấp cho người đọc hiểu rõ hơn và hướng dẫn thực tế về việc sử dụng các mô hình học chuyển đổi trong NLP. BERT là một phương pháp biểu diễn ngôn ngữ đào tạo trước được sử dụng để tạo các mô hình mà người thực hành NLP sau đó có thể tải xuống và sử dụng miễn phí. Bạn có thể sử dụng các mô hình này để trích xuất các tính năng ngôn ngữ chất lượng cao từ dữ liệu văn bản của mình hoặc bạn có thể tinh chỉnh các mô hình này cho một tác vụ cụ thể (phân loại, nhận dạng thực thể, trả lời câu hỏi, v.v. ) với dữ liệu của riêng bạn để tạo ra các dự đoán hiện đại

Bài đăng này sẽ giải thích cách bạn có thể sửa đổi và tinh chỉnh BERT để tạo ra một mô hình NLP mạnh mẽ, nhanh chóng mang lại cho bạn kết quả hiện đại

Ưu điểm của tinh chỉnh

Trong hướng dẫn này, chúng ta sẽ sử dụng BERT để đào tạo một trình phân loại văn bản. Cụ thể, chúng tôi sẽ sử dụng mô hình BERT được đào tạo trước, thêm một lớp tế bào thần kinh chưa được đào tạo vào cuối và đào tạo mô hình mới cho nhiệm vụ phân loại của chúng tôi. Tại sao lại làm điều này thay vì đào tạo một mô hình học sâu cụ thể (CNN, BiLSTM, v.v.). ) có phù hợp với nhiệm vụ NLP cụ thể mà bạn cần không?

  1. Phát triển nhanh hơn

    • Đầu tiên, các trọng số mô hình BERT được đào tạo trước đã mã hóa rất nhiều thông tin về ngôn ngữ của chúng tôi. Kết quả là, sẽ mất ít thời gian hơn để đào tạo mô hình tinh chỉnh của chúng tôi - như thể chúng tôi đã đào tạo các lớp dưới cùng của mạng một cách rộng rãi và chỉ cần tinh chỉnh chúng một cách nhẹ nhàng trong khi sử dụng đầu ra của chúng làm tính năng cho nhiệm vụ phân loại của chúng tôi. Trên thực tế, các tác giả chỉ khuyến nghị 2-4 giai đoạn đào tạo để tinh chỉnh BERT cho một nhiệm vụ NLP cụ thể (so với hàng trăm giờ GPU cần thiết để đào tạo mô hình BERT ban đầu hoặc LSTM từ đầu. )
  2. Ít dữ liệu hơn

    • Ngoài ra và có lẽ cũng quan trọng không kém, do các trọng số được đào tạo trước, phương pháp này cho phép chúng tôi tinh chỉnh nhiệm vụ của mình trên một tập dữ liệu nhỏ hơn nhiều so với yêu cầu trong một mô hình được xây dựng từ đầu. Một nhược điểm lớn của các mô hình NLP được xây dựng từ đầu là chúng ta thường cần một tập dữ liệu quá lớn để huấn luyện mạng của mình đạt độ chính xác hợp lý, nghĩa là phải dành rất nhiều thời gian và năng lượng để tạo tập dữ liệu. Bằng cách tinh chỉnh BERT, giờ đây chúng tôi có thể đào tạo một mô hình để đạt được hiệu suất tốt trên một lượng dữ liệu đào tạo nhỏ hơn nhiều
  3. Kết quả tốt hơn

    • Cuối cùng, quy trình tinh chỉnh đơn giản này (thường thêm một lớp được kết nối đầy đủ trên BERT và đào tạo trong một vài kỷ nguyên) đã được chứng minh là đạt được kết quả hiện đại với các điều chỉnh tối thiểu theo nhiệm vụ cụ thể cho nhiều loại nhiệm vụ. phân loại, suy luận ngôn ngữ, sự giống nhau về ngữ nghĩa, trả lời câu hỏi, v.v. Thay vì triển khai các kiến ​​trúc tùy chỉnh và đôi khi tối nghĩa được hiển thị để hoạt động tốt trên một tác vụ cụ thể, BERT chỉ cần tinh chỉnh được hiển thị là một giải pháp thay thế tốt hơn (hoặc ít nhất là bằng)

Nối hai bộ dữ liệu python

Một sự thay đổi trong NLP

Sự thay đổi này để chuyển giao học tập tương tự như sự thay đổi đã diễn ra trong thị giác máy tính vài năm trước. Tạo một mạng học sâu tốt cho các tác vụ thị giác máy tính có thể cần hàng triệu tham số và rất tốn kém để đào tạo. Các nhà nghiên cứu đã phát hiện ra rằng các mạng sâu học các biểu diễn tính năng phân cấp (các tính năng đơn giản như các cạnh ở các lớp thấp nhất với các tính năng phức tạp hơn dần dần ở các lớp cao hơn). Thay vì đào tạo một mạng mới từ đầu mỗi lần, các lớp thấp hơn của mạng được đào tạo với các tính năng hình ảnh tổng quát có thể được sao chép và chuyển để sử dụng trong một mạng khác với một nhiệm vụ khác. Việc tải xuống một mạng sâu được đào tạo trước và nhanh chóng đào tạo lại nó cho nhiệm vụ mới hoặc thêm các lớp bổ sung lên trên đã trở thành một thông lệ - rất tốt so với quy trình đào tạo mạng từ đầu tốn kém. Đối với nhiều người, việc giới thiệu các mô hình ngôn ngữ được đào tạo trước chuyên sâu vào năm 2018 (ELMO, BERT, ULMFIT, Open-GPT, v.v. ) báo hiệu sự thay đổi tương tự để chuyển giao việc học trong NLP mà thị giác máy tính đã thấy

Bắt đầu nào

1. Thành lập

1. 1. Sử dụng GPU Colab để đào tạo

Google Colab cung cấp GPU và TPU miễn phí. Vì chúng tôi sẽ đào tạo một mạng lưới thần kinh lớn, tốt nhất nên tận dụng lợi thế này (trong trường hợp này, chúng tôi sẽ gắn GPU), nếu không, việc đào tạo sẽ mất nhiều thời gian

Có thể thêm GPU bằng cách vào menu và chọn

!pip install wget
1

Sau đó chạy ô sau để xác nhận rằng GPU được phát hiện

import tensorflow as tf

# Get the GPU device name.
device_name = tf.test.gpu_device_name()

# The device name should look like the following:
if device_name == '/device:GPU:0':
    print('Found GPU at: {}'.format(device_name))
else:
    raise SystemError('GPU device not found')

Found GPU at: /device:GPU:0

Để đèn pin sử dụng GPU, chúng tôi cần xác định và chỉ định GPU làm thiết bị. Sau đó, trong vòng lặp đào tạo của chúng tôi, chúng tôi sẽ tải dữ liệu vào thiết bị

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB

1. 2. Cài đặt thư viện ôm mặt

Tiếp theo, hãy cài đặt gói máy biến áp từ Hugging Face, gói này sẽ cung cấp cho chúng ta giao diện pytorch để làm việc với BERT. (Thư viện này chứa các giao diện cho các mô hình ngôn ngữ được đào tạo trước khác như GPT và GPT-2 của OpenAI. ) Chúng tôi đã chọn giao diện pytorch vì giao diện này tạo ra sự cân bằng tuyệt vời giữa các API cấp cao (dễ sử dụng nhưng không cung cấp thông tin chi tiết về cách mọi thứ hoạt động) và mã tensorflow (chứa nhiều chi tiết nhưng thường khiến chúng tôi lạc hướng) . )

Hiện tại, thư viện Hugging Face dường như là giao diện pytorch mạnh mẽ và được chấp nhận rộng rãi nhất để làm việc với BERT. Ngoài việc hỗ trợ nhiều mô hình máy biến áp được đào tạo trước khác nhau, thư viện còn bao gồm các sửa đổi được tạo sẵn của các mô hình này phù hợp với nhiệm vụ cụ thể của bạn. Ví dụ: trong hướng dẫn này, chúng tôi sẽ sử dụng

!pip install wget
2

Thư viện cũng bao gồm các lớp dành riêng cho nhiệm vụ để phân loại mã thông báo, trả lời câu hỏi, dự đoán câu tiếp theo, v.v. Sử dụng các lớp dựng sẵn này giúp đơn giản hóa quá trình sửa đổi BERT cho mục đích của bạn

!pip install transformers

________số 8

Mã trong sổ ghi chép này thực sự là một phiên bản đơn giản hóa của run_glue. tập lệnh ví dụ py từ hugface

!pip install wget
3 là một tiện ích hữu ích cho phép bạn chọn tác vụ chuẩn GLUE mà bạn muốn chạy và mô hình được đào tạo trước mà bạn muốn sử dụng (bạn có thể xem danh sách các mô hình khả thi tại đây). Nó cũng hỗ trợ sử dụng CPU, một GPU hoặc nhiều GPU. Nó thậm chí còn hỗ trợ sử dụng độ chính xác 16 bit nếu bạn muốn tăng tốc hơn nữa

Thật không may, tất cả khả năng cấu hình này đều phải trả giá bằng khả năng đọc. Trong Sổ ghi chép này, chúng tôi đã đơn giản hóa mã rất nhiều và thêm nhiều nhận xét để làm rõ những gì đang diễn ra

2. Đang tải tập dữ liệu CoLA

Chúng tôi sẽ sử dụng bộ dữ liệu The Corpus of Linguistic Acceptability (CoLA) để phân loại câu đơn. Đó là một tập hợp các câu được dán nhãn là đúng hoặc sai về mặt ngữ pháp. Nó được xuất bản lần đầu vào tháng 5 năm 2018 và là một trong những thử nghiệm được đưa vào “Điểm chuẩn GLUE” mà các mô hình như BERT đang cạnh tranh

2. 1. Tải xuống & Giải nén

Chúng tôi sẽ sử dụng gói

!pip install wget
4 để tải tập dữ liệu xuống hệ thống tệp của phiên bản Colab

!pip install wget

!pip install wget
2

Tập dữ liệu được lưu trữ trên GitHub trong repo này. https. //nyu-mll. github. io/CoLA/

!pip install wget
3

!pip install wget
4

Giải nén tập dữ liệu vào hệ thống tệp. Bạn có thể duyệt qua hệ thống tệp của phiên bản Colab trong thanh bên ở bên trái

Found GPU at: /device:GPU:0
0

Found GPU at: /device:GPU:0
1

2. 2. phân tích cú pháp

Chúng ta có thể thấy từ tên tệp rằng cả hai phiên bản dữ liệu

!pip install wget
5 và
!pip install wget
6 đều có sẵn

Chúng tôi không thể sử dụng phiên bản tiền mã hóa vì để áp dụng BERT được đào tạo trước, chúng tôi phải sử dụng mã thông báo do mô hình cung cấp. Điều này là do (1) mô hình có một từ vựng cụ thể, cố định và (2) mã thông báo BERT có một cách cụ thể để xử lý các từ nằm ngoài từ vựng

Chúng tôi sẽ sử dụng gấu trúc để phân tích tập huấn luyện “trong miền” và xem xét một vài thuộc tính và điểm dữ liệu của nó

Found GPU at: /device:GPU:0
2

Found GPU at: /device:GPU:0
3

câu_nguồnnhãnnhãn_chúýcâu8200ad031NaNHọ tự đá mình3862ks081NaNA con côn trùng lớn màu xanh lá cây bay vào súp. 8298ad031NaNI thường xuyên bị cảm lạnh. 6542g_810*Bạn nào mua bàn ủng hộ sách?722bc010*Home was gone by John. 3693ks081NaNI nghĩ rằng người chúng ta gặp tuần trước bị điên. 6283c_131NaNKathleen thực sự ghét công việc của mình. 4118ks081NaNDo không dùng những từ này ở đầu s. 2592l-931NaNJessica phun sơn gầm bàn. 8194ad030*Tôi tiễn cô ấy đi

Hai thuộc tính mà chúng tôi thực sự quan tâm là

!pip install wget
7 và
!pip install wget
8 của nó, được gọi là “đánh giá có thể chấp nhận được” (0=không thể chấp nhận được, 1=có thể chấp nhận được)

Dưới đây là năm câu được dán nhãn là không chấp nhận được về mặt ngữ pháp. Lưu ý rằng nhiệm vụ này khó hơn bao nhiêu so với phân tích tình cảm

Found GPU at: /device:GPU:0
4

câunhãn4867Họ đã điều tra. 0200Anh ấy càng đọc nhiều sách tôi càng thắc mắc. 04593Ngựa vằn nào cũng không bay được. 03226Các thành phố dễ dàng bị phá hủy. 07337Thời gian đã trôi qua trong ngày. 0

Hãy trích xuất các câu và nhãn của tập huấn luyện của chúng ta dưới dạng ndarrays numpy

Found GPU at: /device:GPU:0
5

3. Tokenization & định dạng đầu vào

Trong phần này, chúng tôi sẽ chuyển đổi tập dữ liệu của mình sang định dạng mà BERT có thể được đào tạo trên đó

3. 1. Mã thông báo BERT

Để cung cấp văn bản của chúng tôi cho BERT, nó phải được chia thành các mã thông báo và sau đó các mã thông báo này phải được ánh xạ tới chỉ mục của chúng trong từ vựng mã thông báo

Mã thông báo phải được thực hiện bởi trình mã thông báo đi kèm với BERT–ô bên dưới sẽ tải xuống mã này cho chúng tôi. Chúng tôi sẽ sử dụng phiên bản “uncased” tại đây

Found GPU at: /device:GPU:0
6

Found GPU at: /device:GPU:0
7

Hãy áp dụng mã thông báo cho một câu chỉ để xem đầu ra

Found GPU at: /device:GPU:0
8

Found GPU at: /device:GPU:0
9

Khi chúng tôi thực sự chuyển đổi tất cả các câu của mình, chúng tôi sẽ sử dụng hàm

!pip install wget
9 để xử lý cả hai bước, thay vì gọi riêng
!pip install wget
20 và
!pip install wget
21

Tuy nhiên, trước khi có thể làm điều đó, chúng ta cần nói về một số yêu cầu định dạng của BERT

3. 2. Định dạng bắt buộc

Đoạn mã trên đã bỏ qua một số bước định dạng bắt buộc mà chúng ta sẽ xem xét tại đây

Ghi chú bên lề. Đối với tôi, định dạng đầu vào của BERT có vẻ "được chỉ định quá mức".. Chúng tôi được yêu cầu cung cấp cho nó một số thông tin có vẻ dư thừa hoặc giống như chúng có thể dễ dàng được suy ra từ dữ liệu mà không cần chúng tôi cung cấp rõ ràng. Nhưng nó là như vậy và tôi nghi ngờ nó sẽ có ý nghĩa hơn khi tôi hiểu sâu hơn về nội bộ BERT

chúng tôi bắt buộc phải

  1. Thêm mã thông báo đặc biệt vào đầu và cuối mỗi câu
  2. Đệm và cắt ngắn tất cả các câu thành một độ dài không đổi
  3. Phân biệt rõ ràng mã thông báo thực với mã thông báo đệm bằng “mặt nạ chú ý”

Mã thông báo đặc biệt

!pip install wget
22

Ở cuối mỗi câu, chúng ta cần thêm mã thông báo

!pip install wget
22 đặc biệt

Mã thông báo này là một tạo tác của các nhiệm vụ hai câu, trong đó BERT được đưa ra hai câu riêng biệt và được yêu cầu xác định điều gì đó (e. g. , câu trả lời cho câu hỏi trong câu A có thể được tìm thấy trong câu B không?)

Tôi vẫn chưa chắc tại sao mã thông báo vẫn được yêu cầu khi chúng tôi chỉ có đầu vào một câu, nhưng đó là

!pip install wget
24

Đối với các nhiệm vụ phân loại, chúng ta phải thêm mã thông báo

!pip install wget
24 đặc biệt vào đầu mỗi câu

Mã thông báo này có ý nghĩa đặc biệt. BERT bao gồm 12 lớp Transformer. Mỗi biến áp nhận một danh sách nhúng mã thông báo và tạo ra cùng một số lượng nhúng trên đầu ra (tất nhiên, nhưng với các giá trị tính năng đã thay đổi. )

Nối hai bộ dữ liệu python

Trên đầu ra của máy biến áp cuối cùng (thứ 12), chỉ phần nhúng đầu tiên (tương ứng với mã thông báo [CLS]) được bộ phân loại sử dụng

“Mã thông báo đầu tiên của mọi chuỗi luôn là mã thông báo phân loại đặc biệt (

!pip install wget
24). Trạng thái ẩn cuối cùng tương ứng với mã thông báo này được sử dụng làm biểu diễn trình tự tổng hợp cho các tác vụ phân loại. ” (từ giấy BERT)

Bạn có thể nghĩ đến việc thử một số chiến lược tổng hợp trong lần nhúng cuối cùng, nhưng điều này là không cần thiết. Vì BERT được đào tạo để chỉ sử dụng mã thông báo [CLS] này để phân loại, nên chúng tôi biết rằng mô hình đã được thúc đẩy để mã hóa mọi thứ cần thiết cho bước phân loại vào vectơ nhúng 768 giá trị duy nhất đó. Nó đã hoàn thành việc tổng hợp cho chúng tôi

Độ dài câu & Mặt nạ chú ý

Các câu trong tập dữ liệu của chúng tôi rõ ràng có độ dài khác nhau, vậy BERT xử lý việc này như thế nào?

BERT có hai ràng buộc

  1. Tất cả các câu phải được đệm hoặc cắt bớt thành một độ dài cố định
  2. Độ dài câu tối đa là 512 mã thông báo

Việc đệm được thực hiện với mã thông báo

!pip install wget
27 đặc biệt, ở chỉ số 0 trong từ vựng BERT. Hình minh họa bên dưới minh họa việc đệm ra tới “MAX_LEN” gồm 8 mã thông báo

Nối hai bộ dữ liệu python

“Mặt nạ chú ý” chỉ đơn giản là một mảng gồm các số 1 và 0 cho biết mã thông báo nào đang đệm và mã nào không (có vẻ hơi thừa, phải không?. ). Mặt nạ này yêu cầu cơ chế “Tự chú ý” trong BERT không kết hợp các mã thông báo PAD này vào việc giải thích câu của nó

Tuy nhiên, độ dài tối đa không ảnh hưởng đến tốc độ đào tạo và đánh giá. Ví dụ: với Tesla K80

!pip install wget
28

!pip install wget
29

3. 3. Bộ dữ liệu Tokenize

Thư viện máy biến áp cung cấp hàm

!pip install wget
30 hữu ích sẽ xử lý hầu hết các bước phân tích cú pháp và chuẩn bị dữ liệu cho chúng tôi

Tuy nhiên, trước khi chúng tôi sẵn sàng mã hóa văn bản của mình, chúng tôi cần quyết định độ dài câu tối đa để đệm/cắt bớt thành

Ô bên dưới sẽ thực hiện một lần chuyển mã thông báo của tập dữ liệu để đo độ dài câu tối đa

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")
0

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")
1

Đề phòng có một số câu kiểm tra dài hơn, tôi sẽ đặt độ dài tối đa là 64

Bây giờ chúng tôi đã sẵn sàng để thực hiện token hóa thực sự

Hàm

!pip install wget
0 kết hợp nhiều bước cho chúng tôi

  1. Chia câu thành các mã thông báo
  2. Thêm mã thông báo
    !pip install wget
    
    24 và
    !pip install wget
    
    22 đặc biệt
  3. Ánh xạ mã thông báo tới ID của chúng
  4. Đệm hoặc cắt ngắn tất cả các câu có cùng độ dài
  5. Tạo mặt nạ chú ý phân biệt rõ ràng mã thông báo thực với mã thông báo
    !pip install wget
    
    27

Bốn tính năng đầu tiên có trong

!pip install wget
35, nhưng tôi đang sử dụng
!pip install wget
0 để nhận mục thứ năm (mặt nạ chú ý). Tài liệu ở đây

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")
2

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")
3

3. 4. Phân chia đào tạo & xác thực

Chia tập huấn luyện của chúng tôi để sử dụng 90% cho đào tạo và 10% cho xác nhận

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")
4

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")
5

Chúng tôi cũng sẽ tạo một trình vòng lặp cho tập dữ liệu của mình bằng cách sử dụng lớp DataLoader torch. Điều này giúp tiết kiệm bộ nhớ trong quá trình đào tạo bởi vì, không giống như vòng lặp for, với một trình vòng lặp, toàn bộ tập dữ liệu không cần phải được tải vào bộ nhớ

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")
6

4. Đào tạo mô hình phân loại của chúng tôi

Bây giờ, dữ liệu đầu vào của chúng ta đã được định dạng đúng, đã đến lúc tinh chỉnh mô hình BERT

4. 1. BertForSequencePhân loại

Đối với nhiệm vụ này, trước tiên chúng tôi muốn sửa đổi mô hình BERT được đào tạo trước để đưa ra kết quả đầu ra cho việc phân loại, sau đó chúng tôi muốn tiếp tục đào tạo mô hình trên tập dữ liệu của mình cho đến khi toàn bộ mô hình, từ đầu đến cuối, phù hợp với

Rất may, việc triển khai ômface pytorch bao gồm một tập hợp các giao diện được thiết kế cho nhiều tác vụ NLP. Mặc dù tất cả các giao diện này đều được xây dựng dựa trên mô hình BERT đã được đào tạo, nhưng mỗi giao diện đều có các lớp trên cùng và loại đầu ra khác nhau được thiết kế để phù hợp với nhiệm vụ NLP cụ thể của chúng

Đây là danh sách hiện tại của các lớp được cung cấp để tinh chỉnh

  • BertNgười mẫu
  • BertForPreTraining
  • BertForMaskedLM
  • BertForNextSentenceDự đoán
  • BertForSequenceClassification - Cái chúng ta sẽ sử dụng
  • BertForTokenPhân loại
  • BertCho Câu HỏiTrả Lời

Các tài liệu cho những điều này có thể được tìm thấy dưới đây

Chúng tôi sẽ sử dụng BertForSequenceClassification. Đây là mô hình BERT bình thường có thêm một lớp tuyến tính ở trên cùng để phân loại mà chúng tôi sẽ sử dụng làm công cụ phân loại câu. Khi chúng tôi cung cấp dữ liệu đầu vào, toàn bộ mô hình BERT được đào tạo trước và lớp phân loại bổ sung chưa được đào tạo sẽ được đào tạo về nhiệm vụ cụ thể của chúng tôi

OK, hãy tải BERT. Có sẵn một số mô hình BERT được đào tạo trước khác nhau. “bert-base-uncased” có nghĩa là phiên bản chỉ có các chữ cái viết thường (“không có vỏ bọc”) và là phiên bản nhỏ hơn của cả hai (“cơ sở” so với “lớn”)

Có thể tìm thấy tài liệu về

!pip install wget
37 tại đây, với các tham số bổ sung được xác định tại đây

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")
7

________số 8

Vì tò mò, chúng ta có thể duyệt qua tất cả các tham số của mô hình theo tên tại đây

Trong ô bên dưới, tôi đã in tên và kích thước của các trọng số cho

  1. lớp nhúng
  2. Máy biến áp đầu tiên trong số mười hai máy biến áp
  3. lớp đầu ra

import torch

# If there's a GPU available...
if torch.cuda.is_available():    

    # Tell PyTorch to use the GPU.    
    device = torch.device("cuda")

    print('There are %d GPU(s) available.' % torch.cuda.device_count())

    print('We will use the GPU:', torch.cuda.get_device_name(0))

# If not...
else:
    print('No GPU available, using the CPU instead.')
    device = torch.device("cpu")
9

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
0

4. 2. Trình tối ưu hóa và Trình lập lịch tốc độ học tập

Bây giờ chúng tôi đã tải mô hình của mình, chúng tôi cần lấy các siêu đường kính đào tạo từ bên trong mô hình được lưu trữ

Với mục đích tinh chỉnh, các tác giả khuyên bạn nên chọn từ các giá trị sau (từ Phụ lục A. 3 của giấy BERT)

  • kích thước lô. 16, 32
  • Tỷ lệ học tập (Adam). 5e-5, 3e-5, 2e-5
  • Số kỷ nguyên. 2, 3, 4

Chúng tôi chọn

  • kích thước lô. 32 (được đặt khi tạo Trình tải dữ liệu của chúng tôi)
  • Tỷ lệ học. 2e-5
  • kỷ nguyên. 4 (chúng ta sẽ thấy rằng đây có lẽ là quá nhiều…)

Tham số epsilon

!pip install wget
38 là “một số rất nhỏ để ngăn chặn bất kỳ phép chia nào cho 0 trong quá trình triển khai” (từ tại đây )

Bạn có thể tìm thấy việc tạo trình tối ưu hóa AdamW trong

!pip install wget
3 tại đây

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
1

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
2

4. 3. vòng lặp đào tạo

Dưới đây là vòng lặp đào tạo của chúng tôi. Có rất nhiều thứ đang diễn ra, nhưng về cơ bản, đối với mỗi lần vượt qua trong vòng lặp của chúng tôi, chúng tôi có giai đoạn thử nghiệm và giai đoạn xác thực

Cảm ơn Stas Bekman đã đóng góp thông tin chi tiết và mã để sử dụng mất xác thực để phát hiện quá khớp

Tập huấn

  • Giải nén dữ liệu đầu vào và nhãn của chúng tôi
  • Tải dữ liệu lên GPU để tăng tốc
  • Xóa các gradient được tính toán trong bước trước
    • Trong pytorch, độ dốc tích lũy theo mặc định (hữu ích cho những thứ như RNN) trừ khi bạn xóa chúng một cách rõ ràng
  • Chuyển tiếp (cung cấp dữ liệu đầu vào qua mạng)
  • Truyền ngược (backpropagation)
  • Yêu cầu mạng cập nhật các tham số bằng trình tối ưu hóa. bươc()
  • Theo dõi các biến để theo dõi tiến độ

đánh giá

  • Giải nén dữ liệu đầu vào và nhãn của chúng tôi
  • Tải dữ liệu lên GPU để tăng tốc
  • Chuyển tiếp (cung cấp dữ liệu đầu vào qua mạng)
  • Tính toán tổn thất trên dữ liệu xác thực của chúng tôi và theo dõi các biến để theo dõi tiến độ

Pytorch giấu chúng tôi tất cả các tính toán chi tiết, nhưng chúng tôi đã nhận xét mã để chỉ ra bước nào ở trên đang diễn ra trên mỗi dòng

PyTorch cũng có một số hướng dẫn dành cho người mới bắt đầu mà bạn cũng có thể thấy hữu ích

Xác định hàm trợ giúp để tính toán độ chính xác

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
3

Hàm trợ giúp để định dạng thời gian đã trôi qua là

!pip install wget
40

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
4

Chúng tôi đã sẵn sàng để bắt đầu đào tạo

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
5

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
6

Cùng xem tóm tắt quá trình đào tạo

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
7

Tổn thất đào tạoHợp lệ. Mất hợp lệ. chính xác. Thời gian đào tạo Thời gian xác thực Kỷ nguyên 10. 500. 450. 800. 00. 510. 00. 0220. 320. 460. 810. 00. 510. 00. 0230. 220. 490. 820. 00. 510. 00. 0240. 160. 550. 820. 00. 510. 00. 02

Lưu ý rằng, trong khi tổn thất đào tạo đang giảm dần theo từng kỷ nguyên, thì tổn thất xác thực đang tăng lên. Điều này cho thấy rằng chúng tôi đang đào tạo mô hình của mình quá lâu và nó quá phù hợp với dữ liệu đào tạo

(Để tham khảo, chúng tôi đang sử dụng 7.695 mẫu đào tạo và 856 mẫu xác nhận)

Mất xác thực là thước đo chính xác hơn độ chính xác, bởi vì với độ chính xác, chúng tôi không quan tâm đến giá trị đầu ra chính xác, mà chỉ quan tâm đến phía nào của ngưỡng.

Nếu chúng tôi đang dự đoán câu trả lời đúng, nhưng với độ tin cậy thấp hơn, thì mất xác thực sẽ bắt được điều này, trong khi độ chính xác sẽ không

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
8

Nối hai bộ dữ liệu python

5. Hiệu suất trên bộ thử nghiệm

Bây giờ, chúng tôi sẽ tải tập dữ liệu giữ lại và chuẩn bị đầu vào giống như chúng tôi đã làm với tập huấn luyện. Sau đó, chúng tôi sẽ đánh giá các dự đoán bằng hệ số tương quan Matthews vì đây là số liệu được cộng đồng NLP rộng lớn hơn sử dụng để đánh giá hiệu suất trên CoLA. Với số liệu này, +1 là điểm tốt nhất và -1 là điểm kém nhất. Bằng cách này, chúng tôi có thể thấy chúng tôi thực hiện tốt như thế nào so với các mô hình hiện đại cho nhiệm vụ cụ thể này

5. 1. Chuẩn bị dữ liệu

Chúng tôi sẽ cần áp dụng tất cả các bước giống như chúng tôi đã làm cho dữ liệu huấn luyện để chuẩn bị tập dữ liệu thử nghiệm của mình

There are 1 GPU(s) available.
We will use the GPU: Tesla P100-PCIE-16GB
9

!pip install transformers
0

5. 2. Đánh giá trên Bộ kiểm tra

Với tập kiểm tra đã chuẩn bị, chúng tôi có thể áp dụng mô hình tinh chỉnh của mình để tạo dự đoán trên tập kiểm tra

!pip install transformers
1

!pip install transformers
2

Độ chính xác trên điểm chuẩn CoLA được đo bằng cách sử dụng “hệ số tương quan Matthews” (MCC)

Chúng tôi sử dụng MCC ở đây vì các lớp không cân bằng

!pip install transformers
3

!pip install transformers
4

!pip install transformers
5

!pip install transformers
6

Điểm số cuối cùng sẽ dựa trên toàn bộ tập hợp bài kiểm tra, nhưng chúng ta hãy xem xét điểm số của các nhóm riêng lẻ để hiểu được sự thay đổi của chỉ số giữa các nhóm

Mỗi đợt có 32 câu, trừ đợt cuối chỉ có (516 % 32) = 4 câu trắc nghiệm

!pip install transformers
7

Nối hai bộ dữ liệu python

Bây giờ, chúng tôi sẽ kết hợp kết quả cho tất cả các đợt và tính điểm MCC cuối cùng của chúng tôi

!pip install transformers
8

!pip install transformers
9

Mát mẻ. Trong khoảng nửa giờ mà không cần thực hiện bất kỳ điều chỉnh siêu tham số nào (điều chỉnh tốc độ học, kỷ nguyên, kích thước lô, thuộc tính ADAM, v.v. ) chúng tôi có thể đạt điểm cao

Ghi chú. Để tối đa hóa điểm số, chúng ta nên xóa “bộ xác thực” (mà chúng tôi đã sử dụng để giúp xác định số lượng kỷ nguyên cần đào tạo) và đào tạo trên toàn bộ tập hợp đào tạo

Thư viện ghi lại độ chính xác dự kiến ​​cho điểm chuẩn này ở đây là

!pip install wget
41

Bạn cũng có thể xem bảng xếp hạng chính thức tại đây

Lưu ý rằng (do kích thước tập dữ liệu nhỏ?) Độ chính xác có thể thay đổi đáng kể giữa các lần chạy

Sự kết luận

Bài đăng này chứng minh rằng với mô hình BERT được đào tạo trước, bạn có thể tạo một mô hình chất lượng cao một cách nhanh chóng và hiệu quả với nỗ lực và thời gian đào tạo tối thiểu bằng giao diện pytorch, bất kể nhiệm vụ NLP cụ thể mà bạn quan tâm là gì.

ruột thừa

A1. Lưu và tải mô hình tinh chỉnh

Ô đầu tiên này (được lấy từ

!pip install wget
3 tại đây) ghi mô hình và mã thông báo ra đĩa

[I've removed this output cell for brevity].
0

[I've removed this output cell for brevity].
1

Hãy kiểm tra kích thước tệp, vì tò mò

[I've removed this output cell for brevity].
2

[I've removed this output cell for brevity].
3

Tệp lớn nhất là trọng lượng mô hình, vào khoảng 418 megabyte

[I've removed this output cell for brevity].
4

[I've removed this output cell for brevity].
5

Để lưu mô hình của bạn trong các phiên Colab Notebook, hãy tải mô hình xuống máy cục bộ của bạn hoặc lý tưởng nhất là sao chép mô hình đó vào Google Drive của bạn

[I've removed this output cell for brevity].
6

[I've removed this output cell for brevity].
7

Các chức năng sau sẽ tải lại mô hình từ đĩa

[I've removed this output cell for brevity].
8

A. 2. Suy giảm cân nặng

Ví dụ về hugface bao gồm khối mã sau để cho phép giảm dần trọng lượng, nhưng tốc độ giảm dần mặc định là “0. 0”, vì vậy tôi đã chuyển nó vào phụ lục

Về cơ bản, khối này yêu cầu trình tối ưu hóa không áp dụng phân rã trọng số cho các thuật ngữ sai lệch (e. g. , $b$ trong phương trình $y = Wx + b$ ). Phân rã trọng số là một dạng chính quy hóa–sau khi tính toán độ dốc, chúng tôi nhân chúng với, e. g. , 0. 99

[I've removed this output cell for brevity].
9

Lịch sử sửa đổi

Phiên bản 3 - ngày 18 tháng 3 năm 2020 - (hiện tại)

  • Đơn giản hóa mã thông báo và định dạng đầu vào (cho cả đào tạo và kiểm tra) bằng cách tận dụng chức năng
    !pip install wget
    
    0.
    !pip install wget
    
    44 xử lý phần đệm và tạo mặt nạ chú ý cho chúng tôi
  • Cải thiện giải thích về mặt nạ chú ý
  • Đã chuyển sang sử dụng
    !pip install wget
    
    45 để tạo phân tách đào tạo-xác thực
  • Đã thêm một bảng tóm tắt về số liệu thống kê đào tạo (mất xác thực, thời gian trên mỗi kỷ nguyên, v.v. )
  • Đã thêm mất xác thực vào biểu đồ đường cong học tập, vì vậy chúng tôi có thể xem liệu chúng tôi có đang trang bị quá mức hay không
    • Cảm ơn bạn đến Stas Bekman để đóng góp này
  • Đã hiển thị MCC mỗi đợt dưới dạng biểu đồ thanh

Phiên bản 2 - ngày 20 tháng 12 năm 2019 - liên kết

  • hugface đã đổi tên thư viện của họ thành
    !pip install wget
    
    46
  • Đã cập nhật sổ ghi chép để sử dụng thư viện
    !pip install wget
    
    46

Phiên bản 1 - Ngày 22 tháng 7 năm 2019

  • Phiên bản đầu tiên

Công việc tiếp theo

  • Có thể hợp lý hơn khi sử dụng điểm số MCC cho “độ chính xác xác thực”, nhưng tôi đã bỏ nó đi để không phải giải thích nó sớm hơn trong Notebook
  • Tạo hạt giống – Tôi không tin rằng việc đặt các giá trị hạt giống khi bắt đầu vòng lặp đào tạo thực sự tạo ra kết quả có thể lặp lại…
  • Điểm MCC dường như thay đổi đáng kể qua các lần chạy khác nhau. Sẽ rất thú vị nếu chạy ví dụ này nhiều lần và chỉ ra phương sai

trích dẫn

Chris McCormick và Nick Ryan. (2019, ngày 22 tháng 7). Hướng dẫn tinh chỉnh BERT với PyTorch. Lấy từ http. //www. mccormickml. com