나는 이전에 -120대에서 MountainCar 구현을 마무리 지었지만, 공식 문서에서는 100개 이상의 trials에서 -110 이상의 Reward를 문제 해결의 기준으로 판단한다.
MountainCar v0
A toolkit for developing and comparing reinforcement learning algorithms. - openai/gym
github.com
그래서, 이러한 찜찜함을 제거하기 위해, MountainCar 문제에 마저 도전을 수행해보았다.
DDQN 적용
- Double DQN
- 최적 행동 선택과 행동 가치 평가(Q값 평가)의 신경망 분리
- 학습 시의 실시간 모멘텀을 가치 평가와 분리하면, 순간적으로 가치가 높아진 잘못된 행동을 계속 선택하는 현상을 막을 수 있다.



하지만, 큰 차이가 없었다.
- 어차피 행동이 두 가지밖에 없는데, DDQN이라는 모델이 해결하려는 "잘못된 선택"이라는 개념이 크게 작용하진 못한 듯? 하다.
- 정량적인 비교 도구를 선택하고 사용할 지식이, 아직은 나에겐 너무 부족하다.
- 이 때문에, 추측으로 우선 결론을 내려야 했다.
- 우선, 결과 자체가 큰 차이가 없으니, 다른 방안을 고려해보자.
DDQN 제거 / 그라디언트 클리핑 적용
- 이전 PPO에서 학습했던 클리핑 개념을 여기에 도입하는 건 어떨까?
- 모멘텀 자체를 줄이기엔, 행동 선택과 행동 평가 분리보단 클리핑으로 강제하는 것이 좀 더 유리해보였다.
[논문 리뷰] Proximal Policy Optimization Algorithms
본 글은 "Proximal Policy Optimization Algorithms” (Schulman, Wolski, Dhariwal, Radford, Klimov, 2017)를 읽고 리뷰한 내용입니다. Proximal Policy Optimization AlgorithmsWe propose a new family of policy gradient methods for reinforcement lear
dev.go-gradually.me


표기 기준 자체를 잘못 잡았나? - 표기 기준 변경
절대적인 학습 수가 모자를 가능성을 생각해봤다.
episode 기준으로 하면, 절대적인 학습 수가 부족해질 가능성이 있다.
Episode 기준과 timesteps 기준의 차이
episode 기준은 “몇 판 할지”를 고정한다.
- 예: episodes=100
- 각 판 길이는 환경과 정책에 따라 달라진다.
- MountainCar는 못 배우면 한 판이 거의 200 step까지 가고, 잘 배우면 더 빨리 끝날 수 있다.
- 그래서 같은 100 episodes라도 실제 총 step 수는 run마다 달라지게 된다.
timesteps 기준은 “환경과 몇 번 상호작용할지”를 고정한다.
- 예: total_timesteps=120000
- env.step()을 120000번 하면 종료한다.
- 에피소드가 길어지든 짧아지든 총 학습량은 동일해진다.
그렇다면, 기존에 나는 왜 episode 기준으로 하려 했는가?
- 과대적합이 발생하지 않는, 최고의 결과를 출력하기까지의 적절한 episode의 수를 찾기 위해.
하지만,
- 강화학습은 episode 별로 진행되지 않고, steps 별로 진행된다.
- 강화학습은 매번 학습 결과가 달라지기 때문에, 적절한 episode 수가 매번 달라진다.
- 그와 반대로, 학습을 진행할 timesteps 는 일정하게 유지가 가능하고, 재현하기 쉽다.
즉,
- 일정한 학습 횟수를 보장하려면, 학습을 진행할 steps 기준으로 기록해야 한다.
한번 더 정리하면 다음과 같다.
- episode 기준 장점: 사람이 읽기 쉽다. “700판 학습”이 확실히 직관적이었다.
- episode 기준 단점: 총 학습량이 들쭉날쭉해서 학습 횟수가 매번 달라진다.
- timesteps 기준 장점: 총 학습 수가 정확하게 고정되서 하이퍼파라미터 의미가 확실해진다.
- timesteps 기준 단점: 기존 에피소드 기반 집계 방식은 이해하기 편했는데, 이 timesteps 방식은 집계 정책을 이에 맞게 새로 정해야 한다.
그렇다면, 어떻게 결과를 시각화해야 하는가?
크게 다음 두 가지를 고려할 수 있었다.
- 학습이 완료된 시점에서, 에피소드를 다시 한 번 수행해, 실제 reward를 평균내는 것
- 고정 시점(에피소드가 완료됐을 때 | 고정된 timestamp)마다 evaluation 에피소드를 수행해, 에피소드/타임스탬프 별 reward를 기록하는 것
기존 데이터와 형식이 많이 달라지지만, 좀 더 의미있는 데이터를 수집할 수 있기 때문에 변경한다.

항상 12만 step까지 학습을 진행했을 때의 결과 - 과거 방식 표기

- 12만 스텝까지 기준으로 학습을 진행했더니, -100까지 보상이 올라가는 추세를 볼 수 있었다.
- 하지만, 현재 학습 결과에서는 700 에피소드 이후의 결과가 기록되지 않고 있다.
- 학습 흐름을 잘 타면 이론상 1200 에피소드까지 볼 수 있다.
5000 타임스탬프마다 evaluation 에피소드를 수행해, 에피소드/타임스탬프 별 reward를 기록한 방식

생각보다 최종 reward가 너무 낮았다.
하지만, 상승 추세는 꾸준히 꺾이지 않았기에, 24만 steps까지 진행시켜 좀 더 높은 결과를 기대해보았다.

그 결과, 여전히 -110은 넘기지 못하는 결과를 볼 수 있었다.
슬슬 떠올랐던 아이디어를 전부 소진하고 말았다.
이쯤 되니 드는 생각은, 지금 내 수준에 맞지 않게 어렵게 풀고 있다는 생각이다.
현실성을 위해 최대한 난수로 수행하고 있었지만, 최적화 난이도가 너무 높아지고 있다는 생각이 들었다.
테스트를 위해서 평가 환경의 시드값을 고정하자.
일단 하나의 시드 기준으로 최적화된 값을 찾고, 랜덤 시드로 이동하는 것이 나을 듯 하단 생각이 들었다.
마의 -110 벽을 깨고 싶은데, 쉽지 않은 듯 하다.
그래도, 일단 먼저 쉽게 풀고, 점차 어렵게 풀면 어려운 문제라도 풀 수 있다고 생각한다.
이 과정에서 모델을 읽고 판단하는 능력을 기르고 있으니, 일단 이번엔 여기까지 하고 다른 중요한 일들을 좀 더 할 예정이다.
나중에 RL을 이용해 상품을 만들고 싶어도, 일단 현재 본업은 개발자니 이에 집중할 예정이다.
'Article - 깊게 탐구하기 > OpenAI Gym' 카테고리의 다른 글
| MountainCar - Policy Gradient Methods, 그리고 회귀 (0) | 2025.09.28 |
|---|---|
| MountainCar - 단순 DQN으로 풀기 (0) | 2025.09.06 |
| Pytorch GPU 사용 방법 (0) | 2025.09.05 |