2017년 1월 29일 일요일

초짜 대학원생의 입장에서 이해하는 Domain-Adversarial Training of Neural Networks (DANN) (3)

Domain-Adversarial Training of Neural Networks -  Yaroslav Ganin 2016 논문을 기본으로 작성한 리뷰.

 

[DANN으로 toy problem 풀어보기]

* Shallow Neural Network & two moon dataset

공부를 할 때 가장 기본은 많이 읽는 것으로 시작해서 그림으로 생각하고, 마지막으로는 코딩을 통해 직접 이론을 implement를 하여 결과를 시각화하는 것이 최고라고 생각합니다. 거기에 더해 요즘은 블로그로 글 정리를 해보고 있는데 이 것도 스스로 공부가 많이 되네요ㅎㅎ

아무튼 앞에서 이론은 열심히 봤으니까 이젠 코딩을 해봅시다. 지난 글 (1), 글 (2)에서 다뤘던 Domain Adaptation (DA) 이론을 hidden layer 수가 한 개씩으로 얕은 Neural Network를 이용하여 간단한 clustering 문제를 풀어보도록 하겠습니다. 본 글에 나오는 예제 코드는 MATLAB으로 작성하였으며 제 github에 올려두었습니다.

* MATLAB보다 Python이 편하신 분은 제 github에 Window 7,10 Python 3.5 tensorflow-gpu 1.0.0.rc2 버전에서 돌아가는 Jupyter notebook으로 올려두었으니 보시면 됩니다. 
다만 본 글은 수식과 연관하여 이해를 돕기 위해 논문의 pseudo code를 그대로 적용한 MATLAB 코드를 기준으로 설명을 진행하겠습니다. 

사실 이 역시도 논문에 포함되어있는 내용이고, 심지어 저자가 toy code를 python으로 작성하여 github에 올려두었지만 제가 MATLAB language로 옮겨 짜면서 새로 data generation 함수를 추가하였고 main 역시도 더 간단하게 딱 실험에 필요한 부분만 남겨 이해를 도울 수 있도록 요약해보았습니다.

먼저 해결하고자 하는 문제를 확인해보겠습니다.



2017년 1월 22일 일요일

초짜 대학원생의 입장에서 이해하는 Domain-Adversarial Training of Neural Networks (DANN) (2)


저번 글에 이어 오늘 포스팅에서는 Domain Adaptation을 뒷받침하는 이론에 대해 살펴보고, 가능하다면 간단한 예제를 직접 코딩하여 풀어보는 것까지 해보겠습니다.




2017년 1월 19일 목요일

초짜 대학원생의 입장에서 이해하는 Domain-Adversarial Training of Neural Networks (DANN) (1)

Domain-Adversarial Training of Neural Networks -  Yaroslav Ganin 2016 논문을 기본으로 작성한 리뷰. 

Domain Adaptation에 GAN을 적용한 이 논문은 사실 GAN의 original paper보다 먼저 봤는데 어쩌다 보니 순서는 거꾸로 설명을 하게 되었습니다 (...아니 사실 내가 본 순서가 이상하지..-_-)
Domain Adaptation도 GAN에 비견할만큼 주목받고 있는데 이 논문은 심지어 이 분야에 GAN을 적용해 합쳐버린 논문입니다!

이 주제는 전이 학습(transfer learning)이라는 또 다른 역사가 깊고 활발히 연구되고 있는 분야와 직접적인 관계가 있기 때문에 여러 모로 알아두면 좋은 논문.....이라고 해서 저자를 보면 역시나 네임드 Hugo Larochelle이 떡하니 박혀있네요 (무슨 만화 원피스 삼대장 느낌이다..).

본격적으로 논문 내용을 다루기 전에 기본적으로 알면 이해에 도움이 될 배경지식을 잠시 소개하고 가겠습니다.




2017년 1월 15일 일요일

초짜 대학원생 입장에서 이해하는 Generative Adversarial Nets (2)

앞서 초짜 대학원생 입장에서 이해하는 Generative Adversarial Nets (1)에 이어서 큰 줄기 두 가지 중 하나였던 이론적 증명 부분을 정리해보겠습니다.




자신의 blogger/blogspot에서 LaTex equations align 맞추기 (mathjax, equation 등호 tab 간격)

수식을 전개하다 보면 등호가 계속 이어질 때가 있다.
$$A = B = C = \cdots = Z .$$
이 때,
$$\begin{align}A & = B \\ & = C \\ &= \cdots \\ &= Z. \end{align} $$
이렇게 쓰고 싶을 때가 있다. 생각보다 쉬운데 다음과 같이 써주기만 하면 된다.
$$\begin{align}A & = B \\ & = C \\ &= \cdots \\ &= Z. \end{align} $$



자신의 blogger/blogspot에서 LaTex theorem-like environment 작성 가능하게 만들기 (mathjax)

수식 작성을 하다보면 간혹 theorem이라든가 lemma, proposition, definition 등은 논문에서 나오는 형식으로 이쁘게 구별이 되었으면 할 때가 있다. 그리고 앞에서 나온 Theorem에 숫자가 자동으로 붙으면 금상첨화!

The global minimum of the virtual training criterion $C(G)$ is achieved if and only if $p_g=g+{data}.$ At that point, $C(G)$ achieves the value $-log(4)$.
$\mathbb{E}_{x \sim p_{data}} \left[ -log(2)\right] + \mathbb{E}_{x \sim p_{g}} \left[ -log(2)\right]$

뭐 이런 식으로?

그럼 어떻게 해야 하는 지 확인해 보자;
  1. blogger에 로그인 하고
  2. 템플릿 설정에 들어간 후
  3. 맞춤 설정을 클릭하고 
  4. 사이드 바에서 고급을 클릭
  5. CSS 추가로 들어가서 아래 내용을 추가해주면 끝난다. 

body
{
counter-reset: theorem;
counter-reset: definition;
}

.theorem {
    display: block;
    margin: 12px 0;
    font-style: italic;
    counter-increment: theorem
}
.theorem:before {
    content: "Theorem " counter(theorem) ".";
    font-weight: bold;
    font-style: normal;
}
.proposition {
    display: block;
    margin: 12px 0;
    font-style: normal;
    counter-increment: proposition
}
.proposition:before {
    content: "Proposition " counter(proposition) ".";
    font-weight: bold;
    font-style: normal;
}
.lemma {
    display: block;
    margin: 12px 0;
    font-style: italic;
    counter-increment: theorem;
}
.lemma:before {
    content: "Lemma " counter(theorem) ".";
    font-weight: bold;
    font-style: normal;
}
.proof {
    display: block;
    margin: 12px 0;
    font-style: normal;
}
.proof:before {
    content: "Proof.";
    font-style: italic;
}
.proof:after {
    content: "\25FC";
    float:right;
}
.definition {
    display: block;
    margin: 12px 0;
    font-style: normal;
    counter-increment: definition
}
.definition:before {
    content: "Definition " counter(definition) ".";
    font-weight: bold;
    font-style: normal;
}



초짜 대학원생 입장에서 이해하는 Generative Adversarial Nets (1)

* Generative Adversarial Nets - Ian Goodfellow et al. 2014 논문을 기본으로 작성한 리뷰. 

NIPS 2016에서 가장 hot한 키워드를 하나 꼽으라 한다면 Generative Adversarial Network(GAN)이라고 단언할 수 있을 정도로 2014년에 Ian Goodfellow(이름 한 번 독특하네..웬만해서는 이름 쉽게 못 외우는데 한 번에 외웠네요 좋은 친구라니 ㅋㅋ)가 NIPS에서 발표한 paper에서 시작한 GAN 붐은 2016년에 더 크게 터진 것 같습니다.

과연 facebook의 Yann Lecun 교수님이 근 10-20년 간에 기계학습 나온 아이디어 중 최고라고 할만하구나(근데 너무 자주, 여러 번, 모든 곳에서 얘기하시는 듯...뭐..그만큼 중요하단 얘긴가...)란 느낌이 들 정도로 이미지 생성(image generation) 외에도 natural language processing(NLP) 등 다양한 분야에서 엄청난 성과들을 보여주고 있습니다.

당장 TensorFlow나 MatConvNet으로 GAN을 구현해서 뭔가 좀 더 새로운 것을 해내야...졸업을 시작?할 수라도 있을 것 같은 불쌍한 대전의 대학원생은 일단 GAN에 대해 또 열심히 공부를 하기 시작했고...orz... 그 일환으로 Ian Goodfellow의 NIPS 2014 paper를 나름대로 정리해 보았습니다.