Я пытаюсь понять код пони Карпати в Python, объясненный здесь: Пон Карпати
# forward the policy network and sample an action from the returned probability
#########action 2 is up and 3 is down
aprob, h = policy_forward(x)
print("aprob\n {}\n h\n {}\n".format(aprob, h))
#2 is up, 3 is down
action = 2 if np.random.uniform() < aprob else 3 # roll the dice!
print("action\n {}\n".format(action))
# record various intermediates (needed later for backprop)
xs.append(x) # observation, ie. the difference frame?
#print("xs {}".format(xs))
hs.append(h) # hidden state obtained from forward pass
#print("hs {}".format(hs))
#if action is up, y = 1, else 0
y = 1 if action == 2 else 0 # a "fake label"
print("y \n{}\n".format(y))
dlogps.append(y - aprob) # grad that encourages the action that was taken to be taken (see http://cs231n.github.io/neural-networks-2/#losses if confused)
print("dlogps\n {}\n".format(dlogps))
# step the environment and get new measurements
observation, reward, done, info = env.step(action)
print("observation\n {}\n reward\n {}\n done\n {}\n ".format(observation, reward, done))
reward_sum += reward
print("reward_sum\n {}\n".format(reward_sum))
drs.append(reward) # record reward (has to be done after we call step() to get reward for previous action)
print("drs\n {}\n".format(drs))
if done: # an episode finished
episode_number += 1
В приведенном выше фрагменте я не совсем понимаю, зачем нужен поддельный ярлыки что это значит:
dlogps.append(y - aprob)# grad that encourages the action that was taken to be taken (see http://cs231n.github.io/neural-networks-2/#losses if confused)
Почему это фальшивый ярлык y
минус aprob
?
Насколько я понимаю, сеть выводит «логарифмическую вероятность» движения вверх, но тогда объяснение, по-видимому, указывает на то, что метка должна фактически быть наградой, полученной за выполнение этого действия, а затем поощрять все действия в эпизоде, еслиэто выигрышный.Таким образом, я не понимаю, как помогает поддельная метка 1 или 0.
Также в функции прямого прохода нет операции регистрации, так как же это вероятность записи?
#forward pass, how is logp a logp without any log operation?????
def policy_forward(x):
h = np.dot(model['W1'], x)
h[h<0] = 0 # ReLU nonlinearity
logp = np.dot(model['W2'], h)
p = sigmoid(logp)
#print("p\n {}\n and h\n {}\n".format(p, h))
return p, h # return probability of taking action 2 (up), and hidden state
Редактировать:
Я использовал операторы print, чтобы увидеть, что происходит под капотом, и обнаружил, что, поскольку y=0
для действия вниз, (y - aprob)
будет отрицательным для действия вниз.Его формула для модуляции градиента с преимуществом epdlogp *= discounted_epr
все еще заканчивается тем, что указывает на то, был ли хороший шаг вниз, т.е.отрицательное число или плохое, т.е.положительное число.
И для действия вверх, обратное верно, когда применяется формула.то есть.положительное число для epdlogp *= discounted_epr
означает, что действие было хорошим, а отрицательное означает, что действие было плохим.
Так что это, кажется, довольно аккуратный способ реализации, но я до сих пор не понимаю, как aprob
, возвращенный с прямого прохода, являетсяВероятность логирования, поскольку вывод на консоль выглядит следующим образом:
aprob
0.5
action
3
aprob
0.5010495775824385
action
2
aprob
0.5023498477623756
action
2
aprob
0.5051575154468827
action
2
Те, которые выглядят как вероятности в диапазоне от 0 до 1. Так что использование y - aprob
в качестве «логарифмической вероятности» - это просто взлом, который приходит с интуицией, разработанной для многихмесяцы и годы практики?Если да, то обнаружены ли эти хаки методом проб и ошибок?
Редактировать: Благодаря прекрасному объяснению Томми, я знал, где искать в своих видео-курсах по Udacity Deep Learning информацию о вероятностях регистрации и перекрестной энтропии: https://www.youtube.com/watch?time_continue=94&v=iREoPUrpXvE
Кроме того, этопомогли читы: https://ml -cheatsheet.readthedocs.io / en / latest / loss_functions.html