Chuyển tới nội dung chính

Kích thước từ vựng, độ phủ và đuôi dài Zipf

Kho văn bản sửa đượcKéo K, số tính lạiZipf log-log

Kích thước từ vựng, độ phủ và đuôi dài Zipf

Từ vựng phải hữu hạn, mà số từ khác nhau trong văn bản thì cứ mọc thêm mãi. Cắt ở đâu là một quyết định, và giá phải trả lộ ra ở hai con số OOV rất khác nhau.

Bài trước đã nói tới OOV như một nhãn dán lên từng từ. Bài này hỏi câu tiếp theo: nếu bạn là người chọn từ vựng, bạn giữ lại bao nhiêu từ? Giữ nhiều thì bảng nhúng phình to và phần lớn số dòng trong đó gần như không bao giờ được dùng tới. Giữ ít thì mô hình gặp từ lạ liên tục.

Trước khi kéo, hãy nắm chắc hai chữ sẽ đi cùng nhau suốt cả bài. Token là một lần xuất hiện: câu mèo mèo mèo có ba token. Type là một từ khác nhau: câu đó chỉ có một type. Cùng một kho văn bản, đếm theo token và đếm theo type cho ra hai thế giới khác hẳn nhau, và đó chính là chỗ bài này muốn bạn thấy tận mắt.

Độ phủ từ vựng · kéo K, xem token và type tách nhau ra
Độ phủ token 47,1%OOV token 52,9%OOV type 82,5%
✎ sửa được
225
token, tức số lần xuất hiện
114
type, tức số từ khác nhau
94
từ bị loại khỏi từ vựng
47,1%
độ phủ theo token
52,9%
OOV theo token
82,5%
OOV theo type
Độ phủ token theo kích thước từ vựng
K = 20 · 47,1%02957861140%25%50%75%100%K, số từ giữ lại trong từ vựngđộ phủ token
Zipf: hạng và tần suất trên trục log-log
ngoài từ vựng12510205010012510hạng của từ (thang log)tần suất (thang log)
Cần 23 từ đầu bảng để phủ được một nửa số token, và 70 trong 114 từ chỉ xuất hiện đúng một lần. Đường thẳng đứt trên biểu đồ Zipf là mốc lý thuyết tần suất = tần suất cao nhất / hạng.
từ15một10hình996số5thì5bản4dữ4hiện4liệu4lần4văn4xuất4đó4còn3gặp3hai3học3lại3như3chỉ2con2càng2cái2cắt2của2dài2gọi2hay2hơn2kho2lạ2lặp2lệch2nhau2nhiều2nhỏ2những2phần2rất2vựng2đuôi2được2bạn1bị1bớt1cho1chuyên1chênh1chính1các11cũng11cứ1diêu1dạng1giữa11gần1gọn1gồm1hiếm1hạn1hội1hữu1khác1không1luật1lãng1lẫn1lớn11ngoài1ngành1ngôn1ngữ1nhanh1nhóm1nhưng1này1nên1nằm1phiêu1phải1sự1thuộc1thâm1thấy1token1trong1trác1trầm1tuyệt1type1tả1tập1uyên11về1với1xong1zipf1áo1đi1đây1đã1đãng1đúng1định1đọc1đủ11

Kho mặc định có 225 token nhưng chỉ 114 type, và trong 114 type đó thì 70 từ xuất hiện đúng một lần. Từ đứng đầu bảng là từ với 15 lần, tức một mình nó đã chiếm hơn 6% toàn bộ số lần xuất hiện.

Bây giờ nhìn vào mốc mặc định K = 20. Bạn giữ lại 20 từ trong 114, tức khoảng một phần sáu số type, và được:

  • Độ phủ token 47,1%: gần một nửa số lần xuất hiện trong kho đã nằm trong từ vựng.
  • OOV theo token 52,9%: phần còn lại, đúng bằng một trừ độ phủ.
  • OOV theo type 82,5%: 94 trong 114 từ khác nhau đã bị vứt ra ngoài.

Hai con số OOV nói về cùng một phép cắt mà chênh nhau tới 30 điểm phần trăm. Lý do rất đơn giản khi nhìn biểu đồ Zipf: những từ bị loại đều nằm ở đuôi phải, mỗi từ chỉ góp một hai lần xuất hiện, nên vứt rất nhiều type mà mất tương đối ít token. Điều này luôn đúng chứ không phải may rủi của kho này: các type bị loại là các type hiếm nhất, nên tỉ lệ OOV theo type không bao giờ nhỏ hơn tỉ lệ OOV theo token.

Kéo thanh K lên 23 để thấy độ phủ vượt mốc một nửa, rồi kéo tiếp lên 50. Độ phủ leo lên khoảng 71,6%, nhưng OOV theo type vẫn còn hơn một nửa. Cứ kéo thêm nữa, bạn sẽ thấy đường cong độ phủ ngày càng phẳng: mỗi từ mới thêm vào từ vựng chỉ còn mua về đúng một hai lần xuất hiện. Đó là lúc tăng từ vựng không còn đáng tiền.

Biểu đồ bên phải vẽ hạng của từ theo tần suất, cả hai trục đều thang log. Nếu tần suất giảm theo lũy thừa của hạng thì trên trục log-log các điểm phải nằm gần một đường thẳng, và đường đứt nét là mốc lý thuyết tần suất = tần suất cao nhất / hạng. Dữ liệu thật bám đường đó một cách lỏng lẻo, không khít, và kho ở đây quá nhỏ để nói gì mạnh hơn thế. Điều rút ra được là hình dạng: đầu rất cao, đuôi rất dài và rất mỏng.

Vài điểm cần thành thật với nhau về công cụ trên:

  • Kho này chỉ có vài trăm token, còn kho huấn luyện thật thì hàng tỉ. Trên kho thật, độ lệch mạnh hơn nhiều: vài chục nghìn từ đầu bảng thường phủ trên 95% số token. Ở đây bạn thấy đúng chiều của hiện tượng, còn độ mạnh thì bị thu nhỏ lại.
  • Bộ đếm cắt theo khoảng trắng, nên với tiếng Việt mỗi âm tiết thành một token: mô hình được tính là hai chứ không phải một. Muốn đếm theo từ thật thì phải ghép âm tiết trước, và con số sẽ đổi.
  • Đuôi dài không phải là rác. Tên riêng, thuật ngữ, số liệu, những thứ mang nội dung nhất của một văn bản, phần lớn nằm ở đuôi. Cắt đuôi là cắt đúng chỗ mô hình cần phân biệt.

Đây chính là lý do lịch sử khiến mảnh từ thắng: thay vì chọn giữa từ vựng to và tỉ lệ OOV cao, bộ tách mảnh từ giữ một từ vựng cỡ vài chục nghìn mảnh, rồi ghép mảnh lại để biểu diễn cả cái đuôi dài. Đường cong độ phủ trong sim là bài toán mà mảnh từ sinh ra để né. Cách nó dựng từ vựng đó thì bạn đã tự tay bấm ở bài BPE học từ vựng như thế nào: số bước hợp nhất chính là núm chỉnh K của bài này, chỉ khác là đơn vị được giữ lại là mảnh chứ không phải từ nguyên.

Điều rút ra

Độ phủ theo token và độ phủ theo type là hai thước đo khác nhau của cùng một phép cắt từ vựng. Một từ vựng nhỏ trông rất ổn nếu bạn chỉ nhìn token, và trông rất tệ nếu bạn nhìn type. Khi ai đó khoe từ vựng của họ phủ được bao nhiêu phần trăm, câu hỏi đầu tiên phải là phủ theo token hay theo type.

Câu hỏi tự kiểm0/3 đúngchưa trả lời
  1. 1Với kho mặc định và K = 20, OOV theo token là 52,9% còn OOV theo type là 82,5%. Vì sao hai con số này chênh nhau nhiều đến vậy?
  2. 2Kéo K từ 20 lên 40 thì độ phủ token có thể tụt xuống không?
  3. 3Trên biểu đồ Zipf log-log, các điểm nằm gần một đường thẳng dốc xuống có nghĩa gì?