2016년 7월 12일 화요일

Policy Gradients

직관적 이해

제어할 대상 시스템(환경, $env$), 시스템에 가하는 $action$, 이 $action$을 만들어 내는 제어기(DNN, CNN, or RNN)가 있다고 하자. 
요점은 $env$에 가해지는 최적 $action$ 샘플링 하나를 얻는 것이라기 보다, 랜덤 샘플링(가능한 여러 $action$ 중의 하나)을 제공하는 확률 분포(DNN 출력이 만드는)를 개선하는 것이다. 
$env$ 상태(state, 이미지 등) 입력에 대해 제어기(DNN)가 준 랜덤 $action$을 시스템($env$)에 가했을 때 받은 보상값($reward$)을 loss에 반영하여 DNN 학습을 반복하면, 이 샘플링을 발생 시켰던 분포(DNN 출력)가 $reward$를 크게하는 방향으로 개선된다.  



수식

신경망 $\pi$의 출력은 확률분포이며 기대값의 가중치로 사용된다. 아래 식 우측 [~] 부분은 loss의 grad이다.  




수렴성

Policy gradient는 여러 RL(강화 학습) 학습 방법 중에서 Alphago가 사용하였다. 확률분포가 $reward$를 크게하는 방향으로 수렴함을 확인해 보자.

용어들은 $^{각주1}$을 참고한다.


RL에서 학습이란 파라메터 값을 잘 바꾸어 분포를 조정함에 의해 $action$ 샘플링이 주는 보상함수를 높이는 것이 목표이다.
보상함수 $f(x)$ 기대치를 높이는 것이 목표이므로

$\nabla_\theta{E_x[f(x)]}$

처럼 기대치 $E$의 $\theta$에 대한 구배를 계산한다. 즉, 구배를 계산하여 갱신하면 $\theta$ 값을 바꿀 수 있다. $\theta$를 통해 $p$가 바뀌게 되고 여기서 샘플링되는 $action$이 바뀌게 된다. 위 식은 약간의 계산 절차를 통해

$E_x{[f(x){\nabla_\theta}\log{p(x)}]}$

가 되고, 이 값은 샘플링된 모든 $x$에 대해, 보상함수 $f(x)$와 ${\nabla_\theta}\log{p(x)}$의 곱에 대한 평균이다.




[from Karphaty's blog]

간단한 2차원 Gaussian $p(x)$로 위 수식에 따른 샘플들과 그 보상값이 분포를 어떻게 바꾸는지 확인해 보자.
$\log{p(x)}$에 대한 분포 파라메터(여기서는 평균값 $m$, 따라서 $p(x;\ m)$이다)에 대해 도함수를 계산하면

${\nabla_\theta}\log{p(x)}$ = $c_1(x-m)$

이다. 즉, 평균점 $m$에서 샘플 점 $x$를 향하는 벡터가 된다. 첫번째 그림에서 파란색 점은 샘플점들을 나타내고 화살표는 그 방향을 보여준다.

두번째 그림에서 샘플들 위치에서 얻어진 보상함수 값을 표현한다. 특정 샘플은 +1의 보상치(녹색)를 가지고 나머지는 -1 보상치(주황색)를 가진다.
보상치와 벡터들을 곱하고 평균을 내면 분포 파라메터(여기서는 mean 위치 $m$)가 움직여야 하는 방향이 계산되고, 왼쪽 아래 방향이 나오게 된다.

계산된 방향에 따라 분포(평균 위치)를 조정하면 세번째 그림이 되고, 이제 새로운 분포에서 샘플링된 점들은 보상치가 +1이 될 가능성이 더욱 높아지게 된다.



실제 적용 예는 OpenAI의 pong게임을 이용한 것으로 초기에는 컴퓨터가 주로 이기나, 학습이 진행될수록 agent가 이기는 확률이 높아진다.




(각주 1)

$\bullet$ $p(x;\theta)$: 입력 $x$와 결합된 파라메터 $\theta$의 조합으로 값 $p$가 결정된다는 의미이고 $p$는 확률 분포(비슷한 내용으로 여기 참고)이다.  즉, $p$는 agent action을 만들어 내는 policy를 나타낸다. agent가 선택하는 action은 확률분포 $p$에서 샘플링을 통해서 생성된다.

예를 들어 $p$가 어떤 입력에 대해 action분포를 만들어 내는 CNN으로 구성된 policy network이라면, 이미지 $I$가 입력 되었을 때 action에 대한 분포인 $p(a|I;\theta)$가 되고, $\theta$는 넷 내부 weights 등 파라메터가 된다.

$p(x)$는 $p(a)$이고, 분포 $p(a)$를 바꾸려면 이미지 입력에 의해 만들어지는 $p(a)$에 관여하는 파라메터 $\theta$를 바꾸어야 한다.


$\bullet$ $f(x)$: 함수 $f$ 인자인 $x$는 $p$상에서 sampling되며 선택된 샘플(action)이 만들어 내는 보상 함수(scalar값을 가짐)이다. 선택된 action으로 끝까지 게임을 진행했을 때 win, fail에 대한 보상치이다.





References
[1] Mastering the game of Go with deep neural networks and tree search, Nature, 2016.
[2] http://karpathy.github.io/2016/05/31/rl/
[3] 한정수, 정책기울기 값 강화학습을 이용한 적응적 QoS라우팅 기법연구, 컴퓨터정보학회, 2011.

[4] What's right way of implementing policy gradient?





2016년 5월 31일 화요일

github 사용법

글올리기, 간편 안내
funmv

git init # 내 컴퓨터의 파일이 있는 특정 폴더로 가서 실행
git add pg_pong.ipynb # 로드할 파일 지정
git commit -m "policy gradients example"
git remote add origin https://github.com/funmv/RL.git # 먼저 git에 repository(폴더)를 만들어 놓아야 함

git push -u origin master # 여기서 id, pw를 필요로 함

그 외 명령: git clean -f 

2016년 5월 20일 금요일

(python) decoration, thread & yield

작성 중...

1. decoration pattern, @ 사용.
호출부에서 read_batches(50) 시,

read_batches = mpgen(read_batches(50))

처럼 원 함수의 기능 확장.


2. python에서는 GIL문제로 thread 대신에 multiprocessing 사용.
mpgen을 통해 주 프로세스와는 별도의 데이터 생성 프로세스가 시작
Queue는 thread에서 데이터 공유에 사용(아래, 최대 3개까지의 item 저장 가능)


3. yield
함수의 형태를 가지는 iterator (generator, 생성기라고 부름)를 만들어 줌.
iterator란?
c = iter(range(5))
c.next(), c.next(),... # 0,1,2,...

함수의 인자를 비휘발성으로 만듬
함수 재호출 시, yield 다음이 수행
return은 결과값 반환, yield는 iterator 반환


4. functools.wraps:
디버깅 시 func.__doc__ 또는 func.__name__ 등의 속성을 요청 시
원 함수 read_batches의 속성이 안나오고 decoration된 mpgen함수의 속성이 나오는 것을 방지.
함수 속성을 인자인 원 함수 f로 되돌리는 역할.
데코레이터에서 closure문제 해결을 위해 사용.



def mpgen(f):
    def main(q, args, kwargs):
        try:
            for item in f(*args, **kwargs):
                q.put(item)
        finally:
            q.close()

    @functools.wraps(f) 
    def wrapped(*args, **kwargs): #*args(리스트 받고), **kwargs(map 받음)
        q = multiprocessing.Queue(3)
        proc = multiprocessing.Process(target=main, args=(q, args, kwargs))
        proc.start()
        try:
            while True:
                item = q.get()
                yield item
        finally:
            proc.terminate()
            proc.join()

    return wrapped
     

@mpgen # mpgen의 인자함수로 read_batches을 사용함을 지정
def read_batches(batch_size):
    def gen_vecs():
        for im, c, p in gen.generate_ims(batch_size):
            yield im, code_to_vec(p, c)

    while True:
        yield unzip(gen_vecs()) # yield는 휘발성이 없는 함수(iterator 만듬)


2016년 5월 16일 월요일

(python) debugger

import ipdb 에서 빠져나올 때는 cntl+z
import pdb
pdb.set_trace()

명령법


(python) video read and write

opencv의 cv와 cv2의 차이
cv2 내에 cv있음. cv2가 최신.
import cv2.cv as cv

python 에서 버전 확인
import cv2
cv2.__version__

video 읽기
installed\opencv\3rdparty\ffmpeg\opencv_ffmpeg_64.dll 필요
이것을 작업 폴더에 복사해서 이름을 opencv_ffmpeg249_64.dll로 바꿈


테스트
import cv2
cap = cv2.VideoCapture('tmp1.mp4')
cap.grab() # true로 나와야 함


(Ref)
1. cv & cv2
2. about video working
3. opencv version 

2016년 4월 30일 토요일

(python) tips

import sys
sys.path
sys.path.append('c:\\python\\pathtest')
sys.path.remove('c:\\python\\pathtest')

set PYTHONPATH=c:\python
>>map(lambda apath: apath.find('pathtest'), sys.path)
[-1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]

import numpy as np
dir(), dir(np)

import pdb
pdb.set_trace()
n(step next), s(step in), run
print var

(package 작성 예)
path 연결
import sys
sys.path.append('c:\\python')
(또는 set PYTHONPATH=c:\....)

python 실행 후 path 확인하기 위해
import sys
map(lambda ap: ap.find('pathtest'), sys.path)

사용하기 위해
from pathtest.keras.imgproc import misc as mymisc

가능한 명령확인 위해
dir(mymisc)


[출처]
1. python modules
2. Jump to python - 패키지
3. python debugger- pdb


Keyboard shortcuts

[Mac]

cmd, w                     (현재 윈도 또는 탭 닫기)
cmd, t                      (현재 윈도의 새로운 탭 열기, 또는 아무 것도 없으면 새로운 파일 메니저)
cmd, [ 또는 ]            (브라우저 경로 되돌리기)
cntl, -> or <-           (여러 창을 우회하기)
cmd, cntl, F              (Full Window)
cmd, opt, <- or ->   (탭을 우회하기)

cmd, space              (새 spotlight 오픈, 파일 찾을 때)
alt, space                 (영문 한글 토글)

with iSnap
opt, -> or <- or ...



[Chrome]

cmd, n                     새로운 크롬 시작
cmd, t                      새로운 탭 시작
cmd, w                     탭 종료
cmd, shift, n            시크릿 모드 시작

cmd, L                     주소창 가기
cmd, alt, ->             탭 이동
cmd, alt, i                개발자 도구 열기

cntl, Enter               주소에 .com 추가하여 열기

Alt, <-, ->               이전 페이지로 가기, 다시 오기





[WIndows]

windows + left, right, up, down
windows + Tab

windows + cntl + D, create
windows + cntl + F4, close
windows + cntl + left/right

cntl + c/v/a



[출처]
[1] 크롬단축키,  chrome 단축키
[2] 윈도 단축키