Я хочу создать ИИ, который будет хорошо играть в сокобан, я использую MCTS и нейронные сети, вдохновленные LeelaZero . Я использую tenorflow.js для самостоятельной игры и тренировок, так что это легко, и я могу отлаживать и учиться быстрее. Вот краткий обзор моего кода:
function loadWeights() {
return tf.loadLayersModel('indexeddb://model');
}
function saveWeights(model) {
model.save("indexeddb://model");
}
function MakeNetwork() {
const hiddenNodes = 8,
inputNodes = 58;
return tf.sequential({
layers: [
tf.layers.conv2d({
filters: 128,
kernelSize: 3,
strides: 1,
activation: 'relu',
inputShape: [inputNodes, 8, 8],
}),
tf.layers.conv2d({
filters: 256,
kernelSize: 3,
strides: 1,
activation: 'relu',
}),
tf.layers.conv2d({
filters: 256,
kernelSize: 3,
strides: 1,
activation: 'relu',
}),
tf.layers.flatten(),
tf.layers.dense({
units: 100,
activation: 'relu'
}),
tf.layers.dense({
units: 4,
activation: 'softmax'
})
]
});
}
const kInputPlanes = 58;
function train(model, data) {
model.compile({
optimizer: 'sgd',
loss: 'meanSquaredError',
metrics: ['accuracy']
});
let xsBuffer = tf.buffer([data.length, kInputPlanes, 8, 8]);
fillWithData(xsBuffer.values, data);
xsBuffer = xsBuffer.toTensor();
let xs,
vYs = fillWithData(data);
xs = xsBuffer.reshape([-1, kInputPlanes, 8, 8]),
vYs = tf.tensor1d(vYs);
return model.fit(xs, vYs).then(hs => {
saveWeights(model);
});
}
function Network(model) {
let output;
this.compute = (data) => {
const buffer = tf.buffer([data.length, kInputPlanes, 8, 8]);
fillWithData(buffer.values);
let xs = buffer.toTensor();
xs = xs.reshape([-1, kInputPlanes, 8, 8]);
output = model.predict(input);
}
this.predict = (sample) => {
output.dataSync()[sample);
};
}
function Search(model) {
const tree = {},
data = {},
network = new Network(model);
this.run = () => {
makeData(data);
network.compute(data);
const prediction = network.predict(0);
tree = improveTree(prediction);
};
this.getTrainingData = () => {
return makeTrainingData(tree);
};
}
function MainApi() {
loadWeights().catch(e => {
saveWeights(weights);
});
return {
train() {
return loadWeights().then(model => {
const data = getTrainingData();
return train(model, data);
});
},
selfPlay() {
loadWeights().then(model => {
const search = new Search(model);
search.run();
const data = search.getTrainingData();
writeTrainingData(data);
});
}
};
}
Проблема в том, что ИИ не учится, и я не могу отладить свой прогресс. Я вижу, что MCTS работает, видя, что ИИ избегает простых потерь позиций, но часть нейронной сети не работает. ИИ не становится лучше.
Что может быть не так с моим кодом, и как я могу отладить мой прогресс?
Кроме того, это занимает много времени для самостоятельной игры и тренировок, в основном я устанавливаю порог в 30 секунд на ход и играю в 100 игр, для завершения требуется не менее 15 минут. Тогда тренировка тоже занимает 10-15 минут. Иногда я получаю
webgl context lost
ошибка. Я беспокоюсь, что мой ноутбук сломается.
Опасно ли постоянно использовать мой ноутбук для этих вычислений в браузере, как если бы мой ноутбук был поврежден?