여기에 서술되어 있는 내용들이 여러분들이 지금까지 작업 했던 것과 다르다고 해서 그러한 과정들이 의미없다는 것은 절대 아니고 조금씩 실력이 쌓여가는 과정중에 있다고 저는 그렇게 생각합니다. 어찌되었든 지금까지 스스로 생각해낸 모든 아이디어들을 저는 칭찬드리고 싶어요. (발표시간때 알려주면 더욱 좋구요~) 앞으로 남은 시간동안 파이팅입니다!

Step 1. 중심을 잡는 Cartpole

강화학습 문제 1차시에서 했던 것입니다. 혹여나 코드를 다시 봐야겠다고 생각되면 스터디원의 코드를 참고해 볼 수 있습니다.

중심을 잡는 Cartpole을 학습시키고 Cartpole의 중심이 세워지는 걸 render_mode='human' 을 통해 직접 확인합니다. 물론, Step 1은 안해도 됩니다.

Step 2. 특정 위치로 움직이는 Cartpole

일단은 특정 위치로 움직이는 Cartpole을 만들어봅니다. 예를 들어 Cartpole이 중심을 잡으면서 -1의 위치로 이동하게 할 수 있습니다. 그렇게 하기 위해서는 Step 1의 코드에서 보상 함수 체계를 수정함으로써 실현할 수 있습니다.

-1의 위치로 옮기려면 어떻게 보상 함수를 바꿔야 할까요? 보상 함수를 설계하는 데 있어서 여러 가지 중요한 것들이 있습니다.

첫 번째로, 현재 state에서 다음 state로 넘어갈 때 설계한 목표에 가까워졌다면 양의 reward를 줄 수 있습니다. 반대로 우리가 설계한 목표에 오히려 멀어졌다면 음의 reward를 줄 수 있습니다.

저희 목표는 카트를 -1의 위치로 옮기는 것이므로

그렇기에 아래 코드와 같이 -1의 중심에 있거나, -1을 중심으로 가까워지면 양의 리워드, 멀어지면 음의 리워드를 주도록 설계해볼 수 있습니다.

cart_pos = state[0]
next_cart_pos = next_state[0]

if -1.1 < next_cart_pos < -0.9:  # 목표 지점에 도달할 경우
    reward = (양수)

elif cart_pos > -0.9:  # 카트가 -1보다 오른쪽에 있는 경우
    if next_cart_pos < cart_pos:  # pos 값은 작아져야 한다!
        reward = (양수)
    else:
        reward = (음수)
else:  # 카트가 -1보다 왼쪽에 있는 경우
    if next_cart_pos > cart_pos:  # pos 값은 커져야 한다!
        reward = (양수)
    else:
        reward = (음수)

두 번째로, reward의 정도를 결정한 조건문이 최적의 행동을 하는데 방해가 될 가능성을 확인합니다. 카트가 왼쪽으로 가면 좋은 보상이고 오른쪽으로 가면 나쁜 보상이어서 무작정 왼쪽으로 가다가는 막대가 쓰러지게 됩니다. 결국 왼쪽으로 가기 위해서는 초반에는 오른쪽으로 가야만 합니다. 그렇기에 음의 보상은 조금 더 약하게 줄 필요가 있습니다.

세 번째로, 강화학습에서는 보상 함수와 더불어서 반드시 맞춰주어야 하는게, 탐색하는 과정에서 사용자가 설정한 보상함수 조건에 들어갈 수 있는가? 입니다. Step 1에서 중심이 세워지는 것을 상기해봅시다. 중심이 세워지긴 하지만 뭔가 좌나 우로 쭉 빠지는 경우도 볼 수 있습니다. 이러한 과정으로 탐색이 이루어져 설계한 보상함수 조건에 들어가는 모습을 볼 수 있습니다.

네 번째로, 종단 사건에 대해서 큰 리워드를 부여해야 합니다. 해당 문제에서 종단 사건은 한 가지로 카트가 쓰러졌을 때입니다. 조건문 순서를 잘 확인하여 보상 함수가 잘못 처리되지 않도록 주의해주세요.

cart_pos = state[0]
next_cart_pos = next_state[0]

if cart_pos > -0.9:  # 카트가 -1보다 오른쪽에 있는 경우
    if next_cart_pos < cart_pos:  # pos 값은 작아져야 한다!
        reward = (양수)
    else:
        reward = (작은 음수)
else:  # 카트가 -1보다 왼쪽에 있는 경우
    if next_cart_pos > cart_pos:  # pos 값은 커져야 한다!
        reward = (양수)
    else:
        reward = (작은 음수)

if (막대기 넘어짐):
    reward = (큰 음수)

다섯 번째로, 상태와 행동으로 수행되는 업데이트 수식을 잘 생각해보아야 합니다. 현재 상태에서 수행한 행동의 가치는 업데이트 되기(닮아가기)를, 그 행동을 수행한 다음 상태의 최적 가치 함수($V_*(s')$)와 보상의 합입니다. 예를 들어, 카트가 -1 중심에 잘 있어서 비슷한 state에서 10의 reward를 계속 받는 경우 그 때의 가치 함수는 대략 10 + 등비급수(a=10, r=0.95) = 210 정도로 나올 겁니다.

여섯 번째로, reward의 구체적인 값은 옵티마이저의 learning rate, 할인율, 소프트맥스 기법으로 액션을 확률적으로 선택하는 방법 등등으로 결정이 됩니다. 예를 들어, 소프트맥스 기법으로 행동 가치 함수를 기반으로 액션을 확률적으로 선택하는 경우 두 행동 가치 함수의 값 차이로 행동의 확률이 결정되는데, 1차이만 나도 선택될 확률이 2.7배나 오릅니다.(2차이는 2.7의 제곱배)