Trc khi viết blog này mình khá lưỡng lự xem có nên viết về chủ đề này ko, vì thực tế machine learning vẫn là 1 thứ khá trừu tượng với đa số những người muốn tìm hiểu. Tuy nhiên, với cách tiếp cận gần gũi này, mình mong sẽ tạo động lực ko chỉ cho các bạn ko chỉ muốn tìm hiểu « chơi » mà còn với những bạn đang theo học CNTT.

Vào vấn đề! Thuật toán mạng nơ-ron (neural network) mấy năm gần đây trở nên khá nổi và đc sử dụng nhiều trong các phần mềm khá « hại điện » như google now, siri,.. phục vụ nhận diện âm thanh, hình ảnh thậm chí là cả ngôn ngữ tự nhiên.

Ví dụ về nhận diện hình ảnh….

Ý tưởng cơ bản của mạng neural là mình có 1 số thông tin input nhất định, và 1 số output. Sau đó mình đưa máy 1 vài ví dụ là input này thì output sẽ thế nào, và máy sẽ « học » để lần sau nếu đưa input, nó phải cố « đoán » đc output.

Đề bài là: Giả sử mình có 1 người bạn tên K. Bạn này đang FA và muốn tìm gấu phù hợp với sở thích cá nhân.
Mình có 1 danh sách thông tin chi tiết về tất cả những người ở trường của K. Vậy làm thế nào để lập trình 1 phần mềm lọc ra những người có thể phù hợp với K?

Để ví dụ trở nên đơn giản, chúng ta sẽ chỉ xét các thông tin sau:

  • Cân nặng (đơn vị kg)
  • Chiều cao (đơn vị cm)
  • Giới tính (0=nam, 1=nữ)
  • Mức độ thích guitar (1 đến 10)
  • Mức độ thích EDM (1 đến 10)
  • Mức độ thích học hoá (1 đến 10)
  • Mức độ thích học tin (1 đến 10)

Như vậy chúng ta có 7 input (Inp), và 1 output (Out) là người này hợp vs mình ko:

Rõ ràng ở đây mình có vài sở ghét như ko thích nghe edm, ko thích học hoá. Vậy làm sao để phần mềm biết đc?

Đây là lúc để con số w (viết tắt của weight) trên các neural hoạt động. Rất đơn giản như sau: ta nhân lần lượt từng Inp với từng w, cộng tổng lại là ra đc Out:

Out = Inp1 * w1 + Inp2 * w2 + Inp3 * w3 + Inp4 * w4 + Inp5 * w5 + Inp6 * w6 + Inp7 * w7

Voilà, như vậy rõ ràng với sở ghét thì w phải là số ÂM, để kéo Out về phía ÂM và vì thế biểu diễn đc người này KHÔNG HỢP vs mình. Ko những thế, các Inp như thích guitar, học tin quan trọng hơn, nên rõ ràng w của chúng cũng phải lớn hơn.

Nhưng làm thế nào để biết chính xác w1, w2,…? Đây chính là điều mà máy phải « học » và « đúc rút » ra. Mình sẽ đưa cho máy 1 vài ví dụ, và dần dần máy sẽ tự « nhận ra » rằng các số w kia nên thế nào. Vì phần này lquan nhiều đến toán (tích phân, đạo hàm,…) nên mình sẽ ko nói kỹ, khô khan lắm.

Như vậy chúng ta đã có 1 mạng neural khá đơn giản. Tuy nhiên thực tế mạng neural có thêm các lớp ở trung gian nữa, gọi là hidden layers. Thực ra cũng đơn giản thôi, kiểu như lấy output của mạng này để « cắm » vào mạng khác ý, ví dụ:

Mạng neural với 1 lớp ẩn

Thực tế các lớp trung gian thường có nhiều node hơn các lớp input hay output. Mạng có càng nhiều lớp thì càng biểu diễn đc độ phức tạp cao, và vì thế đưa ra “phán đoán” chính xác hơn. Trên thế giới có khá nhiều kiểu mạng đa lớp « pre-trained », hiểu đơn giản là nó đã đc điều chỉnh w một cách rất chính xác.

Ví dụ khá nổi tiếng là mạng VGG16, gồm 16 lớp, input là 1 hình ảnh bất kỳ, các lớp đầu sẽ « lọc » ra các góc, cạnh, đường nét,… và các lớp sau « lọc » ra mặt người, quần áo, con vật,… output cho ra rằng trong ảnh có những thứ gì, và nó phân biệt đc 1000 đối tượng khác nhau.

Vì nó có thể “lọc” ra các đường nét trong ảnh rất chính xác, mạng VGG16 này được sử dụng khá nhiều để “vẽ” lại 1 ảnh thật theo style cho trước:

Ví dụ về mạng VGG16

Tham khảo thêm: