Tìm hiểu về Neural Network: Perceptron


Một trong những đề tài rất hot hiện nay trong cộng đồng nghiên cứu, đó chính là Deep Learning. Khái niệm Deep Learning có nghĩa là chúng ta tìm cách biểu diễn (mô hình hóa – modeling) một vấn đề nào đó thông qua một cấu trúc phức tạp với nhiều hàm khác nhau. Đây chính là điểm khác biệt lớn nhất giữa Deep Learning và một số kỹ thuật khác như Cây quyết định (Decision Tree) hay Support Vector Machine. Trong Deep Learning thì kỹ thuật chính được sử dụng đó là Mạng Neuron (Neural Network) với một hoặc nhiều hidden layers. Lúc trước khi còn đang học ở trong trường Đại học thì mình cũng đã từng đọc tài liệu và có tìm hiểu về kỹ thuật này, nhưng cũng chỉ ở mức hiểu cơ bản và chưa áp dụng nó vào bất cứ bài toán nào. Hôm nay mình quyết định tìm hiểu sâu hơn về nó cũng như viết ra đây để mọi người cùng đọc và tham khảo cho việc học tập của mình.

Có lẽ trước tiên mình sẽ kể đến một số lĩnh vực mình biết đã có những thành công với Deep Learning, đó là Speech Processing, Image Processing và Natural Language Processing. Trong mỗi lĩnh vực này thì đều đã có những kết quả thử nghiệm vượt hơn nhiều so với các phương pháp cũ không dùng Deep Learning. Ví dụ như Microsoft’s Deep Learning Project Outperforms Humans In Image Recognition hoặc Deep Learning Machine Beats Humans in IQ Test

Để bắt đầu hiểu Deep Learning thì chắc chắn chúng ta phải hiểu về Neural Network, và mô hình Neural Network đơn giản nhất mà chúng ta tìm hiểu ngày hôm nay đó chính là Perceptron. Mô hình Perceptron được minh họa như trong hình sau:

Ở đây, chúng ta có 3 giá trị input binary và 1 giá trị output binary. Nhiệm vụ của Perceptron là làm sao chuyển từ 3 giá trị input này ra được đúng giá trị output như chúng ta mong đợi. Giả sử thay vì gọi x1, x2, x3, chúng ta sẽ gọi 3 giá trị input vào là 3 biến boolean: đẹp trai, giàu, học giỏi. Giá trị output đầu ra sẽ là biến boolean: đào hoa?

Ví dụ: (hay còn gọi là dữ liệu huấn luyện – training data, giá trị 1 chính là true, giá trị 0 là false)

+ đẹp trai = 1, giàu = 1, học giỏi = 1 => đào hoa = 1
+ đẹp trai = 0, giàu = 1, học giỏi = 0 => đào hoa = 1
+ đẹp trai = 0, giàu = 0, học giỏi = 0 => đào hoa = 0 

Vấn đề là làm sao chúng ta có thể xác định được giá trị “đào hoa” là 1 hay 0 nếu như chúng ta có 3 giá trị đầu vào? Và quy luật đơn giản nhất chính là cộng các giá trị input lại với nhau, nhưng có kèm theo “trọng số” trên mỗi giá trị input. Ví dụ trong trường hợp trên, “giàu” nên có trọng số lớn hơn so với các thuộc tính “đẹp trai” hoặc “học giỏi” (có tiền là có tất cả mà ^_^).

Như vậy, với 3 giá trị input, chúng ta cũng sẽ có 3 trọng số tương ứng. Giả sử gọi 3 trọng số là w1, w2, w3, thì chúng ta có cách tính giá trị output là như sau:

đào hoa = (w1 * đẹp trai) + (w2 * giàu) + (w3 * học giỏi)

Nhưng có 1 vấn đề là giá trị của “đào hoa” bắt buộc chỉ có thể là 1 hoặc 0, trong khi nếu mình cộng 3 giá trị input theo công thức ở trên thì có khả năng giá trị của đào hoa sẽ lớn hơn 1. Để giải quyết điều này, chúng ta sẽ sử dụng nguyên tắc làm tròn theo ngưỡng. Có nghĩa là nếu theo công thức trên mà ra giá trị lớn hơn 1 số T nào đó thì mình coi như đào hoa = 1, còn nếu nhỏ hơn T thì xem như đào hoa = 0.

Bias
Giá trị ngưỡng T ở trên còn được gọi là bias (dịch ra tiếng Việt là thiên vị), tuy nhiên thông thường người ta sẽ không so sánh giá trị output với bias, mà họ sẽ xem giá trị bias giống như là một input bổ sung. Nghĩa là thay vì ở trên chúng ta có 3 giá trị input, thì bây giờ chúng ta sẽ có giá trị input thứ tư chính là giá trị T, và trọng số của nó luôn luôn là 1. Điều này giúp cho việc so sánh giá trị output của chúng ta sẽ thuận tiện hơn vì chỉ cần so sánh output xem nó lớn hơn 0 hay nhỏ hơn 0 là được. Lớn hơn 0 thì xem như là 1, còn nhỏ hơn 0 thì xem như là 0

Sigmoid Neuron
Chúng ta đã mô hình hóa được bài toán ở trên thông qua các giá trị input, trọng số, bias và output. Tuy nhiên, vấn đề chính của bài toán này là làm sao chọn được giá trị của các trọng số cho đúng? Rõ ràng con người sẽ rất khó mà nhìn thấy mối liên hệ giữa các thuộc tính để đưa ra giá trị cho chúng. Trong trường hợp có cả trăm ngàn thuộc tính thì hoàn toàn không thể nào thiết lập giá trị trọng số cho chính xác. Bởi vì vậy, nhiệm vụ chính của chúng ta là giúp cho Perceptron “tự học” được giá trị trọng số thông qua các ví dụ mình đưa cho Perceptron.

Để dễ hiểu hơn, hãy tưởng tượng con người chúng ta chính là một perceptron. Giả sử chúng ta thường giải bài tập dựa trên 3 nguồn thông tin hỗ trợ là “ba mẹ”, “thầy cô” và “bạn bè”. Khi còn nhỏ xíu chưa đi học thì đối với chúng ta ba mẹ nói gì là cũng đúng, vì thế trọng số trước khi đi học sẽ là:

[ba mẹ = 1, thầy cô = 0, bạn bè = 0] 

Nhưng rồi lớn hơn 1 chút nữa, có nhiều bạn bè mới. Lúc này thì bắt đầu nghe các lời bạn bè và cảm thấy những gì ba mẹ chỉ dạy chưa chắc đã đúng, cho nên trọng số bắt đầu thay đổi

[ba mẹ = 0.5, thầy cô = 0.0, bạn bè = 1]

Khi đi học nhiều hơn, bắt đầu được học thêm nhiều điều hay, và bắt đầu có suy nghĩ là “thầy cô nói rất đúng”, cho nên các trọng số lại thay đổi

[ba mẹ = 0.3, thầy cô = 1, bạn bè = 0.6]

Ví dụ trên cho chúng ta thấy cách mà chúng ta điều chỉnh giá trị các trọng số dựa trên kết quả mà chúng ta thu được là như thế nào. Và trên thực tế cách Perceptron cập nhật lại các giá trị trọng số cũng tương tự như ví dụ ở trên.

Tuy nhiên, có một vấn đề lớn mà chúng ta gặp trong quá trình cập nhật trọng số theo cách ở trên. Đó là bởi vì nếu kết quả output chúng ta nhận được chỉ là 2 giá trị 0 hoặc 1 thì làm sao chúng ta biết được mức độ ảnh hưởng của từng trọng số khi bị thay đổi là bao nhiêu. Nghĩa là sẽ có trường hợp 1 giá trị trọng số w nào đó thay đổi tăng hoặc giảm thì cũng không ảnh hưởng đến kết quả output của chúng ta, hoặc ngược lại có 1 số trường hợp chỉ cần tăng 1 lượng rất nhỏ giá trị trọng số cũng làm kết quả của chúng ta thay đổi từ 0 sang 1. Điều này sẽ khiến cho việc chúng ta tìm ra giá trị tối ưu cho từng trọng số là không thể. Chúng ta mong muốn làm sao mà nếu có 1 sự thay đổi nhỏ chỗ giá trị của trọng số w thì giá trị output cũng thay đổi nhỏ theo. Và nhờ đó mà chúng ta có thể dần dần tìm ra được giá trị tối ưu bằng cách thay đổi dần dần các giá trị trọng số trong Perceptron.

Để giải quyết vấn đề ở trên, người ta đưa ra một loại neuron gọi là Sigmoid Neuron. Bản chất của nó chính là Perceptron, nhưng giá trị output lúc này không còn là binary nữa mà là 1 giá trị bất kỳ nằm giữa 0 và 1, ví dụ như 0.135. Và hàm số dùng để tính giá trị output từ giá trị input sẽ sử dụng hàm Sigmoid (đó là lý do người ta gọi là Sigmoid Neuron)

Screenshot 2015-08-28 13.10.41

Lý do vì sao người ta lại sử dụng hàm Sigmoid này mà không phải là hàm khác? Hay là liệu có hàm nào khác tương được hàm Sigmoid hay không? Và khi đã có hàm này rồi thì làm sao có thể cập nhật các trọng số? Các vấn đề này chúng ta sẽ lần lượt tìm hiểu trong các bài tiếp theo.

Tác giả: xuanchien

Tran Xuan Chien. Japan Advanced Institute of Science and Technology - Japan. Senior Developer - NUS Technology.

8 thoughts on “Tìm hiểu về Neural Network: Perceptron”

  1. mình đang rất quan tâm đến deep learning cũng như neuron network
    blog của bạn mình thấy rất hay và dễ hiểu , hóng những part sau nhưng hình như cũng vẫn chưa ra hết
    Bạn có thể publish chúng hoặc chia sẻ với mình qua mail được ko
    Xin cảm ơn😀

    1. Hi bạn, sorry vì trả lời trễ. Mình cũng định viết thêm mà dạo này research bị stuck vài cái và hơi bị làm biếng nghiên cứu thêm. Sẽ ráng viết thêm vài bài nữa cho các bạn tham khảo

  2. Anh oi, anh chung minh dum em la vi sao khi dung Bias thi việc so sánh giá trị output của chúng ta sẽ thuận tiện hơn vì chỉ cần so sánh output xem nó lớn hơn 0 hay nhỏ hơn 0 là được. Lớn hơn 0 thì xem như là 1, còn nhỏ hơn 0 thì xem như là 0??? Em chua hieu chung minh cho nay ntn?

    1. Như a nói ở trên, nếu mỗi bài toán mà em phải tự định nghĩa số T riêng thì như vậy sẽ rất mệt, mỗi bài 1 số T khác nhau, còn nếu bài toán nào e cũng quy về 2 giá trị output là âm và dương thì sẽ dễ hơn nhiều.

      Hơn nữa, giả sử em có giá trị input là x=2 và em muốn output ra giá trị 0 thì em sẽ làm thế nào? Nếu không có bias thì w=0 và như vậy với mọi x thì output sẽ luôn là 0. Còn nếu có giá trị bias vào thì mình có thể thay đổi (hoặc gọi là dịch chuyển) giá trị output đi 1 khoảng tùy ý.

      Em có thể hình dung thì cái hàm với w và x mà không có bias thì đồ thị của nó sẽ luôn đi qua gốc tọa độ, mà như vậy thì đồ thị này bị ràng buộc quá và có thể sẽ không fit với dữ liệu của mình (hoặc là bị overfitting)

      1. Cảm ơn anh. Giờ Em hiểu rồi ạ.
        Ban đầu em cứ suy nghĩ như là chứng minh toán học, là gía trị output của
        (w1 * đẹp trai) + (w2 * giàu) + (w3 * học giỏi) >T
        ==> (w1 * đẹp trai) + (w2 * giàu) + (w3 * học giỏi) -T>0 vậy phải -T chứ sao lại +T;
        =======> bởi lẽ gì thì gía trị của W và T (chính xác là bias) sẽ được cập nhật qua qúa trình học.

  3. chào bác, cảm ơn bài viết của bác hay quá. bác có thể cho em xin một số tài liệu bác đã đọc về Machine Learning cho người mới bắt đầu như em ( ^^ cách giải thích càng dễ hiểu giống như của bác thì càng tốt) được không ạ? em cảm ơn bác rất nhiều

    1. Thật sự lúc mình đọc cái về Neural Network như thế này thì cũng rất là nhức đầu với nó, phải mất thời gian khá lâu mới có thể viết ra được một ít như thế này. Nếu đọc được tiếng Anh thì bạn có thể đọc các tài liệu tiếng Anh, còn tài liệu tiếng Việt thì thật sự mình không biết rõ có cái nào không, chắc mời bác search thử😀

      Bài tiếng Anh thì có 1 số bài khá hay mới được viết gần đây, bác có thể xem thử: http://neuralnetworksanddeeplearning.com, tất nhiên đọc tới khúc công thức lung tung thì chắc phải tập trung một chút chứ không thì sẽ tẩu hỏa nhập ma🙂

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s