2019년 9월 4일 수요일

강화학습 공부를 위한 추천 논문 - DQN 계열

v.2019.09.05

강화학습을 공부하고 연구하려고 하는 사람들이 많이 늘어나고 있다. 하지만 다들 어디에서 부터 시작해서 뭘 봐야하는지 어떤 논문들이 있는지 조차 알기 어려운 경우 또한 많다.

우선 강화학습의 기초를 공부했다는 전제 하에 간략한 요약과 함께 유명한 논문을 몇 편을 추천하려고 한다. 아직 강화학습의 기초 공부가 덜 된 분들은 https://memopage2019.blogspot.com/2019/09/blog-post.html 게시물의 내용을 참고해서 꼭꼭 공부하고 넘어오길 바란다.

DQN 논문의 Nature 표지(2015)


우선 많은 논문들이 있지만 제일 먼저 추천하는 논문으로는 DQN과 그 파생 논문들, Rainbow는 꼭 봐야한다.


  • Deep Q-Learning
https://arxiv.org/abs/1312.5602


DQN은 지금의 딥 강화학습의 시발점이 되는 논문이라고 할 수 있으며, 2015년 Nature 논문의 표지를 장식하기도 했다.
이 논문은 강화학습에 딥러닝을 적용하여 아타리 게임에서 사람을 뛰어넘는 수준까지 끌어올린 논문으로, 

  • Target network
    • Q-learning update 식에서 다음 스텝의 q함수와 현재 스텝의 q 함수가 같아서 학습이 방해되었는데, 분리함으로써 학습을 돕는다.
  • Experience replay 
    • 강화학습을 학습하기 위해 수집된 데이터들을 보면 현재 state와 직전 state 간의 차이가 너무 미미해서 데이터 간의 correlation이 상당히 심해 학습이 실패한다. 그 문제를 해결하기 위해 replay memory에 탐험한 데이터를 모으고, 학습 할 때는 랜덤으로 불러옴으로써 correlation 문제를 해결하였다.

위 두 가지가 논문의 핵심이 된다. 

DQN은 워낙 많이 알려져있기도 하고, 유명해서 찾아볼만한 블로그나 강의자료가 많으나, 개인적으로 김성훈 교수님의 강의를 추천한다.
https://www.inflearn.com/course/reinforcement-learning/



  • Double Q-learning


https://arxiv.org/pdf/1509.06461.pdf
DQN에서 Q 함수가 종종 과대평가(overestimate) 하는 경우가 있어서 이를 막기 위해 등장한 개념. 아래 블로그에서 그 원인과 증명까지 설명이 잘 되어 있으니 자세한 설명은 패스
https://parkgeonyeong.github.io/Double-DQN%EC%9D%98-%EC%9D%B4%EB%A1%A0%EC%A0%81-%EC%9B%90%EB%A6%AC/

  • Prioritized Experience Replay
https://arxiv.org/abs/1511.05952

이 논문은 위 DQN 논문에서 핵심적인 역할을 한 Experience replay 를 한단계 발전시킨 형태이다. 기존의 방법은 랜덤으로 불러왔다면, 이번 논문에서는 우선순위에 따라 탐험한 데이터를 불러와서 학습함으로써 학습을 빠르고 강건하게 이루어질 수 있도록 하였다. 경험해보면 알겠지만 DQN은 상당히 느리다.



  • Dueling Network

https://arxiv.org/abs/1511.06581

위 그림과 같이 나눠졌다가 다시 합쳐지는 구조의 모델을 제안한 논문으로, 기존에는 State-Action value 값만 나왔다면, 이 논문에서는 State value 값과 Advantage 값이 따로 나오고 이들을 계산하여 State-Action value 값을 구하는 구조이다. 이렇게 했더니 성능 잘 나오더라

  • Rainbow

https://arxiv.org/pdf/1710.02298.pdf
그 외에도 Noise DQN이나 Distributed DQN 등이 있다. 모두 읽어보면 좋을 논문들이라고 생각하며, Rainbow 논문에 인용되면서 설명도 함께 있으니 이해안되는 부분 위주로 찾아 보면 좋을 것 같다. Rainbow 논문은 위의 DQN과 그 파생 논문들을 모두 합쳐놓은 형태로, 상당히 훌륭한 성능을 나타낸다. 다만 구현이 어렵겠지



2019년 9월 3일 화요일

강화학습 공부를 위한 추천 자료

v.2019.09.04


최근 인공지능/머신러닝/딥러닝이 큰 인기를 끌면서 머신러닝의 일종인 강화학습을 공부하고자 하는 사람들이 많아지고 있다. 내가 공부하면서 봤던 자료들 중 크게 도움이 되었던 자료들을 정리하고 공유한다.

David Silver 교수님의 강화학습 수업

  • David Silver 교수님 강의

우선 강화학습의 기본적인 내용들을 공부해야 한다. 강화학습의 이론적 토대가 되는 dynamic programming 부터 model-based, model free 및 exploration & exploitation 까지 강화학습의 기초가 되는 내용들 어느 것 하나 놓치지 않고 설명해주는, 알파고 논문의 저자이자 앞으로 두고두고 보게 될 강화학습 논문들을 많이 쓴 교수님 강의이다.
http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html

  • 한글로 정리한 내용들

하지만 강의가 영어로 진행되고, 동영상 강의로 진행되다 보니 진행속도가 빠르지는 않다. 제이마플의 이웅원 님께서 David Silver 교수님의 수업 자료를 토대로 한글로 정리해서 책 처럼 만든 자료가 있으니 빠르게 공부하고자 하는 사람들에게 좋은 자료가 될 것이다.
https://dnddnjs.gitbooks.io/rl/content/

위 자료들을 보면서 잘 이해가 되지 않거나 추가 설명이 필요한 부분이 있다. 그럴 때 아래 블로그에서 참고하기도 했는데, 이 또한 잘 만든 강화학습 기초 자료로 생각된다.
https://sumniya.tistory.com/category/Reinforcement%20Learning/Contents


  • 실습 코드


공부하면서 실제로 코드가 돌아가는 환경이 보고 싶다면 RLCode 팀이 직접 만든 github을 활용해도 좋을 것 같다. 강화학습의 기본 알고리즘 부터 딥 강화학습의 토대가 되는 DQN 및 A3C 까지도 다루고 있으니 두고두고 공부하기 좋은 자료라고 생각한다.
https://github.com/rlcode/reinforcement-learning-kr


여기까지 딥하지 않은 강화학습을 공부하기 위해 추천할 만한 기본 자료들을 정리해보았다. 이 외에도 요즘에는 정리가 잘 되어 있는 블로그나 git이 많기 때문에 공부하다 어려운 부분은 키워드 위주로 찾아가면서 공부하면 좋을 것 같다.

2019년 1월 30일 수요일

python 3.6 설치 및 default 버전 바꾸기

v.190131
Ubuntu 16.04에서 python 3.6설치 및 기본 버전 바꾸는 방법


우선 python 3.6 을 설치한다.

sudo add-apt-repository ppa:jonathonf/python-3.6

sudo apt-get update

sudo apt-get install python3.6



python3의 기본 버전을 바꾸기 전 python3 버전 선택 리스트에 넣는 명령어라고 생각하면 된다. (버전 하나만 넣으면 하나만 선택하게 된다)

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2

(3.5, 3.6 두개 버전을 넣도록 되어 있는데 나중에 버전만 바꿔입력하면 된다.)

sudo update-alternatives --config python3
이 명령어를 이용해 입력해놓은 python버전을 언제든지 바꿀 수 있다. 아래와 같은 이미지가 뜬다.


0 번을 입력하면 python3.6이 python3의 기본 버전으로 선택된다.

python3 -V 을 입력하면 3.6이 선택된 걸 확인할 수 있다.



python3가 아닌, python 으로 입력했을 때의 기본 버전을 바꾸기 위해서는 아래와 같이 입력하면 된다.

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 1

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2

sudo update-alternatives --config python



출처:
http://ubuntuhandbook.org/index.php/2017/07/install-python-3-6-1-in-ubuntu-16-04-lts/

2019년 1월 28일 월요일

pytorch로 multi task learning 학습 할 때 주의해야 할 점

v2019.01.28

pytorch를 사용하면서 구글링으로 해결하기 어려웠던 내용들을 정리해본다.

우선,
multi task learning으로 학습을 해야 할 때가 있다.
(혹은 RL에서 Auxiliary task)

이 때 optimizer를 선언하는 방법은 아래와 같이 하면 된다.

optimizer = torch.optim.Adam(list(model1.parameters())+list(model2.parameters())+...)


두번째로
loss를 각각 정의 해준 뒤 하나로 합쳐준다.

optimizer.zero_grad()      # clear gradient
total_loss = model1_loss + model2_loss + ...     #calculate and summation loss
total_loss.backward(retain_graph=True)  # backpropagation, compute gradient
optimizer.step()        #update

loss마다 각각 backward()를 했을 때는 에러로 retain_graph=True를 넣으라고 뜨지만 넣어줘도 같은 에러가 뜨고 죽는다. loss를 합쳐서 한번에 backward 하면 죽지 않는다.

retain_graph를 True로 설정하면 backward를 해도 gradient를 남겨놓음으로써 이후에 backward를 할 수 있게 되며, 나의 경우 retrain graph=True로 설정하면 약 60mb정도의 메모리를 더 소요하는 것 외에 큰 차이를 보지 못했다. (pytorch docs에는 효율적인 사용을 위해 retain_graph 파라미터에 대해 따로 건들 일이 거의 없다고 되어있다)

2019년 1월 24일 목요일

SSH로 Ipython jupyter notebook 설치 및 설정



우분투 서버에 jupyter를 설치하고 수정하는 과정이 여기저기 분산되어 있어서 설치하는 과정을 한 군데 모아보았다.

우선 ipython 및 jupyter 설치
pip install --upgrade pip
pip install ipython
python -m pip install jupyter
jupyter notebook
까지 입력하면 로컬에서 사용가능한 jupyter가 설치 완료된다.



이제 원격에서 접근 가능한 jupyter로 만들어보자

cntl + c 로 위 프로세스를 종료하고,
패스워드를 입력하는 방식으로 하기 위해 아래 명령어를 통해 프로파일을 생성한다.
jupyter notebook --generate-config
입력하면 ./jupyter 디렉토리와 jupyter_notebook_config.py 가 생성된다.
ipython 을 실행시킨 후 아래 명령어를 순서대로 입력하고 원하는 패스워드를 입력. 생성된 해시는 따로 복사해둬야 함 (종료 시 cntl+d)

v2022.10.19

아래 작성한 과거 버전의 jupyter notebook 사용법을 따라가다 보면 아래와 같은 에러가 나온다.

ImportError: cannot import name 'passwd' from 'IPython.lib'

이는 Ipython 버전이 8.x로 업데이트 되면서 password 입력방식이 달라졌기 때문이다.


새로운 설치방법은 더욱 간결해졌다.

우선 기본 커맨드 창에서 아래 명령을 입력하고, 원하는 패스워드를 입력한다.

jupyter notebook password
올바르게 입력하면 아래와 같은 문구가 뜬다.
[NotebookPasswordApp] Wrote hashed password to /home/USER/.jupyter/jupyter_notebook_config.json

해당 파일에 생성된 해시태그 비밀번호를 복사한다.


vim ~/.jupyter/jupyter_notebook_config.json  <- 여기에서 "password" : "argon2:~~" 복사
vim ~/.jupyter/jupyter_notebook_config.py <- 여기에서 붙여넣기

vi/vim 으로 jupyter_notebook_config.py 파일을 수정한다.
해당 파일에 아래 5줄의 내용을 붙여넣고 password 부분에 방금 생성된 해시 값을 붙여넣는다. 해당 파일이 모두 주석처리 되어 있기 때문에 아무데나 복붙.

c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 32123                #원하는 포트를 넣으세요
c.NotebookApp.password = 'sha~~~~'   #<-여기에 복사한 값 복붙



v2019.01.25 (과거 버전)

from IPython.lib import passwd
passwd()
Enter password:
Verify password:
Out[2]: 'sha~~~~'


vi/vim 으로 jupyter_notebook_config.py 파일을 수정한다.
해당 파일에 아래 5줄의 내용을 붙여넣고 password 부분에 방금 생성된 해시 값을 붙여넣는다. 해당 파일이 모두 주석처리 되어 있기 때문에 아무데나 복붙.

c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 32123                #원하는 포트를 넣으세요
c.NotebookApp.password = 'sha~~~~'   #out[2] 값 복붙

저장 후
jupyter notebook 으로 실행하면 된다.
위에서 포트와 아이피 등을 설정해주었기 때문에 옵션을 따로 넣어주지 않아도 된다.



참조:
https://jupyter.org/install.html
https://financedata.github.io/posts/jupyter-notebook-authentication.html
https://cyan91.tistory.com/49