Подтвердить что ты не робот

Почему моя сеть Deep Q не создает простой Gridworld (Tensorflow)? (Как оценить Deep-Q-Net)

Я пытаюсь ознакомиться с Q-learning и Deep Neural Networks, которые в настоящее время пытаются реализовать Игра в Atari с углубленным обучением.

Чтобы проверить мою реализацию и поиграть с ней, я стараюсь, чтобы попробовал простой сетевой мир. Где у меня есть сетка N x N и начинаются в верхнем левом углу и заканчиваются в правом нижнем углу. Возможные действия: влево, вверх, вправо, вниз.

Несмотря на то, что моя реализация очень похожа на на этот (надеюсь, что она хорошая), она, похоже, ничего не узнает. Глядя на общие шаги, которые ему нужно закончить (я думаю, что средний показатель будет равным 500 с грифом 10x10, но там также очень низкие и высокие значения), он кажется более случайным, чем что-либо еще для меня.

Я пробовал его с и без сверточных слоев и играл со всеми параметрами, но, честно говоря, я понятия не имею, что что-то с моей реализацией неверно или ему нужно тренироваться дольше (я позволил ему тренироваться довольно долго ) или что бы то ни было. Но, по крайней мере, это швы, чтобы сходиться, здесь сюжет потери стоимости один учебный сеанс:

Изображение потерь

Итак, в чем проблема в этом случае?

Но также и, возможно, более важно, как я могу "отладить" этот Deep-Q-Nets, в контролируемом обучении есть тренировочные, тестовые и валидационные наборы и, например, с точностью и отзывом, их можно оценить. Какие варианты у меня есть для неконтролируемого обучения с помощью Deep-Q-Nets, так что в следующий раз, возможно, я смогу самостоятельно его исправить?

Наконец, вот код:

Это сеть:

ACTIONS = 5

# Inputs
x = tf.placeholder('float', shape=[None, 10, 10, 4])
y = tf.placeholder('float', shape=[None])
a = tf.placeholder('float', shape=[None, ACTIONS])

# Layer 1 Conv1 - input
with tf.name_scope('Layer1'):
    W_conv1 = weight_variable([8,8,4,8])
    b_conv1 = bias_variable([8])    
    h_conv1 = tf.nn.relu(conv2d(x, W_conv1, 5)+b_conv1)

# Layer 2 Conv2 - hidden1 
with tf.name_scope('Layer2'):
    W_conv2 = weight_variable([2,2,8,8])
    b_conv2 = bias_variable([8])
    h_conv2 = tf.nn.relu(conv2d(h_conv1, W_conv2, 1)+b_conv2)
    h_conv2_max_pool = max_pool_2x2(h_conv2)

# Layer 3 fc1 - hidden 2
with tf.name_scope('Layer3'):
    W_fc1 = weight_variable([8, 32])
    b_fc1 = bias_variable([32])
    h_conv2_flat = tf.reshape(h_conv2_max_pool, [-1, 8])
    h_fc1 = tf.nn.relu(tf.matmul(h_conv2_flat, W_fc1)+b_fc1)

# Layer 4 fc2 - readout
with tf.name_scope('Layer4'):
    W_fc2 = weight_variable([32, ACTIONS])
    b_fc2 = bias_variable([ACTIONS])
    readout = tf.matmul(h_fc1, W_fc2)+ b_fc2

# Training
with tf.name_scope('training'):
    readout_action = tf.reduce_sum(tf.mul(readout, a), reduction_indices=1)
    loss = tf.reduce_mean(tf.square(y - readout_action))
    train = tf.train.AdamOptimizer(1e-6).minimize(loss)

    loss_summ = tf.scalar_summary('loss', loss)

И здесь обучение:

# 0 => left
# 1 => up
# 2 => right
# 3 => down
# 4 = noop

ACTIONS = 5
GAMMA = 0.95
BATCH = 50
TRANSITIONS = 2000
OBSERVATIONS = 1000
MAXSTEPS = 1000

D = deque()
epsilon = 1

average = 0
for episode in xrange(1000):
    step_count = 0
    game_ended = False

    state = np.array([0.0]*100, float).reshape(100)
    state[0] = 1

    rsh_state = state.reshape(10,10)
    s = np.stack((rsh_state, rsh_state, rsh_state, rsh_state), axis=2)

    while step_count < MAXSTEPS and not game_ended:
        reward = 0
        step_count += 1

        read = readout.eval(feed_dict={x: [s]})[0]

        act = np.zeros(ACTIONS)
        action = random.randint(0,4)
        if len(D) > OBSERVATIONS and random.random() > epsilon:
            action = np.argmax(read)
        act[action] = 1

        # play the game
        pos_idx = state.argmax(axis=0)
        pos = pos_idx + 1

        state[pos_idx] = 0
        if action == 0 and pos%10 != 1: #left
            state[pos_idx-1] = 1
        elif action == 1 and pos > 10: #up
            state[pos_idx-10] = 1
        elif action == 2 and pos%10 != 0: #right
            state[pos_idx+1] = 1
        elif action == 3 and pos < 91: #down
            state[pos_idx+10] = 1
        else: #noop
            state[pos_idx] = 1
            pass

        if state.argmax(axis=0) == pos_idx and reward > 0:
            reward -= 0.0001

        if step_count == MAXSTEPS:
            reward -= 100
        elif state[99] == 1: # reward & finished
            reward += 100
            game_ended = True
        else:
            reward -= 1


        s_old = np.copy(s)
        s = np.append(s[:,:,1:], state.reshape(10,10,1), axis=2)

        D.append((s_old, act, reward, s))
        if len(D) > TRANSITIONS:
            D.popleft()

        if len(D) > OBSERVATIONS:
            minibatch = random.sample(D, BATCH)

            s_j_batch = [d[0] for d in minibatch]
            a_batch = [d[1] for d in minibatch]
            r_batch = [d[2] for d in minibatch]
            s_j1_batch = [d[3] for d in minibatch]

            readout_j1_batch = readout.eval(feed_dict={x:s_j1_batch})
            y_batch = []

            for i in xrange(0, len(minibatch)):
                y_batch.append(r_batch[i] + GAMMA * np.max(readout_j1_batch[i]))

            train.run(feed_dict={x: s_j_batch, y: y_batch, a: a_batch})

        if epsilon > 0.05:
            epsilon -= 0.01

Я ценю каждую помощь и идеи, которые у вас могут быть!

4b9b3361

Ответ 1

Для тех, кого это интересует, я скорректировал параметры и модель, но самым большим улучшением было переход на простую кормовую сеть с 3 слоями и около 50 нейронов в скрытом слое. Для меня это тогда сходилось в довольно приличное время.

Btw оценены дополнительные советы для отладки!

Ответ 2

Итак, это было довольно давно, когда я написал этот вопрос, но он швыряет, что все еще есть довольно большой интерес и запрос на запуск кода. Наконец я решил создать репозиторий github

Поскольку это довольно давно, я написал его и т.д., он не будет работать из коробки, но не должно быть так сложно заставить его работать. Итак, вот глубокая сеть q и пример, который я написал в то время, которое тогда работало, надеюсь, вам понравится: Ссылка на глубокий q репозиторий

Было бы неплохо увидеть какой-то вклад, и если вы исправите его и запустите его, сделайте запрос на растяжение!