구조는 회귀 때와 같고 출력노드의 활성화 함수만 다르다. 가중치는 이 문제에 맞게 따로 들어 있어야 한다. 그 신경망에서 학생 1을 순전파했을 때 출력노드의 합이 \(-2.15\)였다면 \(\hat{y} = \sigma(-2.15) = 0.104\), 합격 확률 약 0.1이다. 실제값은 합격(1)이다.
합이 어떤 값이어도 Sigmoid를 통과하면 0과 1 사이가 되는지 직접 확인한다. 슬라이더로 \(z\)를 움직이거나, 칸에 아주 큰 값이나 아주 작은 값을 넣어 보자.
인터랙티브 — 합 \(z\)가 무엇이든 Sigmoid의 출력은 0과 1 사이
viewof sgmSlider = Inputs.range([-10,10], {value:-2.15,step:0.05,label:"출력노드의 합 z (슬라이더)"})viewof sgmTyped = Inputs.text({label:"또는 직접 입력 (예: 1000, -1000)",placeholder:"비워 두면 슬라이더 값 사용"})sgmZ = { const v =parseFloat(sgmTyped);returnNumber.isFinite(v) ? v : sgmSlider }sgmY =1/ (1+Math.exp(-sgmZ))
{const xs = d3.range(-10,10.001,0.05).map(z => ({z,y:1/ (1+Math.exp(-z))}));const zc =Math.max(-10,Math.min(10, sgmZ));const fmt = v => (v >0.9999|| v <0.0001) && v !==0&& v !==1? v.toPrecision(6) : v.toFixed(4);const plot = Plot.plot({width:620,height:300,marginLeft:50,x: {label:"z (출력노드의 합)",domain: [-10,10]},y: {label:"ŷ = σ(z)",domain: [-0.05,1.05],ticks: [0,0.25,0.5,0.75,1]},marks: [ Plot.ruleY([0,1], {stroke:"#C62828",strokeDasharray:"4,4"}), Plot.text([{z:-9.6,y:1,t:"ŷ = 1 (닿지 않음)"}, {z:-9.6,y:0,t:"ŷ = 0 (닿지 않음)"}], {x:"z",y:"y",text:"t",dy:-8,textAnchor:"start",fill:"#C62828",fontSize:11}), Plot.ruleY([0.5], {stroke:"#bbb"}), Plot.line(xs, {x:"z",y:"y",stroke:"#1565C0",strokeWidth:2.5}), Plot.ruleX([zc], {stroke:"#6A1B9A",strokeDasharray:"2,3"}), Plot.dot([{z: zc,y: sgmY}], {x:"z",y:"y",r:7,fill:"#6A1B9A",stroke:"#fff",strokeWidth:2}), ] });const note =html`<div style="font-family:Pretendard,sans-serif;font-size:0.95em;margin-top:6px;"> <b style="color:#6A1B9A">z = ${sgmZ}</b> → ŷ = 1 / (1 + e<sup>−(${sgmZ})</sup>) = <b style="color:#6A1B9A">${fmt(sgmY)}</b>${Math.abs(sgmZ) >10?`<div style="color:#888;margin-top:2px">그래프 범위(−10~10)를 벗어나 점은 가장자리에 그렸다. 값은 ${sgmY >=0.5?"1에 매우 가깝지만 1은 아니다":"0에 매우 가깝지만 0은 아니다"}.</div>`:""} </div>`;returnhtml`<div>${plot}${note}</div>`;}
\(z\)가 커질수록 1에, 작아질수록 0에 다가가지만 어느 쪽에도 닿지 않는다. 그래서 출력을 언제나 확률로 읽을 수 있다. \(z = 0\)이면 정확히 0.5다.
여기서 \(\hat{y}^{(i)}(W)\)는 가중치 \(W\)로 계산한 \(i\)번째 데이터의 예측값이다. 가중치가 달라지면 이 예측값이 바뀌고, 정답과 비교한 손실도 바뀐다.
7.2 손실 최소화: 학습이 찾으려는 것
학습 데이터에서 전체 손실이 작을수록 예측 오차가 작다. 따라서 학습의 목표는 손실함수를 최소로 만드는 가중치를 찾는 것이다. 그 가중치를 \(W^*\)라고 쓰면
\[W^*=\underset{W}{\operatorname{argmin}}\;J(W)\]
로 표현한다. \(\operatorname{argmin}\)은 함숫값을 최소로 만드는 입력을 뜻한다. 여기서 찾는 것은 가장 작은 손실값 자체가 아니라, 그 손실을 만드는 가중치다. 이처럼 가중치를 조절하여 손실을 최소로 만드는 문제를 손실 최소화라고 한다.
목표는 정해졌다. 이제 필요한 것은 현재 가중치를 어떻게 바꾸어야 손실이 줄어드는지 알아내는 방법이다.
7.3 가중치가 하나인 간단한 예제
앞의 신경망에는 가중치가 여러 개 있고, 예측 과정에도 여러 계산이 들어간다. 먼저 가중치 하나를 조절하는 원리부터 살펴보자. 가중치를 \(w\)라 하고, 손실함수가 다음과 같다고 가정한다.
\[J(w)=(w-2)^2\]
이 식은 앞의 학생 데이터에서 구한 손실함수가 아니다. 손실을 줄이는 방법을 배우기 위해 단순하게 정한 예제다. 이후 한 변수의 미분과 경사하강법을 설명할 때는 이 함수를 계속 사용한다.
그래프의 가로축은 우리가 바꾸는 가중치 \(w\), 세로축은 그 결과인 손실 \(J(w)\)다. 예를 들어 \(w=4\)이면 손실은 \((4-2)^2=4\)다. 가중치를 바꾸면 점이 곡선을 따라 움직인다.
아래에서 \(w=4\)를 기준으로 왼쪽과 오른쪽을 비교한다. 왼쪽으로 0.5를 누른 뒤, 처음으로를 눌러 돌아와 오른쪽으로 0.5를 누른다.
가중치를 왼쪽 또는 오른쪽으로 움직여 손실을 비교하는 인터랙티브입니다. JavaScript를 켜면 조작할 수 있습니다.
왼쪽으로 이동한 \(w=3.5\)에서는 손실이 \(2.25\)로 줄고, 오른쪽으로 이동한 \(w=4.5\)에서는 \(6.25\)로 늘어난다. 이 예제의 손실을 최소로 만드는 가중치는 \(w^*=2\)이고, 그때의 손실은 \(J(2)=0\)이다.
다만 가중치를 항상 줄이면 되는 것은 아니다. 시작 위치를 \(w=0\)으로 바꾸면, 이번에는 오른쪽으로 이동해야 손실이 줄어든다. 손실을 줄이는 방향은 현재 가중치가 어디에 있는지에 따라 달라진다.
8. 손실을 줄이는 방향은 어떻게 알 수 있는가
방금 확인한 두 위치를 같은 그래프에서 비교해 보자. \(w=4\) 주변에서는 오른쪽으로 갈수록 곡선이 올라간다. 따라서 왼쪽으로 조금 이동하면 손실이 줄어든다. 반대로 \(w=0\) 주변에서는 오른쪽으로 갈수록 곡선이 내려가므로, 오른쪽으로 조금 이동하면 손실이 줄어든다.
같은 손실 곡선에서도 현재 위치에 따라 손실을 줄이는 방향이 달라진다. w=0에서는 오른쪽으로, w=4에서는 왼쪽으로 조금 이동한다.
이를 현재 위치 주변의 기울기로 표현할 수 있다. 그래프를 오른쪽으로 읽을 때 올라가면 기울기는 양수, 내려가면 음수다.
현재 위치 주변의 기울기
손실을 줄이려면
양수: 오른쪽으로 올라간다
가중치를 조금 줄인다
음수: 오른쪽으로 내려간다
가중치를 조금 늘린다
즉, 기울기의 부호와 반대 방향으로 조금 이동한다. 여기서 조금이라는 조건이 중요하다. 현재 위치 주변에서 내려가는 방향이라도, 멀리 이동하면 최솟점을 지나 손실이 다시 커질 수 있다.
이 예제는 그래프를 보고 방향을 판단할 수 있다. 실제 학습에서는 복잡한 손실함수의 전체 그래프를 그려 판단하기 어렵다. 대신 현재 위치의 기울기를 계산하여 가중치를 조절할 방향을 정한다. 다음 절에서는 그 기울기를 어떻게 계산하는지 알아본다.
9. 현재 위치의 기울기를 구하는 방법: 미분
9.1 두 점 사이의 변화율
기울기를 수치로 구하려면, 가중치가 변할 때 손실이 얼마나 변하는지 비교해야 한다. 먼저 \(w=4\)에서 \(w=5\)로 이동하는 경우를 살펴보자.
\(J(w)\)에 가중치를 넣으면 손실이 나오고, \(J'(w)\)에 가중치를 넣으면 그 위치의 기울기가 나온다. 손실을 계산하는 식과, 손실을 줄일 방향을 알려주는 식의 역할이 다르다.
10. 가중치를 반복해서 조절하는 방법: 경사하강법
10.1 미분에서 경사하강법으로
앞 절에서는 도함수를 이용해 임의의 가중치에서 손실함수의 기울기를 구하는 방법을 배웠다. 이제 현재 위치의 기울기를 계산할 수 있으므로, 그 반대 방향으로 조금 이동하여 손실을 줄일 수 있다.
한 번 이동한 뒤에는 새 위치에서 기울기를 구하고, 기울기의 음의 방향(함수의 값을 감소시키는 방향)으로 조금 움직인다. 그렇게 움직인 위치에서 같은 과정을 반복한다. 어느 순간 더 이상 감소가 되지 않고 한곳에 수렴한다면 그 점이 함수를 최소화시키는 값이라고 생각할 수 있다. 이 같은 절차를 이용하여 손실함수를 최소화하는 가중치를 찾아내는 방법을 경사하강법(Gradient Descent)이라고 한다.
10.2 경사하강법의 알고리즘
이 아이디어를 계산으로 옮기면 다음 갱신식을 얻는다. \(\eta\)(에타)는 이동 크기를 조절하는 양수이며, 학습률이라고 한다.
\[\boxed{w_{\text{새}}=w-\eta J'(w)}\]
현재 가중치에서 미분값에 학습률을 곱한 양을 뺀다. 미분값이 양수이면 가중치가 줄고, 음수이면 가중치가 늘어나므로 기울기의 반대 방향으로 이동한다.
경사하강법의 절차는 다음과 같다.
초기값을 정한다. 시작 가중치 \(w\), 학습률 \(\eta>0\), 반복 횟수를 정한다.
미분값을 계산한다. 현재 가중치 \(w\)를 도함수에 넣어 \(J'(w)\)를 구한다.
가중치를 갱신한다.\(w_{\text{새}}=w-\eta J'(w)\)를 계산하고, 현재 가중치를 이 값으로 바꾼다.
반복 여부를 확인한다. 정한 횟수만큼 갱신했으면 종료하고, 그렇지 않으면 2로 돌아간다.
이 절차를 앞의 손실함수 \(J(w)=(w-2)^2\)에 적용해 보자. 시작 가중치는 \(w=4\), 학습률은 \(\eta=0.1\)로 정한다. 도함수 \(J'(w)=2(w-2)\)에 현재 가중치를 넣으면 미분값은 4이므로, 첫 갱신은 다음과 같다.
\[w_{\text{새}}=4-0.1\times4=3.6\]
손실은 \(J(4)=4\)에서 \(J(3.6)=2.56\)으로 줄어든다. 다음 반복에서는 갱신된 가중치에서 미분값을 다시 계산한다. 새 미분값은 \(J'(3.6)=3.2\)이고, 다음 가중치는 \(3.6-0.1\times3.2=3.28\)이다.
갱신 횟수
현재 가중치 \(w\)
현재 미분값 \(J'(w)\)
현재 손실 \(J(w)\)
0
\(4\)
\(4\)
\(4\)
1
\(3.6\)
\(3.2\)
\(2.56\)
2
\(3.28\)
\(2.56\)
\(1.6384\)
3
\(3.024\)
\(2.048\)
\(1.0486\)
손실은 소수점 넷째 자리까지 표시했다.
10.3 학습률의 의미
위 계산에서는 학습률을 0.1로 정했다. 이 값을 바꾸면 한 번의 이동이 어떻게 달라질까?
학습률은 미분값에 곱하여 이동 크기를 조절하는 값이다. 현재 미분값이 4일 때, 학습률이 0.1이면 이동량은 \(-0.4\)이고, 0.5이면 \(-2\)다. 같은 미분값에서 학습률이 작으면 적게, 크면 많이 이동한다. 같은 학습률을 쓰더라도 위치에 따라 미분값이 달라지면 이동 크기도 달라진다.
크게 이동하면 최솟점에 더 빨리 가까워질 수 있지만, 너무 크게 이동하면 최솟점을 지나 손실이 다시 커질 수 있다. 아래에서 먼저 한 번 이동을 눌러 위 표의 값과 비교한 뒤, 학습률을 바꾸어 자동 반복을 실행한다. 학습률이나 시작 위치를 바꾸면 갱신 횟수와 경로가 초기화된다.
초록 화살표는 현재 기울기가 가리키는 손실 증가 방향이다. 파란 화살표는 학습률을 적용한 다음 갱신을 나타내며, 빈 점이 다음 위치다. 두 화살표를 비교하면 기울기의 반대 방향으로 가중치를 바꾸는 과정을 볼 수 있다.
학습률과 시작 위치를 정하고 경사하강법의 갱신을 한 번씩 또는 자동으로 실행하는 인터랙티브입니다.
학습률 0.1에서는 가중치가 2에, 손실이 0에 가까워진다. 이처럼 반복되는 값이 일정한 값에 가까워지는 것을 수렴이라고 한다.
같은 시작 위치 \(w=4\)에서 학습률에 따른 결과를 비교하면 다음과 같다.
학습률
관찰할 결과
\(0.1\)
가중치가 최솟점에 점차 가까워진다
\(1.0\)
\(w=4\)와 \(w=0\)을 오가며 손실이 줄지 않는다
\(1.1\)
최솟점의 양쪽을 오가며 점점 멀어진다
미분값은 현재 위치 주변의 변화를 알려준다. 학습률이 너무 커서 그 주변을 벗어나면 손실이 증가할 수 있다. 또한 일반적인 손실함수에서는 경사하강법이 전체에서 가장 낮은 손실에 도달한다고 보장할 수 없다. 미분값이 0인 점도 항상 최솟점인 것은 아니다.
11. 가중치가 여러 개라면: 편미분과 기울기 벡터
신경망에는 가중치가 여러 개이므로, 각각을 어느 방향으로 바꿀지 알아야 한다. 가중치가 두 개인 다음 손실함수를 가정하자.
\[J(w_1,w_2)=(w_1-2)^2+(w_2-1)^2\]
두 가중치를 바닥의 두 축에 놓고 손실을 높이로 표시하면 3차원 그래프가 된다. 이를 위에서 내려다보며 같은 손실을 갖는 점들을 연결한 것이 등고선이다. 두 그림의 주황색 선은 모두 \(J=4\)를 나타내며, 이 예제에서는 중심에 가까울수록 손실이 작다.
손실을 높이로 표시한 3차원 그래프
같은 손실을 갖는 점들을 연결한 등고선 그림
11.1 하나만 바꾸어 각 가중치의 영향 구하기
\(w_1\)을 어느 방향으로 바꾸어야 손실이 줄어드는지 판단하려면, 다른 가중치 \(w_2\)를 고정한 상태에서 \(w_1\)에 대한 변화율을 구해야 한다. 따라서 \(w_1\)으로 미분할 때 \(w_2\)는 상수로 취급한다.
이처럼 다른 변수를 상수로 취급하여 한 변수에 대해 미분하는 것이 편미분이다. \(w_1\)에 대한 편미분은 \(\frac{\partial J}{\partial w_1}\)로 쓴다. 두 가중치에 각각 적용하면 다음과 같다.