① gym의 출력 모양에 따라 네트워크 계층을 올바르게 초기화할 수 있도록 화면 크기를 가져옵니다. 이때 화면의 크기는 3×40×90에 가까운데, get_screen() 함수에서 압축 및 축소한 결과입니다. get_screen() 함수에서 env.render()를 통해 화면의 크기 정보를 가져왔고, 여기에 slice()를 적용하여 크기를 축소했습니다.
② 모델을 불러와서 파라미터 값을 채워 줍니다.
ⓐ load_state_dict: state_dict 값을 읽고(policy_net이라는 모델을 가져와서) 모델의 파라미터 값을 채워 줍니다.
ⓑ state_dict: 모델의 저장, 업데이트, 변경 및 복원을 위해 사용합니다. 여기에서 말하는 모델이란 모델에서 사용하는 가중치, 옵티마이저 등의 값을 의미합니다.
모델 학습을 위해서는 먼저 리플레이 메모리에서 샘플 데이터(텐서)를 가져와서 torch.cat을 이용하여 하나의 텐서로 연결합니다. 이후 Q(st,at) 및 V(st+1)을 계산한 후 손실 함수에서 사용합니다. 참고로 s가 최종 상태(게임의 종료)이면 V(s)=0으로 설정합니다. 알고리즘의 안정성을 높이기 위해 타깃 네트워크(target_net)를 사용하여 V(st+1)도 계산합니다. 타깃 네트워크의 가중치는 일정 시간 동안 고정된 상태로 유지되지만 정기적으로 정책 네트워크의 가중치로 업데이트됩니다.