18.7. Hợp lý Cực đại

Một trong những cách tư duy thường thấy nhất trong học máy là quan điểm về hợp lý cực đại. Đây là khái niệm mà khi làm việc với một mô hình xác suất mà các tham số chưa biết, các tham số làm cho các điểm dữ liệu đã quan sát có xác suất xảy ra cao nhất là những tham số hợp lý nhất.

18.7.1. Nguyên lý Hợp lý Cực đại

Nguyên lý này có cách diễn giải theo trường phái Bayes khá hữu ích. Giả sử rằng ta có một mô hình với các tham số \(\boldsymbol{\theta}\) và một tập hợp các mẫu dữ liệu \(X\). Cụ thể hơn, ta có thể tưởng tượng rằng \(\boldsymbol{\theta}\) là một giá trị duy nhất đại diện cho xác suất một đồng xu ngửa khi tung, và \(X\) là một chuỗi các lần tung đồng xu độc lập. Chúng ta sẽ xem xét ví dụ này sâu hơn ở phần sau.

Nếu ta muốn tìm giá trị hợp lý nhất cho các tham số của mô hình, điều đó có nghĩa là ta muốn tìm

(18.7.1)\[\mathop{\mathrm{argmax}} P(\boldsymbol{\theta}\mid X).\]

Theo quy tắc Bayes, điều này giống với

(18.7.2)\[\mathop{\mathrm{argmax}} \frac{P(X \mid \boldsymbol{\theta})P(\boldsymbol{\theta})}{P(X)}.\]

Biểu thức \(P(X)\) là xác suất sinh dữ liệu độc lập tham số, và nó hoàn toàn không phụ thuộc vào tham số \(\boldsymbol{\theta}\), do đó ta có thể bỏ qua nó mà không ảnh hưởng tới việc chọn ra \(\boldsymbol{\theta}\) tốt nhất. Tương tự, bây giờ ta có thể cho rằng chúng ta không có giả định trước về bộ tham số nào là tốt hơn hết thảy, vì vậy ta có thể phát biểu rằng \(P(\boldsymbol{\theta})\) cũng không phụ thuộc vào theta! Điều này hợp lý trong ví dụ tung đồng xu, ở đây xác suất để ra mặt ngửa có thể là bất kỳ giá trị nào trong khoảng \([0,1]\) khi mà ta không có bất kỳ niềm tin nào trước đó rằng đồng xu có cân xứng hay không (thường được gọi là tiên nghiệm không chứa thông tin). Do đó, ta thấy rằng việc áp dụng quy tắc Bayes sẽ chỉ ra lựa chọn tốt nhất cho \(\boldsymbol{\theta}\) là ước lượng hợp lý cực đại cho \(\boldsymbol{\theta}\):

(18.7.3)\[\hat{\boldsymbol{\theta}} = \mathop{\mathrm{argmax}} _ {\boldsymbol{\theta}} P(X \mid \boldsymbol{\theta}).\]

Theo thuật ngữ thông thường, xác suất của dữ liệu với các tham số đã cho (\(P(X \mid \boldsymbol{\theta})\)) được gọi là độ hợp lý.

18.7.1.1. Một ví dụ Cụ thể

Hãy cùng xem phương pháp này hoạt động như thế nào trong một ví dụ cụ thể. Giả sử rằng ta có một tham số duy nhất \(\theta\) biểu diễn cho xác suất tung đồng xu một lần được mặt ngửa. Khi đó, xác suất nhận được mặt sấp là \(1-\theta\), và vì vậy nếu dữ liệu quan sát \(X\) là một chuỗi có \(n_H\) mặt ngửa và \(n_T\) mặt sấp, ta có thể sử dụng tính chất tích các xác suất độc lập với nhau để có được

(18.7.4)\[P(X \mid \theta) = \theta^{n_H}(1-\theta)^{n_T}.\]

Nếu ta tung \(13\) đồng xu và nhận được chuỗi “HHHTHTTHHHHHT”, tức ta có \(n_H = 9\)\(n_T = 4\), thì ta nhận được ở đây là

(18.7.5)\[P(X \mid \theta) = \theta^9(1-\theta)^4.\]

Một điều thú vị ở ví dụ này là ta biết trước câu trả lời. Thật vậy, nếu chúng ta phát biểu bằng lời, “Tôi đã tung 13 đồng xu và 9 đồng xu ra mặt ngửa, dự đoán tốt nhất cho xác suất tung đồng xu được mặt ngửa là bao nhiêu?” mọi người sẽ đều đoán đúng \(9/13\). Điều mà phương pháp khả năng hợp lý cực đại cung cấp cho chúng ta là một cách để thu được con số đó từ các nguyên tắc cơ bản sao cho có thể khái quát được cho các tình huống phức tạp hơn rất nhiều.

Với ví dụ này, đồ thị của \(P(X \mid \theta)\) có dạng như sau:

%matplotlib inline
from d2l import mxnet as d2l
from mxnet import autograd, np, npx
npx.set_np()

theta = np.arange(0, 1, 0.001)
p = theta**9 * (1 - theta)**4.

d2l.plot(theta, p, 'theta', 'likelihood')
../_images/output_maximum-likelihood_vn_ed288b_1_0.svg

Xác suất này có giá trị tối đa ở đâu đó gần \(9/13 \approx 0.7\ldots\) như đã dự đoán. Để kiểm tra xem nó có nằm chính xác ở đó không, chúng ta có thể nhờ đến giải tích. Chú ý rằng ở điểm cực đại, hàm này sẽ phẳng. Do đó, ta có thể tìm ước lượng hợp lý cực đại (18.7.1) bằng cách tìm các giá trị của \(\theta\) để đạo hàm bằng 0, rồi xem giá trị nào trả về xác suất cao nhất. Ta tính toán:

(18.7.6)\[\begin{split}\begin{aligned} 0 & = \frac{d}{d\theta} P(X \mid \theta) \\ & = \frac{d}{d\theta} \theta^9(1-\theta)^4 \\ & = 9\theta^8(1-\theta)^4 - 4\theta^9(1-\theta)^3 \\ & = \theta^8(1-\theta)^3(9-13\theta). \end{aligned}\end{split}\]

Phương trình này có ba nghiệm: \(0\), \(1\)\(9/13\). Hai giá trị đầu tiên rõ ràng là cực tiểu, không phải cực đại vì chúng cho xác suất bằng \(0\) đối với chuỗi kết quả tung đồng xu. Giá trị cuối cùng không cho xác suất bằng 0 với chuỗi đã cho và do đó nó phải là ước lượng hợp lý cực đại \(\hat \theta = 9/13\).

18.7.1.2. Tối ưu hóa Số học và hàm Log hợp lí Âm

Ví dụ trước khá ổn, nhưng điều gì sẽ xảy ra nếu chúng ta có hàng tỷ tham số và mẫu dữ liệu.

Trước tiên, hãy lưu ý rằng, nếu chúng ta giả định rằng tất cả các mẫu dữ liệu là độc lập, thì ta có thể không còn thấy tính khả thi từ độ hợp lý khi chính nó là tích của nhiều xác suất. Thật vậy, mỗi xác suất nằm trong đoạn \([0,1]\), giá trị thường là \(1/2\) và tích của \((1/2)^{1000000000}\) nhỏ hơn nhiều so với độ chính xác của máy. Ta không thể làm việc trực tiếp với biểu thức này.

Tuy nhiên, nhắc lại rằng hàm log chuyển đổi tích thành tổng, trong trường hợp này thì

(18.7.7)\[\log((1/2)^{1000000000}) = 1000000000\cdot\log(1/2) \approx -301029995.6\ldots\]

Con số này hoàn toàn nằm trong khoảng giá trị của một số thực dấu phẩy động \(32\)-bit với độ chính xác đơn. Vì vậy, chúng ta nên xem xét độ hợp lý thang log (log-likelihood), chính là

(18.7.8)\[\log(P(X \mid \boldsymbol{\theta})).\]

Vì hàm \(x \mapsto \log(x)\) đồng biến, việc cực đại hóa độ hợp lý đồng nghĩa với việc cực đại hóa log hợp lý. Thật vậy trong Section 18.9, ta sẽ thấy lập luận này được áp dụng khi làm việc với ví dụ cụ thể cho bộ phân loại Naive Bayes.

Ta thường làm việc với các hàm mất mát, với mong muốn cực tiểu hóa chúng. Ta có thể đổi từ việc tìm hợp lý cực đại thành việc tìm cực tiểu mất mát bằng cách lấy \(-\log(P(X \mid \boldsymbol{\theta}))\), tức hàm đối log hợp lý (negative log-likelihood).

Để minh họa điều này, hãy xem xét bài toán tung đồng xu trước đó và giả sử rằng ta không biết nghiệm dạng đóng. Ta có thể tính ra

(18.7.9)\[-\log(P(X \mid \boldsymbol{\theta})) = -\log(\theta^{n_H}(1-\theta)^{n_T}) = -(n_H\log(\theta) + n_T\log(1-\theta)).\]

Đẳng thức này có thể được lập trình và được tối ưu hóa hoàn toàn ngay cả với hàng tỷ lần tung đồng xu.

# Set up our data
n_H = 8675309
n_T = 25624

# Initialize our paramteres
theta = np.array(0.5)
theta.attach_grad()

# Perform gradient descent
lr = 0.00000000001
for iter in range(10):
    with autograd.record():
        loss = -(n_H * np.log(theta) + n_T * np.log(1 - theta))
    loss.backward()
    theta -= lr * theta.grad

# Check output
theta, n_H / (n_H + n_T)
(array(0.50172704), 0.9970550284664874)

Sự thuận tiện số học chỉ là một trong những lý do khiến mọi người thích dùng hàm đối log hợp lý. Thật ra còn có một vài lý do khác mà nó có thể được lựa chọn.

Lý do thứ hai mà ta xem xét đến hàm log hợp lý là việc áp dụng các quy tắc giải tích trở nên đơn giản hơn. Như đã thảo luận ở trên, do các giả định về tính độc lập, hầu hết các xác suất mà chúng ta gặp phải trong học máy là tích của các xác suất riêng lẻ.

(18.7.10)\[P(X\mid\boldsymbol{\theta}) = p(x_1\mid\boldsymbol{\theta})\cdot p(x_2\mid\boldsymbol{\theta})\cdots p(x_n\mid\boldsymbol{\theta}).\]

Điều này có nghĩa là nếu ta áp dựng trực tiếp quy tắc nhân để tính đạo hàm thì ta sẽ có được

(18.7.11)\[\begin{split}\begin{aligned} \frac{\partial}{\partial \boldsymbol{\theta}} P(X\mid\boldsymbol{\theta}) & = \left(\frac{\partial}{\partial \boldsymbol{\theta}}P(x_1\mid\boldsymbol{\theta})\right)\cdot P(x_2\mid\boldsymbol{\theta})\cdots P(x_n\mid\boldsymbol{\theta}) \\ & \quad + P(x_1\mid\boldsymbol{\theta})\cdot \left(\frac{\partial}{\partial \boldsymbol{\theta}}P(x_2\mid\boldsymbol{\theta})\right)\cdots P(x_n\mid\boldsymbol{\theta}) \\ & \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \vdots \\ & \quad + P(x_1\mid\boldsymbol{\theta})\cdot P(x_2\mid\boldsymbol{\theta}) \cdots \left(\frac{\partial}{\partial \boldsymbol{\theta}}P(x_n\mid\boldsymbol{\theta})\right). \end{aligned}\end{split}\]

Biểu thức này đòi hỏi \(n(n-1)\) phép nhân, cùng với \((n-1)\) phép cộng, vì vậy tổng thời gian chạy tỷ lệ bình phương với số lượng đầu vào! Nếu ta khôn khéo trong việc nhóm các phần tử thì độ phức tạp sẽ giảm xuống tuyến tính, nhưng việc này yêu cầu ta phải suy nghĩ một chút. Đối với hàm đối log hợp lý, chúng ta có

(18.7.12)\[-\log\left(P(X\mid\boldsymbol{\theta})\right) = -\log(P(x_1\mid\boldsymbol{\theta})) - \log(P(x_2\mid\boldsymbol{\theta})) \cdots - \log(P(x_n\mid\boldsymbol{\theta})),\]

điều này đưa đến kết quả là

(18.7.13)\[- \frac{\partial}{\partial \boldsymbol{\theta}} \log\left(P(X\mid\boldsymbol{\theta})\right) = \frac{1}{P(x_1\mid\boldsymbol{\theta})}\left(\frac{\partial}{\partial \boldsymbol{\theta}}P(x_1\mid\boldsymbol{\theta})\right) + \cdots + \frac{1}{P(x_n\mid\boldsymbol{\theta})}\left(\frac{\partial}{\partial \boldsymbol{\theta}}P(x_n\mid\boldsymbol{\theta})\right).\]

Đẳng thức này chỉ yêu cầu \(n\) phép chia và \(n-1\) phép cộng, và do đó thời gian chạy tỷ lệ tuyến tính với số đầu vào.

Lý do thứ ba và cũng là cuối cùng khi xem xét hàm đối log hợp lý đó là sự liên hệ với lý thuyết thông tin, mà chúng ta sẽ thảo luận chi tiết tại phần Section 18.11. Đây là một lý thuyết toán học chặt chẽ đưa ra cách đo lường mức độ thông tin hoặc độ ngẫu nhiên của một biến ngẫu nhiên. Đối tượng nghiên cứu chính trong lĩnh vực đó là entropy

(18.7.14)\[H(p) = -\sum_{i} p_i \log_2(p_i),\]

công thức trên đo lường độ ngẫu nhiên của một nguồn. Hãy để ý rằng đây chỉ là giá trị trung bình của \(-\log\) xác suất, và do đó, nếu ta lấy hàm đối log hợp lý và chia cho số lượng mẫu dữ liệu, ta sẽ nhận được một đại lượng liên quan được gọi là entropy chéo. Chỉ riêng việc diễn giải mang tính lý thuyết này thôi là đủ thuyết phục để ta sử dụng giá trị đối log hợp lý trung bình trên một tập dữ liệu như một cách đo lường chất lượng của mô hình.

18.7.2. Hợp lý Cực đại cho Biến Liên tục

Tất cả những điều chúng ta đã làm ở trước đều giả định rằng ta đang làm việc với biến ngẫu nhiên rời rạc, nhưng nếu chúng ta muốn làm việc với các biến liên tục thì sao?

Nói ngắn gọn thì không có thứ gì thay đổi cả, ngoại trừ việc ta thay thế tất cả giá trị xác suất bằng mật độ xác suất. Nhắc lại rằng chúng ta ký hiệu mật độ bằng chữ thường \(p\), nghĩa là bây giờ ta sẽ có

(18.7.15)\[-\log\left(p(X\mid\boldsymbol{\theta})\right) = -\log(p(x_1\mid\boldsymbol{\theta})) - \log(p(x_2\mid\boldsymbol{\theta})) \cdots - \log(p(x_n\mid\boldsymbol{\theta})) = -\sum_i \log(p(x_i \mid \theta)).\]

Câu hỏi lúc này trở thành, “Tại sao điều này lại ổn?” Rốt cuộc, lý do chúng ta đưa ra khái niệm mật độ là vì xác suất nhận được một kết quả cụ thể bằng không, và do đó chẳng phải xác suất sinh dữ liệu đối với tập hợp tham số bất kỳ sẽ bằng không sao?

Quả thật điều này là đúng, và việc hiểu tại sao chúng ta có thể chuyển sang mật độ là một bài tập trong việc truy ra những gì xảy ra đối với các epsilon.

Đầu tiên hãy xác định lại mục tiêu của chúng ta. Giả sử rằng đối với các biến ngẫu nhiên liên tục, ta không còn muốn tính xác suất tại chính ngay mỗi giá trị, mà thay vào đó là tìm xác suất trong một phạm vi \(\epsilon\) nào đó. Để đơn giản, ta giả định rằng dữ liệu là các mẫu quan sát lặp lại \(x_1, \ldots, x_N\) của các biến ngẫu nhiên được phân phối giống nhau \(X_1, \ldots, X_N\). Như chúng ta đã thấy trước đây, giả định này có thể được biểu diễn như sau

(18.7.16)\[\begin{split}\begin{aligned} &P(X_1 \in [x_1, x_1+\epsilon], X_2 \in [x_2, x_2+\epsilon], \ldots, X_N \in [x_N, x_N+\epsilon]\mid\boldsymbol{\theta}) \\ \approx &\epsilon^Np(x_1\mid\boldsymbol{\theta})\cdot p(x_2\mid\boldsymbol{\theta}) \cdots p(x_n\mid\boldsymbol{\theta}). \end{aligned}\end{split}\]

Do đó, nếu ta lấy đối của logarit cho biểu thức này thì ta sẽ nhận được

(18.7.17)\[\begin{split}\begin{aligned} &-\log(P(X_1 \in [x_1, x_1+\epsilon], X_2 \in [x_2, x_2+\epsilon], \ldots, X_N \in [x_N, x_N+\epsilon]\mid\boldsymbol{\theta})) \\ \approx & -N\log(\epsilon) - \sum_{i} \log(p(x_i\mid\boldsymbol{\theta})). \end{aligned}\end{split}\]

Nếu chúng ta xem xét biểu thức này, vị trí duy nhất mà \(\epsilon\) xuất hiện là trong hằng số cộng \(-N\log(\epsilon)\). Hằng số này hoàn toàn không phụ thuộc vào các tham số \(\boldsymbol{\theta}\), vì vậy lựa chọn tối ưu cho \(\boldsymbol{\theta}\) không phụ thuộc vào việc lựa chọn \(\epsilon\)! Dù ta muốn lấy bốn hoặc bốn trăm chữ số, lựa chọn \(\boldsymbol{\theta}\) tốt nhất sẽ không đổi, do đó ta có thể loại bỏ hẳn epsilon để có được biểu thức mà ta muốn tối ưu là

(18.7.18)\[- \sum_{i} \log(p(x_i\mid\boldsymbol{\theta})).\]

Do đó, chúng ta thấy rằng quan điểm hợp lý cực đại có thể áp dụng được với các biến ngẫu nhiên liên tục dễ dàng như với các biến rời rạc bằng cách thay thế các xác suất bằng mật độ xác suất.

18.7.3. Tóm tắt

  • Nguyên lý hợp lý cực đại cho ta biết rằng mô hình phù hợp nhất cho một tập dữ liệu nhất định là mô hình tạo ra các điểm dữ liệu đó với xác suất cao nhất.
  • Tuy nhiên, thường thì mọi người hay làm việc với hàm đối log hợp lý vì nhiều lý do: tính ổn định số học, khả năng biến đổi tích thành tổng (dẫn tới việc đơn giản hóa các phép tính gradient) và mối liên hệ mật thiết về mặt lý thuyết với lý thuyết thông tin.
  • Trong khi áp dụng phương pháp này là đơn giản nhất trong trường hợp rời rạc, nó cũng có thể hoàn toàn tổng quát hóa cho trường hợp liên tục bằng cách cực đại hóa mật độ xác suất của các điểm dữ liệu.

18.7.4. Bài tập

  1. Giả sử bạn biết rằng một biến ngẫu nhiên có mật độ bằng \(\frac{1}{\alpha}e^{-\alpha x}\) với một giá trị \(\alpha\) nào đó. Bạn nhận được một quan sát duy nhất từ biến ngẫu nhiên này là số \(3\). Giá trị ước lượng hợp lý cực đại cho \(\alpha\) là bao nhiêu?
  2. Giả sử rằng bạn có tập dữ liệu với các mẫu \(\{x_i\}_{i=1}^N\) được lấy từ một phân phối Gauss với giá trị trung bình chưa biết, nhưng phương sai bằng \(1\). Giá trị ước lượng hợp lý cực đại của trung bình là bao nhiêu?

18.7.5. Thảo luận

18.7.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
  • Trần Yến Thy
  • Phạm Minh Đức
  • Phạm Đăng Khoa
  • Phạm Hồng Vinh