[이전글]
https://limitsinx.tistory.com/152
지난글에서는 Q-Learning의 개념에대해 정리해보았습니다.
이번에는 'pytorch'를 기반으로, 간단한 길찾기 문제에 접목하여 코드 구현을 해보겠습니다.
위의 미로에서 A에서 I까지 가는 방법을 Q-Learning으로 해결해보고자 합니다.
상/하/좌/우로만 움직일 수 있다고 가정할 때, A는 B와D로만 갈수 있고, B는 A,E,C로 갈 수 있습니다.
즉, 이동할 수 있는곳을 1이라는 보상을 주고 이동할 수 없는곳을 0으로 보상을 줄 수 있습니다.
이렇게 보상을 주면서 A에서 I까지 이동하고자 하는데요!
위의 표대로만 보상을 주게되면 최대보상이 1로 동일한 점들이 많기때문에 최종목적을 알수가 없습니다!
우리는 A에서 I까지 가기로했기에 I의 보상을 2000정도로 주겠습니다.
이렇게 최종적으로 구성된 보상 맵을 기준으로, Q-Learning을 시작하면 목적지까지 가는 최종 경로의 Q-Map을 하기 식을 기반으로 만들게 됩니다.
이렇게해서 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]
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_location, ending_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
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가 최적경로가 나오도록 해보고자 합니다.
이렇게 두고 강화학습을 해보겠습니다.
def route(starting_location, ending_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)'이 시작된다고 보시면 될것 같습니다 :)
'AI > Reinforcement Learning' 카테고리의 다른 글
[Reinforcement Learning-5] Deep Q-Network으로 최적경로 찾기 (2) | 2021.09.05 |
---|---|
[Reinforcement Learning-4] Deep Q-Network(DQN)에 대한 간단한 이해 (0) | 2021.08.29 |
[Reinforcement Learning-2] Q-Learning에 대한 간단한 이해 (0) | 2021.08.26 |
[Reinforcement Learning-1] Thompson sampling model (2) | 2021.08.26 |
[Reinforcement Learning-0] Intro (0) | 2021.08.26 |
댓글