14.5. Embedding từ với Vector Toàn cục (GloVe)

Trước tiên, ta sẽ xem lại mô hình skip-gram trong word2vec. Xác suất có điều kiện \(P(w_j\mid w_i)\) được biểu diễn trong mô hình skip-gram bằng hàm kích hoạt softmax sẽ được gọi là \(q_{ij}\) như sau:

(14.5.1)\[q_{ij}=\frac{\exp(\mathbf{u}_j^\top \mathbf{v}_i)}{ \sum_{k \in \mathcal{V}} \text{exp}(\mathbf{u}_k^\top \mathbf{v}_i)},\]

Ở đây \(\mathbf{v}_i\)\(\mathbf{u}_i\) là các biểu diễn vector từ \(w_i\) với chỉ số \(i\), lần lượt khi nó là từ trung tâm và từ ngữ cảnh, và \(\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}\) là tập chứa các chỉ số của bộ từ vựng.

Từ \(w_i\) có thể xuất hiện trong tập dữ liệu nhiều lần. Ta gom tất cả các từ ngữ cảnh mỗi khi \(w_i\) là từ trung tâm và giữ các lần trùng lặp, rồi ký hiệu đó là tập bội \(\mathcal{C}_i\). Số lượng của một phần tử trong tập bội được gọi là bội số của phần tử đó. Chẳng hạn, giả sử rằng từ \(w_i\) xuất hiện hai lần trong tập dữ liệu: khi hai từ \(w_i\) đó là từ trung tâm trong chuỗi văn bản, hai cửa sổ ngữ cảnh tương ứng chứa các chỉ số từ ngữ cảnh \(2, 1, 5, 2\)\(2, 3, 2, 1\). Khi đó, ta sẽ có tập bội \(\mathcal{C}_i = \{1, 1, 2, 2, 2, 2, 3, 5\}\), trong đó bội số của phần tử 1 là 2, bội số của phần tử 2 là 4, và bội số của phần tử 3 và 5 đều là 1. Ta ký hiệu bội số của phần tử \(j\) trong tập bội \(\mathcal{C}_i\)\(x{ij}\): nó là số lần từ \(w_j\) xuất hiện trong cửa sổ ngữ cảnh khi từ trung tâm là \(w_i\) trong toàn bộ tập dữ liệu. Kết quả là hàm mất mát của mô hình skip-gram có thể được biểu diễn theo một cách khác:

(14.5.2)\[-\sum_{i\in\mathcal{V}}\sum_{j\in\mathcal{V}} x_{ij} \log\,q_{ij}.\]

Ta tính tổng số lượng tất cả các từ ngữ cảnh đối với từ trung tâm \(w_i\) để có \(x_i\), rồi thu được xác suất có điều kiện để sinh ra từ ngữ cảnh \(w_j\) dựa trên từ trung tâm \(w_i\)\(p_{ij}\) bằng \(x_{ij}/x_i\). Ta có thể viết lại hàm mất mất của mô hình skip-gram như sau

(14.5.3)\[-\sum_{i\in\mathcal{V}} x_i \sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij}.\]

Trong công thức trên, \(\sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij}\) tính toán phân phối xác suất có điều kiện \(p_{ij}\) của việc sinh từ ngữ cảnh dựa trên từ đích trung tâm \(w_i\) và entropy chéo với phân phối xác suất có điều kiện \(q_{ij}\) được dự đoán bởi mô hình. Hàm mất mát được đánh trọng số bằng cách sử dụng tổng số từ ngữ cảnh cho từ đích trung tâm \(w_i\). Việc cực tiểu hóa hàm mất mát theo công thức trên cho phép phân phối xác suất có điều kiện được dự đoán một cách gần nhất có thể tới phân phối xác suất có điều kiện thật sự.

Tuy nhiên, mặc dù là hàm mất mát phổ biến nhất, đôi khi hàm mất mát entropy chéo lại không phải là một lựa chọn phù hợp. Một mặt, như ta đã đề cập trong Section 14.2, chi phí để mô hình đưa ra dự đoán \(q_{ij}\) trở thành phân phối xác suất hợp lệ gồm phép lấy tổng qua toàn bộ các từ trong từ điển ở mẫu số của nó. Điều này có thể dễ dàng khiến tổng chi phí tính toán trở nên quá lớn. Mặt khác, thường sẽ có rất nhiều từ hiếm gặp trong từ điển, và chúng ít khi xuất hiện trong tập dữ liệu. Trong hàm mất mát entropy chéo, dự đoán cuối cùng cho phân phối xác suất có điều kiện trên một lượng lớn các từ hiếm gặp rất có thể sẽ không được chính xác.

14.5.1. Mô hình GloVe

Để giải quyết vấn đề trên, GloVe [Pennington et al., 2014], một mô hình embedding từ xuất hiện sau word2vec đã áp dụng mất mát bình phương và đề xuất ba thay đổi trong mô hình skip-gram dựa theo mất mát này.

  1. Ở đây, ta sử dụng các biến phân phối phi xác suất \(p'_{ij}=x_{ij}\)\(q'_{ij}=\exp(\mathbf{u}_j^\top \mathbf{v}_i)\) rồi tính log của chúng. Do đó, ta có mất mát bình phương \(\left(\log\,p'_{ij} - \log\,q'_{ij}\right)^2 = \left(\mathbf{u}_j^\top \mathbf{v}_i - \log\,x_{ij}\right)^2\).
  2. Ta thêm hai tham số mô hình cho mỗi từ \(w_i\): hệ số điều chỉnh \(b_i\) (cho các từ trung tâm) và \(c_i\) (cho các từ ngữ cảnh).
  3. Thay thế trọng số của mỗi giá trị mất mát bằng hàm \(h(x_{ij})\). Hàm trọng số \(h(x)\) là hàm đơn điệu tăng trong khoảng \([0, 1]\).

Do đó, mục tiêu của GloVe là cực tiểu hóa hàm mất mát.

(14.5.4)\[\sum_{i\in\mathcal{V}} \sum_{j\in\mathcal{V}} h(x_{ij}) \left(\mathbf{u}_j^\top \mathbf{v}_i + b_i + c_j - \log\,x_{ij}\right)^2.\]

Ở đây, chúng tôi có một đề xuất đối với việc lựa chọn hàm trọng số \(h(x)\): khi \(x < c\) (ví dụ \(c = 100\)) thì \(h(x) = (x/c) ^\alpha\) (ví dụ \(\alpha = 0.75\)), nếu không thì \(h(x) = 1\). Do \(h(0)=0\), ta có thể đơn thuần bỏ qua mất mát bình phương tại \(x_{ij}=0\). Khi sử dụng minibatch SGD trong quá trình huấn luyện, ta tiến hành lấy mẫu ngẫu nhiên để được một minibatch \(x_{ij}\) khác không tại mỗi bước thời gian và tính toán gradient để cập nhật các tham số mô hình. Các giá trị \(x_{ij}\) khác không trên được tính trước trên toàn bộ tập dữ liệu và là thống kê toàn cục của tập dữ liệu. Do đó, tên gọi GloVe được lấy từ “Global Vectors (Vector Toàn cục)”.

Chú ý rằng nếu từ \(w_i\) xuất hiện trong cửa sổ ngữ cảnh của từ \(w_j\) thì từ \(w_j\) cũng sẽ xuất hiện trong cửa sổ ngữ cảnh của từ \(w_i\). Do đó, \(x_{ij}=x_{ji}\). Không như word2vec, GloVe khớp \(\log\, x_{ij}\) đối xứng thay vì xác suất có điều kiện \(p_{ij}\) bất đối xứng. Do đó, vector từ đích trung tâm và vector từ ngữ cảnh của bất kì từ nào đều tương đương nhau trong GloVe. Tuy vậy, hai tập vector từ được học bởi cùng một mô hình về cuối có thể sẽ khác nhau do giá trị khởi tạo khác nhau. Sau khi học tất cả các vector từ, GloVe sẽ sử dụng tổng của vector từ đích trung tâm và vector từ ngữ cảnh để làm vector từ cuối cùng cho từ đó.

14.5.2. Lý giải GloVe bằng Tỷ số Xác suất Có điều kiện

Ta cũng có thể cố gắng lý giải embedding từ GloVe theo một cách nhìn khác. Ta sẽ tiếp tục sử dụng các ký hiệu như ở trên, \(P(w_j \mid w_i)\) biểu diễn xác suất có điều kiện sinh từ ngữ cảnh \(w_j\) với từ tâm đích \(w_i\) trong tập dữ liệu, và xác suất này được ghi lại bằng \(p_{ij}\). Xét ví dụ thực tế từ một kho ngữ liệu lớn, ở đây ta có hai tập các xác suất có điều kiện với “ice” và “steam” là các từ tâm đích và tỷ số giữa chúng:

\(w_k\)= solid gas water fashion
\(p_1=P(w_k\mid \text{ice})\) 0.00019 0.000066 0.003 0.000017
\(p_2=P(w_k\mid\text{steam})\) 0.000022 0.00078 0.0022 0.000018
\(p_1/p_2\) 8.9 0.085 1.36 0.96

Ta có thể quan sát thấy các hiện tượng như sau:

Với từ \(w_k\) liên quan tới từ “ice (đá)” nhưng không liên quan đến từ “steam (hơi nước)”, như là \(w_k=\text{solid (rắn)}\), ta kỳ vọng là tỷ số xác suất có điều kiện sẽ lớn hơn, như trường hợp này là 8.9 ở hàng cuối cùng của bảng trên. Với từ \(w_k\) liên quan tới từ “steam (hơi nước)” mà không có liên quan nào với từ “ice (đá)”, như là \(w_k=\text{gas (khí)}\), ta kỳ vọng là tỷ số xác suất có điều kiện sẽ nhỏ hơn, như trường hợp này là 0.085 ở hàng cuối cùng của bảng trên. Với từ \(w_k\) liên quan tới cả hai từ “steam (hơi nước)” và từ “ice (đá)”, như là \(w_k=\text{water (nước)}\), ta kỳ vọng là tỷ số xác suất có điều kiện sẽ gần với 1, như trường hợp này là 1.36 ở hàng cuối cùng của bảng trên. Với từ \(w_k\) không liên quan tới cả hai từ “steam (hơi)” và từ “ice (đá)”, như là \(w_k=\text{fashion (thời trang)}\), ta kỳ vọng là tỷ số xác suất có điều kiện sẽ gần với 1, như trường hợp này là 0.96 ở hàng cuối cùng của bảng trên.

Có thể thấy rằng tỷ số xác suất có điều kiện thể hiện mối quan hệ giữa các từ khác nhau trực quan hơn. Ta có thể tạo một hàm vector của từ để khớp tỷ số xác suất có điều kiện một cách hiệu quả hơn. Như đã biết, để thu được bất cứ tỷ số nào loại này đòi hỏi phải có ba từ \(w_i\), \(w_j\), và \(w_k\). tỷ số xác suất có điều kiện với \(w_i\) làm từ trung tâm là \({p_{ij}}/{p_{ik}}\). Ta có thể tìm một hàm dùng các vector từ để khớp với tỷ số xác suất có điều kiện này.

(14.5.5)\[f(\mathbf{u}_j, \mathbf{u}_k, {\mathbf{v}}_i) \approx \frac{p_{ij}}{p_{ik}}.\]

Thiết kế khả dĩ của hàm \(f\) ở đây không phải duy nhất. Ta chỉ cần quan tâm một lựa chọn hợp lý hơn. Do tỷ số xác suất có điều kiện là một số vô hướng, ta có thể giới hạn \(f\) vào một hàm vô hướng: \(f(\mathbf{u}_j, \mathbf{u}_k, {\mathbf{v}}_i) = f\left((\mathbf{u}_j - \mathbf{u}_k)^\top {\mathbf{v}}_i\right)\). Sau khi hóan đổi chỉ số \(j\)\(k\), ta có thể thấy rằng hàm \(f\) thỏa mãn điều kiện \(f(x)f(-x)=1\), do đó một lựa chọn có thể là \(f(x)=\exp(x)\). Ta có:

(14.5.6)\[f(\mathbf{u}_j, \mathbf{u}_k, {\mathbf{v}}_i) = \frac{\exp\left(\mathbf{u}_j^\top {\mathbf{v}}_i\right)}{\exp\left(\mathbf{u}_k^\top {\mathbf{v}}_i\right)} \approx \frac{p_{ij}}{p_{ik}}.\]

Một xác suất thỏa mãn vế phải biểu thức xấp xỉ là \(\exp\left(\mathbf{u}_j^\top {\mathbf{v}}_i\right) \approx \alpha p_{ij}\), ở đây \(\alpha\) là một hằng số. Xét \(p_{ij}=x_{ij}/x_i\), sau khi lấy logarit ta được \(\mathbf{u}_j^\top {\mathbf{v}}_i \approx \log\,\alpha + \log\,x_{ij} - \log\,x_i\). Ta sử dụng thêm hệ số điều chỉnh để khớp \(- \log\, \alpha + \log\, x_i\), cụ thể là hệ số điều chỉnh từ trung tâm \(b_i\) và hệ số điều chỉnh từ ngữ cảnh \(c_j\):

(14.5.7)\[\mathbf{u}_j^\top \mathbf{v}_i + b_i + c_j \approx \log(x_{ij}).\]

Bằng cách lấy sai số bình phương và đặt trọng số vào vế trái và vế phải của biểu thức trên, ta tính được hàm mất mát của GloVe.

14.5.3. Tóm tắt

  • Trong một số trường hợp, hàm mất mát entropy chéo có sự hạn chế. GloVe sử dụng mất mát bình phương và vector từ để khớp các thống kê toàn cục được tính trước dựa trên toàn bộ dữ liệu.
  • Vector từ đích trung tâm và vector từ ngữ cảnh của bất kì từ nào là như nhau trong GloVe.

14.5.4. Bài tập

  1. Nếu một từ xuất hiện trong cửa sổ ngữ cảnh của từ khác, làm thế nào để sử dụng khoảng cách giữa hai từ này trong chuỗi văn bản để thiết kế lại phương pháp tính toán xác suất có điều kiện \(p_{ij}\)? Gợi ý: Tham khảo phần 4.2 trong bài báo GloVe [Pennington et al., 2014].
  2. Với một từ bất kỳ, liệu hệ số điều chỉnh của từ đích trung tâm và từ ngữ cảnh là như nhau trong GloVe không? Tại sao?

14.5.5. Thảo luận

14.5.6. Những người thực hiện

Bản dịch trong trang này được thực hiện bởi:

  • Đoàn Võ Duy Thanh
  • Lê Khắc Hồng Phúc
  • Đỗ Trường Giang
  • Nguyễn Văn Cường
  • Nguyễn Mai Hoàng Long
  • Nguyễn Văn Quang
  • Phạm Minh Đức
  • Nguyễn Lê Quang Nhật
  • Phạm Hồng Vinh

Lần cập nhật gần nhất: 12/09/2020. (Cập nhật lần cuối từ nội dung gốc: 29/08/2020)