Cloud/AWS

[DeepRacer] 강화학습으로 자율주행 구현하기 (모델 생성)

Omoknooni 2023. 11. 13. 18:19

학교에서 AWS DeepRacer 스터디 와 대회를 개최한다는 활동 포스터를 보고 참여를 하게 되었다.

주말 이틀 내내 학교에 가서 스터디 참가를 해야한다는 점은 정말 귀찮았다. 하지만 강화학습에 대해서 공부하게 되었고, 강사님께서 친절하고 상세하게 알려주셔서 배우기 수월했었다. 무엇보다도 깔끔하고 단순한 UI로 강화학습을 시뮬레이션하며 모델을 경쟁시키는 것은 상당히 흥미로웠다. 

 

머신러닝을 크게 3종류로 나누면 지도학습, 비지도학습, 강화학습으로 볼 수 있다.

  • 지도학습 : 모델을 훈련시키기 위해 레이블(Label)이 지정된 데이터를 사용하는 학습방법, 훈련 데이터는 입력 데이터와 이 입력에 대한 정답으로 구성된다.
  • 비지도 학습 : 레이블이 지정되지 않은 데이터를 학습하는 방법, 데이터들에서 패턴,구조 등을 파악해 군집을 생성함
  • 강화학습 : 에이전트가 주어진 환경에서 어떤 행동을 수행할 지 학습하는 방법, 정답 행동이 주어지지 않은 환경에서 최적행동의 시퀀스를 찾아가는 방법, 행동심리학에서 영감을 받은 학습법
    ⇒ 인간/동물이 경험을 통해 학습하는 과정과 유사 (걸음마, 자전거 타기 등)

 

강화학습이란

Agent는 State를 파악하고 Action을 해, 각 Action의 결과에 따라 Reward를 제공받는다. 이 과정을 반복하면서 누적 Reward를 최대화하는 정책(Policy)를 만드는 학습방법

 

한 문단으로 정리하면 위와 같은데, 환경, 에이전트, 상태, 행동, 보상의 다섯 요소를 기반으로 '정책'이라는 요소를 생성하는 것으로 볼 수 있다.

 

DeepRacer

AWS에서 제공하는 강화학습을 통한 레이싱 시뮬레이션, 복잡한 강화학습 과정을 간단한 UI로써 진행하며 모델을 생성하고 평가할 수 있는 자체 서비스이다.

 

DeepRacer는 온라인과 오프라인 모두 가능하며, 온라인에서는 가상 시뮬레이션 영상으로 모델 Train과 Evaluation을 할 수 있고, 오프라인 환경에서는 실물 모형 차량을 통해 모델을 적용시켜 실제 트랙에서 주행할 수 있다.

 

 

DeepRacer 모델 생성하기

Garage에서 주행 차량(agent) 생성

모델을 train하고 평가하는데에 사용할 주행 차량(agent)를 먼저 만들어줘야한다.

Reinforcement learning > Your Garage에서 현재 생성된 차량 목록을 볼 수 있다. 우상단의 Build new Vehicle

차량의 이름과 외관을 설정할 수 있다.

 

다음으로 차량의 외부 데이터를 수집하기 위해 장착할 센서를 결정하는 부분인데, 카메라와 LIDAR 센서를 장착할 수 있다.

카메라는 1대나 2대를 장착할 수 있고, LIDAR 센서는 Add-on 스타일로 차량에 추가적으로 장착할 수 있다.

 

 

  • Single 카메라 : 1대의 카메라를 장착하는 방식으로 카메라 2대보다 입력값 적어, 간단하며 수렴속도가 빠르다
    ⇒ 빠르게 완주해야하는 time trial에 적합 (간단한 서킷)
  • Stereo 카메라 : 카메라를 2대 사용하는 방법으로 2개의 카메라로 인한 이미지의 깊이에 대한 정보 수집 가능하다.
    (인간의 두 눈과 같은 원리)
  • LIDAR 센서 : 빛을 감지하고 거리를 측정하는 센서, 360도로 정보를 수집, 물체와의 거리를 카메라보다 더 많은 정보를 인지할 수 있다.
    ⇒ 복잡한 환경에서 적합 높은 프레임 수 → 공간 분해능력 높음

센서를 결정하면 차량이 생성된다.

 

 

모델 생성(Train)

다음으로 생성한 차량으로 모델을 학습한다.

Reinforcement learning > Your models에서 현재 생성된 모델 목록을 볼 수 있다. 우상단의 Create model

모델 이름과, 설명, Train할 환경(트랙과 주행 방향)을 설정할 수 있다.

 

 

다음으로 Race type, Train 알고리즘, 하이퍼파라미터를 설정할 수 있다.

 

3가지의 Race Type이 있는데 각 설명은 아래와 같다.

  • Time trial : 타임어택형 Race, 단순히 트랙을 빨리 돌아 Lap time을 측정하는 것
  • Object avoidance : 장애물 피하기, 트랙에 장애물이 배치된다. 이를 피해서 트랙을 완주하는 Race
    배치되는 장애물의 갯수, 고정/랜덤 배치 등을 추가로 설정할 수 있다.
  • Head-to-head : 다른 bot 차량이 추가되는 Race, 장애물과 마찬가지로 충돌하는 경우 패널티가 있다.
    bot 차량의 갯수, 속도, 차선 변경 여부 들을 추가로 설정할 수 있다. 

알고리즘의 경우 PPO와 SAC, 둘 중 하나를 선택할 수 있다.

그 밑으로 하이퍼파라미터를 설정하는 메뉴가 존재한다.

 

 

조절할 수 있는 하이퍼파라미터는 아래와 같다.

  • Gradient descent batch size
  • Number of epochs
  • Learning rate
  • Entropy
  • Discount factor
  • Loss type
  • Number of experience episodes between each policy-updating iteration

 

그 다음으로 Action space를 정의한다.

Action space는 에이전트가 취할 수 있는 행동의 집합으로 DeepRacer는 속도와 회전각 2가지 지표를 가지고 Action space를 만들 수 있다.

Continuous action space 설정
Discrete action space 설정

 

가장 먼저 Discrete / Continuous 중 하나를 설정한다.

Discrete는 이산적인 Action space로, 속력과 각도를 미리 정한 후 조합하여 Action space를 만드는 방식이다.

반면 Continuous는 연속적인 Action space이다. 이에 따라 Agent가 취할 수 있는 Action이 무수히 많다.

Continuous는 Discrete에 비해 부드러운 움직임을 가지며, optimal한 속력과 각도를 뽑아내는데 시간이 오래걸린다.

 

 

다음으로 Train에 사용할 Vehicle을 설정한다.

 

 

마지막으로 모델 생성에서 가장 큰 비중을 차지하는 보상함수(Reward function)를 생성한다.

 

Python으로 제작된 함수 하나를 완성시키는 방식이다. 모델 Train에서 agent가 취하는 action에 따라서 reward를 제공하는 함수로, 

기본적으로 몇 개의 sample code를 제공해주고 있다.

 

 

예시로 주어진 reward 제공 방법은 중앙선 따라가기와 양측 경계선을 벗어나지 않기, 지그재그 행동을 방지로 input parameter를 통해 현재 agent에 대한 변수, track에 대한 변수, 장애물에 대한 변수를 호출해 그에 맞는 

 

각 parameter에 대한 설명은 Docs를 참조한다.

 

Input parameters of the AWS DeepRacer reward function - AWS DeepRacer

abs | (var1) - (var2)| = how close the car is to an object, WHEN var1 = ["objects_distance"][index] and var2 = params["progress"]*params["track_length"] To get an index of the closest object in front of the vehicle and the closest object behind the vehicle

docs.aws.amazon.com

 

다양한 parameter가 있지만 가장 많이 사용되는 parameter들은 아래와 같다고 한다.

{
    "all_wheels_on_track": Boolean, 		# 모든 바퀴가 트랙 내에 존재하는가의 flag
    "waypoints": [(float, float),], 		# 트랙 중심을 따라가는 (x,y) 좌표의 이정표 목록
    "closest_waypoints": [int, int], 		# 현재 차량 위치에서 가장 가까운 waypoint 2개
    "distance_from_center": float, 		# 트랙 중앙선으로부터의 거리
    "is_left_of_center": Boolean, 		# 차량이 중앙선 기준으로 좌측에 있는가의 flag
    "steering_angle": float, 			# 차량의 회전각
    "speed": float, 				# 차량의 현재 속도
    "heading": float,				# 에이전트가 향하는 방향각
    "track_length": float,			# 트랙의 총 길이
    "track_width": float,			# 트랙의 폭
}

 

 

Reward function까지 설정이 완료되면, Train이 시작된다.

현재까지 진행된 Train의 reward값 그래프와 현재 Train 중인 시뮬레이션의 영상을 확인할 수 있다.

 

 

초록 Line은 Training에서의 평균 Reward 값을 나타내고, 파란 Line은 Training에서의 트랙 완수율, 빨간 Line은 Evaluating(검증)에서의 트랙 완수율을 나타낸다.

 

전체적으로 3개의 값 모두 우상향을 찍는 것이 가장 이상적인 형태(학습이 잘 된 형태)라고 전해진다.

 

다음으로는 학습된 모델을 평가해보고 Race에 제출하는 방법을 알아본다.