deep learning(딥러닝)

cs231n 2017 강의 7강 training neural networks part2 정리

이수진의 블로그 2018. 11. 26. 10:00
반응형
728x170


안녕하세요. 이번 포스팅은 딥러닝 기반 영상 인식 강의에서 최고로 평가되고 있는 스탠포드 대학교의 CS231n 강의 7강 정리입니다.

지난 6장까지 해서 뉴럴 네트워크, backpropagation, optimization, activation functions(sigmoid, ReLU, tanh ), weight initialization, data preprocessing(normalization, regularization 등을 학습했습니다. 벌써 많이 배웠죠??

그리고 하이퍼 파라미터(hyperparameter)를 찾기 위해 grid searchrandom search도 보았습니다.

이번 시간에는 optimization에 대해서 더 배우고 regularization에 대해서 더 배웁니다. 우리가 앞서 배웠던 regularization은 기껏해야 L2, L1에 대해서 배웠죠. 그리고 batch normalization을 통해서 regularization 효과를 얻을 수 있다고 배웠고 잠깐 dropout에 대해서 배웠습니다.

이번 시간에는 이 dropout 등의 규제에 대해서 더 배웁니다.

마지막으로는 transfer learning인 전이 학습에 대해서도 배우게 됩니다.

 

시작할까요?


원래 앞에 설명 PT가 더 있는데 6강에 대한 복습이라서 뺐습니다.

6강을 보셨으면 크게 무리없는 내용입니다.



일반적으로 우리는 vanilla gradient descent를 하게 되면 위 식처럼 weights를 초기화 해줍니다. 여기서 batch 단위로 끊어서 한게 SGD 였죠? 근데 SGD 방식은 문제가 조금 있습니다.



이 그림처럼 이렇게 타원의 모양을 가지게 되면 저 빨간색 점에서 이모티콘이 있는 지점까지 어떻게 찾아가게 될까요? 현재 모양은 Y축 방향은 되게 크죠? 왜냐하면 y축 방향으로 이동하면 빠르게 이동이 가능합니다. 하지만 x 축 방향은 엄청 완만하죠



그렇기 때문에 이 빨간색 선 처럼 매우 크게 방향이 튀면서 지그재그 형태로 지점을 찾아가게 됩니다. 그러면 어떻게 되나요? 매우 느리겠죠?? 



이렇게 되다 보니까 losslocal minimaaddle point에 빠지기 쉽습니다.

 

Local minima는 위쪽 그래프, addle point는 아래쪽 그래프인데요.



Local minima에서는 얘가 기울기가 0이 되버리니까 어? 기울기가 0이네? 찾았네? 이러면서 멈춰버립니다. Saddle point에서도 순간적으로 기울기가 0에 가까운 지점이 있기 때문에 멈춰버릴 수도 있는 것이죠.

 

 



고차원에서는 saddle points가 더 일반적으로 일어나게 됩니다.



그리고 미니배치로 들어올 때 만약 노이즈를 임의로 주게 된다면 저 그래프처럼(강사님은 좀 억지로 노이즈를 줬다고는 하지만) 너무 안이쁘게 나옵니다.

 

즉 개선점이 필요한거죠.

어떻게? 기울기가 0인 지점이 나와도 멈추지 않는 힘이 필요합니다.



그래서 모멘텀(momentum)이 나오게 됩니다.

기존 SGD에서 momentum은 물리학적 느낌으로 보시면 됩니다. ‘가속도를 주는거죠. 즉 기울기가 0인 지점이 나와도 가속도로 인해 계속 갈 수 있게 하는 것입니다.

여기 식에서는 vxvelocity라고 보시면 됩니다. rho는 마찰계수라고 생각하시면 됩니다. 즉 너무 빠르게 가지 않도록 일종의 마찰을 주는 것이죠. rho는 보통 0.9~0.99를 준다고 합니다.

모멘텀 식을 나중에 자세히 보시면 기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙을 나타내는 식이 있습니다. 그리고 모멘텀(momentum)’ 단어 자체가 운동량을 뜻하구요.



그래서 SGD와 비교해 봤을 때 파란색 선처럼 부드럽게 이동합니다. 가속도의 영향을 받으니까요. 그렇기에 local minimasaddle points에도 sgd보다 안전합니다.



그리고 또 다른 것이 Nesterov momentum이 있습니다. Momentumgradient 방향과 velocity 방향에서 각을 이루는 actual stop을 따르는데요



Nesterov momentum은 velocity의 위치에서 gradient를 예측해서 actual step을 그리게 됩니다.



그 다음 뭐 복잡한 수식이 이렇게 나오죠? 근데 뭐 저 식은 자세히 모르겠습니다. 스터디에서도 다들 잘 모르시겠다고 하더군요



그냥 모멘텀과는 다르게 파란색 박스 부분이 다른데요. 저 부분은 미리 velocity 방향을 예측을 해서 gradient를 구해준다 라는 것입니다.


nesterovconvex optimizatino에서는 굉장이 뛰어는 성능을 보인다고 합니다. Convex functionconvexfunction을 뜻하는데 convex볼록과 가까운 단어입니다. 즉 볼록한 함수를 뜻하는 것이죠. Convex function이 좋은 이유는 optimal한 값을 찾기 쉽기 때문일 것입니다.(저도 정확하게는 모르겠네요)

근데 보통 고차원적인 딥러닝을 하다보면 non-convex 그래프가 더 많습니다. 아까 local-minima만 봐도 그렇죠. 그리고 saddle도 마찬가지구요.

그래서 nesterov은 뉴럴넷에서는 별로 성능이 좋지 않습니다



뭐 아무튼 nesterov momentum의 아래의 식은 조금 단순하게 식을 표현한 것입니다.



그리고 이 그림을 보면 nesterov가 잘 동작하게 나와있는데요. 실제로는 거의 이렇지 않다고 합니다.



그리고 AdaGrad(아다그라드)가 있습니다. 이것은 각각의 매개변수에 맞게 맞춤형매개변수 갱신 알고리즘 입니다. 여기서 Aadaptive인데요. 적응적으로 학습률을 조정하는 것이죠



Adagradvelocity term  대신에 grad squared term을 사용합니다. 기울기 값을 이용하죠.

학습 도중에 계산되는 gradient에 제곱을 해서 계속 더해줍니다




이런식으로 말이죠. 그러다 보니까 분모값이 커지기 때문에 step을 진행할수록 값이 작아지게 됩니다. 그만큼 처음에 올바른 지점으로 접근할 때 속도가 빨랐다가 점차 속도가 느려진다는 것이지만요. 이것도 convex한 경우에는 매우 좋습니다. 하지만 convex하지 않을 떄는 도중에 멈출 수도 있습니다. 즉 업데이트가 되지 않겠죠. 그래서 그 대안으로 RMSProp이 나오게 됩니다.



RMSPropAdaGradgradient 제곱항을 그대로 사용합니다. 하지만 이 값들을 누적만 시키는게 아니라 파란색 처럼 decay_rate를 곱해줍니다. 마치 기존의 momentum 수식과 비슷하죠? 다만 좀 다른게  gradient의 제곱을 계속해서 누적해 나가는 것이죠.

보통 decay_rate0.9로 두게 됩니다. 혹은 0.99를 사용하죠. 그리고 현재 gradient 제곱은 (1-decay_rate)를 곱해주고 더해줍니다.

이는 adagrad와 매우 비슷하기에 step의 속도를 가속/감속이 가능합니다. 하지만 momentum과 비슷하게 앞에서 온 값을 적용시켜 주기에 속도가 줄어드는 문제를 해결할 수 있었죠!



그래서 이 그래프를 보시면 RMSProp이 빨간색입니다. 우리가 원하는 이상적인 방향으로 가죠. SGD는 느리고 Momentum은 너무 튀었다가 오니까요.


여기까지 우리는 모멘텀(momentum)을 봤습니다. 가속도를 이용하죠. 그리고 adagrad를 봤죠. 잘 사용하지는 않습니다. 그에 대한 대안으로 RMSProp을 사용하죠.

이 둘은 일종의 momentum 계열 vs Ada 계열로 나뉩니다. 근데 이 2개다 좋은 아이디어죠!

 

그래서 이 2개를 합치면 어떨까? 해서 합친 것이 있습니다. 바로 아담(Adam)이죠!




이 첫번째 사진은 adamalmost버전입니다. 아직 완벽한 아담이 아니죠



First step은 모멘텀입니다. 2번째 스텝은 RMSProp이구요. 그래서 xlearning rate값에 분자에는 momentum 분모에는 RMSprop값을 이용해서 구하게 됩니다. 마치 모멘텀과 RMSProp을 합친 것 같죠

근데 문제가 있습니다. 초기 step에서 문제가 발생한다고 합니다.


 식을 보면 first_momentsecond_moment0입니다. 근데 second_moment1update하고 났을 때 beta2decay_rate이니까 0.9 또는 0.991의 가까운 수죠. 그렇기 때문에 1회 업데이트 이후에 second moment는 여전히 0에 가깝습니다. 이후 update step에서 secomd_moment로 나누게 되는데 나눠주는 값이 작다보니까 분자가 커져서 값이 튈 수도 있다고 합니다. 값이 크면 step이 커져서 이상한 곳으로 튀어 버릴 수도 있죠.

 

근데 여기서 학생이 질문도 하고 개인적으로 저도 궁금한게 first_moment0이니까 이 값이 상쇄 되지 않나?? 생각은 드는데 근데 이 카파시는 간혹 운이 안좋으면 큰 step이 발생될 수도 있다고 합니다. .. 뭐 아무튼



뭐 그래서 adam은 이를 해결하기 위해 보정하는 항을 추가하는데요. 그게 bias correction term입니다



First/secomd moments를 update하고 현재 step에 맞는 적절한 bias를 넣어줘서 값이 튀지 않게 방지하는 것입니다



그래서 이 그래프를 보면 adam이 효과가 좋습니다. 그리고 실제로 adam을 많이 사용하기도 합니다



그리고 이 그래프는 여러 번 보셨죠? SGDmomentum, adagrad, RMSProp, Adam은 모두 learning rate를 가지고 있습니다. 너무 높으면 튀고 낮으면 느리고. Learning rate(학습률)의 하이퍼 파라미터 값을 찾는 것은 쉽지 않습니다



그래서 우리는 learning rates decay 전략을 사용해 볼 수 있다고 합니다. 처음에는 학습률을 높게 잡은 뒤 점차 낮춰보는 것이죠

다양한 전략이 있지만 예를 들어 5만번째 반복에서 learning rate를 낮추던가 아니면 뭐 꾸준히 낮춰주던가 이런 방법을 사용할 수 있습니다.

 


이 그림을 보면 loss가 내려가다가 평평해지는 것 같더니 다시 내려가고 또 평평해지다가 다시 내려가고 하는 것을 볼 수 있습니다. 이거는 Resnet 논문에서 나왔다고 하는데요. 이 논문에서 사용한 이 방법은 step decay learning rate를 사용한 것입니다



평평해지다가 갑자기 낮아지는 구간은 learning rate를 낮추는 구간이죠. 이거는 learning rate가 너무 높아서 깊게 들어가지 못할 때 learning rate를 낮춰버리는 것입니다. 이러한 learning rate decayadam보다는 momentum에서 사용할 떄 자주 쓴다고 합니다. 그리고 learning rate decaysecond order 하이퍼 파라미터라고 합니다. Decay가 필요한 지점을 찾아서 그때 사용하는 뭐 그런건가 봅니다.. 잘 모르겠네요



지금까지 배운 것은 모두 1차미분을 활용한(first-order optimization)것이라고 합니다



만약 우리가 지금 빨간색 지점에 있으면 이 지점에서 gradient를 계산하죠




gradient 정보를 이용해서 우리는 손실함수를 선형함수로 근사시킵니다. 우리는 이걸 손실함수라고 가정하고 setp을 내려가죠,. 근데 우리는 또 다른 방법을 생각할 수 있습니다


Second-order optimization(2차 근사)의 정보를 활용할 수 있다고 하네요



2차 테일러 근사 함수가 될 것이라고 하는데 무슨 x소리인지 모르겠네요.




헤이시안 방법을 사용해서 2차 근사를 이용해 값을 찾아갈 수 있다고 합니다. 왜냐하면 2차 미분은 극대/극소 값을 알 수 있기 때문이라고 합니다. 근데 문제는 딥러닝에서 잘 사용을 안한다고 해요. 왜냐하면 헤이시안은 n x n 행렬인데 딥러닝 파라미터 수가 수천만개 이러니까 메모리에 올리기 벅차죠. 그래서 안쓴다고 합니다.



근데 파라미터가 적을 경우에는 L-BFGS 같은 것을 사용할 수 있다고 합니다.

자세한건 모르겠습니다. 넘어가겠습니다.(ㅈㅅ…)




우리는 loss를 줄이면서 동시에 trainval의 격차를 좁혀야합니다

이게 넓어지면 넓어질수록 오버피팅(overfitting)되어 있다는 것이기 때문이죠.

우리는 이처럼 loss를 줄여 손실함수를 최소화 시키기 위해서 optimization 알고리즘을 사용해 과정을 거쳤습니다.

 

그리고 정확도를 더욱 높이는게 좋죠. 그 방법중 가장 간단하고 빠른 방법이 바로 앙상블(ensemble) 방법입니다



이거는 다수개의 모델을 만들고 이들의 평균을 이용하는데요. 모델이 다수개로 나오기 때문에 성능이 조금 상승하게 됩니다

이게 나중에 90% 이상대로 가면 1~2%올리는게 쉽지 않는데 보통 이럴 때 앙상블을 많이 사용하기도 합니다.



근데 조금 더 창의적인 방법도 있습니다. 모델을 독립적으로 학습시키는게 아니라 학습 도중 중간 모델들을 저장(snapshot)하고 앙상블로 사용할 수 있다고 합니다. 그리고 test때에는 여러 snapshots에서 나온 예측값들을 평균을 내서 사용합니다

여기서 스냅샷은 구간을 정해놓은 지점입니다. 훈련을 하는데 10개의 체크포인트를 두어서 10번째 마다 새로하겠다. 라는 이런식의 구간이죠. 이게 앙상블을 사용하면 모델을 여러 개 만들기 때문에 그 만큼 시간 소모가 듭니다. 그 방법 대신에 한 모델안에서 10개의 구간을 둬서 마치 앙상블처럼 하겠다라는 것이죠.

 


여기 피티를 보시면 파란색하고 빨간색이 있는데요. 빨간색을 보면 train loss가 낮아졌다가 갑자기 올라가고 그러죠. 이게 어느 지점에서 learning rate를 올린다거나 그렇게 해서 손실함수가 다양한 지역에 수렴할 수 있도록 하는 것입니다.

이러한 앙상블 기법으로 모델을 한번만 train시켜도 좋은 성능을 얻을 수 있죠.



다음 장에서는 whie true문이 나오는데요. 또 다른 방법으로는 학습하는 동안에 파라미터의 exponentially decaying average를 계속 계산하는 것입니다. 이 방법은 학습중인 네트워크의 smooth ensemble효과를 얻을 수 있다고 합니다.  이거는 checkpoints에서의 파라미터를 그대로 쓰지 않고 smoothly decaying average를 사용합니다. 이를 polyak averaging이라고 하고 때떄로 조금 성능향상이 있을 수도 있다고 하는데요.. 무슨 말인지는 모르겠네요 ㅋㅋㅋㅋㅋㅋㅋ

자주 사용안한데요.



그러면 다르게 생각해보죠. 앙상블을 사용하지 않고 모델 성능을 향상시킬 수 있는 방법은 무엇이 있을까요?? 앙상블은 모델을 여러 개를 만들기 때문에 별로 효율적이지 않거든요.

그래서 이때 regularization을 사용합니다




우리는 앞서 L2 regularizationl1 regularization을 배웠습니다. 실은 이거는 뉴런 네트워크에서 자주 사용하지는 않습니다




하나의 방법은 바로 dropout이라는 방법입니다. Dropout은 일정 노드를 랜덤하게 out시켜 버리는 것이죠. 말 그대로 꺼버리는 방법입니다. Forward pass 과정에서 일부 뉴런을 0으로 만들어 버리는 것이죠. 그리고 forward pass할 떄마다 0이 되는 뉴런이 바뀌게 됩니다.

이거는 한 레이어씩 진행되는데요. 한 레이어의 출력을 구하고 임의로 일부를 0으로 만들고 그리고 넘어가고 이런식으로 갑니다. 이 오른쪽 그림이 dropout을 적용한 상태입니다

그럼 무엇을 0으로 만드냐?

이게 레이어가 다음 활성화 = 이전 활성화 함수 나온 값 * weight이죠? 이 활성화 값을 0으로 만들어 버리는 것입니다. 그래서 0으로 곱해지니 0이 나가고 그러겠죠?? 이런식으로 진행하는 것입니다.



Dropout은 위 식처럼 정말 간단합니다. H1, U1, H1 *= U1이 끝이죠.

대신 H1에서 행렬곱 한 값이 0과 누가 크냐?(이건 Relu?) 그리고 p값이 0.5입니다. 0.5보다 작은 값이 나오는 애들을 0으로 만들고 뭐 이런식으로 진행되는 것이죠.



그럼 도대체 이게 왜 좋을까요??

이런 설명이 있습니다. 원래 뉴런 하나하나가 전문가입니다. 어떤 노드는 ear에 대한 전문가, 어떤거는 tail에 대한 전문가죠. 근데 이걸 랜덤으로 죽이면 살아남은 노드는 earfurry의 정보까지 전부 학습하려고 노력하게 됩니다. 그래서 노드가 어떤 일부 feature에만 의존하지 못하도록 하는 것이죠! 그래서 overfitting을 어느정도 막아주는 해석이 있습니다.


그리고 다른 해석은 단일 모델로 앙상블 효과를 가질 수 있다는 것입니다제 생각에는 이게 더 맞는 설명 같은데요이게 forward pass마다 dropout을 랜덤하게 하니까 forward pass마다 마치 다른 모델을 만드는 것처럼 효과가 나오게 될 수 있습니다



하지만 뉴런의 수에 따라서 앙상블 가능한 서브네트워크 수가 엄청나게 많아지기 때문에 모든 서서브네트워크 사용하는 것은 거의 불가능합니다. Dropout은 거대한 앙상블 모델을 동시에 학습 시키는 것이라고 할 수 있기 때문이죠



Test time에서 dropout은 어떨까요? Dropout을 사용하게 되면 기본적으로 neural network의 동작 자체가 변하게 됩니다. 기존의 neural network에서는 가중치  w와  입력x에 대한 함수 f였습니다.

하지만 dropout을 사용하면 networkz라는 입력이 추가됩니다. Zrandom dropout mask입니다. Z는 랜덤입니다. 하지만 test time에 임의의 값을 부여하는 것은 좋지 않죠.

따라서 네트워크가 이미 학습된 네트워크(test 하려고 하는 네트워크)test time에는 이러한 임의성을 적절하지 않습니다. 그래서 이 임의성(randomness)average out시킵니다



이를 뭐 적분을 이용해서 한다고 하는데요.. 어렵네요.. ㅎㅎㅎ 실제로 적분을 다루기가 까다롭다고 합니다. 그래서 이걸 해결할 수 있는 간단한 방법은 샘플링을 통해서 적분을 근사시키는 것인데요

Z를 여러 번 샘플링해서 test time에 이를 averate out하는 것이라고 합니다하지만 이 방법도 test time에서 randomness를 만들어 내기 때문에 좋지 않는 방법입니다




그래서 여기서 locally cheap한 방법을 사용한다고 합니다.

가령 뉴런이 이렇게 되어 있으면 출력은 a, 입력은 x,y 가중치는 w1,w2입니다.

Test time에서 axw1 + yw2이죠. 이 네트워크를 dropout(p=0.5)라고 생각하고 train 시킨다고 생각해봅시다



그러면 xy는 이렇게 될 것입니다. (0,0), (0,1), (1,0), (1,1) 이런식으로 4개가 있죠? 그래서 각각이 1/4확률이 됩니다. 그리고 0일떄 1일떄 x, y에 값을 넣어주면 안에 식처럼 되죠.

이걸 평균값으로 시켜주면 1/2(w1x + w2y)가 됩니다. 이것은 train/test때 값과 좀 다르죠?

test time의 기대값은 train time의 절반밖에 안되죠



그래서 좋은 방법은 아까 있었던 dropout probability(0.5)를 네트워크 출력에 곱하면 되는것입니다. 아까 0.5였잖아요? 이게 1/2이니까 이걸 출력에 곱하면 똑같아지죠!



그래서 dropout 을 사용하게 되면 네트워크 출력에 dropout probability 를 곱해줘야 합니다.   



그래서 위의 식은 아까 dropout을 forward pass에 적용시키는 것이었죠아래는 p를 곱해줍니다.



근데 한가지 트릭을 생각할 수 있죠. 역으로 계산하는겁니다. Test time에 곱하기 연산이 있는게 싫잖아요? Test time에선 계산 효율이 중요하니까요. 그래서 이걸 train때로 옮겨줍니다.

 

이렇게 나눠주면! 똑같아지죠~ 보통 그래서 이렇게 많이 사용한다고 합니다.

그리고 dropout을 사용하게 되면 학습 시간이 늘어납니다학습시간을 늘어나지만 모델이 수렴한 후에는 좋은 일반화 모델이 나오게 되죠


dropout은 일반적인( common ) 전략을 구체화시킨 하나의 예시입니다. Train time에서는 무작위성(randomness)를 추가해 train data에 너무 fit하지 않게 하는 것이죠. 그리고 test time에서는 randomness를 평균화 시켜서 사용하는 것이구요.



그리고 여기 오른쪽에 나오지만 batch normalization도 하나의 좋은 regulrarization입니다. Trainmini batch로 하나의 데이터가 샘플링 될 떄 매번 서로 다른 데이터들과 만나게 되죠. Train tiem에서는 각 데이터에 대해서 이 데이터를 얼마나 어떻게 정규화 시킬 것인지에 대한 stochasticity가 존재했습니다. 하지만 test time에서는 정규화를 mini batch가 아닌 global 단위로 수행해서 stochasticity를 평균화시킵니다. 이런 특성 때문에 batch normalizationretularizatino 효과를 얻을 수 있습니다.

 

실제로 BN을 많이 씁니다. 하지만 dropout도 무시할 수 없죠.

자유롭게 조절할 수 있는 p가 있기 때문이죠. BN에는 없는 특성입니다





그리고 이러한 regularization 중 또다른 방법 중 하나가 data augmentation입니다.


이거는 이미지를 조금씩 변형시키는 이런 방법입니다.

기존에는 학습데이터가 있고 거기에 따른 레이블이 있어서 이를 통해 훈련시켰는데요. 그 대신 train 때에 이미지를 무작위로 변형시켜보는 것이죠. 그렇게 되면 원본 이미지를 학습하는게 아니라 무작위로 변형된 이미지를 학습하게 됩니다



이미지를 좌우 변형시켜도 고양이는 여전히 고양이입니다.



이렇게 변형해도 고양이죠!



혹은 이미지를 임의의 다양한 사이즈로 crop(잘라서) 사용할 수 있습니다. 그래도 이미지는 여전히 고양이죠


그럼 test time에서 stochasticityaverage out시키는 것을 생각해보죠.

여기 지금 빨간색 네모가 막 쳐져있는데요. 자세히 보시면 4개의 각 코너에서 자른 것과 중앙에서 자른 것 총 5개의 영역이 있는 것입니다. 그리고 이들의 반전된 이미지도 사용하죠.



Image net 관련 모델들의 논문을 보면 하나의 이미지를 그냥 사용했을 때와 이렇게 10개의 성능을 비교한다고 합니다. 여기서 10개라는 것은 아까 말씀드린 4개의 코너 + 중앙 이미지에다가

이게 그냥 일 때와 반전일 때 2가지가 있으니까 5 * 2 개수가 되는 것입니다



Data augmentation에서 color jittering도 있습니다. 색을 바꿔주고 그런 것이죠.



그리고 좀 더 복잡하게 PCA 방향을 고려해 color offset을 조절하는 방법도 있다고 합니다.

뭐 자주 사용하는 방법은 아니라고 하네요.



근데 이 data augmentation은 일반적으로 다양한 문제에 적용시킬 수 있다고 합니다. train때에 이미지를 계속 바꿔주면서 학습을 시키면 일종의 regularization 효과를 얻을 수 있기 때문이죠.



이렇게 regularization을 사용하는 것으로 dropout, batch normalization, data augmentation을 알아보았습니다. 대표적인게 이렇게인데요. 그 외에도 있습니다.



먼저 dropconnect 인데요. 이거는 activation0으로 만들어주는 dropout과 다르게 weight martix를 임의적으로 0으로 만들어줍니다



그리고 다른 방법으로는 fractional max pooling이라는 방법입니다. 자주 사용하지는 않지만 좋은 아이디어라고 하네요. 이 아이디어는 보통 2x2 maxpolling 연산은 고정된 2x2 지역에서 수행하지만 poling 연산을 지역이 임의로 선정되는 것입니다.

오른쪽 그림처럼 임의로 선정되는 것이죠. 그리고 test timestochasticityaverage out 시키려면 pooling region을 고정시키거나 여러 개의 pooling regrion을 만들고 averaging over 시키는 것입니다



그리고 stochastic depth라는 것도 있습니다. 이거는 train time에 네트워크의 레이어를 randomly drop합니다. 그리고 test time에서는 전체 네트워크를 사용하죠. 이 효과는 dropout과 비슷하다고 하네요. 아이디어가 참신하다고 강사가 그랬던 것 같습니다.


이러한 regularization은 보통 1개를 사용합니다. 그게 바로 batch normalization을 많이 사용하는데요. 근데 이렇게 해도 overfitting이 나온다? 그러면 dropout을 추가해주거나 그렇게 한다고 합니다. 일반적으로는 1개만 사용하고 필요에 따라 추가한다. 라고 생각하시면 되겠습니다.



그리고 마지막으로 transfer learning입니다

한국말로 전이 학습이라고 불리우죠.



이거는 우리가 CNN을 학습할 때 많은 데이터가 필요하다! 라는 편견을 깨버린 아이디어 입니다



아이디어는 간단합니다. 여기 CNN layer가 있습니다. 이것을 가지고 우선 ImageNet과 같은 아주 큰 데이터셋으로 학습을 시킵니다



자 이제 이렇게 훈련된 모델을 우리가 가진 작은 데이터셋에 적용시키는 것입니다.

이제는 만약 우리가 개, 고양이, 짜장면, 짬뽕을 비교하도록 합니다. imagenet에서 1000개의 카테고리를 분류하도록 하였다면 이제는 4개의 카테고리를 분류하는 것이죠.


하지만 우리가 가진 이미지 셋의 양은 적습니다

그래서 일반적인 절차는 가장 마지막의 FC Layer는 최종 featureclass scores간의 연결인데 이걸 초기화 시켜주는 것입니다. 기존의 ImageNet을 학습시킬 때는 4096 * 1000 차원의 행렬이었는데 이걸 이제 우리는 4096 * 4(혹은 클래스 개수 C)로 해줍니다


그리고 가중치 방금 정의한 가중치 행렬은 초기화시키고 이전의 나머지 레이어들의 가중치는 freeze시킵니다. 즉 우리는 초기화한 레이어만 재사용하는 것이죠. , 마지막 레이어만 가지고 데이터를 학습시키게 되는 것입니다!



그리고 데이터가 조금 많이 있다면 좀 더 위의 layer로 이동해서 fine tuning할 수 있습니다.

그리고 learning rate값을 조금 낮춰서 해주면 좋습니다. 왜냐면 이미 잘 학습이 되어 있기 때문이죠



우리는 이걸 하다 보면 2x2의 이런 시나리오?를 예상해볼 수 있죠.

우리가 훈련 시킨)유사한 데이터셋 작은 데이터

유사한 데이터셋 좀 있는 데이터

(우리가 훈련시키지 않는 모델)전혀 다른 데이터셋 작은 데이터

전혀 다른 데이터셋 좀 있는 데이터




우리가 만약 imagenet에서 학습을 시켰을 때 뭐 고양이, 개 등등이 이미 있으니까 우리 데이터 셋에서도 만약 개, 고양이가 있으면 그게 작은 데이터 셋이면 linear classifier를 사용합니다.

그리고 개, 고양이 데이터 셋이 좀 많이 있으면 fintune합니다.



근데 문제는 imagenet에서 학습을 시켰을 때 없는 데이터(짜장면, 짬뽕)는 어떻게 할 것이냐? 이것입니다.

 

만약 이 짬뽕, 짜장면 데이터 개수가 적다면이건 좀 큰일입니다. 대책을 강구해봐야겠죠. 데이터를 boom 시키던가 등등이요. 만약 데이터가 어느정도 있으면 fintune으로 해결할 수 있다고 합니다.



그리고 이런 transfer learning은 아주 보편적입니다. 매우 일상적이게 되었죠

이 그림의 왼쪽은 object detection과 관련된 다이어그램입니다. 오른쪽은 image captioning과 관련된 것이죠.



2개는 처음에 CNN으로 시작합니다. 그리고 컴퓨터 비전(computer vision)관련 알고리즘들은 요즘 모델을 밑바닥부터 학습하지 않는다고 합니다. 대부분 pretrained-model을 사용하고 우리 task에 맞게 fine-tuning하는 것이죠.



Captioning의 경우 word vectorspretrain하기도 한다고 하네요.


Computer vision도 공부해보고 싶네요 ㅠㅠㅠ

아 공부할 것 너무 많아!!!




아무튼 이번장은 이렇게 정리가 됩니다.

조금 어렵네요. 저한테는. 강의를 2~3번 봤는데도 이해가 잘 안가지만요! 공부해봐야겠죠

 

다음 강의 정리는 9강으로 가겠습니다. 8강은 software 소개인데 보실분들은 보시면 좋지만 굳이 보지 않아도 될 것 같아서 넘어가려고 합니다.

 

보통 요즘은 pytorch를 많이 사용합니다. 그리고 tensorflowkeras를 많이 사용하죠.

 

저는 keras파 입니다. ㅎㅎㅎ(안물안궁)

 

아무튼 여기서 마치겠습니다! 수고하셨습니다.



반응형
그리드형