Hãy tưởng tượng bạn đang đứng trước một hàng gồm máy đánh bạc. Mỗi máy có một cơ chế trả thưởng riêng biệt mà bạn không hề biết trước. Đây là điểm khác biệt với bài toán học có giám sát (supervised learning - dữ liệu được đánh nhãn trước) vì dữ liệu chỉ được sinh ra sau khi thực hiện hành động.
Bài toán này còn gọi là Bài toán Multi-Armed Bandit (MAB) mô phỏng tình huống một thực thể (agent) đứng trước lựa chọn khác nhau (thường gọi là các "cánh tay" - arms).
Tại mỗi thời điểm :
Hành động: Agent chọn một cánh tay .
Phần thưởng: Agent nhận được một giá trị thưởng . Phần thưởng này là một biến ngẫu nhiên hoặc một giá trị cố định nhưng chưa biết trước.
Thông tin: Agent chỉ quan sát được phần thưởng của cánh tay mình đã chọn. Thông tin về các cánh tay còn lại hoàn toàn bị che khuất (đây được gọi là bandit feedback).
Mục tiêu: Tìm ra một chiến lược chọn cánh tay qua từng bước sao cho tổng phần thưởng tích lũy là lớn nhất.
Trong tối ưu hóa truyền thống (như Gradient Descent), ta thường có quyền truy cập vào hàm mục tiêu hoặc ít nhất là đạo hàm của nó trên toàn bộ không gian tham số. Tuy nhiên, MAB đối mặt với hai rào cản khiến các phương pháp này không thể áp dụng trực tiếp:
Dữ liệu khuyết thiếu (Partial Observability): Bạn không biết "chuyện gì sẽ xảy ra nếu mình chọn khác đi". Nếu bạn chọn phương án A và nhận kết quả tốt, bạn không thể biết liệu phương án B có mang lại kết quả tốt hơn hay không.
Bản chất động (Non-stationarity): Trong các kịch bản thực tế (như đấu giá quảng cáo), phân phối phần thưởng của các cánh tay có thể thay đổi theo thời gian hoặc bị thao túng bởi các tác nhân bên ngoài. Các thuật toán tối ưu tĩnh sẽ nhanh chóng bị lỗi thời.
Mọi chiến lược giải quyết MAB đều phải xử lý sự đánh đổi (trade-off) giữa hai trạng thái:
Khai thác (Exploitation): Chọn cánh tay đang có hiệu suất cao nhất dựa trên dữ liệu quá khứ. Mục đích là tận dụng tối đa những gì đã biết để thu lợi nhuận ngay lập tức.
Khám phá (Exploration): Chọn những cánh tay mà ta chưa có nhiều thông tin hoặc đang có hiệu suất thấp hơn. Mục đích là thu thập dữ liệu để cải thiện độ chính xác của các ước lượng trong tương lai, tránh việc bỏ sót "máy tốt nhất" thật sự.
Nếu chỉ Khai thác, ta dễ rơi vào tối ưu cục bộ. Nếu chỉ Khám phá, ta lãng phí quá nhiều chi phí cho các lựa chọn tồi.
Đối với bài toán Bandit, chúng ta không đánh giá thuật toán dựa trên tổng thưởng một cách đơn thuần, mà dựa trên khái niệm Regret (Sự hối tiếc).
Giả sử có một chiến lược tối ưu gọi là Oracle – thực thể biết trước mọi thông tin và luôn chọn cánh tay tốt nhất tại mọi thời điểm. Regret tại thời điểm được định nghĩa là chênh lệch giữa tổng thưởng của Oracle và tổng thưởng thực tế mà thuật toán của ta thu được:
Trong đó:
là giá trị phần thưởng tại thời điểm khi chọn cánh tay
: Đây là tổng phần thưởng nếu bạn chỉ chọn duy nhất cánh tay từ đầu đến cuối (từ đến ).
: Giả sử có một "vị thần" biết trước mọi phân phối phần thưởng. Vị thần này sẽ chọn ra cánh tay tốt nhất ngay từ lượt đầu tiên và giữ nó mãi mãi.
là cánh tay mà thuật toán chọn tại thời điểm . Lưu ý rằng thay đổi theo thời gian dựa trên những gì thuật toán đã học được.
: Phần thưởng thực tế bạn nhận được tại bước từ cánh tay đã chọn.
Mục tiêu của một thuật toán tốt là làm cho tốc độ tăng trưởng của chậm hơn so với thời gian (sublinear regret, ví dụ hoặc ). Điều này đồng nghĩa với việc theo thời gian, thuật toán sẽ học được cách hành xử tiệm cận với Oracle.
Trước khi đến với các thuật toán phức tạp, hãy bắt đầu với chiến thuật rất tự nhiên và đơn giản.
Chiến thuật này chia việc ra quyết định thành hai chế độ rạch ròi dựa trên một tham số (thường chọn rất nhỏ, ví dụ ):
Khai thác (Exploitation) với xác suất : Bạn chọn cánh tay đang có phần thưởng trung bình cao nhất tính đến thời điểm hiện tại. Đây là lựa chọn "an toàn" dựa trên kinh nghiệm.
Khám phá (Exploration) với xác suất : Bạn tung một đồng xu ảo. Nếu vào mặt "khám phá", bạn bỏ qua mọi kinh nghiệm và chọn ngẫu nhiên một trong số cánh tay.
Tại mỗi bước :
Phát sinh một số ngẫu nhiên .
Nếu :
(Chọn máy tốt nhất đã biết).
Nếu :
(Thử đại một máy bất kỳ).
Dễ cài đặt: Chỉ cần vài dòng code và một biến lưu trữ giá trị trung bình mẫu.
Đảm bảo tính hội tụ: Vì luôn dành ra một tỉ lệ để thử nghiệm, về mặt lý thuyết, khi , agent sẽ thử mọi cánh tay vô số lần và cuối cùng sẽ tìm ra cánh tay tốt nhất.
Dù hiệu quả, -Greedy bộc lộ hai vấn đề lớn khiến nó không tối ưu:
Khám phá mù quáng: Khi ở chế độ khám phá, nó chọn ngẫu nhiên hoàn toàn. Nó có thể chọn một cánh tay mà dữ liệu đã chứng minh là "rất tệ" với xác suất ngang bằng với một cánh tay "đầy triển vọng". Nó không biết tận dụng thông tin về độ bất định.
Sự hối tiếc (Regret) tuyến tính: Vì thường là hằng số, ngay cả khi bạn đã chơi 1 tỷ lần và biết chắc chắn máy nào là tốt nhất, bạn vẫn lãng phí thời gian để đi thử những máy tồi. Điều này khiến tổng hối tiếc tăng trưởng theo hàm tuyến tính , thay vì các hàm thấp hơn như .
Nếu các phương pháp như Greedy hay -Greedy chỉ dựa vào giá trị trung bình đơn thuần, thì UCB tiến thêm một bước bằng cách tích hợp độ tin cậy của dữ liệu vào quá trình ra quyết định.
Mục tiêu của UCB là giải quyết bài toán Exploration-Exploitation bằng triết lý: "Optimism in the Face of Uncertainty" (Lạc quan trước sự bất định).
Ý tưởng: Thay vì chỉ đánh giá một cánh tay qua những gì nó "đã thể hiện" (trung bình mẫu), chúng ta hãy đánh giá nó qua những gì nó "có khả năng đạt được" (tiềm năng tối đa).
Chiến lược: Nếu một cánh tay chưa được chơi nhiều, chúng ta có ít thông tin về nó, dẫn đến sự bất định cao. UCB sẽ "ưu tiên" sự bất định này, giả định rằng trong kịch bản tốt nhất, cánh tay đó có thể mang lại phần thưởng lớn.
Khi ta thử một cánh tay được lần và thu được giá trị trung bình là , giá trị này thực chất chỉ là một ước lượng. Giá trị kỳ vọng thực sự (thứ mà ta tìm kiếm) nằm đâu đó xung quanh .
Khoảng tin cậy là một khoảng mà ta tin rằng sẽ nằm trong đó với một xác suất rất cao.
: Giới hạn dưới (Lower Bound).
: Giới hạn trên (Upper Bound).
Để định lượng "độ rộng" của khoảng tin cậy, UCB sử dụng Bất đẳng thức Hoeffding. Bất đẳng thức này phát biểu rằng với các biến ngẫu nhiên độc lập trong khoảng , sai lệch giữa trung bình mẫu và kỳ vọng thực được giới hạn bởi:
Trong bài toán Bandit, chúng ta chỉ quan tâm đến việc giá trị thực không vượt quá giá trị ước lượng cộng thêm một khoảng sai số. Đặt xác suất sai lầm là , giải phương trình theo , ta tìm được biên độ sai số:
Để thuật toán tự động giảm xác suất sai lầm khi thời gian tăng lên, người ta thường chọn (hoặc một hàm giảm theo ). Từ đó, ta có giới hạn trên của khoảng tin cậy (Upper Confidence Bound).
Thuật toán UCB hoạt động dựa trên nguyên lý "Lạc quan khi đối mặt với sự bất định". Thay vì chỉ nhìn vào tỉ lệ thưởng trung bình, UCB tính toán một "giá trị tiềm năng" cho mỗi cánh tay và luôn chọn cánh tay có tiềm năng cao nhất.
Tại mỗi bước , đối với mỗi cánh tay , chúng ta tính toán một giá trị gọi là :
Sau đó, thuật toán sẽ thực hiện hành động bằng cách chọn cánh tay có giá trị lớn nhất:
Trong đó:
: Là giá trị đại diện cho "mức trần" kỳ vọng của cánh tay .
: Là chỉ số (index) của cánh tay được Agent chọn để kéo ở vòng .
: Tỉ lệ thưởng trung bình hiện tại của máy .
: Số lần máy đã được chọn tính đến thời điểm .
: Hệ số điều chỉnh độ lạc quan (Exploration Parameter).
Khi nhỏ ( ): Thuật toán trở nên "thực dụng". Nó tin vào lịch sử hơn và ít tò mò hơn. Trong môi trường biến động (Adversarial), nhỏ khiến UCB dễ bị "ngoan cố", bám lấy một máy đã từng tốt nhưng nay đã bị đổi thưởng.
Khi lớn ( ): Thuật toán trở nên "phiêu lưu". Nó sẵn sàng bỏ qua máy đang tốt để đi kiểm tra lại các máy khác, giúp giảm rủi ro bị môi trường đánh lừa nhưng lại tốn nhiều "học phí" hơn để khám phá.
Trong các bài báo khoa học về UCB1 - thuật toán cụ thể và nổi tiếng nhất trong họ UCB - ta thường thấy công thức gộp gọn lại thành:
Thực tế, đây chính là trường hợp cụ thể khi ta đặt . Con số nằm trong căn chính là kết quả của việc gán .
Thuật toán UCB tạo ra một cơ chế tự điều chỉnh:
Ban đầu, nó sẽ thử tất cả các cánh tay một lần để có dữ liệu khởi đầu ().
Sau đó, nó ưu tiên những máy đang thắng ( lớn).
Tuy nhiên, nếu một máy cứ thua mãi hoặc không được chọn, cái "căn thức" (Exploration Bonus) của nó sẽ to dần lên theo .
Đến một ngưỡng nhất định, giá trị UCB của máy "kém" đó sẽ vượt qua máy đang thắng, buộc Agent phải quay lại kiểm tra máy đó.
Ưu điểm lớn nhất của UCB là nó có Regret Bound ở mức , nghĩa là sự hối tiếc tăng trưởng rất chậm. Tuy nhiên, toàn bộ logic này dựa trên giả định rằng các phần thưởng là độc lập và cùng phân phối (i.i.d). Nếu môi trường là đối kháng (Adversarial), nơi phần thưởng bị thay đổi một cách có mục đích để "lừa" khoảng tin cậy, UCB sẽ hoàn toàn mất phương hướng.
Exp3 được thiết kế cho kịch bản Adversarial – nơi phần thưởng của các cánh tay có thể biến động bất kỳ hoặc bị điều chỉnh bởi một tác nhân đối kháng nhằm "đánh lừa" các ước lượng thống kê. Thay vì dựa vào khoảng tin cậy như UCB, Exp3 sử dụng phương pháp cập nhật trọng số nhân (Multiplicative Weights Update).
Để bắt đầu, chúng ta cần định nghĩa các thành phần cốt lõi:
: Số lượng cánh tay (lựa chọn).
: vector trọng số để lưu trữ tín hiệu tích lũy của từng cánh tay
: Trọng số của cánh tay tại thời điểm . Đây là giá trị lưu trữ tích lũy.
(Learning Rate): Tốc độ học. Tham số này cực kỳ quan trọng; nếu quá lớn, thuật toán bị nhiễu; nếu quá nhỏ, thuật toán học rất chậm.
(Exploration factor): Mức độ khám phá.
Thuật toán vận hành theo một vòng lặp kín qua từng bước :
Bước 1: Tính xác suất chọn ()
Từ vector trọng số , ta tính xác suất để chọn mỗi cánh tay. Công thức này kết hợp giữa việc khai thác trọng số đã có và một lượng nhỏ khám phá đồng đều:
Bước 2: Chọn hành động và quan sát
Agent chọn một cánh tay dựa trên phân phối và nhận về phần thưởng .
Bước 3: Ước lượng phần thưởng không chệch ()
Thách thức lớn nhất trong Bandit là chúng ta không quan sát được phần thưởng của các cánh tay không được chọn. Để giải quyết vấn đề này mà vẫn đảm bảo tính chính xác cho tổng điểm tích lũy , Exp3 sử dụng kỹ thuật Importance Sampling.
Sau khi chọn cánh tay và nhận phần thưởng , giá trị ước lượng cho mọi cánh tay được tính như sau:
Cơ chế vận hành của công thức:
Với các cánh tay không được chọn (): .
Với cánh tay được chọn (): Phần thưởng thực tế được chia cho xác suất chọn nó .
Phép chia cho đảm bảo là một ước lượng không chệch (unbiased estimator) của phần thưởng thực tế . Cụ thể:
Điều này cho phép thuật toán cập nhật trọng số cho các cánh tay một cách công bằng, ngay cả khi dữ liệu quan sát được là không đầy đủ.
Bước 4: Cập nhật trọng số cho bước kế tiếp
Đây là bước mấu chốt của thuật toán. Trọng số được cập nhật theo hàm mũ dựa trên giá trị ước lượng vừa tính:
Nếu không được chọn: (Trọng số giữ nguyên).
Nếu được chọn: Trọng số sẽ tăng trưởng theo hàm mũ dựa trên phần thưởng đã được hiệu chỉnh.
Vai trò của Learning Rate (): đóng vai trò điều phối sự nhạy cảm của thuật toán. Trong các chứng minh về Regret Bound, giá trị tối ưu của thường được đặt là . Nếu biết trước tổng số lượt chơi , ta có thể thiết lập để đạt được mức hối tiếc tối ưu .
Cơ chế hàm mũ (Multiplicative Weights): Việc dùng tương đương với việc cộng dồn các phần thưởng ước lượng ở số mũ:
Điều này giúp biến tổng phần thưởng (thứ có thể rất lớn) thành một phân phối xác suất nằm trong khoảng một cách mượt mà và nhạy bén với những thay đổi nhỏ.
Có thể gói gọn trong cơ chế cập nhật trọng số nhân dựa trên ước lượng không chệch.
Đầu tiên, thuật toán giải quyết triệt để rào cản dữ liệu bị khuyết thiếu bằng cách xây dựng các giá trị phần thưởng ảo thông qua kỹ thuật Importance-Weighted Estimator. Bằng cách chia phần thưởng thực tế cho xác suất được chọn (), Exp3 tạo ra một ước lượng không chệch (unbiased), giúp "bù đắp" và phóng đại giá trị cho những lựa chọn ít được ưu tiên nhưng tiềm năng, từ đó đảm bảo bức tranh toàn cảnh về phần thưởng luôn chính xác về mặt kỳ vọng toán học.
Điểm chủ đạo thứ hai nằm ở việc sử dụng hàm mũ (Exponential Update) để cập nhật vector trọng số theo từng bước. Khác với các phương pháp cộng tuyến tính, hàm mũ cho phép thuật toán khuếch đại cực mạnh sự khác biệt giữa các lựa chọn; chỉ cần một cánh tay mang lại hiệu quả tốt hơn một chút, trọng số của nó sẽ tăng trưởng phi mã, giúp hệ thống có khả năng xoay trục chiến thuật (pivot) cực nhanh để thích nghi ngay cả khi môi trường đối kháng thay đổi liên tục.
Demo này giúp trực quan hóa hiệu suất của ba chiến thuật: -Greedy, UCB, và Exp3 thông qua chỉ số Regret (Sự hối tiếc tích lũy). Regret càng thấp, thuật toán càng hiệu quả. Tích chọn "Chế độ Đối kháng Động" để kích hoạt kịch bản có sự can thiệp thay đổi của Adversary: khi hệ thống nhận ra có một chiến thuật phát hiện ra máy có tỷ lệ thắng cao, nó sẽ swap tỷ lệ máy này với máy có tỷ lệ thấp nhất.
No comments yet. Be the first to comment!