강의노트 정리 및 예제 시연

Section 6

A2C (Advantage Actor-Critic) 가치 기반과 정책 기반 강화학습을 결합한 형태의 알고리즘 두 종류의 네트워크를 사용 ⏵Policy Network(정책 네트워크) -정책을 직접 학습(Policy gradient 신경망을 사용)하여 에이전트의 의사결정 수행 ⏵Value Network(가치 네트워크) -DQN과 동일하게 가치를 학습하여 상태와 행동에 대한 가치를 도출

image.png

확률에 기반하여 행동하기에 학습 초기에 자연스러운 탐험을 수행할 수 있음

두 네트워크 모두 입력으로 상태를 사용하기에 출력 레이어를 제외한 다른 레이어들은 다 공유를 한다. 이후, 출력 레이어 부분에서 한꺼번에 정책과 가치함수 값을 근사하는 신경망 구조를 사용하기도 한다.

image.png

목적함수

image.png

b= baseline 목적함수의 그래디언트의 분산을 줄이기 위함 베이스라인을 상태가치함수(v)로 대체한 것이 A2C 알고리즘

A2C 알고리즘 구조 현재 상태를 입력으로 정책 네트워크가 상태에 대한 정책을 출력 정책을 바탕으로 확률적으로 행동을 선택 해당 상태에 대한 가치함수를 가치네트워크가 출력하고 해당 출력을 이용하여 타겟값을 계산 타겟값으로 가치네트워크의 손실함수 식으로 타겟값과 현재 상태가치함수의 추정값의 차이를 최소화하도록 가치함수를 업데이트 상태가치 추정값을 이용하여 advantage함수를 구한 후, advantage함수와 log정책의 그래디언트를 활용하여 정책 네트워크를 업데이트

[도식화]

image.png

//라이브러리는 DQN과 동일
//파라미터 값 세팅
state_size = 6*2: 수치적관측이용(목적지 관측(goal-plus, goal-ex으로 2개)에서 오브젝트들의 x,z좌표(ㅁ, +, x당 2개씩 총 6개))[자료 참고 (6)]
action_size = 4: DQN과 동일
OBS = VECTOR_OBS: 수치적 관측을 사용하므로 벡터이용
#A2C 클래스 -> Actor Network와 Critic Network 정의
**init** 함수 - 네트워크를 구성하는 레이어를 정의 및 인스턴스화 될 때 초기화
A2C 알고리즘은 동일 네트워크를 사용하고, 마지막 레이어만 따로 출력하므로 마지막 레이어만 따로 나누어 구성하여 계산
정책은 행동에 대한 확률로 행동 크기로 출력 차원을 설정
가치는 상태에 대한 가치이기에 1로 출력 차원을 설정
forward 함수 - 네트워크 입력에 대한 π, v을 계산 및 인스턴스가 호출됐을 때 실행
정의한 레이어를 통해 정책과 가치를 계산
정책은 확률처럼 사용하기 위해 마지막 활성함수를 softmax()로 사용
가치는 실수범위로 계산하기에 따로 설정하지 않음
//Agent 클래스
**init**(self) - Agent의 인스터스가 실행될 때 수행하는 함수
self.a2c = A2C().to(device): 모델 클래스에서 정의한 A2C 모델을 생성하여 넣어줌
self.optimizer = torch.optim.Adam(): 옵티마이저는 Adam으로 사용
get_action(self, state, training=True) - 에이전트의 행동 선택하는 함수로 상태와 학습 모드를 입력값으로 받음
self.a2c.train(training): 학습모드인지 평가모드인지 설정(True = 학습모드 / False = 평가모드)
self.a2c(): A2C 네트워크를 통해 정책 파일을 계산
torch.multinomial(): 해당 정책에 따라 랜덤 샘플링을 통해 행동 액션을 결정
train_mode(self, state, action, reward, next_state, done) - 네트워크 학습을 수행하는 함수
map(): state, action, reward, next_state, done 데이터에 대해 각각 float tensor로 변환하여 할당된 디바이스에 올려둠
pi: 현재 상태에 대한 모델의 정책, value: 현재 상태에 대한 모델의 가치
with torch.no_grd(): 타겟값 계산 코드는 네트워크 업데이트에 관여되지 않도록 그라디언트 추적을 막는 역할
F.mse_loss(): MSE 손실 샘플을 통해 가치 신경망 손실 함수를 계산
선택한 행동에 대한 확률 구하기
one_hot_incoding을 진행 one_hot_action 계산
advantage 계산 detach()를 이용하여 업데이트 하지 않도록
정책 신경망 목적함수 구하기 = one_hot_action * pi 후 1차원에 대한 sum으로 선택한 행동에 대한 확률을 계산한 후, 로그를 씌워 advantage와 곱함
actor_loss 구하기 = 정책 신경망 목적함수에 평균을 구한 후 부호를 바꿈
Gradient Ascent(Loss가 최대가 되는 파라미터를 찾는 방법)하기 위해 사용
전체 손실함수 계산
전체 손실함수에 대한 모델 파라미터들을 업데이트
zero_grad: 기울기 초기화
backward: 역전파를 통해 그래딘언트 값 계산
optimizer.step(): model의 파라미터 값들을 업데이트
save_model(self) - 네트워크 모델을 저장하는 함수
서정한 경로에 체크포인트 파일로 저장
write_summary(self, score, actor_loss, critic_loss, step) - tensorboard에 학습한 정보를 기록하는 함수
#Main 함수
전처리(preprocess)를 통해 수치적 관측 정보와 목적지 관측 정보를 state에 저장(DQN은 시각적 관측 정보와 목적지 관측 정보를 사용)
학습수행에서 에피소드를 진행하는 동안 학습모드이면 DQN과 다르게 데이터를 replay 버퍼에 저장하지 않고 트랜지션마다 바로 학습을 진행

<A2C를 활용한 GridWorld 학습 과정>

<Tensorboard 결과>

image.png

Tensorboard 해석: A2C 알고리즘이 어느 정도 성공적으로 학습되었고 평균적으로 높은 성과를 내고 있다. 다만 후반부로 갈수록 성능의 변동 폭이 커져, policy가 완전히 안정화되지 않았을 가능성이 있다.

image.png

<학습된 A2C 알고리즘 테스트 영상>

A2C_Test.mp4