Я только что реализовал Q-Learning без нейронных сетей, но я застрял в реализации их с помощью нейронных сетей.
Я дам вам псевдокод, показывающий, как реализовано мое Q-Learning:
train(int iterations)
buffer = empty buffer
for i = 0 while i < iterations:
move = null
if random(0,1) > threshold:
move = random_move()
else
move = network_calculate_move()
input_to_network = game.getInput()
output_of_network = network.calculate(input_to_network)
game.makeMove(move)
reward = game.getReward()
maximum_next_q_value = max(network.calculate(game.getInput()))
if reward is 1 or -1: //either lost or won
output_of_network[move] = reward
else:
output_of_network[move] = reward + discount_factor * max
buffer.add(input_to_network, output_of_network)
if buffer is full:
buffer.remove_oldest()
train_network()
train_network(buffer b):
batch = b.extract_random_batch(batch_size)
for each input,output in batch:
network.train(input, output, learning_rate) //one forward/backward pass
Моя проблема сейчас в том, что этот код работает с размером буфера меньше 200. Для любого буфера больше 200 мой код больше не работает, поэтому у меня есть несколько вопросов:
- Это правильная реализация? (В теории)
- Насколько велик размер пакета по сравнению с размером буфера
- Как обычно тренировать сеть? На сколько долго? Пока не будет достигнута конкретная MSE всей партии?