(Deep Learning) Stable Diffusion은 이미지가 너무 어두운 이유와 해결 방법을 학습하지 않음(노이즈 오프셋 관련)

동기 부여

Stable Diffusion 및 Latent Diffusion Model 관련 논문 및 정보글을 검색하면 어두운 이미지가 출력되지 않고 학습이 되지 않는다고 합니다.

흥미로운 기사나는 그것을 찾고 기사에서 이유와 해결책을 찾았습니다.

질문

Stable Diffusion을 사용하여 이미지를 출력하면 심야와 어둡게 써도 이미지가 생각보다 어둡지 않습니다.

매우 어두운 사진의 이미지를 모델에 학습시키더라도 학습 이미지가 부족하기 때문에 더 밝아질 것입니다.

실험 결과 올블랙 이미지를 훈련시켜 출력해도 아래 이미지와 같이 블랙 이미지를 출력하지 않는 것으로 나타났으며, 출력 이미지 값의 평균값은 0.5로 나타났다.


순수한 검정색 이미지를 출력한 결과

문제의 원인

이 문제는 기존 Stable Diffusion의 노이즈 처리에서 발생합니다.

앞선 글에서 설명한 것처럼 Latent Diffusion Model은 VAE에 의해 Latent로 변환된 이미지에 여러 번 Gaussian noise*를 적용하고 원본 이미지를 복원하는 방식으로 반복적으로 학습됩니다.

(* 가우시안 잡음: 이러한 유형의 노이즈를 IID 노이즈라고 하며 정규 분포 노이즈입니다.

독립적이고 동일하게 분산된 노이즈)

Diffusion Model에서는 원본 이미지에 노이즈를 추가하는 과정을 순방향 과정이라고 하고 노이즈를 제거하고 이미지를 복원하는 과정을 역방향 과정이라고 하는데 여기서 제거할 수 없는 문제가 있습니다.

또한 latent vector로 추출한 특징 중 장파장 특징은 단파장 특징에 비해 노이즈 과정에서 남은 특징이 가장 길다.

여기에서 자랐다 파장, 단파장 특징, CNN 구조의 VAE를 사용하여 3*512*512(3 RGB 채널) 원본 이미지 특징을 추출하여 4*64*64의 잠재 벡터를 생성합니다.

이때 이미지의 특징은 CNN 적층 구조를 가지는 VAE의 각 레이어에서 추출된다.

장파 특징은 일반적으로 이미지의 전체 구조 또는 개체의 일부와 같은 큰 특징을 포함하여 깊은 레이어에서 추출됩니다.

반대로 단파장 특징은 텍스처, 경계 및 모서리와 같은 작은 특징을 포함하며 일반적으로 얕은 레이어에서 추출됩니다.

이미지의 전체 구조가 작은 특징보다 노이즈에 의해 가려질 가능성이 적다고 가정하는 것은 당연합니다.

실제로 원본 이미지를 잠재 이미지로 변환하고 노이즈를 추가하여 비교한 아래 영상을 보면 쉽게 알 수 있다.

맨 왼쪽의 장파장 특징은 오른쪽의 단파장 특징과 비교하여 거의 변하지 않은 것을 볼 수 있습니다.

결과적으로 전체 노이즈에서 재구성하는 방법을 배우는 대신 원본 이미지 정보(특히 장파장 기능)의 일부만 유지하는 상태만 재구성하는 방법을 배웁니다.

이 문제로 인해 동일한 노이즈 시드에 또 다른 큐를 먹였을 때 전체적인 구조가 비슷한 이미지가 생성되고, 그 반대의 과정에서 이미지를 생성할 때는 학습할 때와 달리 전체 노이즈에서 이미지를 생성하므로 우리는 수행된 작업을 정확히 실행 취소하는 것은 불가능합니다.

이 문제는 원본 정보의 차원이 커질수록 심각해집니다.

가우시안 노이즈는 정규분포이므로 표준편차 값에 의해 노이즈의 세기가 결정됩니다.

참고: 표준 편차는 $\sigma= \sqrt{ \frac{{(x_1 -m)}^{2} + {(x_2 -m)}^{2} + \cdot \cdot \cdot + {(x_N – m)}^{2} }{N}}$.


$\sigma$가 클수록 극단값이 많습니다.

따라서 노이즈의 강도도 강해집니다.

파장이 가장 긴 특징은 이미지입니다.

모두잡음이 표준정규분포(평균은 0, 표준편차는 1)이기 때문에 의 평균값이라 할 수 있으며, 영구히 저장된다.

물론 이것은 극단적인 예인데, 전체 이미지에 대한 특징을 평균으로 구한 것이 아니기 때문이다.

잡음의 표준 편차는 1입니다.

반대로 최단파장 특성에 노이즈가 미치는 영향은 정규분포의 샘플링분포의 평균값이 전체 샘플링분포와 같기 때문에 평균값은 전과 같고 분산은 $\frac {\sigma ^{2}}{N}$ (여기서 $N$은 샘플 개수) 정리하자면 샘플이 작을수록 표준편차가 커지므로 잡음=표준편차의 효과는 이론적으로 $를 높일 수 있다.

최대 \sqrt{N}$번.

안정적인 확산 모델의 경우 3*512*512 이미지를 4*64*64 잠재 벡터로 변환하여 처리합니다.

4*64*64=16384. 따라서 $N$이 1일 때 노이즈의 영향(노이즈의 표준편차)은 최대 128배(4채널 계산에 포함되지 않은 경우 64배)의 차이가 난다.

해결하다

따라서 장파장 잔광 문제를 해결하기 위한 간단한 방법을 제안한다.

새로운 특수 노이즈, 오프셋 노이즈를 추가하는 것입니다.

# 기존 noise
noise = torch.randn_like(latents)

# 개선된 noise (noise offset 추가)
noise = torch.randn_like(latents) + 0.1 * torch.randn(latents.shape(0), latents.shape(1), 1, 1)

먼저 함수와 변수가 무엇을 의미하는지 설명하겠습니다.

torch.randn_like(latents)는 기존 latent와 같은 크기의 Gaussian normal distribution noise를 생성하는 함수입니다.

torch.randn() 함수는 비슷하지만 생성하는 노이즈의 크기를 수동으로 설정할 수 있습니다.

latents.shape(0)은 배치 크기, 즉 하나의 작업에 대한 latent의 수를 나타내며 latents.shape(0)은 4, 즉 latent 벡터의 채널 수를 나타냅니다.

지금까지의 기존 소음과 동일합니다.

하지만 마지막 부분은 다릅니다.

원래의 torch.rand_like(latent) 함수는 torch.randn(latents.shape(0), latents.shape(1), 64, 64)와 동일하지만 개선된 노이즈에서는 1,1의 랜덤 노이즈가 64를 대체합니다.

, 64가 나중에 더해지면 0.1을 곱해서 생성되는 것을 알 수 있다.

이 경우 각 이미지의 노이즈 차원이 4에 불과하므로 가장 긴 파장과 가장 짧은 파장의 노이즈 차이는 이론상 최대값의 두 배입니다(4채널이 포함되지 않는 한 차이 없음).

이는 픽셀별로 계산하는 것이 아니라 동일한 노이즈를 각 채널에 한 번에 추가하여 위에서 언급한 노이즈의 영향을 128배(채널 없이 64배) 줄이는 방법입니다.

다만, 그대로 적용하면 노이즈가 과도하게 되어 대부분의 정보가 손실되므로 0.1을 곱하여 노이즈 강도를 줄인다.

다만, 이 값은 정확한 실험은 아니지만 이 값에서 잘 작동한다는 점에 유의하세요.

결과

원문에 따르면 실제 적용 후 너무 밝거나 너무 어두운 그림을 학습하여 실제로 출력할 수 있습니다.


오른쪽 위: 폭풍우 속의 어두운 골목(0.032) 왼쪽 위: 흰색 배경에 단색 선형 기호(0.974) 왼쪽 아래: 화창한 날 눈 덮인 스키 리조트(0.858) 오른쪽 아래: 조명만 있는 마을 손전등 광장으로. (0.031)


소음을 제거하기 전과 후의 별이 빛나는 하늘.

슈퍼 히어로는 소음을 제거하기 전과 후에 어두운 골목에서 식물 괴물과 싸웁니다.

또한 향후 연구에서 수정된 노이즈를 사용하는 것이 좋습니다.

개인적으로 안정적인 확산을 학습할 때 문제가 되는 기존 노이즈를 사용하는 것은 품질에 좋지 않은 영향을 미칠 것이라고 생각합니다.

향후 모델은 새로운 오프셋 노이즈를 적용하여 크게 개선된 다양한 이미지를 출력할 수 있을 것으로 기대된다.

인용하다

https://www.crosslabs.org//blog/diffusion-with-offset-noise

https://theailearner.com/2019/05/05/understanding-frequency-in-images/