Khi tôi lần đầu tiên bắt đầu làm việc với dữ liệu văn bản nhiều năm trước, toàn bộ khái niệm nhúng dường như phức tạp không cần thiết.Tôi cảm thấy thoải mái với phương pháp tiếp cận túi từ của tôi và các vector TF-IDF đơn giản.Tôi tin rằng chúng đơn giản, dễ hiểu và thực hiện hiệu quả nhiệm vụ.
Tôi đã làm việc với các bài đánh giá sản phẩm, và các mô hình truyền thống của tôi tiếp tục phân loại sai các bài đánh giá bằng cách sử dụng sự khiêu dâm hoặc ngôn ngữ sắc thái.Vấn đề trở nên rõ ràng: các mô hình của tôi không hiểu rằng "sản phẩm này bị bệnh" thực sự có thể tích cực hoặc rằng "làm việc chính xác như mong đợi" có thể trung lập hoặc tiêu cực tùy thuộc vào bối cảnh.
Đó là khi tôi phát hiện ra những gì nhúng thực sự giải quyết. họ không chỉ là một kỹ thuật mới tuyệt vời - họ giải quyết những hạn chế cơ bản trong cách máy móc hiểu ngôn ngữ.
The Old Days: Life Before Embeddings
The Old Days: Cuộc sống trước khi nhúngHãy hiểu lịch sử sử sử dụng các đại diện văn bản trước khi nhúng mà không đi vào các chi tiết của các phương pháp và cách tiếp cận này.
One-Hot Encoding
Nó đại diện cho mỗi từ như một vector hiếm có với tất cả các zeros ngoại trừ một "1" duy nhất ở vị trí tương ứng với từ đó trong một từ điển. Nó đại diện cho các từ như các vector lớn, hiếm nơi mỗi từ có kích thước riêng của nó. Nếu từ điển của bạn có 100.000 từ (đó là khiêm tốn), mỗi vector từ có 99,999 zeros và một đơn 1. Những đại diện này nói với chúng tôi hoàn toàn không có ý nghĩa. Các từ "hoàn hảo" và "hoàn hảo" là toán học cũng khác nhau như "hoàn hảo" và "khủng khiếp" - hoàn toàn thiếu các mối quan hệ ngữ nghĩa rõ ràng.
"chó" → [1, 0, 0, 0, ..., 0] (xếp hạng 5432 trong từ điển) "chó" → [0, 1, 0, 0, ..., 0] (xếp hạng 8921 trong từ điển)
Giới hạn
- Thì
- Sự bùng nổ về kích thước: Các vector có nhiều kích thước như kích thước từ vựng (thường là 100.000+) Thì
- Không có mối quan hệ ngữ nghĩa: "con mèo" và "con mèo" khác nhau như "con mèo" và "máy bay" (tất cả đều bằng nhau) Thì
- Thiếu hiệu quả tính toán: Tỉ lệ nhân các ma trận hiếm có này cực kỳ tốn nhiều tài nguyên Thì
- Không tổng quát: Hệ thống không thể hiểu các từ ngoài từ vựng ban đầu Thì
Bag-of-Words Approach
Nó đếm sự xuất hiện của từ trong các tài liệu, đôi khi được cân nhắc bởi tầm quan trọng của chúng. Nó đối xử với các từ trong các tài liệu như là các bộ sưu tập từ không được sắp xếp, hoàn toàn loại bỏ trật tự từ. "Con chó cắn người" và "Con người cắn con chó" sẽ có các đại diện giống hệt nhau.
Tài liệu: "Con mèo ngồi trên thảm" BoW: {"the": 2, "cat": 1, "sat": 1, "on": 1, "mat": 1}
Giới hạn :
- Thì
- Mất trật tự từ: "Con chó cắn người" và "Con người cắn chó" có các đại diện giống hệt nhau Thì
- Sparse High-Dimensional Vector: Vector quy mô từ điển vẫn cần thiết Thì
- Không có sự hiểu biết ngữ nghĩa: Các từ đồng nghĩa được thể hiện như các tính năng hoàn toàn khác nhau Thì
- Không có ý nghĩa ngữ cảnh: Mỗi từ có một đại diện cố định bất kể ngữ cảnh Thì
N-grams
Để nắm bắt một số thứ tự từ, chúng tôi bắt đầu sử dụng n-grams (các chuỗi của n từ liên tiếp). nó xem xét các chuỗi của N từ liên tiếp để nắm bắt một số thông tin ngữ cảnh.
Với unigrams (những từ đơn), bạn có thể có một từ vựng 100.000. Với bigrams (cặp từ), đột nhiên bạn đang tìm kiếm hàng triệu tính năng tiềm năng. Với trigrams? Hàng tỷ, về mặt lý thuyết. Ngay cả với cắt tỉa hung hăng, tính kích thước đã trở nên không thể quản lý.
Limitations:
Giới hạn :- Thì
- Sự bùng nổ kết hợp: Số lượng n-gram có thể tăng lên theo cấp số nhân Thì
- Data sparsity: Hầu hết các n-gram có thể không bao giờ xuất hiện trong dữ liệu đào tạo Thì
- Cửa sổ ngữ cảnh giới hạn: Chỉ có các mối quan hệ được ghi lại trong các cửa sổ nhỏ (thường là 2-5 từ) Thì
TF-IDF (Term Frequency-Inverse Document Frequency)
TF-IDF đã cải thiện mọi thứ bằng cách cân nhắc các từ dựa trên tầm quan trọng của chúng đối với một tài liệu cụ thể liên quan đến corpus.
Limitations:
Giới hạn :Không có ý nghĩa ngữ nghĩa: Đó là số lượng và tần số của các từ quyết định tầm quan trọng của việc sử dụng của chúng.
The Embedding Revolution: What Changed?
Cuộc cách mạng nội bộ: Điều gì đã thay đổi?Sự chuyển đổi sang nhúng không chỉ là một sự cải tiến gia tăng; đó là một sự thay đổi mô hình trong cách chúng ta đại diện cho ngôn ngữ.
Meaning Through Context
Sự hiểu biết cơ bản đằng sau việc nhúng là rất đơn giản: các từ xuất hiện trong các bối cảnh tương tự có thể có ý nghĩa tương tự.Nếu bạn thấy "chó" và "con mèo" xuất hiện xung quanh cùng một loại từ ("chú cưng", "thức ăn", "chó"), chúng có lẽ có liên quan ngữ nghĩa.
Các mô hình nhúng đầu tiên như Word2Vec đã nắm bắt được điều này bằng cách huấn luyện các mạng thần kinh để dự đoán:
- Thì
- Một từ dựa trên bối cảnh xung quanh nó (Continuous Bag of Words) Thì
- Bối cảnh xung quanh dựa trên một từ (Skip-gram) Thì
Các trọng lượng lớp ẩn từ các mô hình này trở thành các vector từ của chúng ta, mã hóa các mối quan hệ ngữ nghĩa trong các thuộc tính hình học của không gian vector.
Khi tôi lần đầu tiên phác thảo các vector từ và thấy rằng "vua" - "người đàn ông" + "người phụ nữ" ≈ "nữ hoàng", tôi biết chúng ta đang ở trên một cái gì đó cách mạng.
Các mô hình sớm như Word2Vec và GloVe đã cho mỗi từ một vector duy nhất bất kể ngữ cảnh.
"I need to bank the money" vs. "I'll meet you by the river bank"
Các mô hình như BERT và GPT đã giải quyết điều này bằng cách tạo ra các nhúng khác nhau cho cùng một từ tùy thuộc vào bối cảnh xung quanh.
Vì vậy, trước tiên chúng ta hãy hiểu những gì nhúng là và làm thế nào họ biến đổi NLP và giải quyết những hạn chế của các phương pháp trước đó.
What Are Embeddings?
Embeddings là gì?Embeddings là các đại diện số của dữ liệu (text, hình ảnh, âm thanh, vv) trong một không gian vector liên tục. đối với văn bản, embeddings nắm bắt các mối quan hệ ngữ nghĩa giữa các từ hoặc tài liệu, cho phép máy móc hiểu ý nghĩa theo cách có thể xử lý toán học.
Key Concepts:
- Thì
- Vector: Danh sách thứ tự các số đại diện cho một điểm trong không gian đa chiều Thì
- Kích thước: Số lượng giá trị trong mỗi vector (ví dụ: 768-dim, 1024-dim) Thì
- Vector Space: Không gian toán học nơi có sự nhúng Thì
- Tương tự ngữ nghĩa: Được đo bằng khoảng cách hoặc góc giữa các vector (cách hơn = tương tự hơn) Thì
What Do Dimensions Represent?
Mỗi chiều trong một vector nhúng đại diện cho một tính năng đã học hoặc khía cạnh của dữ liệu. không giống như kỹ thuật tính năng cổ điển, nơi con người xác định ý nghĩa của mỗi chiều, trong các mô hình nhúng hiện đại:
- Thì
- Kích thước xuất hiện trong quá trình đào tạo để đại diện cho các "ý tưởng" trừu tượng Thì
- Các chiều kích cá nhân thường thiếu ý nghĩa cụ thể mà con người có thể giải thích.
- Tuy nhiên, vector hoàn chỉnh nắm bắt thông tin ngữ nghĩa một cách toàn diện. Thì
- Một số kích thước có thể tương ứng với tình cảm, hình thức, chủ đề hoặc phác thảo, nhưng hầu hết đại diện cho sự kết hợp phức tạp của các tính năng. Thì
Why We Need Embeddings
Khi xử lý ngôn ngữ, chúng ta cần chuyển đổi văn bản thành các đại diện số mà:
- Thì
- Chụp các mối quan hệ ngữ nghĩa – các khái niệm tương tự nên có các đại diện tương tự Thì
- Bảo tồn ý nghĩa ngữ cảnh – cùng một từ có thể có nghĩa là những điều khác nhau trong các bối cảnh khác nhau Thì
- Cho phép các hoạt động toán học – chẳng hạn như tìm thấy điểm tương đồng hoặc thực hiện tương tự Thì
- Làm việc hiệu quả trên quy mô – Xử lý khối lượng văn bản lớn mà không có sự bùng nổ tính toán Thì
Embeddings giải quyết những vấn đề này bằng cách đại diện cho các từ, cụm từ hoặc tài liệu như các vector dày đặc trong một không gian liên tục, nơi các mối quan hệ ngữ nghĩa được bảo tồn như các mối quan hệ hình học.
Nền tảng của Embeddings
đại diện vector
Thay vì các vector hiếm có với hàng ngàn hoặc hàng triệu kích thước, nhúng sử dụng một vài trăm kích thước dày đặc, trong đó mỗi kích thước góp phần vào ý nghĩa.
"cat" → [0.2, -0.4, 0.1, -0.8, ..., 0.3] (300 dimensions)
"kitten" → [0.19, -0.38, 0.15, -0.75, ..., 0.29] (similar to "cat")
Điều này làm cho các thứ tự tính toán của quy mô hiệu quả hơn trong khi cho phép trình bày ngữ nghĩa phong phú hơn.
phân phối semantics
Embeddings được xây dựng trên nguyên tắc "bạn sẽ biết một từ bởi công ty mà nó giữ" (J.R. Firth).Bằng cách phân tích những từ nào xuất hiện trong bối cảnh tương tự, embeddings tự động nắm bắt các mối quan hệ ngữ nghĩa.
Ví dụ, "vua" và "nữ hoàng" sẽ có bối cảnh tương tự, vì vậy chúng sẽ có những nhúng tương tự, mặc dù chúng hiếm khi xuất hiện ở cùng một vị trí.
Properties toán học
Không gian nhúng có các thuộc tính toán học đáng chú ý:
vector("king") - vector("man") + vector("woman") ≈ vector("queen")
Điều này cho phép lý luận tương tự và các hoạt động ngữ nghĩa trực tiếp trong không gian vector.
Chuyển học
Các embeddings được đào tạo trước nắm bắt kiến thức ngôn ngữ chung có thể được điều chỉnh tốt cho các nhiệm vụ cụ thể, giảm đáng kể dữ liệu cần thiết cho các ứng dụng mới.
Hiểu ngữ contextual
Các nhúng ngữ cảnh hiện đại (như từ BERT, GPT, v.v.) đại diện cho cùng một từ khác nhau dựa trên ngữ cảnh:
"I'll deposit money in the bank" → "bank" relates to finance
"I'll sit by the river bank" → "bank" relates to geography
Với tất cả kiến thức về lịch sử và sự hiểu biết về nhúng, đã đến lúc bắt đầu sử dụng chúng.
Sử dụng các mô hình LLM/SLM để tạo nhúng
Các nhóm nghiên cứu khác nhau đã phát triển các mô hình nhúng được đào tạo trên các tập dữ liệu đa dạng bao gồm nhiều ngôn ngữ và lĩnh vực. Sự đa dạng này dẫn đến các mô hình với các từ vựng rất khác nhau và khả năng hiểu biết ngữ nghĩa. Ví dụ, các mô hình được đào tạo chủ yếu về văn học khoa học tiếng Anh sẽ mã hóa các khái niệm kỹ thuật khác nhau so với những người được đào tạo về nội dung truyền thông xã hội đa ngôn ngữ. chuyên môn này cho phép các học viên chọn các mô hình nhúng phù hợp nhất với trường hợp sử dụng cụ thể của họ.
Việc thực hiện thực tế của embeddings đã được đơn giản hóa rất nhiều bởi các thư viện như gói SentenceTransformer từ Hugging Face, cung cấp một SDK toàn diện để làm việc với các mô hình nhúng khác nhau. Tương tự như vậy, SDK của OpenAI cung cấp quyền truy cập trực tiếp vào các mô hình nhúng của họ, đã cho thấy hiệu suất ấn tượng trên nhiều tiêu chuẩn. Các công cụ này, và có nhiều hơn nữa, có quyền truy cập dân chủ hóa vào các công nghệ nhúng hiện đại, cho phép các nhà phát triển tích hợp sự hiểu biết ngữ nghĩa vào các ứng dụng mà không cần phải đào tạo các mô hình từ đầu.
Các mô hình, vì lợi ích của bài viết này, nên được coi là một hộp đen lấy các câu như một đầu vào và trả về đại diện vector tương ứng của chúng.
Sử dụng SentenceTransformers Library for Embeddings
Cách đơn giản nhất để tạo nhúng bằng cách sử dụng SentenceTransformer:
from sentence_transformers import SentenceTransformer
# Load a pre-trained model
model = SentenceTransformer('all-MiniLM-L6-v2') # 384 dimensions
# Generate embeddings
texts = ["This is an example sentence", "Each sentence becomes a vector"]
embeddings = model.encode(texts)
print(f"Shape: {embeddings.shape}") # (2, 384)
max_seq_length = model.tokenizer.model_max_length
print(max_seq_length) # 256
Mô hình “all-MiniLM-L6-v2” có sẵn từ HuggingFace có 384 kích thước. Điều này có nghĩa là nó có thể nắm bắt 384 tính năng hoặc sắc thái cho một từ hoặc câu nhất định. Chiều dài chuỗi của mô hình này là 256 token. Các câu được chia thành từ và từ thành token bởi tokenizer trong quá trình nhúng. Số lượng token được tạo ra cho một câu thường là 25% đến 40% nhiều hơn số từ trong câu.
Chiều dài chuỗi biểu thị số lượng token có thể được xử lý bởi mô hình như là một đầu vào được đưa ra. Bất cứ điều gì ít hơn được dán để làm cho nó 256 chiều dài, và bất cứ điều gì khác được loại bỏ. Có những ý nghĩa của điều này, và chúng tôi sẽ thảo luận về chúng trong một bài viết khác.
Phương pháp mã hóa của lớp SentenceTransformer là một wrapper trên chế độ kết luận PyTorch để sử dụng mô hình.
from sentence_transformers import SentenceTransformer
import torch
# Load the model directly with SentenceTransformer
model = SentenceTransformer("sentence-transformers/msmarco-distilbert-base-tas-b")
# Input text
texts = ["This is an example sentence", "Each sentence becomes a vector"]
# Get embedding directly
with torch.no_grad():
embedding = model.encode(texts, convert_to_tensor=True)
print(embedding)
Ở đây, chức năng torch.no_grad đảm bảo rằng không có độ dốc nào được tính toán trong quá trình lây lan trở lại.
Một cách khác, phổ biến hơn để tạo nhúng bằng PyTorch:
# Load the model
model = AutoModel.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")
# Get the tokenizer
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")
# Tokenize input
text = ["This is an example sentence"]
encoded_input = tokenizer(text, padding=True, truncation=True, return_tensors='pt')
# Get embedding of the [CLS] token
with torch.no_grad():
outputs = model(**encoded_input, return_dict=True)
cls_embedding = outputs.last_hidden_state[:, 0]
print(cls_embedding)
Sự khác biệt giữa đoạn mã này và đoạn mã trước đó là chức năng mã hóa đã được thay thế bằng cách sử dụng tokenizer và mô hình rõ ràng.
Một sự khác biệt khác là chúng tôi đang sử dụng outputs.last_hidden_state[:, 0] để lấy vector liên quan đến token CLS. token CLS đặc biệt này được thêm vào mỗi câu ở đầu mỗi câu, và nó chứa thông tin tích lũy về toàn bộ câu.
Cần lưu ý rằng cách tiếp cận này của việc thêm một token CLS chỉ áp dụng cho một số kiến trúc dựa trên biến áp, và điều này bao gồm BERT và các biến thể của nó và các biến áp dựa trên chỉ mã hóa.
Best for:Nhiệm vụ phân loại và dự đoán cấp độ chuỗi
Why they work:Token [CLS] trong các mô hình kiểu BERT được đào tạo đặc biệt để tổng hợp thông tin từ toàn bộ chuỗi trong quá trình đào tạo trước.
When to choose:
- Thì
- Khi sử dụng BERT, RoBERTa hoặc các mô hình tương tự để phân loại Thì
- Khi bạn cần một vector duy nhất đại diện cho một chuỗi toàn bộ Thì
- Khi nhiệm vụ tiếp theo của bạn liên quan đến việc dự đoán một thuộc tính của toàn bộ văn bản Thì
Phương pháp CLS được sử dụng chỉ là một trong những phương pháp để nắm bắt các nhúng cho một câu.
Mean Pooling
Lấy trung bình của tất cả các nhúng token là đáng ngạc nhiên hiệu quả cho nhiều nhiệm vụ. đó là phương pháp go-to của tôi khi tôi đang sử dụng nhúng cho các nhiệm vụ tương tự hoặc thu thập.
Best for:Semantic similarity, retrieval, and general-purpose representations (Tương tự ngữ nghĩa, thu thập và đại diện mục đích chung).
Why it works:Bằng cách trung bình trên tất cả các đại diện token, mean pooling nắm bắt nội dung ngữ nghĩa tập thể trong khi giảm tiếng ồn.
When to choose:
- Thì
- For document similarity or semantic search applications Thì
- Khi bạn cần các đại diện mạnh mẽ không bị chi phối bởi bất kỳ token nào Thì
- Khi thử nghiệm thực nghiệm cho thấy nó vượt trội hơn các phương pháp khác (thường làm cho các nhiệm vụ tương đồng) Thì
import torch
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Mean pooling
with torch.no_grad():
outputs = model(**inputs)
# Get attention mask to ignore padding tokens
attention_mask = inputs['attention_mask']
# Sum token embeddings and divide by the number of tokens
sum_embeddings = torch.sum(outputs.last_hidden_state * attention_mask.unsqueeze(-1), dim=1)
count_tokens = torch.sum(attention_mask, dim=1, keepdim=True)
mean_embeddings = sum_embeddings / count_tokens
print(f"Shape: {mean_embeddings.shape}") # (2, 768)
Max Pooling
Max pooling lấy giá trị tối đa cho mỗi chiều trên tất cả các token. nó là đáng ngạc nhiên tốt trong việc nắm bắt các tính năng quan trọng bất kể chúng xuất hiện ở đâu trong văn bản.
Best for:Tác vụ phát hiện tính năng và khai thác thông tin
Why it works:Max pooling chọn kích hoạt mạnh nhất cho mỗi chiều trên tất cả các token, có hiệu quả nắm bắt các tính năng nổi bật nhất bất kể chúng xuất hiện ở đâu trong văn bản.
When to choose:
- Thì
- Khi các đặc điểm cụ thể quan trọng hơn tần số hoặc vị trí của chúng Thì
- Khi tìm kiếm sự hiện diện của các khái niệm hoặc thực thể cụ thể Thì
- Khi đối phó với các văn bản dài nơi các tín hiệu quan trọng có thể được pha loãng trong trung bình Thì
import torch
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Max pooling
with torch.no_grad():
outputs = model(**inputs)
# Create a mask to ignore padding tokens for max pooling
attention_mask = inputs['attention_mask'].unsqueeze(-1)
# Replace padding token representations with -inf so they're never selected as max
token_embeddings = outputs.last_hidden_state.masked_fill(attention_mask == 0, -1e9)
# Take max over token dimension
max_embeddings = torch.max(token_embeddings, dim=1)[0]
print(f"Shape: {max_embeddings.shape}") # (2, 768)
Weighted Mean Pooling
Phương pháp tập hợp được cân nhắc cố gắng cho nhiều trọng lượng hơn cho các token quan trọng hơn dựa trên vị trí (ví dụ, cho nhiều trọng lượng hơn cho các token sau).
Best for:Nhiệm vụ nơi các phần khác nhau của đầu vào có tầm quan trọng khác nhau
Why it works:Không phải tất cả các từ đều đóng góp bình đẳng cho ý nghĩa. tập hợp cân nhắc cho phép bạn nhấn mạnh các token nhất định dựa trên vị trí của chúng, điểm chú ý hoặc các chỉ số liên quan khác.
When to choose:
- Thì
- Khi thứ tự chuỗi quan trọng (ví dụ, cho nhiều trọng lượng hơn cho các token sau) Thì
- Khi một số token nhất định có tính chất thông tin hơn (ví dụ: cụm từ và động từ so với bài viết) Thì
- Khi bạn có một heuristic tầm quan trọng cụ thể có ý nghĩa cho nhiệm vụ của bạn Thì
import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Weighted mean pooling - more weight to later tokens
with torch.no_grad():
outputs = model(**inputs)
# Get token embeddings and attention mask
token_embeddings = outputs.last_hidden_state
attention_mask = inputs['attention_mask']
# Create position-based weights (later positions get higher weights)
input_lengths = torch.sum(attention_mask, dim=1).unsqueeze(-1)
position_indices = torch.arange(token_embeddings.size(1)).unsqueeze(0).expand_as(attention_mask)
position_weights = position_indices.float() / input_lengths.float()
position_weights = position_weights * attention_mask
# Normalize weights to sum to 1
position_weights = position_weights / torch.sum(position_weights, dim=1, keepdim=True)
# Apply weights and sum
weighted_embeddings = torch.sum(token_embeddings * position_weights.unsqueeze(-1), dim=1)
print(f"Shape: {weighted_embeddings.shape}") # (2, 768)
Lời bài hát: Last Token Pooling
Last token pooling là một kỹ thuật để tạo ra một vector nhúng duy nhất từ một chuỗi các nhúng token bằng cách chỉ chọn đại diện của token cuối cùng.
Best for:Auto-regressive model và sequential processing
Why it works:Trong các mô hình từ trái sang phải như GPT, token cuối cùng chứa bối cảnh tích lũy từ toàn bộ chuỗi, làm cho nó giàu thông tin cho các nhiệm vụ nhất định.
When to choose:
- Thì
- Khi sử dụng GPT hoặc các mô hình decoder-only khác Thì
- Khi làm việc với các nhiệm vụ phụ thuộc rất nhiều vào toàn bộ bối cảnh trước đó Thì
- For text generation or completion tasks
import torch
from transformers import AutoTokenizer, AutoModel
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# Last token pooling
with torch.no_grad():
outputs = model(**inputs)
# Get the last non-padding token for each sequence
attention_mask = inputs['attention_mask']
last_token_indices = torch.sum(attention_mask, dim=1) - 1
batch_indices = torch.arange(attention_mask.size(0))
# Extract the last token embedding for each sequence
last_token_embeddings = outputs.last_hidden_state[batch_indices, last_token_indices]
print(f"Shape: {last_token_embeddings.shape}") # (2, 768)
Có nhiều cách hơn, và các phương pháp này có thể được kết hợp với nhau cũng như để tạo các phương pháp tùy chỉnh.Đây chỉ là sự khởi đầu để hiểu nhúng như một khái niệm và thực hiện cơ bản để có được nhúng bằng cách sử dụng các kỹ thuật khác nhau.
Looking Forward: Where Embeddings Are Headed
Nhìn về phía trước: Nơi Embeddings đang hướngThe embedding space (pun intended) continues to evolve:
- Các nhúng đa phương thức đang phá vỡ rào cản giữa văn bản, hình ảnh, âm thanh và video. Các mô hình như CLIP và DALL-E sử dụng nhúng để tạo ra một không gian ngữ nghĩa được chia sẻ giữa các phương thức khác nhau. Thì
- Các kiến trúc hiệu quả hơn như MobileBERT và DistilBERT đang cho phép sử dụng các nhúng mạnh mẽ trên các thiết bị cạnh với các nguồn lực hạn chế. Thì
- Các nhúng cụ thể về lĩnh vực được đào tạo trước trên các tập đoàn chuyên ngành đang thúc đẩy hiện đại trong các lĩnh vực như y học, luật pháp và tài chính. Thì
Tôi đặc biệt phấn khích về các nhúng có ý thức về thành phần có thể nắm bắt tốt hơn cách ý nghĩa được xây dựng từ các đơn vị nhỏ hơn, cuối cùng có thể giải quyết những thách thức lâu dài với sự phủ nhận và các cụm từ thành phần.
Final Thoughts
Suy nghĩ cuối cùngEmbeddings không chỉ là một kỹ thuật NLP khác – chúng là một sự thay đổi cơ bản trong cách máy móc hiểu và xử lý ngôn ngữ.
Bất kể nhiệm vụ NLP nào bạn đang làm việc, rất có thể các nhúng được áp dụng cẩn thận có thể làm cho nó tốt hơn. chìa khóa là hiểu không chỉ làm thế nào để tạo ra chúng mà còn khi nào và tại sao sử dụng các cách tiếp cận khác nhau.
Và nếu bạn vẫn đang sử dụng túi từ hoặc mã hóa một lần nóng cho phân tích văn bản ...
Vâng, có cả một thế giới của các khả năng đang chờ đợi bạn.