본문 바로가기
공부 정리/강화 학습

파국적 망각 방지: 경험재현

by 블로그별명 2023. 3. 13.

예제를 실행하기위해 필요한 코드(Gridworld, GridBoard등등)는 책 깃허브를 참고하자

https://github.com/DeepReinforcementLearning/DeepReinforcementLearningInAction/tree/master/Chapter%203

파국적 망각

파국적 망각은 서로 아주 비슷하지만

그 결과는 상당히 다른 두 게임 상태에 대해서 학습이 제대로 일어나지않는것을 말한다

예제를 보면 게임1과 게임2는 비슷하기때문에 이전에 배운 가중치들이 새 가중치로 대체된다 (망각)

 

경험 재현

기존 학습방법이 action을 취하고 그후 바로 학습(역전파)이 진행되는 온라인(실시간) 학습이었다면

기본적으로 경험재현은 온라인 학습에 배치 훈련 방식을 도입하는것이다 

경험목록과 배치

1. 상태 s에서 동작 a를 취하고 새 상태 st+1과 보상 r+1을 관측한다

2. 이 '경험'을 하나의 튜플로 묶어서 경험목록에 추가한다(append)

3. 경험목록의 길이가 어느정도 이상이되면, 경험목록속의 일부 경험들을 무작위로선택(sampling)해 배치(batch)를 만든다

4. 배치 훈련을 실행한다

코드로 살펴보기

게임상태 s에서 agent가 예측한 최선의 action 또는 apsilon확률에 따라 무작위 동작 실행

qval = model(state1) # 예측
qval_ = qval.data.numpy()
if (random.random() < epsilon): # epislon 확률에 따른 무작위 행동
    action_ = np.random.randint(0,4)
else:
    action_ = np.argmax(qval_)

action의 결과에 따른 보상(r+1)과 새 상태(st+1) 를 얻는다

action = action_set[action_] # 'u', 'd', 'l', 'r'
game.makeMove(action)
state2_ = game.board.render_np().reshape(1,64) + np.random.rand(1,64)/100.0
state2 = torch.from_numpy(state2_).float()
reward = game.reward()
done = True if reward > 0 else False

경험을 하나의 튜플로 묶어서 경험 묵록에 추가한다

exp =  (state1, action_, reward, state2, done) 
replay.append(exp) 
state1 = state2

경험목록의 길이가 어느정도 이상이되면, 경험들을 sampling해 배치를 만든다 

if len(replay) > batch_size: 
    minibatch = random.sample(replay, batch_size) 
    state1_batch = torch.cat([s1 for (s1,a,r,s2,d) in minibatch]) 
    action_batch = torch.Tensor([a for (s1,a,r,s2,d) in minibatch])
    reward_batch = torch.Tensor([r for (s1,a,r,s2,d) in minibatch])
    state2_batch = torch.cat([s2 for (s1,a,r,s2,d) in minibatch])
    done_batch = torch.Tensor([d for (s1,a,r,s2,d) in minibatch])

배치 학습을 실행한다

Q1 = model(state1_batch) # s1예측
with torch.no_grad():
    Q2 = model(state2_batch) # s2예측

Y = reward_batch + gamma * ((1 - done_batch) * torch.max(Q2,dim=1)[0]) 
# s1의 action에 해당하는 예측값 가져오기
X = Q1.gather(dim=1,index=action_batch.long().unsqueeze(dim=1)).squeeze() 
loss = loss_fn(X, Y.detach())
optimizer.zero_grad() # 기울기 초기화
loss.backward() # 손실에대한 파라미터의 기울기 계산
losses.append(loss.item())
optimizer.step() # 파라미터 업데이트

 

모델의 성능

88%의 승률을 보였다  학습당 loss감소추세는 다음과 같다

출처 

심층 강화학습인 액션

댓글