Không gian tự học dành cho sinh viên UET

Chào mừng đến với UETệ

Tìm bài giảng theo học phần, hiểu lại những kiến thức nền và ôn tập theo nhịp học của bạn.

Bài giảng
Đọc Notes, ôn nhanh với Slides và luyện tập qua các bài có lời giải.
Wiki kiến thức
Tra cứu thuật ngữ và bổ sung kiến thức nền ngay khi cần.
Góc học tập
Ôn bằng flashcard, lưu ghi chú và hẹn giờ tập trung.

Bạn có thể xem lại phần giới thiệu ở cuối trang.

Buy me a coffee

Website hoàn toàn miễn phí. Nếu thấy hữu ích, bạn có thể tặng tôi một cốc cà phê theo thông tin dưới đây nhé!

Mã QR chuyển khoản Momo
Ngân hàng
Momo
Tên người nhận
MOMO - TKTH DO MINH TRI
Số tài khoản
01MMTTT0060405229
Skip to content

PageRank: Mô hình & tính toán

Bài 3Cập nhật 11/10/2026Ghi chú của bạn

Học phần Giải thuật nền tảng của Khoa học dữ liệu, học kỳ 1 năm học 2026–2027.

Tài liệu đi cùng bộ trang chiếu Bài 03. Các lời giải bài tập được gập để người học thử tính trước khi đối chiếu.


1. Giới thiệu bài học ​

Một công cụ tìm kiếm phải chọn và sắp xếp các trang phù hợp với truy vấn. Nội dung trang giúp đánh giá mức phù hợp. Cấu trúc liên kết cung cấp thêm tín hiệu về tầm quan trọng của trang. PageRank xây dựng điểm từ cấu trúc này, không tự đo mức phù hợp với từng truy vấn.

Bài học bắt đầu từ một bốn trang có thể tính tay. Từ phép chia điểm theo liên kết, ta xây dựng mô hình xử lý được nút cụt và bẫy liên kết. Sau đó chuyển phép tính sang dạng thưa và chia khối. Phần chi phí giải thích việc chia nhỏ tiết kiệm bộ nhớ ở đâu và vì sao thêm máy chưa chắc giảm thời gian theo cùng tỷ lệ.

Sau bài học, sinh viên cần lập được liên kết và một vòng cập nhật. Giải thích điều kiện hội tụ và dừng. Mô tả Map, Combine, Reduce. Tính các chi phí cơ bản. Và cài đặt, kiểm thử phiên bản Python. Kiến thức sử dụng gồm , phép nhân ma trận–véc tơ, xác suất cơ bản và mô hình MapReduce của Bài 02.


2. Bài toán Xếp hạng trang web ​

Đầu vào và đầu ra. Đầu vào là G=(V,E), với n=|V| trang và m=|E| liên kết. Cạnh j→i nghĩa là trang j trỏ tới trang i. Hai liên kết cùng nguồn cùng đích được gộp thành một cạnh. Đầu ra là một điểm ri≥0 cho mỗi trang và thứ tự giảm dần theo điểm (cho phép đồng hạng). Quy ước chuẩn hóa là r1+r2+⋯+rn=1, viết gọn thành ∑i=1nri=1: Chỉ số i chạy qua tất cả trang. Lưu ý rằng tổng bằng 1 chưa xác định duy nhất cách chấm điểm, bởi nhiều véc tơ khác nhau đều thỏa mãn điều kiện này. Quy tắc chấm điểm cụ thể là nội dung của phần 3.

Ví dụ chuẩn xuyên suốt bài giảng. Ta dùng bốn trang trong Hình 5.1 của giáo trình MMDS, n=4, m=8: A trỏ tới B, C, D. B trỏ tới A, D. C trỏ tới A. D trỏ tới B, C.

Đồ thị bốn trang: A tới B, C, D. Trang B tới A, D. Trang C tới A. Trang D tới B, C
Đồ thị bốn trang: A tới B, C, D. Trang B tới A, D. Trang C tới A. Trang D tới B, C

Bậc ra (số liên kết đi khỏi trang) lần lượt là dA=3, dB=2, dC=1, dD=2. này đủ nhỏ để chạy tay từng bước, và cả bài sẽ quay lại nó ở mô hình, thuật toán, chia khối và chi phí.

Thử nghiệm đầu tiên: Đếm liên kết vào. Trên ví dụ, A, B, C, D đều có đúng 2 liên kết vào, nên chuẩn hóa cho mỗi trang 28=14, dẫn đến cả bốn trang đều đồng hạng. Cách đếm này có hai hạn chế rõ: Nó coi mọi liên kết ngang giá trị, dù liên kết từ C (chỉ trỏ một nơi) khác liên kết từ A (trỏ ba nơi), và nó không lan truyền tầm quan trọng: Một trang được trỏ bởi trang quan trọng đáng lẽ phải quan trọng hơn.

Từ đếm sang chia điểm. Ta cho mỗi trang một lượng điểm rồi để trang nguồn chia đều điểm của mình cho các đích theo bậc ra, thay vì chỉ đếm cạnh vào. Khởi tạo mỗi trang 14 điểm. A chia cho ba đích: Mỗi đích nhận (14)/3=112. B và D chia cho hai đích, mỗi cạnh mang 18. C chuyển cả 14 cho A.

Cộng tại đích và một vòng hoàn chỉnh. Mọi trang tính đồng thời từ điểm cũ: A chỉ nhận từ B và C, được 18+14=38. B nhận 112 từ A và 18 từ D, được 524. Tương tự C và D đều 524. Tổng 38+3×524=1, không mất không thêm. Sau một vòng, A đứng trước B, C, D đồng hạng, khác biệt hoàn toàn với kết quả đồng hạng của cách đếm liên kết vào, vì C chuyển toàn bộ điểm cho A.

Ba điểm phương pháp luận cần giữ:

  1. Mọi đóng góp xác định bởi điểm cũ và bậc ra của nguồn, không phải bậc vào của đích.
  2. Đồng bộ: Không dùng điểm mới của trang này khi tính trang khác trong cùng vòng.
  3. Một vòng chưa phải PageRank. Quy tắc hiện tại còn hai lỗ hổng: Chưa xử lý trang không có liên kết ra, và chưa bảo đảm việc lặp hội tụ trên mọi . Phần 3 xử lý cả hai.

3. Mô hình và thuật toán PageRank ​

Ma trận liên kết và phép lặp truyền điểm ​

M0. Ta hình thức hóa phép chia điểm bằng đại số tuyến tính. Đặt dj là bậc ra của trang j. Ma trận liên kết M0 cỡ n×n được định nghĩa theo cột: Giá trị (M0)ij=1/dj nếu có cạnh j→i và dj>0, bằng 0 trong trường hợp còn lại. Quy ước này quan trọng: Cột j là trang nguồn, hàng i là trang đích. Với bốn trang (thứ tự hàng/cột A, B, C, D):

M0=(01210130012130012131200)

Cột A là (0,13,13,13)T: A chia cho ba đích và không tự giữ điểm. Cạnh đi vào A nằm ở hàng A, không nằm ở cột A. Khi lập từ hình, hãy kiểm tra rõ hàng đích và cột nguồn. Trang không có liên kết ra được biểu diễn bằng cột toàn 0. Ta chưa thực hiện phép chia cho không, phần 3 sẽ xử lý trường hợp này riêng.

Phép lặp thô. Điểm là véc tơ cột r với ri≥0, ∑iri=1. Khởi tạo đều r0=(1/n,…,1/n)T. Chỉ số t đếm số bước đã thực hiện. Khi mọi trang đều có liên kết ra, một vòng là:

rt+1=M0rt.

Nhân –véc tơ thực hiện đồng thời "chia tại nguồn, cộng tại đích": Thành phần i của M0r là ∑j:j→irj/dj. Trên ví dụ: r1=(924,524,524,524)T, khớp đúng bảng chia điểm của phần 2.

Điểm ổn định và mối liên hệ với . Điểm ổn định là véc tơ không đổi qua cập nhật, r∗=M0r∗, tức trong ngôn ngữ đại số tuyến tính, đây chính là véc tơ riêng ứng với giá trị riêng bằng 1 của ma trận có tổng mỗi cột bằng 1. Giáo trình MMDS trình bày PageRank qua quan điểm này. Với mục đích tính toán, ta không cần khử hay tính giá trị riêng, mà lặp nhân ma trận–véc tơ tới khi véc tơ ít thay đổi. Ở quy mô lớn, ta tận dụng các phần tử khác 0 thay vì lưu và xử lý toàn bộ ma trận đặc. Phần 4 xây dựng cách tổ chức đó.

Một quan sát trên ví dụ. Hai hàng B và C của M0 giống hệt nhau nên rB=rC ở mọi vòng. Lập luận quy nạp đơn giản cho thấy rD cũng bằng chúng. Giới hạn của ví dụ có nghiệm dạng: Điểm rA=39=13 và rB=rC=rD=29. Đáng chú ý: rB=rC=rD là hệ quả của khởi tạo đều và quy tắc cập nhật trên này, không phải do ba nút đối xứng về cấu trúc, bởi C chỉ có 1 liên kết ra trong khi B, D có 2. Điểm số đo tổng khối lượng nhận được, không đo bậc.

Giới hạn của phép lặp thô. Không thể kết luận phép lặp hội tụ trên mọi chỉ từ điều kiện tổng cột bằng 1. Chẳng hạn, một đồ thị có thể khiến điểm dao động theo chu kỳ. Web còn có nút cụt và nhóm trang không có liên kết ra ngoài. Ta sẽ bổ sung bước nhảy và xử lý nút cụt, rồi chứng minh hội tụ cho mô hình đầy đủ dưới đây.

Nút cụt, bước nhảy và phép cập nhật đầy đủ ​

Nút cụt làm mất điểm. Xóa cạnh C→A khỏi ví dụ: C trở thành nút cụt (không còn liên kết ra, nhưng vẫn nhận cạnh vào). Cột C của M0 toàn 0, nên điểm cũ của C không đóng góp cho đích nào. Từ r0 đều, một vòng lặp thô cho (324,524,524,524)T, tổng 1824=34: Mất đúng 14 điểm của C. Lặp tiếp, tổng điểm giảm dần về 0, tức tầm quan trọng bị "rò rỉ" dần khỏi đồ thị. (Biến thể này là Hình 5.3, biến thể dead trong mã thực hành.)

Bẫy liên kết dồn điểm. Thay C→A bằng khuyên C→C (Hình 5.6, biến thể trap): C có bậc ra 1 nên tổng điểm vẫn được giữ, nhưng người đã đến C không bao giờ rời C nếu chỉ đi theo liên kết. Phép lặp thô trên này dồn toàn bộ điểm về C. Một bẫy tổng quát là tập trang có liên kết ra nhưng không có cạnh ra khỏi tập.

Bước nhảy và bù nút cụt. Mô hình đầy đủ sửa cả hai lỗi bằng cách bổ sung hành vi của người lướt ngẫu nhiên. Mỗi bước, với xác suất β người lướt đi theo một liên kết ra (chia đều), với xác suất 1−β nhảy đều tới một trang bất kỳ trong n trang, kể cả trang hiện tại. Điều kiện 0<β<1, ví dụ tính tay dùng β=45. Riêng cho nút cụt: Trong nhánh theo liên kết, điểm của nút cụt được phân phối lại đều cho cả n trang. Đặt δt=∑j:dj=0rjt là tổng điểm các nút cụt và u=(1/n,…,1/n)T, quy tắc cập nhật đầy đủ là:

rit+1=β∑j:j→irjtdj+(1−β)+βδtn.

Dạng véc tơ tương đương:

rt+1=βM0rt+((1−β)+βδt)u.
Điểm từ nút cụt được phân phối lại đều tới cả bốn trang
Điểm từ nút cụt được phân phối lại đều tới cả bốn trang

Lưu ý về dạng công thức có xử lý nút cụt (Dead ends): Nếu chỉ áp dụng công thức taxation thuần túy v′=βMv+(1−β)e/n trên còn cột 0 mà thiếu số hạng tái phân bổ βδ, thì khi gặp nút cụt, tổng xác suất toàn mạng sẽ bị suy giảm và nhỏ hơn 1. Quy chuẩn chuẩn hóa trong bài giảng này áp dụng nguyên lý: Tái phân bổ đều lượng xác suất tại nút cụt kết hợp bước nhảy ngẫu nhiên ở mọi nút. Nhờ đó, điểm số PageRank qua các vòng lặp luôn bảo toàn tính chất của một phân phối xác suất hợp lệ với tổng bằng 1.

Vết tính một vòng, β=45, r0 đều.

  • gốc (không nút cụt, δ=0):
    • A: 45⋅38+120=720.
    • B, C, D: 45⋅524+120=1360.
    • Tổng bằng 1.
  • Biến thể nút cụt (δ0=14): Thành phần chung (15)+(15)4=110.
    • A: 45⋅18+110=15.
    • B, C, D: 45⋅524+110=415.
    • Tổng lại bằng 1, tức điểm của C được hoàn lại đầy đủ qua phần bù.
  • Biến thể trap một vòng, zC nhận từ A, C và D: zC=112+14+18=1124, nên rC=45⋅1124+120=512. A 320, B, D 1360. Tổng 320+1360+512+1360=1.

Bảo toàn khối lượng. Nếu rt không âm, tổng 1 thì rt+1 cũng vậy: Nguồn không cụt cộng lại góp β(1−δ), phần bù trả lại βδ, bước nhảy góp 1−β. Tổng ba phần bằng 1 và mọi hệ số không âm. Đây là bất biến dùng để kiểm chương trình ở phần 6.

Hội tụ. Đặt S là M0 với mỗi cột nút cụt thay bằng u. S≥0 và mỗi cột tổng 1, và phép cập nhật viết được F(r)=βSr+(1−β)u. Đo khoảng cách bằng ∥x−y∥1=∑i|xi−yi|. Với mọi véc tơ thực v:

∥Sv∥1≤∑i∑jSij|vj|=∥v∥1,

vì mỗi cột của S có tổng 1. Suy ra ∥F(x)−F(y)∥1≤β∥x−y∥1 (phần bước nhảy triệt tiêu trong hiệu), nên với Δt=∥rt+1−rt∥1 ta có Δt≤βtΔ0. Với q>p: ∥rq−rp∥1≤∑j=pq−1Δj và Δj≤βpΔ01−β→0, tức dãy lặp là dãy Cauchy. Giới hạn r∗ vẫn không âm và có tổng bằng 1 (các điều kiện này được giữ khi lấy giới hạn), F liên tục nên r∗=F(r∗). Hai điểm bất động bất kỳ phải cách nhau d thỏa d≤βd, tức d=0: Nghiệm duy nhất.

Khai triển chi tiết: Khai triển chi tiết: Cận hậu nghiệm (đọc thêm)

Sai số so với nghiệm bị chặn bởi:

∥rt+1−r∗∥1≤∑j=t+1∞Δj≤β1−βΔt.

Lưu ý Δt=∥rt+1−rt∥1 đo vòng sau, còn cận nói về rt+1. Và trên máy tính số dấu phẩy động, kết luận đúng cho số thực lý tưởng còn phép so sánh cần dung sai.

Thuật toán và dừng. Vào: Danh sách kề, n≥1, 0<β<1, ngưỡng τ>0, giới hạn Tmax nguyên dương. Mỗi vòng: Tính δ từ véc tơ cũ, đặt phần chung cho mọi trang, cộng đóng góp từng cạnh, tính Δt=∑i|rit+1−rit|, thay r. Dừng khi Δt≤τ (trạng thái đạt ngưỡng) hoặc hết Tmax (trạng thái chưa đạt, kèm véc tơ và Δ cuối). Lưu ý τ là ngưỡng độ thay đổi giữa hai vòng, không đồng nhất sai số so với nghiệm. Ví dụ với Δ1=225=0,08 và τ=0,1 thuật toán dừng sau vòng thứ hai. Vòng đầu có Δ0=110+3⋅130=15>0,1. Mỗi vòng quét n+m phần tử.


4. Tính PageRank trên đồ thị lớn: Biểu diễn thưa và MapReduce theo khối ​

Vấn đề quy mô. Quy tắc cập nhật không đổi, nhưng với web thật n rất lớn trong khi số liên kết thường nhỏ hơn nhiều so với số cặp trang có thể có: đặc cần n2 ô trong khi thông tin thật chỉ là m cạnh. Khi m≪n2, phần áp đảo của ma trận là 0. Cần hai việc: Biểu diễn thưa và chia việc sao cho mỗi tác vụ chỉ giữ phần dữ liệu vừa bộ nhớ chính (RAM).

Biểu diễn theo nguồn (MMDS 5.2.1). Vì giá trị khác không của cột j luôn là 1/dj, chỉ cần lưu cho mỗi nguồn: Mã nguồn, bậc ra toàn cục dj, và danh sách đích. Trên ví dụ:

  • A: 3→B, C, D.
  • B: 2→A, D.
  • C: 1→A.
  • D: 2→B, C.

Nút cụt vẫn giữ bản ghi với dj=0, danh sách rỗng, điều này rất cần cho pha tính δ. Bậc ra ở đây là bậc toàn cục, không phải số đích trong một khối cụ thể. Ghi sai bậc sẽ làm sai mọi đóng góp từ nguồn đó.

Chia khối (MMDS 5.2.3–5.2.4). Đặt z=M0r. Vb là tập trang nguồn thuộc dải b. Chia r và z thành k dải, M0 thành k2 khối: Khối Mab chứa cạnh từ nguồn dải b tới đích dải a. Nếu chỉ chia theo cột, mỗi tác vụ có thể phải cộng vào toàn bộ véc tơ kết quả. Chia thêm theo hàng giới hạn cả miền vào lẫn miền ra. Trên ví dụ với k=2 (nguồn A, B | C, D):

  • M11 ghi A→B, B→A.
  • M21 ghi A→C, A→D, B→D.
  • M12 ghi C→A, D→B.
  • M22 chỉ ghi D→C (C không trỏ tới C hay D).

Bậc toàn cục dA=3 được lặp lại ở cả hai khối có cạnh của A. Mỗi cạnh thuộc đúng một khối theo cặp (nguồn, đích).

Ma trận chia thành bốn khối theo hai dải nguồn và hai dải đích
Ma trận chia thành bốn khối theo hai dải nguồn và hai dải đích

Map, Combine, Reduce. Map nhận khối Bab và dải điểm rb:

text
Map(B_ab, r_b):
  với mỗi (j, dj, dests) trong B_ab:
    với mỗi i trong dests:
      yield(i, r_b[j] / dj)

Combine(i, values):
  yield(i, sum(values))

Khóa là trang đích. Combine cộng các đóng góp cùng khóa ngay tại tác vụ Map, giảm dữ liệu phải chuyển. Reduce hoàn thiện:

text
Reduce(i, L_i):
  z_i = sum(L_i)
  return(i, beta * z_i + (1 - beta + beta * delta) / n)

Hai chi tiết quan trọng.

  1. δ tính một lần từ phân hoạch nguồn (mỗi nút cụt góp đúng một lần), rồi gửi tới các tác vụ Reduce, tránh tính lại δ từ các khối có bản ghi nguồn lặp.
  2. Tạo bản ghi (i,0) cho mọi trang từ danh sách trang, để đích không có liên kết vào nào vẫn xuất hiện khi nhóm theo khóa và nhận phần chung.

Ví dụ gộp tại A. gốc, r0 đều, β=45, k=2: Khối M11 sinh (A,18) (cạnh B→A), M12 sinh (A,14) (cạnh C→A). zA=18+14=38. rA1=45⋅38+120=720, hoàn toàn trùng khớp với phép tính một máy của phần 3.

Tính đúng. Mọi tác vụ dùng cùng bản chụp cố định của r trong suốt một vòng (véc tơ không đổi khi đang được đọc), nên:

∑b=1k ∑j∈Vb: j→irjdj=∑j: j→irjdj.

Mỗi cạnh đóng góp đúng một lần vì nó thuộc đúng một khối. Combine và Reduce chỉ tái nhóm các tổng. Trên số thực chính xác kết quả bằng phép cập nhật tuần tự. Trên số dấu phẩy động, thứ tự cộng khác nhau gây chênh làm tròn nhỏ — không khẳng định tính kết hợp tuyệt đối của số thực máy.

Tổ chức một vòng. Các pha: Dùng r cố định → Map song song trên k2 khối (pha δ có thể chạy song song nhưng phải xong trước Reduce) → Combine tại chỗ → truyền và nhóm theo khóa → Reduce → tổng hợp Δ để quyết định dừng. Lưu ý k2 là số tác vụ, không phải số máy. Với k=2, bốn tác vụ có thể chạy trên hai máy. Biến thể gộp cả một hàng khối vào một tác vụ (Map đọc cả v, Reduce chỉ nối kết quả) nằm ở MMDS 5.2.5 để đọc thêm.


5. Chi phí: Lưu trữ, bộ nhớ, dữ liệu và thời gian ​

Phần này đánh giá cách tổ chức tính theo khối bằng các đại lượng riêng biệt của mô hình chi phí đầu vào tác vụ trong MMDS 2.5.1. Trong đó, I là tổng byte đầu vào các tác vụ Map, H là tổng byte đầu vào các tác vụ Reduce và C=I+H cho một công việc có Combine nằm trong Map. Các số byte dưới đây được tính theo quy ước định dạng của mô hình, không phải kích thước đối tượng Python hay số đo thực nghiệm. Tham số gồm n trang, m liên kết, k dải mỗi chiều và p máy.

Dung lượng lưu đĩa S. Quy ước: Giá trị điểm 8 byte (double), mã trang hoặc bậc ra 4 byte (số nguyên 32 bit).

  • đặc: Sdense=8n2 byte.
  • Danh sách liên kết (mã nguồn ngầm): Sadj≈4(n+m), gồm n bậc ra cộng m mã đích. Mô hình bỏ qua phần phụ trội của định dạng và lưu trữ.
  • Với n=4, m=8: 128 và 48 byte. Tỷ số xấp xỉ 2n2/(n+m), có lợi khi m≪n2.
  • Con số 48 byte là của biểu diễn toàn cục. Biểu diễn theo khối lặp lại bậc ra và mã nguồn ở nhiều khối, nên không gán nó cho Sblocks.

Bộ nhớ một tác vụ B. Tác vụ khối đọc tuần tự qua bộ đệm. Nó giữ hai dải véc tơ (dải vào rb và dải tích lũy za), mỗi dải n/k giá trị 8 byte (giả sử k chia hết n):

Btask≈16nk+Bbuf.

Với n=4, k=2: Bộ nhớ cần 2⋅2⋅8=32 byte cộng bộ đệm đọc khối Bbuf. Việc tăng k giúp giảm bộ nhớ mỗi tác vụ nhưng làm tăng số lần mỗi dải được đọc (mỗi dải phục vụ k tác vụ), đây là sự đánh đổi xuất hiện lại ở phần đầu vào.

Đầu vào Map I. I=Sblocks+8kn: Phần mỗi khối đọc một lần. Phần véc tơ, mỗi dải rb được gửi tới k tác vụ cùng cột nên toàn véc tơ được đọc k lần, mỗi lần 8n byte. Với ví dụ n=4, m=8, k=2: Bảy bản ghi nguồn (phân bổ 2, 2, 2, 1 trên bốn khối. Định dạng nguồn 4 byte + bậc 4 byte + mỗi đích 4 byte) cho Sblocks=8⋅7+4⋅8=88 byte. Véc tơ 8⋅2⋅4=64 byte. I=152 byte. I chưa gồm các pha δ, kiểm tra Δ và điều phối. ví dụ không có nút cụt và mọi đích có liên kết vào, nên không cần bản ghi seed hay δ trong bài tính cốt này.

Combine và H: Khi không dùng Combine: Có m=8 bản ghi (khóa 4 + giá trị 8 = 12 byte) → H=96 byte. Khi có Combine: Có q=7 bản ghi khóa (chỉ khối M21 gộp hai đóng góp vào D thành một) → H=84 byte. Do đó C=I+H giảm từ 248 xuống 236 byte. Mức giảm 12 byte tương ứng 12,5% của H, chứ không phải 12,5% toàn bộ thời gian chạy. Đây chỉ là phép nhân theo khối trong một vòng, chưa phải tổng chi phí cả luồng công việc.

Phân biệt C với Q. Q là số byte thực sự đi qua mạng. Nó chỉ bằng H nếu mọi bản ghi ra Map đều qua mạng, không nén, không chạy lại, không phần phụ trội. Dữ liệu khối thường nằm cục bộ, nên I=Q không suy ra được từ dữ kiện. Nếu toàn bộ 7 bản ghi sau Combine qua mạng: Lượng dữ liệu Q=84 byte và Tshuffle≥Q/beff với beff là băng thông hiệu quả tổng hợp (byte/giây).

Thời gian. Mô hình: Mỗi cạnh tốn ce giây, bỏ I/O, truyền và lập lịch trong pha tính. Tổng việc W=m⋅ce=8ce không đổi theo số máy. Thời gian xử lý các khối tương ứng là:

  • M11 tốn 2ce,
  • M21 tốn 3ce,
  • M12 tốn 2ce,
  • M22 tốn 1ce.

Một máy tuần tự: 8ce. Bốn máy, mỗi máy một tác vụ: Tmap=3ce (tác vụ nặng nhất là nút cổ chai), tăng tốc 83, chứ không phải 4. Gọi wmax là thời gian của tác vụ nặng nhất. Khi tác vụ không bị chia nhỏ thêm: Tmap≥max(W/p, wmax).

Một vòng và cả công việc. Giả định các pha không chồng nhau:

Tround≈Tδ+Tmap+Tshuffle+Treduce+Tsync.

Tδ đo pha tính tổng điểm nút cụt. Tshuffle đo pha truyền và nhóm. Treduce đo pha gộp kết quả. Tsync đo pha kiểm tra dừng và đồng bộ.

Với L vòng: Tjob=Tsetup+∑t=1LTround,t. Nếu pha δ chạy đồng thời Map, dùng max của hai thời gian thay vì tổng. L phụ thuộc tiêu chí dừng (τ, Tmax), không mặc định cố định. Lưu ý phân biệt: Quét n+m phần tử một vòng trên một máy là mô hình phép toán. ce giây mỗi cạnh và W=mce là mô hình thời gian theo tác vụ — hai cách đếm khác phạm vi và đơn vị, không cộng lẫn.


6. Thực hành: Chạy mã pagerank.py ​

Tệp mã pagerank.py (đi kèm hướng dẫn chạy) cài đặt đúng mô hình phần 3 bằng Python 3, chỉ dùng thư viện chuẩn (argparse, json, math, sys) — không cần pip. Mục đích là kiểm chứng công thức trên một máy, không phải đo hiệu năng hay chứng minh tăng tốc. Không dùng bốn nút để suy kết luận về song song hóa.

Biểu diễn dữ liệu và giao diện. là dict từ tên nút sang danh sách đích:

python
adj = {
    "A": ["B", "C", "D"],
    "B": ["A", "D"],
    "C": ["A"],
    "D": ["B", "C"],
}

Hàm pagerank(adj, beta=0.8, tol=1e-8, max_iter=100) trả về dict gồm rank (điểm từng nút), converged (trạng thái đạt ngưỡng), iterations (số vòng), delta (độ thay đổi cuối). Điều kiện vào: n≥1. Mọi đích là khóa của dict. Cạnh trùng được gộp trong bản sao (hàm không sửa dữ liệu vào). 0<β<1. tol dương. max_iter nguyên dương. Toàn bộ nút được giữ, kể cả nút không có liên kết vào hay nút cụt — nút cụt phải có mặt để tính phần bù.

Mã một vòng. Hàm step dịch trực tiếp quy tắc cập nhật:

python
def step(adj, r, beta):
    n = len(adj)
    delta = sum(r[j] for j in adj if not adj[j])
    common = (1.0 - beta + beta * delta) / n
    new = {i: common for i in adj}
    for j, targets in adj.items():
        if not targets:
            continue
        share = beta * r[j] / len(targets)
        for i in targets:
            new[i] += share
    return new

delta ở đây là δt (tổng điểm nút cụt, tính từ véc tơ cũ). common là phần chung ((1−β)+βδ)/n, cấp sẵn cho mọi nút nên đích không có liên kết vào vẫn nhận điểm. Nút cụt bỏ qua vòng chia vì điểm của nó đã vào phần bù. Vector r chỉ được đọc. Điểm mới nằm hoàn toàn trong dict trả về. Lưu ý hai đại lượng cùng họ tên trong tệp: delta trong step là δ, còn delta trong vòng lặp là Δ=∑i|rit+1−rit| — hai phạm vi khác nhau.

Vòng lặp và dừng. Khởi tạo r0 đều 1/n. Mỗi vòng gọi step, tính Δ, thay r, dừng khi Δ≤τ. Nếu hết max_iter chưa đạt ngưỡng, kết quả kèm trạng thái chưa đạt, số vòng và Δ cuối.

Lệnh chạy. Từ thư mục gốc dự án:

bash
python materials/lec-03/code/pagerank.py --variant base --beta 0.8 --tol 1e-8 --max-iter 100

Đổi --variant thành dead hoặc trap cho hai biến thể. Đầu ra là JSON: rank, converged, iterations, delta, rank_sum.

Kết quả chạy với các tham số trên.

  • Với base, beta=0.8, tol=1e-8: Đạt ngưỡng sau 20 vòng, rA≈0,321429, rB=rC=rD≈0,226190 (nghiệm chính xác lần lượt là 928 và 1984), Δ cuối ≈5,50×10−9, tổng điểm 1.0.
  • Với dead: 12 vòng.
  • Với trap: 34 vòng, C chiếm ≈0,642.

Sai khác làm tròn nhỏ có thể xuất hiện giữa môi trường chạy. Số vòng không phải hằng số để học thuộc — nó phụ thuộc τ và β.

Ba lớp kiểm chứng.

  1. Bất biến: tổng điểm xấp xỉ 1, mọi giá trị không âm.
  2. Một bước tính tay: base từ r0 đều, β=0,8 cho rA=720, rB=rC=rD=1360. dead cho 15 và 415 — khớp bảng phần 3.
  3. Trường hợp biên trong README: toàn bộ nút cụt (δ=1, mỗi vòng trả lại phân phối đều, không lỗi chia không) và nút có khuyên lên chính nó. So sánh số thực dùng dung sai abs(got - want) <= 1e-12, không dùng ==.

Các lỗi cần kiểm tra khi cài đặt. Cập nhật trực tiếp r[i] += ... khi quét cạnh làm trộn điểm cũ và điểm mới. Bỏ nút không có liên kết vào trước khi chạy làm mất nút khỏi kết quả. Dùng == so sánh float. Ba lỗi này đều trái với bất biến và quy tắc đồng bộ đã nêu.


7. Bài tập tự luyện ​

Bốn bài sau giữ nguyên đề và của MMDS. Làm trước khi xem gợi ý.

Bài 1 — MMDS 5.1.1 (trang 187–188, Hình 5.7): PageRank không bước nhảy ​

Tính PageRank của từng trang trong Hình 5.7, không có bước nhảy.

Hình 5.7: a→a,b,c. b→a,c. c→b,c — bảy cạnh, có khuyên ở a và c.

Hình 5.7: Trang a trỏ tới a, b, c. Trang b trỏ tới a, c. Trang c trỏ tới b, c. Đồ thị có bảy cạnh, trong đó có hai khuyên
Hình 5.7: Trang a trỏ tới a, b, c. Trang b trỏ tới a, c. Trang c trỏ tới b, c. Đồ thị có bảy cạnh, trong đó có hai khuyên

Gợi ý

Đặt a,b,c cũng là điểm của ba trang. Viết theo cột nguồn, lập hệ cân bằng r=Mr kèm điều kiện chuẩn hóa, rồi giải bằng khử tuyến tính.

Lời giải

Cột nguồn: Cột a là (13,13,13), cột b là (12,0,12), cột c là (0,12,12). Hệ cân bằng:

a=a3+b2,b=a3+c2,c=a3+b2+c2,a+b+c=1.

Từ phương trình đầu: a−b2=a3⇒b=4a3.

Thế vào phương trình hai: b=a3+c2, suy ra c=2b−2a3=2a.

Tổng: a+4a3+2a=13a3=1, nên:

a=313,b=413,c=613.

Kiểm phương trình ba: 113+213+313=613. Hai phương trình đầu thỏa trực tiếp. Tổng ba điểm bằng 1.

Bài 2 — MMDS 5.1.2: Thêm bước nhảy với hệ số 0,8 ​

Tính PageRank của từng trang trong Hình 5.7 với β=0,8.

Gợi ý

không có nút cụt nên δ=0 và phần chung là (1−β)/3=115. Cần giải r=45M0r+1151 với a+b+c=1. Thay c=1−a−b để còn hai ẩn.

Lời giải

Hai phương trình đầu (nhân 15):

15a=4a+6b+1 ⇒ 11a−6b=1;15b=4a+6c+1.

Thay c=1−a−b:

15b=4a+6−6a−6b+1⟹2a+21b=7

Nhân phương trình đầu với 7, phương trình sau với 2 rồi cộng: 77a+4a=7+14⇒81a=21, nên:

a=727=2181.

Tiếp tục: b=11a−16=23181−16=2581. c=1−a−b=3581.

Kiểm phương trình của c:

45(781+25162+35162)+115=45⋅74162+115=148405+27405=3581.

Tổng: 21+25+3581=1.

So sánh hai bài: Bước nhảy san phẳng điểm, kéo c từ 613≈0,462 xuống 3581≈0,432 và nâng a lên.

Bài 3 — MMDS 5.2.1 (trang 195): Ngưỡng lưu ma trận thưa ​

Boolean n×n có thể lưu đặc bằng từng bit, hoặc thưa bằng liệt kê tọa độ các ô 1 — mỗi tọa độ là một cặp số nguyên, mỗi số ⌈log2⁡n⌉ bit. Ma trận phải thưa đến mức nào (tỷ lệ ô 1) để cách liệt kê tiết kiệm chỗ hơn?

Gợi ý

Gọi m là số ô 1. Viết dung lượng hai cách theo bit, lập bất đẳng thức, chú ý điểm bằng nhau chưa phải là tiết kiệm.

Lời giải

Cách đặc: n2 bit.

Cách thưa: m ô 1, mỗi ô cần hai số nguyên, mỗi số ⌈log2⁡n⌉ bit, tổng 2m⌈log2⁡n⌉ bit.

Điều kiện tiết kiệm:

2m⌈log2⁡n⌉<n2⟺ρ=mn2<12⌈log2⁡n⌉.

Tại điểm bằng nhau hai cách tốn như nhau nên điều kiện phải là bất đẳng thức ngặt. Với n=1, ⌈log2⁡n⌉=0 và mô hình tọa độ suy biến. So sánh chỉ có nghĩa từ n≥2. Kết luận là điều kiện theo n, không cần dữ liệu cụ thể khác.

Bài 4: Biểu diễn đồ thị theo danh sách kề (Bài tập 5.2.2) ​

Dùng phương pháp mục 5.2.1, lập bảng (Nguồn, Bậc ra, Danh sách đích) cho: (a) Hình 5.4. (b) Đồ thị Hình 5.7.

Đồ thị Hình 5.4: A tới B, C, D. Trang B tới A, D. Trang C tới E. Trang D tới B, C, còn E không có cạnh ra
Đồ thị Hình 5.4: A tới B, C, D. Trang B tới A, D. Trang C tới E. Trang D tới B, C, còn E không có cạnh ra

Hình 5.7 đã cho ở Bài 1.

Gợi ý

Mỗi nguồn ghi bậc ra toàn cục rồi toàn bộ danh sách đích. Nguồn không có liên kết ra vẫn được liệt kê với bậc 0. Khuyên cũng là một cạnh và tính vào bậc ra.

Lời giải

Hình 5.4 (A→B, C, D. B→A, D. C→E. D→B, C. E không có liên kết ra, gồm 8 cạnh):

NguồnBậc raĐích
A3B, C, D
B2A, D
C1E
D2B, C
E0(rỗng)

Hình 5.7 (a→a, b, c. B→a, c. C→b, c, gồm 7 cạnh tính cả 2 khuyên):

NguồnBậc raĐích
a3a, b, c
b2a, c
c2b, c

Bài này chỉ yêu cầu biểu diễn, không yêu cầu tính PageRank. Tổng bậc ra là 8 và 7, khớp số cạnh hai hình. Lưu ý Hình 5.7 có 5 cạnh giữa các nút khác nhau cộng 2 khuyên, tổng 7 cạnh, cần lưu ý không đếm khuyên hai lần.


8. Hướng dẫn chấm bài tập ​

BàiTiêu chí đánh giáĐiểm
Bài 1 liên kết M đúng dạng theo cột nguồn3
Hệ phương trình cân bằng và điều kiện chuẩn hóa tổng3
Khử tuyến tính và tính ra các giá trị a,b,c2
Kiểm nghiệm lại phương trình và điều kiện tổng 12
Bài 2Mô hình có bước nhảy và xác định đúng phần bù chung 1153
Lập và giải hệ phương trình tuyến tính4
Kiểm nghiệm và kết luận độ san phẳng điểm số3
Bài 3Viết đúng biểu thức dung lượng cho 2 cách lưu trữ4
Thiết lập bất đẳng thức và suy ra ngưỡng mật độ ρ4
Phân tích điều kiện ngặt và trường hợp biên n≥22
Bài 4Lập đúng bảng cho Hình 5.4 (kèm nút cụt E)4
Lập đúng bảng cho Hình 5.7 (đếm đúng 2 khuyên)4
Ghi rõ nguồn hình và đối chiếu tổng bậc ra2
Tổng điểm10

9. Đọc thêm và tài liệu tham khảo ​

  • J. Leskovec, A. Rajaraman, J. D. Ullman, Mining of Massive Datasets, 3rd ed., Cambridge University Press. Chương 5 (Link Analysis), mục 5.1.2–5.1.7 trang 178–188, mục 5.2 trang 189–195. Chương 2, mục 2.5.1 trang 53–54 cho mô hình chi phí. Xem thêm tại MMDS.
  • Slide MMDS, tệp ch05-linkanalysis1.pdf, trang chiếu 42 và 52. Stanford CS246, tệp 09-pagerank.pdf, trang chiếu 45 và 54: Phân phối điểm nút cụt, nguồn của phần bù βδ.
  • Tệp mã thực hành: materials/lec-03/code/pagerank.py và materials/lec-03/code/practice-README.md.

Quay về bộ trang chiếu.

Ảnh & sơ đồ
100%
Ảnh tài liệu được phóng to