VAE(변분 자동 인코더)의 판단 근거의 가시화(이상 검출)

개요


토목 분야에서는 오류 처리(이상 검출)가 잦다.타임라인 데이터에서 이상 감지를 할 때는 이미지로 변환한 뒤 AI를 사용하는 경우가 많다.이상 검출에서도 판단 근거의 가시화는 필요하다.
이미지 분류에서는 판단 근거가 되는 시각화 방법으로 그랜드캠이 알려졌으나 VAE(변분 자동 인코더)의 경우 몰라서 조사했다.
논문은 다음과 같은 내용을 참고하였다.
https://arxiv.org/pdf/1911.07389.pdf
PyTorch를 사용하는 설치에는 다음 사항이 있습니다.저는 텐센트 플로우를 사용하는 사람이라 몰라요.
일본어로 해설하다
네.

VAE를 사용한 예외 감지(One-Class VAE)


MNIST의 경우 예외 탐지를 간단히 설명합니다.손으로 쓴 숫자 0의 그림을 정상으로 설정하고, 다른 손으로 쓴 숫자 1~9의 그림을 이상으로 설정합니다.
VAE는 숫자 0의 이미지만으로 학습하고 숫자 0의 이미지를 재구성합니다.만약 학습이 순조롭게 진행된다면 원래 숫자 0의 이미지와VAE로 재구성된 숫자 0의 이미지 사이의 오차는 매우 적을 것이다.
또한 손으로 쓴 숫자 1~9의 이미지를 VAE에 입력하면 숫자 0 이외의 이미지는 재구성되지 않기 때문에 숫자 0 이외의 이미지와 VAE를 통해 재구성된 이미지의 오차가 커져 이상을 볼 수 있다.
 
그리고 오차 한도값을 적당히 확정하고 이상 여부를 확인하면 된다.

링크 만들기


VAE 구축이 완료되면 Attention map을 만듭니다.기본적으로 GradCam과 같습니다.그러나 그랜드캠의 경우 사다리를 계산할 때 예측 클래스의 출력(1개)이 필요하지만 VAE의 경우 잠재적 벡터(전체)가 필요하다.
인코더의 마지막 볼륨에서 특징량 그림 $A\in\mathb{R]^{n times h\timesw} 달러와 잠재적 벡터 $z\in\mathb{R}^{D} 달러 획득n, h, w, D 달러는 채널, 접힌 높이의 폭과 잠재 공간의 차원 순이다.
아래 위에 $k, p, q, i달러를 표시하면 채널, 접힌 후의 높이와 너비, 잠재 공간의 분량을 순서대로 나타낸다.
피쳐 다이어그램 및 잠재적 벡터에서 채널당 $\alphak^i달러를 계산하다.
\alpha_k^i=\frac{1}{h}\frac{1}{w}\sum_{p=1}^{h}\sum_{q=1}^{w}\left(\frac{\partial z_i}{\partial A_k^{pq}}  \right)
그런 다음 각 잠재적 벡터의 Attention map$M^{i} 달러를 계산합니다.
M^{ipq} = \rm{Relu}\left(\sum_{k=1}^n \alpha_k^i  A_k^{pq} \right)
마지막으로 모든 잠재적 벡터의 평균값은 Attention map$M^{i}이고 Attention map$M을 계산합니다.
M^{pq} =\frac{1}{D} \sum_{i=1}^D M^{ipq} 
코드가 이렇게 된 느낌.
# batch サイズは1であることが前提
with tf.GradientTape(persistent=True) as tape:
    A,z = エンコーダーからの出力

    dim = tf.shape(z)[1]
    grads = [tape.gradient(z[:,i],A)  for i in range(dim)]

alpha =tf.reduce_mean(grads, axis=(1,2,3))
# チャネル平均
M_i = tf.einsum('ij,klmj->iklm', alpha, A)
M_i= tf.nn.relu(map)
# 潜在空間の次元ごとに平均
M = tf.reduce_mean(M_i, axis=0)

The normal difference distribution


이상적으로 정상적인 데이터로 학습되는 잠재적인 공간은 정적 분포에 따라 생성되어야 한다.정상적인 데이터로 학습하는 인코더에 이상 데이터를 입력하여 얻을 수 있는 잠재적 공간의 확률 분포는 학습을 통해 얻을 수 있는 정적 분포와 다르다.정상 데이터와 이상 데이터의 차이를 나타내는 확률 분포(normal difference distribution)를 사용하여 이상 데이터를 만드는 Attetion map을 고려합니다.
다음 부자모 $x$는 정상 데이터를 표시하고 부자모 $y$는 이상 데이터를 표시합니다.
우선, 잠재 공간을 만드는 샘플 $z$을 만들기 위해 배운 인코더에 정상적인 데이터를 대입합니다.대부분의 샘플 $z$부터 각 벡터의 성분은 평균 $\mui^x$및 분산$\sigmai^x$를 계산합니다.
 
그리고 배운 인코더에 이상 데이터를 대입하여 평균 $\mui^y$및 분산$\sigmai^y$를 출력합니다.평균 정상 데이터 $\mui^x$및 분산$\sigmai^x$및 예외 데이터의 평균 $\mui^y$및 분산$\sigma다음 normal difference distribution에서 잠재적 벡터 $u를 생성하려면 i^y 달러를 사용하십시오.
P_{q(z_i|x) - q(z_i|y) }(u_i) = \frac{1}{\sqrt{2\pi\sigma_i^2} }\exp\left\{-\frac{(u_i -\mu_i)^2}{2\sigma_i^2} \right\}  
\mu_i=\mu_i^x - \mu_i^y  \ ,\ \sigma_i^2=(\sigma_i^x)^2 +(\sigma_i^y)^2 
비정상적인 데이터의 Attention map은 잠재적 벡터 $u를 사용하여 계산합니다.즉, 위에서 설명한 Attention map 제작 방법에 사용된 $z$$u를 $u로 변경하여 계산합니다.
코드는 normal difference distribution 과 같은 느낌입니다.
batch = tf.shape(y_mean)[0]
dim = tf.shape(y_mean)[1]
epsilon = tf.keras.backend.random_normal(shape=(batch, dim))

# 通常のVAEで使われる z
z= y_mean + tf.exp(0.5 * y_log_var) * epsilon
# normal difference distributionからサンプリングされる u
u=(x_mean-y_mean) +( tf.sqrt(x_var + tf.exp(y_log_var)) )* epsilon

확인


MNIST를 사용하여 판단 근거를 시각화했습니다.손으로 쓴 숫자 0의 이미지를 정상적인 데이터로 학습하고 다른 손으로 쓴 숫자 1~9의 이미지를 이상 데이터로 입력한다.
일반적인 VAE 학습은 그에 상응하여 완성할 수 있다.물론 손으로 쓴 숫자 0의 그림만 배운다.다음 시각화에서 검증 오차가 가장 적은 권한을 사용합니다.

입력 이미지와 재구성 이미지 사이의 오차를 통해 이상 여부를 판단합니다.오차 함수는 제곱 오차를 사용할 수 있지만 VAE를 배울 때 교차 엔트로피를 사용하기 때문에 교차 엔트로피를 사용한다.
다음은 이상 여부를 판단하는 데 사용할 한도값을 설정해야 한다.MNIST의 트레이닝 데이터(손으로 쓴 숫자 1~9의 이미지도 포함)를 사용하여 오차를 구성하는 값으로 직사각형을 써 보세요.

파란색 직사각형은 정상 데이터의 재구성 오차 직사각형이고 주황색 직사각형은 이상 데이터의 재구성 오차 직사각형이다.정상 데이터의 재구성 오차 직사각형의 평균치는 123이고 표준 편차는 30 정도이다.
 
따라서 이상 여부를 판단하는 한도값 123+2×30으로 설정하다.그러니까σ이상의 데이터(한쪽이지만)는 이상으로 간주됩니다.
마지막으로 테스트 데이터를 사용하여 이상으로 간주되는 핸드폰 숫자 1~9의 이미지를 볼 수 있다.세 이미지의 순서는 입력 이미지, 재구성 이미지, Attention map 입니다.









총결산


어쨌든 MNIST는 그런 느낌이 든다.

좋은 웹페이지 즐겨찾기