AWS Deepracer를 하면서...

이종욱·2023년 9월 7일
0

Track: Roger Super Raceway - Clockwise

딥레이서 보상함수 작성과정

기존 예시로는 아무리 학습해도 한계가 있는 거 같았다.

def reward_function(params):
    
    # 파라미터
    track_width = params['track_width']
    distance_from_center = params['distance_from_center']
    all_wheels_on_track = params['all_wheels_on_track']
    abs_steering = abs(params['steering_angle'])
    
    # 최소 보상
    reward = 1e-3
    
    # 트랙 폭 위치별 미터 지정
    marker_1 = 0.1 * track_width
    marker_2 = 0.25 * track_width
    marker_3 = 0.5 * track_width
    
    # 네 바퀴 전체가 트랙 안이고 센터라인에 가까울수록 좋은 보상 "대입" 
    if all_wheels_on_track and (0.5*track_width - distance_from_center) >= 0.05:
         if distance_from_center <= marker_1:
             reward = 1.0
         elif distance_from_center <= marker_2:
             reward = 0.5
         elif distance_from_center <= marker_3:
             reward = 0.1
         else:
             reward = 1e-3
             
    # 스티어링이 기준치 15도를 넘어가면 보상 깎기(지그재그 방지)
    ABS_STEERING_THRESHOLD = 15 
    if abs_steering > ABS_STEERING_THRESHOLD:
        reward *= 0.8
    
    return float(reward)

(주행에는 무리없지만 랩타임을 줄이기 위해서는 새로운코드를 작성하는게 맞음.)
(사실 주행에도 문제가 있긴 했다. Roger 트랙이 90도 코너가 많아서 offtrack의 경우가 많았다.)
그래서 보상함수를 직접 짜보기로 했다...

생각의 굴레

if (closest_waypoints[0]>=0 and closest_waypoints[0]<=20) or (closest_waypoints[0]>=29 and closest_waypoints[0]<=47) or (closest_waypoints[0]>=92 and closest_waypoints[0]<=117) or (closest_waypoints[0]>167 and closest_waypoints[0]<200):

90도 코너에서 offtrack이 많아 기존 위의 예시코드에서 코너와 직선주행 구간을 나눠 코너에서는 속도를 줄이고 직선에서는 속도를 늘리는 방향으로 접근했다.

의미있는 결과가 나오지는 않았다.

학습량도 늘려봤지만 기존 1시간에서 3시간으로 늘려봤지만 보상함수나 하이퍼파라미터 설정 자체가 잘못된 모델은 지역최적점에 갇히는 것 같았다.(총 보상 G는 올라가지만 완주율이 바닥을 김.)

속도에 대한 코드도 잘못 되긴 했다.

params['speed']+=(4-params['speed'])*0.8

보상을 줘야 했는데 파라미터 자체에 계속 값을 주는 방식을 썼다. (보상에 대한 이해도 부족)

이쯤에서 수상경력이 있는 사람들의 코드를 볼 필요가 있었다.
https://falktan.medium.com/aws-deepracer-how-to-train-a-model-in-15-minutes-a07ab77fb793

위 포스트의 개념을 차용해서 이런 코드도 짜기도 했다.

x1 = waypoints[closest_waypoints[0]+1][0]
y1 = waypoints[closest_waypoints[0]+1][1]
theta = abs(math.degrees(math.atan2((y1-y),(x1-x))))

대충 "waypoint는 절대좌표로 정해져 있으니까 아크탄젠트로 정해진 각을 구하고 그 각에서 차 heading 방향각과의 차이가 적어지는 쪽으로 보상준다는 얘기"

하지만 뜻대로 되지 않아 퇴근을 하고 그날 운동을 하면서 계속 생각해보았다.

1. 보상의 정도에 대한 이해

ex) 보상 500을 얻기 위해 -1 감수할 수 있다.
=> 마냥 딴대서 좋으면 그냥 감(지금 -1을 받아도 다른 곳에서 500을 받으면 되니까)
그럼 이렇게 하자.
트랙이탈일때는 보상을 받지 않으므로
한 프레임당 Max 보상 설정
그럼 해당 모델 랩타입 측정해서 총 보상 예측할 수 있음
=> 말 그대로 총 보상 G만 예측가능, 이 모델이 보상을 잘 받을 시 주행을 어떻게 하는지 확인가능(+실제로 실시간으로 보상을 어느정도로 잘 받고 있는지, 총 보상을 어느 정도 아니까)
?그럼 시간이 느려지나,레이싱 대횐데(안정성 확보로 인한 랩타임 증가)?
=> 트랙 Progress와 시간 관련 파라미터가 있나? 일단 몰라몰라

2. Max 보상 설정 방법론

각각의 함수에서 예상되는 보상 계산해서 기준치 설정
기준치 넘어가면 Max 보상으로 대입할 것인가
아님 기준치 못 넘으면 보상 자체를 줄일 것인가
(전자가 맞는 거 같다)

그렇기에 함수 우선순위 생각
곱셈은 순서 바껴도 괜찮지만 덧셈은 다르다

그럼 함수는 충분한가?

  • 코너
    Heading 설정(젤 강제성이 크니까 나중에 나중)
    Trackoff 설정(괜찮음)
    distance from center
    알고리즘(이건 좀 어려울듯)도?
    코너 끝점일 때 중앙선 기준 보상깎기(인코스로 돌도록)
    그래도 코너 잘 못 돈다....
    한바퀴 도는 문제? => 스티어링 앵글 함수 보기(왜 한바퀴 돔?)
    직진보상이 더 크기 때문에 코너를 못 돈다고 생각
    => 직진 함수 적용 구간 만들기(이번엔 보상에 대한 것, 위에서는 속도만 생각함)
    코너의 시작과 끝을 범위로 지정할까? => 쓸모없는 생각

속도에 대해 문제 + 안정성 문제
=> 안정성을 높이는 함수(넣었음)
아니면 좀 더 세분화?

‐--------------- 갈아엎음

잘 된 모델 참고해서 직선주행코드 넣고(보상 잘 보고)
코너구간에는 기본 하나만

Progress를 넘으면 보상?

‐--------------- 갈아엎음

결국 다른사람 코드로...

Hyperparameters

요약: 강화학습 ㅈ같네

+모방의 중요성
+위대한 발명은 간단한 수학 아이디어로부터 시작된다.

profile
안녕하세요!

0개의 댓글

관련 채용 정보