일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- pandas
- Gap
- 포토샵
- Flexbox
- Photoshop
- stl
- Javascript
- c++
- dataframe
- 강화학습
- series
- 알고리즘
- Prefix Sums
- 상태
- skt membership
- 확률
- 통신사할인
- spring
- 백준
- 에라토스테네스의 체
- SK바이오사이언스
- CSS
- Design Pattern
- Codility
- 수학
- margin
- 소수
- grid
- c
- align-items
- Today
- Total
sliver__
카트폴 본문
강화학습 환경에서 중요한 것 중 하나가
에이전트를 학습시킬 수 있는 환경입니다.
Gym: A toolkit for developing and comparing reinforcement learning algorithms
Open source interface to reinforcement learning tasks. The gym library provides an easy-to-use suite of reinforcement learning tasks. import gym env = gym.make("CartPole-v1") observation = env.reset() for _ in range(1000): env.render() action = env.action_
gym.openai.com
오픈 에이아이짐(Open AI Gym)이라는 환경을 통해
강화학습을 적용시킬 수 있는 환경들을 제공합니다.
카트폴은 아래의 사진과 같습니다.
카트폴은 네모난 카트와 막대기인 폴이 합쳐져 있습니다.
에이전트는 카트를 밀어 폴이 쓰러지지 않게 합니다.
카트는 좌우로 움직일 수 있습니다.
활용할 수 있는 정보는
네가지로 카트의 위치(x), 속도(x`),
폴의 수직선으로 부터 기운 각도(\(\theta\)), 각속도(\(\theta_`\)) 입니다.
[DQN 이론]
경험 리플레이(Experience Replay)는
에이전트가 환경에서 탐험하며 얻는 샘플(s,a,r,s`)을 메모리에 저장합니다.
샘플을 저장하는 메모리는 리플레이 메모리라고 합니다.
리플레이 메모리는 크기가 정해져 있어
메모리가 꽉 차면 제일 처음에 들어온 샘플부터 메모리에서 삭제합니다.
경험 리플레이를 이용하면 샘플 간의 상관관계를 없앨 수 있습니다.
또한 경험 리플레이 자체가 다양한 과거의 상황으로부터 학습하기 때문에
오프폴리시 알고리즘이 적합합니다.
DQN의 특징은 타깃 신경망(Target network)을 사용한다는 것입니다.
아래는 큐러닝에서 큐함수를 업데이트하는 수식입니다.
\(Q_t(S_t,A_t) \leftarrow Q(S_t,A_t) + \alpha(R_{t+1} + \gamma \underset{a'}max Q(S_{t+1}, a') - Q(S_t, A_t)\)
아래는 DQN에서의 오류함수입니다.
\(MSE = (정답 - 예측)^2 = (R_{t+1} + \gamma \underset{a'}max Q(s', a', \theta) - Q(s,a,\theta))^2\)
부트스트랩의 문제점은 업데이트의 목표가 되는 정답이 계속 변합니다.
이를 방지하기 위해 정답을 만들어내는 인공신경망을 일정 시간 유지하고
타깃신경망을 따로 만들어서 타깃신경망에서 정답에 해당하는 값을 구합니다.
아래의 수식에서 \(\theta^{-}\)는 타깃신경망의 매개변수, \(\theta\)는 인공신경망의 매개변수로 나타냅니다.
\(MSE = (정답 - 예측)^2 = (R_{t+1} + \gamma \underset {a'}max Q(s_{t+1}, a', \theta^{-}) - Q(s,a,\theta))^2\)
아래부터는 DQN 코드 예제를 살펴보겠습니다.
==========================================================================
class DQN(tf.keras.Model):
def __init__(self, action_size):
super(DQN, self).__init__()
self.fc1 = Dense(24, activation='relu')
self.fc2 = Dense(24, activation='relu')
self.fc_out = Dense(action_size, kernel_initilaizer=RandomUniform(-1e-3, 1e-3))
def call(self, x):
x = self.fc1(x)
x = self.fc2(x)
q = self.fc_out(x)
return q
모델의 출력이 큐함수이므로 출력층의 크기는 행동의 개수입니다.
인공신경망의 학습에서는 가중치 초기화가 중요하다고 합니다.
https://www.tensorflow.org/api_docs/python/tf/keras/initializers
Module: tf.keras.initializers | TensorFlow Core v2.7.0
Public API for tf.keras.initializers namespace.
www.tensorflow.org
케라스 설명서(https://www.tensorflow.org/api_docs/python/tf/keras/initializers)를 참고하시면 됩니다.
self.model = DQN(action_size)
self.target_model = DQN(action_size)
self.update_target_model()
def update_target_model(self):
self.target_model.set_weights(self.model.get_weights())
DQN는 두 개의 인공신경망을 사용합니다.
초기화 되었을 때의 weight값은 일치하지 않으므로
update_target_model 함수를 사용해서 model의 weight값과 target_model값을 일치시킵니다.
'CS > 강화학습' 카테고리의 다른 글
딥살사 / 폴리시 그레디언트 (0) | 2021.10.23 |
---|---|
인공신경망 (Neural Network) (0) | 2021.10.23 |
근사함수 (0) | 2021.10.11 |
살사(SARSA) / 큐러닝(Q-Learning) (0) | 2021.10.10 |
다이내믹 프로그래밍 (0) | 2021.10.09 |