BASHA TECH
3. Reinforcement Learning - 몬테카를로 에이전트 본문
728x90
- 카트폴 문제는 완전한 형태의 강화 학습 접근법이나 신경망이 필요하지 않다.
- 차원 축소를 활용하여 특별한 정책을 정한다.
- 환경 상태를 정의하는 파라미터 4개(state임)를 선형조합(dot=> 내적)하여 하나의 실숫값으로 축소
# 고정된 시드값 무작위 가중치 설정
np.random.seed(100)
# 무작위 가중치 설정
weights = np.random.random(4) * 2 - 1
weights
# 환경 초기화
state = env.reset() # 환경에서 state 추출
state # 초기 상태값
# 상태와 가중치의 내적
s = np.dot(state[0], weights) # np.dot => 내적 => 단일 값(schalar) 추출.
# 단일값 크기따라 영향이 생긴다.
print(s)
# a: action. 상태와 가중치를 내적해서 action을 만들어냄.
action = 0 if s < 0 else 1 # (s값이 양수=> 1. 음수=> 0 : 정책)
state, reward, done, _ ,_ = env.step(action)
s1 = np.dot(state[0], weights) # 의미 없음
print(s1) # 의미 없음
state[0].shape, weights.shape
Action Rule
# action = 0 if s < 0 else 1 와 같은 코드
if s < 0:
a = 0
else:
a = 1
a
Total Reward per Episode
def run_episode(env, weights): # episode => 한 게임.
# 정책을 받아서 total reward 한다.
state = env.reset() # 초기 환경
# 게임을 시작 할 때마다 env을 받아서 reset함.
s = np.dot(state[0], weights) # 초기 상태 값
treward = 0 # total reward 0으로 초기화
for i in range(200): # 200 step을 밟느다.
action = 0 if s < 0 else 1 # 정책: action을 어떻게 선택하게 할 것인가?
state, reward, done, _,_ = env.step(action)
s = np.dot(state, weights)
treward += reward # 누적
if done:
break
return treward
run_episode(env, weights)
weight 자체가 무작위기 때문에 state도 무작위임 (무작위 정책) => 그래서 200 나오기가 힘들다.
=> 200번이 나왔다는 200번 성공 했다는 뜻.
무작위를 학습하면서 줄여나가는 것이 QLearning (강화학습)
=> 무작위 입실론 크기를 처음은 크게 주고 그리고 점점 줄어든다.
Simple Learning
- 따라서 몬테카롤로 시뮬레이션으로 여러 가지 다른 값의 가중치를 테스트한다.
- 다음 코드는 엄청나게 많은 수의 가충치를 시뮬레이션해서 가중치를 골라낸다.
def set_seeds(seed=100):
random.seed(seed) # 내장 함수
np.random.seed(seed) # numpy의 random 함수
# env.seed(seed)
set_seeds() # parameter를 주지 않아도 위에서 seed값을 100 주었기때문에 default 값으로 들어간다.
num_episodes = 1000
# 1000번 episode를 돌릴때 besttreward가 나오는데 그것의 weight를 가지겠다.
besttreward = 0 # 최대 Reward를 구하겠다.
# 최대 reward의 weight를 가지겠다. => 일반 신경망과는 조금 다름.
# 강화 학습의 핵심: reward가 최대가 되는 정책을 찾는 것.
for e in range(1, num_episodes + 1):
weights = np.random.rand(4) * 2 - 1 # 1) 무작위 가중치
treward = run_episode(env, weights) # 2) 이 가중치에 대한 전체 보상
if treward > besttreward: # 3) 향상되었는지 확인
# => reward가 더 나아졌는지 확인하겠다.
print('treward = ',treward)
besttreward = treward # 4) 최고 보상 변경
bestweights = weights # 5) 최고 가중치 변경
print('bestweights = ', bestweights)
# 아직은 bestweights만 구하는 것. bestweights가 weights 값에 들어가지 않는다.
if treward == 200:
print(f'SUCCESS | episode={e}')
break # 200이 최대
print(f'UPDATE | episode={e}')
# 최대 무한 반복 해서 최적의 값을 추출하는 것 => 몬테카를로
reward가 200이 나옴. bestweight가 핵심. 최고의 reward를 best에 저장. weight가 학습이 되고 있다.
=> 역전파 필요 없음. 계산이 더 빨라짐. 대신, 코딩이 어려워짐. 일일히 다 잡아줘야하기 때문.
- library를 사용한다면 쉽겠지만, library가 없다.
print(weights) # 이것들이 가장 best 값이였다.
print(besttreward)
res = []
for _ in range(100):
treward = run_episode(env, weights) # 200이 나온 weight값이임
res.append(treward) # 그래서 평균을 내도, weight가 200이 나옴.
# weight에 의해 행동을 잘 선택 할 수 있게 만들었다.
res[:10]
sum(res) / len(res)
728x90
반응형
'Computer > Reinforcement Learning' 카테고리의 다른 글
5. Reinforcement Learning - Q Learning (0) | 2022.11.23 |
---|---|
4. Reinforcement Learning - 신경망 에이전트 사용 (1) | 2022.11.23 |
2. Reinforcement Learning - CartPole 예제 (1) | 2022.11.23 |
1. Reinforcement Learning - RL의 정의 (0) | 2022.11.22 |
Comments