OpenAI 헬스장을 활용한'택시'소개 학습 강화

본 입문 강좌에서 우리는 강화학습(rl)을 응용하여 대리 해결 'Taxi' environment from OpenAI Gym 문제를 훈련할 것이다.다음과 같은 내용을 설명합니다.
  • RL
  • 의 기본 소개
  • OpenAI 헬스장과 택시 건립
  • RL
  • 을 어떻게 사용하는지 파이톤3에서 택시 기사를 양성하는 단계별 강좌

    우리가 시작하기 전에 택시는 무엇입니까?


    택시는 OpenAI 헬스장이 제공하는 수많은 환경 중 하나다.이러한 환경은 학습 대리인을 개발하고 훈련하는 데 쓰인다.
    택시의 목표는 최소한의 동작으로 승객을 연결시켜 목적지에서 내리는 것이다.이 자습서에서는 임의로 재생되는 프록시부터 시작합니다.

    ...그리고 강화 학습을 성공적으로 응용하여 특공 해결 게임을 훈련한다.

    💡 학습 도론을 강화하다.


    개를 앉히는 것과 같은 새로운 수법을 어떻게 가르칠 수 있는지 생각해 보세요.
  • 만약 그것이 이 수작을 정확하게 집행했다면 (앉아 있다) 당신은 그것을 칭찬할 것이다(정면 피드백)✔️
  • 잘 앉지 못하면 치료를 받을 수 없다(부정적 피드백)❌
  • 개는 긍정적인 결과를 가져올 수 있는 일을 계속함으로써 치료를 받기 위해 명령을 들을 때 앉는 것을 배울 것이다.강화 학습은 기계 학습의 하위 분야로'대리'(개) 학습을 훈련시켜 환경(앉은 자세 명령에 호응)에서 올바른 동작 서열을 취하여 그 보답을 극대화(보상을 받기)하는 것과 관련된다.이것은 보다 공식적으로 다음과 같이 해석할 수 있다.
    출처:

    사돈과 바토 🏋️ OpenAI 헬스장과 택시를 설치하다


    이 자습서에서는 Taxi-v3 환경을 사용합니다.
    설치가 필요합니다.
  • 오픈 헬스장 pip install gym
  • 누비pip install numpy
  • 다음 코드 세그먼트는 필수 패키지를 가져오고 슬라이딩 환경을 만듭니다.
    import numpy as np
    import gym
    import random
    
    # create Taxi environment
    env = gym.make('Taxi-v3')
    

    🎲 임의 요소


    우리는 우선 전혀 배우지 않는 대리인을 실현할 것이다.반대로 동작을 무작위로 선택한다.이것은 우리의 기선이 될 것이다.
    첫 번째 단계는 우리의 대리 초기 상태를 주는 것이다.한 주가 우리 스파이들의 현재 환경이 어떤지 알려줄 것이다.택시에서 주에서는 택시, 승객, 그리고 승하차 지점의 현재 위치를 정의했다.다음은 택시의 세 가지 다른 상태의 예이다.

    주:노란색=택시,파란색자모=취차지점,보라색자모=하차목적지
    초기 상태를 가져오려면 다음과 같이 하십시오.
    # create a new instance of taxi, and get the initial state
    state = env.reset()
    
    다음에, 우리는 모든 게임을 순환하기 위해 for 순환을 실행할 것이다.매번 교체할 때마다 우리 대리인은 다음과 같이 할 것이다.
  • 액션 공간(0)에서 랜덤 액션 - 남부 - 북,2번 - 동,3번 - 웨스트, 4번 - 전화를 받다 - 하차)
  • 새로운 것을 받아들이다
    다음은 우리의 랜덤 프록시 스크립트입니다.
    import gym
    import numpy as np
    import random
    
    # create Taxi environment
    env = gym.make('Taxi-v3')
    
    # create a new instance of taxi, and get the initial state
    state = env.reset()
    
    num_steps = 99
    for s in range(num_steps+1):
        print(f"step: {s} out of {num_steps}")
    
        # sample a random action from the list of available actions
        action = env.action_space.sample()
    
        # perform this action on the environment
        env.step(action)
    
        # print the new state
        env.render()
    
    # end this instance of the taxi environment
    env.close()
    
    너는 이 프로그램을 실행해서 너의 에이전트가 무작위로 이동하는 것을 관찰할 수 있다.특별히 흥분되지는 않지만, OpenAI 헬스장 도구 꾸러미를 익히는 데 도움이 됐으면 좋겠습니다.
    다음에 우리는 관건적인 알고리즘을 실현하여 우리의 에이전트가 환경에서 배워서 문제를 해결할 수 있도록 할 것이다.

    📖 Q - 학습 에이전트


    Q-learning은 학습 알고리즘을 강화하는 것으로 현재 상태를 정한 상황에서 최상의 다음 행동을 찾아 얻은 수익을 최대한 높인다(Q-learning의'Q'는 품질을 대표한다) - 행동의 가치
    다음 시작 상태를 예로 들겠습니다.

    가장 큰 보답을 얻기 위해서는 어떤 행동(상, 하, 좌, 우, 승차 또는 하차)을 취해야 합니까?(주:파란색=승차지점,보라색=하차지점)
    우선, 우리 대리인이 어떻게 그 행위로 인해'장려'를 받았는지 봅시다.학습을 강화하는 과정에서 우리는 우리의 대리인이 행동을 취해 환경에서 얻는 보답을 최대한 높일 수 있기를 바란다는 것을 명심하세요.

    택시 장려 제도


    :

    "…you receive +20 points for a successful drop-off, and lose 1 point for every timestep it takes. There is also a 10 point penalty for illegal pick-up and drop-off actions."


    Dell의 원래 상태를 살펴보면 Dell이 수행할 수 있는 조치와 그에 따른 보상이 다음과 같습니다.
    Taxi documentation
    위의 그림에서 대리인은 한 시간마다 1점을 손실한다.만약 이곳에서 상하차 조작을 사용한다면 그것도 10점을 손실하게 될 것이다.
    우리는 우리의 대리인이 북쪽으로 파란색 R이 표시한 수령 장소로 가기를 희망한다. 그러나 만약 그들이 모두 같은 처벌을 받게 된다면, 그것은 어떻게 어떤 행동을 취해야 할지 알 수 있겠는가?

    탐색


    우리 에이전트는 현재 파란색 R에 가장 가까운 동작을 알 수 없습니다. 이것이 바로 시험 오류의 원인입니다. - 우리는 우리의 대리인이 무작위 행동을 취하고 그 보상을 관찰할 것이다. 즉, 우리의 대리인이 환경에 대해 탐색을 할 것이다.이것이 바로 우리의 랜덤 스파이가 전에 한 일이다.
    여러 번 교체되는 동안, 우리의 에이전트는 어떤 동작 서열이 다른 동작 서열보다 더 보답하는 것을 관찰할 것이다.이 과정에서 우리 대리인은 어떤 행위가 어떤 보상을 가져올지 추적해야 한다.

    소개...Q표


    Q표는 단지 검색표일 뿐입니다. 저희 대리인이 특정한 상태에서 특정한 행위가 예상할 수 있는 최대 미래 수익을 대표하는 값을 저장합니다. (Q값이라고 합니다.)그것은 대리인에게 어떤 상태를 만났을 때 어떤 행위가 다른 행위보다 더 높은 보답을 가져올 수 있다는 것을 알려줄 것이다.그것은 우리 대리인에게 가장 좋은 행동이 무엇인지 알려주는 메모지로 변했다.
    다음 그림은 Q 테이블의 모양을 보여 줍니다.
  • 행당 "활주"환경의 고유 상태
  • 각 열마다 우리 대리인이 취할 수 있는 행동
  • 각 셀은 해당 상태 - 동작 쌍의 Q 값에 해당합니다. - 더 높은 Q값은 우리의 대리인이 이 상태에서 이 행동을 취한다면 더욱 높은 수익을 얻을 수 있다는 것을 의미한다.

  • 교육 에이전트를 시작하기 전에 다음과 같이 Q시트를 초기화해야 합니다.
    state_size = env.observation_space.n  # total number of states (S)
    action_size = env.action_space.n      # total number of actions (A)
    
    # initialize a qtable with 0's for all Q-values
    qtable = np.zeros((state_size, action_size))
    
    프록시가 탐색할 때, 찾은 Q 값으로 Q표를 업데이트합니다.Q 값을 계산하기 위해서 우리는 Q 학습 알고리즘을 소개할 것이다.

    Q-학습 알고리즘


    다음은 Q-학습 알고리즘을 제시한다.자세한 내용은 설명하지 않겠지만 자세한 내용은 에 나와 있습니다.
    Ch 6 of Sutton & Barto (2018)
    Q - 학습 알고리즘은 에이전트가 행동을 취한 후에 현재 Q 값 (Q (St, At) 을 관찰 값으로 업데이트하는 데 도움을 줄 것입니다.즉, 긍정적인 보상을 받으면 Q를, 부정적인 보상을 받으면 Q를 낮춘다.
    택시에서 저희 대리인은 승객을 내리는 데 성공한 후에만 정보상(+20점)을 받을 수 있습니다.따라서 우리 대리인이 올바른 방향으로 나아가고 있어도 그들이 받아야 할 긍정적인 보답은 늦어진다.Q-learning 등식의 다음 용어는 이 점을 설명합니다.

    이 용어는 앞으로 언제 받을 수 있는 보상의 일부(St+1)를 포함하여 현재 Q 값을 조정합니다.'a' 라는 말은 그 주에서 취할 수 있는 모든 행동을 가리킨다.방정식에는
  • 학습률(α): 이전에 학습한 정보
  • 에 비해 새로운 정보를 대리 받아들이기 쉬운 정도
  • 할인 계수(γ): 대리인은 앞으로 받을 수 있는 보수를 직접 보수
  • 에 비해 얼마나 고려해야 하는가
    다음은 Q 학습 알고리즘을 구현하는 코드입니다.
    # hyperparameters to tune
    learning_rate = 0.9
    discount_rate = 0.8
    
    # dummy variables
    reward = 10 # R_(t+1)
    state = env.observation_space.sample()      # S_t
    action = env.action_space.sample()          # A_t
    new_state = env.observation_space.sample()  # S_(t+1)
    
    # Qlearning algorithm: Q(s,a) := Q(s,a) + learning_rate * (reward + discount_rate * max Q(s',a') - Q(s,a))
    qtable[state, action] += learning_rate * (reward + discount_rate * np.max(qtable[new_state,:]) - qtable[state,action])
    

    탐사와 개발의 균형


    이전에, 우리는 Q표를 업데이트하기 위해 대리 탐색 환경을 만들었다.우리의 대리인이 환경에 대한 이해가 갈수록 많아짐에 따라 우리는 이 지식을 이용하여 더욱 최적화된 행동을 취할 수 있다 - 착취라고 불리다.
    공격 과정에서, 우리 에이전트는 Q표를 보고, Q값이 가장 높은 조작을 선택할 것입니다. (무작위 조작이 아니라)시간의 추이에 따라, 우리의 대리인은 더 적은 탐색을 필요로 하고, 그것이 알고 있는 것을 이용하기 시작할 것이다.
    탐사 개발 전략을 실시하는 방법은 매우 많다.여기에는 단 하나의 예가 있다.
    # dummy variables
    episode = random.randint(0,500)
    qtable = np.random.randn(env.observation_space.sample(), env.action_space.sample())
    
    # exploration-exploitation tradeoff
    epsilon = 1.0     # probability that our agent will explore
    decay_rate = 0.01 # of epsilon
    
    if random.uniform(0,1) < epsilon:
        # explore
        action = action = env.action_space.sample()
    else:
        # exploit
        action = np.argmax(qtable[state,:])
    
    # epsilon decreases exponentially --> our agent will explore less and less
    epsilon = np.exp(-decay_rate*episode)
    
    위의 예에서 우리는 0과 1 사이에 약간의 값을 epsilon으로 설정했다.만약에 epsilon이 0.7이라면 이 단계에서 우리의 대리인은 70%의 확률로 탐색을 하고 이용하지 않을 것이다.우리는 epsilon을 한 걸음 한 걸음 지수가 쇠퇴함에 따라 설정하기 때문에 우리의 대리 탐색 시간이 점점 적어진다.

    이 모든 것을 결합시키다


    우리는 학습 에이전트를 강화하는 데 필요한 모든 구축 블록을 완성했다.Dell 에이전트를 교육하는 과정은 다음과 같습니다.
  • 모든 Q 값을 0으로 초기화하는 Q표
  • 우리 매니저가 많은 게임에서 택시를 타게
  • Q 학습 알고리즘과 탐색 개발 전략을 사용하여 Q표
  • 지속 업데이트
    다음은 완전한 실현이다.
    import numpy as np
    import gym
    import random
    
    def main():
    
        # create Taxi environment
        env = gym.make('Taxi-v3')
    
        # initialize q-table
        state_size = env.observation_space.n
        action_size = env.action_space.n
        qtable = np.zeros((state_size, action_size))
    
        # hyperparameters
        learning_rate = 0.9
        discount_rate = 0.8
        epsilon = 1.0
        decay_rate= 0.005
    
        # training variables
        num_episodes = 1000
        max_steps = 99 # per episode
    
        # training
        for episode in range(num_episodes):
    
            # reset the environment
            state = env.reset()
            done = False
    
            for s in range(max_steps):
    
                # exploration-exploitation tradeoff
                if random.uniform(0,1) < epsilon:
                    # explore
                    action = env.action_space.sample()
                else:
                    # exploit
                    action = np.argmax(qtable[state,:])
    
                # take action and observe reward
                new_state, reward, done, info = env.step(action)
    
                # Q-learning algorithm
                qtable[state,action] = qtable[state,action] + learning_rate * (reward + discount_rate * np.max(qtable[new_state,:])-qtable[state,action])
    
                # Update to our new state
                state = new_state
    
                # if done, finish episode
                if done == True:
                    break
    
            # Decrease epsilon
            epsilon = np.exp(-decay_rate*episode)
    
        print(f"Training completed over {num_episodes} episodes")
        input("Press Enter to watch trained agent...")
    
        # watch trained agent
        state = env.reset()
        done = False
        rewards = 0
    
        for s in range(max_steps):
    
            print(f"TRAINED AGENT")
            print("Step {}".format(s+1))
    
            action = np.argmax(qtable[state,:])
            new_state, reward, done, info = env.step(action)
            rewards += reward
            env.render()
            print(f"score: {rewards}")
            state = new_state
    
            if done == True:
                break
    
        env.close()
    
    if __name__ == "__main__":
        main()
    

    👏 다음은요?


    OpenAI Gym에는 과 같은 다양한 환경이 있습니다.더 적은 사건에서 문제를 해결하기 위해 상술한 실현을 최적화할 수도 있습니다.
    기타 유용한 리소스는 다음과 같습니다.
  • Frozen Lake
  • 저자: 허지강
  • (Youtube)
  • A good article on RL and its real-world applications 저자: 사돈 및 바토
  • 좋은 웹페이지 즐겨찾기