129강 문제 4에서 일변수 변환을 다뤘습니다.
길이가 늘어나면 밀도가 묽어지므로 그 변화율로 보정했습니다. 그리고 이것이 105강의 변수변환 공식과 같은 식이라고 했습니다.
이제 여러 변수를 한꺼번에 변환합니다.
길이가 부피로, 미분이 야코비 행렬식으로 바뀐 것뿐입니다. 105강의 공식이 글자 그대로 돌아옵니다.
| 강의 | 상황 | 인자 |
|---|---|---|
| 105 | 이중적분 변수변환 | |
| 129 | 일변수 확률변수 변환 | |
| 139 | 다변수 확률변수 변환 |
이 강의에서 두 가지를 갚습니다. 130강 심화 2에서 박스뮐러 변환을 소개만 하고 넘어갔는데 여기서 정식으로 유도하고, 141강에서 다룰 합의 분포가 왜 합성곱인지를 변환 공식으로 설명합니다.
그리고 마지막으로 263강 정규화 흐름의 뼈대를 놓습니다. 변환을 여러 번 합성하면 로그 야코비가 더해지므로, 야코비 행렬식을 싸게 계산할 수 있는 구조를 설계하는 것이 그 분야의 핵심 과제가 됩니다.
문제. 가 의 밀도입니다. , 로 바꿉니다.
(1) 역변환과 야코비 행렬식을 구하세요.
(2) 새 밀도를 쓰세요.
(3) 적분이 보존되는지 확인하세요.
생각의 실마리. 105강에서 이중적분의 변수변환에 가 붙었습니다. 밀도도 넓이당 확률이므로 같은 보정이 필요할 것입니다.
풀이. (1) 역변환은 , 이므로
(2) 따라서 새 밀도는
입니다. **이므로 앞의 인자가 그대로 **입니다.
검산에서 확인됩니다.
| 대응하는 | f_ | 정의역 | |
|---|---|---|---|
| 안입니다 | |||
| 안입니다 | |||
| 안입니다 | |||
| 안입니다 |
(3) 적분을 비교합니다.
| 적분 | 값 |
|---|---|
| 원래 over [0,1]^ | |
| 변환 후 over 마름모 영역 |
둘째 줄의 오차 는 격자의 한계입니다. 공간에서 정의역이 마름모라 경계가 대각선인데, 직사각 격자로는 그 경계를 정확히 맞출 수 없습니다. 격자를 더 촘촘히 하면 줄어듭니다.
이 문제에서 배우는 것: 다변수 변환 공식.
다변수 변환. 이고 가 가역이며 미분가능하면
직관이 129강과 같습니다. 작은 상자 가 로 옮겨질 때 확률이 보존되어야 합니다.
79강에서 행렬식이 부피 배율이라고 했으므로 이며, 대입하면 공식이 나옵니다.
정방향과 역방향의 관계. 두 야코비 행렬식이 서로 역수입니다.
66강의 역행렬 성질이며, 어느 쪽을 계산해도 됩니다. 실무에서는 계산하기 쉬운 쪽을 씁니다.
정의역이 어떻게 옮겨지는지도 반드시 봐야 합니다. 이 문제에서 이 평면의 마름모가 되었고, 그 밖에서는 밀도가 입니다. 공식만 쓰고 정의역을 빠뜨리는 것이 가장 흔한 실수입니다.
바로 확인 1.
확인 1-1. 다변수 변환 공식을 쓰세요.
답. 입니다.
확인 1-2. 야코비 행렬식이 붙는 이유를 쓰세요.
답. 행렬식이 부피 배율이라 상자의 부피 변화를 보정하기 때문입니다.
확인 1-3. 공식과 함께 반드시 확인할 것을 쓰세요.
답. 정의역이 어떻게 옮겨지는지입니다.
문제. 인 경우를 봅니다.
(1) 여러 에서 와 밀도 배율을 구하세요.
(2) 회전과 특이행렬을 비교하세요.
(3) 표준정규를 변환하면 공분산이 어떻게 되는지 보세요.
생각의 실마리. 이면 야코비 행렬이 자체입니다. 위치에 의존하지 않습니다.
풀이. (1)(2) 검산 결과입니다.
| 부피 배율 | 밀도 배율 | ||
|---|---|---|---|
| \begin{pmatrix}2&0\\0&3\end | |||
| \begin{pmatrix}1&1\\0&1\end | |||
| 회전 | |||
| 특이 | 정의 안 됨 |
둘째 줄의 전단변환은 모양을 비틀지만 넓이를 보존합니다.
셋째 줄의 회전은 밀도를 전혀 바꾸지 않습니다. 직교행렬이라 입니다.
넷째 줄에서 밀도가 정의되지 않습니다. 특이행렬은 평면을 직선으로 눌러 부피를 으로 만들며, 변환된 분포가 그 직선 위에 몰려 밀도가 없습니다.
(3) 표준정규를 로 변환하면 공분산이 이 됩니다. 이면
이 문제에서 배우는 것: 선형변환의 밀도.
선형변환. 이고 가 가역이면
야코비가 상수라 위치에 무관합니다. 일변수의 가 그대로 확장된 것입니다.
모멘트도 함께 변합니다.
둘째 식이 138강 문제 5의 이차형식입니다. 실제로
이며 133강 문제 3의 의 행렬판입니다.
행렬식도 따라옵니다. 79강의 곱셈 성질로
이 사실이 백색화의 근거입니다. 일 때 로 두면
공분산이 단위행렬이 되어 모든 방향의 분산이 같아집니다. 138강 심화 6에서 언급한 전처리이며, 86강의 스펙트럼 정리가 도구입니다.
바로 확인 2.
확인 2-1. 선형변환의 밀도 공식을 쓰세요.
답. 입니다.
확인 2-2. 회전이 밀도를 바꾸지 않는 이유를 쓰세요.
답. 직교행렬이라 이고 부피를 보존하기 때문입니다.
확인 2-3. 선형변환 후의 공분산을 쓰세요.
답. 입니다.
문제. 이 독립일 때
(1) 역변환을 구하세요.
(2) 야코비 행렬식을 계산하세요.
(3) 의 결합밀도를 구하세요.
생각의 실마리. 126강 심화 4의 역변환 표집은 일변수였고 정규분포에는 이 닫힌 형태로 없었습니다. 두 개를 한꺼번에 만들면 극좌표로 풀립니다.
풀이. (1) 제곱해서 더하면 이므로
(2) 검산 결과입니다.
| 수치 | 차이 | ||
|---|---|---|---|
| 2.17\times10^ | |||
| 2.25\times10^ | |||
| 2.99\times10^ | |||
| 9.16\times10^ |
야코비 행렬식이 정확히 표준정규 밀도의 곱입니다.
(3) 균등분포의 밀도가 이므로
곱으로 갈라지므로 독립인 표준정규 두 개입니다.
이 문제에서 배우는 것: 박스뮐러 변환.
박스뮐러 변환. 독립 균등난수 두 개에서 독립 표준정규난수 두 개를 정확히 만듭니다.
손으로 계산해도 나옵니다. 편미분을 정리하면
이며 , 입니다. 행렬식을 계산하면
이 정확히 약분됩니다.
왜 극좌표인가. 표준정규 두 개의 결합밀도가 회전 대칭이기 때문입니다.
각도에 의존하지 않습니다.
130강 문제 1에서 가우스 적분을 극좌표로 풀었던 것과 같은 구조입니다. 그때는 적분을 계산하려고 극좌표로 갔고, 여기서는 난수를 만들려고 극좌표에서 출발합니다.
두 성분을 나눠 보면 명확합니다.
| 극좌표 성분 | 분포 | 어디서 오는가 |
|---|---|---|
| 각도 \Theta=2\pi U_ | 에 균등 | 회전 대칭 |
| 반지름 제곱 R^{2}=-2\log U_ | \text{Exp}(1/2)=\chi^{2}_ | 131강 |
둘째 줄이 131강 문제 4와 이어집니다. 이며, 지수분포는 126강 심화 4의 역변환 표집으로 에서 바로 나옵니다.
실무에서 개선판을 씁니다. 삼각함수 계산이 비싸므로 극좌표 방법이라는 변형을 쓰는데, 단위원 안에 점이 들어올 때까지 거절하고 그 점의 좌표로 코사인과 사인을 대신합니다. 오늘날에는 지구랏 방법이 더 빠릅니다.
바로 확인 3.
확인 3-1. 박스뮐러 변환이 무엇을 무엇으로 바꾸는지 쓰세요.
답. 독립 균등난수 두 개를 독립 표준정규난수 두 개로 바꿉니다.
확인 3-2. 극좌표를 쓰는 이유를 쓰세요.
답. 표준정규 두 개의 결합밀도가 회전 대칭이기 때문입니다.
확인 3-3. 두 극좌표 성분의 분포를 쓰세요.
답. 각도는 균등이고 반지름 제곱은 입니다.
문제. 의 분포를 변환 공식으로 구합니다.
(1) 차원을 맞추는 방법을 쓰세요.
(2) 야코비 행렬식을 구하세요.
(3) 지수분포 두 개의 합에서 확인하세요.
생각의 실마리. 변환 공식은 차원이 같아야 쓸 수 있습니다. 는 차원인데 는 차원이라 그대로는 안 됩니다.
풀이. (1) 보조변수 를 넣어 로 만듭니다. 차원 대 차원이 됩니다.
(2) 역변환은 , 이므로
따라서
이고 를 주변화하면
이것이 합성곱입니다.
(3) 독립 지수분포 두 개에서 확인합니다.
| 합성곱 수치 | 이론 | 차이 | |
|---|---|---|---|
| 1.39\times10^ |
131강 문제 2에서 확인한 것과 같습니다.
이 문제에서 배우는 것: 보조변수 기법.
차원 맞추기. 출력 차원이 입력보다 작으면 보조변수를 넣어 가역 변환을 만들고 나중에 주변화합니다.
어떤 보조변수를 넣어도 됩니다. 가 흔하지만 나 도 가능하며, 계산이 쉬운 것을 고릅니다.
합성곱이 이 기법의 가장 중요한 결과입니다.
독립 합의 밀도. 와 가 독립이면
141강에서 정면으로 다루며, 134강 문제 3에서 본 대로 적률생성함수로는 곱셈 한 번으로 끝나는 계산입니다.
| 방법 | 계산 |
|---|---|
| 변환 공식 + 주변화 | 적분 하나 |
| 적률생성함수 | 곱셈 하나 |
| 특성함수 | 곱셈 하나 |
둘째와 셋째가 훨씬 쉬운 이유는 58강의 푸리에 변환이 합성곱을 곱으로 바꾸기 때문입니다.
차이와 곱, 비도 같은 방법으로 다룹니다.
| 목표 | 보조변수 | 결과 |
|---|---|---|
| 합성곱 | ||
| 상관 | ||
| 멜린 합성곱 | ||
| 비의 분포 |
넷째 줄에서 코시분포가 나옵니다. 독립 표준정규 두 개의 비가 코시분포이며, 132강 문제 4에서 평균이 없다고 한 그 분포입니다.
바로 확인 4.
확인 4-1. 출력 차원이 작을 때 무엇을 하는지 쓰세요.
답. 보조변수를 넣어 가역 변환을 만들고 나중에 주변화합니다.
확인 4-2. 에서 야코비 행렬식을 쓰세요.
답. 입니다.
확인 4-3. 독립 합의 밀도를 쓰세요.
답. 이며 합성곱입니다.
문제. 선형변환 세 개를 차례로 적용합니다.
(1) 각 층의 과 를 구하세요.
(2) 누적 로그를 합성 행렬의 값과 비교하세요.
(3) 이 성질의 함의를 쓰세요.
생각의 실마리. 합성함수의 야코비는 각 야코비의 곱입니다. 97강의 연쇄법칙이며, 행렬식은 79강의 곱셈 성질로 곱이 됩니다.
풀이. (1)(2) 검산 결과입니다.
| 층 | \det A_ | 누적 로그 | |
|---|---|---|---|
합성 행렬의 이 이고 가 로 **누적 합과 차이가 **입니다.
(3) 층을 쌓아도 계산이 선형입니다.
이 문제에서 배우는 것: 합성과 로그 야코비.
합성의 야코비. 이면
97강의 연쇄법칙과 79강의 행렬식 곱셈 성질이 결합한 결과입니다.
이것이 정규화 흐름의 원리입니다.
단순한 분포(대개 표준정규)에서 출발해 가역 변환을 여러 번 씌워 복잡한 분포를 만들며, 로그가능도를 정확히 계산할 수 있습니다.
핵심 과제가 야코비 행렬식의 계산 비용입니다.
| 구조 | 야코비 행렬 | 계산 비용 |
|---|---|---|
| 일반 밀집 | 가득 찬 행렬 | |
| 삼각 (자기회귀) | 삼각행렬 | 대각 곱 |
| 커플링 (RealNVP) | 블록 삼각 | 대각 곱 |
| 직교 (회전) | 직교행렬 |
둘째 줄이 78강의 결과입니다. 삼각행렬의 행렬식이 대각 성분의 곱이므로 에 끝납니다.
셋째 줄이 실무의 표준입니다. 입력을 두 조각으로 나누고 한쪽은 그대로 두고 다른 쪽만 첫째 조각의 함수로 변환합니다.
**야코비가 블록 하삼각이라 행렬식이 **이며, 와 가 아무리 복잡한 신경망이어도 계산이 입니다.
이 강의의 세 도구가 모두 여기서 쓰입니다.
| 도구 | 어디에 |
|---|---|
| 변환 공식 | 밀도를 옮기는 규칙 |
| 야코비 행렬식 | 부피 보정 |
| 합성의 로그 가법성 | 층을 쌓는 근거 |
263강에서 정면으로 다룹니다.
바로 확인 5.
확인 5-1. 합성 변환의 로그 야코비를 쓰세요.
답. 각 층의 로그 야코비의 합입니다.
확인 5-2. 그 근거가 되는 두 정리를 쓰세요.
답. 97강의 연쇄법칙과 79강의 행렬식 곱셈 성질입니다.
확인 5-3. 삼각 구조를 쓰는 이유를 쓰세요.
답. 행렬식이 대각 성분의 곱이라 에 계산되기 때문입니다.
| 개념 | 식 |
|---|---|
| 다변수 변환 | |
| 역방향 관계 | |
| 선형변환 | |
| 변환 후 공분산 | A\Sigma A^ |
| 보조변수 | 차원을 맞추고 나중에 주변화 |
| 독립 합 | |
| 합성 | 가 더해집니다 |
| 변환 | |
|---|---|
| 회전, 직교 | |
| 전단 | |
| 대각 확대 | 대각 성분의 곱 |
| 삼각 | 대각 성분의 곱 |
| 특이 | , 밀도 없음 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 정의역을 옮기지 않습니다 | 새 영역을 반드시 구합니다 |
| 절댓값을 빠뜨립니다 | 확률은 부호가 없습니다 |
| 차원이 다른데 그대로 씁니다 | 보조변수를 넣습니다 |
| 특이변환에 밀도를 씁니다 | 부피가 이라 없습니다 |
문제 6. 다변수 변환 공식을 쓰세요.
답. 입니다.
문제 7. 야코비 행렬식이 붙는 이유를 쓰세요.
답. 행렬식이 부피 배율이라 상자의 부피 변화를 보정하기 때문입니다.
문제 8. 정방향과 역방향 야코비의 관계를 쓰세요.
답. 서로 역수입니다.
문제 9. 공식과 함께 반드시 확인할 것을 쓰세요.
답. 정의역이 어떻게 옮겨지는지입니다.
문제 10. 선형변환의 밀도 공식을 쓰세요.
답. 입니다.
문제 11. 회전이 밀도를 바꾸지 않는 이유를 쓰세요.
답. 직교행렬이라 이기 때문입니다.
문제 12. 특이행렬로 변환하면 왜 밀도가 없는지 쓰세요.
답. 부피를 으로 눌러 분포가 저차원 집합에 몰리기 때문입니다.
문제 13. 선형변환 후의 평균과 공분산을 쓰세요.
답. 와 입니다.
문제 14. 백색화 변환을 쓰세요.
답. 일 때 을 씁니다.
문제 15. 박스뮐러 변환과 극좌표를 쓰는 이유를 쓰세요.
답. 균등난수 둘에서 정규난수 둘을 만들며 결합밀도가 회전 대칭이기 때문입니다.
문제 16. 박스뮐러의 두 극좌표 성분의 분포를 쓰세요.
답. 각도는 균등이고 반지름 제곱은 입니다.
문제 17. 출력 차원이 작을 때의 기법과 의 결과를 쓰세요.
답. 보조변수를 넣고 주변화하며 결과가 합성곱입니다.
문제 18. 합성 변환의 로그 야코비와 그 근거를 쓰세요.
답. 각 층의 합이며 연쇄법칙과 행렬식 곱셈 성질이 근거입니다.
심화 1. 단조가 아닌 다변수 변환을 다루세요.
129강 심화 3에서 일변수의 다대일 변환은 각 역상에 야코비를 곱해 더한다고 했습니다. 다변수도 같습니다.
정의역을 조각으로 나눠 각 조각에서 가역이 되게 하고 결과를 더합니다.
극좌표가 좋은 예입니다. 는 원점을 빼면 가역이지만, 의 범위를 로 정해야 유일해집니다.
| 변환 | 조각 나누기 |
|---|---|
| 과 | |
| 극좌표 | 각도 범위를 고정 |
| 대각선 기준 두 조각 |
측도 인 집합은 무시해도 됩니다. 원점 하나나 축 하나는 확률이 이므로 밀도 계산에 영향이 없습니다. 121강 문제 5의 관찰이 여기서 실용적으로 쓰입니다.
심화 2. 순서통계량의 결합분포를 유도하세요.
이 독립 동일분포일 때 크기순으로 정렬한 것을 순서통계량이라 합니다.
정렬은 다대일 변환입니다. 개의 순열이 모두 같은 정렬 결과를 주므로 심화 1의 규칙으로
**야코비 행렬식은 **입니다. 정렬이 좌표를 바꿔 다는 것뿐이라 부피가 보존됩니다.
개별 순서통계량의 밀도도 나옵니다.
개가 아래에, 개가 위에, 하나가 에 있는 경우의 수이며 122강의 다항계수입니다.
126강 문제 4의 최댓값과 최솟값이 특수한 경우입니다. 이면 이고 이것이 의 도함수입니다.
균등분포의 순서통계량이 베타분포입니다. 를 넣으면
131강 심화 3의 베타분포가 여기서 나오며, 분위수 추정의 정확도를 계산하는 근거입니다.
심화 3. 확률적분변환을 정리하세요.
126강 심화 4의 역변환 표집을 뒤집으면 강력한 결과가 나옵니다.
확률적분변환. 의 분포함수가 연속인 이면
어떤 연속분포든 균등분포로 옮길 수 있습니다.
증명이 한 줄입니다.
이 변환이 여러 곳에서 쓰입니다.
| 쓰임 | 어떻게 |
|---|---|
| 적합도 검정 | 변환 후 균등성을 검사 |
| 코퓰라 | 주변을 균등으로 옮기고 종속만 다룸 |
| QQ 플롯 | 분위수를 비교 |
| 난수 생성 | 역방향으로 씁니다 |
| 순위 기반 방법 | 경험적 로 근사 |
둘째 줄이 136강 심화 5의 슬라 정리입니다. 각 변수를 로 균등화한 뒤 그 위에서 코퓰라만 모형화하면, 주변분포와 종속 구조가 완전히 분리됩니다.
다섯째 줄이 138강 심화 1의 스피어만 상관입니다. 경험적 분포함수로 변환하면 순위가 되며, 단조 변환에 불변인 성질이 여기서 나옵니다.
심화 4. 재매개변수화 요령을 정리하세요.
변분추론과 확산모형에서 결정적으로 쓰이는 기법입니다.
문제는 이것입니다. 분포의 모수 에 대해 기댓값을 미분하고 싶습니다.
132강 심화 4에서 지적한 대로 미분과 기댓값을 바로 바꿀 수 없습니다. 분포 자체가 에 의존하기 때문입니다.
해법이 변환으로 분리하는 것입니다.
무작위성을 에 몰아넣고 의존성을 결정적 함수로 옮깁니다. 그러면
이제 교환이 정당하며 97강의 연쇄법칙으로 역전파가 통합니다.
정규분포의 경우가 가장 단순합니다.
문제 2의 선형변환이며, 130강 문제 3의 표준화를 거꾸로 한 것입니다.
모든 분포에 되는 것은 아닙니다.
| 분포 | 재매개변수화 |
|---|---|
| 정규 | 쉽습니다 |
| 균등, 지수 | 역변환 표집으로 가능합니다 |
| 감마, 디리클레 | 어렵습니다 |
| 이산 | 불가능합니다 |
넷째 줄 때문에 이산 잠재변수는 다른 방법이 필요하며, 검벨소프트맥스 같은 연속 완화를 씁니다.
심화 5. 야코비 없이 분포를 다루는 방법을 개관하세요.
정규화 흐름은 가역성과 야코비 계산 가능성을 요구합니다. 그 제약을 피하는 접근도 있습니다.
| 접근 | 야코비를 어떻게 |
|---|---|
| 정규화 흐름 | 구조를 제약해 싸게 계산 |
| 변분오토인코더 | 하한만 최적화하고 회피 |
| 생성적 적대신경망 | 밀도를 아예 다루지 않음 |
| 확산모형 | 점수함수만 학습 |
| 연속 정규화 흐름 | 대각합으로 대체 |
다섯째 줄이 흥미롭습니다. 변환을 미분방정식으로 두면
행렬식이 대각합으로 바뀝니다. 117강의 미분방정식과 120강의 수치 적분이 도구가 되며, 대각합은 무작위 추정으로 싸게 근사할 수 있습니다. 275강의 뉴럴 ODE가 이 접근입니다.
넷째 줄이 오늘날 가장 널리 쓰입니다. 확산모형은 밀도 대신 만 배우므로 정규화 상수도 야코비도 필요 없습니다. 129강 심화 5에서 언급한 대로입니다.
심화 6. 변환이 기계학습에 나타나는 자리를 정리하세요.
| 자리 | 어떤 변환 |
|---|---|
| 데이터 전처리 | 표준화, 백색화, 박스콕스 |
| 정규화 흐름 | 학습되는 가역 변환 |
| 재매개변수화 | \boldsymbol{\mu}+\boldsymbol{\sigma}\odot\boldsymbol |
| 확산모형 순방향 | 잡음을 더하는 선형 변환 |
| 데이터 증강 | 레이블을 보존하는 변환 |
| 대조학습 | 두 뷰를 만드는 변환 |
| 좌표 변환 | 극좌표, 로그 변환 |
첫째 줄의 박스콕스 변환은 자료를 정규에 가깝게 만드는 멱변환입니다.
를 데이터로 정하며, 129강 문제 5의 치우친 분포를 대칭에 가깝게 만듭니다.
넷째 줄이 확산모형의 뼈대입니다.
문제 2의 선형변환이며, 130강 문제 4의 정규분포 합 성질 덕분에 여러 단계를 한 번에 뛰어넘을 수 있습니다. 그것이 학습을 가능하게 하는 요령입니다.
다섯째와 여섯째 줄은 변환을 불변성 주입에 씁니다. 회전이나 자르기로 만든 자료가 같은 레이블을 가져야 한다고 요구하면, 모형이 그 변환에 불변인 표현을 배웁니다.
import numpy as np
# --- 문제 1: 다변수 변환에는 야코비 행렬식이 붙는다 ---------------------
print(" f(x,y) = x + y on [0,1]^2 에 u = x+y, v = x-y 를 씌웁니다")
print(" 역변환은 x = (u+v)/2, y = (u-v)/2 이고 야코비 행렬식은 -1/2 입니다")
Jinv = np.array([[0.5, 0.5], [0.5, -0.5]])
print(" 역변환 야코비 행렬 = %s" % np.array2string(Jinv))
print(" det = %.6f, |det| = %.6f" % (np.linalg.det(Jinv), abs(np.linalg.det(Jinv))))
print(" f_UV(u,v) = f_XY((u+v)/2, (u-v)/2) * |det| = u * 0.5")
print(" (u,v) f_XY 자리 f_UV 이론 확인")
for u, v in [(0.5, 0.0), (1.0, 0.0), (1.5, 0.5), (0.8, -0.4)]:
x, y = (u+v)/2, (u-v)/2
ok = (0 <= x <= 1) and (0 <= y <= 1)
print(" %6.1f,%5.1f (%6.3f,%6.3f) %14.6f %10s"
% (u, v, x, y, (x+y)*0.5 if ok else 0.0, "정의역 안" if ok else "밖"))
M = 3000
g = (np.arange(M) + 0.5)/M
XX, YY = np.meshgrid(g, g, indexing="ij")
print(" 변환 전후의 적분이 같은지 확인합니다")
print(" 원래 적분 (x+y) over [0,1]^2 %14.10f" % float((XX+YY).sum()/M**2))
# (u,v) 영역: 0<=(u+v)/2<=1, 0<=(u-v)/2<=1
K = 4000
uu = (np.arange(K) + 0.5)*(2.0/K)
vv = -1.0 + (np.arange(K) + 0.5)*(2.0/K)
UU, VV = np.meshgrid(uu, vv, indexing="ij")
Xr, Yr = (UU+VV)/2, (UU-VV)/2
ok = (Xr >= 0) & (Xr <= 1) & (Yr >= 0) & (Yr <= 1)
val = np.where(ok, UU*0.5, 0.0)
print(" 변환 후 적분 u*|det| over 영역 %14.10f" % float(val.sum()*(2.0/K)*(2.0/K)))
# f(x,y) = x + y on [0,1]^2 에 u = x+y, v = x-y 를 씌웁니다
# 역변환은 x = (u+v)/2, y = (u-v)/2 이고 야코비 행렬식은 -1/2 입니다
# 역변환 야코비 행렬 = [[ 0.5 0.5]
# [ 0.5 -0.5]]
# det = -0.500000, |det| = 0.500000
# f_UV(u,v) = f_XY((u+v)/2, (u-v)/2) * |det| = u * 0.5
# (u,v) f_XY 자리 f_UV 이론 확인
# 0.5, 0.0 ( 0.250, 0.250) 0.250000 정의역 안
# 1.0, 0.0 ( 0.500, 0.500) 0.500000 정의역 안
# 1.5, 0.5 ( 1.000, 0.500) 0.750000 정의역 안
# 0.8, -0.4 ( 0.200, 0.600) 0.400000 정의역 안
# 변환 전후의 적분이 같은지 확인합니다
# 원래 적분 (x+y) over [0,1]^2 1.0000000000
# 변환 후 적분 u*|det| over 영역 1.0004484334
# --- 문제 2: 선형변환이면 행렬식 하나로 끝난다 --------------------------
print(" Y = A X 이면 f_Y(y) = f_X(A^{-1} y) / |det A| 입니다")
print(" A det A 부피 배율 밀도 배율")
for nm, A in [("[[2,0],[0,3]]", np.array([[2.,0.],[0.,3.]])),
("[[1,1],[0,1]]", np.array([[1.,1.],[0.,1.]])),
("[[0,-1],[1,0]] 회전", np.array([[0.,-1.],[1.,0.]])),
("[[1,2],[2,4]] 특이", np.array([[1.,2.],[2.,4.]]))]:
d = np.linalg.det(A)
print(" %-22s %10.4f %11.4f %12s"
% (nm, d, abs(d), ("%.6f" % (1/abs(d))) if abs(d) > 1e-12 else "정의 안 됨"))
print(" 79강에서 행렬식이 부피 배율이라 한 것이 그대로 밀도의 역배율이 됩니다")
print(" 회전은 부피를 보존하므로 밀도가 그대로입니다")
print(" 특이행렬은 부피를 0 으로 눌러 밀도가 정의되지 않습니다")
print(" 표준정규를 A 로 변환하면 공분산이 A A^T 가 됩니다")
A = np.array([[2., 0.], [1., 3.]])
print(" A A^T = %s" % np.array2string(A @ A.T))
print(" det(A A^T) = %.6f = (det A)^2 = %.6f" % (np.linalg.det(A @ A.T), np.linalg.det(A)**2))
# Y = A X 이면 f_Y(y) = f_X(A^{-1} y) / |det A| 입니다
# A det A 부피 배율 밀도 배율
# [[2,0],[0,3]] 6.0000 6.0000 0.166667
# [[1,1],[0,1]] 1.0000 1.0000 1.000000
# [[0,-1],[1,0]] 회전 1.0000 1.0000 1.000000
# [[1,2],[2,4]] 특이 0.0000 0.0000 정의 안 됨
# 79강에서 행렬식이 부피 배율이라 한 것이 그대로 밀도의 역배율이 됩니다
# 회전은 부피를 보존하므로 밀도가 그대로입니다
# 특이행렬은 부피를 0 으로 눌러 밀도가 정의되지 않습니다
# 표준정규를 A 로 변환하면 공분산이 A A^T 가 됩니다
# A A^T = [[ 4. 2.]
# [ 2. 10.]]
# det(A A^T) = 36.000000 = (det A)^2 = 36.000000
# --- 문제 3: 박스뮐러 변환을 정식으로 유도한다 --------------------------
print(" U1, U2 ~ Uniform(0,1) 독립에 극좌표 꼴 변환을 씌웁니다")
print(" Z1 = sqrt(-2 log U1) cos(2 pi U2), Z2 = sqrt(-2 log U1) sin(2 pi U2)")
print(" 역변환은 U1 = exp(-(z1^2+z2^2)/2), U2 = arctan2(z2,z1)/(2 pi) 입니다")
def jac_uv(z1, z2, h=1e-6):
f = lambda a, b: np.array([np.exp(-(a*a+b*b)/2), np.arctan2(b, a)/(2*np.pi)])
d1 = (f(z1+h, z2) - f(z1-h, z2))/(2*h)
d2 = (f(z1, z2+h) - f(z1, z2-h))/(2*h)
return np.array([[d1[0], d2[0]], [d1[1], d2[1]]])
print(" (z1,z2) |det J| 수치 phi(z1) phi(z2) 차이")
for z1, z2 in [(0.0, 1.0), (1.0, 1.0), (-2.0, 0.5), (0.3, -1.7)]:
d = abs(np.linalg.det(jac_uv(z1, z2)))
tgt = np.exp(-(z1*z1+z2*z2)/2)/(2*np.pi)
print(" %6.1f,%6.1f %16.10f %18.10f %12.2e" % (z1, z2, d, tgt, abs(d-tgt)))
print(" 균등분포의 밀도가 1 이므로 f_Z(z1,z2) = 1 * |det J| = phi(z1) phi(z2) 입니다")
print(" 두 성분이 곱으로 갈라지므로 독립인 표준정규 두 개입니다")
print(" 130강 문제 1 의 가우스 적분이 여기서 거꾸로 쓰인 셈입니다")
# U1, U2 ~ Uniform(0,1) 독립에 극좌표 꼴 변환을 씌웁니다
# Z1 = sqrt(-2 log U1) cos(2 pi U2), Z2 = sqrt(-2 log U1) sin(2 pi U2)
# 역변환은 U1 = exp(-(z1^2+z2^2)/2), U2 = arctan2(z2,z1)/(2 pi) 입니다
# (z1,z2) |det J| 수치 phi(z1) phi(z2) 차이
# 0.0, 1.0 0.0965323526 0.0965323526 2.17e-12
# 1.0, 1.0 0.0585498315 0.0585498315 2.25e-12
# -2.0, 0.5 0.0190083473 0.0190083473 2.99e-12
# 0.3, -1.7 0.0358691722 0.0358691722 9.16e-12
# 균등분포의 밀도가 1 이므로 f_Z(z1,z2) = 1 * |det J| = phi(z1) phi(z2) 입니다
# 두 성분이 곱으로 갈라지므로 독립인 표준정규 두 개입니다
# 130강 문제 1 의 가우스 적분이 여기서 거꾸로 쓰인 셈입니다
# --- 문제 4: 차원이 다르면 보조변수를 넣는다 ----------------------------
print(" Z = X + Y 하나만 필요해도 변환 공식은 2 차원 대 2 차원을 요구합니다")
print(" 보조변수 W = X 를 넣고 (X,Y) -> (Z,W) 로 만든 뒤 W 를 주변화합니다")
print(" 역변환 X = W, Y = Z - W. 야코비 행렬식은 1 입니다")
Jz = np.array([[0., 1.], [1., -1.]])
print(" 야코비 행렬 = %s, det = %.1f, |det| = %.1f"
% (np.array2string(Jz), np.linalg.det(Jz), abs(np.linalg.det(Jz))))
print(" 따라서 f_Z(z) = 적분 f_XY(w, z-w) dw 이며 이것이 합성곱입니다")
lam = 1.0
K2 = 400000
print(" z 합성곱 수치 Gamma(2,1) 이론 차이")
for z in [0.5, 1.0, 2.0, 4.0]:
w = (np.arange(K2) + 0.5)*(z/K2)
val = float((lam*np.exp(-lam*w) * lam*np.exp(-lam*(z-w))).sum()*(z/K2))
tgt = lam*lam*z*np.exp(-lam*z)
print(" %7.1f %16.10f %20.10f %12.2e" % (z, val, tgt, abs(val-tgt)))
print(" 131강 문제 2 에서 확인한 지수 두 개의 합이 감마인 것과 같습니다")
# Z = X + Y 하나만 필요해도 변환 공식은 2 차원 대 2 차원을 요구합니다
# 보조변수 W = X 를 넣고 (X,Y) -> (Z,W) 로 만든 뒤 W 를 주변화합니다
# 역변환 X = W, Y = Z - W. 야코비 행렬식은 1 입니다
# 야코비 행렬 = [[ 0. 1.]
# [ 1. -1.]], det = -1.0, |det| = 1.0
# 따라서 f_Z(z) = 적분 f_XY(w, z-w) dw 이며 이것이 합성곱입니다
# z 합성곱 수치 Gamma(2,1) 이론 차이
# 0.5 0.3032653299 0.3032653299 0.00e+00
# 1.0 0.3678794412 0.3678794412 0.00e+00
# 2.0 0.2706705665 0.2706705665 0.00e+00
# 4.0 0.0732625556 0.0732625556 1.39e-17
# 131강 문제 2 에서 확인한 지수 두 개의 합이 감마인 것과 같습니다
# --- 문제 5: 합성하면 로그 야코비가 더해진다 ----------------------------
print(" 변환을 여러 번 합성하면 야코비 행렬식이 곱해집니다")
print(" 로그를 취하면 더해지므로 층을 쌓아도 계산이 선형입니다")
As = [np.array([[1.5, 0.2], [0.0, 0.8]]),
np.array([[1.0, 0.0], [0.4, 1.2]]),
np.array([[0.9, -0.3], [0.1, 1.1]])]
print(" 층 det A_k log|det A_k| 누적 log")
acc = 0.0; P = np.eye(2)
for k, Ak in enumerate(As, 1):
d = np.linalg.det(Ak); acc += np.log(abs(d)); P = Ak @ P
print(" %8d %12.6f %15.8f %14.8f" % (k, d, np.log(abs(d)), acc))
print(" 합성 행렬의 det = %.6f, log|det| = %.8f" % (np.linalg.det(P), np.log(abs(np.linalg.det(P)))))
print(" 누적 합과의 차이 %.2e" % abs(acc - np.log(abs(np.linalg.det(P)))))
print(" 263강 정규화 흐름이 이 성질 위에 서 있습니다")
print(" 야코비 행렬식을 싸게 계산할 수 있는 구조를 설계하는 것이 핵심 과제입니다")
print(" 구조 야코비 행렬 det 계산 비용")
for nm, shape, cost in [("일반 밀집", "가득 찬 행렬", "O(d^3)"),
("삼각 (자기회귀)", "삼각행렬", "O(d) 대각 곱"),
("커플링 (RealNVP)", "블록 삼각", "O(d) 대각 곱"),
("직교 (회전)", "직교행렬", "det = 1")]:
print(" %-18s %-16s %16s" % (nm, shape, cost))
print(" 삼각행렬이면 det 이 대각 성분의 곱이라 78강의 계산이 O(d) 로 끝납니다")
# 변환을 여러 번 합성하면 야코비 행렬식이 곱해집니다
# 로그를 취하면 더해지므로 층을 쌓아도 계산이 선형입니다
# 층 det A_k log|det A_k| 누적 log
# 1 1.200000 0.18232156 0.18232156
# 2 1.200000 0.18232156 0.36464311
# 3 1.020000 0.01980263 0.38444574
# 합성 행렬의 det = 1.468800, log|det| = 0.38444574
# 누적 합과의 차이 5.55e-17
# 263강 정규화 흐름이 이 성질 위에 서 있습니다
# 야코비 행렬식을 싸게 계산할 수 있는 구조를 설계하는 것이 핵심 과제입니다
# 구조 야코비 행렬 det 계산 비용
# 일반 밀집 가득 찬 행렬 O(d^3)
# 삼각 (자기회귀) 삼각행렬 O(d) 대각 곱
# 커플링 (RealNVP) 블록 삼각 O(d) 대각 곱
# 직교 (회전) 직교행렬 det = 1
# 삼각행렬이면 det 이 대각 성분의 곱이라 78강의 계산이 O(d) 로 끝납니다
문제 3의 표가 이 강의에서 가장 깔끔한 확인입니다. 야코비 행렬식이 네 점 모두에서 와 이내로 일치합니다. 균등분포의 밀도 에 야코비를 곱했더니 정규분포 두 개의 곱이 나온 것이며, 난수 생성의 표준 알고리즘이 여기서 유도됩니다.
문제 1의 변환 후 적분 는 정직하게 읽어야 합니다. 이론값은 이고 오차 는 공간의 정의역이 마름모라 직사각 격자로 경계를 맞추지 못한 것입니다. 이론의 오차가 아니라 검산 방법의 한계입니다.
문제 5의 누적 로그가 합성 행렬의 로그와 차이입니다. 층을 셋 쌓았는데 로그가 정확히 더해집니다. 263강 정규화 흐름이 층을 수십 개 쌓을 수 있는 이유가 이 한 줄입니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 야코비 행렬 | 편미분을 모은 행렬입니다 | |
| 야코비 행렬식의 절댓값 | 부피 배율입니다 | |
| 보조변수 | auxiliary variable | 차원을 맞추려고 넣습니다 |
| 주변화 | marginalization | 넣은 변수를 적분해 없앱니다 |
| 박스뮐러 | Box-Muller | 균등에서 정규를 만듭니다 |
| 백색화 | whitening | 공분산을 단위행렬로 만듭니다 |
| 확률적분변환 | probability integral transform | 가 균등입니다 |
| 순서통계량 | order statistics | 정렬한 표본입니다 |
| 정규화 흐름 | normalizing flow | 가역 변환을 학습합니다 |
| 커플링 층 | coupling layer | 야코비가 블록 삼각입니다 |
| 재매개변수화 | reparameterization | 무작위성을 잡음으로 분리합니다 |
| 박스콕스 | Box-Cox | 정규에 가깝게 만드는 멱변환입니다 |
다음 140강에서는 다변량 정규분포를 다룹니다. 130강에서 일변수 정규분포를 세웠고, 138강에서 공분산행렬을 만들었으며, 이 강의에서 선형변환의 규칙을 얻었습니다. 셋을 합치면 다변량 정규분포가 나옵니다. 문제 2에서 본 이 그 모수가 되고, 86강의 스펙트럼 정리로 주축을 찾으면 89강의 주성분분석이 됩니다. 그리고 138강 문제 3에서 예고한 **"정규분포에서는 무상관이 독립"**이 여기서 증명됩니다.