부트캠프/컴퓨터 비전

강화 학습

례지 2022. 12. 21. 16:11
728x90
보상을 최적화하기 위한 학습
  • 관측(에이전트) → 행동(환경) → 보상
    • 에이전트의 목적은 보상의 장기간 기대치를 최대화하는 행동을 학습
  • 강화 학습 사례

로봇의 관측(에이전트): 카메라, 센서 등 / 로봇의 행동(환경): 땅, 세상 / 보상을 결정하는 일이 가장 어려움 / 미스 팩맨의 보상: 획득 점수

정책 탐색
  • 정책: 소프트웨어 에이전트가 행동을 결정하기 위해 사용하는 알고리즘

신경망 정책을 사용한 강화 학습

확률적 정책
  • 30분 동안 수집한 먼지의 양을 보상으로 받는 로봇 진공청소기
  • 로봇 훈련을 위해 변경이 가능한 두 개의 정책 파라미터(직진, 회전)
    • 확률 p, 각도의 범위 r
    • 전진확률 p, 회전확률 1-p
    • 회전각도 마이너스 r < angle < 플러스 r 사이 랜덤값
    • 이 정책에는 무작위성이 포함되어 있기 때문에 확률적 정책
    • 그 중에 가장 좋은 정책 선택
    • 문제는?
    • 모래사장에서 바늘 찾기!
유전 알고리즘
  • 1세대 정책 100개를 랜덤하게 생성해서 시도
    • 성능이 낮은 정책 80개는 버리고 20개를 살려 각각 자식 정책 4개를 생산
    • 살아남은 정책과 그 자식은 2세대를 구성
    • 좋은 정책을 찾을 때까지 여러 세대에 걸쳐 반복
Policy Gradient(PG)
  • 정책 파라미터에 대한 보상의 미분값을 평가
  • 높은 보상의 방향을 따르는 미분값으로 파라미터를 수정하는 최적화 기법을 사용
    • 로봇 진공 청소기에서,
      • p를 조금 증가시킨 후 30분동안 로봇이 수집한 먼지 양이 증가했는지 평가
      • 만약 먼지 양이 많아졌다면 p를 조금 증가, 그렇지 않으면 p를 감소
OpenAI gym
  • 강화학습의 어려움 점?
    • 학습을 위한 작업 환경 마련
    • 게임 플레이 학습 시 게임 시뮬레이터 필요
    • 보행 로봇 학습 시 실제 세상에서 그냥 하면 되지만 한 번 사고 나면 복구 불가
    • 학습 속도 높이는 것 불가능 (컴퓨터의 성능과 관계 없음)
    • 결론적으로 실제 세상에서 훈련하는 것은 어렵고 느려 최소한의 시뮬레이션 환경 필요
    • PyBullet, MujoCo 등 3D 물리 시뮬레이션 라이브러리 존재
  • 다양한 종류의 시뮬레이션 환경을 제공하는 툴킷
    • 아타리 게임, 보드 게임, 2D와 3D 물리 시뮬레이션 등
  • OpenAI는 일론 머스크가 공동 창업한 인공지능 연구 회사
  • CartPole 환경 생성
    • 카트 위 막대가 넘어지지 않도록 왼쪽이나 오른쪽으로 가속할 수 있는 2D 시뮬레이션
    • 정책: 막대가 왼쪽으로 기울어지면 카트를 왼쪽으로 가속하고 오른쪽으로 기울어지면 오른쪽으로 가속
    • 이 정책으로 에피소드 500번 실행해서 얻은 평균 보상과 결과 확인

CartPole 환경

실습
pip install virtualenv
(base) C:\Users\Playdata>cd RL
(base) C:\Users\Playdata\RL>virtualenv RL
(base) C:\Users\Playdata\RL>.\RL\Scripts\activate
(RL) (base) C:\Users\Playdata\RL>jupyter notebook

  • Python 3.5 이상
  • sklearn 0.2 이상
# gym 설치
!python -m pip install -U gym
# python 3.5 이상
import platform
print(platform.python_version())
# 0.2 이상 필수
import sklearn
sklearn.__version__
import tensorflow as tf
tf.__version__
import gym
import numpy as np
import os
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib as mpl
mpl.rc('animation',html='jshtml')
np.random.seed(42)
tf.random.set_seed(42)
gym.envs.registry
# 환경 구축
env = gym.make('CartPole-v1',render_mode = "rgb_array")
# 환경 초기화
obs = env.reset()
# 카트 수평 위치, 0이 중앙
obs[0][0]
# 속도, 양수면 우측
obs[0][1]
# 막대의 각도, 0이 수직
obs[0][2]
# 막대의 각속도, 양수가 시계방향
obs[0][3]
img = env.render()
img.shape
plt.figure(figsize=(5,3))
plt.imshow(img);

env.action_space
# action=  1은 오른쪽으로, action = 0은 왼쪽으로
action = 1
env.step(action)

 

728x90