ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OpenAI Gym을 이용한 Environment 설계
    최신 기술동향/인공지능 (AI) 2020. 8. 30. 10:30
    반응형

     블로그를 보고 강화학습을 자신이 공부하는 분야에 적용해보고 싶은데, 어떻게 사용해야할 지 처음에 감이 안 오는 사람들도 있을 것이다. 많은 강화학습 알고리즘이나 코드를 찾아보면, 이미 있는 환경을 이용해서, main함수에 있는 20~30줄 정도만 돌려보면서 '이 알고리즘이 이렇게 좋은 성능을 보이는구나'정도만 알 수 있다. 하지만, 우리는 5G 환경이나 자신이 공부하는 분야에 맞게 환경을 만드는 것부터 시작하고 싶기 때문에, OpenAI Gym의 정해진 Template을 이용하는 것이 좋다.

     

    OpenAI Gym

     OpenAI Gym은 고전 게임을 기반으로 강화학습을 사용할 수 있는 기본적인 Environment (환경)과 기본적인 강화학습 알고리즘들이 패키지로 준비되어 있는 Toolkit이다. Open Source이기 때문에, prompt에 간단하게 pip install gym이라고 쳐서 기본적으로 OpenAI Gym를 설치 후, 사용할 수 있다. (여기서 pip은 패키지 관리자다.) 자신이 원하는 환경을 별도로 설정하지 않고, 그냥 알고리즘만 돌려볼 생각이라면, 이미 Gym에 설치되어 있는 환경을 불러와서, 사용할 수 있다.

    import gym

    env = gym.make('CartPole-v0')

    for i_episode in range(20):  observation = env.reset()

        for t in range(100): 

           env.render()

           print(observation)

           action = env.action_space.sample()

          observation, reward, done, info = env.step(action)

          if done: print("Episode finished after {} timesteps".format(t+1))

                     break

    env.close()

    같은 간단한 코드를 통해서 직접 강화학습을 돌려볼 수 있다. 위 코드를 설명하면, step t가 100을 넘지 않게 20개의 Episode를 돌면서, 자신이 학습시키는 Policy에 따라 Action을 하면서 Reward를 모으고, Episode가 끝나면, environment를 reset하면서 모델을 학습시킨다. 여기서 주의깊게 봐야하는 함수는 

    env.reset() / env.render() / env.step(action) 다.

     

    사용자 정의 환경 만들기

    • env.step(action)은 알고리즘을 통해 얻어낸 Action을 1 step 수행한 후, 현재 state와 reward 등의 정보를 반환한다.

    여기서 1 Step 이후에 반환하는 값은

     1. 현재 Agent가 관찰한 환경 정보인 'Observation' (e.g., next state)

     2. Agent가 실행한 Action을 통해 얻은 'Reward'

     3. 에피소드의 종료 여부 'Done',

     4. 환경 관련 추가정보 'Info'가 있다.

    즉, 대부분 Step()함수의 return으로는 tuple 형태의 (next_state, reward, done, info)를 반환한다.

    • env.reset()은 Step을 실행하다가 epsiode가 끝나서 이를 초기화해서 재시작해야할 때, 초기 State를 반환한다.
    • env.render()는 Graphic User Interface (GUI)로 현재 진행상황을 출력하는 함수다.

     전체적인 구조는 이렇게 되고, 해당 환경을 어떻게 구성하고, Action을 뽑아내는 Policy를 어떻게 구성할지에 따라서 Q-learning, DQN, Actor-Critic, PPO 등 다양한 알고리즘을 선택할 수 있다.

     

    Space Module (State, Action)

     State와 Action을 어떻게 정의하느냐에 따라, 세부적인 환경과 어떤 알고리즘을 적용해야할지가 달라진다. 예를 들어, 5G의 어떤 Channel을 사용해야할지 고려해야하는 Resource Allocation 상황에서 Resource Block (RB)을 기준으로 어떤 Channel이 Occupied되어 있는지 observe한다고 가정하자. 이러면 현재 state가 discrete한 상황으로 모델링 될 수 있을 것이다. 하지만, Underlying Channel에서 해당 Agent에게 미치는 Interference를 고려를 한다면, Continuous한 실수 값이 State에 포함될 수도 있을 것이다. 만약 Report되어서 Agent가 받아들이는 Channel State Information (CSI)가 Discrete한 수치이면 Discrete한 State가 될 수도 있다. 즉, 자신이 가정하는 System Modeling에 따라서 정하면 된다. 즉, State space가 Discrete하다고 가정할지, Continuous하다고 가정할지를 먼저 가정해야 한다. 

    Action Space도 비슷하다. 만약 Transmit Power를 Control할 때, Continuous하게 Modeling할 수도, 주어진 discrete power 중에 고를지도 System Modeling에 따라 달라진다. 이렇게 Continuous하게 할지, Discrete하게 할지에 따라서, gym.space에 여러 모듈이 있다.

    예를 들어서, Discrete(2)는 0,1 값을 갖는 discrete value를 담을 수 있고, Box(3,)는 3-dimension을 갖는 실수값을 담을 수 있는 space다. 이외에도 여러 space가 있으므로, 자신에게 맞는 state space, action space를 OpenAI Gym에서 찾아서 Setting하면 된다.

     

    Reward 설계

     이렇게 결정된 State와 Action space를 통해서 Agent들이 환경에서 state를 observe하고, Action을 취하면서 Reward를 받는 과정을 통해 학습된다. 그렇게 1-episode가 끝나면 Reset을 해서 처음 state를 initialize하는 방식으로 계속 Agent가 학습된다. Reward를 어떻게 설계할지는 딱 정해져 있는 방법이 없다. 통신에서 많이 사용하는 Reward는 Throughput이 Reward로 오고, 여러 User가 같은 채널을 선택해서 Interference가 심해져서 일정 Threshold 밑으로 내려가면 상수의 -C Negative Reward를 주는 방식을 많이 선택하는 것 같다. 최근에는 Multi-Agent Reinforcement를 적용하는 논문이 많이 나와서 각자가 Observe하는 State가 다르기 때문에 시스템을 모델링하는 방법이 조금 더 어려워졌다. 보상이 안정적으로 올라가면서 이에 따라 내가 원하는 통신 성능을 충족시키는 Reward를 잘 설계해야할 필요가 있어 보인다. 이를 위해서는 다른 논문들에서는 어떻게 시스템을 모델링과 Reward 설계를 했는지 참고해보면 좋을 것으로 보인다.

     하지만, 많은 논문들이 코드를 공개하지 않기 때문에, 이를 찾고 공부하는 과정에서 어려움이 있었다. Communication 분야에서 강화학습을 어떻게 사용했는지 코드를 보고 싶으면 Github에 들어가서 찾아볼 수 있다. 개인적으로 괜찮다고 생각한 Github 주소를 공유한다.

    github.com/IIT-Lab

     

    IIT-Lab

    Shanghai University. IIT-Lab has 335 repositories available. Follow their code on GitHub.

    github.com

    이 Github에는 강화학습이 아닌, 딥러닝을 사용한 코드들도 많지만 중간중간에 관심있던 강화학습-통신 논문 코드를 찾을 수 있다. 또한, OpenAI Gym을 사용하지 않은 코드들이 많지만, 어떤 식으로 보상과 시스템 모델링을 강화학습 코드로 옮겼는지를 볼 수 있다. 무엇보다, IEEE에 나오는 AI와 통신을 결합한 최신 논문들의 코드들도 많이 있기 때문에, 관심있는 논문과 코드를 따라가보는 것도 좋을 것이라고 생각된다.

     

    Conclusion

     이번에는 OpenAI Gym을 통해서 자신에게 Customized 되어있는 환경을 구성하는 기본적인 틀과 통신에서는 어떤 환경들이 고려될 수 있는지에 대해서 생각해보았다. 상황에 따라 많은 환경과 알고리즘이 다르기 때문에 모든 코드를 다 뜯어 볼 수는 없었지만, Open AI Gym의 구조를 알고 있으면, 해당 알고리즘들을 자신이 공부하는 분야에 적용할 때 도움이 될 것이다. 

    반응형

    댓글

Designed by Tistory.