밑바닥부터 시작하는 딥러닝 6장

YONG·2024년 5월 12일

학습관련 기술들

6.1 매개변수 갱신

신경망 학습의 목적= 최적화
:손실함수의 값을 최소화하는 매개변수를 찾는 것

지금까지 최적의 매개변수 값을 찾는 단서로 매개변수의 기울기(미분)를 이용했다.
(매개변수의 기울기를 구해 기울어진 방향으로 매개변수 값을 갱신하는 방법을 사용했다.)
이것이 확률적 경사 하강법(SGD)이라는 방법이다. 지금부터 SGD의 단점을 알아보고 또 다른 최적화 기법을 소개하고자 한다.

6.1.1 SGD(확률적 경사하강법)

W는 갱신할 가중치 매개변수이다.
∂L/∂W은 W에 대한 손실 함수의 기울기이다.
η(에타)는 학습률을 의미한다. 하이퍼파라미터이므로 0.01이나 0.001 같은 값을 미리 정해서 사용한다.
←는 우변의 값으로 좌변의 값을 갱신한다는 뜻이다.

6.1.2 SGD의 단점

SGD는 단순하고 구현도 쉽지만, 문제에 따라 비효율적일 때가 있다.

f(x,y)그래프

f(x,y) 기울기 그래프

f(x,y)가 최소가 되는 점은 (x,y)=(0,0)이지만 위의 그림에서 보여주는 기울기 대부분은 (0,0)방향을 가르키지 않음

SGD 적용

심하게 굽이진 모습
SGD가 지그재그로 탐색하게 되는 원인은 기울어진 방향이 본래의 최솟값과 다른 방향을 가리키기 때문이다.
무작정 기울어진 방향으로 진행하다보니, 비효율적으로 탐색하게 됨

=> 이러한 단점을 개선한 모멘텀, AdaGrad, Adam 소개

6.1.3 모멘텀

모멘텀: 운동량

SGD와 유사
W는 갱신할 가중치 매개변수이다.
∂L/∂W 은 W에 대한 손실 함수의 기울기이다.
η(에타)는 학습률을 의미한다. 하이퍼파라미터이므로 0.01이나 0.001 같은 값을 미리 정해서 사용한다.
←는 우변의 값으로 좌변의 값을 갱신한다는 뜻이다.
v 추가
v는 물리에서 말하는 속도(velocity)에 해당한다.
αv 항은 물체가 아무런 힘을 받지 않을 때 서서히 하강시키는 역할을 한다. α는 0.9 등으로 설정한다. (물리에서 지면 마찰이나 공기저항)

모멘텀 적용

결국 가중치의 변화 폭을 줄이면서 갱신 경로의 속도를 늦추는 것?
그림에서 볼 수 있듯 모멘텀의 갱신 경로는 공이 그릇 바닥을 구르듯 움직인다.
SGD와 비교하면 지그재그한 정도가 덜한 것을 알 수 있다. 이는 x축의 힘은 아주 작지만 방향은 변하지 않아서 한 방향으로 일정하게 가속하기 때문이다. 반대로 y축의 힘은 크지만 위아래로 방향이 바뀌기 때문에 y축 방향의 속도는 안정적이지 않다. (등고선 확인)
전체적으로는 SGD보다 x축 방향으로 빠르게 다가가 지그재그 움직임이 줄어든다.

6.1.4 AdaGrad

학습률 감소 기술: 학습을 진행하면서 학습률을 점차 줄여가는 방법(처음엔 크게 나중엔 작게)
AdaGrad 는 '각각의' 매개변수에 '맞춤형 학습률 값'을 만들어줌 (적응적으로 학습률 조정)

h 등장
h는 식에서 보듯 기존 기울기 값을 제곱하여 계속 더해준다.
⊙ 기호는 행렬의 원소별 곱셈을 뜻한다.
매개변수를 갱신할 때
1/h 을 곱해 학습률을 조정.
매개변수의 원소 중에서 많이 움직인(크게 갱신된) 원소는 학습률이 낮아지고, 학습이 진행될 수록 학습률이 낮아짐
다시 말해 학습률 감소가 매개변수의 원소마다, 갱신마다 다르게 적용됨을 뜻한다.

+) AdaGrad는 과거의 기울기를 제곱해 계속 더해간다. 그래서 학습을 진행할수록 갱신 강도가 약해진다. 실제로 무한히 계속 학습하면 어느 순간 갱신량이 0이 된다. 이 문제를 개선한 기법으로 RMSProp이라는 방법이 있다. RMSProp은 과거의 모든 기울기를 균일하게 더해가는 것이 아니라, 먼 과거의 기울기는 서서히 잊고 새로운 기울기 정보를 크게 반영한다. 이를 지수이동평균(Exponential Moving Average, EMA)라 하여, 과거 기울기의 반영 규모를 기하급수적으로 감소시킨다.
AdaGrad는 과거의 기울기를 제곱해 계속 더해간다. 그래서 학습을 진행할수록 갱신 강도가 약해진다. 실제로 무한히 계속 학습하면 어느 순간 갱신량이 0이 된다. 이 문제를 개선한 기법으로 RMSProp이라는 방법이 있다. RMSProp은 과거의 모든 기울기를 균일하게 더해가는 것이 아니라, 먼 과거의 기울기는 서서히 잊고 새로운 기울기 정보를 크게 반영한다. 이를 지수이동평균(Exponential Moving Average, EMA)라 하여, 과거 기울기의 반영 규모를 기하급수적으로 감소시킨다.
AdaGrad 적용

위 그림을 보면 최솟값을 향해 효율적으로 움직이는 것을 알 수 있다. y축 방향은 기울기가 커서 처음에는 크게 움직이지만, 그 큰 움직임에 비례해 갱신 정도도 큰 폭으로 작아지도록 조정된다. 그래서 y축 방향으로 갱신 강도가 빠르게 약해지고, 지그재그 움직임이 줄어든다.

6.1.5 Adam

위의 두 방법을 융합한 기법
"모멘텀은 공이 그릇 바닥을 구르는 듯한 움직임을 보였다. AdaGrad는 매개변수의 원소마다 적응적으로 갱신 정도를 조정했다. 그럼 이 두 기법을 융합한다면 어떻게 될까. 이런 생각에서 출발한 기법이 바로 Adam이다."

Adam 적용

위 그림에서 보이듯 Adam 갱신 과정도 그릇 바닥을 구르듯 움직인다. 모멘텀과 비슷한 패턴인데, 모멘텀 때보다 공의 좌우 흔들림이 적다. 이는 학습의 갱신 강도를 적응적으로 조정해서 얻는 혜택이다.

6.1.6 어떤 갱신 방법을 이용해야 하나?

SGD를 포함한 네가지 방법 중 모든 문제에 뛰어난 기법은 없음.
문제에 따라, 학습률등의 파라미터 설정에 따라 달라짐.

6.2 가중치의 초깃값

  • 가중치 감소 기법: 가중치 매개변수의 값이 작아지도록 학습하여, 오버피팅을 방지

  • 가중치의 초기값은?
    가중치를 작게 만들고 싶다면 초깃값도 작은 값에서 시작해야 할 것. 지금까진 정규분포에서 생성되는 값을 0.01배 하여 사용

  • 그냥 모두 0으로 두면 안되나?
    가중치가 모두 같은 값으로 설정되면 모든 가중치의 값이 똑같이 갱신됨. 계속 같은 값을 유지하게 됨 -> 가중치를 여러 개 갖는 의미가 사라짐
    =>초기값을 무작위로 설정해야 함

6.2.1 은닉층의 활성화값 분포

은닉층의 활성화값(활성화 함수의 출력 데이터)의 분포를 관찰하면 중요한 정보를 얻을 수 있다. 이번 절에서는 가중치의 초깃값에 따라 은닉층 활성화값들이 어떻게 변화하는지 간단한 실험을 해보고자 한다. 구체적으로는 활성화 함수로 시그모이드 함수를 사용하는 5층 신경망에 무작위로 생성한 입력 데이터를 흘리며 각 층의 활성화값 분포를 히스토그램으로 살펴보자.

층이 5개가 있다.
각 층의 노드는 100개씩이다.
입력 데이터로 1,000개의 데이터를 정규분포로 생성하여 이 5층 신경망에 흘린다.
활성화 함수로는 시그모이드 함수를 이용한다.

가중치의 분포에 따라 활성화 값들의 분포가 어떻게 변하는지 확인

w= np.random.randn(nose_nem,node_num)*1
w= np.random.randn(nose_nem,node_num)*0.01

가중치의 분포가 표준편차가 1인 정규분포일 때

각 층의 활성화값들이 0과 1에 치우쳐져 있다.
여기에서 사용한 시그모이드 함수는 그 출력이 0이나 1에 가까워지면 그 미분은 0에 다가간다. 그래서 데이터가 0과 1에 치우쳐 분포하게 되면 역전파의 기울기 값이 점점 작아지다가 사라진다. 이것이 기울기 소실(gradient vanishing)이라 알려진 문제이다.

가중치의 분포가 표준편차가 0.01인 정규분포일 때

이번에는 활성화 값이 0.5 부근에 집중되었다. 앞처럼 0과 1로 치우치진 않았으니 기울기 소실은 일어나지 않지만, 활성화값들이 치우쳤다는 것은 표현력 관점에서는 큰 문제가 있다. 무슨 뜻이냐면, 이 상황에서는 다수의 뉴런이 거의 같은 값을 출력하고 있으니 뉴런을 여러 개 둔 의미가 없다는 뜻이다.
예를 들어 뉴런 100개가 같은 값을 출력한다면 뉴런 1개와 별 차이가 없다는 것이다. 그래서 활성화값들이 치우치면 표현력을 제한한다는 관점에서 문제가 된다.

Xavier 초깃값
일반적인 딥러닝 프레임워크들이 표준적으로 사용하는 가중치 초깃값

초깃값의 표준편차가 1/n이 되도록 설정(n은 각각의 앞 층 노드의 수)
Xavier 초깃값을 사용하면 앞 층에 노드가 많을수록 표준편차가 작아진다. 즉, 대상 노드의 초깃값으로 설정하는 가중치가 좁게 퍼진다.

초깃값이 Xavier일때 활성화 값 분포

오른쪽으로 갈수록 일그러지고 있다. 이 일그러짐은 sigmoid 함수 대신 tanh 함수를 이용하면 개선된다. 실제로 tanh 함수를 이용하면 말끔한 종 모양으로 분포된다. tanh 함수도 sigmoid 함수와 같은 'S'자 모양 곡선 함수이다. 다만 tanh 함수가 원점에서 대칭인 S 곡선인 반면, sigmoid 함수는 (x,y)=(0,0.5)에서 대칭인 S 곡선이다. 활성화 함수용으로는 원점 대칭 함수가 바람직하다고 알려져 있다.

6.2.2 ReLu 사용시 가중치 초깃값

  • Xavier는 활성화 함수가 선형인 것을 전제로 함
    (sigmoid, tanh 함수도 좌우 대칭이라 중앙이 선형인 함수로 볼 수 있다고 함-> Xavier 사용)

  • Reulu 사용시엔 He 초깃값 이용
    He 초깃값은 앞 계층의 노드가 n개일 때, 표준편차가 2/n 인 정규분포를 사용한다.
    Xavier 초깃값이 1/n이었는데, ReLU는 음의 영역이 0이라서 더 넓게 분포시키기 위해 2배의 계수가 필요하다고 직감적으로 해석할 수 있겠다.

Relu 사용시 활성화 값 비교

  1. 표준편차가 0.01일 때의 각 층의 활성화값들은 아주 작은 값들이다.
    신경망에 아주 작은 데이터가 흐른다는 것은 역전파 때 가중치의 기울기 역시 작아진다는 뜻
    실제로도 학습이 거의 이뤄지지 않을 것이다.

  2. Xavier 초깃값 결과를 보면 이쪽은 층이 깊어지면서 치우침이 조금씩 커진다.
    실제로 층이 깊어지면 활성화값들의 치우침도 커지고, 학습할 때 '기울기 소실' 문제를 일으킨다.

  3. 마지막으로 He 초깃값은 모든 층에서 균일하게 분포되었다. 층이 깊어져도 분포가 균일하게 유지된다.

6.3 배치 정규화

각 층이 활성화 값을 적당히 퍼뜨리도록 강제하자는 아이디어에서 시작

미니배치 단위로 정규화를 시킴

미니배치 B = {x1,x2,,,,xm} 를 정규화
평균=0, 분산 1인 데이터로 변환

활성화 함수 앞 또는 뒤에 삽입

  • Affine: output=input⋅W+b
    주의) 활성화 함수는 Affine 된 값을 넣어 다른 값을 내놓는 것

또한 배치 정규화 계층마다 정규화된 데이터에 고유한 확대(scale)와 이동(shift)변환을 수행한다. 수식으로는 다음과 같다.

γ가 확대를, β가 이동을 담당
x^hat에 곱하고 더해줌

배치정규화 계산 그래프

장점)

  • 학습 속도 개선
  • 초깃값 의존도가 낮아짐
  • 오버피팅 억제

6.4 바른 학습을 위해

6.4.1 오버피팅

훈련데이터가 적은 경우
매개변수가 많고 표현력이 높은 경우

6.4.2 가중치 감소

학습 과정에서 큰 가중치에 큰 패널티를 부과해, 오버피팅을 억제
손실함수에 L2노름을 더해서 가중치가 커지는 것을 억제함
여기서 L2 노름이란, 각 원소의 제곱들을 더한 것이다. 가중치 W=(w

5.4.3 드롭아웃

신경망이 복잡해지며 가중치 감소만으론 대응하기 어려워짐
뉴런을 임의로 삭제하면서 학습

드롭아웃과 앙상블
앙상블 학습은 드롭아웃과 밀접하다. 드롭아웃이 학습 때 뉴런을 무작위로 삭제하는 행위를 매번 다른 모델을 학습시키는 것으로도 해석할 수 있기 때문이다.
그리고 추론 때는 삭제하지 않고 그대로 출력 함으로써 앙상블 학습에서 여러 모델의 평균을 내는 것과 같은 효과를 얻는다. 즉, 드롭아웃은 앙상블 학습과 같은 효과를 (대략) 하나의 네트워크로 구현했다고 생각할 수 있다.

5.5 적절한 하이퍼파라미터 찾기

5.5.1 검증 데이터

하이퍼파라미터 조정용 데이터
하이퍼파라미터의 적절성을 평가함
시험 데이터로 파라미터 조정하면 시험 데이터에 오버피팅 될 수도 있음
보통 훈련데이터의 20프로 사용

5.5.2 하이퍼파라미터 최적화

하이퍼파라미터 범위를 대략적으로 지정 후 무작위로 골라 정확도를 평가
반복하며 '최적의 값'의 범위를 좁혀가는 것

0개의 댓글