sliver__

카트폴 본문

CS/강화학습

카트폴

sliver__ 2021. 11. 7. 12:33
728x90

강화학습 환경에서 중요한 것 중 하나가 

에이전트를 학습시킬 수 있는 환경입니다.

 

https://gym.openai.com/

 

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값을 일치시킵니다.

 

 

728x90

'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
Comments