진화 알고리즘: 개체군으로 하는 탐색

자주 하는 실수와 요약

자주 하는 실수

실수 나온 문제 바로잡는 법
점수가 터무니없이 큰 답이 나오면 뽑힐 확률도 그만큼 커져야 한다고 봄 1 둘씩 겨루기는 순서만 본다. 점수에 비례해 고르면 극단값 하나가 개체군을 차지한다
한 점 섞기에서 어느 두 자리나 갈라질 확률이 같다고 봄 2 i·j번 자리는 (j − i)/(자리 수 − 1)로 갈라진다. 붙은 묶음일수록 함께 살아남는다
잰 점수가 가장 낮은 답을 빼면 늘 낫다고 봄 3 노이즈가 있으면 운 좋게 높게 잰 답이 오래 남아 부모 자리를 차지한다. 오래된 답을 빼면 다시 재야 살아남는다
스텝을 작게 잡을수록 좋다고 봄 4 성공 확률은 높아도 한 번에 다가가는 거리가 작다. 가장 빠른 스텝은 성공 확률이 중간일 때다
「나쁘지 않으면 성공」과 「좋아야 성공」은 같다고 봄 5 평평한 곳에서 앞쪽은 σ를 키워 건너가게 하고, 뒤쪽은 σ를 줄여 갇히게 한다
1.2배와 0.8배를 똑같이 하면 제자리라고 봄 6 1.2 × 0.8 = 0.96이라 아래로 흐른다. 대신 곱해서 바꾸면 값의 크기와 상관없이 같은 비율로 움직인다
퍼진 정도를 반지름 하나로 잼 7 공분산으로 방향마다 잰다. 한 줄로 놓인 점들은 좁은 타원 하나로 담긴다
공분산을 새 평균에서 잼 8 CMA-ES는 옛 평균에서 잰 스텝으로 공분산을 고친다. 그래야 성공한 스텝의 방향이 쌓인다
얽힌 하이퍼파라미터를 하나씩 맞춤 9 골짜기가 대각선이면 하나씩 맞추기는 지그재그로 간다. 구름이 대각선 방향을 배우게 한다
점수 함수 어림에 상수를 더해도 아무 일 없다고 봄 10, 12 기댓값은 같지만 분산이 커진다. 평균 언저리를 빼거나 거울 뽑기로 짝지어 뺀다
평범한 그래디언트가 「진짜」 그래디언트라고 봄 11 평범한 그래디언트는 축척을 바꾸면 스텝이 달라진다. 자연 그래디언트는 분포가 달라진 정도로 스텝을 재어 축척에 묶이지 않는다

요약

이 장에서 한 일을 정리해 보자. 미분은커녕 「조금 움직이기」도 없는 선택의 문제에서, 유전 알고리즘은 답 여러 개를 개체군으로 들고 고르기, 섞기, 조금 바꾸기를 되풀이했다. 1975년 홀랜드의 책이 이 생각을 적응하는 체계의 모델로 내놓았고, 짧은 좋은 묶음이 섞이는 동안 살아남는다는 것이 그 설명이었다. 기내용 가방 문제에서 같은 820번의 평가로 유전 알고리즘은 평균 53.55점, 아무렇게나 뽑기는 47.30점을 얻었다.

값이 연속이면 진화 전략이 정규분포 노이즈로 스텝을 내디디는데, 1964년 베를린의 바람 터널에서 시작된 이 방법의 첫 숙제는 스텝 크기 σ였다. 레헨베르크의 1/5 규칙은 성공 비율 하나만 세어 σ를 곱해서 고쳤고, 둥근 그릇에서 처음 σ를 천 배 다르게 잡아도 스텝이 남은 거리를 따라 줄어들었다.

둥근 구름은 길쭉하고 휜 골짜기에서 막힌다. CMA-ES는 옛 평균에서 잰 좋은 점들의 스텝으로 공분산을 고쳐, 구름의 방향과 축마다의 길이를 배운다. 로젠브록 함수에서 구름은 바닥 근처 골짜기의 방향(63.5° 대 63.3°)과 길쭉한 정도(√2508 = 50.08 대 40.24)를 거의 그대로 베꼈고, 10⁻⁴까지의 평가 수를 9045번에서 636번으로 줄였다.

자연 진화 전략은 이 모든 방법을 「탐색 분포의 파라미터를 고치는 일」로 다시 본다. 뽑은 점의 평균 비용의 그래디언트는 로그 미분 꾀로 비용을 미분하지 않고 어림할 수 있고, 그 꼴은 REINFORCE와 같다. 평범한 그래디언트는 σ가 줄수록 스텝이 커져 무너지고, 피셔 행렬의 역을 곱한 자연 그래디언트는 스텝을 분포의 폭에 맞춰 σ를 곱셈으로 고친다. 2017년 오픈AI는 같은 꼴의 어림으로 신경망 정책을 학습하며, 일꾼들이 씨앗을 맞춰 두고 보상 숫자 하나만 주고받게 해서 1,440코어로 10분 만에 로봇을 걷게 했다.

막힌 곳

이 장의 방법들은 모두 함수 값만 재고 함수 안을 들여다보지 않았기 때문에, 파라미터가 많아질수록 값을 더 많이 재야 했다. 오픈AI의 진화 전략은 일꾼 1,440명이 각자 게임을 한 판씩 해야 한 스텝을 내디뎠고, 100차원의 흉내에서도 보상 20번으로 어림한 그래디언트는 참 그래디언트와 코사인이 0.3에 그쳤다. 신경망의 파라미터는 수백만, 수십억 개다.

그런데 신경망의 손실은 우리가 모르는 바람 터널이 아니다. 곱하고 더하고 비선형 함수를 씌우는 계산을 층마다 거친 결과이고, 그 계산 과정은 우리가 다 적어 둔 것이다. 계산 과정을 다 안다면, 파라미터 하나하나를 흔들어 볼 필요 없이 그래디언트 전체를 함수 값 한두 번 계산하는 품으로 얻을 수는 없을까?