무 검정 다변량 법선의 평균과 분산은 무엇입니까?


9

하자 BE에 . 의 평균 및 공분산 행렬은 무엇입니까 (최대 계산 된 요소 별)?ZN(μ,Σ)RdZ+=max(0,Z)

예를 들어 딥 네트워크 내에서 ReLU 활성화 기능을 사용하고 CLT를 통해 주어진 레이어에 대한 입력이 거의 정상이라고 가정하면 출력 분포입니다.

(많은 사람들이 전에 이것을 계산했다고 확신하지만, 합리적으로 읽을 수있는 방법으로 어디서나 결과를 찾을 수 없었습니다.)


(1) 잘린 정규 분포의 모멘트는 무엇입니까? (2) 혼합의 모멘트는 무엇입니까? ? 후자는 간단하며 전자에 대한 결과를 인용하기 만하면됩니다.
whuber

@whuber 흠. 명시 적으로 말하지는 않았지만, 일반적인 평균과 분산을 가진 잘린 이변 량 분포에 대한 결과를 찾지 못했기 때문에 어쨌든 스케일링과 시프트를 수행해야한다는 점을 제외하고는 본질적으로 내 대답에서 수행 한 것입니다. 내가해야 할 대 수량을 수행하지 않고 공분산을 추출하는 방법이 있습니까? 나는이 답변의 어떤 것이 참신하다고 주장하지는 않습니다. 대수는 지루하고 오류가 발생하기 쉽다는 것입니다. 아마도 다른 사람이 솔루션을 유용하게 사용할 수 있습니다.
Dougal

맞다 : 나는 당신의 대수학이 내가 묘사 한 것과 일치한다고 확신합니다. 그래서 대수를 단순화하는 것에 대한 감사를 나누는 것처럼 보입니다. 대수를 줄이는 한 가지 쉬운 방법은 의 대각선 요소 를 단일 로 표준화하는 것입니다 . 왜냐하면 모든 것이 각 변수에 대해 측정 단위를 설정하기 때문입니다. 이 시점에서 Rosenbaum의 결과를 혼합 순간에 대한 (단순하고 명백한) 표현에 직접 연결할 수 있습니다. 그것이 대수 단순화의 가치가 있더라도 맛의 문제 일 수 있습니다. 단순화하지 않으면 간단한 모듈 식 컴퓨터 프로그램으로 이어집니다. Σ
whuber

1
Rosenbaum의 결과를 사용하여 순간을 직접 계산하고 적절히 혼합 한 다음 원래 공간으로 이동하고 크기를 조정하는 프로그램을 작성할 수 있다고 가정합니다. 아마도 내가했던 것보다 빠를 것입니다.
Dougal

답변:


7

우리는 먼저이 단지의 특정 순간에 의존 줄일 수 있습니다 단 변수 / 이변 량 절단 정규 분포 : 물론 참고

E[Z+]=[E[(Zi)+]]iCov(Z+)=[Cov((Zi)+,(Zj)+)]ij,
그리고 정규 분포의 특정 차원을 좌표로 변환하기 때문에 1d 검열 된 법선의 평균과 분산과 두 개의 1d 검열 된 법선의 공분산에 대해 걱정할 필요가 있습니다.

우리는 몇 가지 결과를 사용합니다

S 로젠 바움 (1961). 잘린 이변 량 정규 분포의 순간 . JRSS B, vol 23 pp 405-408. ( jstor )

로젠 바움은 이벤트 에 대한 잘림을 고려 합니다.

[X~Y~]N([00],[1ρρ1]),
V={X~aX,Y~aY}

구체적으로, 그의 (1), (3) 및 (5)의 세 가지 결과를 사용합니다. 먼저 다음을 정의하십시오.

qx=ϕ(ax)qy=ϕ(ay)Qx=Φ(ax)Qy=Φ(ay)Rxy=Φ(ρaxay1ρ2)Ryx=Φ(ρayax1ρ2)rxy=1ρ22πϕ(h22ρhk+k21ρ2)

이제 Rosenbaum은 다음과 같이 표시합니다.

(1)Pr(V)E[X~V]=qxRxy+ρqyRyx(3)Pr(V)E[X~2V]=Pr(V)+axqxRxy+ρ2ayqyRyx+ρrxy(5)Pr(V)E[X~Y~V]=ρPr(V)+ρaxqxRxy+ρayqyRyx+rxy.

갖는 (1)과 (3)의 특수한 경우 , 즉 잘림을 고려하는 것도 유용합니다 . ay=

(*)Pr(V)E[X~V]=qx(**)Pr(V)E[X~2V]=Pr(V)=Qx.

이제

[XY]=[μxμy]+[σx00σy][X~Y~]N([μXμY],[σx2ρσxσyρσxσyσy2])=N(μ,Σ).

우리는 이는 , 일 때 및 값입니다. .

ax=μxσxay=μyσy,
X~Y~X=0Y=0

이제 (*)를 사용하여 및 (*) 및 (**)를 모두 사용하면 그래서

E[X+]=Pr(X+>0)E[XX>0]+Pr(X+=0)0=Pr(X>0)(μx+σxE[X~X~ax])=Qxμx+qxσx,
E[X+2]=Pr(X+>0)E[X2X>0]+Pr(X+=0)0=Pr(X~ax)E[(μx+σxX~)2X~ax]=Pr(X~ax)E[μx2+μxσxX~+σx2X~2X~ax]=Qxμx2+qxμxσx+Qxσx2
Var[X+]=E[X+2]E[X+]2=Qxμx2+qxμxσx+Qxσx2Qx2μx2qx2σx22qxQxμxσx=Qx(1Qx)μx2+(12Qx)qxμxσx+(Qxqx2)σx2.

찾으려면 , 우리는해야합니다 Cov(X+,Y+)

E[X+Y+]=Pr(V)E[XYV]+Pr(¬V)0=Pr(V)E[(μx+σxX~)(μy+σyY~)V]=μxμyPr(V)+μyσxPr(V)E[X~V]+μxσyPr(V)E[Y~V]+σxσyPr(V)E[X~Y~V]=μxμyPr(V)+μyσx(qxRxy+ρqyRyx)+μxσy(ρqxRxy+qyRyx)+σxσy(ρPr(V)ρμxqxRxy/σxρμyqyRyx/σy+rxy)=(μxμy+σxσyρ)Pr(V)+(μyσx+μxσyρρμxσy)qxRxy+(μyσxρ+μxσyρμyσx)qyRyx+σxσyrxy=(μxμy+Σxy)Pr(V)+μyσxqxRxy+μxσyqyRyx+σxσyrxy,
그리고 감산 우리 얻을 E[X+]E[Y+]
Cov(X+,Y+)=(μxμy+Σxy)Pr(V)+μyσxqxRxy+μxσyqyRyx+σxσyrxy(Qxμx+qxσx)(Qyμy+qyσy).

순간을 계산하는 파이썬 코드는 다음과 같습니다.

import numpy as np
from scipy import stats

def relu_mvn_mean_cov(mu, Sigma):
    mu = np.asarray(mu, dtype=float)
    Sigma = np.asarray(Sigma, dtype=float)
    d, = mu.shape
    assert Sigma.shape == (d, d)

    x = (slice(None), np.newaxis)
    y = (np.newaxis, slice(None))

    sigma2s = np.diagonal(Sigma)
    sigmas = np.sqrt(sigma2s)
    rhos = Sigma / sigmas[x] / sigmas[y]

    prob = np.empty((d, d))  # prob[i, j] = Pr(X_i > 0, X_j > 0)
    zero = np.zeros(d)
    for i in range(d):
        prob[i, i] = np.nan
        for j in range(i + 1, d):
            # Pr(X > 0) = Pr(-X < 0); X ~ N(mu, S) => -X ~ N(-mu, S)
            s = [i, j]
            prob[i, j] = prob[j, i] = stats.multivariate_normal.cdf(
                zero[s], mean=-mu[s], cov=Sigma[np.ix_(s, s)])

    mu_sigs = mu / sigmas

    Q = stats.norm.cdf(mu_sigs)
    q = stats.norm.pdf(mu_sigs)
    mean = Q * mu + q * sigmas

    # rho_cs is sqrt(1 - rhos**2); but don't calculate diagonal, because
    # it'll just be zero and we're dividing by it (but not using result)
    # use inf instead of nan; stats.norm.cdf doesn't like nan inputs
    rho_cs = 1 - rhos**2
    np.fill_diagonal(rho_cs, np.inf)
    np.sqrt(rho_cs, out=rho_cs)

    R = stats.norm.cdf((mu_sigs[y] - rhos * mu_sigs[x]) / rho_cs)

    mu_sigs_sq = mu_sigs ** 2
    r_num = mu_sigs_sq[x] + mu_sigs_sq[y] - 2 * rhos * mu_sigs[x] * mu_sigs[y]
    np.fill_diagonal(r_num, 1)  # don't want slightly negative numerator here
    r = rho_cs / np.sqrt(2 * np.pi) * stats.norm.pdf(np.sqrt(r_num) / rho_cs)

    bit = mu[y] * sigmas[x] * q[x] * R
    cov = (
        (mu[x] * mu[y] + Sigma) * prob
        + bit + bit.T
        + sigmas[x] * sigmas[y] * r
        - mean[x] * mean[y])

    cov[range(d), range(d)] = (
        Q * (1 - Q) * mu**2 + (1 - 2 * Q) * q * mu * sigmas
        + (Q - q**2) * sigma2s)

    return mean, cov

그리고 Monte Carlo 테스트가 작동하는지 테스트하십시오.

np.random.seed(12)
d = 4
mu = np.random.randn(d)
L = np.random.randn(d, d)
Sigma = L.T.dot(L)
dist = stats.multivariate_normal(mu, Sigma)

mn, cov = relu_mvn_mean_cov(mu, Sigma)

samps = dist.rvs(10**7)
mn_est = samps.mean(axis=0)
cov_est = np.cov(samps, rowvar=False)
print(np.max(np.abs(mn - mn_est)), np.max(np.abs(cov - cov_est)))

이는 0.000572145310512 0.00298692620286청구 된 기대 및 공분산이 Monte Carlo 추정치 ( 샘플 기준)와 일치 함을 나타냅니다 .10,000,000


최종 값이 무엇인지 요약 할 수 있습니까? 생성 한 모수 mu 및 L의 추정치입니까? 목표 값을 인쇄 할 수 있습니까?
AdamO

아니요, 반환 값은 및 . 내가 인쇄 한 것은 그 수량의 Monte Carlo 추정기와 계산 값 사이 의 거리입니다. 및 대한 순간 일치 추정값을 얻기 위해 이러한 표현을 뒤집을 수 있습니다. Rosenbaum은 실제로 3 절에서 잘린 경우에 대해 수행합니다. 그러나 이것이 내가 원하는 것은 아닙니다. \E(Z+)\Cov(Z+)LμΣ
Dougal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.