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

Tham lam và chùm tia

Sửa được bảng xác suấtB từ 1 tới 5So với vét cạn

Tham lam và chùm tia

Mô hình ngôn ngữ chỉ cho bạn xác suất của từ tiếp theo. Biến chuỗi xác suất đó thành một câu là việc của thuật toán giải mã, và cách chọn rẻ nhất cũng là cách hay sai nhất.

Một mô hình ngôn ngữ không sinh ra câu. Nó chỉ trả lời một câu hỏi rất hẹp: cho phần đã viết, từ tiếp theo có khả năng là gì và với xác suất bao nhiêu. Muốn có cả câu, ta phải tự đi trên cây các khả năng đó. Cách rẻ nhất là giải mã tham lam: mỗi bước lấy từ có xác suất cao nhất, gắn vào, rồi đi tiếp và không bao giờ nhìn lại.

Vấn đề là một từ rẻ ở bước này có thể mở ra cả một vùng câu tốt ở bước sau, còn một từ đắt lại dẫn thẳng vào ngõ cụt. Giải mã chùm tia (beam search) giữ lại B giả thuyết tốt nhất ở mỗi bước thay vì đúng một, nên cửa sổ tìm kiếm rộng hơn. Sim dưới đây cho bạn kéo B và tự sửa từng con số log xác suất, kể cả sửa cho tới lúc bẫy biến mất.

Sim này chạy trên số viết tay

Bảng log xác suất bên dưới do người soạn bài đặt ra để lộ đúng vài hiện tượng, nó không phải đầu ra của một mô hình ngôn ngữ nào. Vì vậy mọi con số trong bài chỉ nói lên cơ chế, không nói lên tỉ lệ: đừng suy từ đây ra rằng tham lam thua chùm tia bao nhiêu phần trăm trong một hệ dịch máy thật. Phạt độ dài dùng ở đây cũng chỉ là một biến thể trong nhiều biến thể đang được dùng.

Tham lam so với chùm tia · kéo B từ 1 lên 5
Chuỗi thắng mèo ngủđiểm -1.700
Từ đầu điểm cao nhất là mèo, nhưng nó chỉ dẫn tới ngõ cụt. Kéo B từ 1 lên 2 để thấy đáp án đổi, rồi kéo alpha lên quá 0.79 để thấy chuỗi sáu từ vượt lên.
B = 1 chính là giải mã tham lam. Chỉ một giả thuyết sống sót mỗi bước, nên máy luôn lấy từ có log xác suất cao nhất ngay lúc đó rồi không bao giờ quay lại.
gốcbước 1bước 2bước 3bước 4bước 5bước 6bắt đầu0.00mèo-0.10ngủ-1.70kêu-2.30con-0.30mèo-0.50nằm-1.20trên-1.40tấm-1.70thảm-1.80chiếu-3.20ngủ-1.40chó-2.20sủa-2.50chú-2.60mèo-2.65ngủ-2.75
bị cắt · 3chưa nhìn tới · 11chuỗi thắng · 3số trong nút là log xác suất tích luỹ từ gốc; ở bề rộng này mọi nút được giữ đều nằm trên chuỗi thắng nên không còn ô nào mang màu giữ lại
Các chuỗi hoàn chỉnh chùm tìm được
HạngChuỗiĐộ dàilog P tổngMẫu số lpĐiểm sau chia
1mèo ngủ2-1.701.000-1.700
Mẫu số là lp = (5 + len)^alpha / 6^alpha. Ở alpha = 0 nó bằng đúng 1 nên cột điểm trùng cột log P tổng. Đây là biến thể của Wu và cộng sự năm 2016, không phải công thức duy nhất: chia cho đúng độ dài, hoặc cộng một phần thưởng cố định mỗi từ, đều là những biến thể được dùng và chúng cho thứ hạng khác nhau.
Chùm so với vét cạn
Chùm B = 1
mèo ngủ
-1.700
Vét cạn, tức chùm không giới hạn
con mèo ngủ
-1.400
Chùm bỏ lỡ chuỗi tốt nhất, thua 0.300 điểm. Nới B ra rồi thử lại.
Chi phí tìm kiếm
Ứng viên chùm đã sinh5
Ứng viên vét cạn phải sinh16
Chuỗi hoàn chỉnh chùm giữ được1 trên 7
Nhật ký từng bước
BướcỨng viênGiữCắt
1312
2211
Bảng log xác suất 16 ô sửa được
Trạng thái hiện tạiTừ tiếp theolog P của từCộng dồn tới đó
gốcmèo-0.10
con-0.30
chú-2.60
mèongủ-1.70
kêu-2.30
conmèo-0.50
chó-2.20
chúmèo-2.65
con mèonằm-1.20
ngủ-1.40
con chósủa-2.50
chú mèongủ-2.75
con mèo nằmtrên-1.40
con mèo nằm trêntấm-1.70
chiếu-3.20
con mèo nằm trên tấmthảm-1.80
Giá trị bị kẹp trong khoảng -9 tới 0, vì log xác suất không thể dương, và khi kẹp thật sự xảy ra thì có một dòng báo ngay phía trên bảng. Ở alpha = 1 mẫu số của chuỗi ba từ là 8/6 = 1.333, của chuỗi sáu từ là 11/6 = 1.833.

Đọc cái vừa xảy ra

B = 1 chính là tham lam. Khi chùm chỉ giữ một giả thuyết, việc xếp hạng ứng viên rút gọn thành so sánh log xác suất của riêng từ vừa thêm, vì phần cộng dồn phía trước giống nhau ở mọi ứng viên. Trên cây mặc định, mèo là từ đầu mạnh nhất với -0.10, nhưng cả hai lối ra của nó đều cụt, nên tham lam dừng ở mèo ngủ với tổng -1.70. Nó chỉ sinh 5 ứng viên và nhìn thấy đúng 1 trong 7 chuỗi hoàn chỉnh.

Kéo B lên 2 là đáp án đổi. Chùm giữ thêm con với -0.30. Ở bước 2, ứng viên con mèo cộng dồn -0.50 đứng trên mèo ngủ với -1.70, nên nhánh vừa nãy bị bỏ qua nay sống tiếp và cho con mèo ngủ với tổng -1.40. Trên cây này B = 2 đã chạm đúng kết quả của vét cạn, đổi lại 13 ứng viên thay vì 16.

Ứng viên cạnh tranh bằng tổng cộng dồn, không bằng từ vừa thêm. Đây là chỗ hay nhầm nhất. Chùm không so -0.90 với -0.70, nó so -1.40 với -1.20. Vì mỗi log xác suất đều âm, chuỗi càng dài tổng càng thấp, và một chuỗi dài hay sẽ luôn thua một chuỗi ngắn tầm thường nếu ta chấm bằng tổng thô.

Phạt độ dài là cách vá chuyện đó. Núm alpha dùng công thức của Wu và cộng sự năm 2016:

score = logP / lp với lp = (5 + len)^alpha / 6^alpha

alpha = 0 cả hai luỹ thừa bằng 1 nên lp bằng đúng 1, tức không phạt gì, và cột điểm trùng khít cột log xác suất tổng. Ở alpha = 1 mẫu số của chuỗi ba từ là 8/6 = 1.333, của chuỗi sáu từ là 11/6 = 1.833, nên chuỗi dài được chia cho một số lớn hơn và bớt thiệt. Đặt B = 2 rồi kéo alpha: tới 0.80 thì con mèo nằm trên tấm thảm với tổng -1.80 vượt lên trên con mèo ngủ với tổng -1.40. Mốc đảo hạng tính được là khoảng 0.789, nghiệm của 1.80 / 1.40 = (11/8)^alpha.

Ba điều đừng tin quá

  • Chùm tia không bảo đảm tìm ra chuỗi tốt nhất. Nó chỉ mở cửa sổ tìm kiếm rộng ra. Thẻ so sánh trong sim luôn đặt kết quả của chùm cạnh kết quả vét cạn để bạn thấy khoảng cách, và ở B = 1 khoảng cách đó là 0.300 điểm.
  • Rộng hơn không phải lúc nào cũng tốt hơn. Bấm Chùm rộng hoá dở: B = 1 cho sáng mưa to với -3.15, còn B = 2 tụt xuống chiều nắng gắt với -5.50, vì ở bước 2 hai nhánh của chiều cộng dồn tốt hơn nên chiếm hết chỗ và hất sáng mưa ra khỏi chùm. Tới B = 3 mới quay lại -3.15. Không có định lý nào nói điểm phải tăng theo B.
  • Phạt độ dài là quy ước, không phải định lý. Con số 5 và 6 trong công thức là hằng số người ta chọn cho hệ dịch máy của Google năm 2016. Có nhiều biến thể khác, chia cho đúng độ dài là một, cộng thêm phần thưởng cố định mỗi từ là hai. Đổi biến thể là đổi thứ hạng, và không bản nào đúng hơn bản nào một cách phổ quát.

Những gì sim này chọn thay bạn

Ba lựa chọn cài đặt dưới đây đều là quy ước, người khác cài khác đi vẫn hợp lệ. Riêng cái đầu tiên hoá ra còn không phải một lựa chọn thật, và đó mới là chỗ đáng đọc kỹ.

  • Cắt tỉa dựa trên log xác suất thô, phạt độ dài chỉ dùng khi xếp hạng các chuỗi đã hoàn chỉnh. Cần nói rõ điều này mua được ít hơn vẻ ngoài của nó: vì sim bước đồng bộ, mọi ứng viên trong cùng một bước đều dài bằng nhau, nên lp là một hằng số dương chung cho cả bước và chia tất cả cho nó không đổi được thứ tự nào. Xếp hạng ứng viên bằng điểm đã phạt sẽ cho đúng cùng một chùm. Chỗ bản GNMT gốc thật sự khác là nó cho chuỗi đã hoàn chỉnh ở lại tranh chỗ trong chùm với chuỗi chưa xong, và lúc đó độ dài mới khác nhau nên phạt độ dài mới đổi được cái gì bị cắt.
  • Chuỗi hoàn chỉnh không chiếm chỗ trong chùm. Khi một giả thuyết chạm trạng thái không còn từ nào nối tiếp, nó được cất sang bảng kết quả và các bước sau vẫn còn đủ B chỗ cho phần chưa xong.
  • Hoà điểm thì ứng viên sinh ra trước thắng. Thứ tự sinh là thứ tự cha trong chùm rồi tới thứ tự dòng trong bảng xác suất. Bấm Hoà điểm để thấy: xanhđỏ cùng -0.70, hai chuỗi cùng -1.00, và xanh lá luôn đứng trên.

Còn một giới hạn nữa của chính sim: cây chỉ sâu tối đa 12 bước, và nếu bạn dựng được một cây chạm trần đó thì sim báo thẳng bằng một dòng chữ đỏ chứ không lặng lẽ cắt. Gõ một log xác suất ngoài khoảng -9 tới 0 cũng vậy, giá trị bị kẹp và sim nói ra lúc kẹp.

Điều rút ra

B = 1 là tham lam, và tham lam sai vì nó quyết định vĩnh viễn ở bước đầu bằng thông tin của riêng bước đầu. Chùm tia mua thêm cơ hội sửa sai bằng cách trả thêm tính toán, nhưng nó vẫn là tìm kiếm gần đúng: nó có thể bỏ lỡ chuỗi tốt nhất, và rộng hơn đôi khi lại tệ hơn. Phạt độ dài không sửa được thuật toán, nó chỉ đổi thước đo dùng để xếp hạng những gì thuật toán tìm được.

Câu hỏi tự kiểm0/3 đúngchưa trả lời
  1. 1Trên cây mặc định, vì sao tham lam dừng ở mèo ngủ với -1.70 trong khi tồn tại chuỗi -1.40?
  2. 2Đặt alpha = 0 thì mẫu số lp bằng bao nhiêu, và hệ quả là gì?
  3. 3Tăng B từ 1 lên 2 có bảo đảm chuỗi thắng tốt hơn hoặc bằng không?