Search
Duplicate

AI/ Causal Convolution

Causal

Causal은 현재를 기준으로 과거 정보를 이용하여 인과를 추론하는 방법이다. 이는 과거는 미래에 영향을 주지만 미래는 과거에 주지 않는다는 Causal 원칙에 기반한다.
Causal 추론에 대해 정해진 형식은 없지만 Linear나 Convolution 등 다양한 방식을 사용할 수 있다. Linear라면 삼각 행렬을 사용할 수 있고, Convolution이라면 미래 정보를 가리는 ConvCausal을 사용할 수 있고, RNN이나 Transformer 등에서는 Masking을 사용할 수 있다.

Causal Convolution

Causal Convolution은 Causal 개념을 convolution에 적용한 방식이다. 이것은 1차원 뿐만 아니라 2차원 이상 모든 차원에 대해 적용 가능하다.

1d causal CNN (convolutional Markov models)

1차원 이산 시퀀스에 대해 다음의 convolutional Markov model을 고려하자.
p(x1:T)=t=1Tp(xtx1:t1;θ)=t=1TCat(xtsoftmax(φ(τ=1tkwxτ:τ+k)))\begin{aligned} p(\bold{x}_{1:T}) &= \prod_{t=1}^T p(x_t|\bold{x}_{1:t-1};\boldsymbol{\theta}) \\& = \prod_{t=1}^T \text{Cat}(x_t|\text{softmax}(\varphi(\sum_{\tau=1}^{t-k} \bold{w}^\top\bold{x}_{\tau:\tau+k}))) \end{aligned}
여기서 w\bold{w}는 크기 kk의 convolutional filter이고 단순성을 위해 단일 비선형성 φ\varphi과 카테고리컬 출력을 가정한다. 따라서 이것은 xtx_t가 과거 값에만 의존하도록 미래 입력을 ‘mask out’ 하는 점만 제외하면 일반적인 1차원 컨볼루션과 같다. 물론 더 깊은 모델을 사용할 수 있고 입력 feature에 조건화 c\bold{c}를 할 수 있다.
좀 더 쉬운 예로 입력 데이터가 [0,1,2,...,9][0, 1, 2, ..., 9]일 때 w=[w0,w1,w2]w = [w_0, w_1, w_2] filter를 사용하여 1차원 causal_conv를 수행하면 결과는 다음과 같다. (여기서 filter를 맞추기 위해 zero-padding을 수행하여 입력을 [0,0,0,0,1,2,...,9][0, 0, 0, 0, 1, 2, ..., 9]로 만든 후에 수행한다)
y[0]=0w0+0w1+0w2y[1]=0w0+0w1+1w2y[2]=0w0+1w1+2w2...y[9]=7w0+8w1+9w2y[0] = 0\cdot w_0 + 0\cdot w_1 + 0\cdot w_2 \\ y[1] = 0\cdot w_0 + 0\cdot w_1 + 1\cdot w_2 \\ y[2] = 0\cdot w_0 + 1\cdot w_1 + 2\cdot w_2 \\ ... \\ y[9] = 7\cdot w_0 + 8\cdot w_1 + 9\cdot w_2
filter의 마지막 요소가 현재 index tt에 해당하고, filter의 이전 요소들은 tt 이전의 값에 적용된다는 것에 유의하라. 이렇게 하여 미래를 참조하지 않고 현재 시점 이전의 데이터만 사용할 수 있다.
참고로 만일 w=[1,1,1]w = [1, 1, 1]이었다면 최종 결과는 [0,1,3,6,9,12,15,18,21,24][0, 1, 3, 6, 9, 12, 15, 18, 21, 24]가 된다.

2d causal CNN

causal convolution을 2차원으로 확장하면 다음과 같이 정의할 수 있다.
p(xθ)=r=1Rc=1Cp(xr,cfθ(x1:r1,1:C,xr,1:c1))p(\bold{x}|\boldsymbol{\theta}) = \prod_{r=1}^R \prod_{c=1}^C p(x_{r,c}|f_{\boldsymbol{\theta}}(\bold{x}_{1:r-1,1:C},\bold{x}_{r,1:c-1}))
이것은 pixelCNN 모델에 해당한다.

참고