6월에 열린 아마존 AWS Deepracer Virtual Race #2 에서 20.695초 104등을 차지했다.
총 참가자 수는 572명이다.
나는 Sofia와 Dalyo 두 종류의 모델을 훈련 시키고 있다.
이번 대회에서는 주로 Sofia를 출전 시키다가 나중에 Dalyo를 출전 시켰다.
최고 점수는 Dalyo로 따냈다.
Sofia와 Dalyo 두 모델의 근본적인 차이점은 Action Space 였다.
Sofia Action Space
Dalyo Action Space
Sofia는 최고 스피드를 5로 했고 Dalyo는 최고 스피드를 8로 했다.
아무래도 최고 스피드를 더 높게 만든 Dalyo가 더 성적이 좋게 나온 것 같다.
처음에는 Sofia가 안정적이라서 계속 참가를 시켰다.
Dalyo는 거의 완주를 못 했었다. 아마 속도가 너무 빨리서 트랙을 벗어나는 경우가 많았나 보다.
나중에 좀 더 연습을 시켜서 Dalyo의 완주율이 50% 정도 올랐다.
그 완주한 점수들이 Sofia 모델보다 훨씬 높아서 결국 최고 점수는 Dalyo가 차지 했다.
이 Action Space는 최초 모델을 만들 때 정해주고 그 다음에는 수정이 불가능 하게 돼 있다.
그래서 이 Sofia와 Dalyo를 훈련 시킬 때는 주로 reward_function을 수정해 가면서 성능 향상을 시키려고 노력했다.
Sofia는 거의 10번 훈련 시켰었는데 처음 Sofia를 탄생 시켰을 때의 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.25 * track_width
marker_3 = 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.0
elif distance_from_center <= marker_2:
reward = 0.5
elif distance_from_center <= marker_3:
reward = 0.1
else:
reward = 1e-3 # likely crashed/ close to off track
return float(reward)
이 때의 트랙은 직선 트랙이었다.
그래서 중앙선에 가까운 경우 reward를 주는 로직을 만들어서 훈련 시켰다.
두번째도 Straigh track인데 함수를 조금 바꿨다.
def reward_function(params):
'''
Example of rewarding the agent to follow center line
'''
reward=1e-3
# Read input parameters
track_width = params['track_width']
distance_from_center = params['distance_from_center']
steering = params['steering_angle']
speed = params['speed']
all_wheels_on_track = params['all_wheels_on_track']
if distance_from_center >=0.0 and distance_from_center <= 0.03:
reward = 1.0
if not all_wheels_on_track:
reward = -1
else:
reward = params['progress']
# Steering penality threshold, change the number based on your action space setting
ABS_STEERING_THRESHOLD = 15
# Penalize reward if the car is steering too much
if steering > ABS_STEERING_THRESHOLD:
reward *= 0.8
# add speed penalty
if speed < 2.5:
reward *=0.80
return float(reward)
완전 Stupid 한 script 이다.
추가한 부분에 reward = reward+n 이런식으로 reward가 더해지거나 빼지는 방식으로 스크립트를 작성했어야 했는데 멍청하게도 그냥 reward 값을 그냥 대입하는 방식으로 돼 있다.
위에 보면 차량이 center로 부터 0.03 이상 떨어지지 않으면 reward를 1.0으로 설정하고 그 다음에 트랙 안에 있지않으면 reward = reward-1을 해야 하는데 그냥 reward=-1을 해 버렸다.
reward=params['progress']도 reward=reward+['progress']로 했어야 했다.
하여간 이러한 실수가 이 후에도 계속 됐고 후반부에 가서야 이것이 잘 못 됐다는 걸 발견 했다.
위 스크립트에서는 distance_from_center 부분은 아무런 역할을 하지 않는 부분이 돼 버렸다.
세번째는 Oval Track에서 훈련 시켰고 네번째는 London loop에서 훈련 시켰다.
다섯번 째 부터 6월 대회에서 사용했던 Kumo Torakku Track에서 훈련 시켰다.
그리고 Dalyo라는 새 모델도 만들었다.
이 때부터 Sofia와 Dalyo 두 모델을 훈련 시켰지만 Sofia가 대부분 완주를 하고 Dalyo는 그렇지 못했기 때문에 계속 Sofia만 출전 시켰었다.
Sofia는 이후 10여번 훈련 시켰고 Dalyo는 4번 정도 더 훈련 시켰다.
Sofia의 Kumo Torakku 트랙의 마지막 reward_function은 이렇다.
def reward_function(params):
'''
Example of rewarding the agent to follow center line
'''
reward=1e-3
# Read input parameters
track_width = params['track_width']
distance_from_center = params['distance_from_center']
steering = params['steering_angle']
speed = params['speed']
all_wheels_on_track = params['all_wheels_on_track']
if not all_wheels_on_track:
reward = -1
else:
reward = params['progress']
# add speed penalty
if speed < 1.0:
reward *=0.80
else:
reward += speed
return float(reward)
speed를 좀 더 빨리 하기 위해 reward에 현재의 스피드를 더하는 로직을 사용했다.
근데 별 효과는 없었다.
Dalyo의 Kumo Torakku 트랙 마지막 reward_function도 똑 같다.
이 Virtual 경기 대회는 횟수에 상관없이 계속 모델을 참가 시킬 수 있기 때문에 (30분 간격으로) 나중에는 완주 횟수는 떨어지지만 점수가 더 높게 나오는 Dalyo 모델을 주로 출전 시켰고 결국은 104 등을 기록 했다.
7월에는 3번째 Virtual 대회가 열리고 1번의 offline 대회가 뉴욕에서 열릴 예정이다.
트랙은 둘 다 Empire City 트랙.
가능하면 둘 다 참가할 계획이다.
6월 Virtual 대회를 참가하면서 배운 것은 두가지
1. reward_function을 바꾼 후 당초 예상대로 그 변경 내용이 적용 되는지 확인 하는 것이 필요하다.
AWS의 Debugging 툴을 활용해서 확인 해야 겠다.
2. 훈련을 위해 사용 되는 3가지 주요 세팅 중 Hyperparameter 를 활용한 성능 향상 방법을 배워야 겠다.
Action Space는 최초 모델을 생성할 때 설정하고 그 이후에는 변경이 불가능 하다.
reward_function과 Hyperparameter는 변경 가능한데 지금까지는 reward_function만 변경하면서 훈련 시켰다.
Hyperparameter는 잘 몰랐기 때문이다.
이제 Hyperparameter를 공부해서 이 부분도 모델 성능 향상에 활용해야 20초 대를 넘을 수 있을 것 같다.
이번 Empire City 트랙을 사용하는 Virtual Circuit에서는 15초대 진입과 50등 이내로 돌입하는 것을 목표로 참가할 계획이다.
화이팅!!!!!!!!!!!!
'IoT > AWS DeepRacer' 카테고리의 다른 글
AWS Deepracer 이렇게만 하면 상위권 간다. (0) | 2019.08.06 |
---|---|
AWS Deepracer Virtual Circuit The Empire City 2019/7 (0) | 2019.08.04 |
AWS DeepRacer League - New York을 다녀와서 (0) | 2019.07.24 |
Using Jupyter Notebook for analysing DeepRacer's logs (0) | 2019.07.23 |
AWS Deepracer Forum Q&A (1) | 2019.07.08 |
MEGAZONE CLOUD AWS DeepRacer League in Korea (0) | 2019.06.25 |
테슬라 주가와 2011년 넷플릭스 주가 비교 (0) | 2019.06.05 |
AWS DeepRacer League and 2nd Virtual Race open (1) | 2019.06.04 |
AWS Deepracer - Oval and London loop track model 훈련 결과 (0) | 2019.06.03 |
AWS Deepracer Model 훈련 및 평가 후 볼 수 있는 정보들 (0) | 2019.06.02 |