Reinforcement Learning은 Environment와 Agent의 상호작용에 대한 모델을 사용한다. Environment에서 Agent(Actor)가 한 번의 Action을 수행할 때, State(Observation)가 변하고 적절한 Reward를 얻을 수 있다.
한 state에서 수행할 action은 Q table에 의해 결정된다. Q table은 total reward가 최대가 되도록 하는 state와 action을 기억하는 table이다. 이 행렬은 (가능한 state의 수) X (각 state에서 할 수 있는 action)의 크기를 갖는다. Q table에 state와 action을 입력으로 주면 출력으로 Quality(reward)를 얻을 수 있다. 이 Q value는 현재 state에서 action을 취해서 얻을 수 있는 reward와 다음 state에서 얻을 수 있는 최대 reward를 합한 값이 된다.
Q'(s , a) = r + max Q(s' , a')
이 알고리즘은 다음과 같은 순서로 진행된다. Q table을 만들고 모든 Q value를 0으로 초기화한다. 첫 번째 state에서 시작해서 Q table을 기반으로 Q value가 최대가 되는 방향으로 action을 취한다. action을 취하면서 위의 Q(s , a) 식에 맞게 Q value를 update 한다. action을 한 후에는 현재의 state를 다음 state로 변경한다. 모든 action이 끝나고 마지막 state가 되면 다시 앞의 과정을 반복하면서 Q value를 update 한다.
코드:
import gym
import numpy as np
env = gym.make("Taxi-v3")
Q = np.zeros([env.observation_space.n, env.action_space.n])
G = 0
alpha = 0.618
for episode in range(1,1001):
done = False
G, reward = 0, 0
state = env.reset()
while done != True:
action = np.argmax(Q[state])
state2, reward, done, info = env.step(action)
Q[state, action] += alpha * (reward + np.max(Q[state2]) - Q[state, action])
G += reward
state = state2
if episode % 50 == 0:
print('Episode {} Total Reward: {}'.format(episode, G))
간단한 Gym Taxi Example이다. 우선 taxi environment를 load 한 후에 state와 action에 대한 Q table을 만든다. 열 방향으로는 가능한 모든 observation(state)의 수(500)만큼 생성되고, 행 방향으로는 각 state에서 가능한 6개의 action이 생성된다.
episode가 1000번 진행되면서 이 Q value가 개선된다. episode는 environment를 reset 한 상태에서 시작한다. 첫 행동으로는 argmax를 사용하여 Q value(현재 state에서 할 수 있는 action) 중에 가장 큰 index를 action으로 취한다. step으로 action을 수행하면서 새로운 state, reward, done, info 값을 갱신한다.
위의 4개의 값들 중에 state와 reward를 사용하여 다음 Q value(state-action)를 update 한다. 이때, 현재의 state-action과 다음 state-action의 관계에 대한 Bellman Equation을 이용한다. G는 각 episode의 total reward 값으로 각 행동의 reward를 축적하여 계산한다. alpha는 learning rate이고 임의로 정한다.
결과:
total reward의 최대치는 확인해보지 못했지만, 처음에 비해서 많이 안정화된 것을 확인할 수 있다. 그리고 Bellman Equation에 대해서 더 자세히 공부해야겠다.
벨만 방정식 이론: 2020/09/04 - [공부/강화학습] - MDP, 가치 함수, 벨만 방정식
코드:
import gym
import numpy as np
# 1. Load Environment and Q-table structure
env = gym.make('FrozenLake8x8-v0')
Q = np.zeros([env.observation_space.n,env.action_space.n])
# env.obeservation.n, env.action_space.n gives number of states and action in env loaded
# 2. Parameters of Q-leanring
eta = .628
gma = .9
epis = 5000
rev_list = [] # rewards per episode calculate
# 3. Q-learning Algorithm
for i in range(epis):
# Reset environment
s = env.reset()
rAll = 0
d = False
j = 0
#The Q-Table learning algorithm
while j < 99:
env.render()
j+=1
# Choose action from Q table
a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))
#Get new state & reward from environment
s1,r,d,_ = env.step(a)
#Update Q-Table with new knowledge
Q[s,a] = Q[s,a] + eta*(r + gma*np.max(Q[s1,:]) - Q[s,a])
rAll += r
s = s1
if d == True:
break
rev_list.append(rAll)
env.render()
print("Reward Sum on all episodes " + str(sum(rev_list)/epis))
print("Final Values Q-Table")
print(0)
위의 예제와 비슷한 과정으로 진행되는 것을 볼 수 있다.
결과:
아래 강의 영상 참고
https://www.inflearn.com/course/reinforcement-learning/lecture/5775?tab=curriculum
gym 설치 및 예제
https://dejavuqa.tistory.com/126
homebrew 설치
gym 예제 코드
https://towardsdatascience.com/reinforcement-learning-with-openai-d445c2c687d2
Bellman Equation
'데이터 사이언스 공부 > 강화학습' 카테고리의 다른 글
3) Dynamic Programming, Policy Evaluation, Iteration (0) | 2020.11.12 |
---|---|
2) Agent, Environment, State (0) | 2020.09.10 |
1) MDP, Value Function, Bellman Equation (0) | 2020.09.04 |
3) Q-Network, DQN (0) | 2020.08.14 |
2) Q-learning exploit & exploration and discounted reward, stochastic(non-deterministic) world (0) | 2020.08.07 |