Từ điển kích thước cố định python

Trong bài đăng này, tôi xem xét sâu về các nhúng từ do BERT của Google tạo ra và chỉ cho bạn cách bắt đầu với BERT bằng cách tạo các nhúng từ của riêng bạn

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ổ ghi chép Colab tại đây. Nội dung giống hệt nhau trong cả hai, nhưng

  • Định dạng bài đăng trên blog có thể dễ đọc hơn và bao gồm phần nhận xét để 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

Cập nhật 27/5/20 - Tôi đã cập nhật bài đăng này để sử dụng thư viện

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
7 mới từ hugface thay cho thư viện
['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
8 cũ. Bạn vẫn có thể tìm bài cũ/Sổ tay tại đây nếu cần

Bởi Chris McCormick và Nick Ryan

nội dung
  • nội dung
  • Giới thiệu
    • Lịch sử
    • BERT là gì?
    • Tại sao nhúng BERT?
  • 1. Đang tải BERT đã được đào tạo trước
  • 2. Định dạng đầu vào
    • 2. 1. Mã thông báo đặc biệt
    • 2. 2. Token hóa
    • 2. 3. ID phân khúc
  • 3. Trích xuất nhúng
    • 3. 1. Chạy BERT trên văn bản của chúng tôi
    • 3. 2. Hiểu đầu ra
    • 3. 3. Tạo vectơ từ và câu từ trạng thái ẩn
      • Vectơ từ
      • Vectơ câu
    • 3. 4. Xác nhận các vectơ phụ thuộc theo ngữ cảnh
    • 3. 5. Chiến lược tổng hợp & Lựa chọn lớp
  • 4. ruột thừa
    • 4. 1. Mã thông báo đặc biệt
    • 4. 2. Hết từ vựng
    • 4. 3. chỉ số tương tự
    • 4. 4. Triển khai
      • trích dẫn
Giới thiệu

Lịch sử

2018 là một năm đột phá trong NLP. Học chuyển giao, đặc biệt là các mô hình như ELMO của Allen AI, Open-GPT của OpenAI và BERT của Google cho phép các nhà nghiên cứu vượt qua 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

Tại sao nhúng BERT?

Trong hướng dẫn này, chúng tôi sẽ sử dụng BERT để trích xuất các tính năng, cụ thể là vectơ nhúng từ và câu, từ dữ liệu văn bản. Chúng ta có thể làm gì với các vectơ nhúng từ và câu này? . Ví dụ: nếu bạn muốn đối sánh các câu hỏi hoặc tìm kiếm của khách hàng với các câu hỏi đã được trả lời hoặc các tìm kiếm được ghi chép đầy đủ, các biểu diễn này sẽ giúp bạn truy xuất chính xác các kết quả phù hợp với ý định và ngữ cảnh của khách hàng, ngay cả khi không có từ khóa hoặc cụm từ nào trùng lặp

Thứ hai, và có lẽ quan trọng hơn, các vectơ này được sử dụng làm đầu vào tính năng chất lượng cao cho các mô hình xuôi dòng. Các mô hình NLP như LSTM hoặc CNN yêu cầu đầu vào ở dạng vectơ số và điều này thường có nghĩa là dịch các tính năng như từ vựng và các phần của bài phát biểu thành các biểu diễn số. Trước đây, các từ đã được biểu diễn dưới dạng các giá trị được lập chỉ mục duy nhất [mã hóa một lần nóng] hoặc hữu ích hơn dưới dạng nhúng từ thần kinh trong đó các từ vựng được đối sánh với các nhúng tính năng có độ dài cố định xuất phát từ các mô hình như Word2Vec hoặc Fasttext. BERT mang lại lợi thế so với các mô hình như Word2Vec, bởi vì trong khi mỗi từ có một biểu diễn cố định trong Word2Vec bất kể ngữ cảnh mà từ đó xuất hiện, BERT tạo ra các biểu diễn từ được thông báo động bởi các từ xung quanh chúng. Ví dụ, đưa ra hai câu

“Người đàn ông bị buộc tội cướp ngân hàng. ” “Người đàn ông đi câu cá bên bờ sông. ”

Word2Vec sẽ tạo ra cùng một từ nhúng cho từ “ngân hàng” trong cả hai câu, trong khi theo BERT, từ nhúng cho “ngân hàng” sẽ khác nhau cho mỗi câu. Bên cạnh việc nắm bắt những khác biệt rõ ràng như từ đa nghĩa, các nhúng từ được thông báo theo ngữ cảnh nắm bắt các dạng thông tin khác dẫn đến các biểu diễn tính năng chính xác hơn, từ đó dẫn đến hiệu suất mô hình tốt hơn

Từ quan điểm giáo dục, việc kiểm tra kỹ các nhúng từ BERT là một cách hay để bạn bắt đầu làm quen với BERT và dòng mô hình học chuyển tiếp của nó, đồng thời cung cấp cho chúng ta một số kiến ​​thức và ngữ cảnh thực tế để hiểu rõ hơn các chi tiết bên trong của mô hình

trở đi

1. Đang tải BERT đã được đào tạo trước

Cài giao diện pytorch cho BERT bằng Ôm Mặt. [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ì nó 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 thức hoạt động của mọi thứ] và mã tensorflow [chứa nhiều chi tiết nhưng thường làm chúng tôi lạc hướng]. . ]

Nếu đang chạy mã này trên Google Colab, bạn sẽ phải cài đặt thư viện này mỗi khi kết nối lại;

!pip install transformers

Bây giờ, hãy nhập pytorch, mô hình BERT được đào tạo trước và mã thông báo BERT

Chúng tôi sẽ giải thích chi tiết về mô hình BERT trong hướng dẫn sau, nhưng đây là mô hình được đào tạo trước do Google phát hành đã chạy trong nhiều giờ trên Wikipedia và Book Corpus, một bộ dữ liệu chứa hơn 10.000 cuốn sách thuộc các thể loại khác nhau. Mô hình này chịu trách nhiệm [với một chút sửa đổi] để vượt qua các tiêu chuẩn NLP trong một loạt các nhiệm vụ. Google đã phát hành một số biến thể của mô hình BERT, nhưng kích thước mà chúng tôi sẽ sử dụng ở đây là kích thước nhỏ hơn trong số hai kích thước có sẵn [“cơ sở” và “lớn”] và bỏ qua vỏ bọc, do đó “không có vỏ bọc”. ””

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
7 cung cấp một số lớp để áp dụng BERT cho các tác vụ khác nhau [phân loại mã thông báo, phân loại văn bản,…]. Ở đây, chúng tôi đang sử dụng
list[tokenizer.vocab.keys[]][5000:5020]
0 cơ bản không có tác vụ đầu ra cụ thể nào – đó là một lựa chọn tốt khi sử dụng BERT chỉ để trích xuất các phần nhúng

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

2. Định dạng đầu vào

Bởi vì BERT là một mô hình được đào tạo trước, mong đợi dữ liệu đầu vào ở một định dạng cụ thể, chúng tôi sẽ cần

  1. Dấu hiệu đặc biệt,
    list[tokenizer.vocab.keys[]][5000:5020]
    
    1, để đánh dấu phần cuối của câu hoặc sự tách biệt giữa hai câu
  2. Mã thông báo đặc biệt,
    list[tokenizer.vocab.keys[]][5000:5020]
    
    2, ở đầu văn bản của chúng tôi. Mã thông báo này được sử dụng cho các nhiệm vụ phân loại, nhưng BERT mong đợi nó bất kể ứng dụng của bạn là gì
  3. Mã thông báo phù hợp với từ vựng cố định được sử dụng trong BERT
  4. ID mã thông báo cho mã thông báo, từ mã thông báo của BERT
  5. ID mặt nạ để cho biết phần tử nào trong chuỗi là mã thông báo và phần tử nào là phần đệm
  6. ID phân đoạn được sử dụng để phân biệt các câu khác nhau
  7. Vị trí nhúng được sử dụng để hiển thị vị trí mã thông báo trong chuỗi

May mắn thay, giao diện

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
7 đáp ứng tất cả các yêu cầu trên [sử dụng chức năng
list[tokenizer.vocab.keys[]][5000:5020]
4]

Tuy nhiên, vì đây nhằm mục đích giới thiệu cách làm việc với BERT, nên chúng tôi sẽ thực hiện các bước này theo cách thủ công [hầu hết]

Để biết ví dụ về cách sử dụng

list[tokenizer.vocab.keys[]][5000:5020]
4, hãy xem bài đăng tiếp theo về Phân loại câu tại đây

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

BERT có thể lấy một hoặc hai câu làm đầu vào và sử dụng mã thông báo đặc biệt

list[tokenizer.vocab.keys[]][5000:5020]
1 để phân biệt chúng. Mã thông báo
list[tokenizer.vocab.keys[]][5000:5020]
2 luôn xuất hiện ở đầu văn bản và dành riêng cho các nhiệm vụ phân loại

Tuy nhiên, cả hai mã thông báo luôn được yêu cầu, ngay cả khi chúng tôi chỉ có một câu và ngay cả khi chúng tôi không sử dụng BERT để phân loại. Đó là cách BERT được đào tạo trước, và đó là điều BERT mong đợi được thấy

Nhập 2 câu

list[tokenizer.vocab.keys[]][5000:5020]
8

Đầu vào 1 câu

list[tokenizer.vocab.keys[]][5000:5020]
9

2. 2. Token hóa

BERT cung cấp mã thông báo riêng mà chúng tôi đã nhập ở trên. Hãy xem cách nó xử lý câu dưới đây

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
5

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']

Lưu ý cách từ "embeddings" được thể hiện

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
70

Từ gốc đã được chia thành các từ con và ký tự nhỏ hơn. Hai dấu thăng trước một số từ phụ này chỉ là cách mã thông báo của chúng tôi biểu thị rằng từ phụ hoặc ký tự này là một phần của từ lớn hơn và đứng trước một từ phụ khác. Vì vậy, ví dụ: mã thông báo '##bed' tách biệt với mã thông báo 'giường';

Tại sao nó nhìn theo cách này? . Mô hình này tham lam tạo ra một từ vựng có kích thước cố định gồm các ký tự, từ phụ và từ riêng lẻ phù hợp nhất với dữ liệu ngôn ngữ của chúng tôi. Vì kích thước giới hạn từ vựng của mô hình mã thông báo BERT của chúng tôi là 30.000, nên mô hình WordPiece đã tạo ra một từ vựng chứa tất cả các ký tự tiếng Anh cộng với khoảng 30.000 từ và từ phụ phổ biến nhất được tìm thấy trong ngữ liệu tiếng Anh mà mô hình được đào tạo trên đó. Từ vựng này chứa bốn điều

  1. Toàn bộ từ
  2. Các từ con xuất hiện ở phía trước của một từ hoặc trong sự cô lập [“em” như trong “embeddings” được gán cùng một vectơ với chuỗi ký tự độc lập “em” như trong “go get em” ]
  3. Các từ phụ không đứng trước một từ, đứng trước '##' để biểu thị trường hợp này
  4. ký tự cá nhân

Để mã hóa một từ theo mô hình này, trước tiên bộ mã hóa sẽ kiểm tra xem toàn bộ từ đó có trong từ vựng hay không. Nếu không, nó sẽ cố gắng chia từ thành các từ con lớn nhất có thể có trong từ vựng và như một phương sách cuối cùng sẽ phân tách từ đó thành các ký tự riêng lẻ. Lưu ý rằng vì điều này, chúng ta luôn có thể biểu diễn một từ ít nhất là tập hợp các ký tự riêng lẻ của từ đó

Kết quả là, thay vì gán các từ không có trong từ vựng cho một mã thông báo bắt tất cả như 'OOV' hoặc 'UNK', các từ không có trong từ vựng được phân tách thành các mã thông báo từ phụ và ký tự mà sau đó chúng tôi có thể tạo các phần nhúng cho

Vì vậy, thay vì gán “phần nhúng” và mọi từ khác ngoài từ vựng cho một mã thông báo từ vựng không xác định bị quá tải, chúng tôi chia nó thành các mã thông báo từ phụ ['em', '##bed', '##ding', '##s' . Chúng tôi thậm chí có thể tính trung bình các vectơ nhúng từ phụ này để tạo một vectơ gần đúng cho từ gốc

[Để biết thêm thông tin về WordPiece, hãy xem bài viết gốc và thảo luận thêm trong Hệ thống dịch máy thần kinh của Google. ]

Dưới đây là một số ví dụ về các mã thông báo có trong từ vựng của chúng tôi. Mã thông báo bắt đầu bằng hai giá trị băm là từ phụ hoặc ký tự riêng lẻ

Để khám phá nội dung từ vựng của BERT, hãy xem sổ ghi chép này do tôi tạo và video YouTube kèm theo tại đây

list[tokenizer.vocab.keys[]][5000:5020]

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
7

Sau khi chia văn bản thành các mã thông báo, chúng ta phải chuyển đổi câu từ danh sách các chuỗi thành danh sách các chỉ số từ vựng

Từ đây trở đi, chúng ta sẽ sử dụng câu ví dụ dưới đây, trong đó có hai trường hợp của từ “ngân hàng” với các ý nghĩa khác nhau

!pip install transformers
0

!pip install transformers
1

2. 3. ID phân khúc

BERT được đào tạo và mong đợi các cặp câu, sử dụng số 1 và số 0 để phân biệt giữa hai câu. Nghĩa là, đối với mỗi mã thông báo trong “tokenized_text”, chúng tôi phải chỉ định câu đó thuộc về câu nào. câu 0 [chuỗi số 0] hoặc câu 1 [chuỗi số 1]. Đối với mục đích của chúng tôi, đầu vào một câu chỉ yêu cầu một chuỗi 1 giây, vì vậy chúng tôi sẽ tạo một vectơ 1 giây cho mỗi mã thông báo trong câu đầu vào của chúng tôi

Nếu bạn muốn xử lý hai câu, hãy gán mỗi từ trong câu đầu tiên cộng với mã thông báo '[SEP]' là 0 và tất cả các mã thông báo của câu thứ hai là 1

!pip install transformers
2

!pip install transformers
3

3. Trích xuất nhúng

3. 1. Chạy BERT trên văn bản của chúng tôi

Tiếp theo, chúng ta cần chuyển đổi dữ liệu của mình sang tenxơ mỏ hàn và gọi mô hình BERT. Giao diện BERT PyTorch yêu cầu dữ liệu ở dạng tenxơ mỏ hàn chứ không phải danh sách Python, vì vậy chúng tôi chuyển đổi danh sách tại đây - điều này không thay đổi hình dạng hoặc dữ liệu

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

0

Gọi

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
71 sẽ lấy mô hình từ internet. Khi chúng tôi tải
['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
72, chúng tôi thấy định nghĩa của mô hình được in trong nhật ký. Mô hình là một mạng lưới thần kinh sâu với 12 lớp. Giải thích về các lớp và chức năng của chúng nằm ngoài phạm vi của bài đăng này và bạn có thể bỏ qua phần đầu ra này ngay bây giờ

người mẫu. eval[] đặt mô hình của chúng ta ở chế độ đánh giá thay vì chế độ đào tạo. Trong trường hợp này, chế độ đánh giá tắt chính quy bỏ học được sử dụng trong đào tạo

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

1

Ghi chú. Tôi đã xóa đầu ra khỏi bài đăng trên blog vì nó quá dài. Bạn có thể tìm thấy nó trong Colab Notebook tại đây nếu bạn quan tâm

Tiếp theo, hãy đánh giá BERT trên văn bản mẫu của chúng tôi và tìm nạp các trạng thái ẩn của mạng

lưu ý bên lề.

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
73 yêu cầu PyTorch không xây dựng biểu đồ tính toán trong quá trình chuyển tiếp này [vì chúng tôi sẽ không chạy backprop ở đây] – điều này chỉ làm giảm mức tiêu thụ bộ nhớ và tăng tốc mọi thứ lên một chút

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

2

3. 2. Hiểu đầu ra

Toàn bộ các trạng thái ẩn cho mô hình này, được lưu trữ trong đối tượng

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
74, hơi chóng mặt. Đối tượng này có bốn chiều, theo thứ tự sau

  1. Số lớp [13 lớp]
  2. Số lô [1 câu]
  3. Từ / số mã thông báo [22 mã thông báo trong câu của chúng tôi]
  4. Số đơn vị / tính năng ẩn [768 tính năng]

Đợi đã, 13 lớp?

Đó là 219.648 giá trị duy nhất chỉ để đại diện cho một câu của chúng tôi

Thứ nguyên thứ hai, kích thước lô, được sử dụng khi gửi nhiều câu cho mô hình cùng một lúc;

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

3

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

4

Hãy xem nhanh phạm vi giá trị cho một lớp và mã thông báo nhất định

Bạn sẽ thấy rằng phạm vi khá giống nhau đối với tất cả các lớp và mã thông báo, với phần lớn các giá trị nằm trong khoảng [-2, 2] và một số ít giá trị nằm trong khoảng -10

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

5

Nhóm các giá trị theo lớp có ý nghĩa đối với mô hình, nhưng vì mục đích của chúng tôi, chúng tôi muốn nó được nhóm theo mã thông báo

Thứ nguyên hiện tại

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
75

Kích thước mong muốn

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
76

May mắn thay, PyTorch bao gồm chức năng

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
77 để dễ dàng sắp xếp lại kích thước của tensor

Tuy nhiên, thứ nguyên đầu tiên hiện là danh sách Python

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

6

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

7

Hãy kết hợp các lớp để tạo thành một tensor lớn

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

8

import torch
from transformers import BertTokenizer, BertModel

# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig[level=logging.INFO]

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer [vocabulary]
tokenizer = BertTokenizer.from_pretrained['bert-base-uncased']

9

Hãy loại bỏ thứ nguyên "lô" vì chúng ta không cần nó

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
50

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
51

Cuối cùng, chúng ta có thể chuyển đổi kích thước “lớp” và “mã thông báo” với

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
77

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
52

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
53

3. 3. Tạo vectơ từ và câu từ trạng thái ẩn

Bây giờ, chúng ta phải làm gì với những trạng thái ẩn này?

Để có được các vectơ riêng lẻ, chúng ta sẽ cần kết hợp một số vectơ lớp… nhưng lớp hoặc sự kết hợp các lớp nào cung cấp biểu diễn tốt nhất?

Thật không may, không có câu trả lời dễ dàng duy nhất nào… Tuy nhiên, hãy thử một vài cách tiếp cận hợp lý. Sau đó, tôi sẽ chỉ cho bạn một số tài nguyên hữu ích để xem xét thêm câu hỏi này

Vectơ từ

Để cung cấp cho bạn một số ví dụ, hãy tạo vectơ từ theo hai cách

Trước tiên, hãy nối bốn lớp cuối cùng, cung cấp cho chúng tôi một vectơ từ trên mỗi mã thông báo. Mỗi vectơ sẽ có độ dài

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
79

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
54

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
55

Là một phương pháp thay thế, hãy thử tạo các vectơ từ bằng cách tổng hợp bốn lớp cuối cùng lại với nhau

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
56

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
57

Vectơ câu

Để có được một vectơ duy nhất cho toàn bộ câu của chúng tôi, chúng tôi có nhiều chiến lược phụ thuộc vào ứng dụng, nhưng một cách tiếp cận đơn giản là tính trung bình lớp ẩn thứ hai đến cuối cùng của mỗi mã thông báo tạo ra một vectơ có độ dài 768

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
58

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
59

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
0

3. 4. Xác nhận các vectơ phụ thuộc theo ngữ cảnh

Để xác nhận rằng giá trị của các vectơ này trên thực tế phụ thuộc vào ngữ cảnh, hãy xem xét các trường hợp khác nhau của từ “ngân hàng” trong câu ví dụ của chúng tôi

“Sau khi lấy trộm tiền từ kho tiền ngân hàng, người ta nhìn thấy tên cướp ngân hàng đang câu cá trên bờ sông Mississippi. ”

Hãy tìm chỉ mục của ba trường hợp của từ “ngân hàng” trong câu ví dụ

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
1

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
2

Họ ở vị trí 6, 10 và 19

Đối với phân tích này, chúng tôi sẽ sử dụng các vectơ từ mà chúng tôi đã tạo bằng cách tính tổng bốn lớp cuối cùng

Chúng ta có thể thử in ra các vectơ của chúng để so sánh chúng

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
3

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
4

Chúng ta có thể thấy rằng các giá trị khác nhau, nhưng hãy tính toán độ tương tự cosin giữa các vectơ để so sánh chính xác hơn

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
5

['[CLS]', 'here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.', '[SEP]']
6

Điều này có vẻ khá tốt

3. 5. Chiến lược tổng hợp & Lựa chọn lớp

Dưới đây là một số tài nguyên bổ sung để khám phá chủ đề này

BERT tác giả

Các tác giả BERT đã thử nghiệm các chiến lược nhúng từ bằng cách cung cấp các tổ hợp vectơ khác nhau làm tính năng đầu vào cho BiLSTM được sử dụng trên tác vụ nhận dạng thực thể được đặt tên và quan sát kết quả điểm số F1

[Hình ảnh từ blog của Jay Allamar]

Mặc dù việc ghép bốn lớp cuối cùng tạo ra kết quả tốt nhất cho tác vụ cụ thể này, nhưng nhiều phương pháp khác chỉ xuất hiện ở vị trí thứ hai và nói chung, nên thử nghiệm các phiên bản khác nhau cho ứng dụng cụ thể của bạn. Kết quả có thể thay đổi

Điều này được thể hiện một phần bằng cách lưu ý rằng các lớp khác nhau của BERT mã hóa các loại thông tin rất khác nhau, vì vậy chiến lược tổng hợp phù hợp sẽ thay đổi tùy thuộc vào ứng dụng vì các lớp khác nhau mã hóa các loại thông tin khác nhau

Dịch vụ BERT của Han Xiao

Han Xiao đã tạo một dự án mã nguồn mở có tên bert-as-service trên GitHub nhằm mục đích tạo các từ nhúng cho văn bản của bạn bằng BERT. Han đã thử nghiệm các cách tiếp cận khác nhau để kết hợp các nhúng này và chia sẻ một số kết luận cũng như cơ sở lý luận trên trang Câu hỏi thường gặp của dự án

Theo mặc định,

!pip install transformers
00 sử dụng kết quả đầu ra từ lớp thứ hai đến lớp cuối cùng của mô hình

Tôi sẽ tóm tắt quan điểm của Han bằng cách sau

  1. Các phần nhúng bắt đầu ở lớp đầu tiên vì không có thông tin theo ngữ cảnh [i. e. , nghĩa của từ nhúng 'ngân hàng' ban đầu không dành riêng cho ngân hàng sông hoặc ngân hàng tài chính]
  2. Khi các phần nhúng di chuyển sâu hơn vào mạng, chúng sẽ thu thập ngày càng nhiều thông tin theo ngữ cảnh với mỗi lớp
  3. Tuy nhiên, khi bạn tiếp cận lớp cuối cùng, bạn bắt đầu thu thập thông tin dành riêng cho các nhiệm vụ đào tạo trước của BERT [“Mô hình ngôn ngữ ẩn” [MLM] và “Dự đoán câu tiếp theo” [NSP]]
    • Những gì chúng tôi muốn là nhúng mã hóa ý nghĩa của từ…
    • BERT được thúc đẩy để làm điều này, nhưng nó cũng được thúc đẩy để mã hóa bất kỳ thứ gì khác có thể giúp nó xác định từ còn thiếu là gì [MLM] hoặc liệu câu thứ hai có xuất hiện sau câu đầu tiên hay không [NSP]
  4. Lớp thứ hai đến lớp cuối cùng là thứ mà Han giải quyết như một điểm ngọt ngào hợp lý
4. ruột thừa

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

Cần lưu ý rằng mặc dù

list[tokenizer.vocab.keys[]][5000:5020]
2 hoạt động như một "đại diện tổng hợp" cho các nhiệm vụ phân loại, nhưng đây không phải là lựa chọn tốt nhất cho một vectơ nhúng câu chất lượng cao. Theo tác giả BERT Jacob Devlin. “Tôi không chắc những vectơ này là gì, vì BERT không tạo ra các vectơ câu có ý nghĩa. Có vẻ như điều này đang thực hiện tổng hợp trung bình trên các mã thông báo từ để có được một vectơ câu, nhưng chúng tôi chưa bao giờ gợi ý rằng điều này sẽ tạo ra các biểu diễn câu có ý nghĩa. ”

[Tuy nhiên, mã thông báo [CLS] sẽ trở nên có ý nghĩa nếu mô hình đã được tinh chỉnh, trong đó lớp ẩn cuối cùng của mã thông báo này được sử dụng làm “vectơ câu” để phân loại trình tự. ]

4. 2. Hết từ vựng

Đối với các từ nằm ngoài từ vựng được tạo thành từ nhiều câu nhúng và cấp độ ký tự, có một vấn đề nữa là làm thế nào tốt nhất để khôi phục lại sự nhúng này. Tính trung bình các phần nhúng là giải pháp đơn giản nhất [một giải pháp dựa trên các mô hình nhúng tương tự với các từ vựng từ phụ như fasttext], nhưng tính tổng các phần nhúng từ phụ và chỉ cần lấy mã nhúng cuối cùng [hãy nhớ rằng các vectơ nhạy cảm với ngữ cảnh] là các chiến lược thay thế có thể chấp nhận được

4. 3. chỉ số tương tự

Điều đáng chú ý là các so sánh tương tự ở cấp độ từ không phù hợp với các nhúng BERT vì các nhúng này phụ thuộc vào ngữ cảnh, nghĩa là vectơ từ thay đổi tùy thuộc vào câu mà nó xuất hiện trong. Điều này cho phép những điều tuyệt vời như đa nghĩa để e. g. đại diện của bạn mã hóa “ngân hàng” sông chứ không phải “ngân hàng” tổ chức tài chính, nhưng làm cho các so sánh tương tự trực tiếp giữa các từ ít có giá trị hơn. Tuy nhiên, đối với phép so sánh tương tự nhúng câu vẫn có giá trị sao cho người ta có thể truy vấn, ví dụ, một câu đơn lẻ so với tập dữ liệu gồm các câu khác để tìm câu tương tự nhất. Tùy thuộc vào chỉ số tương tự được sử dụng, các giá trị tương tự thu được sẽ ít thông tin hơn so với xếp hạng tương đối của các đầu ra tương tự vì nhiều chỉ số tương tự đưa ra các giả định về không gian vectơ [ví dụ: các thứ nguyên có trọng số bằng nhau] không đúng với 768 chiều của chúng tôi

4. 4. Triển khai

Bạn có thể sử dụng mã trong sổ ghi chép này làm nền tảng cho ứng dụng của riêng mình để trích xuất các tính năng BERT từ văn bản. Tuy nhiên, đã tồn tại các triển khai tenorflow chính thức và pytorch được đánh giá cao để thực hiện việc này cho bạn. Ngoài ra, bert-as-a-service là một công cụ tuyệt vời được thiết kế đặc biệt để chạy tác vụ này với hiệu suất cao và là công cụ tôi muốn giới thiệu cho các ứng dụng sản xuất. Tác giả đã rất quan tâm đến việc triển khai công cụ và cung cấp tài liệu tuyệt vời [một số tài liệu đã được sử dụng để giúp tạo hướng dẫn này] để giúp người dùng hiểu các chi tiết sắc thái hơn mà người dùng gặp phải, như quản lý tài nguyên và chiến lược tổng hợp

trích dẫn

Chris McCormick và Nick Ryan. [2019, ngày 14 tháng 5]. Hướng dẫn nhúng BERT Word. Lấy từ http. //www. mccormickml. com

Chủ Đề