강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

파라데이그마님의 프로필 이미지
파라데이그마

작성한 질문수

강화학습 정책 평가와 정책 개선 과정에서

작성

·

57

0

map = "4x4"

SLIPPERY = False  # 결정론적 환경
#SLIPPERY = True  # 확률적 환경

# FrozenLake-v1 환경을 생성합니다.
# desc: None이면 기본 맵을 사용합니다.
# map_name: 사용할 맵의 이름을 지정합니다. 
# is_slippery: True이면 미끄러운 표면(확률적 환경)을 사용하고, False이면 결정론적 환경을 사용합니다.
env = gym.make('FrozenLake-v1', desc=None, map_name=map, is_slippery = SLIPPERY)

GAMMA = 0.9
THETA = 1e-7
num_states = env.observation_space.n
num_actions = env.action_space.n
transitions = env.P

# 1. 모든 s에 대해 V(s) = 0과 임의의 pi(s)를 초기화
V = np.zeros(num_states)
pi = np.ones([num_states, num_actions]) * 0.25

policy_stable = False  # 정책이 안정적인지 여부를 나타내는 변수

while not policy_stable:
    #2. 정책 평가
    while True:
        # delta 초기화 : delta <- 0
        delta = 0
        #각 s에 대해 반복
        for s in range(num_states):
            
            # 업데이트 규칙: V(s) = sum(pi(a|s)*sum(p(s,a)*[r + gamma*v(s')]))
            for a, prob_a in enumerate(pi[s]):
                # s', r에 대해 합산 (각 행동 a에 대한 상태 전이 확률을 반영한 보상 합산)
                old_value = V[s]
                new_value = 0
                for prob, s_, r, _ in transitions[s][a]:
                    new_value += prob_a * prob * (r + GAMMA * V[s_])
            V[s] = new_value
            # delta 갱신: delta <-- max(delta|v - V(s)|)
            delta = max(delta, np.abs(old_value - V[s]))
        # delta가 THETA보다 작으면 정책 평가 종료
        if delta < THETA:
            break       

    #3. 정책 개선
    #policy_stable <- true
    old_pi = copy.deepcopy(pi)
    
    #각 s에 대해:
    for s in range(num_states):
        # pi_s <- argmax_a(sum(p(s',r|s,a)*[r + gamma*V(s')]))
        # 새로운 행동 가치 초기화
        new_action_values = np.zeros(num_actions)
        
        for a in range(num_actions):
            # 각 행동 a에 대해 상태 전이 확률과 보상을 반영한 가치 합산
            for prob, s_, r, _ in transitions[s][a]:
                new_action_values[a] += prob * (r + GAMMA * V[s_])

        # 새로운 정책 결정: 가치가 최대가 되는 행동 선택
        new_action = np.argmax(new_action_values)
        pi[s] = np.eye(num_actions)[new_action]

    if np.array_equal(old_pi, pi):
        policy_stable = True
    else:
        policy_stable = False
    # 이전 정책과 새로운 정책이 동일한지 확인하여 정책 안정성 판단

위의 과정의 정책 평가와 정책 개선 과정을 반복하다보면, 정책과 가치함수가 수렴하게 됩니다. 이 때 3번 정책 개선 과정을 잘 이해한 것인지 궁금합니다.

1. 초기 정책은 0,1,2,3번 행동에 대해 모두 0.25 확률이 부여되어 있었습니다.
2. 단 한번의 정책 개선이 발생해도, 특정 행동의 확률만 1이 되고 나머지가 0이 됩니다.
3. 정책 평가와 정책 개선이 반복되더라도, 특정 행동의 확률이 1이고 나머지 행동이 0인 것은 모든 STATE에서 동일합니다. 다만 확률이 1이되는 행동이 바뀔 뿐입니다.
4. 이전 정책과 현재 정책이 모두 일치하면, 정책 개선은 종료됩니다.

즉, STOCHASTIC한 정책이 단 한 번의 정책 개선으로 DETERMINISTIC하게 변화하고, 이를 정책 평가와 정책 개선의 반복으로 특정한 가치함수와, 정책으로 수렴하게 된다, 라고 이해한 것이 옳은 것인가요?

답변

답변을 기다리고 있는 질문이에요
첫번째 답변을 남겨보세요!
파라데이그마님의 프로필 이미지
파라데이그마

작성한 질문수

질문하기