Модель обучения подкреплению с отсроченным вознаграждением - PullRequest
0 голосов
/ 01 апреля 2019

Я смоделировал игру на питоне.Когда игра вызывается, она выполняет полный цикл со случайным игроком, игроком дерева решений и одним игроком RL.Когда обучающийся игрок должен принять решение, игра вызывает функцию run_network (), которая возвращает действие.В конце полной игры запускается update_reward ().

У меня задержка награды, и между наградами может быть любое количество состояний и действий.Только положительные награды обновляются в списке состояний и действий pos_rewards и никогда не удаляются.

В конце каждой игры я получаю распечатку о том, кто выиграл. Игрок RL еще ничего не выигрывает, хотя каждая игра занимает минуту и ​​становится все длиннее.

from keras.models import model_from_json
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
import Game

def update_reward(pos_rewards):
    vec = np.asarray(pos_rewards)
    x = vec[:, 3:-1]
    y = vec[:, -1]
    y_cat = np.zeros((len(y), 7))
    for i in range(len(y)):
        if y[i] == 0:
            y_cat[i] = [1, 0, 0, 0, 0, 0, 0]
        elif y[i] == 1:
            y_cat[i] = [0, 1, 0, 0, 0, 0, 0]
        elif y[i] == 2:
            y_cat[i] = [0, 0, 1, 0, 0, 0, 0]
        elif y[i] == 3:
            y_cat[i] = [0, 0, 0, 1, 0, 0, 0]
        elif y[i] == 4:
            y_cat[i] = [0, 0, 0, 0, 1, 0, 0]
        elif y[i] == 5:
            y_cat[i] = [0, 0, 0, 0, 0, 1, 0]
        elif y[i] == 6:
            y_cat[i] = [0, 0, 0, 0, 0, 0, 1]

    model.fit(x, y_cat, batch_size=5000, epochs=1, verbose=0)
    model.save_weights(model_file)
    with open(arch_file, "w") as json_file:
        json_file.write(model.to_json())

def run_network(state):
    x = np.array(state[3:])
    x = x.reshape(1, 176)
    p = model.predict(x)
    action = p.argmax(axis=0)
return action

arch_file = 'D:\\model\\rl_arch.json'
model_file = 'D:\\model\\rl_model.h5'
start_new = 0
if start_new == 1:
    model = Sequential()
    model.add(Dense(units=500, activation='relu', input_dim=176))
    ...
    model.add(Dense(units=25, activation='relu'))
    model.add(Dropout(0.3))
    model.add(Dense(7, activation='softmax'))
else:
    with open(f_arch, 'r') as json_file:
        model = model_from_json(json_file.read())
    model.load_weights(f_model)
model.compile(loss='categorical_crossentropy', optimizer='adam')
Game.tournament(10000)

Вопросы:

Когда я сохраню созданные веса, а затем решу снова выполнить весь процесс, мои веса полностью переопределятся или каждый прогон улучшит модель?

Существуют ли какие-либо статистические методы, которые я могу применить для повышения производительности модели без полного переписывания моего кода?

...