본문으로 건너뛰기

경사 하강법: 기울기를 따라 학습하기

📍 현재 위치: 3부 · 밑바닥부터의 학습 — 9장. 이전 장은 학습이란 손실을 최소화하여 데이터에 함수를 맞추는 것이라고 말했습니다. 이 장은 그 최소화를 실제로 수행하는 엔진입니다.

학습이란 무엇인가에서 우리는 학습을 하나의 탐색으로 다시 정의했습니다. 함수 계열을 하나 고르고, 후보가 데이터에 얼마나 나쁘게 맞는지를 손실(loss)로 재고, 그 손실을 작게 만드는 설정을 찾아 나서는 것이었죠. 그 마지막 단계, 즉 탐색이야말로 현대 머신러닝이 실제로 대부분의 시간을 쓰는 곳이며, 그 거의 전부가 단 하나의 발상을 사용합니다. 그 발상이 바로 경사 하강법(gradient descent)입니다. 손실이 어느 방향으로 커지는지를 재고, 그 반대 방향으로 한 걸음 작게 옮기고, 더는 내려갈 수 없을 때까지 이를 반복하는 것입니다.

이 장은 그 발상을 아무것도 없는 데서부터 세웁니다. "손실을 최소화한다"를 블랙박스로 취급하지 않겠습니다. 손실을 모델의 숫자들이 사는 공간 위의 표면으로 정의하고, "기울기"가 1차원에서 그리고 여러 차원에서 정확히 무엇을 뜻하는지 정의하고, 음의 기울기가 가장 가파른 내리막임을 증명하고, 갱신 규칙과 그것을 수렴시키는 걸음 크기의 정확한 범위를 유도한 뒤, 짝이 되는 코드에 담긴 두 개의 실제 모델 위에서 이를 손으로 직접 굴려 볼 것입니다. 이 장을 마치면 여러분은 사실상 어떤 신경망 시스템의 훈련 루프를 읽어도 그 안에서 자신을 마주 보는 경사 하강법을 알아볼 수 있게 됩니다.

쉽게 말하면

안개 낀 언덕 어딘가에 눈을 가린 채 서 있고, 계곡의 가장 낮은 지점에 다다르고 싶다고 상상해 보세요. 계곡은 보이지 않습니다. 하지만 발바닥으로, 땅이 어느 쪽으로 기울어져 있는지는 느낄 수 있습니다. 그래서 곧장 내리막 쪽으로 한 걸음 작게 옮기고, 다시 기울기를 느끼고, 또 걸음을 옮기며 계속 나아갑니다. 걸음이 너무 크면 바닥을 지나쳐 앞뒤로 비틀거리고, 너무 작으면 기어가는 꼴이 됩니다. 경사 하강법이 바로 이것입니다. 다만 "언덕"은 모델의 숫자들에 대해 그려진 손실이고, "기울기를 느끼는 일"은 도함수를 계산하는 일입니다.

이 장에서 다루는 내용

  • 손실 표면 — 모델의 파라미터가 좌표가 되고 손실이 높이가 되어, 학습이 "내리막을 걷는 일"로 바뀌는 과정.
  • 1차원에서의 도함수 — 기울기, 그 부호, 갱신 규칙, 그리고 어떤 학습률이 통하는지를 정확히 알려 주는 이차식 위에서의 완전한 수렴 분석.
  • 여러 차원에서의 기울기 — 편도함수, 기울기 벡터, 그리고 음의 기울기가 가장 가파른 내리막 방향이라는 증명(방향 도함수와 코시–슈바르츠 부등식(Cauchy–Schwarz inequality)).
  • 완전히 풀어낸 두 예제 — 최소제곱으로 직선 맞추기와 교차 엔트로피로 단일 뉴런 분류기 훈련하기. 각각을 examples/logic/learning.py의 커밋된 코드에 한 줄 한 줄 대응시키고, 실제 실행에서 나온 진짜 숫자로 보입니다.
  • 배치, 확률적, 미니배치 경사 하강법, 그리고 정확한 걸음과 값싼 걸음 사이의 맞거래.
  • 실제 지형에서의 학습률 — 조건수, 지그재그로 튀는 협곡, 모멘텀, 그리고 걸음 크기 스케줄.
  • 아직 풀리지 않은 부분 — 표면이 볼록하지 않게 되는 순간, 국소적 기울기가 왜 전역 최솟값을 전혀 보장하지 못하는지.

손실 표면: 내리막으로서의 학습

숫자들의 목록으로 거동이 결정되는 모델을 하나 고정합시다. 그 숫자들을 하나의 파라미터 벡터(parameter vector) θ=(θ1,θ2,,θd)\theta = (\theta_1, \theta_2, \ldots, \theta_d)로 모읍니다. 직선 y=wx+by = wx + b의 경우 파라미터는 θ=(w,b)\theta = (w, b)이므로 d=2d = 2입니다. 다음 장의 자그마한 신경망에는 수십 개가 있습니다. 현대의 언어 모델에는 수천억 개가 있습니다. 어느 경우든, 훈련이란 θ\theta 안의 숫자들을 고르는 일입니다.

데이터와 손실은 그 선택을 하나의 지형으로 바꿉니다. 방법을 되새겨 봅시다. θ\theta의 각 선택마다 모델은 훈련 집합에 대해 예측을 내놓고, 손실 함수(loss function) L(θ)L(\theta)는 그 예측들이 얼마나 틀렸는지를 음이 아닌 단 하나의 숫자로 채점하며, 0이 완벽을 뜻합니다. LL은 파라미터 공간의 모든 점 θ\theta에 하나의 높이를 배정하므로, 하나의 표면을 정의합니다. 파라미터가 둘이면 그것을 말 그대로 그려 볼 수 있습니다. (w,b)(w, b) 평면 위에 앉은 언덕과 계곡의 지형이며, 각 점에서의 높이가 바로 그곳의 손실입니다. 훈련이란 그 표면의 가장 낮은 지점, 즉 LL최솟값(minimum)을 찾는 탐색입니다.

이 그림은 단일 뉴런에 대한 표준적인 그림으로, 파라미터의 공간을 가중치 공간(weight space)이라 부르고 그 공간의 각 점에서 네트워크가 계산하는 함수를 그려 보입니다 [1]. 이 그림을 붙들고 있을 가치가 있는 것은, 그것이 알고리즘 전체를 눈에 보이게 만들어 주기 때문입니다. 우리는 기호를 그 자체를 위해 다루고 있는 것이 아닙니다. 느낄 수는 있지만 볼 수는 없는 계곡의 바닥으로 걸어 내려가려 하고 있는 것입니다.

우리가 거기로 걸어갈 수 있는지는 두 가지 물음이 결정합니다. 첫째, 지금 선 자리에서 어느 쪽이 내리막인가? 둘째, 얼마나 큰 걸음을 감히 내디뎌도 되는가? 도함수가 첫째에 답합니다. 짧은 해석학 한 조각이 둘째에 답합니다. 우리는 이것들을 순서대로, 먼저 1차원에서 다룹니다. 여러 차원의 모든 것은 1차원의 경우를 한 좌표씩 쌓아 올려 만들어지기 때문입니다.

1차원: 도함수가 곧 기울기

잠시 모델에 파라미터가 단 하나 ww뿐이어서, 손실 L(w)L(w)가 실변수 하나짜리 보통 함수, 즉 곡선이라고 합시다. 도함수(derivative) L(w)L'(w)dLdw\frac{dL}{dw}라고도 쓰며, 가로 변화가 0으로 줄어들 때의 세로 변화 대 가로 변화의 극한으로 정의됩니다:

L(w)  =  limh0L(w+h)L(w)h.L'(w) \;=\; \lim_{h \to 0} \frac{L(w + h) - L(w)}{h}.

극한을 취하기 전의 분수를 "ww를 작은 양 hh만큼 살짝 밀면, LL이 그 밀기의 단위당 얼마나 변하는가"로 읽으십시오. 극한은 그 밀기를 무한히 작게 만들므로, L(w)L'(w)는 점 ww에서 곡선의 정확한 기울기, 즉 ww가 커질 때 손실이 변하는 비율입니다. 걸음을 내딛는 데 필요한 것은 그 부호뿐입니다.

  • L(w)>0L'(w) \gt 0이면 ww가 커질 때 손실이 올라가고 있으므로, 손실을 줄이려면 ww음의 방향으로, 즉 줄이는 쪽으로 움직여야 합니다.
  • L(w)<0L'(w) \lt 0이면 ww가 커질 때 손실이 내려가고 있으므로, 손실을 줄이려면 ww양의 방향으로, 즉 키우는 쪽으로 움직여야 합니다.
  • L(w)=0L'(w) = 0이면 기울기가 평평하여, 적어도 국소적으로는 더 낮게 내디딜 곳이 없습니다. 이것이 정류점(stationary point)입니다.

평평하지 않은 두 경우 모두 하나의 규칙으로 담깁니다. 도함수의 부호와 반대 방향으로 걸음을 내디디는 것입니다. 그 걸음을 작은 양수 η\eta(그리스 문자 에타)로 크기 조절하는데, 이것이 얼마나 멀리 움직일지를 정하는 학습률(learning rate)입니다:

w    wηL(w).w \;\leftarrow\; w - \eta\, L'(w).

화살표는 "옛 ww를 오른쪽 값으로 대체하라"는 뜻입니다. L>0L' \gt 0일 때는 양수를 빼므로 ww가 내려가고, L<0L' \lt 0일 때는 음수를 빼므로 ww가 올라갑니다. 걸음이 너무 크지만 않다면, 어느 쪽이든 손실은 줄어듭니다. 이 절의 나머지는 그 단서에 관한 것입니다. "너무 크지 않다"에는 결국 정확한 의미가 있기 때문입니다.

정확히 풀어낸 이차식 그릇

걸음 크기가 어떻게 거동하는지 정확히 보기 위해, 가장 단순하면서도 흥미로운 손실, 즉 최솟값이 원점에 있는 위로 열린 포물선을 택합니다:

L(w)  =  12aw2,a>0.L(w) \;=\; \tfrac{1}{2}\, a\, w^2, \qquad a \gt 0.

그 도함수는 L(w)=awL'(w) = a w입니다(앞의 12\tfrac12은 바로 이것이 깔끔하게 나오도록 붙여 둔 것입니다). 최솟값은 L=0L' = 0w=0w = 0에 있습니다. 이제 경사 하강법이 무엇을 하는지 지켜봅시다. tt번 걸은 뒤의 값을 wtw_t라 쓰고 L(wt)=awtL'(w_t) = a w_t를 갱신 규칙에 대입하면:

wt+1  =  wtηawt  =  (1ηa)wt.w_{t+1} \;=\; w_t - \eta\, a\, w_t \;=\; (1 - \eta a)\, w_t.

매 걸음이 현재 값에 같은 상수 r=1ηar = 1 - \eta a를 곱합니다. 이것은 등비수열이며, 닫힌 형태로 풀 수 있습니다. w0w_0에서 출발하면,

wt  =  (1ηa)tw0.w_t \;=\; (1 - \eta a)^t\, w_0.

이제 이 그릇 위에서 알고리즘의 거동 전체가 단 하나의 인자 r=1ηar = 1 - \eta a에 담겨 보입니다. 반복값은 거듭제곱 rtr^t가 0으로 줄어들 때에만, 즉 rr의 크기가 1보다 작은 1ηa<1\lvert 1 - \eta a\rvert \lt 1일 때에만 최솟값 w=0w = 0으로 갑니다. 이 부등식을 η\eta에 대해 풀면:

1  <  1ηa  <  10  <  ηa  <  20  <  η  <  2a.-1 \;\lt\; 1 - \eta a \;\lt\; 1 \quad\Longleftrightarrow\quad 0 \;\lt\; \eta a \;\lt\; 2 \quad\Longleftrightarrow\quad 0 \;\lt\; \eta \;\lt\; \frac{2}{a}.

이것이 정확한 규칙입니다. 단단한 천장 η=2/a\eta = 2/a가 있어서, 그 값에서 또는 그 이상으로 걸으면 방법은 결코 자리를 잡지 못합니다. 0과 그 천장 사이에서는 rr의 부호가 안전 구역을 질적으로 다른 두 영역으로 가르며, 특별한 값 η=1/a\eta = 1/a는 정확히 그 둘 사이, r=0r = 0이 되어 한 걸음에 최솟값에 내려앉는 자리에 있습니다. 아래 네 경우는 우리가 지어낸 이야기가 아닙니다. 점화식 wt+1=(1ηa)wtw_{t+1} = (1-\eta a) w_ta=1a = 1, w0=1w_0 = 1로 두고 갱신을 실제로 돌려 문자 그대로 나온 결과입니다:

학습률 η\eta인자 r=1ηar = 1 - \eta aw0,w1,w2,w3,w4,w5,w6w_0, w_1, w_2, w_3, w_4, w_5, w_6거동
0.10.1 (즉 0<η<1/a0 \lt \eta \lt 1/a)+0.9+0.91.000,0.900,0.810,0.729,0.656,0.590,0.5311.000,\, 0.900,\, 0.810,\, 0.729,\, 0.656,\, 0.590,\, 0.53100으로 단조 감소
1.01.0 (즉 η=1/a\eta = 1/a)0.00.01.000,0.000,0.000,0.000,0.000,0.000,0.0001.000,\, 0.000,\, 0.000,\, 0.000,\, 0.000,\, 0.000,\, 0.000한 걸음에 정확한 최솟값 도달
1.51.5 (즉 1/a<η<2/a1/a \lt \eta \lt 2/a)0.5-0.51.000,0.500,0.250,0.125,0.063,0.031,0.0161.000,\, {-0.500},\, 0.250,\, {-0.125},\, 0.063,\, {-0.031},\, 0.016지나쳐 진동하지만 그래도 수렴
2.12.1 (즉 η>2/a\eta \gt 2/a)1.1-1.11.000,1.100,1.210,1.331,1.464,1.610,1.7721.000,\, {-1.100},\, 1.210,\, {-1.331},\, 1.464,\, {-1.610},\, 1.772진동하며 발산

이 교훈은 이 장난감 그릇을 훨씬 넘어 일반화됩니다. 너무 작은 학습률은 시간을 낭비하고(맨 윗줄은 기어갑니다), 잘 고른 학습률은 빠르게 내려앉으며(둘째, 셋째 줄), 너무 큰 학습률은 단지 느린 것이 아니라 파국적이어서, 파라미터를 매 걸음 최솟값에서 더 멀리 내던져 결국 무한대로 넘쳐 버립니다(맨 아랫줄). 수 aa는 그릇의 곡률(curvature), 즉 그릇이 얼마나 급하게 휘는지입니다. 더 급한 그릇(더 큰 aa)은 더 작은 걸음을 요구하는데, 천장 2/a2/a가 더 낮기 때문입니다. 안전한 걸음 크기가 곡률로 정해진다는 이 단 하나의 사실이, 우리가 실제 네트워크에서 마주칠 학습률의 온갖 현실적 골칫거리의 씨앗입니다.

여러 차원: 기울기와 가장 가파른 내리막

실제 모델에는 파라미터가 많으므로, 손실은 곡선이 아니라 고차원 공간 위의 표면입니다. 그 상황으로 기울기를 일반화한 것이 기울기(gradient)이며, 이는 한 좌표씩 취한 1차원 기울기들로 지어집니다.

LLjj번째 파라미터에 대해 취한 편도함수(partial derivative)는 Lθj\frac{\partial L}{\partial \theta_j}라 쓰며, 다른 모든 파라미터를 현재 값에 얼려 두고 오직 θj\theta_j만 흔들었을 때 얻는 보통의 도함수일 뿐입니다. "오직 θj\theta_j만 밀고 나머지는 고정하면 손실이 얼마나 빨리 변하는가"에 답합니다. 이런 것이 파라미터마다 하나씩 총 dd개 있고, 이를 하나의 벡터로 쌓으면 기울기가 됩니다:

θL  =  (Lθ1,  Lθ2,  ,  Lθd).\nabla_\theta L \;=\; \left( \frac{\partial L}{\partial \theta_1},\; \frac{\partial L}{\partial \theta_2},\; \ldots,\; \frac{\partial L}{\partial \theta_d} \right).

거꾸로 선 삼각형 \nabla은 "델(del)" 또는 "그래드(grad)"라고 읽습니다. 기울기는 θ\theta와 같은 공간에 사는 벡터입니다. 파라미터마다 성분 하나를 가지고, 그것을 계산한 점 θ\theta에 자리하며, 파라미터 공간을 뚫고 어떤 방향을 가리킵니다. 갱신 규칙은 도함수 대신 기울기를 넣은 1차원 규칙을 모든 좌표에 한꺼번에 적용한 것입니다:

  θ    θηθL  \boxed{\;\theta \;\leftarrow\; \theta - \eta\, \nabla_\theta L\;}

이는 이렇게 말합니다. 모든 파라미터를 조금씩, 각각 자신이 손실에 얼마나 책임이 있는지에 비례해서, 그리고 다 함께 LL을 가장 빠르게 줄이는 방향으로 움직여라. 이 방향이 가장 빠른 내리막이라는 주장은 자명하지 않으며, 대부분의 교재는 그냥 단언합니다 [1]. 우리는 이를 증명하겠습니다. 증명이 짧기도 하거니와, 그것이 이 알고리즘을 무언가 애매한 이름이 아니라 경사 하강이라 부르는 이유이기 때문입니다.

음의 기울기가 왜 가장 가파른 내리막인가

한 점 θ\theta에 서서 어떤 방향으로 아주 짧은 거리를 내딛는 것을 생각합시다. 방향을 단위 벡터(unit vector) u\mathbf{u}로 나타내는데, 이는 u=1\lVert \mathbf{u} \rVert = 1을 뜻합니다(이중 막대 \lVert\cdot\rVert은 벡터의 길이(length), 즉 노름(norm)을 나타내며, 각 성분을 제곱해 더한 값의 제곱근으로 계산하므로, 단위 벡터란 길이가 정확히 1인 벡터입니다). 이렇게 해야 "방향"과 "거리"가 분리된 채 유지됩니다. u\mathbf{u}를 따라 움직일 때 손실은 얼마나 빨리 변할까요? 그 비율이 방향 도함수(directional derivative)이며, 다변수 미적분은 이를 기울기와 방향의 내적으로 줍니다:

DuL  =  θLu  =  j=1dLθjuj.D_{\mathbf{u}} L \;=\; \nabla_\theta L \cdot \mathbf{u} \;=\; \sum_{j=1}^{d} \frac{\partial L}{\partial \theta_j}\, u_j.

(이것 자체가 연쇄 법칙입니다. u\mathbf{u}를 따라 움직이면 각 θj\theta_j가 비율 uju_j로 변하고, 그 각각이 LL을 비율 L/θj\partial L / \partial \theta_j로 변화시키며, 총합이 그 합입니다.) 우리가 원하는 것은 가장 가파른 내리막 방향, 즉 DuLD_{\mathbf{u}} L을 가능한 한 으로 만드는 단위 벡터 u\mathbf{u}입니다. 여기서 코시–슈바르츠 부등식(Cauchy–Schwarz inequality)이 일을 합니다. 이 부등식은 임의의 두 벡터에 대해 다음이 성립한다고 말합니다,

θLu    θL  u  =  θL,\lvert \nabla_\theta L \cdot \mathbf{u} \rvert \;\le\; \lVert \nabla_\theta L \rVert \; \lVert \mathbf{u} \rVert \;=\; \lVert \nabla_\theta L \rVert,

마지막에 u=1\lVert \mathbf{u} \rVert = 1을 썼습니다. 따라서 방향 도함수는 다음 구간에 갇힙니다,

θL    DuL    θL.-\lVert \nabla_\theta L \rVert \;\le\; D_{\mathbf{u}} L \;\le\; \lVert \nabla_\theta L \rVert.

이것이 취할 수 있는 가장 음의 값은 왼쪽 끝 θL-\lVert \nabla_\theta L \rVert입니다. 코시–슈바르츠는 u\mathbf{u}θL\nabla_\theta L과 평행할 때 정확히 등호를 이루므로, 음의 끝에 닿으려면 u\mathbf{u}가 기울기와 정확히 반대 방향을 가리켜야 합니다:

u  =  θLθL.\mathbf{u}^{\star} \;=\; -\frac{\nabla_\theta L}{\lVert \nabla_\theta L \rVert}.

그러므로 내딛을 수 있는 모든 방향 가운데 손실을 가장 빠르게 줄이는 방향은 기울기를 정면으로 거스르는 방향입니다. 그것이 바로 갱신 규칙 θθηθL\theta \leftarrow \theta - \eta \nabla_\theta L이 움직이는 방향입니다. 기울기가 중심 자리를 얻는 것은 관례가 아니라 이 부등식 덕분입니다. 기울기는 유일하게 가장 가파른 방향이고, 그 음의 방향은 유일하게 가장 가파른 내리막입니다.

한 가지 기하학적 그림이 이를 못 박습니다. 높이가 고정된 점들의 집합은 손실의 등고선(contour line, 또는 등고면)을 이루며, 지형도의 등치선과 같습니다. 등고선을 따라 움직이면 손실이 일정하게 유지되므로 그 방향의 방향 도함수는 0이고, 따라서 DuL=Lu=0D_{\mathbf{u}} L = \nabla L \cdot \mathbf{u} = 0에 의해 기울기는 모든 등고선에 수직입니다. 그러므로 가장 가파른 내리막은 언제나 등고선을 직각으로 가로질러 나아가며, 이는 물이 언덕을 따라 옆으로 흐르지 않고 곧장 아래로 흐르는 것과 같습니다.

손실 표면을 하나의 지형으로 그린 그림: 등고선, 그에 수직인 기울기, 그리고 최솟값을 향해 곧장 내리막으로 나아가는 음의 기울기 걸음. 두 파라미터짜리 가중치 공간 위에 지형으로 그린 손실 L(θ)L(\theta). 현재 점에서 기울기 L\nabla L은 오르막을 가리키며 일정 손실의 등고선에 수직이고, 갱신은 ηL-\eta\nabla L을 따라 등고선을 곧장 가로질러 분지를 향해 걸음을 내딛습니다. 걸음의 길이는 η\eta와 가파름 L\lVert\nabla L\rVert이 정합니다.

저자가 AI의 도움을 받아 직접 제작한 원본 도해.

풀이 예제 1: 최소제곱으로 직선 맞추기

examples/logic/learning.py의 선형 회귀 맞춤기, 즉 fit_line 함수는 가장 순수한 형태의 경사 하강법이며, 그 두 개의 파라미터 덕분에 표면 전체를 지켜볼 수 있습니다. 이 함수는 점 (xi,yi)(x_i, y_i)들에 y=wx+by = wx + b를 맞추되, 평균제곱오차(mean squared error)를 최소화합니다. 이는 그 함수 안 mse에 정의된 바로 그 손실입니다:

L(w,b)  =  1ni=1n(wxi+byi)2.L(w, b) \;=\; \frac{1}{n} \sum_{i=1}^{n} \big(w x_i + b - y_i\big)^2.

모델이 파라미터에 대해 선형이고 오차가 제곱되어 있으므로, 이 표면은 가장 낮은 지점이 단 하나뿐인 매끄러운 위로 열린 그릇(포물면)이며, 우리가 1차원에서 정확히 풀었던 그 상황이 이제 2차원으로 온 것입니다. 이를 내려가려면 두 편도함수가 필요합니다. 잔차(residual) ri=wxi+byir_i = w x_i + b - y_i, 즉 예제 ii에서 예측과 참값 사이의 부호 있는 간격을 도입합니다. 그러면 L=1niri2L = \frac{1}{n}\sum_i r_i^2이고, 연쇄 법칙이 한 단계씩 다음을 줍니다,

Lw  =  1ni=1n(ri2)w  =  1ni=1n2ririw  =  1ni=1n2(wxi+byi)xi,\frac{\partial L}{\partial w} \;=\; \frac{1}{n}\sum_{i=1}^{n} \frac{\partial (r_i^2)}{\partial w} \;=\; \frac{1}{n}\sum_{i=1}^{n} 2 r_i \frac{\partial r_i}{\partial w} \;=\; \frac{1}{n}\sum_{i=1}^{n} 2\big(w x_i + b - y_i\big)\, x_i,

여기서 ri/w=xi\partial r_i / \partial w = x_i인 것은 rir_iww에 의존하는 것이 오직 wxiw x_i 항을 통해서이기 때문입니다. 똑같이, ri/b=1\partial r_i / \partial b = 1이므로,

Lb  =  1ni=1n2(wxi+byi).\frac{\partial L}{\partial b} \;=\; \frac{1}{n}\sum_{i=1}^{n} 2\big(w x_i + b - y_i\big).

이 두 공식이 곧 코드입니다. fit_line의 훈련 루프를 한 줄씩 읽으면:

for _ in range(epochs):
dw = sum(2 * (w * x + b - y) * x for x, y in zip(xs, ys)) / n
db = sum(2 * (w * x + b - y) for x, y in zip(xs, ys)) / n
w -= lr * dw
b -= lr * db

dwL/w\partial L / \partial w 그대로이고, dbL/b\partial L / \partial b이며, 마지막 두 줄은 갱신 규칙 θθηθL\theta \leftarrow \theta - \eta \nabla_\theta L을 두 좌표에 나누어 적용한 것으로, lrη\eta의 역할을 합니다. 파일에 담긴 다섯 점 위에서 η=0.02\eta = 0.0220002000번 걸으며 실행하면, 손실이 44.18244.182에서 0.02140.0214로 내려가고 다음 직선을 복원합니다,

y  =  1.990x+0.050,y \;=\; 1.990\, x + 0.050,

이는 그 함수가 출력하는 값 그대로입니다. 데이터는 y=2xy = 2x 근처에서 생성되었고, 경사 하강법은 제곱오차 그릇 위에서 그저 되풀이해 내리막을 굴러 그것을 찾아냈습니다.

풀이 예제 2: 교차 엔트로피로 훈련하는 단일 뉴런 분류기

위의 직선은 하나의 수를 회귀했습니다. 더 중대한 예제, 그리고 단일 뉴런을 다루는 고전적 예제 [1]분류입니다. 확률을 출력하고 교차 엔트로피(cross-entropy)로 훈련되는 단일 뉴런이죠. 이것이 같은 파일의 fit_logistic 함수이며, 수학이 우리에게 작은 소거의 기적으로 보답하는 곳입니다.

뉴런은 특징 벡터 x\mathbf{x}를 받아 가중합 z=wx+b=jwjxj+bz = \mathbf{w}\cdot\mathbf{x} + b = \sum_j w_j x_j + b를 만들고, 이를 시그모이드(sigmoid)를 통해 0과 1 사이의 수로 짓눌러 레이블이 11일 확률로 읽습니다:

p  =  σ(z)  =  11+ez.p \;=\; \sigma(z) \;=\; \frac{1}{1 + e^{-z}}.

여기서 e2.718e \approx 2.718은 오일러 수이고 eze^{-z}지수 함수(exponential function)입니다(eez-z 제곱한 것). eze^{-z}은 언제나 양수이므로 분모 1+ez1 + e^{-z}은 1을 넘고, 따라서 분수는 0011 사이에 엄격히 머물러 pp를 확률로 읽을 수 있게 합니다.

참 레이블 y{0,1}y \in \{0, 1\}에 대해(기호 \in은 "의 원소이다"로 읽으므로, yy00 또는 11입니다), 한 예제에 대한 이진 교차 엔트로피(binary cross-entropy) 손실은 다음과 같습니다,

(w,b)  =  [ylnp+(1y)ln(1p)].\ell(\mathbf{w}, b) \;=\; -\big[\, y \ln p + (1 - y)\ln(1 - p)\,\big].

여기서 ln\ln자연로그(natural logarithm, 밑이 ee인 로그)로, 지수 함수의 표준적인 역함수입니다. 이 손실을 확신에 차 틀린 것에 대한 벌점으로 읽으십시오. y=1y = 1이면 lnp-\ln p로 줄어드는데, 이는 p=1p = 1에서 0이고 p0p \to 0일 때 폭발합니다. y=0y = 0이면 ln(1p)-\ln(1 - p)로 줄어들며, 대칭입니다. 각 항은 뉴런이 예측한 분포 아래에서 관측된 결과의 정보량(information content)이며, 그 합은 모든 예제에서 p=yp = y일 때 정확히 최소가 되어 0이라는 바닥에 닿습니다 [1]. 우리는 가중치에 대한 \ell의 기울기를 원합니다. 그것은 세 고리짜리 사슬을 거쳐 옵니다. \ellpp에 의존하고, ppzz에 의존하며, zzwjw_j에 의존합니다.

첫째 고리, 예측을 거친 손실. \ellpp에 대해 미분하면:

p  =  [yp1y1p]  =  y(1p)+(1y)pp(1p)  =  pyp(1p).\frac{\partial \ell}{\partial p} \;=\; -\left[\frac{y}{p} - \frac{1 - y}{1 - p}\right] \;=\; \frac{-y(1-p) + (1-y)p}{p(1-p)} \;=\; \frac{p - y}{p(1 - p)}.

둘째 고리, 사전 활성화를 거친 예측. 시그모이드의 도함수가 필요한데, 이는 유명하리만치 깔끔한 형태를 가집니다. σ(z)=(1+ez)1\sigma(z) = (1 + e^{-z})^{-1}이라 쓰고 거듭제곱과 지수에 연쇄 법칙을 쓰면,

σ(z)  =  (1+ez)2(ez)  =  ez(1+ez)2  =  11+ezez1+ez.\sigma'(z) \;=\; -(1 + e^{-z})^{-2}\cdot(-e^{-z}) \;=\; \frac{e^{-z}}{(1 + e^{-z})^{2}} \;=\; \frac{1}{1+e^{-z}}\cdot\frac{e^{-z}}{1+e^{-z}}.

첫째 인자는 σ(z)\sigma(z)입니다. 둘째 인자는 1σ(z)1 - \sigma(z)인데, ez1+ez=111+ez\frac{e^{-z}}{1+e^{-z}} = 1 - \frac{1}{1+e^{-z}}이기 때문입니다. 그러므로 시그모이드는 다음 항등식을 만족합니다,

σ(z)  =  σ(z)(1σ(z))  =  p(1p).\sigma'(z) \;=\; \sigma(z)\big(1 - \sigma(z)\big) \;=\; p(1 - p).

셋째 고리, 가중치를 거친 사전 활성화. z=jwjxj+bz = \sum_j w_j x_j + b이므로, wjw_j를 밀면 zz가 비율 xjx_j로 움직이고, bb를 밀면 zz가 비율 11로 움직입니다:

zwj  =  xj,zb  =  1.\frac{\partial z}{\partial w_j} \;=\; x_j, \qquad \frac{\partial z}{\partial b} \;=\; 1.

이제 세 고리를 곱합니다. p(1p)p(1-p) 항들이 만나 서로를 소멸시키는 것을 지켜보십시오:

z  =  ppz  =  pyp(1p)p(1p)  =  py.\frac{\partial \ell}{\partial z} \;=\; \frac{\partial \ell}{\partial p}\cdot\frac{\partial p}{\partial z} \;=\; \frac{p - y}{p(1 - p)}\cdot p(1 - p) \;=\; p - y.

그 소거가 곧 기적이며, 우연이 아닙니다. 교차 엔트로피 손실은 시그모이드와 짝을 이루도록 골라진 것이어서, 손실에서 나온 껄끄러운 p(1p)p(1-p) 분모가 시그모이드 자신의 도함수에서 나온 p(1p)p(1-p)에 의해 소거되고, 깔끔하고 튼튼한 오차 신호(error signal) e=pye = p - y만 남습니다. 만약 대신 시그모이드에 제곱오차를 썼다면 p(1p)p(1-p)가 살아남아, 뉴런이 00이나 11 근처에서 포화될 때마다 0을 향해 줄어들어, 확신에 찬 실수를 가장 바로잡아야 할 바로 그때 학습을 멈춰 세웠을 것입니다. 교차 엔트로피는 그것을 피하도록 설계되었습니다. 사슬을 파라미터까지 마치면:

  wj  =  (py)xj,b  =  (py).  \boxed{\;\frac{\partial \ell}{\partial w_j} \;=\; (p - y)\, x_j, \qquad \frac{\partial \ell}{\partial b} \;=\; (p - y).\;}

이것이 표준적인 결과, 곧 기울기 gj=(ty)xjg_j = -(t - y)x_j입니다. 부호가 뒤집힌 것은 고전적 유도가 오차를 tyt - y(목표에서 출력을 뺀 것)로 쓰고 우리는 pyp - y(출력에서 목표를 뺀 것)로 쓰기 때문이며, 둘은 그다음 어느 방향으로 걸음을 내딛느냐에서만 다릅니다 [1]. 그리고 이것이 정확히 코드입니다. fit_logistic의 안쪽 루프는 다음과 같습니다:

for xi, yi in zip(X, y):
p = sigmoid(sum(wj * xj for wj, xj in zip(w, xi)) + b)
err = p - yi
for j in range(dim):
gw[j] += err * xi[j]
gb += err
w = [wj - lr * gj / n for wj, gj in zip(w, gw)]
b -= lr * gb / n

errpyp - y이고, gw[j] += err * xi[j]i(piyi)xij\sum_i (p_i - y_i) x_{ij}을 누적하는데 이것이 배치 기울기 L/wj\partial L / \partial w_j이며, 마지막 두 줄은 평균 낸 갱신 θθηθL\theta \leftarrow \theta - \eta \nabla_\theta L입니다. 숨겨진 미적분은 없습니다. 이 루프가 상자 안의 공식입니다.

관통 예제 위에서, 손으로 한 걸음

learning.py의 분류기는 이 시리즈의 관통 학계 세계에 뿌리를 둡니다. 그 두 특징은 advises 관계에서 곧이곧대로 읽어 낸 것입니다. 각 사람마다, 몇 명을 지도하는지(진출차수)와 몇 명에게 지도받는지(진입차수)입니다. 교수는 11, 학생은 00으로 레이블이 붙습니다. 코드가 만드는 실제 특징 표는 다음과 같습니다:

사람진출차수 x1x_1진입차수 x2x_2레이블 yy
alice1100교수 (1)(1)
bob2211교수 (1)(1)
carol1111학생 (0)(0)
dave0011학생 (0)(0)
erin0011학생 (0)(0)

코드가 그러듯이 w=(0,0)\mathbf{w} = (0, 0), b=0b = 0에서 출발합니다. 그러면 모든 z=0z = 0이므로 모든 예측이 p=σ(0)=0.5p = \sigma(0) = 0.5입니다. 훈련되지 않은 뉴런은 모두에 대해 최대로 확신이 없습니다. 각 예제에서의 오차는 e=py=0.5ye = p - y = 0.5 - y이며, 두 교수에 대해서는 0.5-0.5, 세 학생에 대해서는 +0.5+0.5입니다. 배치 전체에 걸쳐 좌표별로 기울기를 누적하면:

Lw1=ieixi1=(0.5)(1)+(0.5)(2)+(0.5)(1)+(0.5)(0)+(0.5)(0)=1.0,\frac{\partial L}{\partial w_1} = \sum_i e_i x_{i1} = (-0.5)(1) + (-0.5)(2) + (0.5)(1) + (0.5)(0) + (0.5)(0) = -1.0, Lw2=ieixi2=(0.5)(0)+(0.5)(1)+(0.5)(1)+(0.5)(1)+(0.5)(1)=+1.0,\frac{\partial L}{\partial w_2} = \sum_i e_i x_{i2} = (-0.5)(0) + (-0.5)(1) + (0.5)(1) + (0.5)(1) + (0.5)(1) = +1.0, Lb=iei=0.50.5+0.5+0.5+0.5=+0.5.\frac{\partial L}{\partial b} = \sum_i e_i = -0.5 - 0.5 + 0.5 + 0.5 + 0.5 = +0.5.

n=5n = 5개 예제에 대해 평균 내면 가중치의 기울기는 (0.2,0.2)(-0.2,\, 0.2), 편향의 기울기는 0.10.1입니다. 학습률 η=0.3\eta = 0.3으로 한 걸음 내디디면 파라미터가 다음으로 옮겨 갑니다,

w(0,0)0.3(0.2,0.2)=(0.06,0.06),b00.3(0.1)=0.03.\mathbf{w} \leftarrow (0,0) - 0.3\,(-0.2,\, 0.2) = (0.06,\, -0.06), \qquad b \leftarrow 0 - 0.3\,(0.1) = -0.03.

그 첫 걸음의 방향을 읽으면 이미 말이 됩니다. 진출차수 가중치 w1w_1올라갔고(여러 사람을 지도하는 것은 교수라는 증거), 진입차수 가중치 w2w_2내려갔습니다(지도받는 것은 학생이라는 증거). 경사 하강법은 오직 오차의 부호만으로, 단 한 걸음에서 올바른 정성적 규칙을 뽑아냈습니다. 루프가 30003000 에포크를 돌게 두면 파라미터는 w(7.75,8.59)\mathbf{w} \approx (7.75,\, -8.59), b2.76b \approx -2.76, 교차 엔트로피 손실 0.0100.010에 자리를 잡고 다섯 사람 모두를 올바르게 분류하는데, 이는 파일이 출력하는 그대로입니다. 어느 특징도 단독으로는 교수와 학생을 가르지 못하므로, 뉴런은 둘 모두에 기대야 했고 경사 하강법이 그 조합을 찾아냈습니다.

배치, 확률적, 미니배치 경사 하강법

위의 두 예제 모두 걸음을 단 한 번 내딛기 전에 전체 훈련 집합에 대해 기울기를 합했습니다. 그것이 배치 경사 하강법(batch gradient descent, "배치 학습"이라고도 합니다)입니다. 매 걸음이 참 손실의 정확한 기울기를 쓰므로 진정 가장 가파른 방향으로 움직이지만, 단 한 번 움직이는 데도 모든 예제를 건드려야 합니다 [1]. 다섯 사람에게는 아무것도 아닙니다. 오십억 개의 웹 페이지에는 파멸적입니다.

정반대 극단은 확률적 경사 하강법(stochastic gradient descent, SGD, "온라인 학습"이라고도 합니다)입니다. 각 개별 예제 뒤에 파라미터를 갱신하며, 그 한 예제의 기울기를 참 기울기의 값싼 잡음 섞인 추정치로 씁니다 [1]. 분류기에서 이것은 말 그대로 상자 안의 예제별 규칙 wjwjη(py)xjw_j \leftarrow w_j - \eta (p - y) x_j을 한 점씩 적용하는 것입니다. 각 걸음이 nn배 값싸고, 데이터를 한 번 훑는 것(에포크(epoch))이 한 걸음 대신 nn번의 걸음이 됩니다. 그 대가는 잡음입니다. 어떤 한 예제든 파라미터를 평균이 아니라 자기에게 도움이 되는 방향으로 당기므로, 최솟값으로 가는 길이 미끄러지듯 나아가는 대신 덜컹거립니다. 놀랍게도, 그 잡음은 흔히 이점입니다. 정확하고 결정론적인 걸음을 가둘 얕은 웅덩이와 좁은 능선에서 SGD가 덜컹거리며 빠져나오게 해 주고, 가벼운 정칙화 역할을 합니다. 이 발상은 1951년 로빈스–먼로(Robbins–Monro)의 확률 근사법으로 거슬러 올라가며, 이 방법은 또한 덜컹거림이 참 최솟값 위에 내려앉으려면(영원히 그 둘레를 튀지 않으려면) η\eta를 스케줄에 따라 줄여 잡음을 시간에 걸쳐 식혀야 한다고 알려 줍니다 [2].

실제 시스템은 두 극단 사이, 미니배치 경사 하강법(mini-batch gradient descent)에 삽니다. 작은 한 줌의 예제(수십에서 수천 개)에 대해 기울기를 평균 내고, 걸음을 내딛고, 다음 한 줌으로 넘어갑니다. 그 한 줌은 기울기 추정치가 꽤 안정적이고 산술이 벡터 하드웨어에 효율적으로 대응될 만큼 크면서도, 각 걸음이 값싸고 도움이 되는 잡음이 조금 남을 만큼 작습니다 [3]. 배치, 확률적, 미니배치는 우리가 유도한 같은 알고리즘이며, 오직 걸음을 내딛기 전에 θL\nabla_\theta L의 각 추정치에 몇 개의 예제가 들어가는지에서만 다릅니다.

실제 지형에서의 학습률

1차원 그릇은 안전한 학습률이 곡률 aa로 정해진 0<η<2/a0 \lt \eta \lt 2/a라고 알려 주었습니다. 여러 차원에서 곡률은 단 하나의 수가 아니라 2계 도함수들이 이루는 행렬 전체, 즉 헤세 행렬(Hessian)이며, 그 서로 다른 고유 방향을 따라 표면은 서로 다른 정도로 휩니다. 그 정도가 고윳값 λ1,,λd\lambda_1, \ldots, \lambda_d입니다. 그러면 1차원 분석이 방향마다 적용되고, 안정성 천장은 가장 급한 방향이 정합니다. 경사 하강법은 0<η<2/λmax0 \lt \eta \lt 2/\lambda_{\max}일 때에만 수렴합니다 [3]. 이것이 아주 현실적인 골칫거리의 근원입니다. 표면이 가로로 가파르고 세로로 완만하게 기운 길고 좁은 계곡이면 λmax\lambda_{\max}가 크고 λmin\lambda_{\min}이 작습니다. 가파른 가로 방향에서 천장 아래에 머물려면 작은 η\eta를 골라야 하는데, 바로 그 작은 η\eta가 완만한 계곡 길이를 따라서는 애타게 느린 진척을 만듭니다. 그 결과가 전형적인 지그재그입니다. 가파른 벽 사이를 빠르게 튀면서, 실제 최솟값을 향해서는 기어가는 것이죠. 그 비율 κ=λmax/λmin\kappa = \lambda_{\max}/\lambda_{\min}, 즉 조건수(condition number)가 이것이 얼마나 심하게 무는지를 잽니다.

표준적인 첫 처방은 모멘텀(momentum)입니다. 순전히 현재 기울기로 걸음을 내딛는 대신, 지난 기울기들을 누적하는 달리는 속도(velocity) v\mathbf{v}를 간직하고 그 속도로 걸음을 내딛습니다:

v    βvηθL,θ    θ+v,\mathbf{v} \;\leftarrow\; \beta\, \mathbf{v} - \eta\, \nabla_\theta L, \qquad \theta \;\leftarrow\; \theta + \mathbf{v},

모멘텀 계수 β\beta0.90.9 근처입니다. 완만한 계곡 길이를 따라서는 기울기가 계속 같은 쪽을 가리키므로 속도가 쌓여 방법이 가속하는데, 마치 공이 내리막에서 속도를 얻는 것과 같습니다. 좁은 폭을 가로질러서는 기울기가 부호를 계속 뒤집으므로 속도에 대한 잇단 기여가 서로 상쇄되어 진동이 감쇠됩니다 [3]. 여기에는 정직한 단서를 하나 덧붙일 만합니다. 모멘텀은 땜질이며, 나쁜 조건수의 더 원리적인 처방은 켤레기울기법(conjugate gradients) 같은 더 영리한 최적화기이고, 진지한 작업 대부분이 그것에 손을 뻗는다는 것입니다 [1]. 모멘텀과 나란히, 실무자들은 학습률을 스케줄(schedule)합니다. 넓은 땅을 훑기 위해 더 크게 시작해 시간에 걸쳐 줄여(흔히 쓰는 단순한 형태가 η0/τ\eta_0/\tau입니다), 파라미터가 분지에 다가갈수록 걸음이 작아지게 합니다.

아직 풀리지 않은 부분

이 장의 모든 보장은 조용히 한 가지 성질에 기대고 있었습니다. 손실 표면이 하나의 그릇이라는 것입니다. 이차식이 수렴한 것은 최솟값이 하나였기 때문입니다. 선형 회귀와 단일 뉴런 분류기가 수렴하는 것도 같은 이유입니다. 그 손실이 어디서나 그릇 모양인 볼록(convex)이어서, 기울기가 사라지는 어떤 점이든 바로 전역 최솟값이고 내리막이 언제나 결국 거기에 다다르기 때문입니다. 이것은 진짜 정리이며, 이 고전적 모델들이 신뢰할 만한 이유입니다 [3].

다음 장의 네트워크로 뉴런들을 쌓는 순간, 그 성질은 사라집니다. 깊은 네트워크의 손실은 비볼록(non-convex)입니다. 수많은 계곡과 능선과 고갯길이 이루는 험준한 산맥이죠. 경사 하강법은 여전히 자신이 아는 유일한 일, 국소적 기울기를 따르는 일을 하지만, 국소적 기울기는 이제 가장 낮은 계곡이 어디인지 알지 못합니다. 세 가지 실패가 가능해지고, 고차원에서는 흔합니다. 국소 최솟값(local minimum)은 이웃 안에서는 가장 낮지만 전체로는 그렇지 않은 계곡 바닥입니다. 하강이 거기 내려앉아 멈추며, 다른 곳의 더 깊은 계곡을 보지 못합니다. 안장점(saddle point)은 기울기가 0이면서도 표면이 어떤 방향으로는 올라가고 어떤 방향으로는 내려가는 고갯길입니다. 최솟값이 전혀 아니지만 오랫동안 진척을 멎게 할 수 있고, 차원이 커질수록 안장점은 진짜 최솟값보다 압도적으로 많아집니다. 고원(plateau)은 거의 평평한 드넓은 곳으로, 기울기가 미미하여 걸음도 미미하고 방법이 거의 움직이지 못합니다. 경사 하강법은 오직 어떤 정류점에 다다른다는 것만 보장하지, 최선의 것을 보장하지 않으며, 그것도 걸음 크기가 국소 곡률을 존중할 때에만 그렇습니다.

더 깊은 한계가 하나 더 있는데, 다정한 볼록 그릇 위에서조차 참입니다. 기울기는 순전히 국소적인 도구입니다. 발밑 바로 그 자리의 기울기를 보고할 뿐, 그 밖의 것은 아무것도 보고하지 않습니다. 당장의 걸음 너머 계곡의 모양을 볼 수 없고, 얕은 웅덩이가 가장 깊은 협곡의 입구인지 구별하지 못하며, 능선 너머를 살필 수 없습니다. 경사 하강법이 이루는 모든 것은 발밑 땅을 한 번에 한 걸음씩 느껴서 이룬 것입니다. 이 단순하고 눈먼 국소적 규칙이 그런데도 수천억 개의 파라미터를 가진 모델을 훈련한다는 것은 이 분야의 진짜 놀라움 가운데 하나이며, 왜 그토록 잘 되는지는 아직 온전히 이해되지 않았습니다.

왜 중요한가

경사 하강법은 현대 머신러닝의 하중을 견디는 알고리즘입니다. 이 시리즈의 나머지에서 여러분이 마주칠 모든 신경망, 그리고 현재 연구의 사실상 모든 신경망은 여기서 유도한 갱신 규칙 θθηθL\theta \leftarrow \theta - \eta \nabla_\theta L의 어떤 개량형으로 훈련됩니다. 이를 이해하는 것은 선택적 배경 지식이 아니라 그 기제 자체입니다.

특히 뉴로-심볼릭 기획에서 경사 하강법은 통합이 돌아가는 바로 그 경첩입니다. 기호적 구성물, 즉 논리 규칙, 제약, 증명 점수는 그것을 우리가 따라갈 수 있는 기울기를 가진 미분 가능한 손실로 쓸 수 있는 경우에 한하여 지각 네트워크와 함께 훈련될 수 있습니다. "경사 하강법이 다다를 수 있도록 미분 가능하게 만들라"는 그 단 하나의 조건이, 4권의 미분 가능 논리 뒤에, 의미 손실 뒤에, 추론을 학습 가능하게 만들려는 노력 전체 뒤에 되풀이되는 공학적 요구입니다. 이 책에서 학습하는 모든 것은 손실 위에서 내리막을 걸어 학습하며, 이 장은 그 걸음에 대한 서술입니다.

핵심 용어

  • 손실 표면(loss surface, 가중치 공간) — 모델의 파라미터 공간 위에 그려진 손실 L(θ)L(\theta)의 그래프. 훈련은 그 위의 낮은 지점을 찾는 탐색입니다.
  • 도함수 / 편도함수(derivative / partial derivative) — 다른 파라미터를 고정한 채 한 파라미터가 변할 때의 손실의 기울기. 그 부호가 어느 쪽이 오르막인지 알려 줍니다.
  • 기울기 θL\nabla_\theta L(gradient) — 모든 편도함수를 모은 벡터. 가장 가파른 증가 방향을 가리키므로 θL-\nabla_\theta L이 가장 가파른 내리막입니다.
  • 학습률 η\eta(learning rate) — 걸음 크기 배수. 곡률 aa인 그릇에서의 수렴은 0<η<2/a0 \lt \eta \lt 2/a를 요구하며, 가장 급한 방향이 천장을 정합니다.
  • 갱신 규칙(update rule)θθηθL\theta \leftarrow \theta - \eta\, \nabla_\theta L을 되풀이해 적용합니다.
  • 교차 엔트로피와 오차 신호(cross-entropy and the error signal) — 손실 [ylnp+(1y)ln(1p)]-[y\ln p + (1-y)\ln(1-p)]이며, 시그모이드를 거친 그 기울기가 깔끔한 오차 e=pye = p - y로 무너집니다.
  • 배치 / 확률적 / 미니배치(batch / stochastic / mini-batch) — 각 걸음의 기울기를 전체 예제, 한 예제, 또는 작은 무리에서 추정하는지의 차이.
  • 모멘텀(momentum) — 지난 기울기들을 누적하는 속도로, 일관된 방향을 따라 가속하고 좁은 계곡을 가로지르는 진동을 감쇠합니다.
  • 볼록 대 비볼록(convex vs non-convex) — 하강이 전역 최솟값에 다다르는 단일 그릇 손실과, 국소 최솟값·안장점·고원에만 다다를 수 있는 험준한 손실.

이 다음으로 이어지는 것

이제 우리는 엔진을 손에 넣었지만, 오직 기울기를 손으로 쉽게 적어낼 수 있는 모델, 즉 직선과 단일 뉴런에 대해서만입니다. 절박한 물음은, 모델이 합성된 함수들이 깊게 쌓인 것이어서 하나의 가중치가 여러 중간 층을 거쳐 출력에 영향을 미칠 때 θL\nabla_\theta L을 어떻게 계산하는가입니다. 그 답이 역전파(backpropagation)입니다. 미적분의 연쇄 법칙을, 자신의 부분 결과를 재사용하도록 조직하여, 출력에서 모든 가중치로 거꾸로 실행하는 것이죠. 그것이 다음 장 신경망의 주제이며, 거기서 우리가 여기서 따라가는 법을 익힌 기울기가 드디어 어떤 깊이의 네트워크에 대해서도 효율적으로 계산할 수 있는 무언가가 됩니다.


짝이 되는 코드: examples/logic/learning.py는 두 풀이 예제 fit_line(회귀, 평균제곱오차)과 fit_logistic(분류, 교차 엔트로피)을 순수 파이썬으로, 위에서 유도한 그대로 기울기를 손으로 적어 구현합니다. python3 examples/logic/learning.py를 실행하면 이 장의 모든 숫자를 재현할 수 있으며, 승인 하니스 examples/logic/validate.py는 두 맞춤이 목표 손실에 다다르는지, 그리고 분류기가 다섯 사람 모두를 올바르게 분류하는지를 확인합니다.