이번 주차에는 Deepracer student preseason에 참여하여 reward function을 변경해가며 결괄르 확인하는 활동을 진행했다.

현재 상태는 아래와 같다.

Untitled

위 모델에 사용한 reward function은 아래와 같다.

def reward_function(params):
    # Example of rewarding the agent to follow center line

    # Read input parameters
    track_width = params['track_width']
    distance_from_center = params['distance_from_center']

    # Calculate 3 markers that are at varying distances away from the center line
    marker_1 = 0.1 * track_width
    marker_2 = 0.2 * track_width
    marker_3 = 0.3 * track_width
    marker_4 = 0.4 * track_width
    marker_5 = 0.5 * track_width

    # Give higher reward if the car is closer to center line and vice versa
    if distance_from_center <= marker_1:
        reward = 1.5
    elif distance_from_center <= marker_2:
        reward = 1.2
    elif distance_from_center <= marker_3:
        reward = 0.5
    elif distance_from_center <= marker_4:
        reward = 0.25
    elif distance_from_center <= marker_5:
        reward = 0.1
    else:
        reward = 1e-3 # likely crashed/ close to off track

    return float(reward)

기본적으로 제공하는 follow the center line 알고리즘의 reward 구간을 기존 3단계에서 5단계로 확장하여 0.3 범위 내부와 그 외부의 reward 차이를 크게 주어 가능한 중앙선에 가까이 위치하도록 조절하였다. 6시간 학습 결과가 위와 같다.

팀세션 진행 이후 팀원인 K님과 S님의 코드를 보며 새로운 reward function을 작성중이다. 해당 코드는 곧 github에 업로드할 예정이다. 그 사이에 미리 만들어둔 새로운 reward function을 학습하는 중에 있다. 코드는 아래와 같다.

def reward_function(params):
    # Example of rewarding the agent to follow center line

    # Read input parameters
    track_width = params['track_width']
    all_wheels_on_track = params['all_wheels_on_track']
    distance_from_center = params['distance_from_center']

    # Calculate 3 markers that are at varying distances away from the center line
    marker_1 = 0.1 * track_width
    marker_2 = 0.2 * track_width
    marker_25 = 0.25 * track_width
    marker_3 = 0.3 * track_width
    marker_35 = 0.35 * track_width
    marker_4 = 0.4 * track_width
    marker_5 = 0.5 * track_width

    # Give higher reward if the car is closer to center line and vice versa
    if all_wheels_on_track:
      if distance_from_center <= marker_1:
          reward = 1.4
      elif distance_from_center <= marker_2:
          reward = 1.3
      elif distance_from_center <= marker_25:
          reward = 1.25
      elif distance_from_center <= marker_3:
          reward = 1.2
      elif distance_from_center <= marker_35:
          reward = 1.15
      elif distance_from_center <= marker_4:
          reward = 0.5
      elif distance_from_center <= marker_5:
          reward = 0.1
      else:
          reward = 1e-3
    else:
      reward = 1e-3

    return float(reward)

트랙을 따라가는데 있어 좌회전이 많은 코스이기에 굳이 중앙선을 따라가기 보다는 1차선에 붙어있는 것이 유리하다 판단하여 위와 같은 변주를 주었다. 결과가 나오는대로 본 글에 추가할 예정이다.

이후에는 waypoint를 이용하여 다음 waypoint까지의 각도를 계산하여 회전구간과 직선 구간의 속도를 달리하는 함수를 학습에 이용할 예정이다.