Đào tạo một Perceptron
- Tạo một đối tượng Perceptron
- Tạo chức năng đào tạo
- Huấn luyện Perceptron trước các câu trả lời đúng
Nhiệm vụ đào tạo
Hãy tưởng tượng một đường thẳng trong không gian có các điểm xy rải rác.
Huấn luyện một perceptron để phân loại các điểm trên và dưới dòng.
Tạo một đối tượng Perceptron
Tạo một đối tượng Perceptron. Đặt tên cho nó là bất cứ điều gì (như Perceptron).
Hãy để perceptron chấp nhận hai tham số:
- Số lượng đầu vào (không)
- Tỷ lệ học tập (learningRate).
Đặt tốc độ học tập mặc định thành 0,00001.
Sau đó tạo các trọng số ngẫu nhiên trong khoảng từ -1 đến 1 cho mỗi đầu vào.
Ví dụ
// Perceptron Object
function Perceptron(no, learningRate = 0.00001) {
// Set Initial Values
this.learnc = learningRate;
this.bias = 1;
// Compute Random Weights
this.weights = [];
for (let i = 0; i <= no; i++) {
this.weights[i] = Math.random() * 2 - 1;
}
// End Perceptron Object
}
Trọng lượng ngẫu nhiên
Perceptron sẽ bắt đầu với trọng số ngẫu nhiên cho mỗi đầu vào.
Tỷ lệ học tập
Đối với mỗi lỗi, trong khi huấn luyện Perceptron, các trọng số sẽ được điều chỉnh với một phần nhỏ.
Phần nhỏ này chính là " tỷ lệ học của Perceptron ".
Trong đối tượng Perceptron chúng ta gọi nó là learnc .
Sự thiện vị
Đôi khi, nếu cả hai đầu vào đều bằng 0, perceptron có thể tạo ra đầu ra không chính xác.
Để tránh điều này, chúng tôi cung cấp cho perceptron một đầu vào bổ sung có giá trị là 1.
Điều này được gọi là một sự thiên vị .
Thêm chức năng kích hoạt
Hãy nhớ thuật toán perceptron:
- Nhân mỗi đầu vào với trọng số của perceptron
- Tổng hợp kết quả
- Tính kết quả
Ví dụ
this.activate = function(inputs) {
let sum = 0;
for (let i = 0; i < inputs.length; i++) {
sum += inputs[i] * this.weights[i];
}
if (sum > 0) {return 1} else {return 0}
}
Hàm kích hoạt sẽ xuất ra:
- 1 nếu tổng lớn hơn 0
- 0 nếu tổng nhỏ hơn 0
Tạo chức năng đào tạo
Hàm huấn luyện đoán kết quả dựa trên hàm kích hoạt.
Mỗi lần đoán sai, perceptron sẽ điều chỉnh trọng số.
Sau nhiều lần đoán và điều chỉnh, trọng số sẽ chính xác.
Ví dụ
this.train = function(inputs, desired) {
inputs.push(this.bias);
let guess = this.activate(inputs);
let error = desired - guess;
if (error != 0) {
for (let i = 0; i < inputs.length; i++) {
this.weights[i] += this.learnc * error * inputs[i];
}
}
}
Lan truyền ngược
Sau mỗi lần đoán, perceptron sẽ tính toán xem dự đoán đó sai như thế nào.
Nếu dự đoán sai, perceptron sẽ điều chỉnh độ lệch và trọng số để lần đoán sau sẽ chính xác hơn một chút.
Kiểu học này được gọi là lan truyền ngược .
Sau khi thử (vài nghìn lần), perceptron của bạn sẽ đoán khá tốt.
Tạo thư viện của riêng bạn
Mã thư viện
// Perceptron Object
function Perceptron(no, learningRate = 0.00001) {
// Set Initial Values
this.learnc = learningRate;
this.bias = 1;
// Compute Random Weights
this.weights = [];
for (let i = 0; i <= no; i++) {
this.weights[i] = Math.random() * 2 - 1;
}
// Activate Function
this.activate = function(inputs) {
let sum = 0;
for (let i = 0; i < inputs.length; i++) {
sum += inputs[i] * this.weights[i];
}
if (sum > 0) {return 1} else {return 0}
}
// Train Function
this.train = function(inputs, desired) {
inputs.push(this.bias);
let guess = this.activate(inputs);
let error = desired - guess;
if (error != 0) {
for (let i = 0; i < inputs.length; i++) {
this.weights[i] += this.learnc * error * inputs[i];
}
}
}
// End Perceptron Object
}
Bây giờ bạn có thể đưa thư viện vào HTML:
<script src="myperceptron.js"></script>
Sử dụng thư viện của bạn
Ví dụ
// Initiate Values
const numPoints = 500;
const learningRate = 0.00001;
// Create a Plotter
const plotter = new XYPlotter("myCanvas");
plotter.transformXY();
const xMax = plotter.xMax;
const yMax = plotter.yMax;
const xMin = plotter.xMin;
const yMin = plotter.yMin;
// Create Random XY Points
const xPoints = [];
const yPoints = [];
for (let i = 0; i < numPoints; i++) {
xPoints[i] = Math.random() * xMax;
yPoints[i] = Math.random() * yMax;
}
// Line Function
function f(x) {
return x * 1.2 + 50;
}
//Plot the Line
plotter.plotLine(xMin, f(xMin), xMax, f(xMax), "black");
// Compute Desired Answers
const desired = [];
for (let i = 0; i < numPoints; i++) {
desired[i] = 0;
if (yPoints[i] > f(xPoints[i])) {desired[i] = 1}
}
// Create a Perceptron
const ptron = new Perceptron(2, learningRate);
// Train the Perceptron
for (let j = 0; j <= 10000; j++) {
for (let i = 0; i < numPoints; i++) {
ptron.train([xPoints[i], yPoints[i]], desired[i]);
}
}
// Display the Result
for (let i = 0; i < numPoints; i++) {
const x = xPoints[i];
const y = yPoints[i];
let guess = ptron.activate([x, y, ptron.bias]);
let color = "black";
if (guess == 0) color = "blue";
plotter.plotPoint(x, y, color);
}