기계 학습(Machine Learning, 머신 러닝)은 즐겁다! Part 8

Jongdae Lim
16 min readNov 9, 2017

--

신경망을 의도적으로 속이는 방법

해킹의 미래에 관한 이야기

프로그래머들이 컴퓨터 프로그램을 작성하기만 하면, 컴퓨터 해커들은 그 프로그램을 악용할 방법을 알아냈습니다. 악의적인 해커들은 프로그램의 작은 버그를 이용해 시스템에 침입하여 데이터를 훔쳐냈는데, 이는 일반적으로 막대한 피해를 입혔습니다.

100% 진짜 해커들™*

* 역자주: 위 해커 영상은 사실 NICS(미국 범죄 TV 시리즈)의 한 장면으로, 두 명이 함께 타이핑을 하고 말도 안되는 화면과 코드들이 보이는 장면입니다. 저자는 해커 이미지에 대한 이 과장된 장면을 “100% 진짜”라는 단어로 살짝 비꼬며 재미있게 표현한 것입니다.

그렇다면, 딥러닝(deep learning) 알고리즘으로 동작하는 시스템도 인간의 간섭으로부터 안전해야 합니다. 그렇죠? 해커는 테라 바이트 단위의 데이터로 훈련 된 신경망을 어떻게 뚫을 수 있을까요?

가장 진보된 딥신경망(deep neural networks) 조차 쉽게 속일 수 있음이 밝혀졌습니다. 몇 가지 트릭을 사용하면, 신경망이 당신이 원하는 결과를 예측하게 할 수 있습니다:

이 고양이 사진을 토스터기로 인식하도록 변형했습니다.

따라서 당신은 딥신경망으로 동작하는 새로운 시스템의 서비스를 시작하기 전에, 이를 파괴하는 방법과 공격자로부터 자신을 보호하기 위해 무엇을 해야 하는지 정확하게 알아야 합니다

경비원으로서의 신경망

우리가 Ebay와 같은 경매 웹사이트를 운영한다고 상상해 보겠습니다. 우리의 웹사이트에서는 사람들이 금지 된 품목(살아있는 동물과 같은 것)을 판매하지 못하도록 막고 싶습니다.

수백만 명의 사용자가 있는 경우에 이런 규칙을 적용하는 것은 어렵습니다. 수백 명을 고용해서 모든 경매 목록을 수작업으로 검토 할 수는 있지만, 비용이 많이 들 것입니다. 대신에, 우리는 딥러닝을 활용해 금지된 품목에 대한 경매 사진을 자동으로 확인하고 규칙을 위반한 것들에 플래그(flag)가 달리게 할 수 있습니다.

이것은 전형적인 이미지 분류 문제입니다. 이를 제작하기 위해, 딥 컨볼루션 신경망(deep convolutional neural network)을 훈련해서 허용된 품목과 금지된 품목을 구분하도록 훈련시킨 후, 우리의 사이트에 있는 모든 사진을 이 신경망에서 실행할 것입니다.

먼저, 과거의 경매 목록으로부터 수천 개의 이미지 데이터 세트를 만들어야 합니다. 우리는 허용된 품목과 금지된 품목을 구분하도록 신경망을 훈련시켜야 하기 때문에 두 종류의 이미지가 모두 필요합니다:

신경망을 훈련시키기 위해, 우리는 표준 역전파(back-propagation) 알고리즘을 사용할 것입니다. 이는 훈련 사진을 전달하고, 이 사진에 대한 예상 결과를 전달한 다음에 신경망의 각 층으로 되돌아가 좀더 나아지도록 이들의 가중치를 약간씩 조정해 그 그림에 대한 정확한 결과가 나오게 하는 알고리즘입니다:

이 모델이 허용 가능한 정확도로 올바른 결과를 신뢰할 수준으로 만들어 낼 때까지, 수천 장의 사진으로 수천 번을 반복할 것입니다.

최종 결과는 신뢰할 수준으로 이미지를 분류하는 신경망입니다:

참고: 컨볼루션 신경망이 이미지에서 어떻게 객체를 인식하는지 좀더 자세히 알고 싶다면, Part3를 확인하세요.

하지만, 그렇게 신뢰할 수는 없습니다…

컨볼루션 신경망은 이미지를 분류 할 때 전체 이미지를 고려하는 강력한 모델입니다. 컨볼루션 신경망은 이미지상에 나타나는 위치에 관계없이 복잡한 모양과 패턴을 인식 할 수 있습니다. 다양한 이미지 인식에 있어, 이 신경망은 인간의 능력과 같거나 심지어 더 나을 수 있습니다. https://medium.com/@jongdae.lim/%EA%B8%B0%EA%B3%84-%ED%95%99%EC%8A%B5-machine-learning-%EC%9D%80-%EC%A6%90%EA%B2%81%EB%8B%A4-part-3-928a841a3aa

이러한 환상적인 모델을 사용할 때, 이미지의 몇몇 픽셀을 어둡게 또는 밝게 변경한다고 해서 최종 예측에 큰 영향을 미치지 않을 것입니다. 그렇죠? 물론, 최종 확율값이 약간 변경 될 수 있겠지만, 해당 이미지를 “금지됨”에서 “허용됨”으로 바꿔서는 안됩니다.

우리의 기대: 입력 사진에 작은 변화를 주면 최종 예측에도 단지 작은 변화만이 생겨야 한다.

하지만, 신경망의 아주 흥미로운 특징(Intriguing properties of neural networks)이라고 불리는 2013년의 유명한 논문에서, 이것이 항상 사실이 아니라는 것이 밝혀졌습니다. 당신이 정확히 어떤 픽셀을 변경하고 정확히 얼마만큼 변경해야하는지 안다면 사진의 모습을 그렇게 많이 변경하지 않고도 의도적으로 신경망이 주어진 사진에 대해 잘못된 출력을 예측하게 할 수 있습니다.

이는 분명히 금지된 품목의 사진을 의도적으로 조작해 신경망을 완전히 속일 수 있다는 것을 의미합니다:

왜 이렇게 되는 걸까요? 기계 학습의 분류기(classifier)는 우리가 구별고자 하는 것들 사이의 구분선을 찾아 냄으로써 동작합니다. 다음은 녹색 좌표(허용)과 적색 좌표(금지)를 구분 짓는 간단한 2 차원 분류 기준선을 그래프로 나타낸 것입니다:

현재, 이 분류기는 100% 정확도로 동작합니다. 적색 좌표과 녹색 좌표을 완벽하게 구분하는 선을 찾아 냈습니다.

그런데, 만약 우리가 적색 좌표 중 하나를 녹색 좌표으로 잘못 분류하게 하게 조작하려면 어떻게 해야 할까요? 적색 좌표을 녹색의 영역으로 옮기기 위한 최소 이동량은 얼마인가요?

경계 바로 옆에있는 적색 좌표의 Y 값에 약간의 값만 더하면 녹색 영역으로 손쉽게 밀어 넣을 수 있습니다:

따라서, 분류기를 속이기 위해서는 그 좌표 이 선을 넘기 위해 조금씩 움직일 방향을 알아야합니다. 그리고 우리의 사악함이 드러나지 않기 위해, 이상적으로 좌표을 가능한 조금씩 옮겨서 정직한 실수처럼 보이게 해야 합니다.

딥신경망을 사용한 이미지 분류에서, 우리가 분류하는 각각의 “좌표”는 바로 전체 이미지를 구성하는 수천개의 픽셀입니다. 이는 좌표를 구분선(decision line)을 넘게하기 위해 조작해야할 가능한 값이 수천 개나 된다는 뜻입니다. 또한, 사람이 눈치채지 못할 정도로 이미지의 픽셀을 조정해야만, 이미지가 조작된 것처럼 보이지 않으면서 분류기를 속일 수 있습니다.

다시 말해서, 어떤 물체의 실제 사진을 찍은 후 픽셀을 아주 조금만 변경해서 신경망이 이 사진을 전혀 다른 것으로 판단하도록 완전히 속일 것입니다. 그리고, 신경망이 대신 인식하게 될 객체 또한 정확히 조정할 수 있습니다:

고양이를 토스트로 인식했습니다. 이미지 검색 결과는 Keras.js web-based demo에서 진행했습니다.

신경망을 속이는 방법

앞서 신경망을 훈련시켜 사진을 분류하는 기본적인 과정에 대해 이야기했습니다:

1. 훈련 사진을 제공(feed)합니다.

2. 신경망의 예측을 확인하고 정답에서 얼마나 떨어져 있는지 확인합니다.

3. 최종 예측이 정답에 조금씩 가까워 지도록 역전파(back-propagation)를 사용해 신경망의 각 계층의 가중치를 조정합니다.

4. 수천 개의 훈련 사진으로 1 ~ 3 단계를 수천 번 반복합니다.

그런데, 신경망 계층들의 가중치를 조정하는 대신에 우리가 원하는 답을 얻을 때까지 입력 이미지 자체를 수정하는것은 어떨까요?

이제 이미 훈련 된 신경망을 이용해 다시 “훈련”을 시작하겠습니다. 이번에는 역전파를 신경망 계층에 사용하는 대신 입력 이미지(input image)를 조정하는데 쓸 것입니다:

이를 위한 새로운 알고리즘을 만들었습니다:

1. 우리가 해킹하고 싶은 사진을 제공(feed)합니다.

2. 신경망의 예측을 확인해서, 이 사진에 대해 우리가 원하는 답변과 얼마나 차이가 나는지 확인합니다.

3. 역전파(back-propagation)를 사용해서 사진을 조정해 최종 예측이 우리가 얻고 싶은 답변에 조금 가까워지도록 만듭니다.

4. 신경망이 원하는 답을 내 놓을 때까지 동일한 사진으로 1 ~ 3 단계를 수천 번 반복합니다.

결국에 우리는 신경망 자체의 내부를 전혀 바꾸지 않고도 이미지만으로 신경망을 속일 수 있게 될 것입니다.

유일한 문제는 아무런 제한없이 어떤 픽셀이라도 조정할 수 있기 때문에, 이미지에 대한 이러한 변경들이 당신이 알 수 있을 정도로 충분히 극단적이라는 것입니다. 이 변화들은 변색된 점이나 물결같은 영역으로 보여집니다:

얼마나 많은 픽셀을 조정할 수 있는지에 대한 제약없이 해킹된 이미지. 고양이 주면에 녹색으로 변색된 점들과 흰색 벽에 물결 패턴을 볼 수 있습니다.

이러한 명백한 왜곡을 방지하기 위해서, 우리의 알고리즘에 간단한 제약 조건을 추가 할 수 있습니다. 예를 들어 해킹된 이미지의 어떤 픽셀도 원래 이미지로부터 아주 적은 양 이상으로 변경될 수 없다 라고 정할 수 있습니다 — 0.01 %와 같은 기준 같은 것입니다. 이렇게 하면 우리의 알고리즘은 원래의 이미지와 너무 다르게 보지 않으면서도 신경망을 여전히 속일 수 있도록 이미지를 조정할 수 있습니다.

다음은 제약을 추가한 다음에 만들어진 이미지 입니다:

하나의 필섹이 얼마나 변경될 수 있는지에 대한 제약을 두고 만들어낸 해킹된 이미지

우리에겐 똑같은 이미지 처럼 보이지만, 여전히 신경망을 속일 수 있습니다!

코딩을 해봅시다

코딩을 하기 위해서는, 먼저 사전에 훈련된 신경망이 필요합니다. 처음부터 신경망을 훈련하는 대신 Google에서 만든 것을 사용하겠습니다.

인기있는 딥러닝 프레임워크인 Keras에는 여러가지 사전에 훈련된 신경망(pre-trained neural networks)이 함께 제공됩니다. 우리는 1000가지 종류의 객체(1000 different kinds of objects)를 인식하기 위해 사전 훈련 된 Google의 Inception v3 딥신경망 복사본을 사용할 것입니다.

신경망을 사용하여 사진에 무엇이 있는지 인식하기 위한 Keras의 기본 코드입니다. 실행하기 전에 Python 3Keras를 설치해야 합니다:

실행해 보면, 아마도 우리 이미지를 페르시아 고양이로 인식할 것입니다 :

$ python3 predict.pyThis is a Persian_cat with 85.7% confidence!

자 이제 신경망을 속일 때 까지 이미지를 조정해 이 고양이를 토스터라고 생각하도록 조작해 보겠습니다.

Keras에는 신경망 계층을 훈련하는 대신 입력 이미지를 훈련시키는 기능이 탑재되어 있지 않기 때문에, 조금은 어렵지만 수동으로 훈련할 단계를 코딩해야만 합니다.

그 코드는 다음과 같습니다:

이를 실행하면, 결국에는 신경망을 속일 이미지를 뱉어낼 것입니다.

$ python3 generated_hacked_image.pyModel's predicted likelihood that the image is a toaster: 0.00072%[ .... a few thousand lines of training .... ]Model's predicted likelihood that the image is a toaster: 99.4212%

참고 : GPU가 없는 경우에는 실행하는데 몇 시간이 걸릴 수 있습니다. Keras 및 CUDA를 통해 GPU를 올바르게 구성했다면, 실행에는 수분 이상 소요되지 않습니다.

이제 기존 모델을 다시 실행해서 막 만들어낸 해킹된 이미지를 테스트 해 보겠습니다:

$ python3 predict.pyThis is a toaster with 98.09% confidence!

해냈습니다. 고양이를 토스터기로 생각하도록 속였습니다.

해킹된 이미지로 무엇을 할 수 있을까요?

이와 같이 해킹된 이미지를 만드는 것을 “적대적인 사례 만들기”라고 합니다. 우리는 의도적으로 데이터 조각을 조작해서 기계 학습 모델이 분류를 잘못 하도록 만들었습니다. 이것은 신기한 기술이긴 하지만, 왜 이것이 현실 세계에서 중요할까요?

연구에 따르면 이러한 해킹 된 이미지에는 몇몇 놀라운 특징들이 있습니다.

1. 해킹된 이미지를 종이에 인쇄해도 여전히 신경망을 속일 수 있습니다! 따라서 이렇게 해킹된 이미지를 사용해서 파일을 직접 업로드하는 시스템 뿐만 아니라 실제 카메라나 스캐너도 속일 수 있습니다.

2. 특정 신경망을 속일 수 있는 이미지는 완전히 다르게 설계된 신경망이라도 만약 유사한 데이터로 훈련되었다면 이를 속일 수 있습니다.

또한, 이러한 해킹된 이미지로 다양한 것들을 할 수 있습니다!

하지만, 이러한 이미지를 만드는 방법에는 여전히 큰 한계가 있습니다 — 우리의 공격은 신경망에 직접 접근해야 합니다. 우리는 사실 신경망을 속이기위한 “훈련”을 하는 것이기 때문에, 이 신경망의 복사본이 필요합니다. 그러나 현실에서는 어떤 회사도 그들의 훈련된 신경망 코드의 다운로드를 허락하지 않습니다. 이렇게 되면 공격을 할 수가 없습니다. 그렇죠?

틀렸습니다! 연구자들은 최근 신경망이 어떻게 동작하는지 조사함으로써, 우리의 대체 신경망이 다른 신경망을 미러링하도록 훈련시킬 수 있음을 보여주었습니다. 그리고 이 대체 신경망을 사용해 해킹된 이미지를 만들어 원래 신경망을 속일 수 있습니다! 이를 블랙박스 공격(black-box attack)이라고 합니다.

블랙박스 공격은 무한하게 응용할 수 있습니다. 그럴듯한 몇 가지 예가 있습니다.

  • 자가 운전 차량을 속여 녹색 신호를 정지 신호로 판단하게 속일 수 있습니다 — 이는 자동차 충돌 사고를 일으킬 수 있습니다!
  • 컨텐츠 필터링 시스템을 속여 공격적이고 불법적인 컨텐츠를 올릴 수 있습니다
  • ATM 수표 스캐너를 속여서 수표에 쓰여진 금액이 실제보다 훨씬 더 큰 금액이라고 판단하게 할 수 있습니다. (실제로 잡혀도 부인할 수준으로 말이죠!)

그리고 이러한 공격 방법은 단지 이미지에만 국한되지 않습니다. 동일한 접근을 통해 다른 유형의 데이터에서 동작하는 분류기도 속일 수 있습니다. 예를 들어, 컴퓨터 바이러스 스캐너를 속여 바이러스를 안전한 코드로 인식하게 할 수 있습니다!

이러한 공격으로부터 우리 스스로를 어떻게 보호 할 수 있을까요?

이제 우리는 신경망(및 다른 모든 기계 학습 모델들 역시)을 속일 수 있다는 것을 알게되었는데, 우리는 어떻게 이를 방어할 수 있을까요?

간단한 대답은 아직은 아무도 완전히 확신할 순 없다는 것입니다. 이러한 종류의 공격을 방어하는 것은 계속 진행중인 연구 분야입니다. 최신의 성과물을 알아보는 가장 좋은 방법은 이 분야에서 가장 영향력있는 연구원인 Ian Goodfellow와 Nicolas Papernot이 관리하는 cleverhans blog를 읽어 보는 것입니다.

다음은 지금까지 알아낸 것들입니다.

  • 간단히 해킹된 이미지를 많이 만들어 훈련 데이터 세트에 포함 시키면, 신경망이 이러한 공격에 좀더 저항성을 갖게 됩니다. 이를 적대적 훈련(Adversarial Training)이라고 하고, 아마도 현 시점에 채택할 수 있는 가장 합리적인 방어법일 것입니다.
  • 원래 모델을 모방한 두번째 모델을 훈련시키는 Defensive Distillation이라고 하는 꽤 효과적인 접근방법도 있습니다. 그러나 이 접근법은 새롭고 다소 복잡하기 때문에, 특별한 필요성이 없는 한 아직은 고려않을 것입니다.
  • 이 외에 지금까지 시도한 다른 모든 아이디어는 이러한 공격을 방어하는 데 도움이되지 못했습니다.

아직 결론적인 답변이 없기 때문에, 신경망을 사용할 때 당신의 비지니스에 손해를 끼칠지도 모를 이러한 종류의 공격으로 인한 위험을 최소한 알고 있다는 시나리오를 가치있게 생각해 봐야 합니다.

예를 들어, 제한된 자원에 대한 접근 권한을 부여하는 유일한 방어선으로 단 하나의 기계 학습 모델을 사용하면서 이 모델이 절대 속지 않을 것이라고 가정한다면, 이는 아마도 좋지 못한 생각일 것입니다. 그러나 기계 학습을 여전히 인간의 검증이 있는 프로세스의 한 단계로 사용한다면 그것은 아마도 괜찮을 것입니다.

다시 말해서, 당신의 아키텍처에서 기계 학습 모델도 잠재적으로 우회할 수 있는 다른 구성 요소와 마찬가지로 생각해야 합니다. 사용자가 의도적으로 속일 때 어떤 일이 발생하는지 가정한 다음 이러한 시나리오를 완화 할 수 있는 방법을 생각해야 합니다.

더 배우기

적대적인 사례(Adversarial Examples)와 이를 방어하는 방법에 대해 더 자세히 배우고 싶은가요?

이 글이 마음에 들었다면, 제 Machine Learning is Fun! 이메일 리스트에 가입하는 것도 좋습니다! 새롭고 멋진 소식이있을 때만 이메일을 보내 드리겠습니다. 제가 이런 종류의 추가 글을 올릴때가 언제인지 알 수 있는 가장 좋은 방법입니다.

Twitter의 @ageitgey인 저를 팔로우하거나, 직접 이메일을 보내거나 또는 linkedin에서 저를 찾을 수도 있습니다. 기계 학습으로 제가 당신이나 당신의 팀을 도울 수 있다면 언제든 연락 주십시오.

*역자주: 번역글과 관련해 의견 주시려면, 저에게 직접 이메일을 보내시거나 LinkedIn에서 저를 찾으셔도 됩니다.

--

--

Jongdae Lim

I’m a Java guy, working at Microsoft as a principal software engineering manager in CSE(Commercial Software Engineering).