대학교를 졸업하고 다시 집으로 돌아왔다.


이제 내방을 다시 꾸며야하는데...


첫번쨰 프로젝트로 모니터를 구매하였다!


이번에 한성에서 나온 시네마 모니터(21:9 비율) 를 구매하였다. 

이제 막 나온 따끈따끈한 신제품이다.



딱 보자마자 엄청난 스케일...


바로 다운받아둔 영화를 실행했는데... 압도적이다!!!







이 모니터를 구매한 또다른 이유중 하나는 바로 이 커브드 모니터이다.


게임을 좋아하는 나로써는 커브드 모니터도 하나의 엄청난 매력!




모니터의 받침대인데, 맥북처럼 알루미늄으로 되어있어서 상당히 고급스럽다.


괜히 플라스틱으로 되어있는것보단 훨씬 좋은듯하다!




한달 넘게 잠 줄여가며 전기세 3배가 나오며 구현한 

DQN으로 Breakout 학습시키는 코드다.

다른 코드들처럼 여러 파일이 있는게 아니고 달랑 이거 하나만 있으면 된다.

코드에 대한 설명은 주석이랑 docstring을 통해 해놨으니 궁금한점을 댓글로.



  1. MCLearning2 2017.08.03 16:01 신고

    정말 감사합니다 제가 찾던거에요!!

 


저번 1편에서는 기본적인 내용만 익히고 아직 Q-table이 업데이트 되지 않았다. 

아마 위와 같은 환경에서 끝이 나버렸을 것이다. 계속 이어나가보자.

agent가 랜덤하게(Q값이 모두 0이기 때문에) 돌아다니다가 state (14)인 점에 도착했다고 생각을 해보자. 그리고 여기서 다른 action이 아닌 오른쪽으로 가는 action을 취했다고 생각해보자. 그러면 Q(14, 오른쪽) = 1 + Max Q(15,a) = 1 + 0 이 될 것이다. 목표지점에 도착했기때문에 reward r = 1 으로 리턴을 해준다. 그럼 아래와 같이 Q-table이 업데이트 될 것이다. 



이런식으로 무한이 반복되다보면 Q-table이 업데이트 될 것이다. 계속해서 업데이트를 해보자.

이번에는 agent가 랜덤하게 돌아다니다가 state(13)에 있다가 오른쪽으로 움직일 것이다. 그럼 Q(13,오른쪽)=0 + 1 이 될것이다. 왜냐하면 Reward는 역시 0일 것이다. 그리고 Max Q(14,a)를 구해야 하는데 이때 state(14)를 보면 Q(14,왼쪽) = 0, Q(14,오른쪽) = 1, Q(14,위쪽) = 0, Q(14,아래쪽) = 0 이므로 가장 큰값은 1이다. 그러므로 Max Q(14,a) = 1 이 되고 Q(13,오른쪽) = 1이 될것이다. 그러면 아래 그림과 같이 또 업데이트가 될 것이다.




계속 업데이트 하면서 이런 방향으로 업데이트 된다고 가정을 해보자



그럼 결국 아래와 같이 Q-table이 작성 될 것이다. 



그러면 이 작성된 Q-table을 통해 움직여 보자

1편에서 말했던것 처럼 agent는 가장 높은 reward를 받을 수 있는 길로 가면 그것이 Optimal한 방법이 될 것이라고 했다. 그러면 agent는 (0) state에서 당연히 오른쪽으로 가게 될 것이다. 왜냐하면 가장 Q값이 높기 때문이고, Q값이 높다는 것은 그 행동을 하였을 때 받을 수 있는 reward의 기댓값이 높다는 말이다. 그러면 이 agent는 항상 update가 된 길로만 다니게 될 것이다. 더 최단의 길이 있는데도 불구 하고 말이다. 이것은 미래에 대해서 고려를 하지 않아서 생기는 문제와 exploration의 문제이다. 


3편에서는 최단거리로 갈 수 있게 미래에 대해 각각 다른 가중치를 줄 수 있는 discount factor와 이미 학습한 Q말고 이외로 도전적으로도 움직이게 할 수 있는 exploration 문제에 대해 다뤄볼 것이다.


위와 같은 알고리즘으로 코딩을 하면 아래와 같다. 













 Q-learning 이랑 action-value function 값을 업데이트 해주면서 가장 나은 action을 취해주는 알고리즘이다. 예전 포스트 보면 Gridworld와 Frozenlake 에 적용한 알고리즘인 Q-Table을 작성하여 action을 취하는 이론을 정리할 것이다.


 action value function을 Q-Table로 작성하여 푸는 방법을 Tabular Methods라고 한다. 서튼 교수님 책에서는 이 Tabular Methods를 state 나 action이 작을때만 적용 가능 하다고 한다. 왜냐하면 각각의 state에 action마다 Q값을 넣어줘야 하기 때문이다. 그래서 실제 환경이나 실생활, 혹은 연속적인 환경에서는 적용을 할 수 없다.


 OpenAI Gym 에 있는 FrozenLake-v0 의 Environment 이다. agent가 있을 수 있는 state가 총 16개 밖에 되지 않고, action 또한 4개밖에 되지 않기 때문에 Q-table을 이용하여 학습을 할것이다.


 간단하게 FrozenLake Environment에 대해 설명하겠다. 

 agent, 즉 action을 당할 놈은 초록색에서 시작을 해서 저기있는 노란색 위치까지 가야한다. 중간에 파란색 부분은 빠지면 게임이 끝나버리는 구멍이라고 보면 된다. Environment에서는 action값을 입력해주면 그에 맞는 Next_state, reward, done, info를 리턴해준다. 여기서 Next_state는 action을 통해 움직여서 바뀐 state라고 보면 된다. reward는 그 action을 했을때 주는 보상값이고 done은 이 환경이 끝났는지 안끝났는지를 알려주는 boolean 값이다. info는 기타 추가 정보를 가져와준다. 여기서 done이 일어날 state는 각각의 파란색 구멍과 도착지점인 노란색 부분이다. 이 Env에서는 목표 지점이 아닌 곳으로 움직이면 reward를 0을 주고 목표지점에 도착하면 reward 1 을 준다.



 이제 움직이면서 학습을 해보자!

 agent가 움직일때는 먼저 어디로 가야 가장 reward를 높게 받을 수 있는지 판단을 해야한다. 그것이 Q-Learning의 핵심이다. 가장 reward를 많이 받을 수 있는 action을 취해야하는데, 이때 다음 state에서 가장 높게 받을 수 있는 reward 까지 생각을 해야하기때문에 Q 값을 업데이트 하려면 다음 상태의 Q값도 알아야 한다.

정리해보자면 

1. agent 는 state s에 있다.

2. agent가 action 를 했을 때, reward r을 받고 state s'로 움직인다.

3. 그러면 Q(s',a')도 존재 할 것이다

라고 가정을 해놓고 해야한다.


 이것으로 Q(s,a)를 표현하면 Q(s, a)= r + max Q(s',a') 이다. 이해 안가는 분들을 위해 다시 정리하자면

현재 상태에서 action a 의 Q값은 그 action a를 했을 때의 reward값과 다음 stats s'에서 가장 많이 받을 수 있는 Q값을 더해준다. 

역시 글보다는 그림이다. 위에 Q-table을 보자.


 agent의 위치, 각각의 state는 0~15로 표현하겠다.

아직 Q-table 이 하나도 업데이트 되지 않은 상황이라 agent는 현재 Q값을 통해 action을 구할 수 없다. 구할 수 없다기보다는 모두 Q값이 0으로 같기 때문에 agent 입장에서는 모두 다 가치가 같은 행동이다. 그렇기 때문에 값이 같을 때는 랜덤으로 여기저기 움직인다고 정책을 정하자.

(0)에 있는 agent가 오른쪽으로 움직여서 (1)로 갔다고 하자. 그러면 움직이면서  Q(s, a)= r + max Q(s',a') 이 식을 이용하여 Q값을 업데이트 해야한다. 그럼 Q(0,오른쪽 a) = 0 + 0 이다. 무슨말인지 이해가 안갈 수 있다. 


 첫번째 값 0은 action을 취했을 때 받는 reward r값이다. 위에 Environment 설명을 할때 목표지점을 제외한 모든 state에서는 0을 준다고 했기 때문에 0이고, 

 두번째 값0은 다음 state에서 가장 크게 받을 수 있는 reward 값이다. 하지만 여기서는 아직 하나도 Q-table이 업데이트 되지 않았기 때문에 Q(1,a)들의 값들은 모두 0이다. 그렇기 때문에 가장 큰 값은 0이 되는 것이고 결국 Q(0,오른쪽 a) = 0 + 0 이 되는 것이다.


여기까지 보면 대충 짐작이 갈 것이다. 아무리 움직여봤자 Q-table은 업데이트 되지 않는다. 단, 목표지점을 도착하기 전까지 말이다.


다음편에서는 목표지점에 도착했을때 비로소 어떻게 Q-table이 업데이트 되는지 알아볼 것이다.


저번 포스트에서는 절차지향형 코딩을 했지만


앞으로 여러개의 네트워크를 사용하는 DQN을 사용해야하기 때문에 객체지향형 코드로 바꿔봤다.


원래 내가 했던 코드대로 deque()대신 list를 사용했고 minibatch에서 스택을 사용하는 대신에 바로바로 값을 업데이트 하였다.



클래스를 사용하여 해야하는데 아직 객체지향에 익숙하지 않아서 그냥 절차지향식으로 코딩을 해버렸다.


위와 같은 알고리즘을 사용했다.


아마 그대로 알고리즘과 똑같이 보면 될거같다.


1. 리플레이를 저장할 수 있는 리플레이 메모리와 네트워크를 구성하고


2. state를 초기화하고 전처리를 해준다(이 코드에서 전처리는 state 값을 2차 배열로 만들어 주는 것이다)


3. 한 개의 에피소드를 시작하고 e-greedy 으로 랜덤하게 action을 선택하거나 Q-value 값(Weight를 이용한)으로 action을 선택하여 실행한다.


4. action을 통한 reward와 다음 state를 받는다.


5. 위 받은 값들(state, action, reward, next_state, done)을 메모리에 저장한다.


6. 저장된 메모리의 값들 중에 몇 개를 가져와서 미니배치로 학습을 한다.


7. 위 과정을 반복한다.


로 보면 된다.


Replay memory를 사용하는 이유는 Linear Regression을 하는데 있어서, 전체적인 값으로 학습을 못하고 근처에있는 값으로 학습이 되기때문에 전체적인 분포의 Linear Regression을 할 수 없다. 그래서 일정 step 만큼의 값을 저장해두었다가 랜덤으로 값을 뽑아내면 전체적인 값을 학습할 수 있다.



sung kim 교수님 말대로 hole에 빠졌을때 -1 인 reward를 주지 않는 방향으로 생각해봤다.


아예 처음부터 싹 지우고 Q-Learning 알고리즘 그대로 이용해서 작성해보기로 했다.


(이번에는 미끄러짐 옵션도 켜둔 상태로)



이런 알고리즘이다.


진짜 이 알고리즘 그대로 구현한 코드가 이것이다.


이대로 모니터링을 하고 레코드를 하여 openAI gym에 업로드 하였다.


물론 미끄러짐 옵션 때문인지 성능이 오락가락 했지만


나름 상위권의 점수로 기록되었다.


https://gym.openai.com/envs/FrozenLake-v0


ps. 저기 나와있는 episode 35 짜리는 미끄러짐 옵션을 꺼뒀을때 레코드 한것이다.

강화학습 예제를 실제로 테스트 해보기 위해서


openai gym이라는 사이트에서 제공하는 Environment 를 이용하여 


agent의 움직임에 따라서 Q-table 를 작성하는 코드를 짜봤다.



보통의 Grid world의 게임에서는 


 start

 

 

 

 

 

 

 

Goal! 


Map이 이런식으로 start 지점에서 상/하/좌/우 로 움직여 goal 지점으로 가는 것이다.


그런데 openAI gym에 있는 Frozen lake는 미끄러짐 옵션과 hole(구멍에 빠져 죽는) 옵션이 있다.



여기서 미끄러짐 옵션을 일단 꺼두고, hole 만 있는 상태에서 코드를 작성 해봤다. 


Environment 에 나와있는 Map은 이런식으로 생겼다


"4x4": [
"SFFF",
"FHFH",
"FFFH",
"HFFG"




처음에 기본적인 Q-table 업데이트 방법에 따라서




이 식을 적용해준다.


for i in range(num_episodes):
# Reset environment and get first new observation
s = env.reset()
rAll = 0
d = False
j = 0
# The Q-Table learning algorithm
while j < 250:
j+=1
if j==1 :
a= np.random.randint(4)
else :
# Choose an action by greedily (with noise) picking from Q table
a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)/i)
#print( np.random.randn(1,env.action_space.n)*(1./(i+1)))
# Get new state and reward from environment
s1,r,d,_ = env.step(a)

# Get negative reward every step
if r== 0 :
r= -0.01

# Update Q-Table with new knowledge
Q[s, a] += lr * (r + y * np.max(Q[s1, :]) - Q[s, a])
rAll += r
sList.append(s)
s = s1
if (d == True) :
if r==1 :
print(sList)
sList=[]
rList.append(rAll)
print("Episode {} finished after {} timesteps with r={}. Running score: {}".format(i,j,rAll,np.mean(rList)))

break


원래 FrozenLake environment에는 스텝마다 negative reward 가 없어서 내가 코드에 따로 추가했다.


스텝마다 negative reward를 넣어준 이유는

학습을 하면서 이 agent가 한 범위를 왔다갔다 하다가 Goal 지점을 도착하나, 

agent가 최단 거리로 Goal를 도착하나 최종 reward는 같기 때문에

agent는 Goal 지점까지 오기전까지(Goal에 도착한다고 가정했을때) 얼마나 긴 시간이 걸릴지 모른다.

그래서 이것을 방지하기 위해 step마다 negative reward를 준다.


이렇게 작성을 하고 실행을 해보니




Episode 9472 finished after 6 timesteps with r=0.95. Running score: 0.6945846088884197

[0, 4, 8, 9, 13, 14]

Episode 9473 finished after 6 timesteps with r=0.95. Running score: 0.694611568503272

[0, 0, 4, 8, 9, 13, 14]

Episode 9474 finished after 7 timesteps with r=0.94. Running score: 0.6946374670184695

[0, 4, 8, 9, 13, 14]

Episode 9475 finished after 6 timesteps with r=0.95. Running score: 0.6946644153651329

[0, 0, 4, 8, 9, 13, 14]


이라는 값이 나온다. 최대한 최단거리로 가려고(실제로 최단거리는 6) 

그리고 7이 나오는 이유는 start 지점에서 우/하 방향으로 밖에 움직여지지 않는데,

상/좌 로 움직일때는 제자리 걸음을 하게 된다. 이때 생기는 step이다. 


혹시나 하고 몇번 돌려봤는데....


이런 말도 안되는 결과값이 나올 때가 있다.(대부분 이 결과값이다. 위의 결과값은 어쩌다 한번씩 나오는...)



Episode 271 finished after 2 timesteps with r=-0.02. Running score: -0.024852941176470588

Episode 272 finished after 3 timesteps with r=-0.03. Running score: -0.02487179487179487

Episode 273 finished after 3 timesteps with r=-0.03. Running score: -0.024890510948905112

Episode 274 finished after 2 timesteps with r=-0.02. Running score: -0.024872727272727272

Episode 275 finished after 2 timesteps with r=-0.02. Running score: -0.024855072463768113


이런 결과값을 내뱉고 있다...


이 agent 놈이 그냥 계속 홀에 빠져 죽는 것이다.


어떻게 된건지 궁금해서 이때 작성된 Q-table을 확인해보니


이 agent는 랜덤하게 움직일때 한번도 Goal 지점에 도착해본적이 없어서 positive reward를 받아 보지 못한 agent 였다.


그래서 자기는 나름대로 최대의 이득을 보겠다고 가장 빠른 시간내에 죽어버리기로 결심을 한것이다.

괜히 알지도 못하는 길 돌아다니다가 step negative reward를 받느니 차라리 빨리 자살을 하는게 났다고 학습이 된것이다.

(헬조선에 사는 사람같은 학습을 하게 된것이다.)



무엇이 문제일까 생각해보다가 이놈이 hole에 빠져서 죽어버리는것이 무섭지 않게 생각해서 이렇게 됬다고 판단.


그래서 hole에 들어가서 죽었을때, 큰 negative reward(= -1)를 주었다. 


그랬더니 가끔씩은 빠져죽거나, 최단거리로 가거나 한다.

(위에 첫 스타트 부분때 랜덤하게 가는 부분을 지워서 무조건 제자리 걸음 하는것을 멈춤.

아니면 이 게임에 한해서 첫 시작은 우/하 방향으로만 가게 조건을 잡아둘수도 있음.)





무엇이 문제일까 생각을 해봤더니 아마 discount factor를 수정해보면 어떨까 싶어서(코드 초기에는 0.99를 주었다.)


점점 줄여나가다보니 0.5 쯤부터 안정적으로 최단거리로만 가는 agent 학습이 된다!!!!(이것도 완벽하지 않았다.)



또 다른 방법을 생각해보다가 초반 탐색 범위를 늘리게 된다면 더욱 Goal 지점에 다다를수 있게 되고 


a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))


이와 같은 코드에서 


a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(10./(i+1)))

이렇게 바꿔주게 되면 초반에는 더 랜덤하게 돌아다니므로 Q-table을 더 안정적으로 update 할 수 있게 된다.


이렇게 하니 discount factor 또 한 0.99로 해두어도 아주 잘 학습이 된다.



Episode 37 finished after 13 timesteps with r=-0.65. Running score: -0.30131578947368426

[0, 0, 4, 8, 8, 8, 4, 8, 9, 10, 14]

Episode 38 finished after 11 timesteps with r=0.5. Running score: -0.28076923076923077

[0, 0, 0, 1]

Episode 39 finished after 4 timesteps with r=-0.2. Running score: -0.27875000000000005

[0, 0, 4, 8, 9, 10, 14]

Episode 40 finished after 7 timesteps with r=0.7. Running score: -0.25487804878048786

[0, 4, 8, 9, 13, 9, 10, 14]

Episode 41 finished after 8 timesteps with r=0.65. Running score: -0.2333333333333334

[0, 0, 0, 4, 8, 9, 10, 14]

Episode 42 finished after 8 timesteps with r=0.65. Running score: -0.21279069767441866

[0, 4, 8, 9, 10, 14]

Episode 43 finished after 6 timesteps with r=0.75. Running score: -0.19090909090909094

[0, 4, 8, 9, 10, 14]

Episode 44 finished after 6 timesteps with r=0.75. Running score: -0.17000000000000004



위와 같이 초반에 랜덤하게 왔다 갔다 하다가 한번 Goal 지점에 도달하고 나서부터는


Episode 52 finished after 6 timesteps with r=0.75. Running score: -0.03113207547169812

[0, 4, 8, 9, 10, 14]

Episode 53 finished after 6 timesteps with r=0.75. Running score: -0.016666666666666673

[0, 4, 8, 9, 10, 14]

Episode 54 finished after 6 timesteps with r=0.75. Running score: -0.0027272727272727336

[0, 4, 8, 9, 10, 14]

Episode 55 finished after 6 timesteps with r=0.75. Running score: 0.010714285714285699

[0, 4, 8, 9, 10, 14]

Episode 56 finished after 6 timesteps with r=0.75. Running score: 0.023684210526315776

[0, 4, 8, 9, 10, 14]


안정적으로 최단거리를 가기 시작했다.


여기까지는 내가 env에서 따로 주지않는 negative reward를 주어서 학습 시킨 코드이다.


페이스북 AI Korea 그룹에서 이 예제를 질문했을때,

홍콩 과기대 sung kim 교수님께서 negative reward를 주지 않아도 해결할 수 있다고 하셨는데.

이 것에 대해서도 다시 한번 생각해 봐야겠다.






Value Function

State-value function

agent가 state 1에 있다고 가정을 하자. 거기서부터 쭉 action을 취해가면서 이동할 것이고, 그에 따라서 reward를 받는 것들을 기억할 것이다. 끝이 있는 episode 라고 가정했을 때 episode가 끝났을 때 state 1에서부터 받았던 reward를 discount factor를 적용해 다 더할 수 있다. 

Return에 대한 식은 위와 같고, 이 return의 expectation이 state-value function이다. 그리고 이것은 아래와 같이 표현한다.

[State=s 일때, return의 기대값]

즉, 어떤 상태 S의 가치이다. 그렇다면 value function을 어떻게 구할 것인가? agent 가 다음으로 갈 수 있는 state들의 가치를 보고서 높은 가치의 state로 이동하게 되는데, 어떻게하면 효율적이고 정확한 value function을 구할 지가 중요한 문제가 된다. 예를들어 주사위를 던지듯이 계속 던지면서 expectation을 구할 수 있을 것이다. 하지만 거의 무한번을 던져야 true expectation값을 알 수 있듯이 value function 또한 무한 try 해봐야 알 수 있을 것이다. 


 전에 알아봤던 Policy에 대해서도 생각을 해보자. 위에는 전혀 policy에 대한 고려가 되지 않았다. 만약 agent 가 어떤 행동정책을 한다고 가정해보자. Random으로 움직일 때와 비교를 해보면, 각 state들은 완전히 다른 경험을 하게 될것이다. 각 policy마다 value function이 달라질수 있으므로, 그 value function을 최대로 하는 policy를 찾을 수 있을 것이다. policy에 대한 value function은 다음과 같다.


[state=s 이고 policy=π 일 때, return의 기대값]


Action-value function

MDP에서 action이란 무엇인지에 대해 정의를 했다. action이란 어떤 state에서 할 수 있는 행동들을 말하는데, 보통 모든 state에서 가능한 행동은 모두 같다. 위에서 정의를 내린 value function에 대해서 생각을 해보면, state의 가치라는 것은 그 state에서 어떤 action을 했는지에 따라 달라지는 reward들에 대한 정보를 포함하고 있다. 또한 agent 입장에서 다음 행동을 다음으로 가능한 state들의 value function으로 판단하는데, 그러려면 다음 state들의 대한 정보를 모두 다 알아야하고 그 state로 가려면 어떻게 해야하는 지도 알아야한다.

따라서 state에 대한 value function말고 action에 대한 value function을 구할 수 있는데 그것이 바로 action value function이다. action value function을 이용하면 state value function과는 달리 어떤 행동을 할지 action value function의 값을 보고 판단하면 되기 때문에, 다음 state들의 value function을 알고 어떤 행동을 했을 때 거기에 가게 될 확률을 알아야하는 일도 없어진다. action-value function에 대한 정의는 다음과 같다.


[state=s, action=a, policy=π 일 때, return의 기대값]


어떤 state s에서 action a를 취할 경우의 받을 return에 대한 기대값으로서 어떤 행동을 했을 때 얼마나 좋을 것인가에 대한 값이다. 위에서 언급한 이유로 앞으로 value function은 action-value function을 사용할 것이다. Action-value function은 다른말로 Q-value로서 q-learning이나 deep q-network같은 곳에서 사용되는 q라는 것을 의미한다.




Markov Decision Process


MDP를 배우기 전에 Markov 하다는 말의 정의와 Markov Chain, Markov Reward Process에 대해 알아보자.


[어떤 S(state), A(action)을 해왔을때(처음 어떠한 상태로부터 현재까지 지속) 현재상태까지 올 확률]


위와 같은 식이 아래와 같은 식으로 표현 된다면 state는 Markov 하다고 할수 있다.


[어떤 S(state), A(action)을 했을때(현재상태 바로 전 상태) 현재상태까지 올 확률]


스타크래프트를 예로 들면 어떤 게임 중간 상황은 그 상황이 일어나기 이전의 모든 상황들에 영향을 받아서 지금의 상황이 된 것이기 때문에,

지금 상황에 이전상황의 모든 정보가 담겨져 있다고 이해할 수 있다.



MDP는 state, action, station probability matrix, reward, discounted factor 로 이루어져 있다.


state 은 agent가 인식하는 자신의 상태를 말한다. 사람으로 치면 '나는 방에 있다' 라고 하면 여기서 '방'이 state이 된다.


action은 agent가 environment에서 특정 state으로 갈때 지시하는 것이다. 어느 쪽으로 움직일때 그것이 action이 되고 agent가 action을 취하면 실재로 오른쪽이나 왼쪽으로 움직이게 된다. 그리고 움직임으로써 state을 변화 시킨다.


State transition probability matrix 는 어떤 action을 취했을 때 state가 결정론적으로 딱 정해지는 것이 아니고 확률적으로 정해지게 되는데, 일종의 noise라고 생각해도 된다.

[state=s, action=a 일 때, state=s' 가 될 확률]


Reward는 agent가 action을 취하면 environment가 그에 따라 주는 보상이다. 게임같은 경우에는 'score', 바둑같은 경우에는 '승/패'가 된다.


[state=s, action=a 일 때, 받는 Reward의 기대값]


어떤 action을 취했을 떄 reward를 받게 됬을 때, 이 때 단순히 받았던 reward를 더해버리면 문제가 생긴다. reward를 각각 0.1, 1을 받는 경우가 있으면 시간이 무한대로 간다면 둘다 최종 reward 값은 무한대가 되므로 두 경우중 어떤 경우가 더 나은 건지 판단할수 없다. 또 한가지는 agent가 어떤 episode를 시작하자마자 1을 받은 경우와, 끝날 때(미래) 1을 받았을 경우, 둘다 최종 reward는 1이기 때문에 어떤 경우가 더 나은 건지를 판단 할 수 없다. 이렇기 때문에 discount factor 라는 개념이 등장한다.


Discount factor는 시간에 따른 reward의 가치를 달라지게 표현하는 방법이다. 보통 discount factor(γ)값은 0하고 1 사이이다. 

이 그림을 보면 이해하기 쉬울 것이다. 한단계씩 시간이 지날때 마다 γ 값의 승수가 늘어난다. 만약 γ 값이 0이라면 미래는 전혀 생각하지 않는 바로 앞 상황만을 보는 reward 값이 나올것이고, γ값이 1이라면 현재의 reward 가치와 미래에 나오는 reward값들의 가치는 같게 판단하므로 상당히 미래지향적이 될 것이다.


Markov Chain

MDP 에서 action과 reward 가 없다고 가정을 하면 state과 state 사이에는 transition matrix(전이 행렬)와 transition probability(전이 확률)가 있다.


이런 그림을 Markov Chain이라고 한다. 각각의 state로 움직일 때의 확률이 나와있고, 이 그림 같은 경우에 시간이 무한대로 흐른다면 모두 'Sleep'으로 수렴하게 될것이다. 그리고 더 이상 변화가 없기 때문에 'stationary distribution' 이라고 말한다. MDP에서는 action을 할 확률과 action을 해서 어떤 state로 갈 확률이 주어지게 된다.


Agent-Environment Interface

agent가 action을 취하고 state를 옮기고 reward를 받고 하면서 environment와 상호작용을 하는 것을 말한다.


agent가 observation을 통해서 자신의 state를 알게되면, 그 state에 맞는 action을 취하게 된다. 학습하지 않았을때는 random한 action을 취한다. 그러면 environment 에서는 agent에게 reward와 다음 state를 알려주게 된다.


Policy

말 그대로 '정책'이다. agent가 어떤 state에 도착하면 action을 결정하는데, 어떤 state에서 어떤 action을 할지 정해주는 것을 policy라고 한다. 결국 강화학습의 목적은 optimal policy(accumulative reward(누적된 보상) = retrun을 최대화 하는 policy)를 찾는 것이다.


[state=s 일 때, action=a를 할 확률]


MDP Graph

아까의 Markov chain 하고는 표현 방법이 다르다. 아까의 Markov chain에서는 state 사이에 transition이 있었지만, MDP Graph에서는 reward로 표현하게 된다.



+ Recent posts