Trong bài viết này, tôi sẽ chỉ cho bạn cách tạo và huấn luyện mạng nơ-ron bằng Synaptic.js, mạng này cho phép bạn học sâu trong Node.js và trình duyệt.
Chúng ta sẽ tạo ra mạng thần kinh đơn giản nhất có thể: mạng có thể giải phương trình XOR.
Tôi cũng đã tạo một hướng dẫn Scrimba tương tác về ví dụ này, vì vậy hãy xem thử:

Hoặc nếu bạn quan tâm đến khóa học đầy đủ về mạng thần kinh trong JavaScript, vui lòng xem khóa học miễn phí của chúng tôi về Brain.js tại Scrimba.

Nhưng trước khi xem mã, chúng ta hãy tìm hiểu những điều cơ bản về mạng lưới thần kinh.
Tế bào thần kinh và khớp thần kinh
Khối xây dựng đầu tiên của một mạng lưới thần kinh là các nơ-ron.
Một nơ-ron giống như một chức năng, nó nhận một vài đầu vào và trả về một đầu ra.
Có nhiều loại tế bào thần kinh khác nhau. Mạng của chúng tôi sẽ sử dụng các nơ-ron sigmoid, lấy bất kỳ số nào đã cho và nén nó thành một giá trị giữa và
1
.
Vòng tròn dưới đây minh họa một tế bào thần kinh sigmoid. đầu vào của nó là 5
và đầu ra của nó là 1
. Các mũi tên được gọi là khớp thần kinh, kết nối nơ-ron với các lớp khác trong mạng.

Cho nên tại sao là số đỏ 5
? Bởi vì nó là tổng của ba khớp thần kinh đang kết nối với nơ-ron như được chỉ ra bởi ba mũi tên ở bên trái. Hãy giải nén nó.
Ở ngoài cùng bên trái, chúng ta thấy hai giá trị cộng với cái gọi là Thiên kiến giá trị. Các giá trị là 1
và đó là những con số màu xanh lá cây. Giá trị sai lệch là
-2
đó là số màu nâu.
Đầu tiên, hai đầu vào được nhân với tạđó là 7
và 3
như thể hiện bởi các con số màu xanh.
Cuối cùng, chúng tôi thêm nó với độ lệch và kết thúc với 5
hoặc số đỏ. Đây là đầu vào cho tế bào thần kinh nhân tạo của chúng ta.

Vì đây là một nơ-ron sigmoid nén bất kỳ giá trị nào trong khoảng từ 0 đến 1, đầu ra sẽ bị nén xuống 1
.
Nếu bạn kết nối một mạng gồm các nơ-ron này với nhau, bạn sẽ có một mạng nơ-ron. Điều này lan truyền từ đầu vào đến đầu ra, thông qua các nơ-ron được kết nối với nhau thông qua các khớp thần kinh. Giống như trên hình ảnh dưới đây:

Mục tiêu của mạng thần kinh là huấn luyện nó thực hiện các phép tổng quát hóa, chẳng hạn như nhận dạng các chữ số viết tay hoặc thư rác email. Và giỏi khái quát hóa là vấn đề có quyền tạ và Thiên kiến các giá trị trên toàn mạng. Giống như các số màu xanh lam và nâu trong ví dụ của chúng tôi ở trên.
Khi đào tạo mạng, bạn chỉ cần hiển thị cho nó vô số ví dụ như chữ số viết tay và yêu cầu mạng dự đoán câu trả lời đúng.
Sau mỗi dự đoán, bạn sẽ tính toán sai như thế nào dự đoán là và điều chỉnh trọng số và giá trị sai lệch để mạng sẽ đoán chính xác hơn một chút vào lần tới. Quá trình học tập này được gọi là backpropagation. Làm điều này hàng ngàn lần và mạng của bạn sẽ sớm trở nên tổng quát hóa tốt.
Về mặt kỹ thuật, lan truyền ngược hoạt động như thế nào nằm ngoài phạm vi của hướng dẫn này, nhưng đây là ba nguồn tốt nhất mà tôi đã tìm thấy để hiểu về nó:
Mật mã
Bây giờ bạn đã có phần giới thiệu cơ bản, hãy bắt đầu viết mã. Điều đầu tiên chúng ta cần làm là tạo các lớp. Chúng tôi làm điều này với new Layer()
hoạt động trong khớp thần kinh. Số được truyền cho hàm cho biết mỗi lớp nên có bao nhiêu nơ-ron.
Nếu bạn đang bối rối về những gì một lớp là, hãy xem bản ghi màn hình ở trên.
const {Lớp, Mạng} = window.synaptic;
var inputLayer = new Layer(2);
var hiddenLayer = new Layer(3);
var outputLayer = new Layer(1);
Tiếp theo, chúng ta sẽ kết nối các lớp này lại với nhau và khởi tạo một mạng mới, như thế này:
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
var myNetwork = new Network({
đầu vào: lớp đầu vào,
ẩn giấu: [hiddenLayer],
đầu ra: đầu raLayer
});
Vì vậy, đây là mạng 2–3–1, có thể được hình dung như sau:

Bây giờ hãy đào tạo mạng:
// train the network - learn XOR
var learningRate = .3;
for (var i = 0; i < 20000; i++) {
// 0,0 => 0
myNetwork.activate([0,0]);
myNetwork.propagate(learningRate, [0]);
// 0,1 => 1
myNetwork.activate([0,1]);
myNetwork.propagate(learningRate, [1]);
// 1,0 => 1
myNetwork.activate([1,0]);
myNetwork.propagate(learningRate, [1]);
// 1,1 => 0
myNetwork.activate([1,1]);
myNetwork.propagate(learningRate, [0]);
}
Ở đây chúng tôi đang chạy mạng 20.000 lần. Mỗi lần chúng tôi truyền tiến và lùi bốn lần, truyền vào bốn đầu vào có thể có cho mạng này: [0,0] [0,1] [1,0] [1,1]
.
Chúng tôi bắt đầu bằng cách làm myNetwork.activate([0,0])
ở đâu [0,0]
là điểm dữ liệu chúng tôi đang gửi vào mạng. Đây là sự lan truyền về phía trước, còn được gọi là kích hoạt mạng lưới. Sau mỗi lần lan truyền xuôi, chúng ta cần thực hiện lan truyền ngược, trong đó mạng cập nhật trọng số và độ lệch của chính nó.
Backpropagation được thực hiện với dòng mã này: myNetwork.propagate(learningRate, [0])
ở đâu learningRate
là một hằng số cho biết mạng nên điều chỉnh trọng số bao nhiêu mỗi lần. tham số thứ hai đại diện cho đầu ra chính xác cho đầu vào
[0,0]
.
Sau đó, mạng sẽ so sánh dự đoán của chính nó với nhãn chính xác. Điều này cho nó biết nó đúng hay sai như thế nào.
Nó sử dụng phép so sánh làm cơ sở để hiệu chỉnh các trọng số và giá trị sai lệch của chính nó để lần sau nó sẽ đoán đúng hơn một chút.
Sau khi thực hiện quá trình này 20.000 lần, chúng tôi có thể kiểm tra xem mạng của chúng tôi đã học tốt như thế nào bằng cách kích hoạt mạng với tất cả bốn đầu vào có thể:
console.log(myNetwork.activate([0,0]));
// -> [0.015020775950893527]
console.log(myNetwork.activate([0,1]));
// -> [0.9815816381088985]
console.log(myNetwork.activate([1,0]));
// -> [0.9871822457132193]
console.log(myNetwork.activate([1,1]));
// -> [0.012950087641929467]
Nếu chúng ta làm tròn các giá trị này thành số nguyên gần nhất, chúng ta sẽ nhận được câu trả lời đúng cho phương trình XOR. Tiếng hoan hô!
Và đó là về nó. Mặc dù chúng ta mới chỉ tìm hiểu sơ qua về mạng lưới thần kinh, nhưng điều này sẽ cung cấp cho bạn đủ thông tin để bắt đầu chơi với Synaptic cho chính mình và tiếp tục tự học. Wiki của họ chứa rất nhiều hướng dẫn tốt.
Cuối cùng, hãy đảm bảo chia sẻ kiến thức của bạn bằng cách tạo một bản ghi màn hình Scrimba hoặc viết một bài báo khi bạn học được điều gì đó mới! 🙂
Tái bút: Chúng tôi có nhiều khóa học miễn phí hơn dành cho bạn!
Nếu bạn đang tìm kiếm thử thách tiếp theo của mình, chúng tôi có một số khóa học miễn phí khác mà bạn có thể xem tại Scrimba.com. Dưới đây là ba có thể có liên quan cho bạn:
Chúc mừng mã hóa!