Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
관리 메뉴

찹모찌의 기록일지

무인기 자율운항 강화학습 패러독스: AI가 이보 전진을 위한 일보 후퇴를 이해할 수 있는가? 본문

프로젝트 일지

무인기 자율운항 강화학습 패러독스: AI가 이보 전진을 위한 일보 후퇴를 이해할 수 있는가?

찹모찌 2024. 3. 12. 02:15

필자는 광운대학교에서 LIG넥스원과 산학연계 프로젝트로 무인기 자율운항 프로젝트를 진행한 적이 있다.

이때, 무인기가 목적지까지 장애물을 피해 도달하도록 하기 위해 강화학습을 진행하던 중, 큰 난관에 봉착한 적이 있다.

이는 그 난관을 넘어서는 과정을 담은 이야기다.

프로젝트의 기본 틀

문제를 설명하기 앞서, 프로젝트의 기본 틀을 이야기하자면, Unity환경에서 Unity ML-Agents 플러그인의 내장 PPO 알고리즘을 활용하며 진행한다. 프로젝트의 기본 목표는 무인기가 장애물(정적, 동적)에 부딪히지 않고 목표지점까지 도달하는 것을 목표로 한다.

무인기가 목표물에 가까워지기 위한 기본적인 보상 함수는 다음과 같다.

기본적인 보상 함수

목표물까지 얼마만큼 움직였나를 이전 목표물과의 거리와 현재 목표물과의 거리의 차로 판단하여 보상을 준다.

그렇게 되면 목표물에 가까워지면 가까워질 수록 보상이 누적되게 된다. 그러면 무인기는 목표물에 가까워지는 걸 목표로 움직이게 될 것이고 학습이 계속 진행되다 보면 결국 목표물에 잘 도착할 수 있다!

무인기, 목표물
학습 과정
학습을 시킨 결과(목표물 범위를 좀 넓게 잡아놨다😇)

 

여기까지는 문제가 없다.

하지만 장애물이 생긴다면?

 

장애물이 있을때의 보상 함수

처음 구상한 보상 함수 알고리즘은 장애물에 부딪히면 마이너스 보상 값을 주어 장애물을 피해서 갈 수 있도록 하는 것이었다.

장애물 피하는 보상 함수 설계

목표물에 가까이 갈 때 장애물에 부딪히면 마이너스 보상을 주고 에피소드를 종료시킨다. 이걸 반복해서 학습시키면 무인기는 장애물을 피해서 갈 것이다.....

과연 그럴까?

장애물을 회피한다는 개념을 생각해 보자. 무인기는 목표물에 가까워질수록 보상을 얻는데, 장애물을 회피하기 위해서는 목표물에 가까워지는 게 아니라 오히려 멀어져야 한다.

그림과 같은 장애물에서 장애물을 왼쪽으로 돌아가야 하기 때문에, 왼쪽으로 이동할 때 필연적으로 보상값이 마이너스가 될 수밖에 없다. 보상값을 많이 받기 위해선 앞으로 가야 하는데, 제일 많은 보상값을 받기 위해서는 지금 보상값이 낮아져야 한다.

말 그대로 이보 전진을 위한 일보 후퇴를 해야 하는데, 과연 AI가 이를 이해할 수 있을까?

어... 그게 뭐냐면

 

무인기의 경로방향과 수직인 장애물을 회피하지 못함.

이보 전진을 위한 일보 후퇴를 이해를 못하면 이런 상황이 나온다. 어떻게든 앞으로만 가려고 하지 장애물을 회피한다는 개념이 없다!

기본적으로 PPO알고리즘을 사용하는지라 Hyper Parameters의 Beta값을 조절해 무인기가 랜덤 한 행동을 할 수 있도록 해 어떻게든 운으로 장애물을 넘길 수 있도록 할 수는 있겠지만... 그것은 근본적인 해결책이 되지 않았다(실제로 어마무시한 학습량과 매우 제한적인 환경이 강요된다).

실제로 조금이라도 앞으로 갈 수 있는 장애물이라면 학습을 통해 목표물에 도달할 수 있다.

살짝 앞으로 열려있는 벽

조금이라도 앞으로 갈 수 있다면 그 길을 따라 보상 함수를 더 받을 수 있어 학습이 진행되지만... 그렇지 않은 경우엔 어떻게 해야 할까?

Overfitting 문제 해결

학습 모델을 테스트하던 중 현재 강화학습 환경의 문제점을 발견할 수 있었다.

S자를 그리며 가는 경로

바로 장애물이 없어도 목표물에 곧바로 나아가는 것이 아니라 마치 장애물이 있는 것처럼 휘어져 가는 것이다.

이는 바로 Overfitting문제였는데, 장애물을 충돌로 감지하다 보니 그 장애물이 있는 경로를 그냥 외워버리는 것.

아.....

먼저 이 문제를 해결하기 위해 무인기가 장애물을 인식하게 하는 것이 필요했다. 이 부분은 현실의 Lidar와 비슷한 Unity ML-Agents의 RayPerceptionSensor를 이용해 해결했다. RayPerceptionSensor는 센서가 닿은 곳의 오브젝트와 닿았는지, 닿았다면 거리가 얼마인지 알 수 있다.

무인기 in 산악환경

무인기는 장애물을 인지하면 기존 보상값의 절반만 받는다.

무인기는 최대한 센서에 장애물 닿지 않게 하고 목표물에 도달하기 위해 노력할 것이다.

무인기가 장애물을 인지했을 때 마이너스 절대 값을 주거나, 아니면 멀어질 때 플러스를 해주기 위해 보상값에 -1을 곱해보았지만 절반으로 줄이는 게 제일 좋았다(보상값에 마이너스를 곱했더니 벽을 타고 문워크를 했다😭).

RayPerceptionSensor로 장애물을 감지하며 학습 중인 모습

Sensor의 추가로 학습 환경이 조금 개선되었지만. 추가적인 개선이 필요했다. 근본적인 문제인 무인기가 어떻게 장애물을 회피할 것인가? 장애물 인지까지는 성공했으니 이제 피한다는 개념의 학습이 필요했다.

처음으로 돌아와서 Overfitting이 왜 생기는지 고민을 했다. 그리고 여러 고민 끝에 그 답을 찾을 수 있었다.

 

다양한 환경

현재 무인기 자율운항 프로젝트는 강화학습으로 진행하지만, 다른 지도학습이나 비지도학습에서도 Overfitting이 일어난다. 지도학습, 비지도학습에서는 그 Overfitting을 방지하기 위해 다양한 데이터 셋을 활용한다.

여기서 아차 싶었다.

지금까지 계속 강화학습을 하나의 환경에서만 진행해 왔던 것. 이렇게 되면 Overfitting이 일어날 수밖에 없겠구나.

바로 실행에 옮겼다.

다양한 환경

장애물이 아예 없는 환경, 조금은 앞으로 갈 수 있는 환경에서 벽의 각도를 조절하는 등 다양한 환경에서 학습을 실행시켰다.

드디어 통과?

이제 수직인 벽을 통과할 수는 있게 되었지만 개선사항이 남아있었다.

Overfitting

벽을 만났을 때 오른쪽 벽이 있는 곳에서만 학습해서 왼쪽으로 회피하는 것이 고정되어 버렸다. 이 문제를 해결하기 위해서 더 다양한 환경을 주었다.

더더 다양한 환경
두개가 동시에

이런 식으로 무인기에게 이보 전진을 위한 일보 후퇴를 이해시킬 수 있을 것인가? 는 조금은 성공이지 않았나 싶다. 무인기 자율운항이지만 정해진 경로가 따로 있는 것이 아니기 때문에 더욱 복잡한 환경에선 힘들겠지만, 장애물을 회피할 수 있도록 학습한다라는 초기의 목적은 달성했다고 볼 수 있겠다.

이보전진을 위한 일보후퇴라는 말을 알고 있진 않겠지만, 어찌됐건 학습 성공!

결과물

프로젝트를 진행하는 동안 어떻게 보면 가장 크게 부딪힌 문제였는데, 다양한 환경 구성과 RayPerceptionSensor의 조화로 문제를 해결할 수 있었다.

글의 마무리는 졸업작품 전시회에서 사용했던 영상으로 마무리.

https://youtu.be/bww7y7dfSkc

프로젝트 동영상