본문 바로가기

Backup/cs231n

cs231n 5강 Training NN part 1



데이터가 엄청 많아야지만 학습시킬수있다?

어쩌면 잘못된 생각일수있따.

fine tuning을 사용하면 적은양의 데이터로도 학습 가능

이미지넷에서 이미 학습된 가중치을 가져와서 우리 모델에 finetuning하면됨

제일 왼쪽에 우리 모델에 있고 이 학습된 가중치을 공유해와서 

가운데 그림처럼 우리의 데이터에 맞게 위에는 freezing 가중치 고정시켜두고

제일 마지막 부분만 clisifier부분만 다시 학습시킴

또는 우리가 가지고있는 데이터셋이 아주 작지않지만 충분하지 않으면 고정하는 레이어을 조금 더 줄이면 된다.

아랫단 부분만 새로 학습시켜주는게 finetuning

예을 들어 카페같은경우 이미 다양한 데이터셋에대해서 학습시킨 가중치들을 업로드 시켜두었음

데이터을 처음부터 학습시킬 필요가 없고 공유되어있는 가중치들을 활용하면 된다.




지금까지 한걸 정리해보면 minibatch.

데이터에서 얼마큼을 sampling하고

forward을 통해 loss을

backprop을 통해 gradient을

update한다. 이걸 계속 반복

눈을 가리고 산에서 최저점으로 가는거랑 비슷한 일이다.



본론으로 들어가기전에 뉴럴네트웍이 어떻게 발전하였는지 살펴보겠다.


최초는 퍼셉트론이 최초이다.

가중치을 임의대로 조정해가면서 최적화 해보려함


퍼셉트론을 쌓아가기 시작함 1960

최초의 MLP

이떄도 backprop은 불가. 그냥 하드웨어임

parametric approach만으로도 대단한거임.

기대에 비해 결과가 안좋아서

신경망의 첫번쨰 암흑기

근데 생각보다 잘 동작하지 않았음


unsupervised RBM을 이용해서 선행학습한다음 네트워크을 backpropagation하면 잘됨.

non linearlity을 제공하는 함수

0과1사이의 값을 ㅇ마치 확률처럼 결과을 냄

문제가 있음 3가지.

우선 gradient vanishing

global gradient와 local gradient가 있는데 

x가 만약 매우 크거나 작으면 미분값이 거의 0이 됨.

local gradient가 0이 되기때문에 gradient가 없어짐

y값은 0중심이 아니다.

그래서 converge가 늦어짐

x는 언제나 양수임. 0~1이기 대문에

이때 w에 대해서 미분하면 모두양수또는 모두 음수가됨

가장 바람직한 gradient가 되려면 파란색인데, w가 모두 양수 혹은 음수이기때문에

update가 느리게 됨

그리고 굉장히 비싼 함수이다.

0 centered다 근데 여전히 vanishing이 발생함

relu가 제일 그나마 낫다.


x가 0미만이면 vanishing

dead relu 처음에 weight가 초기화될때 운이 아주 나빠서 저부분에 껴있을때

혹은 learning rate을 크게 잡아서 저 dead relu존으로 갔다가 다시 못돌아올경우가 있다.


그래서 dead을 방지하기 위해서 bias을 아주 작은 양수로 초기화함 

카이밍해가 그래서 leaky relu을 가져옴

저 알파 레루에서 알파도 학습을 통해서 구해 사용하는 방법도 있다

exp 비싼거 빼곤 다른거의 모든 장점을 가져옴

굿펠로우가 제안한방법은 maxout 둘다해서 더 큰거을 선택.

연산은 두배가 단점

일단 1. z 센터로 맞춤(평균을 뺴줌)

그리고 2. 정규화(표준편차로 나누어줌)


이미지데이터같은경우 일단 0센터는 해주고

정규화는 보통 안한다, 이미 특정 범위안에 값들이 들어와있기 때문에


PCA는 데이터의 차원을 쭈리는

whitened는 주성분 분석할때 사용.

이미지에 있어서는 상관 안해도 된다.


이미지는 그냥 0centered만 신경쓰면 된다.

가중치 초기화

0으로 초기화 되버리면 모든 뉴런들이 동일한 연산을 수행해버려 symetric breaking이 안됨

보통 매우 작은 랜덤을 초기화해줌

네트웍이 작은경우 문제가 없지만 커지면 문제가 생김


각 레이어마다 0 주변에 정규분포을 이룸

그래서 결론은 모든 activation들이 0이 되어버림

그래서 0.01대신에 1을 정해버리면 overshooting이 발생해서 다 포화되어버림

0아니면 1, loss값이 전혀 update되지 않는다. 

weight값을 너무 크게 잡지 않게 주의가 필요하다,

이 방법을 통해 초기화 하면 좋음

근데 relu사용하면 문제가 생김

그래서 카이밍해의 방법은 2로 나눔

카이밍해와 xavier의 방법을 따라하면 됨

지금도 연구되는 분야임

근데 이제 weight initialize을 그렇게 신경 안써도 됨.

batch normalization이 있음

기본적으로 vanishing을 막기위해 고한

앞에서는 activation(relu)을 쓰거나 가중치 초기화을 매우 신중하게 해왔는데.

이 batch norm 은 간접적인 방법이 아니고 학습하는 과정을 전반적으로 안정화 하겠다는 내용,



학습이 불안정한 이유는 coverience shift가 일어나기 때문.

즉 각 레이어마다의 input의 분포값이 달라지기 때문에 이런 불안정화가 일어난다고 생각.

그러다보니까 각 계층을 거칠때마다 입력을 normalization 해주자 라는 방식 

batch norm을 하더라도 미분가능한 함수이고 그렇기때문에 forward backward하는데 아무 문제가 안된다.

그래서 그냥 정규분포을 적용

N은 batch의 수가 되고 D는 feature수가 됨.

이때 평균과 분산을 계산해서 그것을 통해서 정규화시켜줌  

보통 nonlinearlity을 전달해줄때 이것도 학습이 됨

 

실제 과정은 다음고 ㅏ같다.

한가지 주의할건 test와 training할때 다르게 적용.




'Backup > cs231n' 카테고리의 다른 글

cs231n 8강 Localization, detection  (0) 2017.12.24
cs231n 6강 Training NN part 2  (0) 2017.12.05
cs231n 7강 CNN  (0) 2017.11.02
cs231n 4강 Backpropagation and NN part 1  (0) 2017.10.20
cs231n 3강 Loss fn, optimization  (1) 2017.10.18