목적 함수(object function)

Policy Gradient 목적 함수

수식을 요약하자면 여러번의 에피소드를 해당 정책에 따라 수행했을 때 발생하는 누적 보상 기대 값이다.
하지만 위 수식은 현실적으로 불가능하다. 이유는 해당 정책에 대한 모든 궤적을 실제로 구할 수 없기 때문이다.

현실적으로 타협한 방법

따라서 에이전트가 직접 환경과 상호작용하여 샘플링한 데이터를 수집하는 방법으로 가능하다.
 

목적 함수 최대화하기

목적 함수를 최대화하기 위해 사용한 방법은 'Policy Gradient Theorm' 이다.
직관적으로 말하자면 목적 함수의 Gradient 를 구해서 Gradent ascent를 하는 방법으로 목적 함수를 최대화 한다는 것이다.

목적 함수의 미분

 하지만 문제가 있다. 미분을 해야하는데 수식에 기대값 항이 있다. 우리의 목표는 모든 궤적에 대한 누적 보상값을 최대화 하는 것이라서 기대값은 빠질수 없다.
그래서 이를 해결하기위해 강화학습을 연구하는 사람들이 아래 수식으로 유도했다.

  • 수식 유도에 필요한 지식은 'log 성질, 미분 간단한 지식, Likelihood Ratio Trick' 이다.
  • 이렇게 유도하여 기대값은 그대로 두고 미분항을 log 항으로 옮겼다.
  • 가장 아래에서 세번째 수식에서 두번째 수식으로 갈때에는 Casuality를 고려하여 t' < t 에서의 보상값에 영향을 끼치지 못한다는 점을 고려하여 수식을 재구성할 수 있다.

아래는 위 수식에 대한 python 코드이다.

for episode in range(1000):
    log_probs, rewards = sample_episode(env, policy_net)
    returns = compute_returns(rewards)

    ###
    # Policy Gradient Loss: -∑(G_t * log_prob)
    # loss += -log_prob * G : 
    # 1. loss 값에 모두 더하는 이유는 기대 값 때문
    # 2. log_prob에 -를 취하는 이유는 Gradient ascent를 하기위함 (pytorch의 backward 함수 설명 참고)
    # 3. log_prob에 미분항은 어디에?? loss.backward 수행시 자동으로 계산해줌 (pytorch backward 함수 설명 참고)
    ###
    
    loss = 0
    for log_prob, G in zip(log_probs, returns):
        loss += -log_prob * G

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

 
코드상에서는 log 항에 대한 미분이 안보이지만 이는 pytorch 내부적으로 자동으로 backward 수행시 자동적으로 미분 계산 해준다.
코드는 

backward 수행시

 
-가 붙은 이유는 Gradient ascent를 하기 위함이다.
 
이상 2년 넘게 미뤄온 Policty Gradient 수학적으로 풀어보기 완료!

+ Recent posts