10. Thuật toán AMS ước lượng mô-măng tần số
Tưởng tượng một chuỗi (rất nhiều, cả triệu) gói dữ liệu đi qua một router trong thời gian ngắn. Gói thứ
có địa chỉ IP nguồn
nào đó thuộc tập
. Với mỗi
, gọi
là số lần xuất hiện của địa chỉ
, còn gọi là tần suất của
. Đại lượng
được gọi là mô-măng tần số bậc (
th frequency moment) của dòng dữ liệu này. Bài toán ước lượng mô-măng tần số là một bài toán kinh điển trong lý thuyết dòng dữ liệu. Chúng ta cần thiết kế một cấu trúc dữ liệu có kích thước càng nhỏ càng tốt, để sao cho tại một thời điểm bất kỳ có thể trả lời câu hỏi: “
hiện tại khoảng bằng bao nhiêu?”
Như vậy, con số không được biết trước cho đến khi câu hỏi được đặt ra. (Một query được gửi đến cấu trúc dữ liệu này vào thời điểm đó, và CTDL phải trả lời được câu hỏi này trong thời gian càng nhỏ càng tốt.) Cũng như các ví dụ trước, một cấu trúc dữ liệu mà cần bộ nhớ
là không khả thi. Chúng ta cần kích thước của CTDL khoảng sub-linear (poly-log là tốt nhất) trên các tham số
và
.
Ước lượng được các mô-măng này có thể giúp chúng ta trả lời nhiều câu hỏi cơ bản về dòng dữ liệu. Ví dụ chính là tổng số địa chỉ nguồn khác nhau của dòng. Các mô-măng bậc cao hơn có thể là các đặc điểm dùng cho một thuật toán phân lớp thống kê nào đó: nếu mô-măng nhảy lên nhảy xuống quá độ thì có lẽ là đang có một cuộc tấn công của virus/worm trên mạng chẳng hạn.
Năm 1996, Noga Alon, Yossi Matias, và Mario Szegedy có một bài báo có ảnh hưởng rất lớn đến lý thuyết dòng dữ liệu về bài toán này. Ngoại trừ thuật toán AMS (họ 3 tác giả) sẽ thảo luận trong bài, họ còn giới thiệu kỹ thuật dùng các hàm băm có độ độc lập nhỏ (limited-independence) để tính trong không gian tối ưu, và kỹ thuật dùng độ phức tạp giao tiếp (communication complexity) để chứng minh chặn dưới cho độ phức tạp không gian của các thuật toán dòng dữ liệu. Bài báo của AMS được giải Godel năm 2005.
Ý tưởng chính của AMS là chúng ta thiết kế một cấu trúc dữ liệu ước tính một biến ngẫu nhiên sao cho
và phương sai
cũng nho nhỏ thôi. Như đã thảo luận trong bài trước, để ước tính
với sai số
và độ tin cậy
, nhờ cái mẹo trung vị chúng ta cần khoảng
ước lượng độc lập. Tỉ lệ
sẽ là một hàm sub-linear trên
và
. Do đó, nếu có cách nào chỉ dùng ít bộ nhớ để lẫy một mẫu
là sẽ dẫn đến giải pháp cho bài toán.
Cái khung ý tưởng trên đã được dùng để thiết kế cơ man nào là thuật toán dòng dữ liệu. Với mỗi bài toán cụ thể, ta phải chọn biến một cách thông minh để
(gần) bằng giá trị cần tính và phương sai của nó không quá lớn, sau đó dùng mẹo trung vị.
Lấy mẫu biến ngẫu nhiên
- Chọn
ngẫu nhiên với xác suất
(nghĩa là chọn một gói dữ liệu ngẫu nhiên với phân bố đều trong
gói dữ liệu).
- Lưu vào bộ nhớ biến
(địa chỉ IP hay bất kỳ cái gì khác, tùy ứng dụng).
- Bắt đầu đếm số lần xuất hiện
của
từ thời điểm
cho đến cuối dòng.
- Cuối cùng, trả về
.
Cần giải quyết ba vấn đề:
- Không biết trước
, làm sao để chọn
ngẫu nhiên với xác suất
mà lại dùng rất ít bộ nhớ? Đây là một câu hỏi phỏng vấn kinh điển. Người ta có thể hỏi là làm thế nào để lấy mẫu
phần tử trong dòng dữ liệu gồm
phần tử mà chỉ quét qua một lần và
không biết trước. Không phải chờ đến tốc độ khủng khiếp của Internet thì câu hỏi này mới có lý. Ngày xưa người ta cũng cần lấy mẫu dữ liệu từ các băng từ, chạy chậm nhưng rất dài, chứa nhiều dữ liệu và không biết khi nào thì dừng. Do đó, ta cũng cần lấy mẫu với chỉ một lần quét qua băng. Rờ-tua lại nó rất mất thời gian, do đó các thuật toán cần quét hơn một lần là không hay. Năm 1985, Jeffrey Vitter trả lời câu hỏi này trong một bài báo rất dễ thương. Thuật toán của Vitter thuộc họ thuật toán có tên là lấy mẫu bồn chứa (reservoir sampling).
- Chứng minh
.
- Chặn trên phương sai của
, hy vọng là nó không quá lớn.
Phép lấy mẫu bồn chứa rất đơn giản. Ban đầu ta đặt . (Chỉ cần
bits để chứa biến này.) Khi
đến thì gán
với xác suất
(nghĩa là với xác suất
thì
vẫn bằng
). Tổng quát, khi
đến thì xác suất mà
đang bằng
là
. Ta chỉ việc thay
với xác suất
, và giữ
như cũ với xác suất
. Do
,
vẫn phân bố đều trên
.
Xác minh rằng không khó khăn gì. Để làm bài tập.
Cuối cùng, chúng ta chặn . Trước hết,
Do
ta có
Đặt . Một chút ảo thuật với bất đẳng thức (nhớ rằng chúng ta cần chặn trên
bằng
nhân với một hệ số càng nhỏ càng tốt và hệ số đó phải là sub-linear trên các tham số
và
):
Bất đẳng thức Holder cho ta . Vì thế
Như vậy là tổng số ước lượng chúng ta cần lấy mẫu là
. Mỗi mẫu chỉ cần bộ nhớ kích thước
. Một kết quả mạnh mà ý tưởng lại rất đơn giản và rõ ràng!
