1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo đồ án trí tuệ nhân tạo: Xây dưng chương trình nhận dạng số viết tay dùng mạng noron

20 1,1K 6

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 401,76 KB

Nội dung

CHƯƠNG 1: CĂN BẢN VỀ MẠNG NEURAL 1. Lý thuyết : 1.1. Cấu trúc mạng Nơron : + Mạng Nơron một tầng : Một mạng Nơron một tầng gồm S nơron được cho bởi hình dưới đây. Chú ý rằng mỗi môt đầu vào của R đầu vào được nối với mỗi Nơron và do đó trọng số W bây giờ là ma trận cấp SxR. Tầng mạng bao gồm ma trận trọng số, các bộ tổng, véctơ bias b, các hộp hàm truyền và véctơ đầu ra a. Ở đây : p = [p1, p2, p3, ..., pR]TRx1; b = [b1 b2 .... bS]TSx1 n = [n1 n2 .... nS]TSx1 ; a = [a1 a2 .... aS]TSx1 ; a = f(n) = [f(n1) f(n2) .... f(ns)]TSx1 at = f(nt) = f(wt.p + bt). t = 1...S. trong đó Wt =[wt1 wt2 ..... wtR] là hàng thứ t của W. + Mạng nơron nhiều tầng Đối với mạng Nơron nhiều tầng, mỗi tầng có ma trận trọng số W riêng của nó, có véctơ bias b riêng. Khi đó các đầu ra của tầng thứ i bất kỳ không phải là tầng cuối cùng là đầu vào của tầng thứ i+1. Dưới đây là một mô hình mạng nhiều tầng (ví dụ 3 tầng) : 1.2.Perceptron đa lớp và giải thuật lan truyền ngược (BP) a. Mạng Perceptron đa lớp : Ta xét ví dụ mạng Perceptron 3 lớp sau : Đầu ra của lớp thứ nhất là đầu vào của lớp thứ hai và đầu ra của lớp thứ hai là đầu vào của lớp thứ ba. Mỗi một tầng có thể có số lượng các nơron khác nhau, thậm chí là cả hàm truyền khác nhau. Tầng nhận tín hiệu gọi là tầng vào và tầng cuối cùng gọi là tầng ra. Các tầng giữa hai tầng này gọi là tầng ẩn. Việc chọn số lượng các nơron của các tầng và số tầng cho mạng là tương đối động, ta sẽ chọn tùy thuộc vào từng bài toán cụ thể. Thông thường, ta chỉ cần chọn số tầng từ 2 đến 3 là đủ để huấn luyện mọi bài toán phân lớp. Số nơron của tầng vào khoảng bằng một nửa số thuộc tính của đầu vào và số nơron của đầu ra bằng số chiều của vectơ đầu ra của mạng. Trong bài toán cụ thể của chúng tôi, chúng tôi đã dùng số nơron là 1 hoặc 5 cho lớp thứ nhất và 1 nơron cho lớp thứ hai để so sánh độ chính xác của mạng.

Trang 1

HỌC VIỆN KỸ THUẬT QUÂN SỰ

KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO MÔN HỌC TRÍ TUỆ NHÂN TẠO

Giáo viên hướng dẫn: Ngô Hữu Phúc

HÀ NỘI 3/2010

Trang 2

CHƯƠNG 1: CĂN BẢN VỀ MẠNG NEURAL

1 Lý thuyết :

1.1 Cấu trúc mạng Nơron :

+ Mạng Nơron một tầng :

Một mạng Nơron một tầng gồm S nơron được cho bởi hình dưới đây Chú ý rằng mỗi môt đầu vào của R đầu vào được nối với mỗi Nơron và do đó trọng số W bây giờ là ma trận cấp SxR

Tầng mạng bao gồm ma trận trọng số, các bộ tổng, véctơ bias b, các hộp hàm truyền

và véctơ đầu ra a

Ở đây : p = [p1, p2, p3, , pR]TRx1;

b = [b1 b2 bS]TSx1

n = [n1 n2 nS]TSx1 ; a = [a1 a2 aS]TSx1 ;

a = f(n) = [f(n1) f(n2) f(ns)]TSx1

at = f(nt) = f(wt.p + bt) t = 1 S

trong đó Wt =[wt1 wt2 wtR] là hàng thứ t của W

+ Mạng nơron nhiều tầng

Đối với mạng Nơron nhiều tầng, mỗi tầng có ma trận trọng số W riêng của nó, có véctơ bias b riêng Khi đó các đầu ra của tầng thứ i bất kỳ không phải là tầng cuối cùng là đầu vào của tầng thứ i+1

Dưới đây là một mô hình mạng nhiều tầng (ví dụ 3 tầng) :

Trang 3

1.2.Perceptron đa lớp và giải thuật lan truyền ngược (BP)

a Mạng Perceptron đa lớp :

Ta xét ví dụ mạng Perceptron 3 lớp sau :

Đầu ra của lớp thứ nhất là đầu vào của lớp thứ hai và đầu ra của lớp thứ hai là đầu vào của lớp thứ ba Mỗi một tầng có thể có số lượng các nơron khác nhau, thậm chí là cả hàm truyền khác nhau Tầng nhận tín hiệu gọi là tầng vào và tầng cuối cùng gọi là tầng ra Các tầng giữa hai tầng này gọi là tầng ẩn Việc chọn số lượng các nơron của các tầng và số tầng cho mạng là tương đối động, ta sẽ chọn tùy thuộc vào từng bài toán cụ thể Thông thường, ta chỉ cần chọn số tầng từ 2 đến 3 là đủ để huấn luyện mọi bài toán phân lớp Số nơron của tầng vào khoảng bằng một nửa số thuộc tính của đầu vào và số nơron của đầu ra bằng số chiều của vectơ đầu ra của mạng Trong bài toán cụ thể của chúng tôi, chúng tôi đã dùng số nơron là 1 hoặc 5 cho lớp thứ nhất và 1 nơron cho lớp thứ hai để so sánh độ chính xác của mạng

b.Giải thuật lan truyền ngược :

Bước 1 : Truyền giá trị đầu vào xuôi theo mạng

Khởi tạo : Các nơron ở tầng thứ nhất nhận các giá trị đầu vào bên ngoài

a0 = p

Đối với mạng có M lớp thì đầu ra mỗi tầng là đầu vào của tầng tiếp theo, do vậy ta có công thức biểu diễn các thao tác này là :

am+1 = fm+1(Wm+1am+bm+1) với m=0,1, ,M-1.

Bước 2 : Truyền độ nhạy ngược lại trong mạng :

Độ nhạy được tính từ tầng cuối cùng là lan truyền ngược lại cho đến tầng đầu :

Trang 4

theo công thức :

trong đó :

Một số Heuristics cho giải thuật lan truyền ngược :

 Cập nhật theo chế độ tuần tự (online) hay batch (epoch) :

Thường việc học theo chế độ tuần tự giúp BP hội tụ nhanh hơn, đặc biệt khi dữ liệu lơn và dư thừa

 Chuần hóa giá trị đầu ra :

Đảm bảo giá trị đầu ra nằm trong miền giá trị của hàm chuyển trên các nơron đầu ra tương ứng

 Chuẩn hóa giá trị đầu vào :

Đảm bảo giá trị trung bình gần 0 hoặc nhỏ so với độ lệch tiêu chuẩn

Các giá trị tốt nhất phải độc lập với nhau

 Khởi tạo giá trị trọng số

 Kết thức sớm :

Khi liên tiếp n epoch traning mà không có sự cải thiện đáng kể lỗi hay không có sự thay đổi đáng kể của các trọng số

 Tốc độ học :

Tốc độ học của các Nơron nên đều nhau Vì vậy nơron tầng sau (thường có gradient lớn hơn tầng trước) nên có tốc độ học nhỏ hơn tầng trước, Nơron có ít input nên có tốc độ học lớn hơn Nơron có nhiều input

 Kiểm tra chéo :

Tách tập dữ liệu làm hai tập độc lập (training and testing) Tỷ lệ thường là 2/3:1/3 Thực hiện việc học trên tập trainining và kiểm tra khả năng khái quát hóa của mạng trên tập testing

4.2 Mạng BackPropagation

4.2.1 Giới thiệu chung

Mạng lan truyền ngược đôi khi còn được coi như là mạng đa tầng hướng tiến (feedforward)

Trang 5

Hiện nay được sử dụng rộng rãi trong mô hình mạng Neuron.Mạng lan truyền ngược đạt được tính tổng quát bởi vì kỹ thuật cơ bản trong lan truyền ngược là cập nhật trọng số theo hướng giảm gradient

Một mạng lan truyền tổng quát là mạng có n (n > 2) lớp: Lớp thứ nhất gọi là lớp vào, lớp thứ n là lớp ra, và (n-2) là lớp ẩn Trong mạng lan truyền mỗi nút ở lớp thứ i (0 < i < n) liên kết với nút ở lớp thứ (i+1) và các nút trong cùng một lớp không liên kết với nhau.Mỗi cung trong mạng được gắn một trọng số W ¿ R

Mạng lan truyền chỉ có thể ở 1 trong 2 trạng thái: trạng thái lan truyền và trạng thái học Trạng thái lan truyền, thông tin lan truyền từ lớp nhập đến lớp xuất Trạng thái học, thông tin lan truyền theo hai chiều nhiều lần để học các trọng số.Trạng thái lan truyền, mạng xử lý mỗi lần một mẫu

Trước tiên giá trị của các biến độc lập chuyển tới các nút vào của mạng Các nút của lớp vào không tính toán gì cả Các nút của lớp ẩn tính tổng trọng hóa của tất cả các dữ liệu bằng cách cộng dồn tất cả các tích giữa giá trị nút ẩn với trọng số của cung liên kết giữa nút nhập

và nút ẩn

Kế tiếp, một hàm truyền được áp dụng trên tổng trọng hóa này cùng với ngưỡng của nút ẩn nào đó để cho ra giá trị thực cho nút ẩn Sau khi nén tổng trọng hóa của nó, đến lượt mình, mỗi nút ẩn sẽ gửi đến tất cả các nút của lớp ra

Mỗi nút của lớp ra thực hiện các công việc tương tự như đã thực hiện trong nút ẩn để cho ra giá trị của nút xuất Giá trị của các nút xuất chính là giá trị thực, nghĩa là giá trị của các biến phụ thuộc cần xác định

Bản chất ánh xạ do mạng thực hiện tùy thuộc vào giá trị các trọng số trong mạng Lan truyền ngược là một phương pháp cho phép xác định tập trọng số tốt nhất trong mạng giải quyết một bài toán được cho Việc áp dụng phương pháp lan truyền ngược là một quá trình lặp đi lặp lại nhiều lần hai tiến trình: Lan truyền tiến và lan truyền ngược sai số Hai tiến trình này được áp dụng trên tập mẫu xác định Ta gọi chung tiến trình này là luyệng mạng hay còn gọi là học

Quá trình luyện mạng được bắt đầu với các giá trị trọng số tùy ý, có thể là các số ngẫu nhiên và tiến trình lặp đi lặp lại Mỗi lần lặp được gọi là một thế hệ Trong mỗi thế hệ, mạng điều chỉnh các trọng số sao cho sai số giảm dần (sai số là độ lệch giữa các kết xuất thực và kết xuất đích) Tiến trình điều chỉnh nhiều lần giúp cho trọng số dần đạt được tập hợp các giá trị tối ưu Thường mạng cần thực hiện nhiều thế hệ trước khi việc luyện mạng hoàn tất

Để cập nhật trọng số trong mỗi thế hệ, mạng phải xử lý tất cả các mẫu trong tập mẫu Đối với từng mẫu, mạng thực hiện phép toán sau đây:

Trang 6

Trước tiên, mạng thực hiện quá trình lan truyền tiến, nghĩa là mạng ánh xạ các biến nhập của mẫu hiện hành các giá trị xuất như đã trình bày ở trên, sử dụng các giá trị của trọng số hiện hành Ở các thế hệ đầu, các kết xuất thường chưa chính xác vì các trọng số ban đầu chưa

có gì là đúng

Kế tiếp sai số được tính dựa trên giá trị kết xuất và giá trị đích Trên cơ sở sai số tính toán được, mạng sẽ cập nhật lại các trọng số theo nguyên tắc lan truyền ngược sai số gọi là giai đoạn lan truyền ngược

Như vậy, để học một mẫu, mạng thi hành hai bước: Lan truyền tiến – thực hiện ánh xạ và lan truyền ngược sai số - cập nhật lại các trọng số

4.2.2 Nội dung giải thuật lan truyền ngược

Để huấn luyện cho mạng Neuron nhiều lớp bằng giải thuật lan truyền ngược, thường gọi

là mạng Neuron lan truyền ngược, cần phải có một tập mẫu học {Xs, Ys} Mỗi đầu vào Xs sẽ được lan truyền từ lớp vào cho tới lớp ra, quá trình lan truyền này sẽ tạo ra đầu ra Os của mạng Giá trị đầu ra này thường có sai số so với giá trị đầu ra mong muốn Ys tương ứng với mỗi mẫu học Xs Các sai số sẽ được tính và lan truyền ngược từ lớp ra về các lớp phái trước

để cập nhật lại các trọng số liên kết giữa các Neuron của các lớp

Để tiện minh họa về quá trình lan truyền ngược trong mạng lan truyền hướng tiến nhiều tầng, chúng ta hãy khảo sát mạng 3 lớp có kiến trúc sau:

Kiến trúc mạng được tóm tắt như sau:

 Mạng có 3 lớp Neuron:

- Lớp vào có m Neuron, ký hiệu xi (i=1 m)

- Lớp ẩn có l Neuron, ký hiệu pj (j=1 l)

- Lớp ra có n Neuron, ký hiệu ok (k=1 n)

 Mỗi Neuron ở lớp sau được liên kết đầy đủ với các Neuron ở lớp trước bởi các trọng số w, liên kết được thể hiện bằng các đường nét liền

 Sự lan truyền ngược các sai số phát sinh được thể hiện bằng các đường nét đứt

 Sự lan truyền ngược các sai số phát sinh được thể hiện bằng các đường nét đứt

 Không sử dụng hệ số bias

 Hàm kích hoạt trong các Neuron là hàm sigmoid đơn cực

4.2.2.1 Giải thuật lan truyền ngược

Khi mạng muốn học một mẫu học (X, Y) trong đó X là các vectơ tín hiệu đầu vào và Y là các vectơ tín hiệu đầu ra mong muốn Các thành phần xi của X sẽ được đưa vào các Neuron

Trang 7

tương ứng của lớp vào Vì các Neuron của lớp vào chỉ có trách nhiệm nhận tín hiệu vào, không có bất kỳ xử lý nào, cho nên đầu ra của các Neuron lớp vào cũng chính là các giá trị xi Các tín hiệu đầu ra của lớp vào sẽ được truyền cho các Neuron của lớp ẩn Vì các Neuron lớp vào liên kết với các Neuron lớp ẩn bởi các trọng số wịj cho nên mỗi Neuron thứ j của lớp

ẩn sẽ nhận được tổng tín hiệu đầu vào có trọng số netj được tính theo công thức:

i=1

m

w ij x i

Sau khi nhận được tổng tín hiệu vào có trọng số netj, hàm kích hoạt (hay còn gọi là hàm truyền) sẽ được sử dụng để biến đổi tạo ra tín hiệu ra của các Neuron ẩn Giả sử hàm truyền sigmoid đơn cực (ký hiệu là g()) được dùng để xử lý các tín hiệu vào của mỗi Neuron thì tín hiệu ra zj của mỗi Neuron j được tính như sau:

z j=g(net j)=g( ∑

i=1

m

w ij x i)

Các tín hiệu ra zj cùng với các trọng số liên kết wjk lại tiếp tục được truyền cho Neuron thứ k của lớp ra:

net k=∑

j=1

l

w jk z j

Tín hiệu ra ok của mỗi Neuron thứ k của lớp ra sẽ là:

o k=g(net k)=g( ∑

j=1

l

w jk z j)

Như vậy, với đầu vào là vectơ X, sau khi lan truyền tiến qua mạng, ta sẽ nhận được đầu ra

là vectơ O Tín hiệu đầu ra O này không thể trung khớp hoàn toàn với tín hiệu đầu ra mong muốn Y Sai số tổng thể E của mạng được tính dựa trên sai lệch giữa O và Y theo công thức bình phương:

2∑

k =1

n

(y ko k)2

Để điều chỉnh cho các tín hiệu ra ok tiến gần đến các tín hiệu yk, các trọng số liên kết giữa các Neuron cần được cập nhật lại Theo quy tắc Delta (hay còn gọi là phương pháp giảm theo hướng dốc nhất), các trọng số liên kết từ Neuron thứ j tại lớp ẩn tại Neuron thứ k tại lớp ra được cập nhật theo công thức:

wjk= wjk+ Δwwjk

Biến thiên trọng số Δwwjk của các trọng số liên kết w

jk được tính như sau:

Trang 8

Δwwjk= η.δk.zj

với:

-  là hệ số học

- zj là đầu ra của Neuron thứ js

- δk là sai số mà Neuron thứ k phải chịu trách nhiệm, được xác định theo công

thức:

δ k=E k g ,(net k)

Ở đây: Ek là đạo hàm của hàm lỗi E(Ek = ok - yk), netk là tổng tín hiệu vào có trọng số của Neuron thứ k và g, () là đạo hàm của hàm kích hoạt g() được dùng trong các Neuron Nếu

hàm g() là hàm sigmoid đơn cực thì g,( x)=g( x)(1−g( x)) Vậy công thức trên sẽ viết lại

là:

δ k=(y ko k).( ok).(1−o k)

Các trọng số liên kết từ Neuron i tại lớp vào tới Neuron j tại lớp ẩn cũng được hiệu chỉnh theo cách mà các trọng số liên kết từ Neuron thứ j tại lớp ẩn tới Neuron thứ k của lớp ra, tuy nhiên sai số mà các Neuron ở lớp ẩn phải chịu trách nhiệm sẽ được tính theo cách khác:

wij= wjj+ Δwwjj

Với: Δwwjj= η.δj.xi

Do đầu ra của các Neuron lớp vào chính là đầu vào của mạng nên trong công thức trên viết là xi (chứ không phải zj)

Ta biết rằng một Neuron j ở lớp ẩn được liên kết đầy đủ với các Neuron k ở lớp ra Như vậy nó phải chịu trách nhiệm đối với các sai số của mỗi Neuron k ở lớp ra Tổng sai số mà Neuron thứ j phải chịu trách nhiệm là:

δ j=g ,(net j)∑

k=1

n

w jk δ k

hay

δ j=z j(1−z j) ∑

k=1

n

w jk δ k

Thao tác cập nhật các trọng số wij, wjk được coi là lan truyền ngược sai số

Các thao tác lan truyền tiến, tính sai số và lan truyền ngược sai số sẽ được lặp lại nhiều lần cho đến khi thảo mãn một điều kiện nào đấy của sai số, hoặc đủ một số lần quy định nào đấy thì sẽ dừng lại Quá trình này chính là nội dụng của giải thuật truyền ngược

Trang 9

4.2.2.2 Thuật toán

Trên đây, chúng ta đã nghiên cứu về giải thuật lan truyền ngược áp dụng cho mạng Neuron 3 lớp Nội dung tổng quát của giải thuật lan truyền ngược cho mạng Neuron nhiều lớp có thể được viết lại như sau:

Đầu vào: Tập mẫu học được cung cấp dưới dạng {x=(x1, x2,…,xs) và y=(y1,y2,…,ys)} với

số lượng mẫu là M, số lớp mạng là T

Đầu ra: Các ma trận trọng số w1, w2, …, wm

Bước 1:

Khởi tạo: Chọn giá trị hệ số học 0 < η < 1 và giá trị cực đại sai số cho phép ε Mạng có số lớp là T Và số lần huấn luyện h Tùy thuộc vào số lượng các Neuron lớp vào, số lượng lớp ẩn và số lượng Neuron trên lớp ra mà chúng ta sẽ khởi tạo các ma trận trọng số với các thành phần là các giá trị ngẫu nhiên rất nhỏ

Khởi tạo m = 1 (mẫu học thứ m), h = 1 (lần huấn luyện thứ h), q = 1 (lớp 1)

Bước 2: Đưa mẫu huấn luyện thứ m vào mạng.

Bước 3: Lan truyền xuôi tín hiệu đầu vào lần lượt qua các lớp Neuron cho đến khi q > T (từ

lớp ẩn thứ nhất, qua lớp ẩn thứ hai,… đến lớp đầu ra) để tính đầu ra tương ứng tại các lớp theo công thức:

o q j

=g(net q j

)=g( ∑

i=1

s

w ij q o i q−1

)

đối với Neuron thứ j thuộc lớp q, 1 < q < T

Bước 4: Tính sai số ở lớp ra của mạng theo công thức:

δ k=(y ko k).ok (1−o k)

Bước 5: Lan truyền ngược tín hiệu sai số (từ đầu ra, qua lớp ẩn cuối cùng,…, đến lớp ẩn đầu

tiên) để cập nhật trọng số cũng như tín hiệu sai số trước đó theo công thức:

δ q−1 j

=g ,

(net q−1 j

) ∑

k =1

n

w q jk δ k q

Trong đó:

wq jk= wq jk+ Δwwq jk Δwwq jk= η.δk q.oi q−1

Bước 6: Nếu m < M (chưa hết số mẫu học) thì m = m+1 quay lại bước 2, ngược lại chuyển

sang bước 7

Bước 7: Sai số trung bình của mạng được tính theo công thức:

Trang 10

RMS= √ ∑

m=1

M

k=1

n

(y kmo km)2

M ×n

Trong đó n là số thành phần của vectơ ra

Nếu RMS < ε thì kết thúc Ngược lại gán h = h+1 rồi lặp lại các bước từ bước 2 đến bước 7, bắt đầu một chu kỳ học mới Ta thấy:

 Trong quá trình chuyển thẳng các tham số mạng là cố định, ngược lại trong quá trình lan truyền ngược các tham số này được hiệu chỉnh và cập nhật để mạng có thể nhận dạng các mẫu đã học một cách chính xác

 Có nhiều yếu tố ảnh hưởng đến quá trình huấn luyện mạng đó là: hàm truyền, hàm sai

số E, hệ số học α và các tham số khởi tạo Do đó ta cần lưu ý trong việc lựa chọn các yếu tố này sao cho phù hợp

4.2.2.3.Sơ đồ thuật toán

Trang 11

Bộ mẫu, T,

h=1 q=1,m=1 Xim, Yim

q im X

  

s

i

q im

q ij

q jm

q

jm g net g w o

o

1

1

q > T q=q+1

km km km km

  

n k

q km

q jk

q j

q

1

, 1

q km

q jk

q

q<=2

M<m

n M

o y

M

m

n

k

km km

 

 1  1

2

KT

T

h=h+1 F

m=m+1

q=q-1

T F

T F

Trang 12

T: Số tầng mạng, số mẫu thử M.

X im q : Là vectơ đầu vào của mạng.

oq jm : Là đầu ra của Neuron thứ j tại lớp q với mẫu thử m.

δkm : Là sai số mà Neuron thứ k chịu trách nhiệm với mấu thử m, lớp ra.

δq jm : Là sai số mà Neuron thứ j chịu trách nhiệm với mẫu thử m, tại lớp q.

wq jk : Trọng số nối Neuron thứ j của lớp q với Neuron thứ k của lớp q-1.

ε : Giá trị cực đại sai số cho phép

η : Hệ số học của mạng (0 < < 1), hệ số này giúp cho thuật toán học mạng hội tụ nhanh hơn

RMS (sai số trung bình của mạng), trong đó:

m=1

M

k=1

n

(y kmo km)2

M×n

4.3 Một số mô hình mạng thường dùng với BackPropagation

4.3.1 Mô hình tổng quát

Mạng với R đầu vào, với mỗi đầu vào có một giá trị trọng số w thích hợp, tổng các trọng

số và bias là đầu vào cho hàm chuyển f, mạng có thể thay đổi hàm chuyển để tạo đầu ra

4.3.2 Một số hàm chuyển thường dùng trong hàm nhiều lớp.

Sau đây là 3 hàm truyền thông dụng nhất :

a) Hàm truyền Hard Limit:

a = hardlim(n) =

Ta sẽ sử dụng hàm này để tạo các Neural phân lớp các đầu vào thành hai nhóm Hàm truyền này được minh hoạ như hình 1.2

Ngày đăng: 25/03/2014, 22:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w