Thực ra project này cũng chẳng có gì, nhưng câu chuyện đằng sau nó thì khá phức tạp và "sâu xa", chi tiết đọc ở bên dưới
Gần đây mình có hứng thú để nghiên cứu về neural network, thế là mình bắt tay vào code (bằng C++) Trong neural network có 2 thuật toán chính: Feed forward (giúp chạy một lớp neural network) và Backpropagation (giúp cho mạng neural network có thể "học" từ dữ liệu cho trước). Thuật toán feed forward khá là đơn giản (nhân ma trận thông thường), chỉ mất tầm 10 dòng code, và mình không phải kiểm tra lại (vì mình đã code rất nhiều lần rồi). Nhưng Backpropagation là "trái tim" của một mạng neural network, và nó đương nhiên cực kì phức tạp (mình code gần 200 dòng C++). Và, mình là con người, và con người thì đương nhiên sẽ mắc lỗi (đặc biệt là mình, người cứ code tầm 20 dòng lại lỗi một vài lần =))) nên mình cần một cách để kiểm tra code, ít nhất là xem nó có sai hay không Có thể đến đây, các bạn sẽ nói với mình: Cho nó hoạt động trong một project nhận dạng chữ viết tay (bài toán kinh điển của machine learning) hoặc là làm về cờ vua (chính là dự án mình đang theo đuổi). Mình cũng đã nghĩ đến chuyện đó, nhưng mình quyết định không làm vì 2 lí do: - Để hoạt động cho những project như vậy, mạng neural phải khá lớn (nếu chơi cờ vua thì cần ít nhất 64 input cho mạng neural network để biểu diễn 64 ô bàn cờ, còn nếu nhận dạng chữ số viết tay thì mạng cần có đến 784 input cho bức ảnh 28x28, loại ảnh có trong MNIST database), huấn luyện sẽ rất chậm, và mình cần một khoảng thời gian khá dài (từ vài phút đến vài giờ) để biết code lỗi hay không - Code cho những dự án đó đều sẽ khá phức tạp (Nếu nhận dạng chữ số viết tay thì cần lập trình xử lí ảnh, vốn khá khó vì cần cài thêm một số thư viện hỗ trợ, nếu chơi cờ vua thì ít nhất cũng phải code để liệt kê tất cả các nước đi hợp lệ, vốn thực sự khá khó, đặc biệt với một số luật phức tạp như nhập thành, bắt tốt qua đường, ghim, ..., lập trình thêm cả học không giám sát, ...) và nếu project có lỗi, mình cũng không biết lỗi nằm ở code Backpropagation, hay ở phần code ngoài, nên không thể đánh giá chính xác Nên mình quyết định sẽ làm một mạng neural đơn giản: Có 2 input và 2 output, input là vị trí một nút, và bạn cần xem đó là nút đỏ hay nút xanh. Làm như vậy thì có thể tránh được vấn đề 1 (chỉ mất vài giây để huấn luyện được mạng) mà cũng tránh được vấn đề 2 (vì code nạp input rất đơn giản, mình khó có thể code sai, mà nếu có cũng phát hiện được ngay). Vấn đề duy nhất là, mạng khó có thể học được các quy tắc, nếu sinh điểm ngẫu nhiên, nên mình dùng Scratch để có thể vẽ điểm trên mặt phẳng hai chiều theo một cái quy luật nào đó, xuất file text và nạp cho project C++ Đó, căn bản chỉ là thế thôi, cảm ơn bạn nào đã đủ kiên nhẫn để đọc đến tận đây =)) PS: Mình đã test code của mình, biết rõ là sai rồi nhưng không biết sai chỗ nào mới cay chứ =)))