Lý thuyết trò chơi: Tử tế mà không biến mình thành con mồi

Đặt vấn đề

Có một kiểu người rất dễ chết trong thế giới này.

Không phải người nghèo.

Không phải người yếu.

Mà là người tử tế nhưng không có trí nhớ.

Bạn giúp tôi hôm nay.

Ngày mai tôi lừa bạn.

Ngày kia bạn lại giúp tôi.

Ngày mốt tôi lại lừa bạn.

Bạn vẫn cười:

Chắc nó có lý do.

Không.

Trong ngôn ngữ của lý thuyết trò chơi, bạn không phải người tốt nữa.

Bạn là một ATM biết đi.

Nhưng ở đầu kia cũng có một sinh vật khác: người nghĩ rằng cuộc đời chỉ có một quy tắc duy nhất:

Thấy ai sơ hở thì đớp.

Kiểu người này thường thắng rất to trong vài ván đầu.

Giống như một con cáo bước vào chuồng gà.

Ngày đầu: buffet.

Ngày thứ hai: buffet.

Ngày thứ ba: người ta mua chó.

Và thế là vấn đề thú vị bắt đầu xuất hiện:

Liệu một người có thể vừa tử tế, vừa không ngu, vừa không để người khác leo lên đầu, mà cuối cùng vẫn thắng hay không?

Nghe giống sách self-help.

Nhưng không.

Chúng ta có thể viết nó thành ma trận, chạy Python, tìm cân bằng Nash (Nash equilibrium), rồi bắt mấy con người giả lập đấm nhau vài trăm vòng để xem chuyện gì xảy ra.

Chào mừng đến với lý thuyết trò chơi (Game Theory).

Một cuộc chơi rất nhỏ nhưng rất giống cuộc đời

Giả sử có hai người: An và Bình.

Mỗi vòng, cả hai được chọn một trong hai hành động:

  • C — Cooperate: hợp tác.
  • D — Defect: phản bội.

Ta cho điểm như sau:

An Bình Điểm An Điểm Bình
C C 3 3
C D 0 5
D C 5 0
D D 1 1

Nhìn kỹ cái bảng này.

Nếu cả hai tử tế:

$$ (C,C) \rightarrow (3,3) $$

Tổng cộng xã hội tạo ra:

$$ 3 + 3 = 6 $$

Khá vui vẻ.

Nhưng nếu An tử tế còn Bình lươn:

$$ (C,D) \rightarrow (0,5) $$

Bình ăn đậm.

An ăn cám.

Đây chính là cấu trúc kinh điển của Prisoner’s Dilemma — thế lưỡng nan của tù nhân.

Tại sao lươn lẹo lại hấp dẫn đến vậy?

Đứng từ góc nhìn của Bình.

Nếu An hợp tác:

  • Bình hợp tác → được 3.
  • Bình phản bội → được 5.

Phản bội ngon hơn.

Nếu An phản bội:

  • Bình hợp tác → được 0.
  • Bình phản bội → được 1.

Phản bội vẫn ngon hơn.

Tức là bất kể An làm gì:

$$ D > C $$

Vậy nếu cả An lẫn Bình đều đủ thông minh và chỉ chơi một ván duy nhất, cả hai sẽ chọn:

$$ (D,D) $$

và nhận:

$$ (1,1) $$

Đây chính là một cân bằng Nash.

Cân bằng Nash không có nghĩa là kết quả tốt nhất

Đây là chỗ rất dễ hiểu sai.

Cân bằng Nash không nói:

Đây là thiên đường.

Nó chỉ nói đại khái:

Khi mọi người đang ở đây, không ai có lợi nếu một mình đổi chiến thuật.

Trong Prisoner’s Dilemma:

$$ (D,D) $$

là cân bằng Nash.

An đang phản bội.

Bình đang phản bội.

Nếu An tự nhiên giác ngộ Phật pháp rồi chuyển sang hợp tác trong khi Bình vẫn phản bội:

$$ (D,D) = (1,1) $$

biến thành:

$$ (C,D) = (0,5) $$

An từ 1 điểm xuống 0.

Ngu hơn.

Bình cũng vậy.

Thế là hai con người rất thông minh, mỗi người tối ưu lợi ích cá nhân, cuối cùng cùng bò vào một cái hố mà cả hai đều biết rằng có một trạng thái tốt hơn:

$$ (C,C) = (3,3) $$

Đây là một trong những ý tưởng đẹp nhất của Game Theory:

Lý trí cá nhân không tự động sinh ra kết quả tốt cho tập thể.

Đôi khi một hệ thống chứa toàn những cá nhân rất thông minh vẫn có thể cùng nhau làm ra một kết quả cực kỳ ngu.

Nash equilibrium chỉ là trạng thái mà không ai muốn đơn phương nhúc nhích nữa; nó không nhất thiết là trạng thái tốt nhất cho tất cả mọi người. (Stanford Encyclopedia of Philosophy)

Cho máy tính tìm cân bằng Nash thử xem

Với trò chơi bé xíu này, ta có thể brute-force luôn.

 1actions = ["C", "D"]
 2
 3payoff = {
 4    ("C", "C"): (3, 3),
 5    ("C", "D"): (0, 5),
 6    ("D", "C"): (5, 0),
 7    ("D", "D"): (1, 1),
 8}
 9
10
11def find_pure_nash():
12    equilibria = []
13
14    for a in actions:
15        for b in actions:
16            score_a, score_b = payoff[(a, b)]
17
18            # Nếu An đổi chiến thuật một mình
19            other_a = "D" if a == "C" else "C"
20            alt_a = payoff[(other_a, b)][0]
21
22            # Nếu Bình đổi chiến thuật một mình
23            other_b = "D" if b == "C" else "C"
24            alt_b = payoff[(a, other_b)][1]
25
26            if score_a >= alt_a and score_b >= alt_b:
27                equilibria.append((a, b))
28
29    return equilibria
30
31
32print(find_pure_nash())

Kết quả:

1[('D', 'D')]

Xong Nash equilibrium.

Quá dễ.

Và nhân loại tuyệt vọng.

Nhưng may mắn thay, cuộc đời có một bug.

Chúng ta thường không chỉ gặp nhau một lần.

Khi ngày mai tồn tại, toán học thay đổi

Hãy tưởng tượng bạn mua cà phê ở cùng một quán mỗi sáng.

Bạn làm việc với cùng một đồng nghiệp nhiều năm.

Một công ty giao dịch với cùng một nhà cung cấp hàng trăm lần.

Một người bán hàng gặp lại cùng một khách hàng.

Một nhóm lập trình viên phải review code của nhau từ sprint này sang sprint khác.

Lúc này trò chơi không còn là:

1gặp → chơi → biến mất

mà thành:

 1gặp
 2 3chơi
 4 5nhớ
 6 7gặp lại
 8 9chơi tiếp
1011nhớ tiếp
1213...

Đây gọi là Repeated Game — trò chơi lặp lại.

Và chỉ bằng việc thêm một thứ rất nhỏ:

trí nhớ

toàn bộ cấu trúc quyền lực thay đổi.

Kẻ lươn vẫn có thể ăn bạn hôm nay.

Nhưng ngày mai bạn nhớ.

Và khi tương lai đủ quan trọng, món lợi 5 điểm hôm nay có thể không đáng để đổi lấy hàng trăm vòng 1 điểm về sau.

Bóng của tương lai

Trong Game Theory người ta thường dùng một hệ số:

$$ \delta $$

để biểu diễn chúng ta coi trọng tương lai đến mức nào.

Nếu:

$$ \delta \approx 0 $$

thì tôi gần như không quan tâm ngày mai.

Ăn được hôm nay thì ăn.

Nhưng nếu:

$$ \delta \approx 1 $$

thì tương lai rất quan trọng.

Giả sử An và Bình hợp tác mãi mãi.

Mỗi vòng được 3 điểm.

Giá trị của chuỗi tương lai là:

$$ 3 + 3\delta + 3\delta^2 + 3\delta^3 + … $$

hay:

$$ V_C = \frac{3}{1-\delta} $$

Bây giờ giả sử An nổi máu lươn.

An phản bội một lần, lấy 5 điểm.

Giả sử Bình đáp lại bằng Grim Trigger: sau lần phản bội ấy, Bình không hợp tác nữa. Đây là giả định hình phạt đang được dùng trong phép tính, không phải kết quả tự động của mọi trò chơi lặp lại.

An nhận:

$$ 5 + \delta + \delta^2 + \delta^3 + … $$

tức:

$$ V_D = 5 + \frac{\delta}{1-\delta} $$

Muốn An không phản bội:

$$ V_C \ge V_D $$

hay:

$$ \frac{3}{1-\delta} \ge 5 + \frac{\delta}{1-\delta} $$

Giải ra:

$$ \delta \ge 0.5 $$

Một con số khá thú vị.

Nếu tương lai đủ quan trọng, hợp tác không còn là đạo đức nữa.

Hợp tác trở thành hành vi ích kỷ hợp lý.

Đây là một ý tưởng rất khác:

Đừng xây xã hội bằng cách cầu mong tất cả mọi người trở thành thánh nhân. Hãy xây luật chơi sao cho ngay cả một kẻ ích kỷ cũng thấy tử tế là phương án có lợi.

Nhưng tử tế vô điều kiện thì vẫn chết

Bây giờ ta tạo một chiến thuật:

1Always Cooperate

hay:

Bất kể mày làm gì, tao vẫn tử tế.

Nghe rất đẹp.

Và cũng là món ăn yêu thích của:

1Always Defect

Kết quả sau 200 vòng:

$$ 0 \times 200 = 0 $$

cho người luôn hợp tác.

Còn kẻ luôn phản bội:

$$ 5 \times 200 = 1000 $$

điểm.

Đây là lý do mình không thích câu:

Cứ sống tốt rồi cuộc đời sẽ đối xử tốt với bạn.

Game Theory nhìn câu đó rồi hỏi:

Người đang chơi cùng bạn dùng chiến thuật nào?

Tử tế không có nghĩa là tắt não.

Tử tế mà không có khả năng phản ứng không phải chiến lược.

Nó chỉ là một nguồn tài nguyên chưa được khai thác.

Tit for Tat: tử tế nhưng có cây gậy sau lưng

Đây là lúc một chiến thuật cực kỳ đơn giản xuất hiện:

Tit for Tat — ăn miếng trả miếng.

Luật chỉ có hai dòng:

1Vòng đầu tiên: Hợp tác.
2
3Các vòng sau: Làm đúng thứ đối phương vừa làm với mình.

Nếu họ hợp tác:

1C → C

Ta hợp tác.

Nếu họ phản bội:

1D → D

Ta phản công.

Nếu sau đó họ quay lại hợp tác:

1C → C

Ta cũng lập tức bỏ qua.

Nó có thể viết bằng Python:

1def tit_for_tat(my_history, opponent_history):
2    if not opponent_history:
3        return "C"
4
5    return opponent_history[-1]

Hết.

Không neural network.

Không reinforcement learning.

Không GPU.

Không cần gọi 17 con agent họp rồi agent thứ 18 viết biên bản.

Chỉ cần nhớ một bit lịch sử.

Robert Axelrod từng tổ chức những giải đấu máy tính nổi tiếng về Iterated Prisoner’s Dilemma. Chiến thuật Tit for Tat do Anatol Rapoport gửi vào rất đơn giản: hợp tác ở vòng đầu, sau đó bắt chước hành động trước đó của đối thủ. Nó thắng giải đấu đầu tiên và tiếp tục thắng giải đấu tiếp theo. (U-M Personal Web Server)

Vì sao Tit for Tat đáng sợ?

Không phải vì nó hung dữ.

Mà vì nó có bốn tính chất rất đẹp.

1. Nice — không đánh trước

Tit for Tat không bao giờ là kẻ phản bội đầu tiên.

Nó bước vào mỗi quan hệ với giả định:

Tao cho mày một cơ hội.

Điều này rất quan trọng.

Nếu hai Tit for Tat gặp nhau:

1C C
2C C
3C C
4C C
5C C
6...

Hai bên cứ thế ăn 3 điểm mãi mãi.

Không ai cần thắng người kia.

Cả hai cùng giàu.

2. Provocable — nhưng đừng thử bắt nạt nó

Nếu đối phương chơi:

1D

Tit for Tat trả:

1D

ngay vòng tiếp theo.

Thông điệp rất rõ:

Tao tử tế, nhưng tao không miễn phí.

Đây là khác biệt giữa tử tếyếu đuối.

Một người không thể trả đũa thì sự hợp tác của họ không có trọng lượng chiến lược.

3. Forgiving — biết tha

Đây mới là phần hay.

Đối phương phản bội:

1D

Tit for Tat trả:

1D

Nhưng nếu đối phương quay lại:

1C

Tit for Tat cũng quay lại:

1C

Nó không ghi sổ:

1Ngày 17 tháng 4 năm 2013 mày đã nhìn tao hơi đểu.

rồi mang theo đến năm 2048.

Trừng phạt đủ để đối phương hiểu.

Sau đó tiếp tục hợp tác.

4. Clear — ai cũng hiểu nó

Một chiến thuật càng phức tạp càng khó để đối phương học cách hợp tác với bạn.

Tit for Tat cực kỳ rõ:

Chơi đẹp với tao, tao chơi đẹp với mày.

Chơi bẩn với tao, vòng sau tao chơi bẩn lại.

Mày dừng, tao dừng.

Không cần đọc Terms of Service 84 trang.

Trong các phân tích về giải đấu của Axelrod, những đặc điểm như nice, provocable, forgiving và clear thường được dùng để giải thích sức mạnh của Tit for Tat. (Open Michigan)

Cho mấy chiến thuật đánh nhau

Bây giờ vui hơn một chút.

Ta tạo sáu sinh vật:

  • Luôn tử tế — Always Cooperate.
  • Luôn lươn — Always Defect.
  • Tit for Tat.
  • Grim Trigger — phản bội tao một lần, tao ghim mày cả đời.
  • Suspicious Tit for Tat — vòng đầu tiên nghi ngờ và phản bội trước.
  • Random — thích gì làm nấy.

Code:

 1import random
 2
 3RNG = random.Random(42)
 4
 5
 6def cooperate(me, opponent):
 7    return "C"
 8
 9
10def defect(me, opponent):
11    return "D"
12
13
14def tit_for_tat(me, opponent):
15    return "C" if not opponent else opponent[-1]
16
17
18def grim_trigger(me, opponent):
19    return "D" if "D" in opponent else "C"
20
21
22def suspicious_tft(me, opponent):
23    return "D" if not opponent else opponent[-1]
24
25
26def random_strategy(me, opponent):
27    return RNG.choice(["C", "D"])

Hàm tính điểm:

 1PAYOFF = {
 2    ("C", "C"): (3, 3),
 3    ("C", "D"): (0, 5),
 4    ("D", "C"): (5, 0),
 5    ("D", "D"): (1, 1),
 6}
 7
 8
 9def play(strategy_a, strategy_b, rounds=200):
10    history_a = []
11    history_b = []
12
13    score_a = 0
14    score_b = 0
15
16    for _ in range(rounds):
17        action_a = strategy_a(history_a, history_b)
18        action_b = strategy_b(history_b, history_a)
19
20        pa, pb = PAYOFF[(action_a, action_b)]
21
22        score_a += pa
23        score_b += pb
24
25        history_a.append(action_a)
26        history_b.append(action_b)
27
28    return score_a, score_b

Cho mỗi chiến thuật gặp tất cả chiến thuật, kể cả chính nó, trong 200 vòng:

 1strategies = {
 2    "Always Cooperate": cooperate,
 3    "Always Defect": defect,
 4    "Tit for Tat": tit_for_tat,
 5    "Grim Trigger": grim_trigger,
 6    "Suspicious Tit for Tat": suspicious_tft,
 7    "Random": random_strategy,
 8}
 9
10totals = {name: 0 for name in strategies}
11
12for name_a, strategy_a in strategies.items():
13    for strategy_b in strategies.values():
14        score_a, _ = play(strategy_a, strategy_b)
15        totals[name_a] += score_a
16
17print(sorted(totals.items(), key=lambda item: item[1], reverse=True))

Với seed 42 và bộ payoff phía trên, kết quả có thể tái lập là:

Chiến thuật Tổng điểm
Tit for Tat 2931
Grim Trigger 2771
Always Cooperate 2736
Always Defect 2412
Random 2315
Suspicious Tit for Tat 2132

Đừng thần thánh hóa bảng này.

Đổi payoff, số vòng, tỷ lệ gặp nhau, mức độ noise hoặc thành phần quần thể thì thứ hạng có thể đổi.

Đây là một điểm rất quan trọng của Game Theory:

Không tồn tại chiến thuật “ngầu nhất vũ trụ” tách rời khỏi môi trường.

Một con cá mập là vua trong đại dương.

Thả nó giữa sa mạc thì nó trở thành miếng sashimi rất buồn.

Tại sao thằng lươn không thắng?

Always Defect nhìn rất bá đạo khi gặp Always Cooperate.

200 vòng:

$$ 1000 - 0 $$

Ăn no.

Nhưng gặp Tit for Tat:

1vòng 1: D C → 5
2vòng 2: D D → 1
3vòng 3: D D → 1
4vòng 4: D D → 1
5...

Nó chỉ ăn được đúng một cú đầu tiên.

Sau đó:

11
21
31
41
51
6...

Còn hai Tit for Tat gặp nhau:

13
23
33
43
53
6...

Kẻ lươn tối ưu giao dịch.

Tit for Tat tối ưu mối quan hệ.

Đó là hai bài toán hoàn toàn khác nhau.

Tử tế không thắng bằng cách đánh bại người khác

Có một điều rất ngược trực giác trong những giải đấu kiểu này.

Tit for Tat không cần đè đầu từng đối thủ.

Ví dụ TFT gặp TFT:

1600 : 600

Không ai thắng ai.

Nhưng cả hai đều mang 600 điểm về bảng xếp hạng.

Trong khi hai kẻ lươn gặp nhau:

1200 : 200

Hai thằng đều rất khôn.

Không thằng nào bị lợi dụng.

Không thằng nào chịu thiệt.

Và cả hai cùng nghèo.

Đây có lẽ là phần đẹp nhất của câu chuyện:

Bạn không nhất thiết phải làm người khác thua để mình thắng.

Trong nhiều trò chơi ngoài đời, payoff không phải zero-sum.

Miếng bánh có thể lớn lên.

Game Theory không chỉ nghiên cứu cách giành phần lớn nhất của chiếc bánh.

Nó còn hỏi:

Có chiến thuật nào khiến cả hai ngừng đập nhau và bắt đầu làm chiếc bánh lớn hơn không?

Axelrod cũng nhấn mạnh bài học tránh rơi vào chiếc bẫy zero-sum: trong nhiều tương tác, một bên có thể làm rất tốt bằng cách tạo ra hành vi giúp cả hai bên thay vì nhất thiết phải đánh bại đối phương. (Gerald R. Ford School of Public Policy)

Nhưng Tit for Tat cũng có một cái ngu

Giả sử hệ thống hoàn hảo.

A chơi:

1C

B nhìn đúng là:

1C

Không vấn đề.

Nhưng đời không sạch như RAM mới format.

Có:

  • hiểu nhầm,
  • network timeout,
  • email bị bỏ sót,
  • câu nói bị nghe sai,
  • nhân viên làm nhầm,
  • dữ liệu bị trễ,
  • một ngày ai đó đang đau bụng nên trả lời hơi cộc.

Giả sử hai Tit for Tat đang hợp tác:

1A: C C C C C
2B: C C C C C

Bỗng một lỗi khiến A vô tình phát ra:

1D

B vòng sau trả đũa:

1D

A thấy B vừa D nên trả:

1D

B lại thấy A D:

1D

Và hai con người vốn không hề ghét nhau bắt đầu một cuộc chiến kéo dài chỉ vì một bit bị lật.

Rất đời.

Generous Tit for Tat: đôi khi nên giả ngu

Một biến thể là Generous Tit for Tat.

Luật gần giống TFT.

Nhưng khi đối phương vừa phản bội, thay vì chắc chắn trả đũa, ta có một xác suất nhỏ bỏ qua.

Ví dụ:

 1def generous_tft(me, opponent, forgiveness=0.1):
 2    if not opponent:
 3        return "C"
 4
 5    if opponent[-1] == "C":
 6        return "C"
 7
 8    if random.random() < forgiveness:
 9        return "C"
10
11    return "D"

Nghe có vẻ yếu hơn.

Nhưng trong môi trường nhiều noise, khả năng tha thứ này có thể phá vỡ vòng lặp trả đũa.

Đây là một ý tưởng khá sâu:

Một hệ thống quá công bằng theo nghĩa “mày đánh tao một cái, tao phải đánh lại đúng một cái” đôi khi có thể tự tạo ra chiến tranh vô hạn.

Thỉnh thoảng, để hệ thống ổn định, một bên phải chấp nhận:

Ừ thôi, chắc nó lag.

Grim Trigger: người không bao giờ quên

Có một chiến thuật khác:

1Tao hợp tác với mày.
2
3Nhưng chỉ cần mày phản tao đúng một lần...
4
5Từ nay đến khi mặt trời nuốt Trái Đất:
6
7D.

Đó là Grim Trigger.

Code:

1def grim_trigger(me, opponent):
2    if "D" in opponent:
3        return "D"
4
5    return "C"

Chiến thuật này tạo deterrence rất mạnh.

Không ai muốn phản bội vì hình phạt quá lớn.

Nhưng nó có vấn đề:

một lỗi nhỏ có thể phá hủy cả mối quan hệ vĩnh viễn.

Trong hệ thống hoàn hảo, Grim Trigger rất đáng sợ.

Trong thế giới thực đầy noise, nó giống một người chặn Facebook bạn vì năm 2017 bạn quên thả tim ảnh sinh nhật họ.

Một nghịch lý nữa: biết chính xác ngày kết thúc có thể giết hợp tác

Giả sử hai người chơi đúng 100 vòng, cả hai biết chắc điều đó, biết rằng đối phương cũng biết, và mô hình giả định họ lý trí hoàn hảo.

Cả hai đều biết vòng 100 là vòng cuối.

Ở vòng 100:

Không còn ngày mai.

Vậy phản bội là tối ưu.

Nhưng nếu cả hai biết vòng 100 sẽ phản bội, hãy nhìn vòng 99.

Sau vòng 99 chỉ còn vòng 100 mà kiểu gì cũng phản bội.

Vậy vòng 99 cũng nên phản bội.

Lùi tiếp:

1100 → D
299  → D
398  → D
497  → D
5...
61   → D

Đây là backward induction — quy nạp ngược.

Và ta nhận một kết quả vừa logic vừa hơi điên:

Trong mô hình chuẩn với thời hạn hữu hạn và các giả định trên, logic kéo sự phản bội từ vòng cuối ngược về tận vòng đầu tiên.

Đây là kết quả của mô hình, không phải dự đoán rằng người thật ngoài đời luôn phản bội ngay từ đầu. Chỉ cần có bất định về thời điểm kết thúc, lý trí hữu hạn, sai số hoặc ưu tiên khác trong payoff, hành vi có thể đổi.

Trong đời thực, chúng ta thường không biết lần tương tác nào sẽ là lần cuối.

Và chính sự mơ hồ ấy tạo ra cái Axelrod gọi là shadow of the future — bóng của tương lai.

Giải đấu thứ hai của Axelrod cũng đưa yếu tố này vào bằng xác suất trò chơi kết thúc sau mỗi lượt, thay vì cho người chơi biết chính xác số vòng. (U-M Personal Web Server)

Vậy làm sao thắng mà không phải trở thành kẻ xấu?

Sau tất cả toán học phía trên, mình rút nó về năm dòng.

Mặc định hợp tác

Đừng bước vào mọi mối quan hệ với:

Chắc chắn thằng này sẽ lừa mình.

Nếu hai người cùng nghĩ vậy:

$$ (D,D) $$

xuất hiện trước khi bất kỳ ai kịp làm điều gì xấu.

Tử tế trước là một cách mở cánh cửa cho trạng thái:

$$ (C,C) $$

Nhưng phải có khả năng trả đũa

Nếu người kia có thể lấy:

$$ 5 $$

mỗi lần bằng cách cho bạn:

$$ 0 $$

mà chẳng gặp hậu quả nào, không có lý do chiến lược để họ dừng lại.

Một hệ thống hợp tác bền vững cần biên giới.

Không nhất thiết phải hung dữ.

Nhưng phải có.

Trả đũa tương xứng

Một cú D không cần trả bằng 47 cú D.

Nếu mục tiêu là khôi phục hợp tác, hình phạt phải đủ để thay đổi incentive chứ không phải đủ để thỏa mãn cơn tức.

Đây là khác biệt giữa:

trừng phạt

và:

trả thù.

Trừng phạt nhìn về tương lai.

Trả thù sống trong quá khứ.

Biết tha thứ

Một chiến thuật không có đường quay lại C cuối cùng sẽ biến mọi lỗi thành chiến tranh.

Con người không phải packet TCP hoàn hảo.

Có noise.

Có hiểu nhầm.

Có những ngày CPU trong đầu chạy 100%.

Nếu người kia quay lại hợp tác, đôi khi việc tốt nhất là cho hệ thống reset.

Hãy dễ đoán

Đừng lúc C lúc D không ai hiểu nổi.

Danh tiếng thực ra là một dạng API documentation cho hành vi.

Người khác nên biết:

1Nếu chơi đẹp với người này → mọi thứ ổn.
2
3Nếu chơi bẩn → sẽ có giá.
4
5Nếu sửa sai → có đường quay lại.

Một người như vậy dễ hợp tác hơn rất nhiều so với một người mạnh nhưng thất thường.

Tử tế có state

Nếu phải gom toàn bộ bài này vào một câu, mình sẽ viết:

Always Cooperate là lòng tốt không có bộ nhớ. Tit for Tat là lòng tốt có state.

Một hệ thống máy tính stateless nhận request nào cũng như request đầu tiên.

Một người quá hiền đôi khi cũng vậy.

Hôm qua bị lừa.

Hôm nay:

1history = []

Lại từ đầu.

Tit for Tat giữ state:

1history = ["C", "C", "D"]

Nó không dùng lịch sử để nuôi hận.

Nó dùng lịch sử để điều chỉnh hành vi.

Khác nhau rất lớn.

Không phải cứ tử tế là thắng

Cũng cần nói rõ điều này.

Game Theory không chứng minh rằng:

Người tốt luôn thắng.

Nếu bạn chỉ gặp đối phương đúng một lần, khả năng bị trả đũa bằng 0, danh tiếng không tồn tại và không có cơ chế thực thi, chiến thuật lươn có thể cực kỳ lời.

Nếu môi trường gồm toàn Always Cooperate, một Always Defect bước vào sẽ ăn rất béo.

Ngược lại, nếu hệ thống gồm phần lớn những agent biết nhớ, biết phản ứng và tương tác lặp lại, việc lươn lẹo trở nên đắt đỏ.

Vì thế câu hỏi không chỉ là:

Người này tốt hay xấu?

Mà còn là:

Luật chơi đang thưởng cho loại hành vi nào?

Đây mới là câu hỏi đáng sợ.

Một tổ chức có thể tuyển toàn người tốt nhưng thiết kế incentive ngu và cuối cùng sinh ra hành vi xấu.

Một marketplace có thể đầy người xa lạ nhưng với reputation, escrow, review, penalty và repeated interaction phù hợp, người ta lại hợp tác được.

Đạo đức cá nhân quan trọng.

Nhưng kiến trúc incentive cũng quan trọng không kém.

Nash không dạy chúng ta làm người tốt

Nash equilibrium không có đạo đức.

Nó không biết yêu thương.

Nó cũng không biết ai tốt, ai xấu.

Nó chỉ lạnh lùng hỏi:

Với cách những người khác đang chơi, mày có muốn đổi nước đi không?

Và đôi khi câu hỏi lạnh lùng đó lại dẫn tới một kết luận rất người:

Muốn sự tử tế tồn tại lâu dài, đừng chỉ dạy con người phải tử tế. Hãy tạo ra một thế giới nơi tử tế không đồng nghĩa với làm mồi.

Một cộng đồng tốt không phải nơi không ai có khả năng đánh trả.

Đó là nơi:

  • người ta bắt đầu bằng hợp tác,
  • phản bội có giá,
  • trả đũa có giới hạn,
  • sai lầm có thể sửa,
  • và tương lai đủ dài để hai bên nhận ra rằng cùng nhau kiếm 3 điểm mãi mãi ngon hơn cướp 5 điểm một lần rồi ngồi ăn 1 điểm đến già.

Tit for Tat nghe rất hổ báo khi dịch là ăn miếng trả miếng.

Nhưng phần quan trọng nhất của nó không phải chữ trả.

Mà là nước đi đầu tiên:

1C

Tao tử tế trước.

Nhưng nước đi thứ hai cũng quan trọng không kém:

1Nếu cần, tao sẽ nhớ.

Có lẽ đó là một trong những định nghĩa đẹp nhất của sự tử tế trưởng thành:

Không tìm cách làm hại người khác. Không cho phép người khác kiếm lời bằng cách liên tục làm hại mình. Và khi cuộc chiến không còn cần thiết, biết đặt cây gậy xuống.

Tổng kết

Prisoner’s Dilemma cho ta một kết quả khá buồn: trong trò chơi một lần, phản bội có thể là chiến thuật hợp lý và trạng thái hai bên cùng phản bội chính là cân bằng Nash.

Nhưng khi trò chơi được lặp lại, trí nhớ và tương lai xuất hiện, incentive thay đổi hoàn toàn.

Tit for Tat đưa ra một công thức đơn giản đến hơi ngáo:

1Tử tế trước.
2Ai đấm thì đấm lại.
3Người ta dừng thì mình dừng.
4Xong.

Nó không phải chiến thuật hoàn hảo trong mọi môi trường. Noise, số vòng, payoff và thành phần quần thể đều có thể thay đổi kết quả.

Nhưng ý tưởng trung tâm vẫn rất đáng nhớ:

Đừng hiền đến mức người khác kiếm tiền từ việc bắt nạt mình.

Và cũng đừng khôn đến mức mọi người đều học được rằng tốt nhất là không bao giờ hợp tác với mình.

Thắng một ván bằng cách lươn có thể rất dễ.

Khó hơn nhiều là xây một chiến thuật khiến người khác muốn tiếp tục chơi với mình trong một nghìn ván tiếp theo.

Tham khảo

Bình luận