고정 Q-타깃
고정 Q-타깃으로 Lunar Lander를 학습할 준비를 하려고 합니다. 그에 앞서, 행동을 선택하는 온라인 네트워크와 TD-타깃 계산에 사용하는 타깃 네트워크를 모두 인스턴스화해야 해요.
또한 매 학습 단계에서 사용할 수 있는 update_target_network 함수를 구현해야 합니다. 타깃 네트워크는 경사하강법으로 직접 업데이트하지 않고, 대신 update_target_network가 가중치를 Q-네트워크 쪽으로 조금씩 이동시켜 시간이 지나도 비교적 안정적으로 유지되도록 해요.
참고로, 이 연습 문제에서는 상태 딕셔너리를 쉽게 출력하고 확인할 수 있도록 아주 작은 네트워크를 사용합니다. 은닉층은 크기 2인 층 하나뿐이며, 행동 공간과 상태 공간의 차원도 각각 2입니다.
상태 딕셔너리를 출력하기 위한 print_state_dict() 함수가 환경에 준비되어 있습니다.
이 연습은 강의의 일부입니다
Python으로 배우는 Deep Reinforcement Learning
연습 안내
- 타깃 네트워크와 온라인 네트워크 각각에 대해
.state_dict()를 얻으세요. - 온라인 네트워크의 파라미터와 타깃 네트워크의 파라미터 사이의 가중 평균을 사용해 타깃 네트워크의 상태 딕셔너리를 업데이트하세요. 이때 온라인 네트워크의 가중치는
tau를 사용합니다. - 업데이트된 상태 딕셔너리를 타깃 네트워크에 다시 로드하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
def update_target_network(target_network, online_network, tau):
# Obtain the state dicts for both networks
target_net_state_dict = ____
online_net_state_dict = ____
for key in online_net_state_dict:
# Calculate the updated state dict for the target network
target_net_state_dict[key] = (online_net_state_dict[____] * ____ + target_net_state_dict[____] * ____)
# Load the updated state dict into the target network
target_network.____
return None
print("online network weights:", print_state_dict(online_network))
print("target network weights (pre-update):", print_state_dict(target_network))
update_target_network(target_network, online_network, .001)
print("target network weights (post-update):", print_state_dict(target_network))