返回

从头学 Deep Learning:纯 JS 手写深度学习玩转 Chrome 恐龙游戏(一)

人工智能

Chrome 恐龙游戏大作战:纯 JS 手写深度学习(一)

在上一章中,我们探讨了机器学习的基本概念。实践是学习的最佳途径,因此我们使用纯 JS(不使用 XNN 库)构建了一个简单的深度学习库,旨在通关 Chrome 恐龙游戏。

构建自己的深度学习库

要使用纯 JS 编写神经网络,我们首先需要构建一个库来处理矩阵运算、激活函数和梯度计算等基本操作。

矩阵运算

class Matrix {
  constructor(rows, cols) {
    this.data = Array(rows).fill(0).map(() => Array(cols).fill(0));
  }

  // ... 省略其他方法和操作符重载 ...
}

激活函数

const relu = (x) => Math.max(0, x);
const sigmoid = (x) => 1 / (1 + Math.exp(-x));
const tanh = (x) => (Math.exp(2 * x) - 1) / (Math.exp(2 * x) + 1);

梯度计算

const dRelu = (x) => x > 0 ? 1 : 0;
const dSigmoid = (x) => sigmoid(x) * (1 - sigmoid(x));
const dTanh = (x) => 1 - tanh(x) ** 2;

设计神经网络

我们的神经网络将采用简单的多层感知器(MLP)架构,由一个输入层、一个隐藏层和一个输出层组成。

前向传播

class NeuralNetwork {
  constructor(inputSize, hiddenSize, outputSize) {
    // 初始化权重和偏置
    this.weights = [];
    this.biases = [];
    // ... 省略其他方法 ...
  }

  forward(input) {
    // 前向传播计算
    let output = input;
    for (let i = 0; i < this.weights.length; i++) {
      output = Matrix.multiply(output, this.weights[i]).add(this.biases[i]);
      output = output.map((x) => relu(x)); // 使用 ReLU 激活函数
    }
    return output;
  }
}

反向传播

class NeuralNetwork {
  // ... 省略其他方法 ...

  backward(input, target) {
    // 反向传播计算
    let output = input;
    let gradients = [];
    for (let i = this.weights.length - 1; i >= 0; i--) {
      let error = target.subtract(output);
      gradients.push({
        weights: Matrix.multiply(output.transpose(), error),
        biases: error,
      });
      output = Matrix.multiply(output, this.weights[i]).add(this.biases[i]);
      output = output.map((x) => dRelu(x)); // 使用 ReLU 激活函数的导数
    }
    return gradients;
  }
}

训练神经网络

我们使用简单的梯度下降算法来训练神经网络。

class NeuralNetwork {
  // ... 省略其他方法 ...

  train(inputs, targets, learningRate) {
    for (let i = 0; i < inputs.length; i++) {
      let gradients = this.backward(inputs[i], targets[i]);
      for (let j = 0; j < this.weights.length; j++) {
        this.weights[j].subtract(gradients[j].weights.multiply(learningRate));
        this.biases[j].subtract(gradients[j].biases.multiply(learningRate));
      }
    }
  }
}

应用于 Chrome 恐龙游戏

现在我们有了自己的深度学习库,我们可以将它应用于 Chrome 恐龙游戏中。

收集数据

我们需要收集恐龙在游戏中遇到的障碍物数据,包括恐龙的当前位置、障碍物的位置和类型等。

训练模型

我们使用收集到的数据训练神经网络,预测恐龙是否应该跳跃或下蹲以躲避障碍物。

控制恐龙

训练完成后,我们将神经网络部署到游戏中,实时预测恐龙的动作。

结论

通过构建自己的深度学习库并将其应用于 Chrome 恐龙游戏中,我们不仅了解了深度学习的基本原理,还体验了其在实际应用中的力量。在接下来的章节中,我们将深入探讨深度学习的更多高级概念,例如卷积神经网络和循环神经网络。