[ad_1]
Với số lượng mô hình nhúng ngày càng tăng, việc chọn mô hình nhúng phù hợp cho ứng dụng học máy của bạn có thể là một thách thức. Could mắn thay, Bảng xếp hạng MTEB cung cấp một loạt các số liệu xếp hạng toàn diện cho các tác vụ xử lý ngôn ngữ tự nhiên khác nhau.
Khi truy cập trang net, bạn sẽ nhận thấy rằng năm mô hình nhúng hàng đầu là Máy biến áp được đào tạo trước sáng tạo (GPT). Điều này có thể khiến bạn nghĩ rằng mô hình GPT là mô hình nhúng tốt nhất. Nhưng điều này có thực sự đúng? Hãy tiến hành một thí nghiệm để tìm hiểu.
Phần nhúng là biểu diễn tensor của văn bản, chuyển đổi ID mã thông báo văn bản và chiếu chúng vào không gian tensor.
Bằng cách nhập văn bản vào mô hình mạng thần kinh và thực hiện chuyển tiếp, bạn có thể thu được các vectơ nhúng. Tuy nhiên, quá trình thực tế phức tạp hơn một chút. Hãy chia nhỏ nó ra từng bước một:
- Chuyển đổi văn bản thành ID mã thông báo
- Truyền ID mã thông báo vào mạng lưới thần kinh
- Trả về kết quả đầu ra của mạng lưới thần kinh
Trong bước đầu tiên, tôi sẽ sử dụng mã thông báo để đạt được nó. model_inputs
là biểu diễn tensor của nội dung văn bản, "some questions"
.
from transformers import AutoModelForCausalLM, AutoTokenizertokenizer = AutoTokenizer.from_pretrained(
"mistralai/Mistral-7B-Instruct-v0.1"
)
messages = (
{
"function": "person",
"content material": "some questions",
},
)
encodeds = tokenizer.apply_chat_template(messages, return_tensors="pt")
model_inputs = encodeds.to("cuda")
Bước thứ hai rất đơn giản, vượt qua model_inputs
thành một mạng lưới thần kinh. Nhật ký của mã thông báo được tạo có thể được truy cập thông qua .logits
.
import torchwith torch.no_grad():
return mannequin(model_inputs).logits
Bước thứ ba hơi phức tạp một chút. Các mô hình GPT chỉ có chức năng giải mã và việc tạo mã thông báo của chúng có tính tự hồi phục. Nói một cách đơn giản, mã thông báo cuối cùng của một câu đã hoàn thành đã nhìn thấy tất cả các mã thông báo trước đó trong câu. Do đó, đầu ra của mã thông báo cuối cùng chứa tất cả điểm ái lực (sự chú ý) từ các mã thông báo trước đó.
Chơi lô tô! Bạn quan tâm nhất đến token cuối cùng vì cơ chế chú ý trong máy biến áp.
Kích thước đầu ra của GPT được triển khai trong Ôm mặt là (kích thước lô, kích thước mã thông báo đầu vào, số lượng từ vựng). Để có được đầu ra mã thông báo cuối cùng của tất cả các lô, tôi có thể thực hiện một lát cắt tensor.
import torch
with torch.no_grad():
return mannequin(model_inputs).logits(:, -1, :)
Để đo lường chất lượng của các phần nhúng GPT này, bạn có thể sử dụng độ tương tự cosine. Độ tương tự cosin càng cao thì ý nghĩa ngữ nghĩa của câu càng gần.
import torch
def compute_cosine_similarity(input1, input2):
cos = torch.nn.CosineSimilarity(dim=1, eps=1e-6)
return cos(input1, input2)
Hãy tạo một số hàm tiện dụng cho phép chúng ta lặp qua danh sách các cặp câu hỏi và câu trả lời và xem kết quả. Hướng dẫn Mistral 7b v0.1 một trong những mô hình nguồn mở tuyệt vời, được sử dụng cho thử nghiệm này.
from transformers import AutoTokenizer, AutoModelForCausalLM
from torch.distributions import Categorical
import torch
from termcolor import colouredmannequin = AutoModelForCausalLM.from_pretrained(
"mistralai/Mistral-7B-Instruct-v0.1"
)
tokenizer = AutoTokenizer.from_pretrained(
"mistralai/Mistral-7B-Instruct-v0.1"
)
def generate_last_token_embeddings(query, max_new_tokens=30):
messages = (
{
"function": "person",
"content material": query,
},
)
encodeds = tokenizer.apply_chat_template(messages, return_tensors="pt")
model_inputs = encodeds.to("cuda")
with torch.no_grad():
return mannequin(model_inputs).logits(:, -1, :)
def get_similarities(q_batch, a_batch):
for q in q_batch:
for a in a_batch:
q_emb, a_emd = generate_last_token_embeddings(q), generate_last_token_embeddings(a),
similarity = compute_cosine_similarity(q_emb, a_emd)
print(coloured(f"query: {q} and ans: {a}", "inexperienced"))
print(coloured(f"end result: {similarity}", "blue"))
q = ("The place is the headquarter of OpenAI?",
"What's GPU?")
a = ("OpenAI relies at San Francisco.",
"A graphics processing unit (GPU) is an digital circuit that may carry out mathematical calculations rapidly",
)
Đối với cặp câu hỏi và câu trả lời đầu tiên:
- Câu hỏi: “Trụ sở chính của OpenAI là gì?”
- Trả lời: “OpenAI có trụ sở tại San Francisco.”
- Độ tương tự cosin: 0,96
Đối với cặp câu hỏi và câu trả lời thứ hai:
- Câu hỏi: GPU là gì?
- Trả lời: “Bộ xử lý đồ họa (GPU) là một mạch điện tử có thể thực hiện các phép tính toán học một cách nhanh chóng.”
- Độ tương tự cosin: 0,94
Đối với một cặp không liên quan:
- Câu hỏi: “Trụ sở chính của OpenAI ở đâu?”
- Trả lời: “Bộ xử lý đồ họa (GPU) là một mạch điện tử có thể thực hiện các phép tính toán học một cách nhanh chóng.”
- Độ tương tự cosin: 0,90
Đối với cặp tệ nhất:
- Câu hỏi: GPU là gì?
- Trả lời: “OpenAI có trụ sở tại San Francisco.”
- Độ tương tự cosin: 0,93
Những kết quả này cho thấy rằng việc sử dụng mô hình GPT, trong trường hợp này là mistral 7b hướng dẫn v0.1, vì các mô hình nhúng có thể không mang lại kết quả tuyệt vời về mặt phân biệt giữa các cặp có liên quan và không liên quan. Nhưng tại sao các mô hình GPT vẫn nằm trong prime 5 mô hình nhúng?
tokenizer = AutoTokenizer.from_pretrained("intfloat/e5-mistral-7b-instruct")
mannequin = AutoModelForCausalLM.from_pretrained(
"intfloat/e5-mistral-7b-instruct"
)
Lặp lại quy trình đánh giá tương tự với một mô hình khác, e5-mistral-7b-instruct
, một trong những mô hình nguồn mở hàng đầu từ bảng xếp hạng MTEB và được tinh chỉnh từ hướng dẫn của Mistral 7b, tôi phát hiện ra rằng độ tương tự cosine cho câu hỏi và các cặp có liên quan lần lượt là 0,88 và 0,84 cho câu hỏi OpenAI và GPU. Đối với các cặp câu hỏi và câu trả lời không liên quan, độ tương tự giảm xuống còn 0,56 và 0,67. Phát hiện này cho thấy e5-mistral-7b-instruct
là một mô hình được cải tiến nhiều cho việc nhúng. Điều gì tạo nên sự cải thiện như vậy?
Đi sâu vào giấy phía sau e5-mistral-7b-instruct
điều quan trọng là việc sử dụng mất tương phản để tiếp tục tinh chỉnh mô hình mistral.
Không giống như GPT được đào tạo hoặc tinh chỉnh thêm bằng cách sử dụng mất entropy chéo của các mã thông báo được dự đoán và mã thông báo được gắn nhãn, sự mất tương phản nhằm mục đích tối đa hóa khoảng cách giữa các cặp âm và giảm thiểu khoảng cách giữa các cặp dương.
Cái này bài viết trên blog trình bày khái niệm này chi tiết hơn. Các sim
hàm tính khoảng cách cosin giữa hai vectơ. Đối với sự mất tương phản, mẫu số biểu thị khoảng cách cosin giữa các mẫu dương và mẫu âm. Lý do đằng sau sự mất mát tương phản là chúng ta muốn các vectơ tương tự càng gần 1 càng tốt, vì log(1) = 0 thể hiện sự mất mát tối ưu.
Trong bài đăng này, tôi đã nêu bật một cạm bẫy phổ biến khi sử dụng GPT làm mô hình nhúng mà không tinh chỉnh. Đánh giá của tôi cho thấy rằng việc tinh chỉnh GPT với sự mất tương phản, các phần nhúng có thể có ý nghĩa và phân biệt đối xử hơn. Bằng cách hiểu được điểm mạnh và hạn chế của mô hình GPT, đồng thời tận dụng tổn thất tùy chỉnh như mất tương phản, bạn có thể đưa ra quyết định sáng suốt hơn khi chọn và sử dụng mô hình nhúng cho các dự án học máy của mình. Tôi hy vọng bài đăng này giúp bạn chọn mô hình GPT một cách khôn ngoan cho ứng dụng của mình và mong nhận được phản hồi của bạn! 🙂
[ad_2]
Source link