실습 · 연습문제 2개
batch 공분산을 축 규약대로 batch-covariance
센서 개가 각각 번 측정한 차원 신호를 X, shape (B, N, D)로 받았다. 축의 의미는 batch(센서) · 샘플(측정 시점) · feature(측정 채널)다. 함수 batch_cov(X)를 완성해 센서마다 표본 공분산 행렬을 반환한다.
반환값의 shape은 (B, D, D)다.
테스트는 다음을 확인한다.
- 센서마다
np.cov(X[b], rowvar=False)와 같다. - 평균은 센서마다 따로(샘플 축
N으로) 뺀다. 전체 batch의 평균을 빼면 센서마다 기준점이 다른 데이터에서 공분산이 부풀려진다. - 결과는 대칭이고 고윳값이 음수가 아니다.
힌트: X.mean(axis=?, keepdims=True)로 중심화한 뒤, 합해서 사라질 축이 무엇인지 생각하며 einsum 문자열을 쓴다. 출력의 두 feature 축에는 서로 다른 글자가 필요하다.
bilinear layer를 einsum 한 줄로 bilinear-einsum
두 입력 , 을 받아 개의 출력을 내는 bilinear layer는 출력마다 행렬 하나를 써서
를 계산한다. 함수 bilinear(x, W, z, c)를 완성해 batch 전체의 출력을 반환한다.
| 인자 | shape | 의미 |
|---|---|---|
x |
(B, I) |
첫 번째 입력 |
W |
(K, I, J) |
출력마다 행렬 하나 |
z |
(B, J) |
두 번째 입력 |
c |
(K,) |
bias |
반환값의 shape은 (B, K)다. 테스트는 이중 loop로 계산한 값과 비교하고, 인 경우와 인 경우도 확인한다.
힌트: 먼저 각 축에 글자를 붙인다(b, i, j, k). 출력에 남는 축과 합해서 사라지는 축을 나누면 einsum 문자열이 정해진다. bias는 broadcasting으로 더한다.