Jost Do It.

그냥 IT해.

Study/딥러닝

[CS230] Deep Learning Lecture 4 Adversarial Attacks / GANs

그냥하Jo. 2022. 9. 20. 10:08
반응형

CS230 Deep Learning

Lecture 4. Adversarial Attacks / GANs

강의노트

강의영상

 

 

 

 

 

이번 강의에서 딥러닝 모델을 속이는 방법인 Adversarial Attacks이 무엇인지, 어떻게 속일 수 있는지를 알아보았다.

(개인적으로 딥러닝 네트워크를 적대적으로 공격한다는 표현이 재미있는거 같다.)

 

 

이를 바탕으로 생성모델 GAN에 대한 개념과 GAN과 관련된 여러 연구의 아이디어를 살펴보았다.

 

 

Lecture 4는 Kian 아저씨가 강의한다.

 

 

 

 

 

 

예시를 통해 알아보는 네트워크 적대적 공격 방법

  • Adversarial attacks: 뉴럴넷에 전달하는 Input 값(벡터, 이미지 등)을 조작하여 특정 정보와 전혀 상관 없는 내용의 Input을 특정 정보로 네트워크가 예측하게 만드는 방법. 즉, 네트워크를 속이는 방법이다.

 

  • Adversarial attack은 크게 아래 두가지 유형으로 나뉜다.
    • Non-target attack: 특정 output 목표를 정하지 않고, 단지 모델을 속일 수 있는 방법을 찾아 공격하는 것
    • Targeted attack: 모델이 공격자가 원하는 특정 class로 output을 예측하게끔 공격하는 방법

 

 

 

 

아래 네트워크에 고양이 이미지 Input을 미세하게 조정하여서 이구아나로 속이는 예시를 살펴보자.

 

 

1. 우리가 원하는 것을 생각해보자.

  • 이미지를 넣었을 때 네트워크의 예측 결과인 ŷ은 이구아나를 1로 예측하기를 바란다.
  • 그리고 넣는 이미지 x는 최대한 고양이의 이미지(x_{cat})과 가깝기를 원한다.
  • 넣는 이미지 x는 노이즈에서 학습하는 것보다는 원래 고양이 이미지 (x_{cat})을 입력하는게 학습이 빠르다.

 

2. 1번에 따라 loss function을 재정의한다.

  • 첫번째 term에서 네트워크가 이구아나로 예측하는 방향으로 이미지가 학습된다.
  • 두번째 term에서는 이미지가 고양이 이미지(x_{cat})과 최대한 가깝게 유지된다.

 

3. Gradient와 Backpropagation을 통해 이미지를 학습한다.

  • 이 때 ImageNet의 사전학습된 파라미터는 학습되지 않고 동결된다 (freezing).
  • 단지 이미지 x의 값들만 위 Loss function을 줄이는 방향으로 변경된다.

 

 

 

위 결과를 통해 학습된 이미지는 아래와 같다.

엥? 고양구아나?

 

  • 왼쪽 이미지나 오른쪽 이미지나 사람은 둘다 고양이로 분류할 것이다.
  • 그런데 네트워크는 블러처리 된거 같은 오른쪽 이미지는 이구아나로 확신하고 있다.
  • 이미지 x의 작은 값들만 흔들어줘도(원본 내용은 거의 변하지 않아도), 네트워크를 교란할 수 있는 것이다!

 

 

 

생각해보면 이미지 공간은 매우 넓다.

 

2차원 공간으로 표현한 입력 가능 이미지 space

 

이미지 픽셀단위로 표시되고, 색깔 RGB로 숫자 0 ~ 255로 나타내진다.

 

여기서 이미지의 크기가 가로 32 px * 세로 32 px로 가정해보자.

 

그러면 이 크기 내에서 이미지는 총 256^(32 * 32 * 3) 개, 즉 10^7400개의 이미지가 생성할 수 있다!

 

매우 많은 수가 표현 가능한 것이다.

 

 

 

 

이를 2차원 공간에 단순화해서 표현해보자.

 

먼저 파란 타원 input image로 입력가능한 공간이다. 위에서 말했던 10^7400개의 이미지다.

 

다음으로 빨간 원 실제 이구아나의 이미지이다.

 

한편 보라색 타원 인간이 보기에 이구아나로 보이지만, 실제 이구아나는 아닌 경우이다.

 

마지막으로 연두색 타원 네트워크가 이구아나로 분류하는 경우이다.

 

 

 

 

그림에서 주황색 원같이 인간의 눈에 고양이로 보이지만, 이구아나로 분류된 경우는 크게 위험하지 않을 수 있다.

 

실제 이구아나의 모습과 많이 다르고, 금방 잘못된 fake 이미지인 것을 발견할 수 있기 때문이다.

 

 

하지만 그림에서 노란색 별과 같이 인간의 눈에도 이구아나로 보이고, 모델도 이구아나로 분류하는 경우는 매우 위험할 수 있다.

 

인간도 실제와 구별하지 못하고, 모델도 이구아나로 분류하기 때문이다.

(문제가 단순해서 그렇지, 누군가의 범죄 사진에 내 얼굴이 구별 못하게 합성돼있다 생각하면 아찔하다.)

 

 

 

그래서 네트워크가 adversarial attack에 취약하면 아래의 문제점이 생길 수 있다.

  • 소셜 미디어에서 폭력성을 감지하는 AI모델을 속이고 폭력적인 콘텐츠를 몰래 업로드
  • 스마트폰의 얼굴 인식 잠금장치를 다른사람이 풀 수 있다.
  • 자율 자동차가 특정 사물을 인식하지 못할 수 있다.

 

 

네트워크는 왜 적대적 공격에 취약할까?

 

네트워크를 공격하는게 어떻게 가능할까?

 

 

과거의 연구자들은 네트워크의 non-linearity 특성, 그리고 특정 데이터셋에 overfitting되는 문제가 네트워크를 공격하는게 가능케 한다고 생각하였다.

 

한편 딥러닝 연구의 선구자인 Ian Goodfellow와 그의 연구팀은 딥러닝의 linear part가 문제가 발생한다고 보았다.

 

즉 딥러닝의 학습이 기본적으로는 linear regime에서 학습이 되고, 거기에 activation function이 붙는 구조이기 때문에 adversarial attack이 가능하다고 본 것이다.

 

 

 

아래 네트워크 예시를 살펴보자.

 

 

n개의 input (x_{1} ~ x_{n})을 받아서 y를 학습하는 간단한 모델이다.

 

파라미터 weight와 b가 학습되고, 그 결과 특정 x에 대한 예측 값 ŷ을 추론할 수 있다.

 

 

 

여기서 x의 값을 살짝 움직여보자.

 

x*의 경우 기존 x값과 거의 차이가 나지 않는다.

 

하지만 x*의 종속변수 예측 값 ŷ x값이 조금 바뀐 것과 다르게 매우 크게 바뀐 것을 알 수 있다.

 

이는 식을 보면 알 수 있는데, x에 더해준 εw 값이 모델 웨이트 w와 곱해지면서 L2 distance로 양수가 된다.

 

 x* x로부터 조금씩 이동을 하였지만,  ŷ을 예측하는데 있어 weight의 l2 distance * ε만큼의 영향을 받는 것이다.

 

 

 

특히 이미지는 dimension이 매우 크기 때문에 x에서 매우 작은 값만 옮겨도 adversarial attack이 더 손쉽게 가능하다.

 

 

 

 

Fast Gradient Sign Method

 

 x*를 학습하는 방법은 Gradient의 sign을 이용한 방법인 Fast Gradient Sign Method가 있다.

 

이 방법은 아래 한계들을 극복하려 하였다.

  • w 값으로 x*를 업데이트하는 경우, w값이 클 때 x* x와 멀게 학습될 수 있다. 
  • x의 dimension이 큰 경우에 ŷ에 더 큰 영향을 미치게 된다.

 

 

 

적대적 공격들을 방어하는 방법

 

 

적대적 공격은 공격자가 모델 정보를 이용 가능한지 여부에 따라 White-box Black-box로 나뉜다.

 

여기서 모델 정보는 Parameter, activation function, 모델 구조 등을 의미한다.

  • White-box: 모델 정보를 이용할 수 있다. 따라서 속이기가 쉽다.
  • Black-box: 모델 파라미터에 접근이 어렵다(encrypted). 따라서 backpropagation이 어렵고, 속이기 어렵다.

 

하지만 black-box의 경우에도 Numerical gradient의 방법 등을 이용해 적대적 공격이 가능하다.

 

 

적대적 공격을 SafetyNet을 통해 방어하는 방법도 있다.

  • SafetyNet: 입력된 이미지가 가짜인지, 진짜인지 먼저 구분하는 모델을 학습
  • 모델 학습을 위해서 입력된 이미지가 진짜인지, 가짜인지가 라벨링되어 있어야한다.
  • Loss함수 L_{new}를 통해 학습한다. 첫번째 term은 이미지의 라벨을 구분하고, 두번째 term에서 x의 값을 일부 흔들은 결과에 대해서도 y를 예측하게끔 한다. 즉, adversarial attack을 피하고 모델의 강건성(robustness)를 부여하는 것이다 (두번째 term에서 어느정도 x를 흔들어도 y를 예측하게끔 네트워크를 학습한다). 
  • adversarial image를 잘 이해하도록 일반화 시키는게 중요하다. 특정 이미지의 특징에만 overfit되는 부작용이 생길 수도 있다.

 

 

 

 

 

다음으로 생성모델 GAN을 살펴보려 한다.

 

GAN은 Adversarial의 개념을 이용해서 사용자가 원하는 데이터를 새로 생성해내는 것이다.

 

 

Generative Adversarial Networks (GANs)

 

GAN은 생성하고 싶은 유형의 데이터들을 학습해서 이 유형과 닮은 데이터들을 네트워크가 새로 생성하는 모델이다.

 

 

 

여기서 직관은 모델 파라미터보다 학습에 사용되는 데이터의 양을 충분히 많게 하여서 모델이 이미지 공간에서 해당 이미지의 유형이 나타내는 분포를 잘 학습하게 한다.

 

즉, 특정 이미지 유형의 분포를 학습함으로써 이와 비슷한 이미지를 출력할 수 있게한다.

 

 

 

 

그러면 GAN 모델은 어떤 구조를 가지고 있을까?

 

GAN 모델의 구조

 

GAN 모델 이미지를 생성하는 모델 Generator 이미지가 진짜인지, 생성된 이미지인지를 분간하는 Discriminator로 나뉘게 된다.

 

속이는 사람(Generator)과 이를 분간하는 사람(Discriminator)이 게임을 한다고 보통 표현한다.

 

 

먼저 Discriminator는 이미지를 input으로 받아 그 이미지가 진짜인지, 가짜인지 분간하는 것을 학습한다.

 

즉, binary classification문제이며, 학습이 어렵지 않다.

 

 

다음으로 Generator는 랜덤 벡터 값을 넣어서 이미지를 생성한다.

 

그리고 Discriminator에 해당 이미지벡터를 넣어서 출력되는 gradient를 이용해서 generator 모델을 학습한다.

 

이 때 Discriminator의 모델 parameter는 동결 시키고, Generator의 모델 parameter만 학습한다.

 

 

여기서 학습은 Gradient descent를 이용해 실제 이미지와 생성된 이미지 두가지를 minibatch하여서 학습이 된다.

(Discriminator의 학습에는 실제 이미지도 필요함, Generator는 필요없음)

 

 

이를 반복하면서 생성되는 이미지의 퀄리티를 계속해서 증가시킨다.

 

 

 

Generator와 Discriminator의 Loss function은 다음과 같다.

Generator와 Discriminator의 Loss function

 

먼저 Discriminator는 real 이미지는 1로 예측하고, 가짜 이미지는 0으로 예측하게 cross entropy 구조로 되어있다. 

 

즉, 이미지의 생성 여부를 구분해야하기 때문에 real/fake 이미지 모두 학습에 사용된다.

 

 

Generator의 경우 생성하는 가짜 이미지만을 이용해서 학습한다.

 

그리고 Discriminator를 잘 속이는 것이 최종 목표이기 때문에 loss function은 discriminator loss function의 음수가 된다.

 

이 때 해당 loss function으로는 초기에 학습이 잘 되지 않는 문제가 있는데 아래에서 더 자세히 알아보자.

 

 

 

Generator의 Loss function

초반 Generator의 이미지는 노이즈에 가깝고 이미지에 패턴이 없기 때문에 Discriminator는 가짜라고 잘 맞춘다.

 

즉, 초반에는 D(G(z)) 값이 대부분 0으로 예측된다.

 

한편 딥러닝 모델은 chain rule을 이용해 layer의 파라미터를 순차적으로 학습하기 때문에 loss의 크기도 parameter 학습 시간에 영향을 미친다.

 

여기서 문제가 발생한다.

 

D(G(z)) 값에 따른 loss (J^(G)) 값

 

그림에서 보듯이 위에서 설정한 Loss 값인 Saturating cost는 D(G(z))가 0부근일 때 크기가 매우 작다.

 

즉, loss의 크기가 작은만큼 파라미터가 느리게 업데이트되어 학습시간이 많이 걸리게된다.

 

따라서 이 Loss를 Non-saturating cost로 바꾸어 초기에 Discriminator가 0주변으로 예측하였을 때의 penalty를 크게 해준다.

 

 

log 함수

위 로그함수의 그림을 보면 더 잘이해된다.

 

초반에 discriminator가 생성된 이미지를 가짜로 예측(0)한 경우, 큰 패널티를 줌으로써 모델의 학습 속도를 빠르게 할 수 있다.

 

위에서 언급한 Loss function 외에도 GAN과 관련된 다양한 연구에서 Generator와 Discriminator를 위한 다른 Loss function을 제시하고 있다.

 

 

 

한편 이미지 생성을 잘하려면 가짜 이미지를 구분하는 Discriminator의 성능이 좋아야 한다.

 

즉, Discriminator의 성능이 Generator가 달성할 수 있는 이미지 퀄리티의 upper bound라고 할 수 있다.

 

따라서 Generator 학습이 num_iterations 만큼 된다면, Discriminator는 각 반복마다 k번의 학습을 더 해준다.

 

즉, Discriminator는 k * num_iterations 만큼 학습하여 Generator보다 더 빨리 성능을 올리는 것이 학습에 효율적이다.

 

 

 

 

아래에서는 GAN을 이용한 학습 결과들을 살펴보자.

 

 

GAN에 입력하는 입력벡터의 연산

안경 + 남자 - 남자 + 여자 = 안경 + 여자

그림에서 벡터 3개를 넣어서 이미지를 생성해냈다고 하자.

  • 첫번째 이미지: 안경 쓴 남자
  • 두번째 이미지: 남자
  • 세번째 이미지: 여자

 

여기서 첫번째 벡터(안경O+남자)에 두번째 벡터(남자)를 빼고, 세번째 벡터(여자)를 더한 벡터로 이미지를 생성하면 매우 흥미로운데, 이미지는 안경 쓴 여자를 출력하게 된다.

 

즉 우리가 생각하는 연산의 결과가 실제 이미지 생성에도 영향을 미치는 것이다!

 

linear space에 인코딩된 vector를 연산한 결과가 이미지에 바로 영향을 준다는 것이 매우 흥미로운 결과였다.

 

 

 

 

 

Cycle-GAN

 

GAN을 이용해서 재미있는 이미지 변환 문제도 살펴보자.

 

예시는 내용과 배경은 유지한채 말을 얼룩말의 모습으로 바꾸거나, 얼룩말을 말의 모습으로 바꾸는 문제이다.

 

이 경우 특정 개체의 모습만 변경하는거라 완전 pair한 이미지를 모으는게 어렵다 (똑같은 배경과 외양을 가졌는데 종만 다른 말과 얼룩말 사진은 구하기 매우 어려울거다).

 

 

 

이 경우, GAN 두개를 순환하면서 학습하는 Cycle-GAN 방식으로 해결하는데 모델 구조는 아래와 같다.

 

Cycle-GAN의 구조

  • H: 말 이미지
  • Z: 얼룩말 이미지
  • Generator 1(H2Z): 말 이미지를 얼룩말로 바꾸는 Generator
  • Discriminator 1: Generator 1의 가짜 이미지를 구분하는 Discriminator
  • Generator 2(Z2H): 얼룩말 이미지를 말로 바꾸는 Generator
  • Discriminator 2: Generator 2의 가짜 이미지를 구분하는 Discriminator

 

위 구조처럼 말 이미지(H)를 Generator 1에 넣어서 얼룩말 이미지(G1(H))를 생성한다.

 

그리고 생성된 얼룩말 이미지 (G1(H))를 다시 Generator 2에 넣어서 말 이미지로 복원 (G2(G1(H)))한다. 

 

그리고 각 생성된 결과들을 이용해 Generator와 Discriminator를 학습한다.

 

 

마찬가지로 얼룩말 이미지(Z)를 이용해서 Generator 2와 Discriminator 2도 학습한다.

 

 

 

 

Cycle-GAN Loss function은 아래와 같이 설정된다.

Cycle-GAN의 Loss function

 

G1, D1, G2, D2에 대한 Loss function은 일반적인 GAN의 Loss function과 동일하다.

 

한편 Cycle을 돌리며 2개의 GAN모델이 순환적으로 학습되기 때문에 이와 관련된 loss function J^{cycle}이 추가된다.

 

결과적으로 Cycle-GAN의 Loss function은 위 5개의 Loss function을 다 더한 결과이다.

 

 

 

 

생성모델은 현실에 존재하지 않는 데이터를 새로 생성해낼 수 있다는 장점으로 많이 연구되고 있다.

 

특히 GAN 개념을 이용해서 지금도 다양한 연구들이 진행되고 있다.

 

반응형