본문 바로가기
데이터 과학 관련 스터디/cs231n

cs231n 6강 Training Neural Network 1 정리

by inhovation97 2020. 11. 21.

이제 6강입니다.

우리는 지난 강의에서 CNN의 틀을 배웠습니다.

이제는 NN을 학습하는 과정을 2강에 걸쳐서 배웁니다.

 

일단 지난 강의부터 복기합시다.

우리는 지난 강의에서 가중치 w를 곱해주어 Liner model로 wx+b인 퍼셉트론을 배웠습니다.

 

 

layer를 쌓아 올려 Neural Network를 만들었고,

 

 

FC layer앞에 Covolutional layer를 쌓아서 CNN의 구조까지 배웠습니다.

 

 

Convolutional layer는 이렇게 필터로 이미지의 공간 정보들을 갖고 있는, activation map들을 생성해냈습니다.

 

 

그렇게 FC층에 넣어 모델을 만들고 optimization을 진행했습니다.

 

 이번 강의부터 앞으로 2강 동안 Training Neural Network을 배웁니다.

 

목차는 이렇게 됩니다.

 

 

이번 강의는 이것들에 대해서 다루죠. 

가장 먼저 Activation functions, 활성화 함수들에 대해 다루겠습니다!

 

 

 

<활성화 함수>

 

activation 함수는 딥러닝에 있어서 비선형성을 가해주는 매우 중요한 역할을 합니다.

activation함수를 넣지 않고 layer들만 쌓아주면 의미가 없다고 합니다. layer에 활성화 함수가 없으면, w2(w1x+b)+b로 넘어가고 그냥 wx+b와 다름 없어지므로 single layer와 다름이 없다는 것이죠.

우리는 아주 중요한 비선형성을 가해주는 활성화 함수를 배우겠습니다.

 

 

활성화 함수의 종류들입니다.

우리가 앞서 본 시그모이드 함수와 렐루 함수가 보입니다.

 

가장 먼저 시그모이드 함수입니다.

우리는 시그모이드 함수를 이미 살펴본 바 있습니다.

앞 노드에서 wx+b의 linear 함수를 시그모이드 함수에 적용하면, 0~1로 값을 갖게 됩니다.

하지만 시그모이드가 비선형 함수임에도 최근에 활성화 함수가 아니라 최종 ouput낼 때만 이용합니다.

 

 

3가지의 단점이 있기 때문이죠.

 

첫 번째 문제점은 시그모이드 함수는 기울기 gradient를 없애 버립니다.

흔히 이 문제를 vanishing gradient라고 정의합니다.

 

 

Neural Network는 Backpropagation이라는 기법 때문에 강력한 모델을 만들 수 있습니다.

하지만 시그모이드 함수를 활성화 함수를 이용한다면, Backprop에 문제가 생깁니다.

 

x가 -10일 때의 sigmoid의 기울기를 봅시다.

거의 0에 가깝습니다.

값이 매우 크거나 작으면 기울기는 0에 수렴한다는 것이죠. 

기울기의 최댓값인 x=0에서의 기울기도 0.25의 값입니다.

 

우리는 지난 시간에 w를 구하는 과정은 local gradient와 global gardient를 곱해서 w를 구했습니다. 이때 global gradient는 이전 노드의 기울기였습니다. back prop 과정이 이전의 기울기 값에 계속해서 local gradient를 곱해주는 식인데, global gradient가 거의 0이니 결국 모두 0에 수렴해서 기울기 소실되어 버리고 마는 것입니다.

w가 update 될 수 없는 것이죠

 

 

두 번째 문제는 zero-center의 문제입니다. 

시그모이드 함수를 보면 ouput값이 항상 양수입니다.

0을 중심으로 있지 않습니다.

Neural Network은 층을 계속해서 쌓았기 때문에 이전 노드의 ouput 값이 다음의 입력값이 됩니다.

시그모이드를 활성화 함수로 이용하면, 계속해서 양수의 값만이 input 되는 것이지요.

 

 

또 입력값이 항상 양수이면, gradient에서는 어떻게 문제가 되는지 봅시다.

back prop 과정을 보면, 위의 시그모이드 함수이므로 dl/df * df/dwi로 w의 기울기를 체인 룰로 구합니다.

저기서 df/dwi는 xi 것을 우리는 압니다.

여기서 입력값은 항상 양수이므로 dl/df의 부호를 따라가게 됩니다.

전부 양수이거나 전부 음수가 되는 것입니다.

 

그래서 위 슬라이드 오른쪽 그래프를 보면 w1을 x축 w2를 y 축인 2차원이라고 보았을 때, update가 초기 가중치 0에서 파란색 화살표가 best w라고 합시다.

빨간색 화살표처럼 지그재그로 가중치가 update 되기 때문에 굉장히 비효율 적이라는 것입니다.

입력값이 전부 양수라서 일어나는 단점입니다.

 

이 부분은 이해가 힘들 수 있습니다.

맨 아래에 설명이 잘 된 링크를 올릴 테니 글을 보시면, 쉽게 이해할 수  있습니다.

 

마지막은 exp의 연산은 힘이 많이 들어간다는 것입니다.

 

  • 기울기 소실의 문제 ( Vanishing Gradient )
  • zero - centered의 문제
  • exp의 연산이 있는 문제

위 세 가지의 문제로 시그모이드 함수는 activation 함수로는 이용하지 않습니다.

 

다음은 하이퍼볼릭 탄젠트 함수입니다.

시그모이드 함수와 유사하지만 도출 값이 1, -1 범위로 확장되어 zero - centered 문제를 해소했지만 마찬가지로 시그모이드 함수처럼 기울기 소실 문제를 해결하지 못해 활성화 함수로는 부적격입니다.

 

이번에 우리가 노드를 layer를 쌓아갈 때 f(x)=max(0, x)식을 사용했던 ReLu함수를 살펴봅시다.

렐루 그래프를 보면 양의 방향에서 입력값 x를 그대로 배출하기 때문에 기울기가 살아있습니다.

즉, 기울기 소실 문제를 어느 정도 해결한 것입니다.

이제 양의 영역에서는 가중치 w의 update가 가능해집니다.

exp연산도 사라져서 계산적으로도 효율적입니다.

 

그렇게 렐루 함수는 2012 Alex Net에서 쓰이기 시작하면서 CNN과 큰 규모의 데이터에 매우 잘 작동했습니다.

하지만 아직 걸리는 점이 있죠.

음의 영역에서는 기울기가 0이 되는 점과 zero - centered ouput의 문제였죠.

입력값의 음의 부분은 전부 0으로 두기 때문에 vanishing gradient, zero - centered output이 여전히 문제입니다. 

zero - centered는 아까 위에서 지그재그로 가중치를 수정하는 문제가 일어나서 효율성을 저해했습니다.

이 문제만 해결한다면, 우리는 아마 엄청나 효율성까지 겸비할 수 있을 것입니다.

 

이렇게 x가 -10 or 0이면 기울기는 소실됩니다.

x=10일 때만 기울기가 살아있습니다.

 

이를 dead ReLu라고 합니다.

 

이 경우에는 w initialization에서 dead렐루에 빠져버리면 업데이트가 안될 수도 있죠.

learnin rate를 크게 설정할 경우, w가 너무 크게 비약해서 학습이 안 되는 상황이 발생할 수 있는 단점이 있다고도 합니다.

 

이렇게 relu를 활성화함수로 한 모델을 훈련 도중에 network의 일부가 freeze 되는데,

이는 10~20% 정도가 dead relu에 빠진 것이라고 합니다.

이는 문제이긴 하지만 그럼에도 불구하고, train은 잘 된다고 합니다.

 

즉, 시그모이드에 비해 기울기 소실문제가 현저히 적어서 큰 문제를 일으키지 않고, 학습이 되기 때문에 relu가 상용화된 것이라고 보면 되겠습니다!(저는 그렇게 이해했습니다...)

 

 

 

그래서 렐루 함수에 약간의 bias값을 주어서 시작하려는 시도가 있습니다. 

저는 이를 아마도 처음부터 dead relu로 빠뜨리지 않게 하기 위한 시도라고 해석을 했습니다.(위에서 언급한 w initialization의 dead relu로 빠지는 단점)

조금 더 active의 가능성을 높여주는 것이지요.

위에서 말했듯이 initialization이 매우 중요하니까요.

하지만 이런 시도를 하는 사람도 있고, 안 하는 사람도 많다고 합니다.

효과가 확실하면 전부 bias를 주겠지요? 효과가 경미한가 봅니다.

 

Leaky ReLu는 relu함수의 효율성과 함께 dead relu의 단점을 보완한 함수입니다.

음의 영역에서도 경미하게 기울기를 주어 vanishing gradient 문제점을 해결한 것입니다.

 

PReLu도 같이 소개합니다. 

Leaky Relu는 0.01x로 음의 영역의 기울기를 고정했다면, PReLu는 파라미터로 알파 X를 만들어서 좀 더 융통성을 가한 것입니다.

실무 적용에서의 코멘트는 강의내에 없었습니다.

제 생각엔 아무래도 연산속도가 길어지기 때문에 큰 효과를 보장하는 것이 아니라면, Leaky렐루나 일반 렐루를 이용할 것 같습니다.

 

 

 

이번엔 ELU(Exponential Linear Units) 함수입니다.

우리는 이런 모양의 함수를 전부 LU함수라고 합니다. ELU도 LU시리즈의 함수죠.

ELU는 0에서의 미분 불가점을 미분 가능하게 smooth 시킨 함수입니다.

 

이 함수가 Leaky ReLu와 비교했을 때에는 노이즈에 대해서 더욱 로버스트 하다고 하는데요, 이는 zero mean에서 함수가 스무스하기 때문에 언급한 특징 같은데 아마도 뾰족점이 미분 가능점이 되었기 때문에 약간의 noise에 대한 이점이 생긴 것 같습니다.

 

따라서 zero mean의 결괏값들을 출력하는 데에 장점이 있습니다.

앞의 relu함수들의 단점을 어느 정도 보완한 것이라고 생각할 수 있습니다.

하지만 음의 영역에서 기울기가 소실되는 부분의 단점이 있고,

exp의 연산도 다시 생겨서 연산의 효율은 앞선 Relu들보다는 떨어집니다.

ELU함수는 ReLu함수와 Leaky ReLu함수의 사이인 함수라고 생각하면 됩니다.

 

강의에서는 각각의 장단점들이 있기 때문에 경험을 통해서 결정한다고 합니다.

 

아마 데이터에 따라서 어떤 것을 활성화 함수로 쓸지 정할 텐데, 큰 이점이 없으면 그냥 Relu를 쓰면 될 것 같은 개인적인 생각입니다.

 

 

 

다음은 Maxout뉴런입니다.

이 함수는 이제껏 봤던 함수들과는 꽤나 다릅니다.

파라미터를 더 두어서 각각 출력 값이 다른 함수 2개 중에 max값을 취하는 함수입니다.

maxout은 기울기가 사라지는 문제점은 없지만, 연산량이 두배가 된다는 큰 단점이 있습니다.

 

강의했던 시점에서는 뭐가 더 좋다기보다는 ReLu시리즈를 try out 해보고, 성능이 좋은 것을 이용하면 된다고 합니다.

tanh는 relu시리즈보다는 성능이 떨어진다고 하네요.

sigmoid는 쳐다도 보지 말랍니다.

 

<데이터 전처리>

 

우선 zero - centering과 normalize가 있습니다.

일반적인 머신러닝에서 우리는 보통 데이터를 zero-centering 후에, normalize 하여 각각의 들쑥날쑥한 피쳐들을 어떤 범위 내로 전처리시켰었습니다.

 

하지만, 이미지 데이터에서는 zero-centering만 해준다고 합니다.

이유는 이미지 데이터는 픽셀 값이 전부 같은 범위이기 때문이죠.(0~255)

 

그렇다면 zero-centering을 하는 이유는 무엇일까요?

우리는 앞서서 입력값이 전부 양수이면, w가 전부 음수나 양수가 되어서 업데이트가 일방향으로만 일어나기 때문에 비효율적이라고 배웠습니다.

 

이 부분 때문에 zero-mean은 전처리로 해준다고 합니다.

 

*학생이 zero-mean에 대해서 저도 궁금했던 질문을 했습니다.

zero-mean으로 위 문제를 아예 해결은 못한다고 합니다. 오직 첫 layer에서만 zero - centering이 되고, 그 이후에 네트워크가 깊어지면 깊어질수록 활성화 함수로 값이 양수만 나와서 첫 layer 정도에만 의미가 있다고 하네요.

 

 

전처리로 PCA나 whitening 기법들을 생각해볼 수 있습니다.

하지만 이미지 데이터에서는 단순히 zero-mean 정도만 해주고, 이러한 복잡한 기법들은 행하지 않는다고 해요.

 

왜냐하면 우리는 이미지 데이터를 저차원의 새로운 피쳐들로 이루어서 학습을 진행하는 것이 아니라, Convolutional layer에서 오리지널의 이미지 데이터를 필터 등으로 공간적인 구조로 바라봐야 함을 알기 때문이라고 합니다.

굉장히 좋은 설명입니다.

 

train 셋과 test 셋을 전 처리할 때에는 동일한 mean을 이용하여 zero-mean을 해준다고 합니다.

여기서 mean값을 이미지의 전체 데이터로 할지, 아니면 각각 독립된 채널마다의 mean으로 이용할지 선택할 수 있는데, 이는 큰 차이는 나지 않는다고 합니다.

 

VGGNet은 알렉스 넷보다 후에 나온 것인데, 각각의 채널별로 mean값을 두어 zero-mean을 했다고 합니다.

 

<weight initialization>

 

이제 weight initialization입니다.

중요한 개념이죠.

 

뉴럴 넷에서 weight를 전부 0으로 맞추면 무슨 일이 생길까요?

강의에서는 학생이 뉴런이 전부 죽어서 학습이 되지 않는다고 합니다.

이는 일부만 정답입니다.

 

뉴런이 죽는 게 아니라 전부 똑같이 수행합니다.

즉, w가 전부 0이기 때문에 입력값에서부터 모든 뉴런이 계속 똑같은 값을 내놓습니다.

활성화 함수가 작동하지 않으니, layer가 의미 없어지는 상황이라고 생각하면 될 것 같습니다.

 

그래서 생각해볼 수 있는 첫 번째 idea는 맨 처음 w에 아주 작은 랜덤의 값을 부여하는 것입니다.

정규 분포로부터 가져온 작은 편차의 값들을 랜덤으로 w initialization 해주는 것이지요.

하지만 이 방법도 뉴럴 넷이 깊어지면, 문제가 발생합니다.

 

이 경우는 현재 10-layer이며, 500개의 뉴런이 각 층에 있는 모델입니다.

활성화 함수는 tanh입니다.

코드를 보면, 위에서 말한 방식으로 w initialization 한 것을 알 수 있습니다.

0.01의 값을 곱해서 아주 작은 값들로 w를 initialization을 한 것입니다.

 

해당 방식의 결과를 봅시다.

아래 10개의 분포는 10개의 layer에서 나온 값들의 분포입니다.

파란색 그래프는 평균값이고, 빨간색 그래프는 값들의 표준 편차입니다.

 

분포가 zero mean이지만, layer가 깊어질수록 편차가 사라져서 값들이 그냥 전부 0에 수렴해버리는 현상이 일어납니다.

이유는 tanh함수가 zero-centered 함수라서 그렇습니다.

아니 zero-centered함수가 좋다면서 무슨 소리입니까 이게?

아마 0.01을 곱해서 w에 작은 값으로 ininitialization을 하면, 안 좋다는 말입니다.

 

w initialization에서 임의의 작은 값들을 랜덤 하게 주니 1보다 작은 w의 값들이 layer가 깊어질수록 계속해서 곱해지니까, 0으로 수렴해 버린 것이지요.

값이 너무 작아져서 collapse 되어 버리고 만 것입니다.

 

이런 상황에서의 w의 gradient는 어떻게 될까요?

우리는 layer가 깊어질수록 계속해서 0에 가까운 값들이 ouput 되고 input 됨을 확인한 상태입니다.

이 상태에서 gradient를 예상해보면, gradient는 upstream gradient (전부터 계속 말했던 global gradient)에 local gradient를 곱해주어 구했었죠? (W*X gate에서 w의 기울기가 입력값 X였었죠? 그것을 생각하면 이해가 더욱 쉽습니다. )

입력값, 출력 값들이 애초에 0에 수렴할 정도로 작은 값들이니 gradient마저도 엄청나게 작아지는 것입니다. 그래서 update도 잘 이루어지지 않죠.

 

그래서 항상 활성화 함수에 대해서 forwad pass와 backward에서의 gradient의 흐름을 잘 파악하고 생각해야 한다고 강조합니다.

 

이번에는 가중치를 0.01이 아니라 1을 곱해서 0으로 수렴하지 않도록 해본 결과입니다.

그랬더니 출력값들이 1과-1 로만 가버려서 explode해버립니다.

tanh함수에서 1과-1 값들은 전부 기울기가 0이되는 saturated 지점이었죠? 기울기가 전부 0이 되어 update가 마찬가지로 되지 않습니다.

 

그래서 강의에서는 initialization이 w를 작게하면 collapse가 되고, 너무 크게하면 saturate되기 때문에 매우 어려운 것이라고 합니다. 

 

initialization의 잘 된 예시로 2010년의 Xavier initialization을 소개합니다.

앞선 두 방식은 w에 고정값으로 1이나 0.01을 곱해주었다면, xavier는 랜덤의 가우시안 분포 값에서 np.sqrt(fan_in)으로 나누어주어 스케일링의 방식을 해주는 것입니다.

고정 값을 곱해서 w를 주는 것보다 상대적으로 입력값의 개수에 따라 상대적으로 값을 조절하여 initialization을 해주기 때문에 위 두 방식보다 합리적인 것입니다.

 

입력값들의 수가 적으면 우리는 큰 값의 w가 필요합니다. 그래서 더 적은 수로 나누어 스케일링해주고,

반대로 입력값들의 수가 많으면 우리는 작은 값은 w가 필요해서 큰 수로 나누어 스케일링을 하는 것이지요.

 

( 활성화 함수에 넣기 전에 Σwx+b으로 각 클래스 별 점수를 합산했었습니다.

아마 w의 기울기가 x이므로 상대적인 수로 나누어 initialization을 하는 것이 더 효과가 있다는 의미 같습니다.)

 

하지만 이 방식은 비선형 함수인 ReLu를 이용하면, 다시금 문제가 발생합니다.

zero - mean 함수였던 tanh와는 다르게 ReLu는 음수 부분은 전부 0이 되기 때문에 위와 같은 그래프가 나타납니다.

활성화 함수를 지나면서 편차가 강제로 절반이 됩니다.

layer가 깊어질수록 std가 0에 가까워지는 것이 보이시죠?

 

확실히 출력값들이 0이 많다면, w의 update는 잘 이루어지지 않을 것입니다. 그렇죠?

 

여기서 우리는 np.sqrt(fan_in/2)로 수정하여 2로 더 나누어줍니다.

뉴런의 절반이 죽어버린다는 근거로 2를 더 나눈 것입니다.

그래프를 보면 나아지는게 보이죠? 마지막 layer에도 출력값이 살아있습니다.

 

이렇게 작은 차이에도 weight의 값들에 대해서 주의를 기울이면, 큰 차이가 난다는 것을 강조합니다.

 

<Batch normalization>

이제 batch normalization으로 넘어갑니다.

우리가 원하는 가우시안의 범위 내에서 activation값들을 뽑고 싶은 idea에서 기인한 방식입니다.

 

현재 batch에서의 평균과 분산을 이용해서 훈련 처음부터 batch normalization을 취해주어 모든 층에서 정규 분포를 따르게끔 하는 것이죠.

 

각 뉴런에서 평균과 분산을 구하는 function을 이용해서 batch마다 normalization을 해주는 것인데, 이는 미분가능한 함수라서 back prop에도 문제가 없습니다.

 

현재의 batch 에서 N개의 D차원 input data가 있다고 봅시다.

우리는 화살표대로 각각의 차원마다(feature element) mean과 variance를 계산할 수 있습니다.

 

계산한 mean과 variance로 normalize를 합니다. 이게 한 batch 단위에서의 normalize입니다.

강의 노트를 보면, 수식이 정확히 나와있습니다.

 

ConV층과 FC층 후에 batch norm을 넣어줍니다.(활성화 함수를 거치기 전에)

각각의 층에서 가중치 w들이 곱해지기때문에 layer를 지날때마다 범위가 튀기 때문에, 층마다 이렇게 batch norm을 넣어주어 normalize를 진행하는 것이죠.

 

이는 ConV층, FC층 모두 적용이 가능한데, 차이점이 있습니다.

ConV층에서 중요한 것은 activation map의 spatial location의 정보입니다.

이 공간 정보들을 각 차원(feature)으로 norm해주면 안되겠지요? 그래서 activation map 당 한 개의 평균과 표준 편차를 이용하여, normalize를 해주는 차이가 있다고합니다.

 

Batch norm은 tanh로 가는 입력값들을 tnah함수의 linear한 부분(기울기가 존재하는 범위)으로 범위를 강제하는 것이라고합니다.

입력값들의 범위를 normalize해주어서 Saturate를 어느 정도 control 해주는 것입니다.

 

normalize한 x의 값을 다시 identitiy 값으로 변경하고 싶을 경우 감마를 곱해준 뒤, 베타를 더해주는 위 함수를 이용하면 됩니다.

여기서 감마는 표준 편차이기 때문에 scaling의 효과를 주고, 베타는 평균 값이기 때문에 shift의 효과를 주는 것입니다.

 

이렇게 saturate의 상황을 좀 더 유연하게 control할 수 있게 된 것입니다.

data나 상황에 따라 batch norm의 효과가 무조건 좋다고 보장할 수는 없기 때문에 이용하는 것입니다. 

 

batch normalization의 summary입니다.

 

  • mini-batch 마다 mean, variance를 계산합니다.
  • 구한 mean과 variance로 normalize를 해줍니다.
  • scailing과 shifting factor를 갖고 있습니다.

이 기법이 기울기의 흐름에 좋은 영향을 주어, 더욱 robust한 결과를 이끌어냅니다.

learning rate의 범위를 더욱 확장시킬 수 있고, 많은 다양한 initialization을 유도할 수 있게끔(initialization의 의존성을 줄인다) 하는 효과도 있어서 batch norm의 중요성을 굉장히 강조합니다.

 

regularization의 효과도 주는데, 이는 input값 x의 영향들을 normalization 해줌으로써 평균과 분산에도 영향력이 가해지기때문에 일종의 규제 효과도 있다고 언급하는 것 같습니다.

 

질문중에는 batch norm이 structure를 흐릴 수 있냐는 질문이 있었습니다.

nromalization은 그저 데이터를 scaling, shfting 해주는 것이기 때문에 데이터의 구조는 바뀌지 않습니다. 심지어는 convolutional layer에서는 각각의 activation map을 전체로 mean, variance를 구하기 때문에 spatial structure는 무사합니다. 이는 선형변환이기 때문에 공간 구조가 무너지지 않다고 생각하면 이해하기 쉽죠. 

 

test셋에서 batch norm을 할때에는 train셋에서 이용한 mean과 variance를 이용한다고 합니다.

 

<baby sitting Babysitting the Learning Process>

 

Babysitting the Learning Process에서는 네트웍 아키텍쳐를 구성하고, 학습과정을 어떤 시각으로 바라봐야하는지와 하이퍼 파라미터를 어떻게 조정하는지 전체적인 프레임을 살펴봅니다.

 

 

슬라이드를 차례순으로 설명합니다.

 

  • 앞서 말한대로 first step은 데이터 전처리입니다.
  • 네트웍의 아키텍쳐를 구성합니다.
  • loss 함수를 지정하거나 regularization을 생각해볼 수 있음.
  • 드디어 학습을 시키는데, Sanity Check으로 먼저 진행합니다. (train셋에서 일부만 가져와서 시작합니다. -> 과적합이 되면 학습이 잘되는 것을 확인합니다.)
  • 이제 전체 데이터를 학습 시키고, Loss를 확인하면서 Learning Rate를 조정합니다.(강의에서는 Learnning rate가 작을 때와 클 때의 case를 설명해줍니다.)

 

<Hyperparameter Optimization>

 

아 너무 길어요 이번 강의 중요한 것도 많이 나와서 건너 뛸 수가 없어 아주

 

가장 먼저 Cross-validation이 있습니다.

2장에서도 한 번 소개했었죠.

 

CV기법으로 넓은 범위에서 좁은 범위로 좁혀가며 하이퍼 파라미터를 세팅합니다.

 

lr과 reg를 최적화하는 예시입니다.

lr은 gradient와 곱해지는 값이기 때문에 log값으로 범위를 주는게 좋습니다.

로그값으로 값의 범위를 굉장히 작은 값으로 조절해서 gradient의 방향을 고려하는 겁니다.

조금만 커져도 explode하고 조금만 작아도 제대로 update되지 않으니까요.

빨간색 박스를 보면, lr은 e-04가 .reg값은 e-04~01이 val acc값이 높게 나옵니다.

 

위의 결과를 토대로 범위를 조정합니다.

범위를 좁히니 acc값이 53%까지 올라갑니다.

53%까지 올라갔지만, best결과는 아닐 수 있다고 합니다.

왜냐하면 값을 좀더 세세하게 들어가야한다 이거죠.

해당 범위에서는 누락된 부분이 있을 수 있다는 것입니다.

lr을 e-3~ -4로 두는 것을 e-0.28~0.45 이런식으로 놓칠 수 있는 부분을 말이죠.

 

이번에는 Grid search, Random search 방식입니다.

하이퍼 파라미터들의 값들을 조합을 고정시켜서 좋은 조합을 뽑는 방식입니다.

이는 랜덤 서치 방식이 더 좋습니다.

 

왜냐하면 그리드 방식은 일정한 간격으로 조합을 찾기 때문에 그림대로 search해 나가지만, 랜덤 방식은 무작위로 살펴 나가면서 모든 변수들을 중요도를 똑같다는 벽이 없는 것입니다. 

분명 변수들 사이에서도 중요도가 있을 테지만, 그리드 방식은 이를 무시한 채로 search해 나간다고 생각하면 됩니다.

 

하이퍼 파라미터의 최적 값을 찾는 것을 디제잉하는 것에 비유합니다.

감으로 시작해서 범위를 좁혀나가는 방식을 생각하면 정말 적절한 비유죠.

 

하이퍼 파라미터는 네트웍 아키텍쳐, learning rate, decay, 업데이트 방식, regularization 등등이 있습니다.

 

loss 그래프를 해석하는 방식을 설명하는 슬라이드입니다.

lr값은 update의 속도와 방향의 정확도를 전부 겸비한 빨간색의 그래프가 best겠지요.

 

이 그래프는 초기의 lr값을 너무 작게 잡아서 생기는 그래프입니다.

개념을 생각하면 이해하기 쉬운데, 초기의 initialization을 제대로 설정하지 못하여 gradient의 업데이트가 제대로 일어나지 않은 탓에 best값으로의 시간이 너무 오래 걸린겁니다.

 

validaiton의 acc값과 training의 acc값의 차이가 크면 안됩니다.

차이가 크다는 것은 곧 train셋에 대한 과적합이 일어난 것입니다.

그럴 경우에는 regularization을 높여주는 방식을 생각할 수 있죠.

과적합은 정말로 조심해야 합니다.

 

이번 강의의 summary입니다.

 

 

 

*강의 자료

**Activation function 참고자료(이해하시는 데에 큰 도움이 됩니다.)

cs231n.stanford.edu/2017/syllabus.html

 

Syllabus | CS 231N

Lecture 8 Thursday April 27 Deep Learning Software Caffe, Torch, Theano, TensorFlow, Keras, PyTorch, etc [slides] [video]

cs231n.stanford.edu

nittaku.tistory.com/267

 

8. activation function - saturation현상 / zigzag현상 / ReLU의 등장

파이썬 코드로 짠 M.L.N.N.의 코드를 하나하나 살펴보자. 위에는 Multi-Layer Neural Network(fully-connected N.N.)의 prototype이다. 여기서 하나하나의 요소를 개선해서 성능을 높일 수 있다. activation funct..

nittaku.tistory.com

 

댓글