모두의 딥러닝 2 Lec 14 ~ 17 review
안녕하세요 이번 C조 발표를 맡은 김태현입니다.
오늘 발표할 내용은 weight initialization(가중치 초기화)에 대한 내용입니다.
다른 내용들은 앞에서 잘 발표해주실거라 믿어서 가중치 초기화에 더 집중해서 설명해보려고 합니다.
먼저 Weight initialization이 중요한 가장 큰 이유는 학습이 제대로 안되서입니다. 이 부분에 대해서는 강의에 잘 나와있기 때문에 넘어가도록 하겠습니다.
원래는 vanishing gradient 문제 때문에 두 번째 Neural Network의 암흑기를 겪고 있었는데 2006년, 딥러닝의 아버지, 제프리 힌튼 교수가 RBM을 사용하여 가중치를 초기화를 하고 학습시키면 훨씬 좋은 결과를 낼 수 있다는 것을 논문으로 발표를 합니다.
“Geoffrey Hinton은 Andrew Ng와의 인터뷰에서 지금까지의 연구자로써의 인생에서 가장 자랑스러운 것을 꼽으라고 한다면 RBM을 이용한 연구성과를 꼽는다고 말한 바 있다.”
라고 말했다고 합니다. (제가 직접 영상을 봤는데 17년도 영상이라 지금은 바뀌었을 수도 있을 것 같네요)
어쨌든 RBM에 대해 알아보면
원래 볼츠만 머신은 확률 밀도 함수를 학습하기 위해 만들어졌다고 합니다.
이때 확률 밀도 함수란 확률 변수의 분포를 나타내는 함수라고 정의되어있는데
옆에 그래프를 보시면 제가 한번 만들어봤는데
예를 들어 모든 고양이의 색깔이 검정색, 하얀색, 갈색, 회색 이렇게 4가지 종류가 있다고 했을 때 확률 분포를 나타낸 것입니다.
직관적으로 봐도 하얀색 고양이가 가장 많은 것을 알 수 있는데요 (물론 진짜로 그런게 아니라 제가 만든겁니다)
이렇게 고양이의 색깔에 대한 확률 밀도함수를 알 수 있다면, 그리고 만약 고양이를 그려주는 기계가 있고, 이러한 확률 분포를 알고 있다면 고양이의 색깔을 흰색으로 그릴 가능성이 좀 더 높다고 할 수 있습니다.
이렇게 확률 분포를 통해 정확히 학습하고 좋은 결과물을 만들어내기 위해 설계되었다고 합니다.
왼쪽이 BM이고 오른쪽이 RBM인데 노란색은 hidden unit이라 하고 초록색은 visible unit이라고 합니다.
차이점은 visible unit과 hidden unit에는 내부적 연결이 없고 이 둘 간의 연결만이 남아있습니다.
먼저 두 노드간의 내부적 연결이 없어진 것은 사건 간의 독립성을 가정함으로써 확률 분포의 결합을 쉽게 표현하기 위해서라고 합니다.
또한 visible layer의 데이터가 주어졌을 때 hidden layer의 데이터를 계산할 수 있도록 하거나 혹은 hidden layer의 데이터가 주어졌을 때 visible layer의 데이터를 계산할 수 있도록 하는 ‘조건부 확률’을 계산할 수 있게 하는 것이라고 합니다.
RBM이 어떤 주어진 데이터를 잘 학습했다면 sampling을 통해 얻은 visible layer의 데이터가 원래 데이터와 거의 같아야 한다고 합니다.
그렇기 때문에 그림에 보이는 것처럼 두 값이 같아질 때까지 반복하며 학습한다고 합니다.
즉 RBM을 쉽게 말하면 볼츠만 머신의 계산을 좀 더 편하게 하기 위해서 만들어진 모델이다 라고 할 수 있습니다.
이렇게 RBM을 알아봤는데
아쉽게도 요즘에는 RBM을 많이 사용하지 않는다고 합니다.
RBM을 대신하여 최근에 많이 사용되는 Xavier initialization에 대해 알아보겠습니다.
Xavier 이니셜~는 Normal distribution(정규분포)으로 초기화 하거나 unifrom distribution (균등 분포)으로 초기화하는 방식 두가지가 있습니다.
fan in이란 해당 레이어에 들어오는 input tensor의 차원 크기입니다. fan out은 레이어가 출력하는 output tensor의 크기입니다.
핵심 아이디어는 fan in과 fan out을 모두 고려하여 확률 분포를 조정해준다는 것입니다.
즉 출력 분산을 입력 분산과 동일하게 만들어 주어 초기화한다고 합니다.
제가 이해한 걸로 간단하게 설명드리면 입력의 수가 적다면 더 작은 값으로 나누어 좀더 큰 가중치를 주고, 반대의 경우는 좀더 작은 가중치를 준다는 건데
왜냐하면 입력의 분산과 출력의 분산을 맞추려면
여기 보이는 수식처럼
2*10 = 20
20*1 = 20
입력이 2라고 했을 때 보다 큰 가중치로 곱해야 20을 만족시킬 수 있고, 반대로 입력 수가 많다면 작은 가중치, 1로 곱해야 1을 만족 시킬 수 있다. 이런 식으로 이해하면 좋을 것 같습니다.
Xavier 방식은 이 수식으로 간단하게 초기화 할 수 있어서 현재 많이 쓰이고 있다고 합니다.
하지만 단점이 activation Function으로 ReLu를 사용하면 제대로 초기화가 되지 않아서 이러한 단점을 보완하기 위해 나온 방식이 He 방식입니다.
He initialization은 ReLU 함수가 0 이하의 activation 값들은 모두 제거하므로 fan in을 더 중요하게 고려하여 만들어진 수식이라고 합니다.
왜 fan out을 버리는지에 대해서는 열심히 찾아보았으나 아직 답을 구하지 못해서 더 찾아보겠습니다
이렇게 가중치 초기화 방법들을 알아 보았는데 내용이 복잡하지만 코드로 적용하는건 정말 간단합니다.
여기 보이시는 Xavier initialization 코드처럼 초기화를 해주면 되고
실제로 정확도가 매우 높은 것을 알 수 있습니다.
감사합니다.