Sự phức tạp của các mô hình ngôn ngữ
Độ phức tạp là một thước đo đánh giá đo lường chất lượng của các mô hình ngôn ngữ. Trong bài đăng này, chúng tôi sẽ thảo luận về độ phức tạp là gì và cách tính độ phức tạp cho mô hình phổ biến GPT2 .
Mô hình ngôn ngữ là gì?
Bạn có thể đã nghe nói về các mô hình ngôn ngữ lớn (LLM) như BERT, GPT2, v.v., đã thay đổi bộ mặt của Xử lý ngôn ngữ tự nhiên. Có nhiều loại mô hình ngôn ngữ khác nhau như mô hình ngôn ngữ thống kê và mô hình ngôn ngữ thần kinh. Các SLM dựa trên số liệu thống kê trong văn bản nhất định trong đó các mô hình ngôn ngữ Thần kinh được đào tạo bằng cách sử dụng kiến trúc mạng thần kinh.
Về cốt lõi, một mô hình ngôn ngữ (LM) không là gì ngoài một phân phối xác suất trên một tập hợp các từ được gọi là từ vựng của mô hình. Nó cho biết xác suất xuất hiện của một từ nhất định trong từ vựng với tất cả các từ trước đó của nó. Thông thường, từ nào có xác suất lớn nhất sẽ được chọn làm từ dự đoán tiếp theo trong chuỗi.
Xác suất này có thể được tính bằng cách nhân một chuỗi các xác suất có điều kiện cho mỗi từ với các từ trước đó của nó, từ đó tạo ra khả năng xảy ra của chuỗi này.
Ví dụ, khả năng chung của câu ví dụ “Đó là một ngày đẹp trời” được viết như hình bên dưới. Tính toán xác suất này giúp chúng tôi dự đoán các từ tiếp theo hoặc các từ bị thiếu trong một trình tự và do đó mô hình học được các sắc thái của ngôn ngữ — do đó có thuật ngữ mô hình ngôn ngữ.
P(It,is,a,beautiful,day) = P(day|beautiful, a, is, it) *
P(beautiful|a, is, it) * P(a|is, it) * P(is|it)
Trong các phần tiếp theo, chúng ta sẽ thảo luận về một số thuật ngữ quan trọng được sử dụng để tính Độ phức tạp.
Sự hỗn loạn
Entropy là thước đo định lượng sự không chắc chắn và thu được dưới dạng nghịch đảo của xác suất xảy ra sự kiện. Xác suất càng cao, độ không chắc chắn càng thấp. Do đó, mục tiêu của mô hình ngôn ngữ là giảm thiểu entropy tạo ra một chuỗi các từ tương tự như các chuỗi huấn luyện. Công thức tính Entropy được đưa ra dưới đây trong đó P(x) là xác suất của từ x.
Đây là một video tuyệt vời để hiểu chi tiết hơn về Entropy:https://youtube.com/watch?v=YtebGVx-Fxw
Entropy chéo
Cross Entropy so sánh hai phân bố xác suất P(x) và Q(x). Trong ngữ cảnh của các mô hình ngôn ngữ, chúng tôi so sánh phân phối xác suất dự đoán trên các từ với phân phối xác suất thực tế. Ở đây, P(x) là phân phối xác suất thực tế và Q(x) là phân phối dự đoán của mô hình. Entropy chéo sau đó được tính toán như hình bên dưới, có thể được sử dụng làm hàm mất mát để huấn luyện các mô hình ngôn ngữ.
Giả sử chúng ta có một mô hình ngôn ngữ đã được đào tạo với vốn từ vựng chỉ gồm 5 từ “nắng”, “ngày”, “đẹp”, “phong cảnh”, “mây”. Bây giờ, chúng tôi muốn tính toán độ phức tạp của mô hình khi nó nhìn thấy cụm từ “cảnh đẹp”.
Hãy để chúng tôi tính toán entropy chéo bằng một ví dụ đơn giản trong PyTorch.
# Get the needed libraries
import torch
from torch.nn import functional as F
Các nhật ký này sau đó được chuyển đến một hàm softmax để chuẩn hóa các giá trị và chuyển đổi chúng thành phân phối xác suất. Đây là phân phối xác suất dự đoán.
tensor([[-0.7891, 1.3421, 0.4929, 0.0715, -0.0910],
[ 0.9024, -0.8675, 0.8498, -1.0331, 0.5531]])
F.softmax(input, dim = -1)
Predicted:
tensor([[0.0575, 0.4841, 0.2071, 0.1359, 0.1155],
[0.3369, 0.0574, 0.3196, 0.0486, 0.2375]])
Target/Actual: tensor([2, 3])
tensor([[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]])
Loss for First Word:
(((- 0 * log(0.0575)) + (- 0 * log(0.4841)) + (- 1 * log(0.2071)) +
(- 0 * log(0.1359)) + (- 0 * log(0.1155))) = 1.5745535105805986
Loss for Second Word:
(((- 0 * log(0.3369)) + (- 0 * log(0.0574)) + (- 0* log(0.3196)) +
(- 1* log(0.0486)) + (- 0 * log(0.2375))) = 3.024131748075689
Loss = (1.5745535105805986 + 3.024131748075689)/2 = 2.299
loss = torch.nn.CrossEntropyLoss()
output = loss(input, target)
output
Loss: tensor(2.299)
Theo trực giác, bối rối có nghĩa là ngạc nhiên. Chúng tôi đo lường mức độ ngạc nhiên của mô hình khi nhìn thấy dữ liệu mới. Sự bối rối càng thấp, đào tạo càng tốt.
Độ phức tạp được tính theo số mũ của tổn thất thu được từ mô hình. Trong ví dụ trên, chúng ta có thể thấy rằng độ phức tạp của mô hình ví dụ của chúng ta đối với cụm từ “phong cảnh đẹp” là 9,97. Công thức cho sự phức tạp là số mũ của giá trị trung bình của khả năng log của tất cả các từ trong một chuỗi đầu vào.
Bây giờ, chúng ta hãy so sánh sự khó hiểu của hai câu với GPT2 và xem nó khó hiểu như thế nào. Trước tiên, chúng tôi tải mã thông báo và đầu nguyên nhân cho mô hình GPT2 từ HuggingFace:
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
inputs = tokenizer("ABC is a startup based in New York City and Paris", return_tensors = "pt")
loss = model(input_ids = inputs["input_ids"], labels = inputs["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)
Output: 29.48
inputs_wiki_text = tokenizer("Generative Pretrained Transformer is an opensource artificial intelligence created by OpenAI in February 2019", return_tensors = "pt")
loss = model(input_ids = inputs_wiki_text["input_ids"], labels = inputs_wiki_text["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)
Output: 211.81
Độ phức tạp thường chỉ được sử dụng để xác định xem một mô hình đã học tập huấn luyện tốt đến mức nào. Các số liệu khác như BLEU , ROUGE , v.v., được sử dụng trên tập kiểm tra để đo hiệu suất kiểm tra.
Trong bài đăng này, chúng tôi đã thảo luận và tính toán Entropy chéo, Độ phức tạp của một mô hình ngôn ngữ. Trong bài tiếp theo, chúng ta sẽ nói về GLUE benchmark đo lường khả năng hiểu ngôn ngữ chung của các mô hình ngôn ngữ phổ biến.