My Blog

강화학습(TD 시간차 학습 SARSA와 Q러닝) 공부기록 12


TD법으로 정책평가

먼저 클래스를 만듭니다. class TDAgent: class TDAgent아래 3가지 함수 def __init__(self) def get_action(self, state) def eval(self, state, reward, next_state, done) 를 구현합니다. def __init__(self) 아래 구현사항(무작위 정책에 따라 행동하는 에이전트의 기본 감마값(할인계수), 알파(학습률), 활동 범위, 활동 확률, 정책 V에 대한 초기값 설정) self.gamma = 0.9 self.alpha = 0.01 self.action_size = 4 random_actions = {0:0.25, 1:0.25, 2:0.25, 3:0.25} self.pi = defaultdict(lambda : random_actions) self.V = defaultdict(lambda : 0) def get_action(self, state) 함수 아래 구현사항(정책과 환경에 따른 행동확률, 행동하는 random action의 키값과 벨류 값 지정, 확률분포에 따라 랜덤으로 행동할 확률 반환) action_probs = self.pi[state] actions = list(action_probs.keys()) probs = list(action_probs.values()) return np.random.choice(actions, p=probs) def eval(self, state, reward, next_state, done) 함수아래 구현사항(목표지점의 가치함수를 0으로 설정, 타겟을 보상+할인률*다음 가치함수 계산식 구현, 현재 가치함수는 현재 가치함수 + 학습률*(타켓값-현재 가치함수)로 구하는 계산식 구현) next_V = 0 if done else self.V[next_state] #목표 지점의 가치함수는 0 target = reward + self.gamma*next_V self.V[state] = self.V[state] + self.alpha*(target-self.V[state]) 여기서 eval 함수는 상태 s에서 행동 a를 수행하고 보상 r를 받은 후 다음 상태 next state로 넘어갔을 때 호출됩니다. 그래서 그 상태의 정책함수를 평가하게 됩니다. 이처럼 정책 평가가 끝나면 평가와 개선을 반복하여 최적 정책을 찾게되는 정책제어를 하게 됩니다.

온 정책의 SARSA

정책평가 Vπ(s)를 수행했습니다. 앞으로 할 것은 정책을 제어할 것인데 이때는 Vπ(s)가 아닌 행동가치함수 Qπ(s,a)가 대상입니다. 개선 단계에서 정책을 탐욕화해야 하며 Vπ(s)의 경우 환경모델이 필요하나 Qπ(s,a)는 환경 모델이 필요하지 않습니다. 앞에서 도출한 상태가치함수 V'π(St) = Vπ(St)+alpha*{Rt+γVπ(St+1)-Vπ(St)} 에서 상태가치함수를 Q함수로 변경해 보겠습니다. 여기서 Vπ(St)를 Qπ(St, At)로 변경, Vπ(St+1)을 Qπ(St+1, At+1)로 대체하고 식을 다시 작성해 보겠습니다. Q'π(st, At) = Qπ(St, At) + alpha*(Rt+γQπ(St+1, At+1)-Qπ(St,At) 이것이 Q함수를 대사으로 한 TD법의 갱신 수식입니다. 온-정책(on policy)에서 에이전트는 한개의 정책만을 가지고 있어서, 실제 행동을 선택하는 행동정책과 평가 및 개선할 정책인 타겟 정책이 일치하게 됩니다. 이처럼 행동정책과 대상정책이 같으므로 개선 단계에서 완전한 탐욕화(greedy)가 불가능합니다. 완전하게 탐욕화하면 탐색을 포기하게 되므로 e-greedy 정책을 이용하게 됩니다. π'(a | St) = argmax a Qπ(St,a) (1-e의 확률) 또는 무작위행동 (e의 확률) 이렇게 두가지 중 하나를 선택하게 되고 적절히 탐색을 수행하게 됩니다. 이처럼 평가와 갱신을 번갈아 반복하여 최적에 가까운 정책을 얻는 방법을 앞글자를 따서 SARSA라고 합니다.

오프정책의 SARSA

오프정책(off-policy)에서 SARSA에 대해 알아보겠습니다. 그 전에 중요도 샘플링에 대해 다시 복습해 보겠습니다. 강화학습에서 중요도 샘플링(Importance Sampling)은 특히 정책 오프라인 평가나 오프-폴리시 학습에 사용되는 기술입니다. 이 방법은 행동 정책(behavior policy)으로부터 얻은 경험을 이용하여 대상 정책(target policy)의 기대값을 추정할 때 사용됩니다. 중요도 샘플링 비율(Importance Sampling Ratio, ISR)은 대상 정책에서 취한 행동의 확률과 행동 정책에서 같은 행동을 취할 확률의 비율을 나타냅니다. 수식으로 표현하면 다음과 같습니다. ρ(로우)t = π(At∣St) / b(At ∣St) 여기서: ρt 는 시간 스텝 t에서의 중요도 샘플링 비율(가중치)입니다. π(At∣St)는 대상 정책(target policy) π가 상태 St 에서 행동 At를 선택할 확률입니다. b(At∣St)는 행동 정책(behavior policy) b가 상태 St에서 행동 At를 선택할 확률입니다. 가중치 ρ는 정책이 π일때 TD목표를 얻을 확률과 정책이 b일때 TD목표를 얻을 확률의 비율입니다. 이를 오프 정책의 SARSA 갱신식으로 표현하면 다음과 같습니다. Q'π(st, At) = Qπ(St, At) + alpha*(ρ*(Rt+γQπ(St+1, At+1))-Qπ(St,At) 행동은 정책 b에 따라 샘플링되고 가중치 ρ로 TD목표가 보정됩니다.

오프정책 Q러닝

두 정책이 역할을 분담하여 행동정책으로는 탐색을 수행하고, 대상 정책으로는 활용을 수행하면 최적의 정책을 얻을 수 있습니다. 하지만 중요도 샘플링은 결과가 불안정하여 중요도 샘플링을 수행하지 않고 실행하는 Q러닝을 도입할 수 있습니다. 기존 SARSA는 벨만 기대방정식을 이용했다면, Q러닝은 벨만 최적방정식을 이용하게 됩니다. 기본적으로 벨만 방정식은 환경의 상태전이확률 p(s'|s,a)에 따른 다음 단계의 모든 상태전이를 고려하게 되고, 에이전트의 정책 π에 따른 다음 단계의 모든 행동을 고려하게 됩니다. 이처럼 벨만 방정식은 다음 상태와 다음 행동의 모든 후보를 고려하기 때문에 모든 전이가 아닌 샘플링된 데이터만을 사용하는 벨만 기대방정식이 나왔고 이를 이용한 SARSA 방식이 나왔습니다. 에이전트가 환경과 상호작용하면서 최적의 행동을 학습하는 방법입니다. 이 알고리즘은 에이전트가 어떤 상태에서 어떤 행동을 취했을 때 얻을 수 있는 예상 보상을 평가하는 Q-값(Q-value)을 업데이트하는 방식으로 작동합니다. Q-러닝에서는 "Q-테이블"이라고 불리는 표를 사용하여 각 상태(state)와 행동(action) 쌍에 대한 Q-값을 저장합니다. 이 테이블은 에이전트가 각 상태에서 어떤 행동을 취할 때 얻을 수 있는 장기적인 보상의 예상치를 제공합니다. Q-값은 다음과 같은 업데이트 공식을 사용하여 계산됩니다: Q(s,a)←Q(s,a)+α[r+γmax a′Q(s′,a′)−Q(s,a)] 여기서: Q(s,a)는 현재 상태 s에서 행동 a를 취했을 때의 Q-값입니다. α는 학습률(learning rate)로, Q-값이 새로운 정보를 얼마나 빨리 받아들일지 결정합니다. r은 행동 a를 취한 후 받은 즉각적인 보상입니다. γ는 감가율(discount factor)로, 미래의 보상을 얼마나 중요하게 여길지 결정합니다. max a′Q(s′,a′)는 다음 상태 s′에서 가능한 모든 행동 a′에 대해 예상되는 최대 Q-값입니다. 예시: 미로 찾기 게임 에이전트가 미로의 시작점에서 출구까지 가는 길을 찾아야 한다고 상상해보겠습니다. 미로의 각 셀은 하나의 상태를 나타내며, 에이전트는 상, 하, 좌, 우로 이동할 수 있는 네 가지 행동을 취할 수 있습니다. 초기화: 모든 상태와 행동 쌍에 대해 Q-테이블의 값을 0 또는 작은 무작위 값으로 초기화합니다. 환경 탐색: 에이전트는 무작위로 미로를 탐색하며 다양한 행동을 시도합니다. 보상 및 Q-값 업데이트: 에이전트가 벽에 부딪히면 작은 음수 보상을 받고, 출구에 도달하면 큰 긍정적 보상을 받습니다. 에이전트는 받은 보상과 다음 상태에서의 최대 Q-값을 사용해 현재 상태와 행동의 Q-값을 업데이트합니다. 학습 반복: 에이전트는 수많은 에피소드를 거치면서 이 과정을 반복하며, 점점 더 최적의 경로를 학습합니다. 결과적으로, Q-러닝 알고리즘은 에이전트가 미로를 효율적으로 탐색하는 방법을 스스로 학습하도록 도와줍니다. 각 상태에서 최적의 행동을 선택하게 되며, 이는 Q-테이블에서 가장 높은 Q-값을 가진 행동을 선택하는 것을 의미합니다.

에이전트 구현방법에서 분포모델과 샘플모델

강화학습에서 분포모델(Distributional Models)과 샘플모델(Sample Models)은 보상과 다음 상태의 불확실성을 처리하는 방식에서 큰 차이를 보입니다. 이 두 모델은 환경의 불확실성을 모델링하고, 이를 통해 학습 과정에서 에이전트의 결정을 지원하는 방식이 다릅니다. 분포모델 (Distributional Models) 분포모델에서는 반환값(보상의 총합)의 전체 확률 분포를 예측합니다. 이 접근 방식은 단순히 기대값(평균)을 예측하는 것보다 더 많은 정보를 제공합니다. 분포모델은 가능한 보상의 분포를 직접 모델링하여 에이전트가 보상의 변동성을 고려할 수 있도록 합니다. 이는 특히 리스크에 민감한 의사결정을 요구하는 환경에서 유용할 수 있습니다. 장점: 보상의 전체 분포를 고려하여 더 풍부한 정보를 제공합니다. 리스크를 더 잘 평가하고 관리할 수 있습니다. 단점: 계산적으로 복잡하고 자원을 많이 사용할 수 있습니다. 실제 구현시 분포를 어떻게 파라미터화하고 추정할지에 대한 과제가 있습니다. 샘플모델 (Sample Models) 샘플모델에서는 하나 또는 여러 개의 샘플로부터 학습을 진행합니다. 이 모델은 각 상태와 행동 쌍에 대해 하나의 보상과 다음 상태의 예제를 사용하여 Q-값(행동 가치)을 업데이트합니다. 이 접근법은 실제로 얻은 보상을 기반으로 학습하며, 확률 분포 전체를 추정하는 대신 직접 경험한 결과에 더 중점을 둡니다. 장점: 구현이 간단하고 직관적입니다. 계산 비용이 낮고 실시간 응용 프로그램에 더 적합할 수 있습니다. 단점: 단일 샘플 또는 제한된 샘플로 인해 발생하는 높은 변동성과 오버피팅의 위험. 보상의 분포 전체 정보를 활용하지 못합니다. 비교 정보의 풍부함: 분포모델은 샘플모델보다 더 많은 정보를 제공하며, 결정 과정에서 보상의 불확실성을 더 잘 반영할 수 있습니다. 계산 복잡성: 분포모델은 계산적으로 더 복잡하고 무거운 반면, 샘플모델은 보다 경량화되어 있고 실시간 처리에 더 적합할 수 있습니다. 적용 범위: 샘플모델은 널리 사용되고 이해하기 쉬운 반면, 분포모델은 특정 응용 프로그램에서 요구하는 추가적인 정보와 리스크 평가를 제공할 수 있습니다. 두 모델은 강화학습의 다양한 상황과 요구에 따라 선택될 수 있으며, 각각의 장단점을 이해하고 적절히 활용하는 것이 중요합니다.

Q러닝 클래스 구현 설명

클래스 초기화 (__init__) self.gamma: 감가율(discount factor), 미래 보상의 현재 가치를 결정합니다. 여기서는 0.9로 설정되어 있어, 미래 보상이 현재 보상보다 조금 낮게 평가됩니다. self.alpha: 학습률(learning rate), 새로운 정보가 Q-값에 얼마나 빠르게 반영될지를 결정합니다. 0.8로 설정되어, 새로운 정보가 기존의 지식을 빠르게 대체합니다. self.epsilon: 탐험 확률, 이 값에 따라 에이전트가 알려진 최선의 행동 대신 무작위 행동을 선택할 확률을 결정합니다. 여기서는 0.1로 설정되어 있습니다. self.action_size: 가능한 행동의 수, 이 예제에서는 4입니다. self.Q: 상태-행동 쌍에 대한 Q-값을 저장하는 딕셔너리. defaultdict를 사용하여 아직 방문하지 않은 상태-행동 쌍의 기본 Q-값을 0으로 설정합니다. 행동 선택 (get_action) state: 현재 상태를 입력으로 받습니다. 무작위 수가 epsilon보다 작으면, np.random.choice(self.action_size)를 통해 가능한 행동 중 하나를 무작위로 선택합니다. 그렇지 않으면, 현재 상태에서 각 행동에 대한 Q-값을 계산하고, np.argmax(qs)를 통해 가장 높은 Q-값을 가진 행동을 선택합니다. Q-값 업데이트 (update) state, action, reward, next_state, done: 현재 상태, 선택된 행동, 받은 보상, 다음 상태, 그리고 에피소드가 끝났는지의 여부를 입력으로 받습니다. done이 참이면, 목표에 도달했거나 에피소드가 종료되었음을 의미하며, next_q_max를 0으로 설정합니다. 그렇지 않으면, 다음 상태에서 가능한 모든 행동에 대한 Q-값을 계산하고 최대값을 선택하여 next_q_max로 설정합니다. target은 받은 보상과 할인된 최대 Q-값의 합으로 설정됩니다. 현재 상태와 행동에 대한 Q-값을 업데이트합니다. 업데이트는 이전 Q-값과 타깃 사이의 차이에 학습률 alpha를 곱한 값으로 조정됩니다.

Blog Home Back to Post List