자율주행이나 자동주차라고 하면 대개 방대한 데이터로 학습한 심층 신경망을 떠올린다. 그러나 소프트웨어 엔지니어 트레흘레브(trekhleb)가 공개한 실험은 조금 다른 접근을 택한다. 신경망을 직접 훈련시키는 대신, 자동차의 행동을 결정하는 '유전자(genome)'를 진화시켜 스스로 주차하는 법을 찾아가게 만든 것이다. 이 프로젝트는 브라우저에서 바로 돌려볼 수 있는 '자동주차 진화 시뮬레이터'로 공개되어 있고, 유전 알고리즘 핵심 로직은 타입스크립트로 구현되어 저장소에서 전체 코드를 확인할 수 있다.
무작위에서 시작하는 진화
실험의 출발점은 완전한 무작위다. 1세대 자동차들은 임의의 유전자를 가진 채 생성되며, 목적 없이 제멋대로 움직인다. 세대를 거듭하며 대략 40세대쯤에 이르면 자동차들은 '자동주차가 무엇인지'를 어렴풋이 이해하기 시작하고 주차 공간에 조금씩 가까이 다가선다. 저자 스스로 인정하듯 이 시점의 자동차는 여전히 다른 차를 들이받기도 하고 주차 칸에 완벽히 들어맞지도 못한다. 다만 이는 그들에게 세상이 창조된 지 겨우 40세대밖에 지나지 않은 결과라는 점을 감안해야 한다. 완성된 제품이 아니라 진화 과정 자체를 관찰하는 것이 이 실험의 핵심이다.
유전 알고리즘의 발상은 생물의 자연선택을 모방한다. 각 개체(자동차)는 유전자로 표현되고, 주어진 과제를 얼마나 잘 수행하는지에 따라 평가된다. 성적이 좋은 개체의 유전자가 다음 세대로 더 많이 전달되고, 교차와 돌연변이를 거치며 조금씩 변형된 자손이 태어난다. 이 순환을 반복하면 명시적으로 '이렇게 운전하라'고 규칙을 짜 넣지 않아도, 집단 전체가 점차 과제에 적합한 행동으로 수렴해 간다. 저자는 이 글이 유전 알고리즘의 기초만 다룰 뿐 완전한 이론 안내서는 아니라고 분명히 선을 긋는다.
고수준 과제를 180비트 최적화로 환원하기
이 프로젝트에서 가장 음미할 만한 지점은 문제를 재정의하는 방식이다. '자동주차하는 자동차를 만든다'는 추상적이고 막연한 고수준 과제를, 저자는 단계적으로 쪼개어 '180개 비트의 최적 조합을 찾는' 명확한 저수준 최적화 문제로 바꾼다. 즉 최적의 자동차 유전자란 결국 180비트짜리 이진 문자열 하나이며, 진화가 하는 일은 이 거대한 탐색 공간에서 가장 나은 조합을 찾아내는 것이다. 복잡해 보이는 행동 학습을 이산적인 탐색 문제로 환원하는 이 사고법은, 유전 알고리즘뿐 아니라 실무에서 어려운 문제를 다룰 때 두고두고 참고할 만한 틀이다.
자동차가 실제로 움직이려면 '근육'이 필요하다. 저자는 자동차에 두 종류의 근육을 부여하는 방식으로 행동을 구성한다. 유전자에 담긴 비트들이 이 근육들의 동작으로 해석되고, 그 결과가 자동차의 궤적으로 나타나는 구조다. 이렇게 유전자와 실제 움직임 사이를 연결하는 표현(representation)을 어떻게 설계하느냐가 진화 알고리즘의 성패를 좌우하는데, 문제를 비트 조합으로 정리해 둔 덕분에 교차와 돌연변이 같은 유전 연산을 단순하고 일관되게 적용할 수 있다.
실무자에게 주는 함의와 한계
한국의 IT 실무자에게 이 실험이 갖는 가치는 자동주차라는 결과물 자체보다 접근 방법에 있다. 라벨링된 대규모 데이터셋이나 미분 가능한 손실 함수를 마련하기 어려운 문제, 예컨대 파라미터 조합 탐색이나 스케줄링, 배치 최적화처럼 정답을 직접 가르치기 힘든 영역에서 유전 알고리즘은 여전히 실용적인 선택지가 된다. 게다가 이 프로젝트는 전 과정을 타입스크립트로 작성해 브라우저에서 시각적으로 돌려볼 수 있게 해 두었기 때문에, 알고리즘을 처음 접하는 개발자가 세대별 변화를 눈으로 확인하며 감을 익히기에 적합하다.
동시에 분명한 한계도 함께 읽어야 한다. 40세대 시점의 자동차가 충돌을 일으키고 주차 정밀도가 떨어진다는 사실은, 유전 알고리즘이 만족스러운 해에 도달하기까지 많은 세대의 반복 연산을 필요로 한다는 점을 보여준다. 진화의 결과가 항상 전역 최적해라는 보장도 없고, 유전자 표현과 평가 기준을 어떻게 설계하느냐에 따라 수렴 속도와 품질이 크게 달라진다. 결국 이 실험은 프로덕션용 자동주차 솔루션이 아니라, 어려운 문제를 탐색 가능한 형태로 바꾸고 반복을 통해 개선해 가는 사고의 훈련 사례로 받아들이는 것이 가장 정확하다.