BASHA TECH

3. Reinforcement Learning - 몬테카를로 에이전트 본문

Computer/Reinforcement Learning

3. Reinforcement Learning - 몬테카를로 에이전트

Basha 2022. 11. 23. 11:53
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
반응형
Comments