본문 바로가기
AI/Reinforcement Learning

[Reinforcement Learning-3] Q-Learning으로 최적경로 찾기

by 노마드공학자 2021. 8. 28.

[이전글]

https://limitsinx.tistory.com/152

 

[강화학습-2] Q-Learning 개념

Q Learning? Q-Learning은 앞으로 강화학습 공부를 진행해야한다면, 반드시 확실하게 알고 넘어가야하는 부분입니다! Q-Learning을 한줄로 표현하라면 상기의 수학식입니다! Q(s,a) = r + lr * max(Q(s',a')) 이..

limitsinx.tistory.com


 

지난글에서는 Q-Learning의 개념에대해 정리해보았습니다.

이번에는 'pytorch'를 기반으로, 간단한 길찾기 문제에 접목하여 코드 구현을 해보겠습니다.

 

경로찾기

 

위의 미로에서 A에서 I까지 가는 방법을 Q-Learning으로 해결해보고자 합니다.

 

상/하/좌/우로만 움직일 수 있다고 가정할 때, A는 B와D로만 갈수 있고, B는 A,E,C로 갈 수 있습니다.

즉, 이동할 수 있는곳을 1이라는 보상을 주고 이동할 수 없는곳을 0으로 보상을 줄 수 있습니다.

 

보상(Reward)표

이렇게 보상을 주면서 A에서 I까지 이동하고자 하는데요!

위의 표대로만 보상을 주게되면 최대보상이 1로 동일한 점들이 많기때문에 최종목적을 알수가 없습니다!

우리는 A에서 I까지 가기로했기에 I의 보상을 2000정도로 주겠습니다.

 

타겟 보상을 높게 준 표

 

이렇게 최종적으로 구성된 보상 맵을 기준으로, Q-Learning을 시작하면 목적지까지 가는 최종 경로의 Q-Map을 하기 식을 기반으로 만들게 됩니다.

 

출처 : floyhub, Q-Learning equation

 

이렇게해서 A → I 까지 Q-Learning이 잘 쫓아가는지 코딩을 해보겠습니다.

 

 

코드구현

 

import numpy as np

gamma = 0.75

alpha = 0.9

 

경로찾기

location_to_state = {'A': 0,

                     'B': 1,

                     'C': 2,

                     'D': 3,

                     'E': 4,

                     'F': 5,

                     'G': 6,

                     'H': 7,

                     'I': 8,

                     }

 

actions = [0,1,2,3,4,5,6,7,8]

보상(Reward)표

R = np.array([[0,1,0,1,0,0,0,0,0],

              [1,0,1,0,1,0,0,0,0],

              [0,1,0,0,0,1,0,0,0],

              [1,0,0,0,1,0,1,0,0],

              [0,1,0,1,0,1,0,1,0],

              [0,0,1,0,1,0,0,0,1],

              [0,0,0,1,0,0,0,1,0],

              [0,0,0,0,1,0,1,0,1],

              [0,0,0,0,0,1,0,1,0]])

alpha,gamma는 임의의 값으로 지정하고, A~I를 연산을 위해 0~8로 매핑을 합니다.
R은 Reward map을 Tensor형태로 표현한것입니다.

state_to_location = {state: location for location, state in location_to_state.items()}

위치 0~8을 A~I로 역변환 하는 코드

def route(starting_locationending_location):

    R_new = np.copy(R)

    ending_state = location_to_state[ending_location]

    R_new[ending_state, ending_state] = 2000

타겟 보상을 높게 준 표

최종목적지(ending_state)를 입력받고, 해당 위치의 보상을 2000으로 바꿔줌

    Q = np.array(np.zeros([9,9]))

    for i in range(5000):

        current_state = np.random.randint(0,9)

        playable_actions = []

        for j in range(9):

            if R_new[current_state, j] > 0:

                playable_actions.append(j)

for문을 돌며 보상값이 1인 지점들을 따라가는 학습을 5000번 시행

        next_state = np.random.choice(playable_actions)

        TD = R_new[current_state, next_state] + gamma * Q[next_state, np.argmax(Q[next_state,])] - Q[current_state, next_state]

        Q[current_state, next_state] = Q[current_state, next_state] + alpha * TD

 

출처 : floyhub, Q-Learning equation

Q-learning 수식 부분

    route = [starting_location]

    next_location = starting_location

    while (next_location != ending_location):

        starting_state = location_to_state[starting_location]

for문을 돌다가 목표지점에 도달하게 되면, 이제까지의 경로를 return하고 반복 종료

 

        next_state = np.argmax(Q[starting_state,])

        next_location = state_to_location[next_state]

        route.append(next_location)

        starting_location = next_location

    return route

 

 

결과

 

결과는 돌릴때마다 새로운 값이 나옵니다.

왜냐하면, 보상을 모두 동일하게 1로주고 목적지까지만 어떻게든 가라! 라고 Q-Learning을 했기 때문이죠

 

A에서 I까지 이 많은 루트들중 학습이 제대로 되어있는지 확인해보고자 길을 잘라보려고 합니다!

즉, G와 E에 보상을 -1000으로 두어 반드시 A->B->C->F->I가 최적경로가 나오도록 해보고자 합니다.

 

A B C F I로 경로가 나오도록 보상맵을 다르게 설정

이렇게 두고 강화학습을 해보겠습니다.

 

def route(starting_locationending_location):

    R_new = np.copy(R)

    ending_state = location_to_state[ending_location]

    R_new[ending_state, ending_state] = 1000

    R_new[4,4] = -1000

    R_new[6,6] = -1000

위의 코드에서 보상맵의 G와 E부분만 -1000으로 넣어 주었습니다.

 

 

이렇게 하고 나니 ABCFI라는 최적경로를 찾아내는것을 확인할 수 있습니다!

즉, 보상맵의 영향을 제대로 받고 강화학습이 정상적으로 되고있구나! 라는것을 알 수 있는것입니다.

 

이렇게 수치해석적인 방법을 통해 Q-map을 알아내는것은 '고전적 강화학습' 입니다.

이 Q값을 Deep Learning을 통해 도출해내는것이 구글 Deepmind사가 Natrue지에 쓴 논문 'Deep-Q-Network'로 알파고의 전신모델입니다!

 

DQN부터 본격적 '심층강화학습(Deep Reinforcement Learning)'이 시작된다고 보시면 될것 같습니다 :)

댓글