: 데이터셋의 분산 정도를 나타내는 측정 지표
표준 편차는 데이터 포인트들이 평균으로부터 얼마나 퍼져 있는지를 보여주는데,
값이 작을수록 데이터 포인트들이 평균 주변에 모여 있고 값이 클수록 퍼져 있는 것을 의미
(데이터셋의 변동성을 평가하거나 데이터 포인트들의 분포를 이해하는 데 유용함)
수학적으로 표준 편차는
각 데이터 포인트와 전체 평균값 간의 차이를 제곱한 후,
이를 모두 더하고 데이터 포인트의 개수로 나누어 계산한 후,
이 값을 제곱근을 취해서 얻어지는 값.
최적화(optimization) : 손실함수의 값을 가능한 낮추는 매개변수 를 찾는 것
: 최적의 매개변수 값을 찾기위해 미분(기울기)을 이용
"지금 서 있는 장소에서 가장 크게 기울어진 방향으로 일정 거리만 가자!"
장점 : SGD의 장점은 간단하고 계산 비용이 적다
W: 갱신할매개변수
∂L/∂W: 손실함수의기울기
η: 학습률,미리정해서사용
단순하고 구현도 쉽지만, 비효율적일 때도 있음
비등방성 함수((anisotropy) 방향에 따라 기울기(성질)가 달라지는 함수) 에서는
탐색 경로가 비효율적
적절한 하이퍼파라미터 노이즈(shooting)이 심하다.
Global Minimum에 수렴이 어렵다. 안장점
SGD는 무작정 기울어진 방향으로 진행하고,
기울어진 방향이 본래의 최솟값과는 다른 방향을 가르킨다.
이러한 단점을 개선시켜주는 다른 방법으로는
모멘텀, AdaGrad, Adam 이 있다.
: 운동량
모멘텀은 이러한 물리적 개념을 차용해 기울기가 변하는 방향에 가속도(v) 를 부여함으로서 지역 최소값(Local Minimum) 더 바르게 찾는 것을 목표로 합니다.
설명: 기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙을 나타냄
설명: 모멘텀에 따라 공이 그릇의 바닥을 구르는 듯한 움직임을 보임
W:갱신할 매개변수
∂L∂W:손실함수의 기울기
η:학습률, 미리정해서 사용
v : 속도 : 기울기 방향으로 힘을받아 물체가 지속된다는 물리법칙
SGD 보다 지그재그 정도가 덜 하다.
x축의 힘은 작지만 방향이 변하지 않아 한 방향으로 일정하게 가속하고,
y축의 힘은 크지만 방향이 변해 위아래로 상충하여 방향과 속도가 일정치 않다.
SGD보다 x축 방향으로 빠르게 다가간다.
신경망 학습에서 학습률이 중요하다.
AdaGrad는 학습률 감소(learning rate decay)라는 방법을 사용
너무 크면 발산하고, 너무 작으면 학습시간이 너무 길어지기 때문
AdaGrad는 '각각의' 매개변수에 '맞춤형' 값을 만들어줍니다.
학습률 감소(learning rate decay) : 학습을 진행하면서 학습률을 점차 줄여가는 방법
학습률을 서서히 낮추는 가장 간단한 방법은
매개변수 전체의 학습률 값을 일괄적으로 낮추는 것인데,
이를 발전시킨 것이 AdaGrad
AdaGrad는 개별 매개변수에 적응적(adative)으로
학습률을 조정하면서 학습을 진행한다.
h라는 새로운 변수는 기존 기울기값을 제곱하여 계속 더해준다.
그리고 매개변수를 갱신할 때 1/sqrt(h) 를 곱해 학습률을 조정한다.
즉, 매개변수의 원소 중 많이 움직인 원소는 학습률이 낮아진다.
학습률 감소가 매개변수의 원소마다 다르게 적용됨
AdaGrad는 과거의 기울기를 제곱하여 계속 더해가므로
무한히 학습할 때 갱신량이 0이 되어버리는 문제가 생긴다.
이를 개선한 RMSProp(지수이동평균)은
과거 기울기의 반영 규모를 기하급수적으로 감소시킨다.
Adam = Momentum + AdaGrad
이 두 기법의 장점을 모아 놓은 듯한 방법이며, 매개변수 공간을 효율적으로 탐색
하이퍼파라미터의 '편향 보정'이 진행된다는 점도 Adam의 특징입니다.
AdaGrad는 매개변수의 원소마다 적응적으로 갱신정도를 조정
Momentum은 속도를 가중치로 적용
이 방법은 매개변수의 공간을 효율적으로 탐색해주고,
하이퍼파라미터의 편향보정이 진행된다는 특징이 있다.
다음 사진은 지금까지 알아본 최적화 기법의 갱신경로를 비교한 것이다.
(1) SGD는 가장 심하게 굽이지며 비효율적인 움직임을 보여주고 있다.
SGD가 무작정 기울어진 방향으로 진행하는 단순한 방식이기 때문이다.
방향에 따라 기울기라는 성질이 달라져(비등방성 함수) 탐색 경로가 비효율적임을 알 수 있다.
(2) Momentum 은 SGD 보다 지그재그 정도가 덜 하다.
x축의 힘이 작지만 방향은 일정하여 한 방향으로만 일정하게 가속되기 때문.
반면, y축의 힘은 크지만 방향과 속도가 안정적이지 않다.
전체적으로 Momentum 은 SGD 보다 x축으로 빠르게 다가가며 지그재그 움직임이 줄어들게 된다.
(3) AdaGrad 는 최솟값을 향해 효율적으로 움직이는데
y축 방향은 기울기가 커서 처음에는 크게 움직이지만
그 움직임과 비례하여 갱신 정도가 큰 폭으로 작아지기 때문에
y축 방향으로 갱신 강도가 빠르게 약해진다. (=지그재그 움직임이 줄어듬)
(4) Adam 도 Momentum 과 비슷한 패턴(공이 그릇 바닥을 구르듯)으로 움직이지만
Momentum 보다 좌우 흔들림이 적은 이유는 : 학습의 갱신 강도를 적응적으로(adative) 조정했기 때문.
(adative): 각각의 학습률이 개별적으로 적용되는것!
각각의 매개변수에 '맞춤형 학습률 값'을 만들어준다.
AdaGrad가 항상 나은 것은 아니다.
풀어야 할 문제 종류, 하이퍼파라미터(학습률 등) 설정 종류 등에 따라
사용하기에 최적화 된 기법은 달라진다.
각 층이 100개의 뉴런으로 구성된 5층 신경망에서 ReLU를 활성화 함수로 사용해 측정
하이퍼파라미터인 학습률, 신경망의 구조(층 깊이 등)에 따라 결과가 달라짐
일반적으로 SGD보다 다른 세 기법이 빠르게 학습하고, 때로는 최종 정확도도 높음
신경망 학습에서 중요한 것 : 가중치 초기값
가중치 감소 : 가중치(매개변수) 값이 작아지도록 학습하여
(큰 가중치에 패널티 주어서) 오버피팅 억제하는 기법
가중치를 작게하고 싶으니까, 초깃값도 작게 시작하는 것
학습이 올바르게 이루어지지 않는다. (오버피팅 가능성이 높음)
오차역전파법에서 모든 가중치의 값이 똑같이 갱신되기 때문이다.
이렇게 가중치가 고르게 되어버리는 상황을 막으려면
초깃값을 무작위로 설정해야 한다.
은닉층의 활성화값 분포
은닉층의 활성화값 (활성화 함수의 출력 data)의 분포를 살펴보자.
각 층의 활성화값은 적당히 고루 분포되어야 신경망 학습이 효율적으로 이루어지게 된다.
치우친 데이터는 기울기 소실 문제/ 표현력 제한 문제에 빠져 학습이 잘 이루어지지 않는다.
즉, 모델이 학습 데이터의 특정 패턴이나 노이즈까지 학습하여 일반화 능력이 떨어지는 것을 의미합니다. 이를 방지하기 위한 여러 방법이 존재하는데, 그 중 하나가 위에서 언급한 '가중치 감소'입니다.
먼저 신경망은 입력부터 순차적으로 계산하여 출력을 생성하는 '순전파' 단계를 거칩니다. 그리고 이 출력과 정답의 차이를 계산하여 오차를 구합니다.
오차역전파법은 이 오차를 출력층에서부터 입력층으로 거꾸로 전파하면서 각 층의 가중치를 갱신합니다. 이런 방식으로 신경망은 자신의 출력이 정답과 가까워지도록 가중치를 조정하는 학습을 수행합니다.
활성화 함수로 시그모이드 함수를 사용하는 5층 신경망에 무작위로 생성한 입력데이터를 흘리며
각 층의 활성화값 분포를 히스토그램으로 그려본 실험에 의거하면,
가중치의 분포를 보면 각 층의 활성화 값들이 0과 1에 치우쳐 분포
시그모이드 함수는 출력이 0에 가까워지면 미분이 0에 다가가기 때문에,
역전파의 기울기값이 점점 사라져 기울기 손실 문제 발생
이번에는 가중치의 분포가 0.5 부근에 집중
앞서 본 그림처럼 0과 1로 치우쳐지지는 않아 기울기 소실 문제는 없으나,
활성화값들이 치우쳐졌다는 것은 다수의 뉴런이 거의 같은 값을 출력하고 있으니
뉴런을 여러개 둔 의미가 없어져 표현력 제한관점의 문제
*sqrt: 제곱근
**여기서 n은 앞 계층의 노드 수
[결과] 층이 깊어질 수록 형태가 일그러지긴 하지만,
뉴런들이 확실히 넓게 분포됨을 알 수 있다.
따라서 각 층에 흐르는 데이터가 적당히 퍼져 있으므로,
시그모이드 함수의 표현력도 제한받지 않고 학습이 효율적으로 이루어질것으로 예상된다.
(1) Xavier란?
(2) 장점
(3) 단점
시그모이드 함수와 tanh 함수는 좌우대칭, 중앙부근이 선형인 함수로, Xavier 초깃값이 적당하다.
tanh 함수는 쌍곡탄젠트 함수로, 입력값을 받아 -1과 1 사이의 값을 반환하는 함수.
수학적으로는 (e^x - e^(-x)) / (e^x + e^(-x))로 정의. (e는 자연 로그의 밑)
이 함수는 -1과 1에 가까운 값들에 대해서는 빠르게 증가하거나 감소하는 경향을 보여줌
그래서 입력값이 크게 변화해도 출력값이 급격하게 변하는 것을 방지하는 데 도움이 됨.
반면, ReLU를 이용할때는 ReLU에 특화된 초깃값(He 초깃값)을 이용이 좋다.
He 초깃값은 앞 층의 노드가 n 개 일때 sqrt(2/n) 인 정규분포를 사용
(1) 표준편차가 0.01 일때는 각 층의 활성화값들이 매우 작다.
이렇게 작은 데이터들이 흐른다는 것은 역전파때 가중치의 기울기가 작아진다는 뜻이며,
이렇게 되면 학습이 거의 이루어지지 않는다.
(2) Xavier 초깃값의 결과를 보면 치우짐이 조금씩 커지며 이는 기울기 소실 문제를 일으킨다.
(3) He 초깃값은 모든층에 균일하게 분포되어 역전파때도 적절한 값이 나올것으로 기대할 수 있다.
[정리]
가중치의 초깃값은 신경망 학습에 매우 중요!
: 배치정규화 계층을 신경망에 삽입함으로써 (활성화함수의 앞/뒤 위치 여부는 논의되고 있음)
각 층이 활성화값을 적당히 분포되도록 강제로 조정하는 것
[과정]
학습 시 미니배치를 단위 별로 하여
데이터 분포가 평균이 0, 분산이 1이 되도록 정규화한다.
다음의 활성화 함수 값으로 사용하게 된다.
학습 시 미니배치를 단위 별로 하여
데이터 분포가 평균이 0, 분산이 1이 되도록 정규화한다.
m개의 입력 데이터 집합에 대해 평균, 분산을 구함
yi=γxi^+β
γ : 확대 scale (1부터 시작)
β : 이동 shift (0부터 시작)
배치 정규화 계층마다 데이터에 확대/이동 변환을 수행하는데
학습하면서 γ, β를 적합한 값으로 조정해 나감.
오버피팅을 (방지X) 억제하는 기술이 매우 중요!
(1) 가중치 감소
원래 오버피팅은 가중치 매개변수의 값이 커서 발생하는 경우가 대부분이기 때문에
학습과정에서 큰 가중치에 대해 그에 상응하는 큰 패널티를 부과함으로써
가중치를 감소시켜 오버피팅 억제한다.
[방법]
L2노름(가중치의 제곱 노름)을 손실함수에 더하면
가중치가 커지는 것을 억제할 수 있다.
정규화 기법 중 하나
모델 가중치가 너무 큰 값을 갖지 않도록 모델의 복잡도를 제어하여 일반화 성능을 향상
(2) 드롭아웃
신경망 모델이 복잡해지면 가중치 감소만으로 대응이 어렵다. 이 때 흔히 드롭아웃 기법을 사용한다.
은닉층의 뉴런을 무작위로 골라 삭제하면서 매번 다른 모델을 학습함으로써 오버피팅 억제한다.
훈련 때는 은닉층의 뉴런을 무작위로 골라 삭제하면서 학습 (임의로 비활성화)
시험 때는 모든 뉴런에 신호를 전달한다. (드롭아웃 비율은 일반적으로 0.5가 효과적이라고 알려짐 = 학습과정에서 각 뉴런의 활성화될 확률을 50%로 설정)
(단, 각 뉴런의 출력에 '훈련 때 삭제 안 한 비율' 을 곱하여 출력한다 = 모델의 평균을 내는 것과 비슷한 효과)
이러한 점에서 드롭아웃은 앙상블 학습과 같은 효과를 대략 하나의 네트워크로 구현했다고도 말한다.
앙상블 학습이란 개별적으로 학습시킨 여러 모델의 출력을 평균 내어 추론하는 방식이다.
순전파를 담당하는 forward 메서드에서는
훈련 때 (:train_flg = True)만 잘 계산해두면
시험 때는 데이터를 흘리기만 하고 삭제 안 한 비율을 곱하지 않아도 된다.
단, 훈련 시, 순전파 때마다 self.mask 에 삭제할 뉴런을 False 로 표시
self.mask는
x와 형상이 같은 배열을 무작위 생성 한 후,
그 값이 dropout_ratio 보다 큰 원소만 True로 설정한다.
역전파 때의 동작은 ReLU와 같아서
순전파때 신호를 통과시키는 뉴런은 역전파 때도 신호를 그대로 통과시키고
순전파 때 통과시키지 않은 뉴런은 역전파 때도 신호를 차단한다.
신경망에서 등장하는 하이퍼파라미터는,
각 층의 뉴런 수, 배치 크기, 매개변수 갱신 시의 학습률과 가중치 감소 등을 말한다.
이러한 하이퍼파라미터 값은 모델의 성능에 있어서 매우 중요하다.
따라서, 하이퍼파라미터의 값을 최대한 효율적으로 탐색하는 방법을 알아보자.
데이터셋 = train(훈련:학습)data + test(시험:범용 성능을 평가)data
하이퍼파라미터 값의 '좋음'을 시험 데이터로 확인하게 되므로 오버피팅되기 때문.
따라서 하이퍼파라미터를 조정할 때에는 전용 확인 데이터가 필요하다.
이런 하이퍼파라미터의 적절성을 평가하는 데이터를 validation(검증)data 라고 부른다.
데이터셋에 따라 이렇게 세 가지로 분류해 놓은 것도 있지만, 그렇지 않고 훈련데이터와 시험데이터로만 분리되어있을 경우에는 보통 훈련데이터 중 20% 정도를 검증데이터로 먼저 분리한다.
하이퍼파라미터의 '최적 값'이 존재하는 범위를 조금씩 줄여나가는 것
그러려면, 우선 대략적인 범위를 설정하고
그 범위에서 무작위로 하이퍼 파라미터 값을 골라낸 후(=샘플링),
그 값으로 정확도를 평가한다.
하이퍼파라미터 최적화에서 범위는 대략적으로 0.001~1000 사이의 로그스케일로 지정하고,
그리드서치같은 규칙적인 탐색보다는 무작위로 샘플링해 탐색하는 것이 좋다.
그리드 서치는 모든 가능한 하이퍼파라미터 조합을 탐색하므로 시간도 오래 걸리고
검증 데이터에 과적합될 가능성이 있다. 또한, 실제로 일반화 성능이 떨이질 수도 있다.
또한 하이퍼파라미터를 최적화할때는 딥러닝 학습시간이 오래걸리므로,학습을 위한 에폭을 작게 하여 1회 평가에 걸리는 시간을 단축하는 것이 효과적이다.
하이퍼파라미터 최적화 방법은 실용적이나
베이즈 최적화(베이즈 정리 중심) 방법이 조금 더 과학적인 방법이다.