2) Q-learning exploit & exploration and discounted reward, stochastic(non-deterministic) world
2020/07/29 - [공부/강화학습] - Reinforcement Learning, Open AI GYM
Q-learning exploit & exploration and discounted reward
Q learning의 최적화된 학습을 위한 몇 가지 방법이 있다. 첫 번째는 action 선택 단계에서 Exploit & Exploration을 하는 것이고, 두 번째는 Q value update 단계에서 Discounted Reward를 하는 것이다.
Exploit & Exploration을 사용하는 이유는 Q learning의 모든 단계에서 가장 좋은 행동만 선택하면, 전체적으로는 최적의 결과를 얻지 못할 수 있기 때문이다. 즉, 각 단계의 가장 큰 값만 선택하는 Greedy Action만 취하게 되면, 다른 최적화된 방법을 찾지 못할 수 있다. Exploitation은 알고 있는 방향, 진행되는 방향으로 계속 가는 것으로, 각 단계에서 가장 큰 값을 선택하는 Greedy Action이다. 반대로 Exploration은 기존의 방법이 아닌 새로운 방법을 시도해 보는 것으로, 학습이 오래 진행되면서 어쩌면 더 좋은 Total Reward를 얻을 수도 있는 Non-Greedy Action이다.
E&E에는 Decaying E-Greedy 방법이 있다. decaying E-greedy는 Epsilon을 점점 줄이는 greedy 알고리즘이다. Epsilon e는 exploitation을 할 것인지 exploration을 할 것인지 결정하는 임의의 숫자이다. 다음 행동을 선택하는 단계에서 random value를 생성해서 e 값과 비교한다. 작으면 random 하게 행동하고 크면 max Q value에 따라 행동한다. 학습이 진행되면서 e 값을 줄이게 되면 학습 초반에는 random action(exploration)을 할 확률이 높고, 어느 정도 학습이 진행된 후에는 max Q value(exploitation)에 따라 행동하게 된다. 이 알고리즘은 total regret(아래의 링크 참고)이 발산하는 다른 greedy 알고리즘과는 다르게 수렴하는 경향이 있어 성능이 더 좋다.
E-Greedy의 실제 구현 코드는 다음과 같다.
if np.random.rand(1) < e:
action = env.action_space.sample()
else:
action = np.argmax(Q[state, :])
또 다른 E&E 방법으로는 Add Random Noise가 있다. 위의 방법과 마찬가지로 행동 선택 단계에서 argmax의 Q value term에 random value를 더하는 것이다. 그리고 학습을 진행하면서 random value를 작게 설정한다. 그러면 학습 초반에는 exploration을 하면서 가장 좋은 선택보다는 조금 떨어지는 것을 선택할 가능성이 생기게 된다. 그리고 학습 후반에는 exploitation 하게 된다.
Discounted Reward는 Q'(s , a) = r + max Q(s' , a')에서 나중에 받는 Q' reward에 1보다 작은 수를 곱해서 reward를 적게 받는 것이다. 이는 나중에 받게 되는 보상보다는 당장 행동을 해서 받을 수 있는 보상이 더 큰 것으로 생각할 수 있다.
참고:
강의:
코드:
decaying e-greedy
https://github.com/hunkim/ReinforcementZeroToAll/blob/master/03_2_q_table_frozenlake_det.py
add random noise + discounted reward
https://github.com/hunkim/ReinforcementZeroToAll/blob/master/03_1_q_table_frozenlake_det.py
stochastic(non-deterministic) world
Frozen lake 게임에서 바람이 많이 부는, 입력 방향대로 움직이지 않는 환경에서 Q learning의 성능은 많이 떨어진다. 이렇게 stochastic policy를 구하는 문제에서는 다음 상태에서 얻는 Q' value를 100% 신뢰하는 것이 아니라, 일정 비율만큼만 참고하고 현재 상태에서 얻는 Q value를 더 많이 참고하는 방식으로 성능을 향상할 수 있다.
기존의 Q value를 구하는 식은 다음과 같다.
Q'(s , a) = r + d * max Q(s' , a')
여기서 learning rate α 를 곱하여 신뢰도를 낮춘다.
Q'(s , a) = [Q(s , a)] + α * [r + d * max Q(s' , a')]
하지만 값을 더하기만 하면 Quality가 계속 커지므로 Q(s, a)에도 일정 비율만큼 값을 곱한다.
Q'(s , a) = (1 - α) * [Q(s , a)] + α * [r + d * max Q(s' , a')]
코드:
https://github.com/hunkim/ReinforcementZeroToAll/blob/master/05_q_table_frozenlake.py
Q Learning Stochastic Policy 설명:
https://ai.stackexchange.com/questions/10450/can-q-learning-be-used-to-derive-a-stochastic-policy