신경망 학습에 있어서 학습률은 중요한 값이다. AdaGrad는 이 학습률을 학습진행에 따라 서서히 낮추어 가며 학습하는 방법이다. 각각의 매개변수에 적응적으로(adaptive) 학습률을 조정하면서 학습을 진행한다. 수식은 아래와 같다. $$ h \gets h + \frac{\partial L}{\partial W} \bigodot \frac{\partial L}{\partial W} \\ W \gets W - \eta \frac{1}{\sqrt{h + \epsilon}}\frac{\partial L}{\partial W} $$ $\epsilon$은 0으로 나눔을 방지하기 위한 변수며 h라는 변수는 학습률의 조정을 위해 생긴 변수다. h는 매 학습마다 기존 기울기값을 계속해서 곱해 더해준다.($\bigodot$ : 행렬의 원소별 곱셈) 그러면 h값의 크기는 기울기가 큰 만큼 커지고, 이 커진 h를 학습률에 곱해줘서 학습률의 크기를 줄여준다. 결론적으로 매개변수 중 많이 움직인(=크게 갱신된) 원소는 학습률이 낮아진다. 단, 이 방법을 통해 무한히 학습한다면 h값이 계속 증가해(기울기 제곱값은 항상 양수고, 양수를 계속해서 더해가므로) 갱신량이 0이되어 더이상 진행이 안 되는 경우가 생긴다. 이를 해결하기 위한 방법이 RMSprop 이다. 그럼 실제로 어떻게 진행되는지 알아보기위해 SGD 의 단점에서 사용한 함수와 비교해보자. 그림에서 알 수 있듯이, y축 방향은 기울기가 커서 처음에는 크게 움직이지만 이에 비례해 갱신 정도도 큰 폭으로 작아지게 조정된다. 따라서 y축 방향으로 갱신 정도가 빠르게 약해지고, SGD와는 달리 지그재그 움직임이 줄어든다. 실제로 기울기의 변화정도를 비교하면 다음과 같다. 왼쪽이 x축 방향의 기울기 값이고, 오른쪽이 y축 방향의 기울기 값이다. 기울기의 변화 정도가 y가 더 큼을 알 수 있다.
오차역전파법. 풀어쓰자면 Backward Propagation Of Errors 라고 할 수 있다. 즉, 오차를 역으로(반대방향으로) 전파하는 방법이다. 오차역전파법은 계산 그래프로 이해해 볼 수 있다. 계산 그래프 계산 과정을 그래프로 나타낸 것. 이곳 에서 볼 수 있듯이 계산 그래프의 흐름은 일반적으로 아래와 같다. 간단하게 나타내면 연산식($+,*$ 같은 간단한 연산부터 $\sqrt{x+\epsilon},**2$ 같은 연산까지)이 각각의 Node가 되고, Edge는 변수혹은 노드들의 국소적 계산 결과가 된다. 이렇게 국소적 계산을 하는 계산 그래프를 사용하면 역전파를 통해 미분을 효율적으로 계산할 수 있다. 위와 같이 연산식에 따른 역전파는 상류의 역전파값에 국소적 미분값을 곱해서 하류로 흘려보낸다. 이렇게 국소적 미분값을 곱해서 흘림으로써, 위에 간단하게 나타낸 그림에서 마지막 $x$로의 역전파 값을 보면 $\partial{z}$와 $\partial{t}$가 사라져 $$\frac{\partial z}{\partial x} \text{ : x에 대한 z의 미분} $$ 을 구할 수 있다. 같은 방식으로 $t$에 대한$z$의 미분값도 구할 수 있다. 즉, "중간 결과값들에 대한 최종결과값의 미분"을 구할 수 있다는 것이고, 이를 신경망에 적용해 생각해보면 각 층마다의 가중치와 편향값에 대한 손실 함수의 미분값이 구해진다는 것이다. 어파인 = Affine 계층 신경망의 순전파 때 수행하는 행렬의 내적을 어파인 변환 = Affine Transformation 이라고 한다. 어파인 계층은 이 어파인 변환을 수행하는 처리를 말한다. 순전파 : 입력x와 가중치 W의 내적 후 편향을 더해준다.(numpy 브로드캐스트) 역전파 : 가중치의 미분값에는 전치행렬을 사용하고, 편향의 미분값은 상류의 미분흐름의 총합으로 구해준다. 입력 데이터가 텐서(4차원 데이터)인 경우도 고려해서 파이썬으로 구현하면 다음과 같다. cl...
손실 함수 = Loss Function 신경망 성능의 '나쁨'을 나타내는 지표. 즉, 현재의 신경망이 훈련 데이터를 얼마나 잘 처리하지 못하는지를 나타냄. 이러한 '나쁨'을 최소로 하는 것은 사실상 '좋음'을 최대로 하는 것과 같으므로, 신경망 학습에서는 손실 함수값이 작아지는 방향으로 학습하게 됨. 신경망 학습에서는 최적의 매개변수(가중치, 편향)을 탐색할 때 손실함수의 값을 가능한 한 작게 하는 매개변수 값을 찾음. 찾을 때는 매개변수의 미분(=기울기)을 계산하고, 이 계산값을 단서로 새로 매개변수 값을 갱신해나감. 자세히 말하면 '가중치 매개변수에 대한 손실 함수의 미분=가중치 매개변수의 값을 아주 조금 변화시켰을 때, 손실 함수의 변하는 정도'임. 따라서 이 값이 음수 : 가중치 매개변수를 양의 방향으로 변화(=값 증가)시켜 손실 함수의 값을 줄임. 양수 : 가중치 매개변수를 음의 방향으로 변화(=값 감소)시켜 손실 함수의 값을 줄임. 굳이 손실 함수를 쓰는 이유는, 정확도를 지표로 하면 매개변수의 미분이 대부분의 장소에서 0이 되기 때문임. 정확도라는 것은 전체 중 얼마나 정확히 인식했냐이므로, 예를 들어 100장이 전체일 때는 32%, 33%와 같은 값만 같게 됨. 따라서 32%상황에서 매개변수를 조금 변화시켜도 32.0234%같이 안 되고 여전히 32%이거나(이 경우 미분이 0), 33%같이 큰 값으로(=불연속적으로) 값이 변화하므로 최적의 매개변수 값을 찾기에 적합하지 않음. 딥러닝에 자주쓰이는 손실함수에는 다음과 같은 함수들이 있음. 평균 제곱 오차 = MSE(Mean Squared Error) $$ E = \frac{1}{n}\sum_{k=1}^n (y_k-t_k)^2 \qquad y_k\text{ : 신경망의 출력, } t_k\text{ : 정답 레이블, } n\text{ : 데이터의 차원 수} $$ 특징 수치예측에 많이 사용됨. 파이썬 구현 ...
댓글
댓글 쓰기