Q - learning 이해 및 단순 실현

7314 단어 Dialog
학습 (reinforcement learning) 과정 을 강화 하고 학습 중 상태 (state), 동작 (action), 보상 (reward) 이라는 세 가지 요 소 를 강화한다.지능 체 는 현재 상태 에 따라 동작 을 취하 고 해당 하 는 상 을 받 은 후에 이런 동작 을 개선 하여 다음 에 같은 상태 에 이 르 렀 을 때 스마트 체력 이 더욱 좋 은 동작 을 하도록 해 야 한다.
다음은 Q - learning 의 과정 을 종합 적 이 고 전면적 인 예 로 이해 하 겠 습 니 다.http://mnemstudio.org/path-finding-q-learning-tutorial.htm https://github.com/JasonQSY/ML-Weekly/blob/master/P5-Reinforcement-Learning/Q-learning/Q-Learning-Get-Started.ipynb
위의 그림 에서 보 듯 이 하나의 방 구조 이다. 하나의 robot (Agent, 스마트 체) 는 처음에 0 - 4 에 있 는 모든 방 에서 5 라 는 외부 공간 을 달성 할 수 있다. 이 건물 을 나 가 는 것 으로 이해 할 수 있다. 어떻게 처음에 어느 방 에서 든 가장 빨리 나 갈 수 있 을 까?위의 그림 은 그림 1 의 간소화 로 그 중에서 0 - 5 는 상태 이 고 화살 표 는 동작 을 가리 키 며 화살표 의 값 은 이 동작의 reward 값 을 나타 낸다.초기 상태 가 모두 0 입 니 다.Q 행렬 은 R 행렬 과 다 릅 니 다. R 행렬 은 action 으로 전 환 된 reward 값 을 표시 하고 Q 행렬 은 현재 state 와 action 의 상황 에서 전체적인 수익 값 (전체 경 로 를 볼 수 있 음) 을 표시 합 니 다.
Q - learning 알고리즘 의 이전 규칙 은 비교적 간단 합 니 다. Q 매트릭스 의 업데이트: Q (state, action) = R (state, action) + Gamma * Max [Q (next state, all actions)] 에서 현재 state 와 action 의 보답 은 현재 state 가 action 의 reward 값 을 사용 하여 표 에서 직접 읽 을 수 있 습 니 다.그 다음 에 Gamma 는 할인 인자 로 시간의 원근 이 수익 에 미 치 는 영향 정 도 를 나타 내 고 0 은 현재 상 태 를 보고 행동 하 는 reward 를 나타 낸다.Max [Q (next state, all actions)] 는 재 귀 함수 로 모든 상황 을 보 았 음 을 나타 내 고 마지막 으로 현재 수익 이 가장 좋 은 경 로 를 선택 합 니 다.
epsilon - greedy 는 Epsilon greedy 는 의사 결정 에 사용 되 는 전략 이 라 고 말 했다. 예 를 들 어 epsilon = 0.9 일 때 90% 의 상황 이 Q 표 의 최 우수 치 에 따라 행 위 를 선택 하고 10% 의 시간 에 무 작위 선택 행 위 를 사용 한 다 는 것 을 의미한다.
몇 개의 episode 를 수 동 으로 연산 합 니 다. 초 매개 변수 Gamma = 0.8, epsilon - greedy 에서 epsilon = 0.4. Episode = 1: 무 작위 선택 상 태 는 state = 1 입 니 다. 먼저 action 을 확인 합 니 다. 상태 1 을 돌 릴 때 가능 한 동작 은 3 과 5 입 니 다. 처음에 초기 값 이 똑 같 았 고 무 작위 로 state 5 를 선 택 했 습 니 다. 상태 5 에서 가능 한 동작 은 1, 4, 5 입 니 다. 이때 Q (1, 5) 의 값 을 계산 할 수 있 습 니 다. Q(1, 5) = R (1, 5) + 0.8 * max {Q {5, 1}, Q (5, 4), Q (5, 5)} = 100 + 0 = 100. 이때 state 5 는 목표 state 이 고 Q 행렬 을 업데이트 하 며 Q (1, 5) = 100 만 업데이트 합 니 다. Episode = 2: 무 작위 선택 상 태 는 state = 3 입 니 다. 먼저 action 을 확인 합 니 다. 상태 1 을 돌 릴 때 할 수 있 는 동작 은 1, 2, 4 입 니 다. max {Q (3, 1), Q {3, 2}, Q (3, 4)} 입 니 다.세 개의 값 이 모두 0 이 고 action 1 을 선택 하면 state 가 1 이 됩 니 다. 상태 1 일 때 가능 한 동작 은 3, 5 입 니 다. 이때 Q (3, 1) 의 값 을 계산 할 수 있 습 니 다. Q (3, 1) = R (3, 1) + 0.8 * max {Q (1, 3), Q (1, 5)} = 0 + 80 = 80, 업데이트 Q (3, 1)= 80. 그러나 이때 state 1 은 최종 상태 5 가 아니 기 때문에 계속 탐색 합 니 다. 이때 가설 은 가장 좋 은 전략 을 선택 하여 action, Q (1, action) = max {Q (1, 3), Q (1, 5)}, action = 5 를 선택 하면 상태 5 에 들 어가 면 앞 과 같은 Q (1, 5) = R (1, 5) + 0.8 * max {Q {5, 1}, Q (5, 4), Q (5, 5)} = 100 + 0 = 100. 업데이트 Q (1, 5)= 100 은 이렇게 계속 교체 되 고 전체 과정 은 두 개의 초 매개 변수 로 인해 결 과 는 예측 할 수 없다.
Code:
import numpy as np

# Q       0
q = np.matrix(np.zeros([6, 6]))

# Reward          。    HMM     。-1        
r = np.matrix([[-1, -1, -1, -1,  0,  -1], 
               [-1, -1, -1,  0, -1, 100], 
               [-1, -1, -1,  0, -1,  -1], 
               [-1,  0,  0, -1,  0,  -1], 
               [ 0, -1, -1,  0, -1, 100], 
               [-1,  0, -1, -1,  0, 100]])

# hyperparameter
#    
gamma = 0.8
#           
epsilon = 0.4
# the main training loop
for episode in range(101):
    # random initial state
    state = np.random.randint(0, 6)
    #         
    while (state != 5): 
        #        
        # Even in random case, we cannot choose actions whose r[state, action] = -1.
        possible_actions = []
        possible_q = []
        for action in range(6):
            if r[state, action] >= 0:
                possible_actions.append(action)
                possible_q.append(q[state, action])

        # Step next state, here we use epsilon-greedy algorithm.
        action = -1
        if np.random.random() < epsilon:
            # choose random action
            action = possible_actions[np.random.randint(0, len(possible_actions))]
        else:
            # greedy
            action = possible_actions[np.argmax(possible_q)]

        # Update Q value
        q[state, action] = r[state, action] + gamma * q[action].max()

        # Go to the next state
        state = action

    # Display training progress
    if episode % 10 == 0:
        print("------------------------------------------------")
        print("Training episode: %d" % episode)
        print(q)

좋은 웹페이지 즐겨찾기