부스트캠프에는 특별한 세션이 존재한다.

 

쏘카에 계신 변성윤님께서 마스터로 계시는데, 변성윤 마스터님께서 해당 세션을 맡아 진행해주고 계신다.

 

부캠을 하면서 앓고 있던 고민을 익명(또는 실명)으로 작성하고 그 고민들을 바탕으로 해결할 수 있도록 대안책이나 의견을 말씀해주시고 그 외에도 필요한 정보들(이력서 작성이나 삶의 지도, API 등!)을 하나하나 알려주시기도 한다.

 

사실 이번주가 다섯 번의 두런두런 시간 중 네 번째 시간이었는데, 앞서 많은 이야기들을 남겨두고 네 번째 시간에서 언급된 "조급함"과 "신입"이라는 관점에서 나의 상황을 대입해 느낀 점을 적어보고자 한다.

 

이걸 보는 나와 비슷한 사람들에게 도움이 되었으면 좋겠다.

 

조급한 마음을 갖고 일을 진행하면 잘 될까?

질문을 보면 누구나 "No."라고 대답할 정도로 쉽게 말할 수 있을 것 같다.

 

쉬운 질문같아 보이지만 세상에 쉬운 질문도 이유 없이 만들어지지는 않았다.

 

대표적으로 사람은 시간이 촉박하다고 느끼거나 내 상황이 불안하다고 느낄 때 "조급함"을 느끼게 된다.

 

그렇다면 그 사람은 '아, 내가 지금 조급함에 사로잡혀 일을 제대로 진행하지 못하고 있는 것 같아. 조급함을 버려야겠어.' 라고 생각할까?

 

당연하게도 내 자신이 "조급함을 갖고 있다."라고 인식하지 못 할 것이다.

 

여기서 모든 일에 있어서 생각해야 할 것과 명심해야 할 것이 참 많은데 그 중 하나가 "조급함"이라고 생각한다.

 

'아, 나 이것도 해야하고 저것도 해야하는데 시간은 이만큼 뿐이야. 빨리 해야 해.'

 

'곧 졸업 시즌인데 다른 사람보다 스펙이 부족한 것 같아. 이번 방학때는 정신차리고 자격증 몇 개, 어학 몇 점, 인턴은 두 군데 이상, 주말에는 스터디도 하고 밤 12시 전에 잘 생각하지 말자.'

 

두 질문이 보이는 공통점을 알겠는가? 모두 '시간'과 '욕심'에서 비롯한 '조급함'이다.

 

결국에 다시 생각해보면 조급함을 초래하는 많은 원인 중 가장 사람들을 괴롭히는 원인은 '시간', '욕심', '계획'이라고 생각한다.

 

'일찍 계획세워서 준비했더라면..'

 

'아, 시간이 조금만 더 있었더라면..'

 

후회를 하기 전에 계획을 잘 세워야 하는 것이 첫째다.

 

그런데 문제가 있다.

 

프로젝트를 진행할 때는 당연하게도 "데드라인"이 존재하기 마련이다. (즉, 먼저 준비하기에는 한계가 있다.)

 

이런 경우 우리가 어떻게 해야할까?

 

그 답을 두런두런에서 찾을 수 있었다. (이 부분은 나를 포함한 많은 캠퍼분들이 이번 두런두런에서 얻을 수 있던 부분이 아닐까 생각한다.)

 

"취사선택"과 "우선순위"

 

한정된 시간 속에서 해야 할 것은 많다. 그럴 수밖에 없다.

 

한정된 시간 속에서 '아 나는 이것밖에 못했는데 왜 저사람은 이 짧은 시간안에 저만큼 할 수 있었을까?'하고 바라보게 되는 사람이 한 명은 꼭 있기 마련인데, 그 사람들은 항상 "우선순위"를 잘 정한 것 같았다.

 

이것도 해야하고 저것도 해야할 때, 갈팡질팡하거나 모두 동시에 진행하려고 하고, 너무 크게만 일을 보고 있다면 "우선순위"를 정해보는 것이 정말 큰 도움이 될 것 같다.

 

사실 이 우선순위를 정하고 진행하면 가장 처음에 하는 것들은 보통 기초가 되는 부분이나 뼈대가 되는 부분이기 때문에 당장에 눈에 보이는 성과가 없어서 불안할 수도 있을 것 같다. (내가 항상 그래왔다.)

 

그럼에도 불구하고 자신을 믿고 일의 우선순위를 정하여 차근차근히 진행한다면 시간이 주는 조급함을 조금이라도 해소할 수 있지 않을까 생각한다.

 

 

신입, 경력이 참 빵빵하군! 그런데, 이것은 왜 했나? 저것은 왜 선택했고? 이유를 알려줄 수 있겠나?

사실 이것은 내 현재 상황을 보는 것 같다.

 

내가 알기론 현재 부캠에서 내가 가장 어리다. (멘토님 말씀에 의하면 현재까지의 1기, 2기, 3기 중에서 가장 어리다고 하신 것을 보면 아마 부캠 역사 중 내가 제일 어린 것 같다.)

 

이 "어리다"라는 것이 장점으로 보일 수 있지만 단점이 꽤 명확하다.

 

다른 사람들은 이미 경력도 쌓아본 적이 있거나 경험이 풍부한 사람들이다.

 

그런 사람들은 똑같은 교육을 듣더라도 얻어가는 것이 더 많고 더 자세하게 공부하기 마련이다. (또한, 공부에 있어서 완급조절도 잘한다.)

 

반대로 나의 경우 교육을 듣더라도 이해가지 않는 부분이 등장하고 (특히 수식과 어려운 개념, 또는 영어..) 일단 받아들이고 프로젝트에서 써보는 경우도 많다.

 

그리고 '조금 어릴 때부터 다른 사람들보다 앞서기 위해서는 해볼 수 있는 경험을 많이 쌓아보아야 하고 스펙도 많이 잘 쌓아야 한다.'라는 생각을 갖고 있었는데 이 생각을 다시 해보게 되는 계기가 바로 변성윤 마스터님께서 말씀해주신 아래의 내용이다.

 

"신입의 경력은 화려할 필요가 없다. 하나의 프로젝트에서라도 왜 이것을 선택했고 적용했는지를 잘 설명할 수 있어야 한다."

 

집중할 포인트는 "왜 선택, 왜 적용, 어떻게 적용"이다.

 

이 부분이 앞서 내가 말했던 단점이 제대로 부각되고 내 생각이 조금 잘못되었음을 보여준다.

 

교육을 수강할 때 놓치거나 "받아들인"다면 "왜"라는 것을 생각하지 못하게 된다.

 

즉, 가르쳐줬으니 쓰는 것이고 성능이 잘나오니 쓰는 것이 된다.

 

면접관이 "00님, 이 모델을 왜쓰셨나요?"라고 묻는다면 "아, 그 모델 SOTA라서 썼어요."라고 대답할 수 있는가?

 

면접관이 "00님, 이 방법은 무슨 이유로 도입하셨나요?"라고 묻는다면 "그거요? 멘토님이 가르쳐주셔서 좋아보이는 것 같아 썼어요."라고 대답할 수 있는가?

 

안된다. 사실 안된다라는 표현보다 잘못되었다라는 표현이 어울릴 것 같다.

 

프로젝트를 설계함에 있어서 "단순히 좋아서", "알려줘서" 사용한다면 이는 잘못되었다.

 

당장에 Kaggle을 보아도 답이 보인다.

 

현재 Medical Segmentation 분야 대회가 있는데 공유된 Code들을 보면 paperswithcode에 성능이 잘나오는 모델들이 훨씬 많음에도 불구하고 mask r-cnn, unet, resnet 등이 빈번하게 사용된다.

 

"왜?"

 

대표적으로 "제한된 학습 시간"이라는 이유 한 가지가 있을 것이다.

 

즉, 모든 조건, 모든 변수를 고려하고 분석을 통하여 적합한 선택지를 추려놓고 실험을 통해서 결정해야 한다. (일반적으로)

 

이런 점에서 "자세하게"가 아닌 "무조건 많고 화려하게"가 정답이 아님을 보여준다.

 

 

다음으로 내 생각에 대해서 수정해보았다.

 

앞서 말했듯 내 생각은 '조금 어릴 때부터 다른 사람들보다 앞서기 위해서는 해볼 수 있는 경험을 많이 쌓아보아야 하고 스펙도 많이 잘 쌓아야 한다.'였다.

 

이 생각이 완전히 틀렸다는 것이 아니다. 핀트가 잘못되었다.

 

"경험을 많이 해보는 것" 당연히 중요하다.

 

"스펙도 많이 잘 쌓는 것" 당연히 좋다.

 

잘못된 것은 "다른 사람들보다 앞서기 위해서"라는 점과 "많이"라는 것이다.

 

일단 다른 사람들보다 앞서기 위해서 스펙을 쌓는다는 것은 미련한 짓이다.

 

앞서고자 스펙을 쌓는다면 단순히 "양"에 집중하게 될 것이고 그로 인해서 각각의 스펙을 쌓는 과정에서 내가 자세하게 들어갔다면 얻을 수 있는 것들을 모두 잃게 된다.

 

즉, 수정하자면 아래와 같다.

 

'나를 위해서라도, 내가 성장하고자 한다면 지금부터라도 해볼 수 있는 경험을 다양하게 해보고 얻을 수 있는 것들을 최대한 얻자.'

 

 

사실 위 내용이 두런두런 4회차에서 앞 부분만으로 얻은 내용이다.

 

앞서 말했던 것처럼 1회차부터 3회차에는 위와 같이 많은 사람들이 공통적으로 겪고 있는 고민들을 포함해서 삶의 지도 작성 팁, 이력서 작성 팁, 질문하는 방법, 직군 찾기 등 정말 큰 도움이 되는 내용들을 많이 공유해주셨다.

 

단순히 "딥러닝 공부"만 우선순위로 생각하는 것이 아니라 그 외 부수적인 요소부터 "Computer Science"에만 해당하는 것이 아니라 살면서 중요한 것들도 많이 얻을 수 있는 시간이 두런두런이라고 생각한다.

 

그래서 내가 가장 좋아하는 부스트캠프 세션도 마스터 클래스나 오피스 아워, 프로젝트, 강의 등이 아닌 두런두런인 것도 위와 같은 이유에서다.

 

 

내가 어떻게 살아왔는지 "삶의 지도"를 통해서 조금 더 내 삶을 돌아볼 수 있었고 앞으로 어떻게 나아가야 할지를 생각했으며,

 

내가 희망하는 "직군"을 어떻게 찾아야 할 지, 무엇이 있는지를 생각해보게 되었고

 

그 직군으로 일을 시작하기 위해서 내가 쌓아온 경력들을 어떻게 "이력서"에 잘 녹여낼 수 있는지를 배웠으며

 

지금 배울 때뿐만 아니라 회사에 들어가서도 어떻게 "질문"해야 하는지를 터득하였고

 

회사에서 프로젝트를 할 때 "프로젝트 매니징""아키텍처 설계"가 왜 필요한지도 배웠다.

 

그리고 절대 조급해하지 말자는 것도.

 

이것이 1회차부터 4회차까지 배운 내용이다.

 

꼭 상기하고 생각해보고 적용해보자.

 

큰 도움이 될 것이다.

PyTorch에서 NNI를 이용해 auto-ml을 이용해보고 싶었는데, 블로그 글이나 유튜브에 생각보다 마음에 든 내용들이 없었다.

 

부스트캠프 AI Tech 3기에서도 6주차 오피스아워 때 NNI auto-ml 사용이 소개되었는데, 그대로 따라 해 보았지만,,, 에러가 너무 많이 났다.

 

에러를 모두 해결한 지금 auto-ml 사용 방법을 자세히 적어보려 한다.

 

참고로 관련한 내용은 NNI 개발 github에 적혀있는 방법 및 코드 + 오피스아워에서 다뤄진 방법 + 내가 해결한 에러 목록들까지 합쳐서 작성하였다.

 

NNI 개발 github인 https://github.com/microsoft/nni 창을 켜놓고 보면 더 편리할 것 같다.

 

1. NNI 설치

NNI 개발 github에서 권고한 방법대로 NNI를 설치한다.

 

2. 개발 github의 nni/examples/trials/mnist-pytorch/config.yml에 들어가 코드를 전체 복사한다.

# This is the minimal config file for an NNI experiment.
# Use "nnictl create --config config.yml" to launch this experiment.
# Afterwards, you can check "config_detailed.yml" for more explanation.

searchSpaceFile: search_space.json
trialCommand: python3 mnist.py  # NOTE: change "python3" to "python" if you are using Windows
trialGpuNumber: 0
trialConcurrency: 1
tuner:
  name: TPE
  classArgs:
    optimize_mode: maximize
trainingService:
  platform: local

이 코드도 수정을 하긴 할 것이다.

 

3. NNI를 적용시킬 코드가 있는 폴더로 와서 nni 폴더를 하나 생성한 후, config.yml 파일을 똑같이 생성하여 위에서 복사한 코드를 붙여넣는다. (지금 와서 생각해보면, nni폴더는 굳이 필요 없을 것 같긴 하다.)

나의 경우는 이랬다.

 

4. config.yml의 코드를 보면, trialCommand: python3 mnist.py라고 적혀있는데, mnist.py를 NNI를 적용시킬 파일 명으로 바꾸고, nni 폴더를 생성하여 config.yml을 만들었다면 trialCodeDirectory: ../도 추가해 준다. (그렇지 않으면 나중에 NNI를 실행 했을 때 trial이 failed 뜬다..) 혹여나 gpu를 사용하고 싶다면 trialGpuNumber를 수정하고, trainingService:에 useActiveGpu: True를 추가해 주면 된다. 더 추가하고 싶은 것이 있다면 config_detail.yml을 보면 된다.)

searchSpaceFile: search_space.json
trialCommand: python3 train.py  # NOTE: change "python3" to "python" if you are using Windows
trialGpuNumber: 0
trialConcurrency: 1
trialCodeDirectory: ../
tuner:
  name: TPE
  classArgs:
    optimize_mode: maximize
trainingService:
  platform: local

 

5. config.yml을 설치한 것처럼 search_space.json 파일도 하나 생성한다. (nni 폴더에 config.yml을 만들었다면 똑같이 search_space.json도 해당 폴더에 만들라는 의미)

나의 경우에는 이렇게 했다.

 

6. 개발 github의 nni/examples/trials/mnist-pytorch/search_space.json에 들어가 코드를 전체 복사하고, 본인이 실험하고 싶은 hyper-parameter에 맞게 수정한다.

 

7. 개발 github의 nni/examples/trials/mnist-pytorch/mnist.py에 들어가서 nni.report_intermediate_result(test_acc)와 nni.report_final_result(test_acc) 코드 두 개를 복사해서 자신의 코드 중 test_acc를 출력하는 코드에 각각 삽입한다.

해당 이미지 기준 118번 째 줄과 123번 째 줄 코드만 복사하면 된다.

 

8. 다시, mnist.py의 제일 하단에 보면 nni를 이용하는 코드 두 개가 있는데, 복사하여 자신의 parser 적용이 끝난 이후의 코드에 붙여 넣는다. (단, 자신의 코드 중에 params를 인자로 받아서 vars(params)를 적용하는 코드가 존재한다면, 161번 코드를 그대로 복사 붙여넣기 하지 말고, vars를 제외하여 붙여 넣는다.)

해당 이미지 기준 159번, 161번 코드이다.

9. NNI 개발 github에서 권고한 방법으로 실행 시키면 된다. (여기서, --port 8080 처럼 port를 지정할 수 있다. 또한, 서버를 사용하는 사람은 NNI를 실행했을 때 뜨는 ip가 아니라 개인이 쓰고 있는 서버 ip를 써야 한다.)

당연하게도 경로는 각자에 맞게 설정해준다.

 

끝!

네이버 부스트캠프 AI Tech 3기의 4주 차가 지나가고 지금은 5주 차로 접어드는 시기이다.

 

4주 차 내용에서 어려웠던 CNN 기술들, Transformer, Auto Encoder (VAE, AAE 등), Generative Models (GAN 등)을 논문을 통해서 공부해보고자 생각했고, 처음 선택하게 된 논문은 Ian Goodfellow의 Generative Adversarial Nets 즉, GAN의 관한 논문이다.

 

 

왜 이 논문을 선택했냐고 묻는다면 크게 세 가지 이유를 말할 수 있는데,

 

1. 내가 희망하는 분야인 medical 분야 중 신약 분야에서 Graph Neural Networks (GNN)과 더불어 GAN이 많이 사용되고 있기 때문

 

2. 수업에서의 난이도가 개인적으로 많이 어렵게 느껴졌고, 첫 번째 이유인 내가 희망하는 분야에서 많이 사용되는 모델인데 어렵다고 나중에 공부하자는 마인드는 모순되었기 때문

 

3. 현재까지 resnet이 많이 사용된 것처럼 GAN이 현재뿐만 아니라 미래에도 많이 사용되거나 GAN을 바탕으로 모델들이 발전할 것 같기 때문이다.

 

 

1. Abstract

 

바로 논문의 Abstract로 넘어가 보자.

 

Abstract를 읽어보면 목적과 개념에 대해서 상단에 언급이 되어있고, GAN의 특징이 하단에 적혀있다.

 

특히, Abstract에서 D와 G가 많이 보이는데 이는 GAN의 핵심이 되는 개념 중 하나인 Generative model (Generator)와 Discriminative model (Discriminator)이다.

 

이 개념은 조금 이따가 보기로 하고 Abstract에 적혀있는 내용 중 또 다른 핵심 개념들인 adversarial process, minimax, Markov chains 등을 먼저 알아보고 넘어가 보려고 한다. (지나가면서 unrolled approximate inference networks도 잠깐 언급하겠다.)

 

 

먼저, minimax에 대해서 알아보자.

 

사실 minimax는 구글에 검색해서 wiki를 보면 바로 이해가 되는 개념이긴 하다.

 

wiki에 따르면, 최악의 경우에서 발생 가능한 손실을 최소화한다는 규칙이라고 적혀있는데, 예시를 통해서 보면 조금 더 이해하기 쉬울 것 같다.

 

예를 들어, 도박을 하면 보통 1위에게 모든 돈을 몰아준다.

 

이때, 게임에서 패배하더라도 최악으로 패배할 때의 손실을 최소화하겠다는 알고리즘이다.

 

쉽게 말해서 시험을 엄청 망치면 부모님한테 역대급으로 혼날 것이고, 혼나더라도 많이보다는 적게 혼나기 위해 우리가 변명하는 것을 생각하면 될 것 같다. (물론, 실제로는 그러면 더 혼난다 ㅋㅋㅋ)

 

 

다음으로는 Markov chain을 알아보겠다.

 

Markov chain을 보기 전에 Markov process를 이해해야 한다.

 

Markov process는 GAN에서만 필요한 개념이 아니라 Auto-regressive Model를 다룰 때에도 필요한 개념으로 알고 있는데, 잘 알아두어야 할 것 같다.

 

Markov process의 개념은 어떠한 미래 상태가 있고, 그 미래 상태의 확률 분포가 현재 상태에 의해서만 결정된다는 뜻이다.

 

즉, 과거의 결과를 미래의 상태를 계산할 때 반영하지 않겠다는 뜻으로 볼 수 있겠다.

 

이때, Markov chain은 Markov process에서 이산 시간일 경우만 고려한 것이다.

 

참고로 이산 시간에서 "이산"이 뜻하는 것은 키나 몸무게와 같이 연속적인 값이 아닌 주사위 눈금 같은 비연속적이나 숫자로 표시되는 값을 말한다. (1, 2, 3, 4, 5, 6도 연속이지 않냐라고 생각할 수 있지만, 1과 2 사이에는 무수한 숫자가 존재하므로 이산으로 보자는 것이다.)

 

Markov process에 관한 예시를 하나 들어보겠다.

 

 

이번 달에 민초파인 사람이 다음 달에도 민초파일 확률을 90% (0.9), 다음 달에는 반민초파가 될 확률을 10% (0.1)라 하자.

 

또한, 이번 달에 반민초파인 사람이 다음 달에도 민초파일 확률을 60% (0.6), 다음 달에도 반민초파일 확률을 40% (0.4)라고 하자.

 

초기에 민초파인 인원은 10만 명이고, 반민초파인 인원은 100만 명으로 정했다.

 

 

위에서의 확률을 그대로 행렬로 변환하는데, 이 행렬을 상태 변이 확률 행렬이라고 한다.

 

자, 그러면 Markov chain에 따라서 다음 달에 민초파인 사람과 반민초파인 사람의 인원수를 구해보자.

 

과거가 어쨌든 간에 현재의 상태 변이 확률 행렬만 계산에 반영되므로 이를 초기 값에 곱해주면 민초파와 반민초파의 인원이 각각 69만 명, 41만 명으로 계산될 것이다.

 

 

그러면 2개월 후의 인원도 마찬가지로 구해보자.

 

현재의 민초파와 반민초파의 인원은 각각 69만 명, 41만 명이고 어떠한 과거의 요소가 개입이 되지 않으므로 똑같이 행렬 곱 계산을 해주면 된다.

 

자세한 계산은 위의 PPT 이미지를 참고하면 될 것 같다.

 

 

이를 조금 더 발전시켜보면 Markov chain의 상태 변이 확률 행렬과 초기값이 주어졌을 때, n만큼 지난 후의 값은 행렬곱을 n번 반복한 것과 동일하다고 볼 수 있는 것이다.

 

Markov chain은 Auto Encoder 외에도 다수의 내용에서도 등장하는 개념이니 조금 깊게 다루어 보았다.

 

 

여기서 unrolled approximate inference nets에 대해서 잠깐만 짚고 넘어가겠다.

 

Abstract에 보면 unrolled approximate inference가 나오는데 이 개념(approximate inference)은 논문에서 계속 Markov Chain과 함께 과거 Generative model과 GAN을 비교하는 동안 등장한다.

 

approximate inference는 앞서 언급했다시피 Auto-regressive model에서 나오는 개념으로 (이는 VAE와 AAE에서 필요한 개념의 일부입니다.) 당시에는 Bayesian network와 같은 구조를 활용한 model을 활용했는데 이를 말하는 것으로 보고 있다.

 

따라서, unrolled approximate inference nets에 너무 집중하지 말고 GAN이 이와 달리 여러 step 없이 end to end로 학습과 inference 된다는 것을 강조하는 데에 사용된다고만 알고 있으면 될 것 같다. (사실 동일한 이유로 Markov chain도 깊게 다룰 이유가 없었지만, 개인적으로 Markov chain은 사용 범위가 넓다고 생각하여 자세하게 다뤘다.)

 

 

끝으로 이 논문의 핵심인 adversarial process와 generative model G, discriminative model D에 대해서 알아보는데, 이를 Introduction과 연계하여 알아보겠다.

 

먼저, adversarial을 영어 그대로 하면 "적대적인, 대립하는"으로 라이벌을 이용한 공부와 유사하다고 볼 수 있다.

 

Generative Adversarial Networks에서 사용되는 적대적 존재들은 조금 특별하게도 Introduction의 중반부에 자세한 예시와 함께 나와있다.

 

 

2. Introduction

해당 이미지 출처 : https://sites.google.com/site/aidysft/generativeadversialnetwork

Introduction에 따르면, generative model에서 대립하는 존재는 discriminative model과 generative model이라고 적혀있는데 이 예시는 GAN을 검색해본 사람이라면 누구나 들어본 경찰과 위조지폐범 이야기이다.

 

일단은 discriminative model의 학습이 data 분포에서 온 것인지 아니면 모델(즉, generative model)에서 온 것인지를 결정함으로써 학습한다고 되어 있다.

 

이 다음에 generative model을 감지되지 않게끔 가짜 지폐를 생산 및 사용하고자 시도하는 위조범과 동일하게 생각할 수 있다고 비유를 주고, discriminative model을 가짜 지폐를 찾고자 하는 경찰로 비유하고 있다.

 

즉, Generative model (Generator)은 가짜 data를 생성하는 생성 모델, Discriminative model (Discriminator)은 가짜와 진짜를 구별하는 분류 모델이라고 생각하면 된다.

 

Generative model과 Discriminative model이 등장하게 된 배경은 Introduction의 초반부에 적혀있다.

 

조금 논문을 해석하는 방향으로 보면서 설명하겠다.

 

Deep Learning의 기본적인 목표는 AI가 학습한 data의 종류 외에도 들어오는 data를 확률 분포로 나타낼 수 있는 계층적으로 깊은 형태의 모델을 발견하는 것이라고 한다.

 

또한, 이전까지 성능이 좋았던 Deep learning은 고차원으로 구성된 Discriminative model을 사용하고 있었고 piecewise linear를 사용하여 backpropagation과 dropout을 잘 되게 했었다. (piecewise linear는 https://dawoum.ddns.net/wiki/Piecewise_linear_function에 잘 설명되어 있다.)

 

하지만, 과거의 generative models를 "deep"하게 쌓을수록 복잡한 확률 계산을 근사하기 어려웠고 piecewise linear의 장점이 별로 영향을 끼치지 않았기에 성능이 나오지 않게되었고 이를 바탕으로 새로운 generative model을 고안했다고 적혀있다.

 

Introduction 마지막에는 "adversarial nets"에 대한 정의가 나오는데, 그대로 해석해보면 generative model이 multilyaer perceptron을 통해서 random noise를 전달하여 sample(즉, discriminator를 헷갈리게 하는 fake data)을 생성하며 discriminative model도 multilayer perceptron인 model이라고 되어 있다.

 

마지막이 GAN의 핵심이 되는 말인데, 과거에 Markov chain이나 다른 inference를 사용하여 복잡한 절차를 거친 모델들과 달리 GAN은 이런 복잡한 절차 필요 없고 generative model은 forward propagation으로 sample을 생성한다는 점, 그럼에도 불구하고 generative model과 discriminative model은 backpropagation과 dropout이 잘 되어 성능도 잘 나온다는 점을 강조하고 있다.

 

이 부분은 바로 이어서 나오는 Related Work의 초반부에서 과거의 모델들을 언급하며 설명이 더 자세하게 되어 있는데 이정도면 충분할 것 같다. (잠깐 언급하자면, 과거의 모델인 Boltzmann machines, deep Boltzmann machines의 특징과 단점에서부터 Deep belief networks(DBNs)로의 발전, noise-contrastive estimation(NCE)와의 비교 등이 적혀있으며 이 과정에서 discriminative model을 어떻게 사용했고, generative model을 어떻게 했는지 언급하고 있다. 이후 GSNs와 Markov Cahin에 관한 이야기, backpropagation에 대한 이야기까지 나와있다.)

 

 

3. Adversarial nets

여기서 잠깐 이런 의문이 들 수 있다.

 

"아니, GAN이 adversarial learning을 이용해서 학습하는 것도 알겠습니다. adversarial이 되는 주체들은 generative model과 discriminative model이라는 것도요. 그리고 generative model은 가짜 데이터를 discriminative model에게 주어서 헷갈리게 한다는 점도 알겠습니다. 그러면 앞에서 다룬 background 개념들은 어디에 쓰이고, 왜 이렇게 헷갈리게 하는 게 더 도움이 된다는 건가요?"

 

두 가지를 먼저 대답하겠다.

 

하나는 Markov Chain이 과거의 Model들에는 많이 쓰였으나 GAN에서는 쓰이지 않았다는 점을 강조하고자 언급한 점 (앞에서도 말했지만 이는 Deep learning을 공부하다보면 많이 나오는 개념이기에 알아두면 좋겠다는 생각에 길게 썼다.)

 

두 번째로는 minimax와의 관계이다.

 

위의 사진에는 이상한 수식이 적혀있는데, 하나하나 보겠다.

 

등호의 좌측에 적혀있는 minmax V(D, G)는 G는 V함수를 최소화하고, D는 V함수를 최대화하겠다는 의미이다.

 

여기서 $ D(x) $는 second multilayer perceptron (discriminative model)이 G가 만든 data인 $ p_g $인지, 아니면 real data에서 온 $ x $인지를 확률로 나타내는 함수이다.

 

여기서, discriminative model과 generative model이 adversarial이라는 관점을 적용시켜보면 D는 $D(x)$를 높여야하고 (= discriminative model이 generative model가 만든 가짜 data인지 아니면 진짜 data인지를 제대로 판별) G는 반대로 D(x)를 낮추어야 한다. (여기서 x는 real data에서 온 data라고 했을 때)

 

또한 G가 만든 데이터 z에 대해서 $ G(z) $가 $D(x)$의 input으로 올 때 (즉 수식으로는 $ D(G(z)) $) D는 이를 real data로 판별할 확률을 줄여야 하고, G는 높여야 한다.

 

수식에서의 통일성을 주고자 $ 1 - D(G(z)) $로 바꾸어서 (D의 output은 확률이므로) 보면 D는 $ D(x) $와 $ 1 - D(G(z)) $를 높여야 하며, G는 반대로 모두 낮춰야 한다.

 

이를 모두 합쳐서 수식으로 나타내면 바로 위의 자료에서 등호의 우측 수식이 되는 것이다.

(첨언하자면, 통계에서 확률에 log를 씌워 정규성을 높인다고 한다.. 또한 $ \mathbb{E}_{x\sim p_{data}} $는 data의 확률 분포를 따르는 $ x $의 기댓값으로 해석하면 된다. 우측에 동일하게 생긴 것도 마찬가지 -> $ z $의 의미를 생각해서!)

 

즉, 위의 의문에서 adversarial의 특징이 minimax와 맞았고 그로 인해 사용 되었다고 보면 될 것 같다.

 

이를 통해서 GAN의 필수 수식을 이해하였고 작동 원리까지 이해할 수 있었다.

 

이 아래부터는 G와 D를 어떻게 학습에 사용하였고 어떻게 성능을 내고자 했는지에 대한 내용이 적혀있다.

 

해당 부분부터는 수학 수식이 많이 나오기 때문에 주의하기 바란다.

(선형대수와 확률통계도 안 듣고 수업 듣는 나를 가장 잘 표현하는 이모티콘)

 

 

--- 이 이후는 다시 읽었을 때 계속해서 작성할 예정 ---

 

 

 

 

 

+ Recent posts