
본 실험은 OpenAI Gym의 CartPole-v1 환경에서 Q-learning을 적용하여 강화 학습을 진행한 실험이다.
일반적으로 CartPole 문제는 DQN(Deep Q-Network)을 이용하여 해결하는 경우가 많지만, 이번 실험에서는 저번에 공부한 Q-learning을 활용하여 학습 과정과 성능을 직접 확인하는 것을 목표로 하였다.
특히, 행동 선택 방식(Exploration Strategy)에 따른 학습 성능 차이가 궁금하여 각 방식에 대한 실험도 진행하였다.
첫 번째 방식은 Epsilon-Greedy(ε-그리디) 탐색법이며, 두 번째 방식은 Softmax Policy 기반 행동 선택이다.
추가적으로 Epsilon-Greedy 방식에서는 가우시안 노이즈(Gaussian Noise)를 적용하여 행동 선택의 다양성을 증가시켰다.
본 실험을 통해 각 행동 선택 방식이 학습 성능에 미치는 영향을 비교 분석하고, 어떤 방식이 CartPole 환경에서 더 효과적인 학습을 유도하는지 확인하는 것이 목적이다. 참고로 이 글에서는 실험에 진행한 코드가 등장하지 않고 결과적인 부분과 어떤식으로 코드를 구성하였는지만 나오는 글이다.
OpenAI Gym은 OpenAI에서 개발한 강화 학습 환경 라이브러리로, 다양한 RL 알고리즘을 연구하고 실험할 수 있도록 설계되었다. 이후 OpenAI가 Gym을 직접 관리하지 않기로 결정하면서, Gymnasium이 후속 프로젝트로 개발되었다. Gymnasium은 Farama Foundation에서 유지보수를 담당하며, OpenAI Gym과 완벽한 하위 호환성을 유지하면서도 더욱 안정적이고 확장 가능한 기능을 추가하였다.
CartPole은 고전 제어(Classic Control) 문제 중 하나로, 강화 학습(Reinforcement Learning, RL)에서 널리 사용되는 환경이다. 이 환경은 역진자(Inverted Pendulum) 문제를 기반으로 하며, 막대(Pole)가 수직으로 서 있도록 균형을 유지하는 것이 목표이다.


위 데이터는 OpenAi Gym에서 제공하는 가상의 물리적인 값으로 생각하면 된다. 앞으로 다양한 실습을 하기 위해서 위에서 설명하는 각 요소가 어떤 역할인지 잘 알아두면 좋다.
Action Space Discrete(2) (좌/우 이동)
Discrete(2): 이산 공간(Discrete) 형태이며, 두 개의 선택지만 존재함. 0: 수레(Cart)를 왼쪽으로 이동 1: 수레(Cart)를 오른쪽으로 이동 0을 선택하면 수레가 왼쪽으로 이동함. 1을 선택하면 수레가 오른쪽으로 이동함.Observation Shape (4,) (4개의 상태 변수)
(4,): 관측 공간(Observation Space)의 형태를 나타냄. [0.2, -0.5, 0.1, 0.02]Observation High [4.8, ∞, 0.42, ∞] (상태 변수의 최댓값)
4.8: 수레 위치(Cart Position)의 최댓값 (경계를 넘으면 종료) ∞: 수레 속도(Cart Velocity)의 최댓값 (이론적으로 제한 없음) 0.42: 막대 각도(Pole Angle)의 최댓값 (약 24도 이상 기울어지면 종료) ∞: 막대 각속도(Pole Angular Velocity)의 최댓값 (이론적으로 제한 없음) Observation Low [-4.8, -∞, -0.42, -∞] (상태 변수의 최솟값)
-4.8: 수레 위치(Cart Position)의 최솟값 (경계를 넘으면 종료) -∞: 수레 속도(Cart Velocity)의 최솟값 (이론적으로 제한 없음) -0.42: 막대 각도(Pole Angle)의 최솟값 (약 -24도 이하 기울어지면 종료) -∞: 막대 각속도(Pole Angular Velocity)의 최솟값 (이론적으로 제한 없음) Import gym.make("CartPole-v1") (환경 생성)
물리적 구조 및 목표
상태(State)와 행동(Action) 정의
Cart 위치, Cart 속도, 막대 각도, 막대 각속도 (총 4가지) 0: 왼쪽으로 힘을 가함 1: 오른쪽으로 힘을 가함 보상(Reward) 및 에피소드 종료 조건
env.step(action)을 수행하면 환경에서 기본적으로 제공하는 보상(reward)을 받음.
보상 시스템
+1 보상이 부여됨. 에피소드 종료 조건 (Penalty 적용 상황)
추가 패널티 적용
200 스텝을 채우지 못하고 종료되면 추가적인 패널티를 적용. reward = min(-(200 - cnt), -50) (최소 -50으로 제한). Gym을 이용한 환경 불러오기 환경 초기화 및 기본 동작 확인

강화 학습을 적용하여 에이전트가 학습하도록 함.
이 코드에서는 Q-learning 알고리즘을 사용하여 CartPole 환경에서 학습을 진행함. 보통 CartPole 문제는 DQN 알고리즘을 사용하여 구현하는 문제이다. 하지만 이번에는 Q-Learning의 공부를 확인하고 싶어 Q-Learning를 사용하여 CartPole의 문제를 해결하였다.
Q-table을 CartPole 환경을 기반으로 생성
Q-table은 CartPole의 상태 공간(Observation Space)과 행동 공간(Action Space)을 바탕으로 구성되었다.
CartPole의 환경 정보는 다음과 같다

위 정보를 바탕으로 Q-table을 구성
Action Space → Discrete(2): 두 가지 행동 (0: 왼쪽, 1: 오른쪽)
Observation Space → 4개의 상태 변수를 각각 20개 구간(bin)으로 이산화(Discretization)
따라서, Q-table의 크기는 (20, 20, 20, 20, 2) = 320,000개 상태-행동 쌍
bin 값이 많을수록 Q-table이 더욱 상세해져 학습이 잘 진행되는 것을 확인했다. bin 개수가 커질수록 메모리 사용량이 매우 증가하고 학습 시간이 길어지는 문제가 발생하였다. bin = 20이 한계였다. 주요 학습 과정
env.reset()) Q(s, a) = (1 - α) * Q(s, a) + α * (reward + γ * max Q(s', a')) 학습 목표
ε에 따라 탐색(랜덤 행동 선택)과 활용(최적 행동 선택)을 결정하는 방식. ε은 학습이 진행될수록 감소하도록 설정하여 초반에는 탐색을 많이 하고 후반에는 최적 정책을 따르게 함.처음에는 bin 값을 5로 설정하여 학습을 진행했으나, Q-table이 너무 거칠어져 학습이 제대로 이루어지지 않았다.
CartPole 환경에서 연속적인 상태를 이산화(Discretization)하여 학습하는 방식이기 때문에, bin 개수가 작을수록 Q-table의 해상도가 낮아지고 학습 성능이 저하되는 현상이 발생하였다.
이후 bin 값을 점차 증가시키면서 실험을 진행하였으며, Q-table이 세밀해질수록 학습 성능이 향상된다는 것을 확인할 수 있었다. 하지만 bin 값이 너무 커지면 메모리 사용량과 학습 시간이 급격히 증가하는 문제가 발생하였으며, 결과적으로 bin=20이 적절한 균형을 유지할 수 있는 최적의 값이었다.
이번 실험에서는 행동 선택 방식에 따른 학습 성능 비교를 진행하였다.
두 가지 방식(Epsilon-Greedy, Softmax)을 적용하여 학습을 수행하고, 각 방식의 학습 성능 및 수렴 속도를 비교하였다.
✅ Epsilon-Greedy 방식
✅ Softmax 방식
📌 결론:
결과적으로 모든 방식에서 학습이 원활하게 진행되었으며, CartPole의 목표를 성공적으로 달성할 수 있었다.
그중에서도 Epsilon-Greedy 방식이 학습 속도와 최종 성능 측면에서 더 우수한 결과를 보였다.
반면, Softmax 방식은 탐색이 지속적으로 이루어지지만, 일정 한계를 넘어서면 새로운 탐색을 시도하는 빈도가 줄어드는 경향이 나타났다. 즉, Softmax 방식은 현재의 최적 정책을 유지하려는 성향이 강해져, 더 높은 보상을 얻기 위한 도전이 제한되는 모습을 보였다.
반대로, Epsilon-Greedy 방식은 학습이 진행되면서도 지속적인 탐색을 수행하며, 더 나은 보상을 찾기 위해 시도하는 빈도가 높았다. 이러한 특성 덕분에 Epsilon-Greedy 방식이 보다 유연한 학습을 가능하게 하였으며, 최적 정책을 찾는 데 있어 더 효과적인 결과를 보였다.

위 영상은 Epsilon-Greedy 방식의 영상이다.
추가적으로 Epsilon-Greedy 방식에서 Q값에 가우시안 노이즈(Gaussian Noise)를 추가하는 실험을 진행하였다. 가우시안 노이즈를 적용하면 비슷한 Q값을 가진 행동 간에 선택 확률이 조금씩 변할 수 있도록 조정하는 역할을 한다.
하지만 실험 결과, 일반적인 Epsilon-Greedy 방식과 성능 차이가 없다 싶을 정도로 달라지지 않았다.
즉, 가우시안 노이즈를 추가한다고 학습이 크게 달라지지는 않았으며, Epsilon-Greedy만으로도 충분한 학습 성능을 확보할 수 있었다.
아래 그래프는 Epsilon-Greedy 방식과 Softmax 방식의 학습 진행 과정을 비교한 그래프로 각 방식에서 가장 학습이 잘 진행된 그래프들을 비교한 것이다.
각 실험에서 최소 보상(Min Reward), 최대 보상(Max Reward), 평균 보상(Average Reward)을 기록하여 학습 성능을 비교하였다. 그래프에서 파란색 선이 Epsilon-Greedy 방식, 주황색 선이 Softmax 방식을 나타낸다.
보상(Reward)은 막대가 쓰러지지 않고 오래 버틸수록 더 많이 획득되므로,
그래프에서 보상이 높을수록 더 오래 살아남아 CartPole의 목표를 성공적으로 달성한 것을 의미한다.
즉, 그래프의 보상이 높게 형성될수록 해당 방식이 더 효과적으로 학습되었음을 나타낸다.

Epsilon-Greedy 방식은 무려 10분 이상을 버티며 Reward를 획득하여 100,000 이상을 얻은 결과도 있다.
이번 실험에서는 Q-learning을 적용하여 CartPole 환경에서의 학습 성능을 분석하였다.
Epsilon-Greedy 방식과 Softmax 방식을 비교한 결과, Epsilon-Greedy 방식이 더 효과적으로 학습되었으며,
탐색과 활용의 균형을 유지하면서도 더 높은 보상을 기록하는 경향을 보였다.
하지만 일반적으로 CartPole 문제는 DQN(Deep Q-Network)을 활용하여 해결하는 경우가 많다. 따라서, 앞으로는 DQN을 사용한 CartPole 학습을 진행하여 성능을 비교할 예정이다. DQN을 활용하면 신경망을 통해 연속적인 상태 공간을 직접 처리할 수 있어, Q-table을 사용하는 Q-learning보다 더 확장성이 높은 방식을 실험할 수 있을 것으로 기대된다.
또한, CartPole을 포함하여 클래식 컨트롤(Classic Control) 문제 5가지에 도전할 예정이다.
OpenAI Gym의 대표적인 클래식 컨트롤 환경은 다음과 같다.
[참고] https://www.gymlibrary.dev/environments/classic_control/