Trong Dynamic Pricing, bài toán khó không chỉ là dự đoán khách hàng có mua ở mức giá nào. Hệ thống còn phải quyết định nên tiếp tục sử dụng mức giá đang mang lại doanh thu tốt hay thử một mức giá khác để học thêm về phản ứng của thị trường.
Đây chính là bài toán ra quyết định tuần tự dưới bất định. Contextual Bandit cung cấp một mô hình tương đối gọn cho trường hợp reward chủ yếu đến ngay sau quyết định, trong khi học tăng cường (Reinforcement Learning, RL) mở rộng bài toán sang các tình huống mà hành động định giá hiện tại còn ảnh hưởng đến trạng thái và lợi ích trong tương lai [1], [2].
Nếu cần bức tranh tổng quan về kinh tế học và hệ thống phía sau bài toán này, có thể đọc trước bài Dynamic Pricing: Khi AI quyết định giá trên thị trường trên The CS Note. Bài hiện tại tập trung sâu hơn vào cơ chế học online của Contextual Bandit và RL.
Dynamic Pricing là một bài toán học từ phản hồi
Giả sử một hệ thống thương mại điện tử phải chọn giá cho một sản phẩm tại thời điểm t. Hệ thống quan sát bối cảnh hiện tại xt, ví dụ thời gian trong ngày, mùa vụ, tồn kho, kênh bán, đặc điểm sản phẩm và tín hiệu nhu cầu. Sau đó nó chọn mức giá pt và quan sát phản hồi như mua hoặc không mua.
Nếu khách hàng mua một đơn vị, reward doanh thu đơn giản có thể là:
Trong đó yt có thể bằng 1 nếu có giao dịch và 0 nếu không. Nếu mục tiêu là lợi nhuận thay vì doanh thu, reward cần trừ giá vốn, phí giao hàng, chi phí khuyến mại hoặc các chi phí liên quan. Đây là chi tiết quan trọng: thuật toán chỉ tối ưu đại lượng được định nghĩa trong reward.
Nếu biết chính xác hàm cầu theo giá, bài toán có thể trở thành một bài toán tối ưu hóa thông thường. Nhưng trong thực tế, quan hệ giữa giá và xác suất mua thường chưa được biết đầy đủ, thay đổi theo thời gian và bị ảnh hưởng bởi nhiều covariate. Nghiên cứu về dynamic pricing với covariate mô hình hóa trực tiếp tình huống trong đó demand phụ thuộc đồng thời vào giá và vector bối cảnh quan sát được [3].
Do đó hệ thống phải vừa học phản ứng của thị trường vừa kiếm doanh thu. Chọn mãi mức giá đang có vẻ tốt nhất là exploitation. Thử các mức giá chưa chắc chắn để thu thập thông tin là exploration. Đây là đánh đổi trung tâm của bandit và reinforcement learning.
Contextual Bandit: học giá tốt nhất cho từng bối cảnh
Trong multi-armed bandit cơ bản, mỗi action có thể được hình dung như một “cánh tay”. Với Dynamic Pricing rời rạc, mỗi cánh tay có thể là một mức giá, chẳng hạn 80, 100, 120 hoặc 140. Thuật toán chọn một giá, nhận reward và chỉ quan sát kết quả của mức giá đã chọn.
Contextual Bandit bổ sung vector bối cảnh xt. Thuật toán không còn hỏi “mức giá nào tốt nhất nói chung?” mà hỏi “mức giá nào có expected reward tốt nhất trong bối cảnh hiện tại?”. Li và cộng sự đã sử dụng mô hình contextual bandit cho recommendation với thông tin người dùng và nội dung; cấu trúc ra quyết định tương tự có thể áp dụng cho pricing khi action được thay bằng mức giá [2].
Một thuật toán kinh điển là LinUCB. Với mỗi action a, ta giả định expected reward có thể xấp xỉ tuyến tính theo context:
Từ dữ liệu đã quan sát, thuật toán ước lượng θa rồi cộng thêm một exploration bonus:
Thành phần đầu là reward dự đoán. Thành phần thứ hai tăng điểm cho những action mà mô hình còn chưa chắc chắn. Hệ số α càng lớn, thuật toán càng ưu tiên exploration.
Thay vì upper confidence bound, có thể sử dụng Thompson Sampling: lấy mẫu một mô hình từ posterior rồi chọn action tốt nhất theo mô hình vừa lấy mẫu. Ferreira, Simchi-Levi và Wang nghiên cứu Thompson Sampling trong revenue management khi demand parameters chưa biết và tồn kho có giới hạn, trực tiếp đặt bài toán dưới đánh đổi exploration–exploitation [4].
Regret đo chi phí của việc chưa biết thị trường
Bandit thường được đánh giá bằng regret: chênh lệch tích lũy giữa reward của policy học online và reward của một policy tham chiếu biết trước action tốt nhất trong mô hình đang xét.
Biểu thức trên là dạng trực giác. Trong phân tích lý thuyết, regret thường được định nghĩa theo expected reward và phụ thuộc giả định thống kê cụ thể. Wang, Talluri và Li nghiên cứu dynamic pricing với covariate và chỉ ra các thuật toán dựa trên UCB và Thompson Sampling có thể đạt regret thấp dưới mô hình demand được giả định trong công trình của họ [3]. Không nên chuyển các bảo đảm đó sang một hệ thống pricing bất kỳ nếu các giả định không còn đúng.
Khi nào Contextual Bandit chưa đủ?
Contextual Bandit phù hợp nhất khi hậu quả của action có thể xem như gần như kết thúc sau reward hiện tại. Nhưng nhiều bài toán pricing không có tính chất này.
Hãy xét một khách sạn có 20 phòng còn lại và ba ngày trước ngày nhận phòng. Bán một phòng hôm nay với giá thấp tạo doanh thu ngay nhưng đồng thời làm giảm inventory có thể bán vào ngày mai. Nếu nhu cầu ngày cuối tăng mạnh, quyết định hiện tại đã ảnh hưởng trực tiếp đến cơ hội doanh thu trong tương lai.
Tương tự, khách hàng có thể quan sát lịch sử giá và trì hoãn mua nếu họ kỳ vọng giá sẽ giảm. Trong thị trường cạnh tranh, đối thủ cũng có thể phản ứng với mức giá hiện tại. Những trường hợp này tạo ra state transition: action hôm nay thay đổi trạng thái mà agent sẽ gặp trong tương lai.
Reinforcement Learning mô hình hóa tác động dài hạn của giá
RL thường mô hình hóa môi trường bằng một quá trình quyết định Markov (Markov Decision Process, MDP). Với Dynamic Pricing, một thiết kế state có thể bao gồm:
- Inventory: số lượng hàng hoặc công suất còn lại.
- Time: thời gian còn lại trong mùa bán hoặc trước deadline.
- Demand signals: lưu lượng truy cập, booking pace, mùa vụ.
- Price history: giá gần đây nếu hành vi khách phụ thuộc lịch sử giá.
- Market state: một số tín hiệu cạnh tranh khi được phép sử dụng và thu thập hợp pháp.
Action là giá hoặc mức điều chỉnh giá. Reward có thể là lợi nhuận tại bước hiện tại. Môi trường sau đó chuyển từ state st sang st+1.
Mục tiêu RL không chỉ tối đa reward tại bước hiện tại mà tối đa expected cumulative return:
Trong đó γ là discount factor. Khi γ gần 0, agent ưu tiên reward ngắn hạn. Khi γ lớn hơn, reward tương lai có ảnh hưởng mạnh hơn đến quyết định hiện tại [1].
Q-learning học giá trị của từng quyết định
Một thuật toán nền tảng là Q-learning. Nó học hàm Q(s, a): expected return khi chọn action a tại state s rồi tiếp tục theo policy học được.
Khác với bandit, update không chỉ sử dụng reward hiện tại. Thành phần γ max Q(s′,a′) truyền giá trị của trạng thái tương lai ngược về quyết định hiện tại.
Rana và Oliveira đã nghiên cứu Q-learning cho dynamic pricing với sản phẩm có inventory hữu hạn và deadline bán, trong môi trường demand chưa biết và có thể không dừng [5]. Đây là ví dụ rõ ràng về trường hợp pricing được xem như bài toán RL thay vì một lựa chọn action độc lập ở từng thời điểm.
Ví dụ Python: LinUCB tự học mức giá theo context
Ví dụ dưới đây mô phỏng một Contextual Bandit đơn giản. Có bốn mức giá ứng viên. Context gồm bias, mức nhu cầu và biến weekend. Xác suất mua thật được môi trường mô phỏng bằng một hàm logistic nhưng thuật toán không biết hàm này; LinUCB chỉ cập nhật mô hình từ reward quan sát được.
Đây là code minh họa, không phải mô hình production và không mang bảo đảm lý thuyết của LinUCB dưới môi trường logistic này vì mô hình expected reward tuyến tính chỉ là một xấp xỉ.
Lúc đầu các ma trận A gần như chưa chứa thông tin nên exploration bonus tương đối lớn. Sau nhiều lượt, mỗi action tích lũy dữ liệu ở những context mà nó từng được thử; uncertainty giảm và quyết định ngày càng dựa nhiều hơn vào estimated reward.
Một chi tiết dễ bỏ qua là thuật toán chỉ quan sát reward của mức giá đã hiển thị. Nếu giá 120 được chọn, ta không biết cùng khách hàng đó sẽ phản ứng thế nào với giá 100 hay 140. Đây là bandit feedback, khác với supervised learning nơi label của mọi action thường được giả định là có sẵn.
Ví dụ Q-learning: giá ảnh hưởng đến tồn kho tương lai
Ví dụ tiếp theo thêm hai biến state: số sản phẩm còn lại và số bước bán còn lại. Khi một sản phẩm được bán, inventory giảm. Vì vậy action hiện tại làm thay đổi state tương lai và Q-learning có lý do để cân nhắc cả reward ngay lập tức lẫn giá trị của inventory còn lại.
Ví dụ này cố tình giữ môi trường rất nhỏ để bảng Q có thể học trực tiếp. Trong bài toán thực với state liên tục và nhiều biến, bảng Q trở nên quá lớn; khi đó có thể cần function approximation hoặc các thuật toán Deep RL. Tuy nhiên, việc chuyển sang DQN, actor–critic hoặc các phương pháp sâu hơn không sửa được một state/reward được thiết kế sai.
Contextual Bandit hay Reinforcement Learning?
| Tiêu chí | Contextual Bandit | Reinforcement Learning |
|---|---|---|
| Mục tiêu | Tối ưu reward theo context tại mỗi round. | Tối ưu cumulative return qua nhiều bước. |
| Tác động của action | Không mô hình hóa đầy đủ việc action thay đổi state tương lai. | Action ảnh hưởng state transition và reward tương lai. |
| Ví dụ phù hợp | Chọn mức giá theo traffic, thời điểm và tín hiệu nhu cầu khi inventory không phải yếu tố chiến lược chính. | Airline, hotel, inventory hữu hạn, deadline, khách hàng có hành vi liên thời gian. |
| Độ phức tạp | Thường thấp hơn và dễ đánh giá hơn. | Cao hơn do state, transition và delayed reward. |
| Thuật toán điển hình | LinUCB, Thompson Sampling, contextual ε-greedy. | Q-learning, DQN, PPO, SAC và các biến thể actor–critic. |
Không nên mặc định Deep RL là lựa chọn “cao cấp hơn”. Nếu action hiện tại hầu như không tạo ra hiệu ứng dài hạn đáng kể, Contextual Bandit có mô hình đơn giản hơn, ít biến số hơn và thường dễ triển khai online an toàn hơn.
Ngược lại, ép bài toán inventory hữu hạn vào contextual bandit thuần túy có thể bỏ qua opportunity cost của việc bán sớm. Cũng tồn tại các phương pháp bandit có resource constraints và revenue management chuyên biệt [4], vì vậy ranh giới giữa các nhóm phương pháp không hoàn toàn tuyệt đối.
Từ thuật toán đến hệ thống Dynamic Pricing thực tế
Một pricing agent tốt không thể chỉ gồm một model nhận feature rồi xuất giá. Hệ thống production phải kiểm soát dữ liệu, exploration, ràng buộc kinh doanh và đánh giá policy.
1. Xác định đúng reward
Tối đa doanh thu có thể dẫn đến policy khác hoàn toàn tối đa gross margin. Nếu reward chỉ là conversion rate, agent thậm chí có động cơ chọn giá rất thấp. Reward phải phản ánh đúng KPI kinh doanh và các chi phí quan trọng.
2. Exploration phải có guardrail
Bandit và RL cần exploration để học, nhưng production không nên cho phép agent thử mọi mức giá có thể. Action space nên bị giới hạn bởi price floor, price ceiling, quy tắc margin, inventory policy và các giới hạn pháp lý hoặc thương mại tương ứng.
3. Log propensity và context
Để đánh giá policy mới từ logged bandit data, cần biết không chỉ action và reward mà cả context và xác suất policy cũ chọn action đó. Nếu hệ thống chỉ lưu “giá đã hiển thị → có mua hay không” nhưng không lưu logic exploration, việc đánh giá off-policy sau này trở nên khó khăn hơn đáng kể.
4. Theo dõi non-stationarity
Demand tháng trước có thể không đại diện tháng này. Mùa vụ, chiến dịch quảng cáo, đối thủ, kinh tế vĩ mô hoặc thay đổi sản phẩm đều có thể làm distribution dịch chuyển. Một policy online cần cơ chế giảm trọng số dữ liệu quá cũ, retrain hoặc phát hiện drift thay vì giả định môi trường cố định.
5. Phân biệt correlation với tác động của giá
Dữ liệu lịch sử pricing thường có selection bias. Ví dụ doanh nghiệp có thể đã tăng giá vào những ngày nhu cầu cao; nhìn đơn giản vào dữ liệu có thể tạo ảo giác rằng giá cao làm demand tăng. Exploration có kiểm soát hoặc thiết kế thử nghiệm phù hợp giúp tách ảnh hưởng của giá khỏi các biến gây nhiễu tốt hơn.
6. Theo dõi tương tác cạnh tranh
Khi nhiều pricing agent cùng phản ứng với nhau, môi trường trở nên non-stationary và có thể xuất hiện hành vi thị trường không mong muốn. Nghiên cứu về RL trong pricing cạnh tranh cho thấy tương tác giữa các agent cần được đánh giá riêng thay vì giả định mỗi policy hoạt động trong môi trường cố định [6]. Trong ứng dụng thực tế, pricing tự động nên có giám sát và review pháp lý phù hợp với thị trường triển khai.
Kết luận
Contextual Bandit và Reinforcement Learning đều biến Dynamic Pricing thành một quá trình học liên tục từ phản hồi thị trường, nhưng chúng giải quyết hai cấu trúc quyết định khác nhau. Contextual Bandit tập trung vào action tốt trong context hiện tại, còn RL cần thiết khi giá hiện tại thay đổi trạng thái và cơ hội doanh thu trong tương lai.
Điểm quan trọng nhất không phải chọn thuật toán phức tạp nhất mà xác định đúng cấu trúc của bài toán: reward là gì, action có ảnh hưởng tương lai hay không, dữ liệu phản hồi được thu thập thế nào và exploration được giới hạn ra sao. Khi những yếu tố đó được mô hình hóa đúng, pricing agent mới có cơ hội học một policy tốt hơn theo thời gian thay vì đơn thuần thay đổi giá thường xuyên.
Đọc thêm trên The CS Note: Dynamic Pricing: Khi AI quyết định giá trên thị trường để xem bức tranh rộng hơn về dữ liệu, tối ưu hóa, cạnh tranh và các vấn đề khi AI tham gia quyết định giá.
Tài liệu tham khảo
- [1] R. S. Sutton and A. G. Barto, Reinforcement Learning: An Introduction, 2nd ed. Cambridge, MA, USA: MIT Press, 2018.
- [2] L. Li, W. Chu, J. Langford, and R. E. Schapire, “A Contextual-Bandit Approach to Personalized News Article Recommendation,” in Proc. 19th International Conference on World Wide Web, 2010, pp. 661–670, doi: 10.1145/1772690.1772758. DOI.
- [3] H. Wang, K. Talluri, and X. Li, “Technical Note—On Dynamic Pricing with Covariates,” Operations Research, vol. 73, no. 4, pp. 1932–1943, 2025, doi: 10.1287/opre.2021.0802. DOI.
- [4] K. J. Ferreira, D. Simchi-Levi, and H. Wang, “Online Network Revenue Management Using Thompson Sampling,” Operations Research, vol. 66, no. 6, pp. 1586–1602, 2018, doi: 10.1287/opre.2018.1755. DOI.
- [5] R. Rana and F. S. Oliveira, “Real-Time Dynamic Pricing in a Non-Stationary Environment Using Model-Free Reinforcement Learning,” Omega, vol. 47, pp. 116–126, 2014, doi: 10.1016/j.omega.2013.10.004. DOI.
- [6] A. Kastius and R. Schlosser, “Dynamic Pricing under Competition Using Reinforcement Learning,” Journal of Revenue and Pricing Management, vol. 21, pp. 50–63, 2022, doi: 10.1057/s41272-021-00285-3. DOI.
Nội dung gốc thuộc tác giả. Vui lòng không đăng lại toàn văn khi chưa được phép, trừ trường hợp pháp luật hoặc giấy phép áp dụng cho phép. Nội dung của bên thứ ba tuân theo quyền và giấy phép tương ứng.
Nguồn gốc: Dynamic Pricing với Contextual Bandit và Reinforcement Learning