Karpathy Pong объяснение кросс-энтропии / потери логарифма для y - aprob - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь понять код пони Карпати в 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

1 Ответ

0 голосов
/ 04 апреля 2019

Мое объяснение того, как он добирается до (y-aprob):

Когда он делает прямой проход через свою сеть, последний шаг - применение сигмоиды S (x) квыход последнего нейрона.

S(x) = 1 / (1+e^-x)  

и его градиент

grad S(x) = S(x)(1-S(X))

Чтобы увеличить / уменьшить вероятность ваших действий, вы должны рассчитать журнал вероятностей ваших «меток»

L = log p(y|x)  

Для обратного распространения вы должны рассчитать градиент вероятности L

grad L = grad log p(y|x)

Поскольку вы применили сигмоидную функцию p = S (y) к своему выходу, вы фактически рассчитываете

grad L = grad log S(y)   
grad L = 1 / S(y) * S(y)(1-(S(y))  
grad L = (1-S(y))  
**grad L = (1-p)**

На самом деле это не что иное, как Потеря / Перекрестная Энтропия.Более общая формула была бы такой:

L = - (y log p + (1-y)log(1-p))  
grad L = y-p with y either 0 or 1

Поскольку Андрей не использовал в своем примере фреймворки, такие как Tensorflow или PyTorch, он тут же сделал обратное распространение.

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

По крайней мере, это мое скромное понимание его кода:)

...