경험 리플레이
자 그 다음에 우리가 이제 앞에서 두 가지 문제가 있다
이런 얘기를 했는데 첫 번째 문제는 타겟이 계속 바뀌는 문제 타겟이 바뀌어서 학습이 불안정하다
이 문제가 하나가 있었고 또 하나는 IID 가정에 위백화가 있거나 이 문제가 하나가 있었고 또 하나는 IID 가정에 위백화가 된다
이런 얘기를 했는데 두 번째 문제는 어떻게 해결한지를 얘기를 안 했어요
어떻게 해결하느냐 경험 리플레이라는 방법으로 해결을 합니다
경험 리플레이는 어떻게 하냐면 경험한 샘플을 순서대로 학습을 시키니까 서로 독립적이지 않더라는 거예요
이 I가 성립을 안 하더라는 거예요
첫 번째 I가 HER어떻게 하냐면 일단 우리가 뭔가
롤 아웃을 하잖아요
여러 가지 행동을 해가지고 경험이 있으면 이 경험을 리플레이 버퍼라는 거에다가 잠깐 쌓아놓습니다
그러면 경험이 순서대로 차근차근 이렇게 들어가 있을 텐데 이 앞에 경험하고 이 뒤에 경험은 되게 밀접한 관련이 있어요
그러면 이걸 들어온 순서대로 학습을 시키면 최하의 비슷비슷하고 서로 엮여있는 행동만 학습을 하니까 이 딥러닝에서 IID 가정이 깨져가지고 학습이 잘 안 된단 말이에요
커브가 이렇게 생겼는데 이쪽에 있는 것만 집중적으로 들어오니까 이렇 게 되겠죠
그러면 경험을 계속 일단 리플레이 버퍼에 쌓아요
그다음에 랜덤하게 이거 뽑고 이거 뽑고, 이거 뽑고, 이거 뽑고, 이거 뽑고 랜덤하게 뽑아서 학습을 하면 이걸 다 학습을 할 수 있겠죠
일단 저장을 해 놨다가 그 중에 일부를 무작위로 뽑아서 학습을 시키는 이걸 경험 리플레이라고 합니다
이런 방식으로 DQN을 학습을 시키게 됩니다
이것도 이미 적용이 되어 있어요
이거는 자동으로 리플레이 버퍼가 지정이 되고 기본적으로 버퍼 크기가 100만입니다
우리가 지금 10만 번 했잖아요
우리 버퍼가 꽉 차지 않아요 그러면 100만 번이 넘어가면 어떻게 되느냐
그러면 과거의 경험을 밀어내기 시작합니다
왜냐하면 과거의 경험은 나한테 참고가 안 돼요
여러분이 유치원 때 어떻게 살았는가는 지금 여러분의 인생 경로를 결정하는데 별로 도움이 안 되죠
너무 옛날 일은 정책이 너무 달라졌기 때문에 큰 도움이 안 됩니다
그거는 버려요
이 버퍼 크기는 조절을 하고 그 다음에 우리가 DQN 같은 경우에 버퍼 사이즈라는 옵션이 있습니다
여기 이제 우리가 지정은 해주지 않았는데 버퍼 사이즈라고 해가지고 이게 100만으로 되어 있거든요
100만 원이 되는데 이걸 더 늘리실 수도 있고 더 늘리라는 거는 더 많은 경험을 참고하겠다
이걸 줄이면 어떻게 되느냐
예를 들면 많이 이렇게 하면 최근 경험만 참고하겠다
예를 들면 내가 중학교 고등학교도 필요 없어
그러면 더 줄여야겠죠
대학교 때도 필요 없어
더 줄여야겠죠
회사 신입사원 때도 필요 없어
더 줄여야겠죠
이걸 줄이면 최근 경험만 참고하는 거고 늘리면 또 옛날 경험까지 고려를 하는 겁니다
이것도 얼마가 베스트냐 이거는 잘 학습이 안 되면 바꿔보세요 숫자를 그 다음에 경험 리플레이가 굉장히 좋은 아이디어인데 좀 더 어떻게 잘 해볼 수 없을까
이런 생각을 사람들이 해요
좀 더 어떻게 잘할까
PER
이런 생각을 하는데 한 가지 아이디어는 우선순위를 주자 지금은 경험이 이렇게 쌓여 있으면 이 중에서 랜덤하게 그러면 너 너 나와 이렇게 해서 학습을 하는 방식인데 무작위로 뽑으면 좀 별로 도움이 안 되는 경험도 있잖아요
우리가 살다 보면 딱히 공부가 안 되는 그런 경험이 있습니다
여러분이 예를 들어서 멀리 출장을 갔으면 안 먹어본 음식도 먹어보고 그래야 경험이 쌓이는 거지
멀리 출장 갔는데 거기 가서도 맥도날드만 먹고 있으면 새로운 경험이랄 게 없잖아요
그죠
어떤 경험이 가치가 좀 다른데 그 가치가 높은 경험을 좀 우선순위를 줘 가지고 중요한 경험을 좀 더 많이 샘플링을 하면 내가 좀 학습을 많이 하지 않겠냐
생각을 해요
그럼 경험의 중요도를 어떻게 평가할 거냐 TDO차를 이용을 합니다
TDO차는 뭐예요?
이거는 내가 기대하는 거고 이거는 내가 실제로 받은 거고 이거는 이제 그 다음에 있을 거고 이게 목표가 되는 거죠
목표랑 나의 기대가 있으면 차이를 구하는 게 TDO차인데 TDO차가 크다는 건 뭐예요?
예상과 많이 다르네
이런 거죠
TDO차가 크다는 것은 기대와 다르다
기대와 많이 다르다 기대 이상이든 기대 이하든 근데 이게 작다는 건 뭐예요?
기대대로군 예상대로군 우리가 맥도날드 이런 데를 자주 가서 먹는 이유가 뭡니까?
잘 모르는 동네 갔을 때 그냥 뭐 기대한 만큼 되게 맛있진 않지만 또 그렇게 뭐 되게 맛없지도 않고 그냥 기대대로 나오잖아요
그러니까 먹는 건데 바꿔 말하면 인생 경험이 안 쌓이는 거죠
맨날 맥도날드만 먹으면 전혀 모르는 이상한 식당에 가서 먹어봤는데 너무 맛있다든가 아니면 뭔 음식이 있다위요?
뭐 이러다든가 그래야 인생의 경험치가 쌓이는 거죠
하하 이러면서 이제 TDO차를 이용을 해서 경험 리플레이해서 샘플링을 할 때 무조건 TDO차가 큰 순서대로 뽑으면 또 안 되고 TDO차 큰 거는 좀 더 확률을 약간 높이고 TDO차가 작은 거는 확률을 좀 낮추고 이렇게 해서 뽑을 수가 있습니다
근데 이것도 스테이블 베이스 라인에는 구현이 어차피 안 돼 있어요 구현이 안 돼 있는 거는 그 정도까지야 라고 생각을 하시면 됩니다 필요하면 이것도 구현하는 게 그렇게 어렵지는 않아요
굳이 하실 것까지는 아니다
하지만 이런 아이디어도 있다
그 다음에 뒤에 나오는 348쪽이랑 349쪽이랑은 350쪽 이거는 뭐 그렇게 중요한 건 아니니까 넘어가고요 이제 사실은 PER이 구현을 안 하는 이유는 PER 구현할 때 사실 고려해야 될 요소들이 되게 많거든요
생각보다 왜냐하면 확률을 조정을 해줘야 되는데 얼마나 조정해줘야 되냐
이게 또 문제예요
여기 가중 중요성 샘플링 이런 얘기를 하는데 초반에는 중요한 경험을 많이 고려하다가 후반에 가면 별로 안 중요한 경험도 고려해야 되고 이런 거를 다 고려해야 된다
이런 건데 좀 복잡하죠
자세하게 설명은 안 하고 넘어가도록 하겠습니다
어 쨌든 그런 식으로 샘플링 할 수도 있다
이런 얘기고 그 다음에 사실 더 중요한 문제가 있는데 뭐 중요한 경험을 더 살리고 아니고 어차피 많이 하다 보면 중요한 경험도 하고 안 중요한 경험도 하고 뭐 이러니까 상관없는 건데 아예 좀 더 어려운 문제가 있어요
비트 플리핑 환경
5개의 동전을 최대 5번까지 뒤집어서 목표 상태에 도달해야 하는 환경
예를 들면 환경 중에 비트플리핑이라는 환경이 있습니다
이 비트플리핑은 뭐냐면 동전이 N계가 있어요
여러분한테 선택지가 있습니다
뭐냐면 동전을 하나씩 뒤집을 수가 있어요
예를 들면 동전이 3개가 있다
그러면 1번 동전, 2번 동전, 3번 동전 이렇게 있으면 여러분은 한 번에 한 가지 동전만 뒤집을 수가 있어요
목표 상태에 도달하면 플러스 1을 받고 아니면 계속 마이너스 1의 처벌을 받아요
근데 예를 들면 목표 상태가 전부 앞이다
근데 원래 동전은 뒤, 뒤로 시작을 했어요
그러면 여러분이 이걸 한 번씩 뒤집어야 보상을 받고 고통에서 벗어날 수가 있습니다
근데 문제가 뭐냐면 여러분이 처음에는 이걸 하나 뒤집어 봤자 마이너스 1이에요
왜냐하면 뒤 앞이니까 그다음 걸 뒤집어도 뒤, 뒤 앞이라서 마이너스 1이에요
그다음 걸 뒤집어도 뒤집어야 그제서야 앞, 앞, 앞이 돼서 플러스 1이 됩니다
근데 문제는 우리가 정답이 뭔지 몰라요
이제는 정답이 뭔지 모르고 그냥 마구잡이로 뒤집어 보다가 답이 뭔지 찾 아야 됩니다
앞, 앞, 앞이 아니라 앞, 뒤, 앞일 수도 있고 앞, 뒤, 뒤일 수도 있고 약간 복불복이라서 그러면 시행착오를 몇 번 해봐야 합니까?
3개 면 2에 3승번 해봐야겠죠?
8번 해봐야 합니다
그러면 이 n이 커지면 어떻게 돼요?
n이 10개 이렇게 되면 2에 10승이니까 조합이 1024개가 되고 내가 1000번 시도해서 보상 한 번 받는단 말이에요
근데 동전이 20개 있다
그러면 조합이 100만 개입니다
100만 번 해봐야 딱 한 번 보상 받을 수 있어요
그러면 기본적으로 이 강학습이라는 거는 내 기대에서 벗어나는 뭔가를 받아야 학습이 되는데 그런 계속 마이너스 1만 99900번 받다가 딱 한 번 플러스 1을 받으면 학습이 별로 안 된단 말이에요
그때는 물론 학습이 되긴 하겠지만 100만 번, 100만 버마다 한 번씩만 학습이 되니까 학습이 잘 안 돼요
이 비트플리핑이 굉장히 학습이 어려운데 우리가 강학습 문제 중에 굉장히 많은 문제가 이런 성격을 가지고 있습니다
굉장히 보상이 드물거나 아니면 우리가 정답에 가까워질수록 보상이 서서히 늘어나면 보상이 늘어나는 방향으로 학습하면 되는데 보상이 없다가 딱 정확하게만 해야 보상이 딱 있다
이런 식으로 되면 내가 여기서는 학습이 전혀 일어나지 않기 때문에 학습이 어렵습니다
이 비트플리핑은 그런 거를 극단적으로 만들어 놓은 거예요
만약에 예를 들면은 비트플리핑이 아니라 우리가 설계 첫날 그 얘기 하신 분들 있죠
설계를 강학습으로 해보고 싶다
근데 설계에도 종류가 여러 가지가 있는데 뭐가 조금 안 맞아도 하여간 설계를 괜찮게 하면 되는데 여기서 좀 더 계산하면 좋다든가 이런 식으로 되면 강학습 하기 가 좋은데 모든 부품이 A, B, C, D가 있어서 모든 부품이 정확하게 제자리에 있어야만 작동하고 하나라도 뭐가 문제가 있으면 배가 그냥 가라앉아 버린다 그러면은 그런 설계를 강학습으로 하긴 굉장히 어려운 문제가 됩니다
비트플리핑하고 똑같은 문제가 돼요
모든 게 다 제자리에 있어야 돼
이런 문제를 어떻게 푸느냐 하면은 보상함수를 실제로 좀 다르게 합니다
우리가 어떤 목표치를 우리 그 슬리퍼리 워크할 때 뭐 목표치가 있어서 목표치를 알잖아요
그럼 그 목표치에 가까워지면은 조금 우리가 인위적으로 보상을 주도록 환경을 고치는 거예요
그러면은 강학습 하기가 좋아지겠죠
근데 그게 가능하려면 우리가 문제에 대한 배경지식이 좀 있어야 됩니다
뭐가 목표치고 거기에 얼마나 다가왔는지를 계산을 할 수 있어야 되거든요
이거는 모든 문제에 가능한 방법은 아닙니다
Hindsight Experience Replacy
보상함수를 다시 설계하는 건 이거를 해결하기 위해서 하인드 사이트 익스피리언스 리플레이 이거는 경험 리플레이고 똑같이 경험 리플레이인데 하인드 사이트는 뭐냐면 하인드는 뒤고 사이트는 본다는 거예요
그러니까 이거는 우리말로 번역하면 뭐라고 해야 될까요?
회고적?
이 정도로 번역할 수 있는데 되돌아보고 하는 건데 이거는 아까 제가 목표치를 바꿔버리면 안 된다
이런 얘기를 했어요
근데 이때는 거꾸로 생각을 하는 겁니다 목표치를 왜 바 꾸면 안 되죠?
이렇게 생각을 하는 거예요
내가 원래는 여기다가 여기에 목표치가 있어요
내가 로봇으로 여기서 이쪽으로 부품을 보내야 되는데 강학습이 아직 덜 돼서 삐끗해가지고 여기로 부품을 보내버렸어요
그럼 내가 실패했으니까 보상이 0이잖아요
아니면 뭐 마이너스 1이든지 그게 아니고 이 H.E.R. 하인드 사이트 익스피리언스 리플레이 줄여서 H.E.R. 이라고 했습니다
H.E.R.는 어떻게 하냐면 아닌데?
나 원래 여기 보내려고 했는데 그러면 그리고 갑자기 여기서 보상을 줘요
어이 잘했어
나 여기 보내려고 했는데 딱 갔네?
어이 잘했네?
그러면 뭘 배울 수 있냐
면 내가 여기로 보내는 방법은 배울 수 있는 거죠
적어도 원래 여기로 보내려고 했던 건 아니지만 우리도 그런 경우 있잖아요
좋은 경험이 더 치자 뭐 이상한 결과가 나왔지만 그래
좋은 경험이 더 치자 이렇게 하는 거예요
마치 그걸 하려고 했던 것처럼 학습을 하자 라는 게 이 H.E.R.의 아이디어입니다 원래 의도했던 결과는 아닌데 이걸 하려고 했던 것처럼 하자
보상을 다시 계산을 해요
아까랑 좀 다른 거는 아까는 R 플러스 Q에서 Q 프라임에서 이 Q 프라임을 바꾸면 안 된다는 건데 지금은 어떻게 하는 거냐면 이 R을 실제로 받은 R이 아니고 내가 이걸 원래 했던 것처럼 바꿔서 R을 다시 계산해가지고 하는 거예요
아까랑 말이 왜 바뀝니까?
말이 바뀐 건 아니에요
목표를 바꾸긴 했지만 아까랑 목표를 바꾸는 방식이 좀 달라졌어요
나는 이번에 실패한 거지만 아니야 나는 원래 이걸 하려고 했어
그럼 이걸 성공했다 치고 보상을 계산하는 겁니다
이제 비트 플리핑 문제도 원래는 이 3개가 다 앞이어야 내가 보상을 받는 건데 그렇게 하면 보상을 받을 기회가 너무 드물단 말이에요
이걸 하나 뒤집었는데 뒤 앞이 됐어요
실패!
이러면서 마이너스 1이 나왔는데 아니야
나는 이걸 하려고 했어
니 맘대로 목표를 정하지 마 난 뒤 앞 하려고 했어 플러스 1 이렇게 하는 거야
이걸 하면 뭐가 좋으냐
이걸 뒤 앞으로 바꾸는 방법을 하나 배우는 거죠
그다음에 이걸 뒤에서 바꿨어요
그다음에 그럼 또 마이너스 1이 되겠죠
실패!
이렇게 해서 마이너스 1이 되는데 아니야
나는 뒤, 뒤, 앞이 하고 싶었어
플러스 1 나는 이거 하고 싶었던 거야
이렇게 하는 거야
이런 식으로 내가 원래 하려고 했던 게 아닌데 목표를 슥삭 바꿔서 원래 하려고 했던 것처럼 바꿔서 학습을 하는 방식이 HER입니다
이 HER를 적용을 하려면 보상을 다시 계산해 주는 함수가 있어야 돼요
카트 폴은 이게 안 됩니다
여러분이 직접 구현을 하셔야 돼요
여러 가지 방식으로 구현을 할 수 있는데 구현의 예를 보여드리면 Desired Goal이 있고 이건 진짜 목표입니다
진짜 목표 그다음에 Achieved Goal은 내가 실제로 달성한 목표예요
보상을 다시 계산하는 방법이 여러 가지가 있는데 진짜 목표랑 달성된 목표 그러니까 달성된 목표라는 건 내가 실제 행동이죠
이 두 개의 차이를 구합니다
격차를 구해서 노무함의 일종의 절 대 값 같은 걸 구하는 거거든요
차이를 구해서 절 대 값을 구하면 거리가 나오겠죠
둘 사이에 거리가 있으면 마이너스 1 아니면 0 이런 식으로 보상을 계산을 해 주는 함수를 정의하는데 앞에서 봤던 이 비트 플리핑 환경에는 이게 구현이 되어 있어요
어디 갔습니까?
이 비트 플리핑에서 m 비트를 5로 하면 동전을 다섯 번 다 뒤집어 가지고 제자리로 놓아야 되는데 다 뒤뒤뒤뒤 이렇게 있는 거를 앞 앞 앞 앞으로 바꿔놔야 되는데 그럼 우리가 보상을 받을 기회가 거의 없죠
이거를 멀쩡하게 바꾸는 겁니다
근데 이거는 사실 한 5000번 해 보시면 5000번 가지고는 잘 안 되더라고요
from stable_baselines3.common.envs import BitFlippingEnv
N_BITS = 5
env = BitFlippingEnv(n_bits=N_BITS, continuous=False, max_steps=N_BITS)
c:\Users\eupho\anaconda3\lib\site-packages\pandas\core\arrays\masked.py:60: UserWarning: Pandas requires version '1.3.6' or newer of 'bottleneck' (version '1.3.5' currently installed).
from pandas.core import (
env.reset()
env.step(env.action_space.sample())
(OrderedDict([('observation', array([0, 0, 1, 1, 0], dtype=int8)),
('achieved_goal', array([0, 0, 1, 1, 0], dtype=int8)),
('desired_goal', array([1, 1, 1, 1, 1], dtype=int8))]),
-1.0,
False,
False,
{'is_success': False})
바닐라 ER
from stable_baselines3 import DQN
from stable_baselines3.common.logger import configure
# 모델
model = DQN("MultiInputPolicy", env, verbose=1)
# 학습 과정을 CSV로 저장
log_dir = "./vanilla"
new_logger = configure(log_dir, ["csv"])
model.set_logger(new_logger)
# 학습
model.learn(5000, progress_bar=True)
학습 과정 시각화
import pandas as pd
import matplotlib.pyplot as plt
log_df = pd.read_csv(log_dir + "/progress.csv")
plt.plot(log_df['time/total_timesteps'], log_df['rollout/success_rate'])
DQN+HER
지금 보시면 그냥 우리가 했던 대로 DQN 이렇게 해서 돌리면 그냥 학습이 되고 HR을 적용을 하시려면 DQN 한 다음에 여기 리플레이 버퍼를 HR로 바꿔 주시면 돼요
그다음에 여기다가 옵션을 정해 주는데 가상 목표를 뭘로 할 거냐 여기 가상 목표 선택 전략이라고 있는데 가상 목표 선택 전략을 퓨터라고 하면은 내가 지금 한 거랑 끝날 때까지 쭉 한 게 있는데 그 중에 최종적으로 도달한 상태를 나는 이거 하려고 했어
이렇게 하는 거야
이제 파이널이 있고 퓨처가 있고 에피소드가 있는데 뭔 차이냐면 파이널은 항상 내가 마지막에 결국 도달한 데가 최종 목표가 됩니다
가상의 최종 목표예요
실제로 이걸 하려고 한 건 아닌데 하다 보니까 이렇게 됐어요
예를 들면 여러분이 뭐로 할까요
지금 다니시는 회사를 잘 다니고 있는데 여러분이 태어나서 엄마 뱃속에서 나오실 때 이 회사 다녀야지
하고 나오지는 않았지만 다니시면서 이제 뭐 괜찮은 것 같아요
나 원래 사실 우리 회사 좋아
우리 회사 오려고 처음부터 나는 그랬어
나는 초등학교 때도 우리 회사가 좋더라고
이렇게 그런 식으로 이렇게 약간 목표를 바꿔서 생각을 하는 거예요
파이널은 이런 거고 퓨처는 현재 상태가 있고 우리가 최종 상태가 있으면 이 사이 어딘가에 하나를 골라서 그게 원래 목표였어
이렇게 하는 거예요
그럼 이제 목표를 지나온 부분도 있죠
지나온 부분도 있는데 이렇게 하는 거고 에피소드는 내가 이거 하기 전부터 어떤 상태가 있었거든요
그럼 이것 중에 하나를 골라서 나는 원래 이거 하려고 그랬어
이렇게 하는 거예요
이거 두 개는 랜덤하게 내가 거쳐온 과정 중에 하나를 원래 내가 하고 싶었던 목표인 것처럼 바꾸는 겁니다
이제 뭐가 좋냐
이거는 답은 없는데 뭐든 하나를 하시면 되겠죠
이렇게 선택을 해주면 HR이 적용됩니다
DQN에서 이게 지금 줄을 늘려 놔서 많아 보이는데 실제로는 한 세 줄 이렇게 추가를 해주시면 DQN 플러스 HR이 됩니다
from stable_baselines3 import DQN
from stable_baselines3.common.logger import configure
from stable_baselines3 import HerReplayBuffer
from stable_baselines3.her.goal_selection_strategy import GoalSelectionStrategy
model = DQN(
"MultiInputPolicy",
env,
replay_buffer_class=HerReplayBuffer,
replay_buffer_kwargs=dict(
n_sampled_goal=1, # 행동마다 선택하는 가상 목표의 개수
goal_selection_strategy=GoalSelectionStrategy.FUTURE, # 가상 목표 선택 전략
),
verbose=1
)
# 학습 과정을 CSV로 저장
log_dir = "./her"
new_logger = configure(log_dir, ["csv"])
model.set_logger(new_logger)
# 학습
model.learn(5000, progress_bar=True)
학습 과정 시각화
log_df = pd.read_csv(log_dir + "/progress.csv")
plt.plot(log_df['time/total_timesteps'], log_df['rollout/success_rate'])
멀티 인프트 팔러시가 바뀌어 있는데 멀티 인프트 팔러시는 뭐냐면 환경 중에 엠 브이로 해서 스텝 했을 때 출력되는 게 그냥 우리가 전에 기억나실지 모르겠지만 그냥 해보면 숫자나 이런 걸로 나왔거든요
숫자 말고 이렇게 딕트해 가지고 복잡한 구조로 나오는 경우가 있어요
이런 환경은 멀티 인프트 팔러시를 씁니다 별 차이는 없고 그러면 저희 딕트 형태로 돼 있는 거를 다시 배열, 저기, 벡터 형태로 바꿔주는 코드가 하나 더 들어가 있어요
이렇게 스텝 해 봤을 때 이렇게 딕트 이렇게 나오면 여기를 MLP 대신에 멀티 인프트 팔러시로 바꿔준다
아까랑 똑같은데 중간에 뭐 하나가 더 들어갔어요
중간에 들어간 건 뭐냐면 우리가 아까는 화면에 학습 과정이 출력이 줄어들었잖아요
마지막에 점심시간 전에 설명해 달라고 하셨던 숫자들 그거를 파일로 저장을 하고 싶으면 이 세 주를 추가를 해주시면 됩니다
그러면은 CSV 파일로 학습 과정을 저장을 해줍니다
그럼 우리가 나중에 파일을 열어 가지고 학습 과정에서 무슨 일이 일어난지를 볼 수가 있겠죠
이렇게 바닐라 ER로 하면은 HER를 적용을 안 한 거야 5,000번은 좀 적은데 일단 한번 돌려 갖고 시간이 얼마나 걸려봅시다 5,000번 금방 하죠
뭐 한 4초 걸리네요
그러면은 5만 번 하면 한 40초 걸리겠죠
한 5만 번 돌려봅시다 그리고 여러분 이제 바탕화면에 보시면은 바닐라라는 폴더가 생겨 가지고 그 안에 progress.csv 파일이 있는데 이 파일에 이제 엑셀로 열어보시면 지금 그 학습 과정에서 화면에 나오는 숫자들 있잖아요 그게 이렇게 파일로 저장하고 그 부분을 이렇게 전용으로 전용으로 전용으로 전용으로 전용으로 전용으로 전용으로 전용으로 전용으로 전용으로 그게 이렇게 파일로 저장이 됩니다
그러면은 지금 보시면 rollout ep reward min 이렇게 보면은 마이너스 5, 마이너스 4.5, 마이너스 4.3, 마이너스 4.5, 마이너스 4.6 이렇게 되는데 보시면은 뭐 어쨌든 이게 마이너스였는데 줄어들고는 있어요
이게 줄어든다는 거는 어쨌든 보상을 받는 방법을 찾아내서 어떻게든 하고 있다는 거죠 신기하게도 HR을 적용을 안 한다고 해서 학습이 안 되는 건 아닙니다
어떻게든 해요
그리고 우리가 지금 2회 5승이니까 32번에 한 번은 얻어 걸리거든요
학습이 되긴 된다 보시면은 계속 줄어드는 걸 보실 수 있습니다 쭉 줄어들고요
이제 여기 학습과정 시각화는 그 progress.csv를 열어가지고 여기 total time step은 몇 번이나 해봤냐
이거고 roll out의 success rate는 그 중에 몇 번이나 성공을 했냐
이런 얘기입니다
5만 번 돌아가는데 한 40초 걸리니까 인내심을 가지고 기다려야겠죠
아까 그 csv 파일을 열어서 그래프로 그려보면 100% 도달하네요
어쨌든 이제 여기다가 HER를 끼얹어 보겠습니다
HER를 끼얹어 보면 여기 코드를 보시면 다 똑같은데 여기 replay buffer 설정이 이렇게 들어가 있어요
이거를 설정을 안 해주면 이제 기본 replay buffer가 들어갑니다
그리고 설정을 해주시면 HER가 설정이 되는데 nsampled goal은 1 이렇게 하면 내가 이거 하려고 했는데 라는 가짜 목표 있잖아요
그거를 하나를 설정을 해줍니다
이걸 2로 해주시면 가상의 목표를 두 개를 설정해줘요 가상의 목표를 두 개 설정해준다는 게 무슨 얘기냐면 내가 이렇게 해가지고 여기까지 가서 끝났어요
진짜 목표는 여기입니다
진짜 목표까지 못 가고 끝나는데 그러면 가상의 목표를 여러 가지로 설정해준다
이런 식으로 이제 어떤 가짜 목표 그 목표를 해서 마치 그 목표를 달성한 것처럼 그런 식으로 학습을 하는 방식 이것도 이제 5만 번 돌려보면 원래 이제 5000번으로 돼 있는데 똑같이 공평하게 5만 번 해봅시다
사실 별 차이 없어 보이기도 하는데 약간 아주 미소한 차이지만 HR을 하는 게 조금 더 빨리 성능이 올라가죠
이제 실패를 했을 때도 그 실패한 거를 그냥 실패하고 그냥 끝난 게 아니라 아 나 원래 이거 했으려고 했어 라고 하고 다시 거기서 조금 더 하려고 하죠
아 이제 실패한 건 아 이제 실패한 건 아 이제 실패한 건 아 이제 실패한 건 거기서 조금 더 학습을 하는 방식 근데 이게 항상 유리한 건 아니고 그러니까 지금 보면은 보상이 거의 주어지지 않거나 아니면은 보상 자체가 성공할 때만 주고 티끌 만큼이라도 틀리면 보상이 안 주어지는 이런 경우에는 HR을 적용하시면 학습에 조금 더 도움이 될 수가 있습니다
만약에 뭐 애초에 보상 자체가 목표에 가까울수록 보상이 서서히 커지는 이런 형태면 굳이 HR 하실 필요 없어요