Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

Sergey IoffeChristian Szegedy


2015년 발표된 위 논문을 공부하면서 작성한 공부노트다. 

Batch normalization을 공부하는 사람이 있으면 도움이 되길 바란다.

논문에서 알고리즘을 설명하는 부분만 정리했다.

그 이후 부분은 batch normalization이 가지는 이점과 성능개선을 다루는 부분이다.

여기는 그냥 읽어보면 될 것 같다. 이해가 필요한 부분은 아니다. 


그리고 내가 잘못이해한 부분이 있는지 검증받고 싶다.

내가 잘못이해한 부분이 있다면, 언제든지 피드백을 주길.

 

혼자 끙끙대며 논문에 머리를 갈아 넣고 있을 때의 막막함을 잘 안다. 

함께 배운것을 나누고 서로 가르치면 혼자 할때보다 좀더 쉽지 않을까. 


(이미지는 누르면 커진다)


'이론 > 신경망' 카테고리의 다른 글

He 초기화 구현 in tensorflow  (0) 2018.09.19
tensorboard 간단 요약  (0) 2018.09.13
인공신경망과 학습  (0) 2018.03.05
전미분, 편미분, Gradient에 대해  (2) 2018.02.28
공부할 때 참고한 자료들  (0) 2018.02.27
Posted by 굿쟌
,

신경망을 처음 공부할 때 망 구현을 위해 tensorflow.org에 있는 document를 하나하나 읽었다.

문서만 보니 뭔소린지 개념적으로는 이해를 하겠는데, 막상 코딩하기 어렵더라.

그래서 요즘은 홍콩과기대 김성훈님 동영상의 실습과제를 따라하면서 tensorflow를 공부한다.

동영상에 나오는 실습내용을 따라하니 이제좀 tensorflow가 어떻게 동작하는지 알겠다.

혹시 나같이 tensorflow.org를 정독하겠다는 각오로 공부하는 분들이 있다면, 

김성훈님 강의에 딸린 실습과제를 먼저 돌려보길 추천한다. 감을 잡을 수 있다.


사설이 길었다. 이번 글에 적으려고 했던건 He Initialization을 Tensorflow에 구현하는 방법이다.

김성훈님 강의를 보다보니 Xavier Initialization은 구현방법을 보여주는데 He Initialization은 안나오더라.

그래서 어떻게 이걸 해야하나 한동안 구글링 했다. 결국 방법을 못찾았다.


그래서 아래와 같은 방식으로 추리해서 He Initialization을 구현했다.

사실 내가 해결한게 맞는지 이 포스트를 본 사람들에게 검증받고 싶기도 하다.


내 추리는 이렇다. 


mean, variance, std의 정의로부터 시작한다.

그리고 변수X를 a로 나눴을 때, mean, var, std가 어떻게 바뀌는지 봤다.

그런데 He Initialization은 N(0,1)을 1/sqrt(이전레이어의 output갯수/2) scaling해서 초기화에 사용한다.

즉, std가 1/sqrt(이전레이어의 output갯수/2) 이고 mean이 0인 normal distribution이라고 생각할 수 있다.

그러므로 아래와 같이 단순하게 tf.random_normal의 stddev argument에 1/np.sqrt(784/2)를 넣었다.

(MNIST 데이터셋을 사용해서 이전레이어의 output갯수가 784다)

784/2 이 부분을 784로 바꾸면 Xavier Initialization이 된다.

실제로 이렇게 Initialization해서 동일 조건에서 accuracy가 증가하는 것을 확인했다.

'이론 > 신경망' 카테고리의 다른 글

배치 정규화 논문 리뷰 (Batch normalization)  (1) 2018.11.07
tensorboard 간단 요약  (0) 2018.09.13
인공신경망과 학습  (0) 2018.03.05
전미분, 편미분, Gradient에 대해  (2) 2018.02.28
공부할 때 참고한 자료들  (0) 2018.02.27
Posted by 굿쟌
,

회사에서 현업을 하다보니 신경망을 집중해서 오래 공부하기가 어렵다. 

점점 공부하는 주기가 길어진다. 그리고 길어진 주기만큼 이전에 공부했던 내용을 까먹는다.

어떤 내용인지 의미는 기억나는데 디테일하게 수학적으로 어떻게 유도하고 이해 했는지 가물가물하다.

이런 상황에서 차례대로 글을 쓰려니 다시 예전에 공부한걸 복습해야되서 몹시 귀찮다. 

안그래도 모르는데 귀찮기까지 해서 아무것도 안쓰느니 그때그때 아는만큼, 배운만큼 쓰는게 좋은것 같다.

그래서 홍콩과기대 김성훈교수님 동영상을 보며 배운 tensor board 사용법을 정리해 본다.


위에서부터 차례대로 내려오면된다.

먼저 내가 학습과정에서 얻고 싶은 정보를 scalar나 histogram으로 만든다.

scalar는 일변수, histogram은 다변수로 생각하면 된다.

그리고 이걸 모아 tf.summary_merge_all 함수는 summary 틀을 반환한다. 붕어빵 틀이라고 생각해도 좋다.

이제 이 틀을 sess.run을 호출할 때 인자로 넘긴다. 

그럼 sess.run이 틀에다가 재료를 채워서 매 호출때마다 summary instance를 준다. 

붕어빵이라고 쳐도 좋다.

그럼 tf.summary.filewriter가 만든 summary writer가 이 붕어빵을 주어다가 파일 봉투에 파일로 담는다.

sess.graph에 담겨 있던 그래프 정보도 애가 가져다가 파일봉투에 파일로 담는다.

filewriter가 다 담아 놓으면 이제 tensor board가 일할 차례다

tensor board는 fileWriter가 담아놓은 봉투에서 정보들을 꺼내 학습과정을 보여주는 그림을 그린다.

멋진 화가다. 이 화가에게 일을 시키려면 cmd창에서 tensorboard --logdir dirpath 이렇게 말하면 된다.

다 그리면 위와 같이 그림을 어디다 그렸는지 알려준다.

그럼 이제 우린 여기로 가서 tensor board가 얼마나 멋진 그림을 그렸는지 감상만 하면 된다.

Posted by 굿쟌
,