探索 Brain.js:JavaScript 中的神经网络利器

656 阅读7分钟

Brain.js 概览

1 概述:

Brain.js 是一个 JavaScript库,用于在浏览器和 Node.js 环境中构建和训练神经网络。它使得开发者能够在客户端直接运行机器学习模型,而无需依赖复杂的后端服务器或外部 API ,可以以 JavaScript 轻松创建并训练神经网络

而我们需要初步了解一下何为机器学习和神经网络:

1.1 机器学习(MachineLearning):

1.1.1 什么是机械学习?

机器学习是一种人工智能(AI)技术,它使计算机能够在没有明确编程的情况下从数据中学习和改进。通过机器学习,计算机可以自动识别模式、提取特征,并根据这些信息做出预测或决策。

1.1.2 主要思想:

可以理解为对于计算机程序在对于某项 任务X 及其 性能度量Y ,如果计算机程序在 X 上以 Y 衡量的性能随着 经验E 而自我完善,那么称这个计算机程序从 经验E 中学习。

1.2 神经网络(Neural Network):

1.2.1 什么是神经网络?

神经网络是一种受生物神经系统启发而创造的计算模型。其能够通过学习数据中的模式来进行预测、分类和回归等任务。

1.2.2 了解最经典的神经网络:

让我们来看一个经典的神经网络。这是一个包含三个层次的神经网络。红色的是输入层,绿色的是输出层,紫色的是隐藏层。在输入层有3个输入单元,隐藏层有4个单元,输出层有2个单元。

fd22166cbd2c31439b62e15f2cd4ab23.jpg

而我们只需要了解在神经网络结构图中的关键不是圆圈(“神经元”),而是箭头和连线(“连接线”)。每个连接线对应一个不同的权重,而箭头代表预测过程的数据流向,这是需要训练得到的。

但是我们本文的主题并不在此,所以我们只浅聊一下概念,帮助读者了解有这样一个东西


2 内部结构:

2.1 核心组件:

2.1.1 神经网络类:

Brain.js 提供了几种不同的神经网络类,每种类都有其特定的用途和结构。(下文会详细解释模型各个位置的职责,此处示例看不懂可以等阅读完 3 项目的安装与使用 再回头来看)

  • NeuralNetwork:这是一个基本的前馈神经网络(Feedforward Neural Network),其为最基本的神经网络形式。在这种网络中,信息只向前流动,从输入层到输出层,没有反馈连接。(例如上文中的最经典的神经网络),适用于不需要记忆历史数据的任务,如图像识别、简单的回归和分类任务等。

例如我们可以训练一个模型来预测一个简单的逻辑门的输出,我们就可以使用NeuralNetwork

const brain = require('brain.js');

const net = new brain.NeuralNetwork();

const trainingData = [
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [0] },
  { input: [1, 0], output: [0] },
  { input: [1, 1], output: [1] }
];

net.train(trainingData);

const output = net.run([1, 1]);  // [0.987]
console.log(output);
  • Recurrent:这是一个递归神经网络(Recurrent Neural Network,RNN),因为它们能够记住之前的数据点,特别适合处理序列数据,如时间序列或文本数据。

例如我们可以训练一个模型来让其根据前几个字符来预测下一个字符,可以使用Recurrent

const brain = require('brain.js');

const net = new brain.Recurrent();

const trainingData = [
  { input: 'hello', output: 'o' },
  { input: 'world', output: 'd' }
];

net.train(trainingData);

const output = net.run('hello');  // 'o'
console.log(output);
  • LSTM:这是一种特殊的递归神经网络,即长短期记忆网络(Long Short-Term Memory Network),在处理长序列数据时表现出色。普通的 RNN(Recurrent) 在网络较深或时间步较多时可能会遇到梯度消失或梯度爆炸的问题,而 LSTM 通过引入门控机制(输入门、遗忘门、输出门)来控制信息的流动,从而有效缓解这些问题。特别适用于需要捕捉长时间依赖关系的任务,如语音识别、机器翻译等。

例如我们可以训练一个模型来让其基于给定的前几个词来预测下一个词,可以使用LSTM

const brain = require('brain.js');

const net = new brain.recurrent.LSTM();

const trainingData = [
  { input: 'the cat sat on the mat', output: 'mat' },
  { input: 'the dog chased the cat', output: 'cat' }
];

net.train(trainingData);

const output = net.run('the cat sat on the');  // 'mat'
console.log(output);

2.1.2 训练过程:

  • train 方法:这是最主要的训练方法,接受一个包含输入和输出的数据集,并通过反向传播算法调整网络的权重。
net.train(trainingData, {
  iterations: 20000, // 训练迭代次数
  errorThresh: 0.005, // 错误阈值
  log: true, // 是否记录训练过程
  logPeriod: 10, // 记录间隔
  learningRate: 0.3, // 学习率
  momentum: 0.1, // 动量
  callback: function(error) {}, // 回调函数
  callbackPeriod: 10 // 回调间隔
});

2.1.3 数据预处理:

数据归一化将数据缩放到一个固定的范围,通常为[0,1]或[-1,1],可以有效避免因尺度差异导致的训练问题。

  • normalize(data, options) :将数据归一化到指定的范围内。
  • denormalize(data, options) :将归一化的数据还原回原始范围。

例如:

const brain = require('brain.js');

// 原始数据
const data = [10, 20, 30, 40, 50];

// 归一化数据
const normalizedData = brain.NeuralNetwork.normalize(data);
console.log(normalizedData);  // [0, 0.25, 0.5, 0.75, 1]

// 还原数据
const denormalizedData = brain.NeuralNetwork.denormalize(normalizedData, { min: 10, max: 50 });
console.log(denormalizedData);  // [10, 20, 30, 40, 50]
2.2 项目目录结构:

2.2.1 项目目录:

my-brainjs-project/
├── src/
│   ├── data/
│   │   └── training-data.json
│   └── ...
├── public/
│   ├── css/
│   │   └── styles.css
│   └── ...
├── .gitignore
├── package.json
├── package-lock.json
├── README.md
└── ...

其内部包含大量结构,此处就不过多赘述,读者可自行去查找。

3. 项目安装与使用:

3.1 安装

在 Node.js 环境中,你可以使用 npm 安装 Brain.js:

npm install brain.js
3.2 使用:

3.2.1 导入Brain.js库:

  • const brain = require("brain.js");:Node.js 来引入Brain.js
  • <script src="./brain.js"></script>:直接在 HTML 文件中使用 CDN。

3.2.2 创建神经网络实例:

选择项目适合的神经网络:

  • const network = new brain.NeuralNetwork();
  • const network = new brain.Recurrent();
  • const network = new brain.recurrent.LSTM();

3.2.3 训练网络:

创建训练数据,在其中输入你需要对模型进行的训练

const data = [
     { input:"", output:"" },
     { input:"", output:"" }
]

3.2.4 测试样例:

执行样例来测试神经网络

const output = net.run(
   "样例"
);
console.log(output); 

3.2.5 自定义训练选项:

我们可以在测试之前添加自己设置的训练选项来优化网络的训练过程(参考上文的 train方法)

net.train(data, {
  errorThresh: 0.005, // 错误阈值
  iterations: 20000,  // 最大训练迭代次数
  log: true,          // 是否记录训练进度
});
3.3 示例:

下面我们创建了神经网络的模型,用于预测输入文本为前端知识还是后端知识,并且回复其为frontend前端,还是backend后端。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>神经网络</title>
</head>
<body>
    <script src="./brain.js"></script>
    <script>
        const data = [
            { "input": "implementing a caching mechanism improves performance", "output": "backend" },
            { "input": "hover effects on buttons", "output": "frontend" },
            { "input": "optimizing SQL queries", "output": "backend" },
            { "input": "using flexbox for layout", "output": "frontend" },
            { "input": "setting up a CI/CD pipeline", "output": "backend" },
            { "input": "SVG animations for interactive graphics", "output": "frontend" },
            { "input": "authentication using OAuth", "output": "backend" },
            { "input": "responsive images for different screen sizes", "output": "frontend" },
            { "input": "creating REST API endpoints", "output": "backend" },
            { "input": "CSS grid for complex layouts", "output": "frontend" },
            { "input": "database normalization for efficiency", "output": "backend" },
            { "input": "custom form validation", "output": "frontend" },
            { "input": "implementing web sockets for real-time communication", "output": "backend" },
            { "input": "parallax scrolling effect", "output": "frontend" },
            { "input": "securely storing user passwords", "output": "backend" },
            { "input": "creating a theme switcher (dark/light mode)", "output": "frontend" },
            { "input": "load balancing for high traffic", "output": "backend" },
            { "input": "accessibility features for disabled users", "output": "frontend" },
            { "input": "scalable architecture for growing user base", "output": "backend" }
        ];
        // 初始化一个神经网络
        const network = new brain.recurrent.LSTM();
        // 训练
        network.train(data,{
            iterations: 2000,
            log: true,
            logPeriod: 100
        })
        // 执行测试 使用LSTM网络进行预测
        const output = network.run(
            "CSS grid for complex layouts"
        );
        console.log(output)
    </script>
</body>
</html>

我们右键项目点击“Open with Five Server”,打开页面后右键点击检查,我们就会打开如下页面,我们也就可以看到神经网络的学习了。

image.png

由于我示例为CSS grid for complex layouts,这明显为一个前端知识,而其也返还了frontend给我,这样的话项目的学习就结束了。

4. 应用领域

  • NLP(自然语言处理):通过训练模型来进行文本分析、情感分析、机器翻译等任务。
  • 设备智能化:通过在各种设备上部署AI模型,增强设备的功能性,比如智能家居、智能手表等。

当然还有许多应用的方向和领域,我们不得不承认其功能的强大,也不愧于其为 JavaScript 开发者在构建和训练神经网络时的首选工具之一,就如同其名brain.js,“大脑”一样,在使用中我们就如同操作一个大脑进行学习一样,说不定离AI遍布我们生活各个领域的日子已经不远了,但是放眼当下仍要努力学习。

---欢迎各位点赞、收藏、关注,如果觉得有收获或者需要改进的地方,希望评论在下方,不定期更新,都看到这里了,真的忍心不点个赞吗~~~

0bae-hcffhsw0416753.gif