ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [강화학습] chatgpt랑 공부하는 강화학습: Q-learning, FrozenLake - 1
    배우기 - computer로 하는거 2025. 4. 10. 22:22

    인공지능 관련 기술들에 익숙해지면서 글쓰는 연습도 할겸 블로그에 공부하거나 접한 내용들을 정리하려고 한다. 회사에서 쓰는 기술들을 블로그에 그대로 쓰는건 좀 찝찝해서 아예 관련없는 강화학습 관련 내용을 작성하기로 결정했다. 
    강화학습 관련 용어라고는 상태, 액션, 보상 정도만 아는 상태에서 시작하는데, 강의를 듣는 방식으로 공부하면 저작권 문제도 있을수 있을것 같고, 재미도 없을것 같아 chatGPT한테 물어보면서 공부를 하려고 한다.

    뭔가를 처음 배우기 시작할때 chatGPT를 이용하는건 처음인데, 혹시 다른 사람들도 내가 하는 걸 참고해서 chatGPT를 이용해서 배워보거나 이것저것 시도해보는데 도움이 되면 좋겠다. 일단은 대화 내용을 많이 가져와서 내가 어떤식으로 chatGPT를 이용하는지 다른 사람들이 보고 따라해볼 수 있게 해보려고 한다.

    해보니 chatGPT 특성상 오락가락 할때도 있고, 내가 물어보는 순서도 중구난방이어서 블로그에 작성할 때에는 불필요한 부분은 빼고 최대한 정리해서 작성해보겠다.


    ...


    대답을 너무 길게 해서 전부 캡쳐하기는 어려울것 같다. chatGPT 대답은 내가 따로 정리해서 작성해야겠다. 내가 저렇게 얘기하니 좋은 생각이라며 학습할 순서를 몇개 나열해줬다. 그러고는

    라고 하길래

    이렇게 또 물어봤다. 처음엔 엄청 좋은 성능이 요구되지 않으니까 괜찮단다.

    그러고 나서 chatGPT가 처음 예제로 Q-learning을 이용한 FrozenLake 를 소개해줬다.



    FrozenLake 예제를 달라고 했고 학습과 학습 결과 확인, 학습후 실제 실행 코드를 포함하여 최종적으로 코드를 아래와 같이 정리했다.

    import gymnasium as gym
    import numpy as np
    import time
    import matplotlib.pyplot as plt
    from tqdm import tqdm
    
    
    def play_trained_agent(env, q_table):
        state, _ = env.reset()
        done = False
    
        print("\n🚶 에이전트 경로:")
        env.render()
        time.sleep(0.05)
    
        while not done:
            action = np.argmax(q_table[state])
            state, reward, terminated, truncated, _ = env.step(action)
            done = terminated or truncated
    
            # print(env.render())
            env.render()
            time.sleep(0.05)
    
        env.close()
    
        if reward == 1:
            print("🎉 성공적으로 Goal 도달!")
        else:
            print("💥 실패! 구멍에 빠졌거나 종료됨")
    
    def train_on_frozen_lake(env):
        rewards = []
    
        # 하이퍼파라미터 설정
        alpha = 0.8     # 학습률 (learning rate)
        gamma = 0.99    # 할인율
        epsilon = 1.0   # 탐험 확률 (epsilon-greedy)
        epsilon_min = 0.1
        epsilon_decay = 0.9995
        episodes = 10000 # 에피소드 수
    
        # Q-테이블 초기화: 상태 수 x 행동 수
        q_table = np.zeros([env.observation_space.n, env.action_space.n])
    
        # 학습 루프
        for _ in tqdm(range(episodes)):
            state, _ = env.reset()
            done = False
            total_reward = 0
    
            while not done:
                # 행동 선택: 탐험 or 활용 (epsilon-greedy)
                if np.random.uniform(0, 1) < epsilon:
                    action = env.action_space.sample()  # 무작위 행동
                else:
                    action = np.argmax(q_table[state])
    
                # 환경에 행동 적용 -> 다음 상태, 보상, 종료 여부 등 받기
                next_state, reward, terminated, truncated, _ = env.step(action)
                done = terminated or truncated
    
                # Q 테이블 업데이트
                q_table[state, action] = q_table[state, action] + alpha * (
                    reward + gamma * np.max(q_table[next_state]) - q_table[state, action]
                )
    
                # 상태 업데이트
                state = next_state
    
                # epsilon 감소
                if epsilon > epsilon_min:
                    epsilon *= epsilon_decay
    
                total_reward += reward
    
            rewards.append(total_reward)
    
        # 학습 완료 후 Q 테이블 출력
        print("Q-table")
        print(q_table)
    
        # 누적 성공률 (100 에피소드마다 평균)
        window = 100
        moving_avg = [np.mean(rewards[i - window:i + 1]) for i in range(window, len(rewards))]
    
        plt.plot(moving_avg)
        plt.title("🎯 Moving Average of Success Rate")
        plt.xlabel("Episode")
        plt.ylabel("Success Rate")
        plt.grid(True)
        plt.show()
    
        return q_table
    
    
    def main():
        train_env = gym.make("FrozenLake-v1", map_name="4x4", is_slippery=True)
        play_env = gym.make("FrozenLake-v1", map_name="4x4", is_slippery=True, render_mode="human")
    
        q_table = train_on_frozen_lake(train_env)  # 학습만 수행
        play_trained_agent(play_env, q_table)      # 학습된 q_table로 결과 보기
    
    if __name__ == '__main__':
        main()

    이제 다음 글에서 코드를 천천히 살펴보도록 하겠다.

    [강화학습] chatgpt랑 공부하는 강화학습: Q-learning, FrozenLake - 2

Designed by Tistory.