Artoke

리깅: 최소제곱법 — 데이터로 스키닝 웨이트를 구하는 수학

리깅: 최소제곱법 — 데이터로 스키닝 웨이트를 구하는 수학 대표 이미지
출처: 최소제곱법 — 데이터로 스키닝 웨이트를 구하는 수학

스키닝 웨이트를 손으로 칠하다 보면 이런 생각이 든다. "이거, 정답이 어딘가에 있고 나는 그 근처를 헤매는 거 아닌가?" 실제로 그렇다. 정답에 해당하는 게 있고, 그걸 데이터에서 뽑아내는 계산법이 있다. 최소제곱법이다.

이름은 딱딱하지만 하는 일은 단순하다. 관측한 값과 모델이 예측한 값의 차이를 제곱해서 다 더하고, 그 합이 가장 작아지는 모델을 고른다. 그게 전부다. 여기서는 그 "전부"를 하나씩 뜯어본다.

잔차부터 — 틀린 정도를 숫자로 바꾸기

데이터 점이 개 있다고 하자. 번째 점의 입력은 , 관측된 출력은 다. 리깅으로 치면 는 관절 각도, 는 그 각도에서 실제로 스캔된 정점 위치라고 보면 된다.

모델은 파라미터 를 가진 함수 다. 이 함수가 뱉는 값이 예측값이고, 관측값과 예측값의 차이를 잔차(residual)라고 부른다.

기호를 풀면 이렇다. 번째 점에서 모델이 얼마나 빗나갔는지, 는 현실이 알려준 값, 는 모델이 주장하는 값. 가 0이면 그 점에서는 모델이 완벽하게 맞은 것이고, 부호는 모델이 위로 빗나갔는지 아래로 빗나갔는지를 알려준다.

문제는 이 부호다. 잔차를 그냥 다 더하면 이 상쇄돼서 0이 나온다. 엉망으로 틀린 모델이 완벽한 모델처럼 보인다. 그래서 제곱한다.

는 잔차제곱합(sum of squared residuals)이다. 를 1부터 까지 바꿔가며 뒤의 것을 전부 더하라는 뜻. 제곱은 두 가지 일을 한다. 부호를 없애고, 큰 오차에 더 큰 벌점을 준다. 잔차가 2배가 되면 벌점은 4배가 된다. 절댓값을 쓰지 않고 굳이 제곱을 쓰는 이유 중 하나가 이거다. 나머지 이유는 뒤에서 나온다.

이제 목표가 명확해졌다. 를 최소로 만드는 를 찾는 것.

직선 하나로 시작하기

가장 단순한 모델부터 보자. 직선이다.

는 절편, 은 기울기. 이 둘만 정하면 직선이 하나 결정된다. 잔차제곱합은 이렇게 된다.

에 대한 이차함수다. 이차함수의 최솟값은 어디 있나. 미분해서 0이 되는 곳이다. 변수가 둘이니 각각에 대해 편미분한다.

는 "은 고정해두고 만 살짝 건드렸을 때 가 얼마나 변하나"를 뜻한다. 이게 0이라는 건 그 방향으로는 더 내려갈 곳이 없다는 뜻이고, 두 편미분이 동시에 0이면 바닥에 도착한 것이다.

리깅: 최소제곱법 — 데이터로 스키닝 웨이트를 구하는 수학 도식

위 두 식을 정리하면 정규방정식(normal equations)이 나온다.

미지수 둘에 식 둘. 풀면 답이 딱 떨어진다.

는 각각 값들의 평균, 값들의 평균이다. 모자 기호 는 "이건 데이터로부터 추정한 값"이라는 표시다. 참값 와 추정값 를 구분하려고 붙인다.

분자를 보면 가 평균보다 클 때 도 평균보다 큰 경향이 있으면 양수가 커진다. 분모는 가 얼마나 퍼져 있는지다. 기울기는 "같이 움직이는 정도"를 "가 움직이는 정도"로 나눈 값인 셈이다.

행렬로 접으면 훨씬 짧아진다

파라미터가 둘일 때는 손으로 풀 만하다. 스키닝 웨이트처럼 관절이 열 개, 스무 개면? 편미분식을 스무 개 세우고 연립방정식을 손으로 정리할 수는 없다. 행렬로 접으면 표기가 갑자기 짧아진다.

관측값을 세로로 쌓은 벡터 , 파라미터를 쌓은 벡터 , 그리고 입력을 담은 행렬 를 만든다.

크기다. 행 개수 은 데이터 점의 수, 열 개수 는 파라미터의 수. 첫 열이 전부 1인 이유는 절편 에 곱해질 자리이기 때문이다. 이 를 설계행렬(design matrix)이라 부른다.

이제 잔차제곱합이 한 줄로 써진다.

는 벡터의 길이, 는 전치(행과 열을 뒤집기)다. 벡터를 자기 자신의 전치와 곱하면 각 성분의 제곱합이 나온다. 앞에서 이라 썼던 걸 그냥 벡터 길이의 제곱으로 부른 것뿐이다.

로 미분해서 0으로 놓으면 정규방정식이 이렇게 압축된다.

파라미터가 2개든 200개든 이 식 하나다. 정사각행렬이고, 은 역행렬이다.

실무에서는 역행렬을 직접 구하지 않는다. 수치적으로 불안정해서다. 를 만드는 순간 조건수가 제곱으로 나빠지기 때문에, QR 분해나 SVD로 정규방정식을 우회해서 푸는 게 표준이다. 수식으로는 역행렬이지만 코드로는 solvelstsq를 쓴다고 기억해두면 된다.

왜 하필 제곱인가 — 직교 투영

기하학으로 보면 이 식이 왜 이렇게 생겼는지가 보인다.

의 열들을 만큼씩 섞은 결과다. 를 어떻게 바꾸든 의 열들이 만드는 평면(열공간) 안에서만 움직인다. 그런데 는 보통 그 평면 위에 없다. 데이터에는 노이즈가 있으니까.

그러면 평면 위의 점 중에서 에 가장 가까운 점은 어디인가. 에서 평면에 수직으로 내린 발이다. 최소제곱해는 정확히 그 발이다.

리깅: 최소제곱법 — 데이터로 스키닝 웨이트를 구하는 수학 도식

수직이라는 조건을 식으로 쓰면 이렇다. 잔차 벡터 의 모든 열과 직교해야 한다.

이걸 전개하면 아까 그 정규방정식이다. 미분으로 유도한 결과와 기하로 유도한 결과가 같은 곳에 도착한다. 절댓값 대신 제곱을 쓰는 진짜 이유가 여기 있다. 제곱은 거리의 개념과 맞물려 있고, 거리가 개입하는 순간 "수직으로 내려라"라는 깔끔한 답이 따라 나온다. 절댓값을 쓰면 미분이 안 되는 지점이 생기고 닫힌 해도 사라진다.

스키닝 웨이트로 옮겨오면

이제 리깅 문제로 돌아온다. 정점 하나가 관절 개의 영향을 받는다고 하자. 선형 블렌드 스키닝에서 정점의 최종 위치는 이렇다.

는 바인드 포즈에서의 정점 위치, 번 관절의 변환행렬, 는 그 관절의 웨이트, 는 결과 위치다. 웨이트 가 우리가 모르는 값, 즉 에 해당한다.

여러 포즈에서 스캔한 정점 위치가 있다고 하자. 포즈 에서 관측된 위치를 라 하면, 우리가 최소화할 대상은 이렇게 생겼다.

는 포즈의 개수. 중요한 건 가 식 안에서 선형으로 들어간다는 점이다. 는 웨이트와 무관하게 미리 계산할 수 있는 상수 벡터니까, 이건 그냥 꼴이다. 설계행렬 의 각 열이 관절 하나가 정점을 끌고 가는 방향이 된다. 포즈가 관절 수보다 충분히 많으면 방정식이 미지수보다 많아지고, 그때 최소제곱법이 일할 자리가 생긴다.

다만 그대로 풀면 문제가 생긴다. 웨이트에는 물리적 제약이 있다.

합이 1이어야 하고 음수면 안 된다. 그냥 최소제곱을 풀면 같은 값이 튀어나와서 정점이 엉뚱한 데로 날아간다. 그래서 실무에서는 제약이 붙은 형태로 푼다. 음수를 금지하는 NNLS(non-negative least squares), 합을 1로 묶는 등식 제약, 그리고 여기에 웨이트가 너무 많은 관절에 퍼지지 않도록 하는 희소성 항까지 얹는다.

정규화를 넣는 형태는 이렇다.

는 정규화 강도다. 가 0이면 원래 최소제곱, 크게 하면 웨이트가 전반적으로 작고 부드러워진다. 데이터가 적거나 관절끼리 움직임이 비슷해서 가 거의 특이행렬일 때 이 항이 해를 안정시킨다. 릿지 회귀라고 부르는 게 이거다.

결과를 믿어도 되는지 확인하기

계산이 끝났다고 답이 옳은 건 아니다. 최소제곱법은 몇 가지를 조용히 가정한다.

첫째, 오차의 분산이 모든 점에서 비슷해야 한다. 이걸 등분산성이라 하는데, 깨지면 아래 그림처럼 잔차가 한쪽으로 갈수록 부채꼴로 벌어진다. 이 경우 추정값 자체는 크게 틀리지 않지만 신뢰구간이 엉망이 된다. 리깅에서는 특정 포즈에서만 스캔 노이즈가 유독 큰 상황이 여기 해당한다. 해법은 가중최소제곱이다. 신뢰도가 낮은 관측에 작은 가중치 를 준다.

이분산성으로 잔차가 부채꼴로 벌어지는 산점도
"Fanning out" effect of heteroscedasticity · 출처: 최소제곱법 — 데이터로 스키닝 웨이트를 구하는 수학

둘째, 제곱은 큰 오차에 큰 벌점을 주기 때문에 이상치에 약하다. 스캔 데이터에 튄 정점 하나가 웨이트 전체를 끌고 갈 수 있다. 잔차 그래프를 그려보고, 유독 튀는 점이 있으면 잘라내거나 후버 손실 같은 강건한 대안으로 바꾼다.

셋째, 모델의 형태가 데이터를 담을 수 있어야 한다. 직선으로는 못 담을 곡선을 직선으로 맞추면 잔차가 무작위가 아니라 규칙적인 패턴을 그린다. 잔차를 에 대해 찍었을 때 파도 모양이 보이면 모델 차수를 올리라는 신호다.

이 방법이 처음 세상에 나온 건 1805년 르장드르의 논문이고, 가우스는 1809년에 이걸 확률론과 묶어 정당화했다. 오차가 정규분포를 따를 때 최소제곱해가 최대가능도 추정과 일치한다는 게 가우스의 주장이었다. 200년 넘게 살아남은 이유는 단순해서다. 목표를 제곱합으로 정하는 순간, 답이 선형방정식 하나로 떨어진다.

칼 프리드리히 가우스의 초상
Carl Friedrich Gauss · 출처: 최소제곱법 — 데이터로 스키닝 웨이트를 구하는 수학

정리

순서를 되짚으면 이렇다. 틀린 정도를 잔차로 정의하고, 부호를 없애려고 제곱하고, 다 더한 값을 최소화하고, 미분해서 0으로 놓으면 정규방정식이 나온다. 행렬로 쓰면 한 줄이고, 기하로 보면 관측 벡터를 모델이 닿을 수 있는 평면에 수직으로 내린 발이다.

스키닝 웨이트를 데이터에서 뽑는 도구들은 대부분 이 골격 위에 제약과 정규화를 얹은 것이다. 웨이트가 이상하게 나올 때 어디를 봐야 하는지 — 데이터가 부족한지, 관절 움직임이 서로 너무 비슷한지, 이상치가 하나 섞였는지 — 는 이 구조를 알고 있으면 짚어낼 수 있다.

함께 읽기 — 이 글이 쓰는 기초 수학

출처

광고

리깅 파이프라인 자동화 도구

반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.

리깅 도구 보기