밑바닥부터 시작하는 딥러닝 - 2

Shin·2022년 2월 20일
0

Machine Learning

목록 보기
3/6

Chapter 4 신경망 학습

학습이란 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것을 뜻한다
신경망이 학습할 수 있도록 해주는 지표로 손실 함수를 이용한다
손실 함수의 결괏값을 가장 작게 만드는 가중치 매개변수를 찾는 것이 학습의 목표다

기계학습의 생명은 데이터로, 데이터에서 답을 찾고 데이터에서 패턴을 발견하고 데이터로 이야기를 만든다
기계학습에서는 사람의 개입을 최소화하고 수집한 데이터로부터 패턴을 찾으려 시도한다
게다가 신경망과 딥러닝은 기존 기계학습보다 사람의 개입을 더욱 배제할 수 있게

예를들어 숫자를 분류하는 문제에서 사람이 숨은 규칙성을 찾아 알고리즘을 설계해야 한다
하지만 기계학습에선 이미지(데이터)에서 특징을 추출하고 그 특징의 패턴을 기계학습 기술로 학습한다
여기서 말하는 특징은 입력 데이터에서 본질적인 데이터를 정확하게 추출할 수 있도록 설계된 변환기를 말한다
기계학습 방식에서는 특징을 사람이 설계했지만, 신경망은 이미지에 포함된 중요한 특징까지도 '기계'가 스스로 학습한다
신경망은 주어진 데이터를 온전히 학습하고, 주어진 문제의 패턴을 발견하려 시도한다는 이점이 있다

기계학습 문제는 훈련 데이터와 시험 데이터로 나눈 후, 훈련 데이터가 최적의 매개변수를 찾고, 테스트 데이터가 실력을 평가한다
그 이유는 범용 능력을 제대로 평가하기 위해 나누는 것이다
즉, 한 데이터셋에만 지나치게 최적화된 상태인 '오버피팅'을 피하기 위해 데이터를 나눈다

손실 함수

신경망은 하나의 지표를 기준으로 최적의 매개변수 값을 탐색하는데 신경망 학습에서 사용하는 지표는 '손실 함수'라고 하고, 일반적으로 오차제곱합과 교차 엔트로피 오차를 사용한다
다음은 가장 많이 쓰이는 오차제곱합의 수식이다
오차제곱합은 각 원소의 출력(추정 값)과 정답 레이블(참 값)의 차를 제곱한 후, 그 총합을 구한다

다른 손실 함수인 교차 엔트로피 오차의 수식이다
교차 엔트로피는 실질적으로 정답일 때의 추정의 자연로그를 계산한다
그림에서 보듯 x가 1일 때 y는 0이 된다
즉, 정답에 해당하는 출력이 커질수록 0에 다가가다가, 그 출력이 1일 때 0이 된다

빅데이터 수준에선 데이터가 수백만에서 수천만도 넘는 거대한 값이 되기도 하는데, 이 많은 데이터의 손실 함수를 일일이 계산하는 것도 매우 어려운 일이다
그래서 신경망 학습에선 훈련 데이터로부터 일부만 골라 학습을 수행하는데, 이 일부를 미니배치라고 하고, 이러한 학습 방법을 미니배치 학습이라고 한다

왜 신경망에선 정확도 대신에 손실 함수를 사용할까?
신경망에선 최적의 매개변수를 탐색할 때 손실 함수가 가장 작은 매개변수 값을 찾는다
이때 매개변수의 미분(기울기)을 계산하고, 그 값을 단서로 매개변수의 값을 서서히 갱신한다

정확도를 지표로 삼게 되면 매개변수의 미분이 대부분의 장소에서 0이 되어버린다

하지만 손실 함수는 매개변수의 값이 조금 변하면 그에 반응하여 연속적으로 변화하기 때문에 지표로 사용한다
정확도는 매개변수의 미소한 변화에는 거의 반응하지 않다가 그 값이 불연속적으로 갑자기 변화한다
활성화 함수로 계단 함수를 사용하지 않는 이유와 같다
계단 함수의 미분은 대부분의 장소에서 0이기 때문에 손실 함수를 지표로 삼는 이유가 없어진다
매개변수의 작은 변화가 주는 파장을 계단 함수가 말살하여 손실 함수의 값에는 아무런 변화가 나타나지 않기 때문이다

하지만 시그모이드 함수는 기울기가 연속적으로 변하기 때문에 어느 장소에서도 0이 되지 않는다
그 덕분에 신경망이 올바르게 학습할 수 있다

수치 미분

미분은 한순간의 변화량을 표시한 것으로 다음 수식을 갖는다
x의 작은 변화가 함수 f(x)를 얼마나 변화시키느냐를 의미한다
곧이 곧대로 구현하려면 h에 작은 값을 대입해 계산할 수 있다

파이썬에선 너무 작은 값을 대입하면 '반올림 오차' 문제를 일으킨다
반올림 오차는 작은 값이 생략되어 최종 계산 결과에 오차가 생기게 한다
그렇기 때문에 10**-4정도의 값을 사용한다

두 번째 문제는 차분과 관련이 있는데
진정한 미분은 x위치의 함수의 기울기를 구하는 것이지만, 이번 구현에선 (x+h) - x의 기울기에 해당한다
그래서 진정한 미분과는 엄밀히 일치하지 않는다
이 차이는 h를 무한히 0으로 좁히는 것이 불가능해 생기는 한계다
다음 그림처럼 수치 미분에는 오차가 포함되는데 이 오차를 줄이기 위해 (x+h)와 (x-h)일 때의 함수 f의 차분을 계산하는 방법을 쓰기도 한다
이 차분은 x를 중심으로 그 전후의 차분을 계산한다는 의미에서 중심 차분 혹은 중앙 차분이라 한다((x+h)와 x의 차분은 전방 차분이라 한다)

수치 미분 : 아주 작은 차분으로 미분하는 것
해석적 해 : 수식을 전개해 미분하는 것, 해석적이라는 말을 이용한다. 또한 오차를 포함하지 않는다

편미분 : 변수가 여럿인 함수에 대한 미분이다
편미분은 변수가 하나인 함수를 정의하고, 그 함수를 미분하는 형태로 구현할 수 있다
위 식에 대해 x0을 기준으로 수치 미분을 수행한 결과다.
즉, 여러 변수 중 목표 변수 하나에 초점을 맞추고 다른 변수는 값을 고정한다

기울기

앞 예에선 x0과 x1의 편미분을 따로 계산했다
하지만 우리는 양쪽의 편미분을 묶어서 동시에 계산할 수 있는데, 이때 모든 변수의 편미분을 벡터로 정리한 것을 기울기라고 한다

그렇다면 기울기가 의미하는 건 뭘까?
그림을 보면 기울기는 함수의 '가장 낮은 장소(최솟값)'를 가리킨다
정확하게 말하자면 기울기가 가리키는 쪽은 각 장소에서 함수의 출력 값을 가장 크게 줄이는 방향이다

신경망의 목표는 손실 함수가 최솟값이 되는 최적의 매개변수(가중치와 편향)를 찾는 것이다
그러나 매개변수 공간이 광대하여 어디가 최솟값이 되는 곳인지 짐작할 수 없다
그렇기 때문에 기울기를 이용해 함수의 최솟값을 찾으려는 것이 경사법이다
각 지점에서 함수의 값을 낮추는 방안을 제시하는 지표가 기울기이다
기울어진 방향이 꼭 최솟값을 가리키는 것은 아니나, 그 방향으로 가야 함수의 값을 줄일 수 있다

경사법은 현 위치에서 기울어진 방향으로 일정 거리만큼 이동한다
그런 다음 이동한 곳에서 기울기를 구하고, 또 그 방향으로 나아가기를 반복한다
이렇게 해서 함수의 값을 점차 줄이는 것이 경사법이다

η 기호는 갱신하는 양을 나타낸다
이를 신경망 학습에서는 학습률이라고 한다
한 번의 학습으로 얼마나 학습해야 할지, 즉 매개변수 값을 얼마나 갱신하느냐를 정하는 것이 학습률이다

위 식처럼 변수의 값을 생신하는 단계를 여러 번 반복하면서 서서히 함수의 값을 줄인다
변수의 수가 늘어도 같은 식으로 갱신하게 됩니다

또한 학습률 값은 0.01이나 0.001 등 미리 특정 값으로 정해두어야 하는데, 너무 크거나 작으면 '좋은 장소'를 찾아갈 수 없다
학습률이 너무 크면 큰 값으로 발산해버린다
반대로 너무 작으면 거의 갱신이 되지 않고 끝나버리는데, 이렇기 때문에 적절한 학습률을 설정하는 것이 중요하다

학습률 같은 매개변수를 하이퍼파라미터라고 한다
가중치와 편향은 학습 알고리즘에 의해서 자동으로 획득되지만, 학습률 같은 경우는 사람이 직접 설정해야하는 매개변수인 것이다

학습 알고리즘 구현하기

전체
신경망에는 적응 가능한 가중치와 편향이 있고, 이 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정을 '학습'이라 한다
다음 4단계로 수행한다

1단계 - 미니배치
훈련 데이터 중 일부를 무작위로 가져온다
이렇게 선별한 데이터를 미니배치라 하며, 미니배치의 손실 함수 값을 줄이는 것이 목표다

2단계 - 기울기 산출
미니배치의 손실 함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구한다
기울기는 손실 함수의 값을 가장 작게 하는 방향을 제시한다

3단계 - 매개변수 갱신
가중치 매개변수를 기울기 방향으로 아주 조금 갱신한다

4단계 - 반복
1 ~ 3단계를 반복한다

이것이 신경망의 학습 과정이다
이는 경사 하강법으로 매개변수를 갱신하는 방법이며, 데이터를 미니배치로 무작위로 선정하기 때문에 확률적 경사 하강법(stochastic gradient descent, SGD)이라고 부른다

에폭(epoch) : 신경망 학습에서 사용하는 단위로 1에폭은 학습에서 훈련 데이터를 모두 소진했을 때의 횟수에 해당한다




Chapter 5 오차역전파법

수치 미분은 단순하고 구현도 쉽지만 계산이 오래 걸리는 단점이 있다
그래서 기울기를 효율적으로 계산하는 '오차역전파법'을 사용한다
수식과 계산 그래프를 통해 표현할 수 있다

계산 그래프

계산 그래프는 계산 과정을 그래프로 나타낸 것으로, 복수의 노드와 엣지로 표현된다
위 식은 계산 그래프의 예시로 계산 결과가 왼쪽에서 오른쪽으로 전달된다
여기서 '계산을 왼쪽에서 오른쪽으로 진행'하는 단계를 순전파라고 한다
순천 파의 반대 방향의 전파를 역전파라고 하며, 미분을 계산할 때 중요한 역할을 한다

계산 그래프를 사용하는 이유는 역전파를 통해 '미분'을 효율적으로 계산할 수 있다는 점이다
위 그림에서 '사과 가격에 대한 지불 금액의 미분' 같은 값은 역전파를 하면 구할 수 있다
역전파는 순전파와는 반대 방향의 화살표(굵은 선)로 그리고, 이 전파는 '국소적 미분'을 전달한다
이 결과로 '사과 가격에 대한 지불 금액의 미분'은 2.2 즉, 사과가 1원 오르면 최종 금액은 2.2원이 오른다

이처럼 계산 그래프는 순전파와 역전파를 활용해서 각 변수의 미분을 효율적으로 구할 수 있다

연쇄법칙

'국소적 미분'을 전달하는 원리는 연쇄법칙을 따른다
연쇄법칙을 설명하려면 합성 함수를 설명해야 하는데, 합성 함수란 여러 함수로 구성된 함수다
합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다
이것이 연쇄법칙의 원리다

z = (x + y)^2 식의 계산 그래프다
역전파의 계산 절차에서 노드로 들어온 입력 신호에 그 노드의 국소적 미분을 곱한 후 다음 노드로 전달한다
주목할 것은 맨 왼쪽 역전파인데, 이 계산은 연쇄법칙을 따라 'x에 대한 z의 미분'이 된다

역전파

z = x + y라는 식이 있을 때, x와 y의 각 미분값은 1이 된다
그렇기 때문에 덧셈 노드의 역전파는 입력 값을 그대로 흘려보낸다

하지만 z = xy라는 곱셈에서 x, y의 미분값은 각각 y와 x이다
그렇기 때문에 곱셈 노드의 역전파는 입력 신호들을 '서로 바꾼 값'을 곱해서 하류로 보낸다

활성화 함수 계층 구현하기

다음은 시그모이드 함수의 계산 그래프이다
이전과 다르게 'exp'와 '/'노드가 새롭게 추가되었다

1단계
'/'노드, 즉 y = 1/x를 미분하면 다음 식이 된다따라서 역전파 때는 상류에서 흘러온 값에 -y^2를 곱해서 하류로 전달한다

2단계
'+'노드는 상류의 값을 여과 없이 하류로 보낸다

3단계
'exp'노드는 y=exp(x)를 수행하며, 미분은 다음과 같다
계산 그래프에서는 상류의 값에 순전파 때의 출력을 곱해 하류로 전파한다

4단계
'x'노드는 순전파 때의 값을 '서로 바꿔'곱한다

여기서 순전파의 입력 x와 출력 y만으로 계산할 수 있다
다음은 위 그래프의 간소화 버전이다
중간 계산들을 생략할 수 있어 효율적인 계산이 가능하다
노드를 그룹화하여 계층의 세세한 내용을 노출하지 않고 입력과 출력에 집중할 수 있다

Affine/Softmax 계층 구현하기

신경망의 순전파에서 가중치 신호의 총합을 계산하기 때문에 행렬의 곱을 사용했다
신경망의 순전파 때 수행하는 기하학에서는 어파인 변환이라고 한다

행렬을 사용한 역전파도 행렬의 원소마다 전개해보면 스칼라값을 사용한 지금까지의 계산 그래프와같은 순서로 생각할 수 있다
W^T의 T는 전치행렬을 뜻한다
행렬 곱의 역전파는 행렬의 행렬의 대응하는 차원의 원소 수가 일치하도록 곱을 조립하여 구할 수 있다


소프트맥스는 입력 값을 정규화하여 출력한다

신경망에서 수행하는 작업은 학습추론이다
일반적으로 추론에선 softmax를 사용하지 않는다
또한 신경망에서 정규화하지 않는 출력 결과에서는 softmax 앞의 affine 계층의 출력을 점수라 한다
즉, 신경망 추론에서 답을 하나만 내는 경우에는 가장 높은 점수만 알면 되니 softmax 계층은 필요 없다는 것이다

다음은 교차 엔트로피와 함께 구현한 softmax 계층이다
여기선 3개의 입력 (a1, a2, a3)을 입력 받아 정규화하여 (y1, y2, y3)를 출력한다
Cross Entropy Error 계층은 (y1, y2, y3)와 정답 레이블 (t1, t2, t3)를 입력받아 손실 L을 출력한다

softmax 계층의 역전파는 (y1 - t1, y2 - t2, y3 - t3)라는 깔끔한 결과를 내놓는다
즉, softmax의 출력과 정답 레이블의 차분을 전달한다
이런 말끔한 결과는 교차 엔트로피 오차라는 함수가 그렇게 설계되었기 때문이다
또한, 회귀에서 '항등 함수'의 손실로 '오차제곱합'을 이용하는 이유도 같다☆

오차역전파법 구현하기

기울기를 구하는 두 가지 방법으로 수치 미분과 해석적 수식을 설명했다
후자인 해석적 방법은 오차역전파법을 이용하여 매개변수가 많아도 효율적으로 계산했다
그래서 느린 수치 미분 대신 오차역전파법을 사용한다

하지만 수치 미분은 구현하기 쉽다는 장점이 있어, 버그가 숨어 있기 어렵다
그래서 수치 미분의 결과와 오차역전파법의 결과를 비교하여 오차역전파법을 제대로 구현했는지 검증한다
이 작업을 기울기 확인이라고 한다

수치 미분과 오차역전파법의 오차가 0이 되는 경우는 힘들다
컴퓨터가 할 수 있는 계산의 정밀도가 유한하기 때문이다
0이 되진 않지만 올바르게 구현했다면 0에 아주 가까운 값이 나오게 된다

0개의 댓글