출처: 만들면서 배우는 생성 AI, 데이비드 포스터

 

확산 모델은 GAN과 함께 최근 AI 기술 중 많은 관심을 받은 개념이라고 한다.

확산 모델은 여러 벤치마크에서 GAN 보다 우수한 성능을 보이며, CV쪽에서 활발히 사용된다고 한다.

 

5.1 아이디어

Diffusion model의 기본 원리를 TV 매장으로 비유한 소개글이지만, 정말 설명을 못하는 것 같다.

어쨌든 이러한 아이디어가 확산 모델의 기본 개념을 나타낸다. 여러 노이즈에 노출된 후, 학습이 진행됨에 따라 노이즈를 제거하여 최종적으로는 진짜 같은 영상(이미지)를 생성하는 것 같다.

 

5.2 잡음 제거 확산 모델

잡음 제거 확산 모델의 기본 개념은 위 TV의 아이디어와 유사하다.

연속해서 이미지 속에서 노이즈를 없애는 것이다.(없애도록 훈련 시키는 것)

확산 모델에서는 정방향 (잡음 추가)과 역방향 (잡음 제거)가 존재한다고 함!

 

5.3 정방향 확산 과정

 

위 그림을 통해서 정방향 확산 과정 (노이즈 추가)을 알아보자.

x0을 계속해서 손상시켜 Xt로, 즉 랜덤한 가우스잡음과 동일하게 만든다고 가정해보자.

이렇게 하려면 어떻게 해야할까?

 

위 그림 Xt-1 이미지에 분산 Bt를 갖는 약간의 가우스 잡음을 추가하여 이미지 Xt를 생성하는 함수 q를 정의할 수 있다.

 

이 함수를 계속 적용하면 계속해서 노이즈가 커지는 이미지 시퀀스를 만들어낼 수 있는 것이다.

 

업데이트 과정을 수식으로 표현하면 다음과 같다.

 

결론: 정방향 확산 과정은 input된 이미지를 완전한 노이즈로 바꾸기 위해 계속해서 일정한 분산을 갖는 노이즈를 추가시킴.

 

5.3.1 재매개변수화 트릭

위에서는 그럼 계산을 T번 해야하는 건가? T번 계산하지 않고 input이미지에서 바로 최종 이미지(잡음 낀 이미지)로 건너뛸 수는 없을까? 

 

이를 위해 재매개변수화 트릭이라는 개념이 등장한다.

수식의 두 번째 줄 (xt = √at * xt-1 ~ ) 이 줄은 두 개의 가우스 분포를 더하여 새로운 가우스 분포 하나를 얻을 수 있다는 사실을 이용한다. 따라서 원본 이미지에서, 최종 뿐 아니라 어떠한 단계로든 이동할 수 있다!

 

또한, 원래 Bt대신 표본at를 사용하여 확산 스케쥴을 정의할 수 있다.

표본 at는 신호(원본 이미지)로 인한 분산이고, 1-표본at는 잡음으로 인한 분산이다.

따라서 정방향 확산 과정 q는 다음과 같이 쓸 수 있다.

 

5.4 확산 스케쥴

또한 각 타임 스텝마다 다른 Bt를 자유롭게 선택할 수 있다. 즉, 모두 동일할 필요가 없다는 것이다! 

이처럼 Bt값이 t에 따라 변하는 방식을 확산 스케쥴이라고 한다.

 

(원래 논문에서 저자들은 Bt에 대해서 선형 확산 스케쥴이라고 했다고 한다.)

{Bt가 B1=0.0001에서 Bt=0.02까지 선형적으로 증가되기 때문}

이렇게 하면 잡음 추가하는 과정에서 초기 단계에서 나중 단계보다 노이즈가 적게 추가된다.

(나중 단계는 거의 노이즈 상태이기 때문!)

 

 

확산 스케쥴은 선형, 코사인, 오프셋 코사인 대표적으로 이 세가지로 나뉘고, 위 그림을 통해 각각의 특징을 보자.

 

코사인 확산 스케쥴 (초록) 에서 잡음이 더 느리게 상승하는 것을 볼 수 있다. 

 

 

 

5.5 U-Net 잡음 제거 모델

이제 본격적으로 확산 모델을 사용해보자.

출력과 입력의 크기가 같아야할 때는 U-Net이 유용하므로, U-net을 이용하여 구조를 만들어보자.

noisy_images = layers.Input(shape=(64,64,3)) # 잡음 제거하려는 이미지
x = layers.Conv2D(32, kernerl_size=1)(noisy_images) # Conv2D 통과하면서 채널 수 증가

noise_variances = layers.input(shape=(1,1,1))  # 두 번째 입력은 잡음의 분산(스칼라)
noise_embedding = layers.Lambda(sinusoidal_embedding)(noise_variances) # 사인파 임베딩을 통해서 인코딩 됨
noise_embedding = layers.UpSampling2D(size=64, interpolation = 'nearest')(noise_embedding)

x = layers.Concatenate()([x, noise_embedding])

skips = []

x = DownBlock(32, block_depth = 2)([x, skips])
x = DownBlock(64, block_depth = 2)([x, skips])
x = DownBlock(96, block_depth = 2)([x, skips])

x = ResidualBlock(128)(x)
x = ResidualBlock(128)(x)

x = UpBlock(96, block_depth = 2)([x, skips])
x = UpBlock(64, block_depth = 2)([x, skips])
x = UpBlock(32, block_depth = 2)([x, skips])

x = layers.Conv2D(32, kernerl_size=1, kernel_initalizer='zeros')(x)

unet = layers.Conv2D(3, kernel_size = 1, kernel_initializer='zeros')(x)

unet = models.Model([noisy_images, noise_variances], x, name='unet')

코드 네 번째 줄의 사인파 임베딩이 뭘까??

 

 

'딥 러닝 > 생성형 AI' 카테고리의 다른 글

04. 적대적 생성 신경망(GAN)  (0) 2024.04.06
03. 변이형 오토인코더  (2) 2024.03.22
02. 딥러닝  (1) 2024.03.17
01. 생성 모델  (2) 2024.03.11

적대적 생성 신경망 (Generative adversarial networks)

먼저 오토인코더에서와 마찬가지로, 간단한 예시로 GAN의 등장배경을 알아보자.

위 이야기의 정품 벽돌과 위조 벽돌의 발전 과정은 GAN(Generative Adversial Networks)의 훈련 과정과 똑같다.

GAN은 생성자와 판별자라는 두 적대자간의 싸움이다.

그림을 통해 이해하면,

생성자(정품or위조)는 랜덤한 잡음원래 데이터셋에서 샘플링한 것처럼 보이는 샘플로 변환한다.

판별자는 그 샘플이 원래 데이터셋에서 나왔는지, 아니면 위조품인지를 예측한다.

 

그렇다면 정보가 없는 맨 처음은? -> 생성자: 잡음 이미지를 그대로 출력 / 판별자: 랜덤으로 판별 -> 다음부터는 위와 같음.

 

4.1 심층 합성곱 GAN (DC GAN)

심층 합성곱을 이용하면 사실적인 이미지를 만들어 내고, 이미지 품질을 향상시킬 수 있다.!

 

예제를 통해 DC GAN을 구현해보자.

데이터 : 캐글의 레고 데이터셋

 

원본 데이터는 0~255로 이루어져 있는데, GAN을 훈련할 때는 [-1 ~ 1]로 스케일을 재조정한다.

(생성자의 출력층에서 하이퍼볼릭 탄젠트 함수를 사용하기 위해서!)

 

tf.cast => 텐서의 데이터타입을 변경 (np.astype과 비슷)

 

4.2 판별자

판별자는 생성자가 

코드는 아래와 같다.

유의: 3번=마지막 합성곱 출력을 펼친다. 이 지점에서 텐서 크기는 1x1x1이다. 따라서 마지막 Dense층이 필요하지 않음.

판별자의 모델 Summary()는 다음과 같다.

4.3 생성자

이제 생성자를 만들어보자.

생성자에서 Input은 다변량 표준 정규 분포에서 뽑은 벡터라고 한다.

      ''           output은 원본 훈련 데이터에 있는 이미지와 동일한 크기의 이미지다.

 

다변량 표준 정규 분포라는 키워드를 보면 변이형 오토인코더가 떠오를텐데, 실제로 GAN의 생성자는 VAE(변이 오토인코더)의 디코더와 정확히 같은 목적을 수행한다고 한다.

생성자의 INPUT & VAE의 디코더  = 잠재 공간의 벡터를 이미지로 변환

 

생성형 모델에서는 잠재 공간에서 원래 도메인으로 다시 매핑하는 개념은 아주 많이 쓰이는데, 이는 잠재공간에서 벡터를 조정하는 것으로 이미지의 고차원적인 특성을 바꿀 수 있기 때문이다.

 

코드와 모델 summary를 알아보자.

 

검정색 동그라미를 보자.

1 = 생성자의 Input 층 -> 길이가 100인 벡터로 정의

2 = Reshape층을 통해 1x1x100 크기의 텐서로 변환 -> 전치 합성곱층 사용할 수 있게

3 = 4개의 Transpose CNN층에 통과, 그 사이에 배치정규화 및 리키렐루 층을 놓음.

4 = 마지막 전치 합성곱 층은 하이퍼볼릭 탄젠트 함수를 활성화 함수로 두고 출력을 원본 이미지와 같은 [-1,1] 범위로!

5 = 생성자 모델을 정의 -> 길이가 100인 벡터를 받고 [64,64,1] 크기의 텐서를 출력

 

 

출력층을 제외하고 4개의 전치합성곱층에서 첫 번째 층을 제외한 나머지 3개 층은 strides가 2로 되어있다.

-> 텐서가 네트워크를 통과하면서 방향의 크기가 증가함. (채널 수는 줄어든다-> 마지막에는 1로.!  <-? )

위 사진은 스트라이드2 + 전치합성곱층과 업샘플링+스트라이드1인 일반 합성곱층을 비교하는 글이다.

 

Upsample층은 픽셀 사이 공간을 0으로 채우지 않고 기존 픽셀 값을 사용해 업샘플링 한다고 한다.

 

전치합성곱층은 일반적으로 출력 이미지 경계에 계단/체크무늬 패턴을 만들어서 출력 품질을 떨어뜨린다고 하는데, 뛰어난 GAN 논문에서 여전히 많이 사용한다고 한다. 따라서 Upsampling층이나 Conv2DTranspose 잘 비교해보고 사용해보자.

 

4.3 DC GAN (Deep Convolutional Generative Adversial Network) 훈련

위의 코드와 설명이 바로 DC GAN이다. (Conv2DTranspose층 사용) -> 심층 합성곱을 사용해 고품질 이미지 생성에 기여할 수 있다. 이제 이 DC GAN 모델의 훈련을 알아보도록 하자.

GAN을 진짜 이해하려면 훈련 과정을 이해해야 한다고 한다. (책에서..)

 

먼저 훈련 세트에서 진짜 샘플과 생성자의 출력을 합쳐서 훈련 세트를 만든다. (이를 지도 학습 문제로 다루자!)

정답 이미지 (진짜) = 1, 가짜 이미지 = 0, 손실 함수 = 이진 크로스 엔트로피

 

생성자는 어떻게 훈련시켜야 할까?

생성된 이미지에 점수를 부여하고 높은 점수를 낸 이미지로 최적화하는 방법을 찾아야 한다. (판별자가 이 역할을 수행)

 

배치 이미지를 생성하고 이를 판별자에 통과시켜 각 이미지에 대한 점수를 얻을 수 있다고 한다.

(판별자가 진짜라고 생각하는 이미지를 생성하도록 생성자를 훈련하고 싶기 때문)

 

그리고 한 번에 한 네트워크의 가중치만 업데이트 될 수 있도록 두 네트워크를 번갈아가면서 훈련하는 것이 중요하다.

생성자를 훈련할 때 판별자의 가중치가 변경되도록 허용하면 생성된 이미지를 진짜라고 여기도록 조정되기 때문.

 

-> 판별자가 약해서가 아니라 생성자가 강하기 때문에 생성된 이미지가 1에 가까운 값으로 예측되어야 한다!

 

아래 그림은 판별자와 생성자의 훈련 과정을 보여준다.

DC GAN compile code

 

코드의 검정 동그라미를 보자.

 

 

4.4 GAN 훈련의 트릭과 팁

GAN은 생성형 AI 분야에서 큰 혁신이지만 훈련이 어렵기로도 유명하다고 한다.

 

이 절에서는 무엇이 어려운지, 어떻게 해결할 수 있을지 알려준다고 하니 집중력을 잃지 말자!

 

Case #1 판별자 > 생성자

판별자가 더 뛰어나다면 손실 함수의 신호가 약해져 생성자의 성장(좋은 이미지를 만들어낼 수 있는 능력)이 저해된다.

최악의 상황 -> 판별자가 신같은 존재 -> 학습이 이루어지지 않아버렷!

 

해결방안

 - 판별자의 dropout층의 rate 매개변수값을 증가시켜 네트워크를 통해 흐르는 정보 양 감소시키기

 - 판별자의 학습률 감소시키기

 - 판별자의 합성곱 필터 수 감소시키기

 - 판별자 훈련 시 레이블에 잡음 증가시키기

 - 판별자 훈련 시 일부 레이블 이미지 무작위로 뒤집기

 

Case #1 판별자 < 생성자

고급스러운 말로 모드 붕괴(mode collapse)라고 한다고 한다.

생성자를 이기적인(현명한?) 사람이라고 생각해보자. 어떻게 판별자를 속일 수 있을까? (훈련 방향이 어떨까?)

만약 판별자의 가중치를 업데이트하지 않는다고 해보자. 그렇다면 당연히 생성자는 여러개가 아닌, 판별자를 속일 수 있는 '단 하나'의 샘플만을 찾으려고 할 것이다. 그 샘플만 찾아낸다면 영원히 판별자를 속일 수 있기 떄문이다!

 

유용하지 않은 손실

딥러닝 모델은 손실 함수의 값이 작아지는 방향으로 학습하기 때문에 손실이 작을수록 이미지 품질이 좋아진다고 착각하기 쉽다. 하지만 생성자는 현재의 판별자에 의해서만 평가되고, 판별자는 계속해서 업데이트 되기 때문에 훈련 과정의 다른 지점에서 평가된 손실을 비교할 수 없다.

 -> 생성자의 손실과 이미지 품질 사이의 연관성 부족때문에은 GAN의 중간과정 모니터링이 어렵다.

 

하이퍼 파라미터

위의 코드를 보았듯이, GAN에서는 튜닝해야 할 하이퍼 파라미터의 개수가 상당히 많을것을 볼 수 있다.

-> 배치 정규화 / 드롭 아웃 / 학습률 / 활성화 층 / 합성곱 필터 / 커널 크기 / 스트라이드 / 배치 크기 / 잠재 공간 크기 등

 

GAN의 도전과제 해결

위의 여러가지 문제점들은 최근 몇 년간 똑똑이들에 의해서 많이 개선되었다고 하는데, 어떻게 되었는지 더 자세히 알아보자!

 

4.5 와서 스테인 GAN- 그레디언트 패널티 (WGAN-GP)

아르좁스키라는 스키 2017년 "와서스테인 GAN"이라는 논문을 통해 GAN의 모델 안정성 구축에 크게 기여했다.

핵심은 두 가지다.

1: 생성자가 수렴하는 것과 샘플의 품질을 연관 짓는 의미 있는 손실 측정 방법

2: 최적화 과정의 안정성 향상

 

참고)와서스테인은 손실 함수이다!

'딥 러닝 > 생성형 AI' 카테고리의 다른 글

05. 확산 모델 (Diffusion model)  (0) 2024.05.31
03. 변이형 오토인코더  (2) 2024.03.22
02. 딥러닝  (1) 2024.03.17
01. 생성 모델  (2) 2024.03.11

목표

  • 오토인코더의 구조를 배우고 생성형 AI기술과 적합성 검증
  • 오토인코더 직접 실습해 만들어보기
  • 오토인코더의 한계점을 확인, 변이형 오토인코더 학습
  • 변이형 오토인코더 직접 실습해 만들어보기

2013년 변이형 오토인코더라는신경망에 관한 논문이 게재되었다.

변이형 오토인코더는 생성형 AI에서 가장 기본적이고 널리 알려진 딥러닝이며, 생성형 AI의 시작점이라고 해도 무방하다.

그 전에 먼저 표준 오토인코더에 대해서 알아보자.

 

먼저 오토인코더가 해결하려는 문제부터 알아보자.

자취방에 옷 무덤을 떠올려보자. 니트,티셔츠,바지,속옷 등 갖가지 옷들이 생매장되어있다. 

따라서 이를 해결하기위해 무한한 높이의 옷장을 만들었다고 가정해보자. 자비스라는 AI에게 옷장의 특정 위치를 알려주기만 하면 그 위치에 해당하는 의류를 새로 만들어 줄 수 있을것이다. -> 비슷한 옷은 서로 가까이 배치해야하겠지?

 

이것이 오토인코더의 개념과 밀접하다는데 더 자세히 알아보자.

 

3.1 오토인코더

여기서 우리는 "인코더(Encoder)"의 역할을 수행해야 한다.

즉, 의류를 특정 위치로 이동시켜야 한다. 이 과정을 인코딩이라고 하며, 자비스는 "디코더(Decoder)" 역할을 맡아

옷장의 위치를 넘겨 받으면 그 위치에 해당하는 의류를 생성하려고 할 것이다. 이를 디코딩이라고 한다.

옷장의 각 위치는 두 개의 숫자값 (벡터)으로 표현된다.

인코더는 디코더가 정확하게 숫자값으로 이동할 수 있게 도와줘야 한다. 이 벡터 값 (디코더를 위한 정보)을 임베딩(Embedding)이라고도 한다.

 

결정적으로 좌표평면 (2D) 공간에 있는 모든 포인트를 디코딩하여 새로운 옷을 만들 수 있으므로 생성모델로 사용할 수 있는 것이다.

 

3.1.1 실습

fashion_mnist를 불러오고,

기존 이미지 값 -> (0~255) -> 255로 나누어서 0~1로 바꾸기

 

numpy메소드의 pad 함수 np.pad 의미

제로패딩 두 개의 픽셀로 채워넣었다는 의미이다. 

 

3.1.1 오토인코더의 구조

오토인코더는 두 부분으로 구성된 신경망이다.

  • 인코더: 네트워크는 이미지같은 고차원 입력 데이터를 저차원 임베딩 벡터로 압축
  • 디코더: 네트워크는 임베딩 벡터를 원본 도메인으로 압축 해제 (ex 이미지로 되돌립니다.

오토인코더는 인코더로 들어가서 디코더로 나오면서 이미지를 재구성하도록 훈련한다.

아니 그럼 왜 원본이미지를 냅두고 굳이 이 지롤을 하는것일까?

 

이 이유는 앞서 설명했듯이 임베딩 공간(잠재공간)과 관려되어 있다고 볼 수 있다. 이 공간에서 샘플링하여 새로운 이미지를 생성할 수 있기 때문이라고 한다.

임베딩(z) = 원본 이미지를 저차원 잠재 공간으로 압축하는 것

잠재 공간에서 임의의 포인트를 선택해 디코더에 통과시키면 새로운 이미지를 생성할 수 있다. 디코더는 잠재 공간의 포인트를 유효한 이미지로 변환하는 방법을 학습했기 때문!

 

3.1.2 인코더

오토인코더에서 인코더의 역할은 입력을 이미지로 받아 잠재 공간 안의 임베딩 벡터에 매핑하는 것.

직접 실습해보자.

3.1.3 디코더

디코더는 인코더와 반대이다. (미분이 뭐야? 적분의 반대. 적분이 뭐야? 미분의 반대.)

 

합성곱 오토인코더 = 인코딩 -> 합성곱 사용 / 디코딩 -> 전치 합성곱 사용

참고

https://m.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS4816849548&cate_cd=001

 

말하는 대로 그려 주는 기술의 비밀: 합성곱 오토인코더, 생성적 적대 신경망

이미지 생성 모델은 최근 몇 년 동안 발전하여, 사람들이 생각하는 것보다 더욱 세밀하고 현실적인 이미지를 생성할 수 있게 되었습니다. 혁신적인 알고리즘을 구축하고, 대규모 데이터로 학습

m.hanbit.co.kr

디코더에서는 전치 합성곱 층을 사용

 

디코더는 합성곱 층 대신 전치 합성곱이라는 층을 사용한다.

전치 합성곱(Transposed convolution) 연산과 deconvolutionl 연산은 다르다. deconvolutionl은 convolution 역 연산이므로 input 데이터를 다시 출력한다. Transposed convolution은 input을 원래대로 되돌리는 역할을 하고, output의 차원의 크기도 동일하다는 점에서 deconvolution과 유사하지만 연산 수행 방식이 다르다.

참고

https://yeong-jin-data-blog.tistory.com/entry/Autoencoder

 

오토인코더(Autoencoder), 합성곱 오토인코더(Convolutional Autoencoder)

📚 오토인코더 (Autoencoder) 오토인코더는 비지도학습 모델로, 입력 데이터의 패턴을 학습해서 최대한 유사한 데이터를 새롭게 생성한다. 데이터가 입력되면 encoder를 통해서 저차원의 벡터로 변

yeong-jin-data-blog.tistory.com

 

전치 합성곱층을 사용한 디코딩을 실습해보자.

3.1.4 인코딩 <-> 디코딩 연결하기

인코더와 디코더를 연결시키려면 이미지가 인코더를 통과해 디코더로 나오는 모델을 정의해야한다.

다행히도, 케라스의 Model 클래스를 이용해서 쉽게 연결시킬 수 있다.

 

이제 모델 정의가 끝났으므로, 손실함수&옵티마이저를 정하여 모델 컴파일을 진행해보자.(RMSE/이진 크로스엔트로피)

 

손실함수 관련 참고

 

언제 MSE, MAE, RMSE를 사용하는가?

제목에 열거한 RMSE, MSE, MAE는 딥러닝 모델을 최적화 하는 데 가장 인기있게 사용되는 오차 함수들이다. 이번 포스팅에서는 (1) 이들의 특징을 알아보고, (2) 이 3 가지 손실 함수를 비교 분석해본다

jysden.medium.com

MSE/RMSE의 가장 큰 차이점은 "이상치에 민감하냐"의 여부이다.

MSE의 경우 루트가 안쓰이기 때문에 이상치에 더 민감하다고 볼 수 있다. (학습과정이 불안정할 수 있음.)

RMSE의 경우, "큰 오류값 차이에 대해서 크게 패널티를 주는 이점"이 있다고 볼 수 있다.

 

오토인코더 훈련

이미지 재구성하기

위 그림을 보다시피, 디코딩된 이미지는 원본 이미지와 똑같지 않다!

이는 인코딩 할 때, 원본 이미지를 두 개의 숫자값으로 축소 시켜놨기 때문에 정보가 소실되기 때문이다.

이제 인코더가 잠재공간에서 어떻게 이미지를 표현하는지 알아보자.

잠재 공간 시각화

 테스트 세트를 인코더에 통과시켜 만들어진 임베딩을 시각화

그림 & 좌표 숫자를 잘 보고 분석해보자.

데이터 포인터들이 서로 구분지어 멀리 떨어져 있지 않고, 뒤섞여서 붙어 있다!

위와 같은 부분들 때문에 실제로 잠재 공간에서의 샘플링 작업은 힘들 수 있다.

문제 = 일반 오토인코더는 잠재 공간이 연속적으로 할 것인지에 대해 강제하지 않기 때문임

 -> 변이형 오토인코더로 해결할 수 있다!

 

3.2 변이형 오토인코더

 처음 설명 했던 무한한 높이의 옷장을 다시 떠올려보자.

처음 (일반 오토인코더)의 경우 옷을 정확한 위치에 할당한다고 했다면, 지금 (변이형 오토인코더)은 가능성이 높은 지역을 할당한다고 해보자.(범위) -> 불연속성 문제를 해결할 수 있지 않을까?

+규칙을 새로 만들자! 데이터의 중앙 -> 좌표 중앙에 배치한 후, 편차 또한 일정 범위로 제한!!

 

3.2.1 인코더

오토인코더와 변이형 오토인코더의 차이

2차원 한 점에 할당  vs  잠재 공간의 다변량 정규 분포에 할당

 

다변량 정규 분포란?

표준 정규 분포 = 평균0, 분산이 1인 정규 분포

 

다변량 정규 분포란

평균이 뮤, 분산이 시그마인 정규 분포에서 샘플링하여 구하는 것

이게 뭔 개소리노

 

변이형 오토인코더는 데이터를 평균&분산 벡터에 각각 매핑하기만 하면 되고, 차원간 공분산을 신경 쓸 필요가없다고 한다. (잠재공간에서는 차원간에 상관관계가 없다고 가정)

+분산값은 항상 양수여야 하므로 분산의 로그에 매핑 (로그 함수를 생각)

 

요약하면 인코더는 원본 이미지 -> 잠재 공간의 다변량 정규분포를 구성하는 분포의 평균, 분산의 로그 값 두 개의 벡터로 인코딩 한다.

위 방법을 통해서 z 샘플링 -> 디코딩하는 과정

 

'딥 러닝 > 생성형 AI' 카테고리의 다른 글

05. 확산 모델 (Diffusion model)  (0) 2024.05.31
04. 적대적 생성 신경망(GAN)  (0) 2024.04.06
02. 딥러닝  (1) 2024.03.17
01. 생성 모델  (2) 2024.03.11

딥러닝: 머신러닝의 한 종류로, 데이터 처리 유닛의 층을 여러 개 쌓아 구조적이지 않은 데이터에서 고수준 표현을 학습!

 

2.1 데이터

일반적으로 머신러닝에서 사용되는 정형 데이터이다.

정형 데이터: 양적 데이터, 사전에 정의됨(유연하지 않음). 분석이 상대적으로 쉬움

비정형 데이터: 질적 데이터, 특정 스키마(DB를 구성하는 요소들의 관계)가 포함되어 있지 않다. 유연함, 분석 어려움

 

구체적으로, 비정형 데이터는 이미지/오디오/텍스트와 같이 태생적으로 특성의 열로 구성할 수 없는 것들을 말한다.

픽셀/진동 수/문자 하나하나에는 정보가 거의 없다. 예를 들어 이미지의 234번 째의 픽셀이 황토색이라는 정보는 의미는 도움이 되지 않는다는 뜻이다.

 

물론 딥러닝에서 정형데이터를 사용하면 안되는 것은 아니지만, 딥러닝의 강력함은 비정형 데이터를 다루는 것에서 나온다는 것이다.

 

2.2 심층 신경망

딥러닝 여러 개의 은닉층을 쌓은 인공 신경망(ANN(Artificial Neural Network)이다.

따라서 심층 신경망(DNN(Deep Neural Network)와 동의어로 쓰이곤 한다.

 

2.2.1 신경망이란?

심층 신경망은 층을 연속하여 쌓아 만든다. 각 층은 유닛을 가지며, 이전 층의 유닛과는 가중치로 연결된다.

"층"은 종류가 많으며, 보통 모든 유닛 이전 층의 모든 유닛과 연결되는 완전 연결층이 있다.(밀집 층이라고함)

 

다층 퍼셉트론 (MLP(multilayer perception)

-인접한 모든 층이 완전하게 연결된 신경망

 

2.2.2 고수준 특성 학습

신경망의 최대 장점은 사람의 개입 없이도 데이터를 스스로 학습하는 능력이라고 할 수 있다.

즉, 특성 공학(feature engineering)을 수행할 필요가 없다는 것.

(예측 오차를 줄이기 위해 가중치를 어떻게 조정할 지를 모델이 결정)

 

아래 텍스트 그림을 살펴보자.

 

2.3.1 예제 학습

keras에서 제공하는 CIFAR-10 데이터 셋을 이용하여 학습을 진행해보자.

 

 

여기서 만약 x_train 데이터에서 54번째 사진에서, 픽셀 12,13에 위치해 있는 RGB 값을 보고 싶다면?

슬라이싱!

 

이제 텐서 라이브러리를 이용해서 다층 퍼셉트론을 만들어보자.

 

방법1)

방법2)

 

방법1과 방법2 중 어떤것이 나을까? 

지금 예제 실습에서는 상관없지만, 보통 2번의 방식을 선호한다고 한다.

방법1은 층 별로 직접 변수를 설정했지만, 나중에 수 백 수 천개의 층을 만들기에는 적합하지 않을 수 있다.

따라서 함수 API를 불러오는 방법2의 방식을 사용하도록 하자!

 

참고로 방법 1,2 모두 아래 그림을 프로그래밍한것과 같다.

위 코드 & 그림을 보면 알 수 있듯이 층의 종류는 총 세 가지 임을 확인할 수 있다.

Input, Flatten, Dense층이다. 세 가지 모두 자세히 알아보도록 하자.

Input 층

- 네트워크의 시작점이라고 할 수 있다. 여기서 입력 데이터의 배치 크기는 필요하지 않기 때문에 배치 크기는 지정하지 않는다. 여기서 배치 크기는 50,000.

그 다음 Flatten 층은 이름처럼 하나의 벡터로 펼친다. 이렇게 되면 (32x32x3 = 3,072가 되겠다.)

Flatten을 하는 이유는 뒤에 따르는 Dense 층에서 받는 배열이 1차원이기 때문이다. 

(다른 종류의 층은 Flat한 층이 아닌 다차원 배열을 입력으로 받는다는 점 주의)

 

 Dense 층

-기본적인 신경망 구성요소.

1. Dense층의 각 유닛은 이전 층의 모든 유닛들과 완전 연결된다. +모든 연결마다 가중치가 동반

2. 유닛의 출력은 이전 층에서 넘겨받은 입력과 가중치의 곱들을 모두 더하여 구함.

3. 그 다음 비선형 활성화 함수에 전달

 

 활성화 함수

- 퍼셉트론의 출력값을 결정하는 비선형 함수

- 대표적으로 렐루, 시그모이드, 소프트맥스 함수가 있음

렐루: 음수면 0, 양수면 그 값 그대

리키렐루: 양수일 경우는 렐루와 같지만, 음수일 경우 0이 아닌 값에 비례한 작은 음수값을 반환함

                기존렐루의 경우 모두 0이면 그라디언트 값이 0이되어 학습진행에 차질이 있을 수 있기 때문

시그모이드: 출력값이 0~1. (이진 분류 / 다중 레이블 분류시 사용가능)

소프트맥스: 층의 전체 출력값들의 합이 1 (다중 분류 시 용이)

                   

 

모델 검사하기

-model.summary()를 사용해 각 층을 조사할 수 있다.

Input층의 크기는 x_train의 크기와 같아야 하고, Dense층의 크기는 y_train의 크기와 같아야 한다.(???)

 

Input 층에서, None이 나오는데, 이는 위에서 언급했듯이, 배치 크기는 필요없기 때문.

텐서플로우의 연산 방식은 선형 대수학을 이용, 입력된 샘플(n개)상관없이 동시에 수행하기 때문이다.

(GPU가 중요한 이유, GPU는 텐서 곱셈에 최적)

 

파라미터 개수

Dense#1층 = 32x32x3 + 200(Dense층의 bias(상수)) = 614,600개

Dense#2층 = (200x150) + 150 = 30,150개

Dense#3층 = (150x10) + 10 = 1,510개

2.3.2 모델 컴파일

- 모델 컴파일은 손실 함수 & 옵티마이저를 이용

 

손실 함수

손실 함수의 결과값은 모델의 예측값과 정답값의 차이를 통해 구한다. (결과가 크면 bad)

대표적으로 MSE, 범주형 크로스 엔트로피(categorical), 이진 크로스 엔트로피(binary)가 있다.

회귀 -> MSE / MAPE / SMAPE 등

다중 분류 -> 범주형 크로스 엔트로피 (categorical cross-entropy)

이진 분류 -> 이진 크로스 엔트로피 (binary cross-entropy)

옵티마이저

손실 함수 그레디언트를 기반으로 신경망의 가중치를 갱신할 때 사용함.

Adam / Adagrid / RMSprop / Momentum / SGD 등등 (일반적으로는 Adam 사용)

 

 

2.4 모델 훈련 & 평가

 

 

 

2.5 합성곱 신경망

위의 결과값을 보면 알겠지만 정확도가 아주 처참하다.!

이 이유는 입력 이미지의 공간 구조를 잘 다루지 못했기 때문이다. (무지성 Flatten으로 갈겼기 때문)

 

2.5.1 합성곱 층

위 설명을 참조하게 되면, 이미지 영역이 필터와 비슷할 수록 큰 양수, 반대일 수록 큰 음수가 출력되는 것이다.

 

직접 코드를 짜보자.

스트라이드: 도장(필터)의 이동 간격!

패딩: 제로패딩 등 특정 값으로 채워넣는것, 크기를 맞춰주기 위한 용도라고 보면 된다.

         정확히는  입력 배열의 주위를 가상의 원소로 채우는 작업이라고 할 수 있다.

풀링: 맥스풀링 등 아래 그림을 통해 이해! (축소시킨다는 개념)

직접 합성곱의 층을 쌓아보자

그림으로 이해해보면 아래와 같다.

 

'딥 러닝 > 생성형 AI' 카테고리의 다른 글

05. 확산 모델 (Diffusion model)  (0) 2024.05.31
04. 적대적 생성 신경망(GAN)  (0) 2024.04.06
03. 변이형 오토인코더  (2) 2024.03.22
01. 생성 모델  (2) 2024.03.11

생성 모델링 (generative modeling)이란 주어진 데이터셋과 유사한 데이터셋을 생성하도록 모델을 훈련하는 머신러닝의 한 분야,

훈련 데이터의 말에 대해서, 말을 잘 정의할 수 있는 픽셀값들의 관계를 학습하여, 새로운 말을 만들어낼 수 있는 것이다.

훈련 데이터 중에서 하나의 데이터를 샘플이라 부르고, 각 샘플은 많은 특성(feature)들로 이루어져 있다. 

이미지 생성의 경우, 특성이라 함은  픽셀값이라고 할 수 있다.

텍스트 생성의 경우, 특성이라 함은 단어 혹은 문자의 그룹일 수 있다.

 

이미지 생성의 경우, 원본 이미지와 같은 새로운 이미지를 만들어내는 것은 매우 어렵다고 함.

픽셀 값이 가질 수 있는 경우의 수가 너무 많은데, 이 중에서 아주 작은 수의 조합 생성하려는 개체에 대한 이미지를 구성하기 때문이다.

 

생성 모델은 또한 결정적(deterministic)이 아닌 확률적(probablistic)이여야 한다.

-> 매 번 동일한 결과값이 아닌, 다양한 결과를 뱉어내야 하기 때문 (생성 모델은 랜덤한 요소를 모두 포함해야하기 때문)

1.1 생성 모델링과 판별 모델링

어떠한 개념을 잘 이해하는 방법 중에는 그 개념과 반대되는 개념을 이해하는 것도 도움이 된다.

생성 모델링(generative modeling)과 판별 모델링(discriminative modeling)이 그 예이다.

 

판별 모델링은 보통 머신러닝의 개념과 익숙하다고 할 수 있다.

또한 판별 모델링이란 생성 모델링과 다르게 각 샘플에 레이블(label)이 있어야 한다.

먼저 반 고흐의 많은 작품들을 훈련 데이터로 학습을 시켜서 어떠한 그림이 들어오면 반 고흐가 그렸는지(아닌지) 판별하는 훈련을 가정해보자.

이진 분류로 가정한다면 반 고흐 그림이면 1, 아니면 0인 레이블이 있는 것이다.

 

결론적으로는 아래 그림과 같다.

 

1.3 생성 모델링과 AI

왜 생성형 AI가 GOAT인가?

-> 1. 순전 이론적인 관점에서 단순 데이터 분류하는 판별 모델링에 그쳐서는 안된다!

        (레이블을 넘어 데이터분포를 완전 이해해야 하는 개념으로 확장시켜야 한다는 점에서)

 

-> 2. 생성형 AI는 강화 학습같은 다른 AI 분야를 선도하기 때문이다.

        (예시로 로봇의 기동 훈련에서, 어떻게 기동할 것인지에 대한 반복적인 훈련이 아닌,

         독립적으로{자율적으로} 수행할 수 있어 매우 효율적으로 바뀔 수 있다.)

 

-> 3. 강 인공지능과 같이, 인간과 견줄 수 있는 AI가 만들어진다면, 반드시 생성형 AI기반일 수 밖에 없다는 점이다.

         창의적인 생각, 창작물과 같은 분야는 인간 고유의 영역이기 때문.

 

 

2. 간단한 생성형 모델

좌표평면위에 어떠한 데이터 포인터를 분포 시키고 실습해보자.

좌표평면 위의 집합 X를 생성, 같은 규칙으로 생성된 것 같은 이 공간의 다른 점들을 선택하는 것이 목표

 

그렇다면 어디를 선택하겠는가? 우선 범위로 따진다면, 주황색 박스 안에서만 데이터 포인터가 있을 것이라 예측할 것이다. ( 기존 데이터 포인터와 같은 원리인 것을 가정한다면)

그러면 당신은 첫 생성 모델링을 성공한 것이다!

 

2.1 생성 모델링 프레임워크

이제 맨 처음 데이터 포인터들의 근거를 알아보자. 

 

1. 세계지도의 대륙 위에서 위치할 것.

2. 바다는 포인터가 찍히지 않을것.

3. 주황색 박스 안에서 찍혀야 할 것

위 그림의 A,B,C 모델을 통해서 해석해보자면,

A는 바다에 찍혀있기 때문에 원본 데이터셋이 아니고, 생성 모델이 찍은 포인터이다.(실패)

B는 대륙위에 찍혀 있지만 주황색 박스 밖에 위치해 있기 때문에 A와 마찬가지로 생성 모델이 찍은 실패 포인터

C는 성공한 모델.

 

이 예제는 쉽고 단순해 보이지만 생성 모델링의 아주 중요한 기본 개념이다. 

 

2.2 표현학습

표현(representation)의 의미에 대해서는 심도 있게 생각해볼 필요가 있다.

이 책 뿐 아니라, 인공지능 학습 전반에 걸쳐 "고차원 데이터"를 "표현"한다는 의미는 매우 중요하기 때문이다.

 

먼저 표현학습의 핵심 아이디어를 알아보자.

당근마켓에서 나는 판매자A와 신도림역에서 거래를 하기로했다. 나와 A는 서로를 알지 못한다.

수많은 인파속에서, 나는 A를 만나기위해 나의 생김새를 설명해야한다. 여기서 나는 (1,1,16),(1,2,15) 이렇게 픽셀값으로 전달하지 않고, 안경을끼고 있고, 검은색 코트를 입고 있다 등과 같이 설명할 것이다. 이런 설명들이 많아진다면 A는 머릿속에 내 이미지를 상상할 수 있을것이다.

이것이 표현학습의 핵심 아이디어이다.

 

고차원의 표본 공간을 직접 모델링 하는 방식이 아닌, 저차원의 잠재 공간을 이용, 훈련 세트의 각 샘플을 표현하고 이를 원본 공간의 포인트에 매핑한다. -> 따라서 잠재 공간의 각 포인트는 고차원 이미지에 대한 표현이라고 할 수 있다.

  

이 깡통은 높이와 너비라는 두 가지 feature로 정의할 수 있다. 이 말인 즉슨, 고차원 이미지(3차원)가 저차원(2차원)상의

x(높이), y(너비) 두 가지로 표현할 수 있다는 것이다. 이를 통해서 모델을 훈련하게 되면, 큰 장점이 하나 있다.

 

"잠재 공간에서 표현 벡터 값을 수정하여 이미지의 고수준 속성에 영향을 주는 연산을 (쉽게)할 수 있다는 점"이다.

-> 고차원에서 이미지가 input 되었을 때, 높이를 키우려면 개별 픽셀을 어떻게 조정할 지 복잡하다.

    (높이 키우고 RGB값 조정 등) 하지만, 잠재공간에서 이는 단순 높이라는 feature만 조정하면 되기 때문!!

 

위 개념에 대해서 더 자세히 들어가보자.

훈련 데이터 셋을 잠재공간으로 들이기 위해서는 "인코딩(encoding)" 작업이 필요하다.

인코딩 이후 잠재공간에서 샘플링을 한 후 디코딩(decoding)하여 원래 도메인으로 되돌아가는 개념으로 확장할 수 있다.

 

위 작업을 "인코더-디코더"라고 하고, 이는 데이터가 놓여있는 고차원 비선형 매니폴드를 샘플링 가능한 잠재공간으로 변환한다. 아래 그림을 통해 이해해보자.

 

다른 종 강아지 세 마리와 사과, 자동차 이미지가 있다고 해보자.

당연하게도 강아지 세 마리는 모두 매우 유사한 거리를 가질 것이고, 사과와 자동차와 개는 상대적으로 거리가 멀다.

 

- 매니폴드 : "데이터가 존재하는 공간"

- 매니폴드에 대한 가정: "고차원일지라 하더라도, 집합을 포함하는 저차원의 매니폴드는 존재한다."

- 흥미로운 진실 : 고차원 상에서는 가까운 데이터 -> 실제로는 가깝지 않다.

                            저차원 상에서는 가까운 데이터 -> 가깝다!

 

따라서 아래 그림-> 고차원 매니폴드를 저차원으로 변환 -> 강아지들끼리의 유사도를 매핑할 수 있다는 것 같다.

 

참고:<매니폴드에 대한 이해>

https://blog.naver.com/coniecual/221417921857

 

매니폴드(manifold)란 뭘까?

논문을 읽을 때, manifold라는 단어가 많이 나와서 한 번 찾아봤었는데,  그래도 막 명확히 와닿지 않...

blog.naver.com

 

 

1.3 핵심 확률 이론

생성 모델링이 확률분포의 통계적 모델링과 밀접하게 연관이 되있음을 살펴보았다.

이 파트에서는 딥러닝, 생성형 AI와 관련된 핵심 확률/통계 개념에 대해서 알아보도록 하자.

 

1. 표본공간

- 샘플 x가 가질 수 있는 모든 값의 집합

 

2. 확률 밀도 함수 (=밀도 함수)

- 포인트 x를 0과 1의 숫자로 매핑하는 함수 p(x).

- 표본 공간에 있는 모든 포인트에 대해 밀도 함수를 적분했을 때 1이 되는 함수.

 

3. 모수 모델링

- 안정적인 P ^ model(x)을 찾는데 사용하는 기법.

- 모수 모델은 유한한 개수의 파라미터(θ)를 사용해 기술할 수 있는 밀도 함수 p(x)의 한 종류.

 

4. 가능도(likelyhood)

- 파라미터 집합 θ의  가능도{L(θ|x)} = 관측된 포인트 x가 주어졌을 때 θ의 타당성을 측정하는 함수.

- 입력으로 주어진 확률분포(=파라미터(세타))가 얼마나 데이터를 잘 설명하는 나타내는 점수

-> 데이터를 잘 설명한다 -> 해당 확률 분포에서 높은 확률 값을 가지는 것을 말함

이게 뭔소리노?

쉽게 이해해보자. 확률과 우도를 같은 선상에서 이해하면 와닿을 수 있다.

 

일반적으로 확률을 떠올리면 이산형 확률 변수를 생각하기 쉽다. ex) 동전-> 앞면 나올 확률 등

하지만 연속형 확률 변수라면? ex) 지하철 화장실 변기를 열었을 때 똥이 있을 확률 등

 

여기서는 고양이 몸무게의 확률 변수에 대해서 가정해보자. ex) 고양이 몸무게가 4kg~5kg 사이일 확률은?

확률: 입력 데이터는 변하지만 분포는 고정되어 있는 상황!

 

 

이에 반해 우도는 입력 데이터는 고정되어 있고, 분포가 변한다.(데이터가 주어졌을 때, 분포가 데이터를 잘 설명하는가)

좌측과 우측을 보면 알겠지만 서로 다른 분포를 가진다. (데이터는 고정)

여기서, 고양이 몸무게가 5kg 일 때의 likelihood는 오른쪽이 0.7979로 훨씬 더 높다.(더 잘 설명하는 것(값 높기 때)

"좌측의 분포보다, 우측의 분포가 주어진 데이터들 더 잘 설명한다, 발생가능성이 더 높다" 라 설명할 수 있음 

데이터가 주어졌을때 분포가 데이터를 얼마나 잘 설명하는가  --> 이게 사실 머신러닝의 주 목적이라 할 수 있다.

 

참조: https://huidea.tistory.com/276 

 

[Machine learning] 우도(likelihood) 총정리 (MLE, log-likelihood, cross-entropy)

머신러닝을 수식 기반으로 뜯어보면 우도 개념이 빈번히 등장하는데, 우도 개념을 확실히 잡고 가보려한다. 우도는 분류 문제의 loss function 으로 Maximum log-likelihood (MLE)로 등장한다. 우도를 이해

huidea.tistory.com

따라서, 우리는 이 likelihood(우도)를 최대화 하는 방향으로 모델을 학습시켜야 겠지??

이를 MLE(Maximum Liklihood Estimation) 최대 우도법이라 하는 것이다.

 

 

L(θ|x) = p(x)라 정의됨.

-> 포인트 x가 주어졌을 때 θ의 가능도는 포인트x에서 θ를 파라미터로 가진 밀도 함수의 값으로 정의.

독립된 샘플로 구성된 전체 데이터 셋 X가 있다면 다음과 같이 쓸 수 있다.

L(θ|x) = ∏ p(x)

0과 1사이의 숫자를 곱하는 일은 계산 비용이 많이 들기 때문에 로그 가능도를 ℓ 대신 사용하는 경우가 많다고 한다.

L(θ|x) = ∑ log p(x)

 

 

일반적으로 모델링 할 때 손실함수를 최소화하는 방향으로 진행한다.

따라서, 음의 로그 가능도를 최소화하는 파라미터 집합을 찾는 것 과 같다고 할 수 있다.

 

참조:

https://89douner.tistory.com/339

 

1. Representation Learning 이란?

안녕하세요. 이번글에서는 representation learning이라는 개념에 대해서 설명하려고 합니다. 개인적으로 2021년 동안 논문을 살펴보면서 가장 눈에 많이 띄었던 용어가 representation learning 이었습니다.

89douner.tistory.com

 

'딥 러닝 > 생성형 AI' 카테고리의 다른 글

05. 확산 모델 (Diffusion model)  (0) 2024.05.31
04. 적대적 생성 신경망(GAN)  (0) 2024.04.06
03. 변이형 오토인코더  (2) 2024.03.22
02. 딥러닝  (1) 2024.03.17

+ Recent posts