이전 포스팅에서 Reinforcement learning을 공부해봤다. Reinforcement learning의 일부로 Markov Decision Process라는 것이 있는데, 이것을 공부해보려고 한다. 그런데 이것을 공부하려면 먼저 Markov Process와 Markov Reward Process를 먼저 공부해야한다. 그래서 이번 포스팅에는 이 두 개를 먼저 설명하고 다음 포스팅에서 Markov Decision Process를 설명하도록 하겠다.


우선 Markov Process이다. 아래와 같은 그래프가 있다고 해보자.




이 그래프를 간략하게 설명하자면... class1에서 class2로 갈 확률이 0.5 페북을 할 확률이 0.5!! 한번 패북을 하면 0.9확률로 계속 페북을 하고.. 뭐 이런 쉬운 그래프이다. 이 그래프에서 여러가지 흐름이 있을 수 있다. 예를 들어서 


흐름1 : Class1 - Class2 - Class3 - Pub - Class2 - Class3 - Pass - Sleep


이런 흐름이 있을 수 있다. Markov Process는 다음 State는 지금의 State에 의해서 결정된다는 이론이다. 무슨 말이냐면... 위의 흐름에서 Pub에서 Class2로 가는 것은 이전에 어떤 흐름을 거쳤든 오로지 Pub→Class2의 확률에 의해 결정된다는 것이다. 이전에 Class1에 있었든 pub에 있었든 페북을 했든 상관이 없고 오로지 현재 Pub에 있다는 사실에 의해 결정된다는 것이다. No History At All!! 이것이 Markov Process이다. 


위의 그래프에서 각각의 State에서 다음 State로 넘어가는 확률을 조건부 확률로 표현할 수 있다. 예를 들어 Class1에서 Class2로 넘어가는 확률은 P(Class2|Class1)으로 나타내고 그 값은 0.5가 된다. 이런 조건부 확률을 아래와 같이 표로 나타낼 수 있다.


http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching_files/MDP.pdf


Markov Reward Process는 Markov Process에 Reward 개념을 추가한 것이다. 위의 그래프에서 아래와 같이 Reward를 추가해보자.



Markov Reward Process에서는 Value라는 개념이 나온다. 각 State는 각각의 Value를 갖는데, 이 Value는 '값'이 아닌 '가치'의 Value이다. Value와 Reward가 둘다 '좋은 것'이기 때문에 헷깔릴 수 있다. 헷깔리지 말자. Value와 Reward는 다른 것이다. Value는 그 State에 있을 때 최종 목적을 이룰 수 있는 잠재력을 의미한다. 그 State에 있을 때의 당장의 이득(Reward)가 아닌 최종적으로 목적을 이룰 수 있는 잠재력을 의미한다. 예를 들어 아침에 일찍 일어나서 공부를 하는 것은 매우 힘든 일이다. 당장은 몸도 힘들고 그날 하루가 조금 힘들어질 수도 있다. 하지만 장기적으로 봤을 때 아침 일찍 일어나서 공부를 하면 그만큼 성실해지고 그만큼 성공적인 삶을 살 확률도 높아진다. 따라서 '아침공부'라는 State가 있다면 그것은 Reward는 작아도 Value는 클 수 있다는 것이다. 다시 한번 말한다. Value와 Reward는 다르다. 그러면 우리가 Value는 어떻게 구하는지 한번 알아보자. 


 Value Function으로 Value를 구하는데 Value Function에는 gamma라는 파라미터가 들어간다. 이 gamma는 항상 0과 1 사이의 값인데, 0에 가까울 때는 당장의 이득만 쫒아가면서 value를 계산하고, 1에 가까울 때는 멀리보고 value를 계산하게 된다. 식을 보면 이 말이 이해가 된다.


지금(t)에서의 Value는 아래와 같이 계산될 수 있다.

V(t) = Reward(t) + gamma*E( Reward(t+1) * p(state(t+1)|state(t)) )


gamma가 극단적으로 0이면 gamma^1*Reward(t+1)와 이후 부분이 모두 0이 되므로 현재의 Reward인 Reward(t)가 V(t)가 되버린다. 즉 미래에 얻을 Reward는 하나도 생각 안 하겠다는 것이다. 한번 예를 들어서 Value 하나를 계산해보자.


Value(Class3) = Reward(Class3) + gamma*(p(Pub|Class3)*Reward(Pub) + p(PASS|Class3)*Reward(PASS))

Value(Class3) = -2 + gamma*(0.4*1 + 0.6*10)


gamma = 0.9로 놓으면,

Value(Class3) = -2 + 0.9*(0.4*1 + 0.6*10) 

Value(Class3) = -2 + 0.9*(6.4)

Value(Class3) = -2 + 5.76

Value(Class3) = 3.76


이것을 각 state 마다 계속 반복하면 거의 변하지 않는 어떤 상태로 Converge되는데 그 결과는 아래와 같다. 코딩한 것도 같이 업로드했으니 같이 참고해보기 바란다.


# 코드 : state.py

※ value는 최초에는 reward 값으로 초기화된다. 이 값은 Markov Reward Process를 거치면서 업데이트된다.


# 코드 : markov_reward_process.py


# 결과


이게 Markov Reward Process이다. 여기에 Action 개념을 추가한 것이 Markov Decision Process이다. 반대로 말하면 Markov Decision Process에서 Action이 완전히 정해진 것이 Markov Reward Process인데 아무튼 우리는 Markov Decision Process에 대해서는 다음 포스팅에서 더 자세히 공부해보도록 하자.

Posted by 빛나유
,

오랜만에 포스팅이다. Reinforcement learning을 공부해보자. 한글로는 강화학습이라고 하는데 사실은 이 분야는 Data Mining이라기보다는 Machine Learning 부분이다. 그런데 Data Mining 폴더에 집어넣는 이유는... 모르겠다. 아무튼 Reinforcement learning을 공부해보자.


이번 포스팅에서는 Reinforcement learning의 개념을 알아보려고 한다. 우선 Supervised learning을 먼저 생각해보자. 이 개념은 아주 간단하다. 주어진 데이터를 기반으로 학습을 진행하여 학습되지 않은 데이터에 대해서 예측을 하는 것이다. 단, 그 학습을 할 때 사용되는 데이터는 반드시 레이블을 가지고 있어야 한다. 이것이 Supervised learning이다. Supervised learning은 기본적으로 데이터를 가지고 학습이 진행된다.


그런데 Reinforcement learning은 조금 개념이 다르다. 일단 데이터 뭐 이런거 잊어보자. 내가 알파고(Agent)를 만든다고 해보자. 이 알파고의 최종 목적은 바둑을 둬서 이기는 것이다. 알파고는 이기면 항상 보상을(Reward) 받게 된다. 그런데 알파고는 이길 수도 있고 질 수도 있다. 뭐에 따라서? 상대방이 어떻게 두느냐에 따라서(환경). 상대방이 어떻게 두더라도(여러 환경) 알파고는 최대한 이길 수 있는 수를(Reward를 쫒아서) 두도록 학습해간다.  바둑이라는 예로 Reinforcement learning을 설명해봤다. 한 가지 예를 더 들어보자. 탁구를 치는 로봇을(Agent) 만든다고 해보자. 그 로봇은 오는 공을 받아칠 때마다 잘했다고 칭찬을 받는다(Reward). 상대방은 여러 방향에서 다각도로 공을 준다(여러 환경). 로봇은 상대방이 주는 공을 항상 받아칠 수 있도록 계속적으로 Reward를 쫓아서 학습되어간다. 


조금 더 이론적으로 설명해볼까?


Agent가 (알파고, 탁구로봇)

주어진 환경에 대하여 (상대방이 두는 바둑 수, 상대방이 치는 탁구)

Reward를 얻을 수 있는 (바둑을 이기기, 상대방의 공을 잘 쳐내기)

방향으로 계속 학습해나가는 것 (상황에 따른 최고의 바둑 수를 두기, 상황에 따른 최적의 각도와 힘으로 공을 쳐내기)


바둑을 예로 한번 더 설명해보자. Reinforcement learning을 하는 과정을 보면 알파고가 여러가지의 기보 데이터를 가지고 학습을 진행한다. 


기보1 : A, B, C, D, E, ..., Z → 승리


알파고가 A를 두고 상대방이 뭐를 뒀을 것이고 그 상태에서 B를 두고 상대방이 또 뭐를 뒀을 것이고 그 상태에서 C를 또 두고 이런 식이다. 이 기보의 결과가 승리라고 해보자. 그럼 알파고는 A, B, C...Z까지의 결정을 올바른 결정이라고 학습한다. 그런데 이게 상식적으로 맞나? 아니다. 예를 들어 B가 실수여도 나머지를 잘 둬서 결론적으로 승리를 할 수 있다. 반대로 특정 수를 매우 잘 뒀어도 나머지를 잘못둬서 결론적으로 패배했을 수도 있다. 그런데 강화학습에서는 이것들이 계속적으로 반복되어 수많은 기보로부터 학습을 하면 그 영향이 사라진다고 말하고 있다.


이 과정을 다시 한번 예제로 들어보자. 


DeepMind에서 스타크래프트를 하는 인공지능도 개발 중이라고 하는데, 스타크래프트를 예로 들어서 설명해보자. 수 많은 스타크래프트 개임 데이터가 있다고 하자. 그 중에 한 경기가 아래와 같이 흘러갔다.


스타1 : 벙커링 실패, 저글링러쉬로 본진이 거의 초토화, 드랍십공격 성공, 베틀크루져생산, 저크폭탄드랍방어 → 승리


자 대충 이런 경기가 있었다고 해보자. 이 태란 유저는 승리를 했다. 그런데 벙커링 실패하고 저글링러쉬로 본진이 거의 초토화됐는데 역전승을 한 경우이다. 강화학습에서는 이런 경우에도 벙커링 실패한 것과 저글링러쉬로 본진이 거의 초토화된 상태에 대해서도 올바른 결정으로 판단을 한다는 것이다. 단, 이런 경우는 거의 없기 때문에 스타크래프트 데이터를 계속적으로 학습하다보면 그 영향은 사라진다는 것이다. 


이제 다시 이론적으로 말해보자. 강화학습은 어떤 agent가 최종적으로 reward를 얻기 위하여 그 과정의 행동 결정 하나하나를 최고의 행동으로 결정하는 것을 반복하여, 최종적으로 optimal한 decision process를 갖춘 agent를 만드는 과정인 것이다. 아래의 그림을 봐보자. 

이 그림에서 START state에서 로봇이 움직인다. +Reward로 가면 성공, -Reward로 가면 실패이다. 그렇게 가기 위해서 로봇은 이리저리 움직인다. 벽면에 부딧히기도 할 것이고 실패도 하고 성공도 할 것이다.


그런데 계속적으로 로봇을 훈련을 시키면 가장 Optimal하게 아래와 같이 간다


이렇게 움직이는 거를 아래와 같이 구현해봤다.


위의 그림이 강화학습을 한 최종 결과인데, EAST, NORTH, WEST, SOUTH는 각각 그 방향으로 움직일 확률을 의미한다. 즉, 7에서 0.84의 확률로 EAST로 움직이고, 6에서 0.88의 확률로 NORTH, 5에서 0.92의 확률로 NORTH, 4에서 0.96의 확률로 다시 EAST로 가면 결국 +REWARD(PEND)로 가게 된다는 것이다.


※ 여기서 이해하기 쉽게 설명하기 위해서 저 숫자를 확률이라고 했는데, 사실은 확률이 아니라 그 State에 있는 value 값이다. 이것에 대해서는 다음 포스팅에 설명하려고 하니 여기서는 그냥 확률 정도로 이해하는 것이 편할 것 같다.


다음 포스팅에서는 Reinforcement learning에 대한 개요는 끝내고 조금 더 디테일하게 Reinforcement learning의 Markov Reward Process에 대하여 이야기 해보려고 한다.

Posted by 빛나유
,

OWL을 설명해보자. OWL Web Ontology Language의 약자로 WOL이라고 하면 뭔가 읽기도 이상해서 OWL이라고 살짝 순서를 바꿔서 약자를 지었다고 한다. 지금까지 이전 포스팅에서 설명한 RDFS까지의 내용을 보면 확실히 뭔가 세상의 물체의 개념은 설명이 가능할 것 같다. 그렇지만 아직 관계는 그렇게 확실하게 설명하지 못한다.

 

예를 들어, 지금까지 RDFS를 통해서 person Classanimal Classsubclass라는 것을 명시할 수 있다고 했다. 그런데 이 정도 수준이 전부이다. RDFSDateOfBirth ClassBirthDay Class가 같은 Class라는 것을 알 수 있나? 모른다. RDFS에서는 이 두 Class는 그저 서로 다른 Class일 뿐이다. , RDFS로는 컴퓨터가 DateOfBirthBirthDay가 같은 것을 의미한다는 것을 모른다. 또 다른 예를 들어보자.

- John is a Father of Michael.

- Marry is a John’s sister.


이 두 문장으로 예를 들어보자. JohnMichael의 아버지고 MarryJohn의 여동생이니까, 우리는 굳이 말하지 않아도 Michael의 이모는 Marry라는 것을 안다. 그런데 컴퓨터는


Marry is an aunt of Michael


이라고 명시해주지 않는 이상 모른다. 이것을 어떻게 컴퓨터도 알 수 있게 할까? 컴퓨터가 Class간의 관계를 이해하고 추론할 수 있게 하기 위해서 우리는 Ontology를 이용하는 것이다. 이제 본격적으로 Ontology를 이용해서 구체적으로 어떤 방법으로 Class간의 관계를 명시하는지를 설명해보자.

 

대학교를 설명하는 Ontology를 만든다고 할 때, 기본적으로 몇몇 Class가 있을 것이다.

- Student

- Professor

- Course

- Lab


Class들 사이에는 당연히 아래와 같은 관계들이 존재한다.

- Professor Teach Student

- Student BelongsTo Lab

- Lab IsOwnedBy Professor

- Student Take several Course


더 많이 만들 수 있지만 예제로 간단하게 만드는 것이니 이 정도만 하기로 하자. 살짝 부연 설명을 하면, “모든 교수들은 학생들을 가르친다는 당연한 이야기이다. “마찬가지로 학생들이 Lab에 속한다역시 당연한 것이다. (그렇다고 하자) 위의 네 문장을 OWL로 표현을 하면 이와 같이 표현할 수 있다.

 

위와 같이 정의를 해두면 가령 누군가가 StudentProfessorTeach한다라고 썼을 경우 오류가 나게 된다. “Student Teach Professor”가 잘못된 문장이라는 것을 컴퓨터가 이해할 수 있게 된다. Ontology에서 이와 같은 것을 Object Property라고 한다. 객체들이 가져야 되는 속성이라는 것이다. Teach라는 것은 반드시 주어 부분에 Professor가 와야 하고 목적어 부분에는 Student가 와야 된다는 속성이라는 말이다.

 

DataType Property라는 것도 있다. 이것도 어려운 내용은 아니다. 예를 들어 모든 학생은 나이가 있다. 그래서 아래와 같이 정수(Integer)형으로 ageDataTypeStudent에 대하여 정의해준다.


age라는 것은 반드시 그 범위가 음수가 아닌 정수여야 한다는 것을 명시적으로 정의해준 것이다. 이렇게 해두면 누군가가 학생 John의 나이는 -10살이다라고 했을 때 컴퓨터가 그것이 틀렸다는 것을 알 수 있게 된다.

이제 OWL이 어떤 면에서 Class들간의 관계를 설명한다는 것인지 어느 정도 감이 올 것이다. 추가적으로 몇 개를 더 해보자. 가령 이런 것도 가능하다. “생일태어난 날이라는 Class가 같다는 것은 아래와 같이 정의할 수 있다.


equivalentClass 구문을 이용해서 BirthDayDateOfBirth가 같은 Class라는 것을 명시해줬다. 반대 관계도 표현할 수 있다.


TeachIsToughtBy는 반대말이라는 것을 추가적으로 명시해줬다. 따라서 Teach는 주어 부분에 Professor를 두고 목적어 부분에는 Student를 두며 IsToughtBy와는 반대관계라는 것을 정의할 수 있다.

 

지금까지 설명한 내용들은 OWL을 이해하기 위함이지 그것의 전부가 아니다. OWL에서 관계를 표현할 수 있는 방법은 무수히 많고 지금까지 설명한 것은 빙산의 일각에 불과하다. 실제로 구현된 OntologyGoogleKnowledge GraphFacebook Graph Search를 보자.

 

# Google’s Knowledge Graph

http://searchengineland.com/laymans-visual-guide-googles-knowledge-graph-search-api-241935


# Facebook’s Graph Search

https://neo4j.com/blog/why-the-most-important-part-of-facebook-graph-search-is-graph/

 

이것으로 Ontology에 대한 설명은 마치려고 한다. 다음 포스팅은 뭐가 될지 모르겠지만 뭔가 비슷한 분야가 되지 않을까 싶다.

'etc...' 카테고리의 다른 글

[High Performance Computing] MPI  (1) 2018.02.19
[Semantic Web] RDFS  (0) 2017.02.06
[Semantic Web] Linked Data and RDF  (0) 2017.02.06
[Semantic Web] Basic of Semantic Web  (2) 2017.02.06
[Tensorflow] Multi linear Regreassion  (1) 2016.11.27
Posted by 빛나유
,