Что делает арифметика внутри np.argmax? - PullRequest
0 голосов
/ 10 мая 2018

Я исследую и пытаюсь реализовать пример Q-Learning.До сих пор мне удавалось медленно следовать коду, разбивая его на части и выясняя, как он работает, однако я наткнулся на крошечный фрагмент, который не могу понять, почему он существует ...

action = np.argmax(q_learning_table[state,:] + np.random.randn(1, 4))

Из того, что я понял, действие выбирается из таблицы Q-Learning, но только из определенной строки в матрице, независимо от значения state.Чего я не понимаю, так это того, почему на местном уровне я нуждаюсь в np.random.randn(1, 4).

. Я попытался понять это следующим образом:

A = np.matrix([[0, 0, 5, 0], [4, 0, 0, 0], [0, 0, 0, 9])
a = np.argmax(A[2,:] + 100)
print(a)

Я понимаю, что ядолжен увидеть результат 103, а не 3 (местоположение 9).Итак, почему я все еще вижу 3.Какова цель добавления 100?

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Скорее всего, это случайный шум, чтобы стимулировать исследование. Это так, что QL не будет придерживаться единственного случайного хорошего решения и попытаться найти, возможно, лучшее решение.

Кроме того, np.argmax(x) возвращает индекс самого большого элемента в массиве. Не ценность. Это np.max(x).

# Largest value is at index 2
np.argmax([1,3,9,4,5,6,3]) -> 2

# Largest value is 9
np.max([1,3,9,4,5,6,3]) -> 9
0 голосов
/ 10 мая 2018

Целью фазы обучения Q-learning является создание Q-таблицы, которая представляет оптимальную политику, то есть таблицу, которая точно прогнозирует совокупное вознаграждение за каждое потенциальное действие в данном состоянии.

Во время обучения необходимо вводить случайные действия, чтобы учащийся получал стимул исследовать доступное пространство состояний и получать новый опыт. Без этой случайности ученик быстро сойдет к неоптимальной политике, потому что он будет постоянно выбирать одни и те же действия, основываясь на ограниченном количестве опыта.

В вашем примере вызов np.random.randn() вводит эту случайность. Это добавляет шум на основе стандартного нормального распределения. Затем вызов np.argmax() возвращает индекс максимального значения в массиве, в данном случае максимальное вознаграждение за каждое потенциальное действие с добавленным шумом.

0 голосов
/ 10 мая 2018
In [12]: A = np.array([[0, 0, 5, 0], [4, 0, 0, 0], [0, 0, 0, 9]])
In [13]: A
Out[13]: 
array([[0, 0, 5, 0],
       [4, 0, 0, 0],
       [0, 0, 0, 9]])

argmax возвращает индекс самого большого элемента в массиве:

In [14]: np.argmax(A)
Out[14]: 11
In [15]: A.ravel()
Out[15]: array([0, 0, 5, 0, 4, 0, 0, 0, 0, 0, 0, 9])

Без axis он обрабатывает массив как 1d. С осью это выглядит по строке или столбцу:

In [16]: np.argmax(A, axis=0)
Out[16]: array([1, 0, 0, 2], dtype=int32)
In [17]: np.argmax(A, axis=1)
Out[17]: array([2, 0, 3], dtype=int32)

Добавление значения 100 или произвольного массива изменяет значения в массиве, который видит argmax. Простое добавление скаляра не меняет местоположение максимального значения. Добавление случайного массива может изменить местоположение.

np.argmax(q_learning_table[state,:] + np.random.randn(1, 4))

есть

arr = q_learning_table[state,:] + np.random.randn(1, 4)
np.argmax(arr)

То есть Python сначала оценивает аргументы и передает результат argmax. Математика не делается внутри argmax. Это делается до того, как argmax будет запущен.

Добавление случайного массива в A может изменить местоположение максимума:

In [24]: A + np.random.randint(0,20, A.shape)
Out[24]: 
array([[ 2,  2, 10,  3],
       [ 7,  9, 13,  6],
       [ 3, 14, 10, 13]])
In [25]: np.argmax(_)
Out[25]: 9
...