Search

'강화학습'에 해당되는 글 3건

  1. 2018.09.12 Q-Network
  2. 2018.08.19 Q-Learning in Non-Deterministic World
  3. 2018.08.19 Q-Learning

Q-Network

컴퓨터공부/인공지능 2018.09.12 22:10 Posted by 아는 개발자 아는 개발자

Q-Network


앞선 포스트에서 다룬 Q-Learning은 초기 학습 데이터 없이 주변을 탐사해가며 보상값을 최대화 하는 방향으로 환경 데이터의 파라미터의 값을 지속적으로 업데이트 하는 알고리즘이다. 그런데 만약 4x4처럼 작고 단순한 환경이 아니라 5000x5000이고 각 환경별로 선택 할 수 있는 경우의 수가 수십가지가 된다면 기존 알고리즘으로는 시간도 오래 걸릴 뿐만 아니라 모든 환경 데이터 값을 관리하는 것도 불가능하다.


이 문제는 Linear/Logical Regression에서도 겪어보았다. 학습에 사용되는 이미지의 크기가 커질수록 Feature의 값이 많아지게돼 기존의 방식 대로는 학습이 불가능했었다. 당시엔 이 문제를 해결하기 위해 Feature단위로 값을 분석하지 않고 인간의 뇌 구조를 본뜬 뉴럴 네트워크에 데이터 값을 몽땅 넣은 다음에 추이를 살펴보는 방법을 택했었는데 다행이도 Q-Learning도 이와 동일한 접근으로 해결 할 수 있다. Network를 사용한 Q-Learning은 Q-Network라고 부른다.


그런데 Linear/Logical Regression과 달리 지금까지 Q-Learning에서는 Cost Function이 없었다. 왜 없었을까? 그런데 조금만 생각해보면 있는 것이 오히려 이상하다. Q-Learning에서는 학습에 사용하는 실제 데이터가 없기 때문에 학습 결과물이 예측한 값과 라벨 값을 비교할 일이 없었다. 그래서 다소 비효율적이지만 모든 값을 돌아다니며 당시에 주어진 보상 값을 업데이트하는 방식을 사용해야 했다. 하지만 뉴럴 네트워크에 적용하려면 죽이되든 밥이되든 Cost Function이 필요하다. 그래서 Q-network에서는 학습데이터 없이 기존과 동일하게 보상 값을 할 수 있는 Cost Function을 새로 만들었다. 


별도로 논문에 첨부된 수식 보다는 코드로 보는것이 더 직관적일 것 같다. tensorflow를 해본 사람은 40, 41번째 줄을 제외하면 술술 넘어갈 것이다.

# Deep Q-Network lecture slide from http://hunkim.github.io/ml/RL/rl07-l1.pdf
# Original source code repository is https://github.com/awjuliani/DeepRL-Agents

import numpy as np
import tensorflow as tf
import random
from collections import deque
import gym 

class DQN:
    def __init__(self, session, input_size, output_size, name="main"):
        self.session = session
        self.input_size = input_size
        self.output_size = output_size
        self.net_name = name
     
        self._build_network()
     
    def _build_network(self, h_size = 10, l_rate = 1e-1):
        with tf.variable_scope(self.net_name):
            # Input data type
            self._X = tf.placeholder(
                tf.float32, [None, self.input_size], name="input_x")
     
            W1 = tf.get_variable("W1", shape=[self.input_size, h_size],
                             initializer=tf.contrib.layers.xavier_initializer())
            layer = tf.nn.tanh(tf.matmul(self._X, W1))
     
            W2 = tf.get_variable("W2", shape=[h_size, self.output_size],
                                initializer=tf.contrib.layers.xavier_initializer())
     
            # Predicted reward value
            self._Qpred = tf.matmul(layer, W2) 
     
        # Label data type
        self._Y = tf.placeholder(
            shape=[None, self.output_size], dtype=tf.float32)

        # Cost function
        self._loss = tf.reduce_mean(tf.square(self._Y - self._Qpred))
        self.train = tf.train.AdadeltaOptimizer(learning_rate=l_rate).minimize(self._loss)

    def predict(self, state):
        x = np.reshape(state, [1, self.input_size])
        return self.session.run(self._Qpred, feed_dict = {self._X: x}) 

    def update(self, x_stack, y_stack):
        return self.session.run([self._loss, self.train], 
                feed_dict={self._X: x_stack, self._Y: y_stack})

위 코드의 40번째 줄에 해당하는 부분이 Q-Network에서 사용하는 Cost Function이다. 여기서 self._Qpred는 현재 위치에서 예측했을 때 각 행동별 reward 값이다. 그리고 그것과 비교하는 self._Y는 아래 update 함수에서 y_stack으로 대입해주는 값인데 여기서 대입 해주는 값은 학습하면서 얻게된 실제 reward 값이다. 이 말은 즉슨 지금 내가 학습한 결과물과 동시에 시도하면서 얻어낸 reward 값을 비교해보면서 맞춰 나가겠다는 뜻이다. 발상의 전환이다. 방금 Learning중에 얻어낸 유의미한 데이터 값을 바로 학습에 적용했다. 특별한 사전 학습 데이터가 없이도 이런 방식으로 Cost Function을 만들어 낼 수 있다니 신기하다.


'컴퓨터공부 > 인공지능' 카테고리의 다른 글

Q-Network  (0) 2018.09.12
Q-Learning in Non-Deterministic World  (0) 2018.08.19
Q-Learning  (0) 2018.08.19
파이썬으로 AI 개발할 때 유용한 패키지 모음  (0) 2018.08.07
뉴럴네트워크(Neural Network)  (0) 2017.08.18
오버피팅(Overfitting)  (0) 2017.08.10

Q-Learning in Non-Deterministic World

컴퓨터공부/인공지능 2018.08.19 13:11 Posted by 아는 개발자 아는 개발자


그림 1.


Non Deterministic은 한가지 행동이 여러가지 결과를 만들 수 있는 환경을 의미한다. 그림1에서 빨간선은 Agent가 이동하기로 의도한 방향이고 파란선은 에이전트가 실제로 이동한 방향이다. Deterministic한 상황에서는 에이전트가 의도한 대로 항상 오른쪽으로만 이동한다. 그런데 그림 1과 같은 상황에서는 에이전트가 그림처럼 오른쪽으로도 이동할 수도 있고 위로도 이동할 수도 있다. 이처럼 한가지의 행동(Action)이 여러가지 결과를 내는 환경을 Non-Deterministic이라 부른다.


앞선 포스트에서 설명한 Q-Learning은 예전에 알고리즘 시간에 배웠던 Dynamic Programming(이하 DP)과 여러모로 유사한데 DP는 에이전트가 취한 행동이 항상 고정된 결과를 가져올 때는(Deterministic) 최적의 해를 빠르게 낼 수 있는 알고리즘이지만 여러 가지 결과를 낼 수 있는 상황(Non-Deterministic)에서는 적용할 수 없는 문제점이 있다. 마찬가지로 Q-Learning도 환경이 고정될 때는 100%에 가까운 확률로 예측을 하지만 여러가지 결과를 내는 환경에서는 학습률이 1~2% 이하로 급격하게 저하된다. 


다행이도 DP와 달리 Q-Learning 수식을 조금만 수정하면 Non-Deterministic 환경에서도 어느 정도 괜찮은 성능을 볼 수 있다. 알고리즘 설명에 앞서 우리의 현실 세계를 바라보자. 회사에 이제 막 입사한 신입 사원은 자신의 직속 상사뿐만 아니라 고과권자, 임원 그리고 다른 회사에서 일하는 학교 선배 등등 무수히 많은 멘토들로부터 조언을 듣게 된다. 이중 몇몇은 지금 당장 실행에 옮길 수 있는 조언도 있고 지금은 아니어도 미래에 해야할 조언도 있으며 감동적인 얘기지만 요즘 시대의 정서와는 맞지 않는 (꼰대 소리) 이야기도 있다. 그래서 현명한 신입 사원이라면 멘토의 조언을 곧이곧이 받아들이지 않고 필요한 것들만 적절히 취사 선택 한다.


수정된 Q-Learning에서도 동일한 방식이 적용된다. 에이전트는 행동의 보상을 그대로 업데이트 하지 말고 여러가지 결과물의 보상값을 볼 수 있도록 기존에 학습한 정보를 고집할 필요가 있다. 수학자들은 고집하는 정도를 수학 수식의 형태로 간단하지만 예술적으로 표현 해뒀다. 이미 인공지능을 공부해본 사람들은 아마 예측 했을 수도 있겠다. Linear Regression을 공부 할 때 귀에 박히도록 배운 학습률(learning rate)을 적용하면 된다. 학습률이 높을 수록 방금 취한 action의 보상 값을 많이 반영하고 낮을 수록 보상값을 무시한다. 


1. 모든 환경 데이터 값, Q(s, a)을 초기화 한다.

2. 현재 상태를 확인한다.

3. 그리고 다음의 작업을 반복한다.

- 동작을 선택할 때 랜덤 값을 포함한다.

= argmax(Q(s, a) + ramdom_value)

- 보상 값을 받는다.

- 새로운 상태 값(s')을 확인한다.

- 환경 데이터 값을 업데이트 한다

  Q(s, a) = (1 - learning_rate) * Q(s, a) + learning_rate * (gamma * reward + Max Q(s', a'),)

# 0 < learning_rate < 1


* 이 알고리즘을 사용하면 예전처럼 100%까지는 아니어도 50-60% 정도의 정확도는 보인다. 여전히 아직은 아쉬운 결과 값이다.


* 어찌보면 단순한 수식의 변형이 학습률을 이정도로 끌어올리니 신기하다. 인간의 두뇌도 생각보다 단순하게 이뤄져 있을 것 같다는 생각이 든다.

'컴퓨터공부 > 인공지능' 카테고리의 다른 글

Q-Network  (0) 2018.09.12
Q-Learning in Non-Deterministic World  (0) 2018.08.19
Q-Learning  (0) 2018.08.19
파이썬으로 AI 개발할 때 유용한 패키지 모음  (0) 2018.08.07
뉴럴네트워크(Neural Network)  (0) 2017.08.18
오버피팅(Overfitting)  (0) 2017.08.10

Q-Learning

컴퓨터공부/인공지능 2018.08.19 09:50 Posted by 아는 개발자 아는 개발자

강화학습은 주변의 상태를 지속적으로 탐사해가며 미래에 주어지는 '보상' 값을 활용해 최적의 알고리즘을 찾는 학습법이다. 초기 학습데이터가 필요한 딥러닝과는 달리 초기의 학습데이터가 필요 없으며(물론 학습 데이터를 활용해서 성능을 높이기도 한다) 대신 어떤 조건에서 보상을 줄 것인지에 대한 정책과 탐사할 환경이 필요한 알고리즘이다. 국내에선 이세돌과 커제를 무참히 무찌른 알파고의 학습 알고리즘으로 알려져있다.


Q-Learning은 대표적인 강화 학습 알고리즘으로 '특정 상태에서 어떤 결정을 내리는 것이 미래 보상을 가장 높여줄 것'인지에 대한 정책 데이터를 지속적으로 업데이트 하는 알고리즘이다. 강화학습을 배울 때 가장 먼저 접하는 알고리즘이며 수학 수식들이 난무해 이해하고 싶지 않고 할 수도 없을 것 같은 위키피디아 페이지와 달리 예상외로 쉽고 차근차근 학습해나가면 누구나 배울 수 있는 알고리즘이다. 유튜브에 쉽게 풀어 쓴 강의도 많으니 심도 있게 공부하고 싶은 분들은 여기서 공부하면 좋을 것 같다.


이번 포스트에서는 Q-Learning을 아주 쉽게 풀어 쓰지는 않고 대략적인 동작 방법과 의사 코드를 정리해 수강한 강의 내용들을 정리하는데 초점을 맞추고자 한다.


그림 1.


Q-Learning의 현재 상태를 표현하면 위의 그림 처럼 테이블의 형태로 표현 할 수 있다. 현재 에이전트(학습하는 주체를 에이전트라고 부른다)가 있는 곳은 S로 표시된 곳이고 가야할 곳은 D이며 이곳에 도달 했을 때 보상을 받게 된다. H는 진입하면 죽는 곳이다.


그림 2.


처음 환경에 진입했을 때는 아무런 정보가 없기 때문에 이곳 저곳 다 다녀본다. 에이전트가 선택할 수 있는 방향은 동서남북중 하나인데 어떠한 정보가 없기 때문에 에이전트는 어느 곳을 선택해도 돌아오는 보상 값은 동일하다고 보고 랜덤하게 선택한 방향으로 이동하게 된다. 이렇게 다니면서 다니면서 홀에도 빠져 보고 이전에 지나친 경로들을 다시 다녀보기도 한다. 한마디로 삽질의 연속이다.


그림 3.


이렇게 우왕좌왕하면서 우연히 D 값에 도달 하기도 하는데 이때 에이전트는 처음으로 보상(reward)값을 받는다. 그리고 앞으로 움직이는 행동들은 앞서 초기화한 보상값을 활용해서 업데이트가 이뤄진다. 즉 이 상태에서는 특정 방향이 목적지에 도달할 확률이 높다고 가중치를 주는 작업이다. 지금까지를 의사코드로 정리하면 다음과 같다.

1. 모든 환경 데이터 값, Q(s, a)을 초기화 한다.

2. 현재 상태를 확인한다.

3. 그리고 다음의 작업을 반복한다.

- 동작을 선택하고 실행한다.

- 행동에 따른 보상 값을 받는다. reward

- 새로운 상태 값(s')을 확인한다.

- 아래의 수식으로 환경 데이터 값을 업데이트 한다

  Q(s, a) = reward + Max Q(s', a')


Q(s, a)의 의미는 상태 현재 상태가 's'이고 'a' 행동을 취했을 때 얻게 될 보상 값이다. 위 그림에서는 총 25개의 상태가 있고 각 상태별로 가능한 행동이 4개가 있으니 총 100개의 환경 데이터 값이 필요하다.


그림 4. 


위의 알고리즘은 최적의 값은 찾기는 하지만 보상값을 업데이트한 이후에는 똑같은 경로로 이동하게 되는 단점있다. 현재 상태의 보상 값을 바로 다음 상태의 보상 값으로 입력시키기 때문에 파란선으로 지나온 상태에서 최적의 보상을 주는 값이 이미 정해져 버리고 또 각 상태별 행동은 가장 높은 보상 값을 주는 것으로 선택하기 때문에 매번 동일한 경로로 이동하게 된다. 그래서 그림 4의 빨간선을 이용하면 더 빠르게 갈 수 있지만 이 경로는 보지 못하고 이전에 학습한 경로대로만 다니게 되는 단점이 있다.


이런 오류를 막기위해서 알고리즘에 두가지 노이즈를 추가한다. 미래의 보상은 시간이 지날 수록 낮춰지는 것과 행동을 선택할 때 보상값과 랜덤값을 더하는 방식이다. 두 방법 모두 에이전트에게 돌출 행동을 유도하는 일종의 트릭이다.


1. 모든 환경 데이터 값, Q(s, a)을 초기화 한다.

2. 현재 상태를 확인한다.

3. 그리고 다음의 작업을 반복한다.

- 동작을 선택할 때 랜덤 값을 포함한다.

a= argmax(Q(s, a) + ramdom_value)

- 보상 값을 받는다.

- 새로운 상태 값(s')을 확인한다.

- 환경 데이터 값을 업데이트 한다

  Q(s, a) = gamma * reward + Max Q(s', a'), # 0 < gamma < 1


노이즈를 준 부분을 굵은 글씨로 표시해뒀다. 행동을 선택 할 때 최적의 보상값 + random 값으로 선택하도록 했는데 이는 동서남북을 선택 할 때 각각의 보상값과 ramdom값을 더한 값중에서 가장 높은 값을 선택하도록 하는 것이다. 초기 알고리즘은 그림 4에서 빨간선과 파란선이 갈라지는 지점(2행 3열)에서 가장 높은 보상값을 주는 파란선을 무조건 선택하게 되는데 수정한 알고리즘은 빨간선을 선택 했을 때의 랜덤값이 더 높으면 빨간선을 선택하게 된다.


그리고 미래에 주어지는 보상은 지속적으로 감소하게 만들었다. 처음으로 받게되는 보상은 D에 도달하는 지점이었으니 빨간선과 파란선이 갈라지는 지점에서는 보상값이 꽤 많이 감가상각돼 빨간선을 택하는 것과 파란색을 택할 때의 보상값 차이가 얼마 나지 않을 것이다. 이 두가지 방법으로 에이전트는 기존 학습 데이터 값을 크게 벗어나지 않는 선에서 돌출된 행동을 유도 할 수 있다.


참고문헌


- 홍콩과기대 교수님 유튜브 강의: https://www.youtube.com/channel/UCML9R2ol-l0Ab9OXoNnr7Lw

'컴퓨터공부 > 인공지능' 카테고리의 다른 글

Q-Network  (0) 2018.09.12
Q-Learning in Non-Deterministic World  (0) 2018.08.19
Q-Learning  (0) 2018.08.19
파이썬으로 AI 개발할 때 유용한 패키지 모음  (0) 2018.08.07
뉴럴네트워크(Neural Network)  (0) 2017.08.18
오버피팅(Overfitting)  (0) 2017.08.10