Tác tử thông minh
Trí tuệ nhân tạo hiện đại có thể nhìn gọn trong một câu: thiết kế các tác tử lý tính. Mọi thuật toán bạn học về sau, từ tìm kiếm tới mạng nơ-ron, đều là một cách cài đặt phần ra quyết định bên trong một tác tử.
Ý tưởng cốt lõi
Một tác tử (agent) là bất kỳ thực thể nào vừa cảm nhận môi trường qua cảm biến (sensors), vừa tác động lại môi trường qua cơ cấu chấp hành (actuators).
- Một con người là tác tử: mắt, tai, da là cảm biến; tay, chân, miệng là cơ cấu chấp hành.
- Một robot hút bụi là tác tử: cảm biến hồng ngoại và camera là cảm biến; bánh xe và bàn chải là cơ cấu chấp hành.
- Một chương trình giao dịch chứng khoán cũng là tác tử: dữ liệu thị trường là cảm biến; lệnh mua bán là cơ cấu chấp hành.
Vòng lặp cảm nhận, quyết định, hành động
Tác tử và môi trường tương tác theo một vòng lặp lặp đi lặp lại. Tại mỗi thời điểm t:
- Cảm nhận: môi trường gửi cho tác tử một quan sát (percept)
o_t. - Quyết định: tác tử dựa vào lịch sử quan sát đến nay để chọn một hành động
a_t. - Hành động: tác tử thực hiện
a_t, môi trường chuyển sang trạng thái mới, rồi vòng lặp tiếp tục.
Hãy chạy thử vòng lặp này từng chu kỳ trên thế giới hút bụi hai ô. Bấm Sau để đi qua từng bước cảm nhận, quyết định, hành động, và đổi ô chọn giữa tác tử phản xạ đơn giản (chỉ theo cảm nhận hiện tại) với tác tử dựa mục tiêu (có bộ nhớ, biết khi nào đạt mục tiêu để dừng).
Tác tử phản xạ đơn giản không có bộ nhớ nên khi phòng đã sạch nó vẫn đi lại mãi và tốn năng lượng; tác tử dựa mục tiêu nhớ trạng thái từng ô, nhận ra mục tiêu đã đạt và dừng lại. Đây chính là hạn chế của việc chỉ quan sát một phần môi trường.
Ánh xạ từ lịch sử quan sát sang hành động được gọi là hàm tác tử (agent function): nó nhận một chuỗi quan sát (o_1, o_2, ..., o_t) và trả về hành động a_t mà tác tử sẽ làm. Hàm tác tử là mô tả trừu tượng "tác tử làm gì khi gặp đầu vào X". Cài đặt cụ thể của hàm đó bằng mã nguồn chạy trên một kiến trúc phần cứng hay phần mềm gọi là chương trình tác tử (agent program).
Phân biệt hai khái niệm này rất quan trọng. Cùng một hàm tác tử (cùng hành vi nhìn từ bên ngoài) có thể được cài bằng nhiều chương trình khác nhau: vài câu lệnh if trong Python, một mạch logic, hay một mạng nơ-ron đã huấn luyện. Hàm tác tử là bảng tra có thể vô hạn; chương trình tác tử không lưu cả bảng mà tính hành động theo yêu cầu dựa trên một biểu diễn nội tại (luật, mô hình, mạng nơ-ron).
Mô tả nhiệm vụ bằng khung PEAS
Trước khi thiết kế tác tử, ta phải mô tả rõ nhiệm vụ. Russell và Norvig đề xuất khung PEAS gồm bốn thành phần:
| Chữ | Thành phần | Ý nghĩa |
|---|---|---|
| P | Performance (độ đo hiệu năng) | Tiêu chí định lượng để chấm điểm tác tử. Mọi quyết định thiết kế đều quay về thước đo này. |
| E | Environment (môi trường) | Thế giới tác tử hoạt động trong đó, gồm các đối tượng và quy luật chi phối chúng. |
| A | Actuators (cơ cấu chấp hành) | Phương tiện tác tử dùng để tác động lên môi trường. |
| S | Sensors (cảm biến) | Phương tiện tác tử dùng để thu thập thông tin từ môi trường. |
Ví dụ PEAS cho một taxi tự hành:
- P: an toàn, đúng giờ, tiết kiệm xăng, tuân thủ luật.
- E: đường phố, phương tiện khác, người đi bộ, khách hàng.
- A: vô-lăng, ga, phanh, đèn hiệu, còi.
- S: camera, lidar, radar, GPS, đồng hồ tốc độ, cảm biến gia tốc.
Một thước đo hiệu năng tốt phải định lượng được, quan sát được, kiểm chứng được, tức là một hàm tính được từ dữ liệu nhật ký, không phải mong muốn mơ hồ như "thông minh" hay "hài lòng".
Tính lý tính (duy lý)
Với mỗi chuỗi quan sát có thể có, một tác tử lý tính (rational agent) phải chọn hành động được kỳ vọng cực đại hóa độ đo hiệu năng, dựa trên hai nguồn: bằng chứng từ chuỗi quan sát, và tri thức tích hợp sẵn của tác tử.
Lý tính của một tác tử phụ thuộc vào bốn yếu tố, đổi bất kỳ yếu tố nào cũng có thể biến tác tử từ lý tính thành không lý tính:
- Độ đo hiệu năng dùng để đánh giá.
- Tri thức tiền nghiệm về môi trường.
- Tập hành động khả dụng.
- Chuỗi quan sát đã thu thập đến nay.
Lý tính không phải toàn tri. Một tác tử toàn tri biết trước kết quả thực tế của mọi hành động; một tác tử lý tính chỉ biết kỳ vọng dựa trên thông tin sẵn có. Ví dụ: bạn nhìn cả hai chiều, không thấy xe nào rồi mới băng qua phố vắng. Đó là hành động lý tính. Nếu đúng lúc đó một mảnh vỡ từ trên trời rơi trúng chỗ bạn vừa đứng, kết quả tệ đi, nhưng quyết định băng qua vẫn là lý tính, vì nó tối ưu kỳ vọng dựa trên bằng chứng có lúc đó.
Định nghĩa lý tính kéo theo ba hệ quả thiết kế:
- Thu thập thông tin: khi quan sát hiện tại chưa đủ, tác tử nên chủ động giảm bất định, ví dụ quay camera, quét radar xa hơn, hay hỏi lại người dùng.
- Học: tri thức tiền nghiệm có thể sai hoặc lạc hậu, nên tác tử cần cập nhật mô hình từ kinh nghiệm.
- Tính tự trị: tác tử tự trị ít phụ thuộc tri thức cài sẵn, nhiều hơn vào những gì nó tự nhận biết và học được.
Trên thực tế ta không nhắm tới lý tính tuyệt đối (thường không tính toán nổi trong thời gian có hạn), mà nhắm tới lý tính giới hạn: lý tính tốt nhất trong giới hạn tài nguyên tính toán có sẵn.
Ví dụ thế giới hút bụi
Hãy xét một bài toán đồ chơi cổ điển: một robot hút bụi trong căn phòng chỉ có hai ô, ô A bên trái và ô B bên phải. Mỗi ô có thể sạch hoặc bẩn. Tại mỗi bước, robot quan sát được vị trí của mình và trạng thái sạch bẩn của ô đang đứng (không thấy ô kia). Robot có thể Suck (hút), Right (sang phải) hoặc Left (sang trái).
Bài toán tưởng tầm thường nhưng nó nêu ngay bốn câu hỏi mọi tác tử AI phải trả lời, mỗi câu ứng với một khái niệm trung tâm:
| Câu hỏi | Khái niệm quyết định |
|---|---|
| Mục tiêu là gì? Hút sạch, hay tốn ít hành động, hay kéo dài pin? | Độ đo hiệu năng |
| Tác tử thấy được bao nhiêu thế giới? Chỉ ô đang đứng hay cả phòng? | Tính quan sát được |
Lệnh Suck có chắc làm sạch không, hay chỉ thành công 80 phần trăm? | Tính tất định |
| Có cần nhớ ô kia đã sạch chưa? | Nhu cầu về bộ nhớ trong |
Một hàm tác tử khả thi cho bài toán này có thể mô tả gọn bằng bảng tra: nếu ô đang đứng bẩn thì hút, nếu sạch thì sang ô còn lại.
| Vị trí | Trạng thái ô | Hành động |
|---|---|---|
| A | Bẩn | Suck |
| A | Sạch | Right |
| B | Bẩn | Suck |
| B | Sạch | Left |
Phân loại môi trường
Bản chất của một bài toán AI gắn chặt với loại môi trường. Phân loại đúng giúp thu hẹp tập kiến trúc cần xem xét, chọn đúng họ thuật toán, và ước lượng độ khó. Có bảy trục phân loại chính:
| Trục | Hai cực | Phân biệt |
|---|---|---|
| Quan sát được | Hoàn toàn / Từng phần | Cảm biến có cho biết toàn bộ trạng thái liên quan không? |
| Số tác tử | Đơn / Đa | Một hay nhiều tác tử ra quyết định? Đa lại chia cộng tác, cạnh tranh, hỗn hợp. |
| Tất định | Tất định / Ngẫu nhiên | Trạng thái kế tiếp có được xác định duy nhất bởi trạng thái và hành động hiện tại không? |
| Đoạn hay tuần tự | Đoạn / Tuần tự | Quyết định lúc này có ảnh hưởng tương lai không? |
| Tĩnh hay động | Tĩnh / Động | Môi trường có đổi khi tác tử đang suy nghĩ không? (bán động: chỉ điểm số đổi theo thời gian). |
| Rời rạc | Rời rạc / Liên tục | Trạng thái, thời gian, quan sát, hành động là đếm được hay liên tục? |
| Đã biết | Đã biết / Chưa biết | Tác tử có biết trước quy luật chi phối môi trường không? |
Vài ví dụ định vị trên các trục:
- Vacuum-world hai ô: quan sát từng phần (không thấy ô kia), đơn tác tử, tất định, tuần tự, tĩnh, rời rạc, đã biết.
- Cờ vua có đồng hồ: quan sát đầy đủ, đa tác tử cạnh tranh, tất định, tuần tự, bán động, rời rạc, đã biết.
- Taxi tự hành: quan sát từng phần, đa tác tử hỗn hợp, ngẫu nhiên, tuần tự, động, liên tục, chưa biết.
Taxi tự hành gom gần như mọi đặc tính bất lợi, nên nó cần một kiến trúc tác tử học với hàng chục module chuyên biệt, không phải vài câu lệnh if.
Các kiến trúc tác tử
Lịch sử AI nhận diện năm kiến trúc, sắp theo độ phức tạp tăng dần.
1. Tác tử phản xạ đơn giản (simple reflex). Chọn hành động chỉ dựa vào quan sát hiện tại, theo các luật điều kiện hành động dạng "nếu điều kiện thì hành động". Không có bộ nhớ. Ưu điểm: cực đơn giản, phản ứng nhanh. Nhược điểm: chỉ chạy đúng trong môi trường quan sát được hoàn toàn; trong môi trường quan sát từng phần nó có thể rơi vào vòng lặp vô hạn.
2. Tác tử phản xạ có mô hình (model-based reflex). Duy trì một trạng thái nội tại tóm tắt lịch sử quan sát, cập nhật bằng hai mô hình: mô hình chuyển trạng thái ("hành động của tôi thay đổi thế giới ra sao") và mô hình cảm nhận ("thế giới hiện ra trong quan sát của tôi thế nào"). Nhờ đó nó suy luận được về phần thế giới không thấy trực tiếp.
3. Tác tử hướng mục tiêu (goal-based). Ngoài mô hình thế giới, nó giữ một mô tả tường minh về mục tiêu, tức tập trạng thái muốn đạt tới, rồi cân nhắc các chuỗi hành động và chọn chuỗi dẫn tới mục tiêu. Đây là nơi xuất hiện tìm kiếm và lập kế hoạch. Ưu điểm: linh hoạt, chỉ cần đổi mục tiêu là đổi toàn bộ hành vi. Nhược điểm: mục tiêu chỉ phân biệt đạt hay không đạt, không nói được hai trạng thái mục tiêu cái nào tốt hơn.
4. Tác tử hướng hữu dụng (tiện ích) (utility-based). Thay tập mục tiêu nhị phân bằng một hàm hữu dụng gán cho mỗi trạng thái một số thực đo mức độ thỏa mãn, rồi chọn hành động cực đại hóa kỳ vọng hữu dụng. Nó giải quyết được hai việc mục tiêu thuần không làm nổi: chọn giữa các mục tiêu xung khắc (an toàn so với nhanh) và ra quyết định khi nhiều mục tiêu cùng không chắc chắn. Đây là nền của lý thuyết quyết định và học tăng cường.
5. Tác tử học (learning agent). Bốn kiến trúc trên đều giả định tri thức được cấp sẵn. Tác tử học bỏ giả định đó, gồm bốn thành phần: phần tử thi hành (ra quyết định khi vận hành), phần tử học (cải thiện phần tử thi hành từ phản hồi), bộ phê bình (so hành vi với chuẩn để tạo phản hồi), và bộ sinh bài toán (đề xuất hành động khám phá mới, chấp nhận hiệu năng ngắn hạn thấp để học nhiều hơn về dài hạn).
Gợi ý chọn kiến trúc theo đặc tính môi trường (đây là heuristic, không phải quy tắc cứng):
| Kiến trúc | Phù hợp khi |
|---|---|
| Phản xạ đơn giản | Quan sát đầy đủ, tất định, đoạn, hành động không phụ thuộc lịch sử. |
| Phản xạ có mô hình | Quan sát từng phần nhưng tất định, chuỗi quan sát đủ giàu để suy ra trạng thái. |
| Hướng mục tiêu | Có mục tiêu rõ ràng đo được, cần lập kế hoạch nhiều bước. |
| Hướng hữu dụng | Có nhiều mục tiêu cạnh tranh, hành động có rủi ro hoặc bất định. |
| Tác tử học | Môi trường thay đổi theo thời gian, mô hình tiền nghiệm thiếu hoặc không có. |
Mã nguồn Python
# vi du minh hoa: mot tac tu phan xa don gian cho the gioi hut bui
# percept la mot bo (vi_tri, trang_thai) cua o dang dung
def simple_reflex_vacuum(percept):
vi_tri, trang_thai = percept
if trang_thai == "Dirty":
return "Suck" # o ban thi hut
elif vi_tri == "A":
return "Right" # o A sach thi sang phai
else:
return "Left" # o B sach thi sang trai
# tac tu phan xa co mo hinh: nho trang thai hai o da thay
class ModelBasedVacuum:
def __init__(self):
# trang thai noi tai, khoi tao chua biet
self.state = {"A": "Unknown", "B": "Unknown"}
def act(self, percept):
vi_tri, trang_thai = percept
self.state[vi_tri] = trang_thai # cap nhat mo hinh
if self.state["A"] == "Clean" and self.state["B"] == "Clean":
return "NoOp" # ca hai o sach thi dung
if trang_thai == "Dirty":
return "Suck"
return "Right" if vi_tri == "A" else "Left"
# moi truong don gian hai o, chay thu vong lap cam nhan quyet dinh hanh dong
def run(agent_act, buoc=8):
world = {"A": "Dirty", "B": "Dirty"}
vi_tri = "A"
for t in range(buoc):
percept = (vi_tri, world[vi_tri])
action = agent_act(percept)
print(f"buoc {t}: thay {percept} -> lam {action}")
if action == "Suck":
world[vi_tri] = "Clean"
elif action == "Right":
vi_tri = "B"
elif action == "Left":
vi_tri = "A"
elif action == "NoOp":
break
if __name__ == "__main__":
print("== Phan xa don gian ==")
run(simple_reflex_vacuum)
print("== Phan xa co mo hinh ==")
agent = ModelBasedVacuum()
run(agent.act)
Khác biệt mấu chốt: tác tử có mô hình dừng lại khi biết cả hai ô đã sạch, còn tác tử phản xạ đơn giản cứ luân phiên di chuyển mãi và chịu phạt mỗi bước. Trong môi trường tĩnh, nhờ bộ nhớ mà tác tử có mô hình đạt điểm cao gần gấp đôi.
Bài tập thực hành
Bài tập 1: vòng lặp vô hạn của phản xạ đơn giản
Trong vacuum-world hai ô, hãy mô tả một tình huống ngắn (một câu) khiến tác tử phản xạ đơn giản kẹt trong vòng lặp vô hạn, không bao giờ hoàn thành. Giải thích vì sao kiến trúc phản xạ đơn giản dễ mắc lỗi này trong môi trường quan sát từng phần.
Gợi ý
Hãy nghĩ tới trường hợp cảm biến trạng thái bị hỏng hoặc luôn báo "Clean" dù ô thực sự bẩn. Vì tác tử không có bộ nhớ và chỉ dựa vào quan sát hiện tại, nó sẽ lặp Right, Left, Right, Left mà không bao giờ hút. Mấu chốt là không có trạng thái nội tại để nhận ra mình đang lặp.
Bài tập 2: mô tả PEAS và chọn kiến trúc
Viết mô tả PEAS đầy đủ cho hệ thống điều khiển đèn giao thông tại một ngã tư, với yêu cầu mọi thước đo hiệu năng phải định lượng được. Sau đó chọn một trong năm kiến trúc tác tử phù hợp nhất và giải thích lựa chọn dựa trên đặc tính môi trường.
Gợi ý
P nên là số đo như thời gian chờ trung bình mỗi xe hoặc lưu lượng xe qua mỗi giờ. E gồm các làn đường, dòng xe, người đi bộ. A là tín hiệu đèn các hướng. S là cảm biến đếm xe, camera. Môi trường quan sát từng phần và động, nên hãy cân nhắc kiến trúc phản xạ có mô hình hoặc hướng hữu dụng nếu có nhiều mục tiêu xung khắc.
Bài tập 3: thêm tác tử hướng hữu dụng
Mở rộng đoạn mã trên bằng một tác tử hướng hữu dụng cho vacuum-world. Dùng hàm hữu dụng U = alpha * (so_o_sach) - beta * (nang_luong_da_dung) với alpha = 1 và beta = 0.2. Tác tử chọn hành động cực đại hóa kỳ vọng hữu dụng nhìn trước một bước. So sánh điểm của nó với hai tác tử đã có trên môi trường tĩnh và môi trường động.
Gợi ý
Với mỗi hành động khả thi, hãy tính trạng thái kế tiếp dự kiến rồi áp hàm U lên đó, chọn hành động cho U lớn nhất. Trong môi trường ngẫu nhiên, Suck chỉ thành công với một xác suất, nên hãy lấy kỳ vọng theo các kết quả có thể. Chú ý điều chỉnh thước đo hiệu năng cho công bằng khi so sánh ba tác tử.
Tự kiểm tra
Hàm tác tử và chương trình tác tử khác nhau ra sao?
Hàm tác tử là mô tả trừu tượng, nhìn từ bên ngoài: ánh xạ từ chuỗi quan sát sang hành động, trả lời "tác tử làm gì khi gặp đầu vào nào". Chương trình tác tử là cài đặt cụ thể của ánh xạ đó bằng mã chạy trên một kiến trúc xác định. Một hàm tác tử có thể được cài bằng nhiều chương trình khác nhau mà hành vi bên ngoài giống hệt.
Vì sao tác tử phản xạ đơn giản không hợp với môi trường quan sát từng phần?
Vì nó chỉ dựa vào quan sát hiện tại, không có trạng thái nội tại. Khi cảm biến không cho biết toàn bộ trạng thái liên quan, tác tử không thể suy luận về phần thế giới nó không thấy, dễ chọn sai hành động hoặc lặp vô hạn. Muốn xử lý quan sát từng phần cần ít nhất kiến trúc phản xạ có mô hình để nhớ và suy ra trạng thái ẩn.
Câu hỏi tự kiểm
- 1Một tác tử được định nghĩa là gì?
- 2Bốn chữ trong khung PEAS lần lượt là gì?
- 3Hàm tác tử và chương trình tác tử khác nhau ra sao?
- 4Tác tử phản xạ đơn giản gặp khó khăn gì trong môi trường quan sát từng phần?
Tác tử là thực thể cảm nhận môi trường qua cảm biến và tác động lại qua cơ cấu chấp hành, vận hành theo vòng lặp cảm nhận, quyết định, hành động. Một tác tử lý tính chọn hành động cực đại hóa kỳ vọng hiệu năng dựa trên bằng chứng và tri thức sẵn có, chứ không cần toàn tri. Tùy môi trường (mô tả bằng PEAS và phân loại theo bảy trục) mà ta chọn một trong năm kiến trúc, từ phản xạ đơn giản tới tác tử học.