Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix typo error #59

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions 071/TERMINOLOGY.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
| dimension | 차원 |
| diverge | |
| dropout | 드롭아웃 |
| eigenvalue | |
| eigenvalue | 고윳값 |
| empirical risk minimization | |
| encoder | |
| end-to-end | |
Expand Down Expand Up @@ -85,15 +85,16 @@
| layer | 층 |
| learning rate | 학습 속도 |
| least mean squares loss | 최소 평균 제곱 손실 |
| likelihood | 가능도 |
| linear model | |
| linear regression | |
| linear regression | 선형 회귀 |
| local minimum | |
| log likelihhod | 로그 가능도 |
| log likelihod | 로그 가능도 |
| loss function | 손실 함수 |
| machine learning | 머신 러닝 |
| marginalization | 주변화 |
| mean | |
| mean squared error | |
| mean | 평균 |
| mean squared error | 평균 제곱 오차 |
| metric | |
| mini-batch | |
| mini-batch gradient | |
Expand All @@ -105,7 +106,7 @@
| neural network | 뉴럴 네트워크 |
| neuron | 뉴런 |
| non-convex optimization | |
| normalization | |
| normalization | 정규화 |
| numerical method | |
| object detection | |
| objective function | 목적 함수 |
Expand Down Expand Up @@ -154,9 +155,9 @@
| upsample | |
| validation dataset | 검증 데이터셋 |
| vanishing gradient | 그래디언트 소실 |
| variance | |
| variance | 분산 |
| vector | 벡터 |
| weight | |
| word embedding | |
| word vector | |
| zero tensor | |
| zero tensor | |
16 changes: 8 additions & 8 deletions chapter_deep-learning-basics/backprop.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 순전파(forward propagation), 역전파(back propagation), 연산 그래프

앞에서 우리는 모델을 학습 시키는 방법으로 미니 배치 확률적 경사 강하법(stochastic gradient descent) 최적화 알고리즘을 사용했습니다. 이를 구현할 때, 우리는 모델의 순전파(forward propagation) 계산하면서 입력에 대한 모델의 결과만을 계산했습니다. 그리고, 자동으로 생성된 `backward` 함수를 호출함으로 `autograd` 을 이용해서 gradient를 계산합니다. 역전파(back-propagation) 이용하는 경우 자동으로 그래디언트(gradient)를 계산하는 함수를 이용함으로 딥러닝 학습 알고리즘 구현이 굉장히 간단해졌습니다. 이 절에서는 순전파(forward propagation)와 역전파(back propagation)를 수학적이고 연산적인 그래프를 사용해서 설명하겠습니다. 더 정확하게는 한개의 은닉층(hidden layer) 갖는 다층 퍼셉트론(multilayer perceptron)에 $\ell_2$ 놈 정규화(norm regularization)를 적용한 간단한 모델을 이용해서 순전파(forward propagation)와 역전파(back propagation)를 설명합니다. 이 절은 딥러닝을 수행할 때 어떤 일이 일어나고 있는지에 대해서 더 잘 이해할 수 있도록 해줄 것입니다.
앞에서 우리는 모델을 학습 시키는 방법으로 미니 배치 확률적 경사 강하법(stochastic gradient descent) 최적화 알고리즘을 사용했습니다. 이를 구현할 때, 우리는 모델의 순전파(forward propagation) 계산하면서 입력에 대한 모델의 결과만을 계산했습니다. 그리고, 자동으로 생성된 `backward` 함수를 호출함으로 `autograd` 을 이용해서 gradient를 계산합니다. 역전파(back-propagation) 이용하는 경우 자동으로 그래디언트(gradient)를 계산하는 함수를 이용함으로 딥러닝 학습 알고리즘 구현이 굉장히 간단해졌습니다. 이 절에서는 순전파(forward propagation)와 역전파(back propagation)를 수학적이고 연산적인 그래프를 사용해서 설명하겠습니다. 더 정확하게는 한개의 은닉층(hidden layer) 갖는 다층 퍼셉트론(multilayer perceptron)에 $\ell_2$ 놈 정규화(norm regularization)를 적용한 간단한 모델을 이용해서 순전파(forward propagation)와 역전파(back propagation)를 설명합니다. 이 절은 딥러닝을 수행할 때 어떤 일이 일어나고 있는지에 대해서 더 잘 이해할 수 있도록 해줄 것입니다.

## 순전파(forward propagation)

순전파(forward propagation) 뉴럴 네트워크 모델의 입력층부터 출력층까지 순서대로 변수들을 계산하고 저장하는 것을 의미합니다. 지금부터 한개의 은닉층(hidden layer)을 갖는 딥 네트워크를 예로 들어 단계별로 어떻게 계산되는지 설명하겠습니다. 다소 지루할 수 있지만, `backward` 를 호출했을 때, 어떤 일이 일어나는지 논의할 때 도움이 될 것입니다.
순전파(forward propagation) 뉴럴 네트워크 모델의 입력층부터 출력층까지 순서대로 변수들을 계산하고 저장하는 것을 의미합니다. 지금부터 한개의 은닉층(hidden layer)을 갖는 딥 네트워크를 예로 들어 단계별로 어떻게 계산되는지 설명하겠습니다. 다소 지루할 수 있지만, `backward` 를 호출했을 때, 어떤 일이 일어나는지 논의할 때 도움이 될 것입니다.

간단하게 하기 위해서, 입력은 $d$ 차원의 실수 공간 $\mathbf{x}\in \mathbb{R}^d$ 으로 부터 선택되고, 편향(bias) 항목은 생략하겠습니다. 중간 변수는 다음과 같이 정의됩니다.

Expand Down Expand Up @@ -41,13 +41,13 @@ $J$ 를 주어진 데이터 샘플에 대한 목표 함수(objective function)

## 역전파(back propagation)

역전파(back propagation)는 뉴럴 네트워크의 파라미터들에 대한 그래디언트(gradient)를 계산하는 방법을 의미합니다. 일반적으로는 역전파(back propagation) 뉴럴 네트워크의 각 층과 관련된 목적 함수(objective function)의 중간 변수들과 파라미터들의 그래디언트(gradient)를 출력층에서 입력층 순으로 계산하고 저장합니다. 이는 미적분의 '체인룰(chain rule)'을 따르기 때문입니다. 임의의 모양을 갖는 입력과 출력 텐서(tensor) $\mathsf{X}, \mathsf{Y}, \mathsf{Z}$ 들을 이용해서 함수 $\mathsf{Y}=f(\mathsf{X})$ 와 $\mathsf{Z}=g(\mathsf{Y}) = g \circ f(\mathsf{X})$ 를 정의했다고 가정하고, 체인룰(chain rule)을 사용하면, $\mathsf{X}$ 에 대한 $\mathsf{Z}$ 의 미분은 다음과 같이 정의됩니다.
역전파(back propagation)는 뉴럴 네트워크의 파라미터들에 대한 그래디언트(gradient)를 계산하는 방법을 의미합니다. 일반적으로 역전파(back propagation) 뉴럴 네트워크의 각 층과 관련된 목적 함수(objective function)의 중간 변수들과 파라미터들의 그래디언트(gradient)를 출력층에서 입력층 순으로 계산하고 저장합니다. 이는 미적분의 '체인룰(chain rule)'을 따르기 때문입니다. 임의의 모양을 갖는 입력과 출력 텐서(tensor) $\mathsf{X}, \mathsf{Y}, \mathsf{Z}$ 들을 이용해서 함수 $\mathsf{Y}=f(\mathsf{X})$ 와 $\mathsf{Z}=g(\mathsf{Y}) = g \circ f(\mathsf{X})$ 를 정의했다고 가정하고, 체인룰(chain rule)을 사용하면, $\mathsf{X}$ 에 대한 $\mathsf{Z}$ 의 미분은 다음과 같이 정의됩니다.

$$\frac{\partial \mathsf{Z}}{\partial \mathsf{X}} = \text{prod}\left(\frac{\partial \mathsf{Z}}{\partial \mathsf{Y}}, \frac{\partial \mathsf{Y}}{\partial \mathsf{X}}\right).$$

여기서 $\text{prod}$ 연산은 전치(transposotion)나 입력 위치 변경과 같이 필요한 연산을 수항한 후 곱을 수행하는 것을 의미합니다. 벡터의 경우에는 이것은 직관적입니다. 단순히 행렬-행렬 곱셈이고, 고차원의 텐서의 경우에는 새로 대응하는 원소들 간에 연산을 수행합니다. $\text{prod}$ 연산자는 이 모든 복잡한 개념을 감춰주는 역할을 합니다.

하나의 은닉층(hidden layer) 갖는 간단한 네트워크의 파라매터는 $\mathbf{W}^{(1)}$ 와 $\mathbf{W}^{(2)}$ 이고, 역전파(back propagation)는 미분값 $\partial J/\partial \mathbf{W}^{(1)}$ 와 $\partial J/\partial \mathbf{W}^{(2)}$ 를 계산하는 것입니다. 이를 위해서 우리는 체인룰(chain rule)을 적용해서 각 중간 변수와 파라미터에 대한 그래디언트(gradient)를 계산합니다. 연산 그래프의 결과로부터 시작해서 파라미터들에 대한 그래디언트(gradient)를 계산해야하기 때문에, 순전파(forward propagation)와는 반대 방향으로 연산을 수행합니다. 첫번째 단계는 손실(loss) 항목 $L$ 과 정규화(regularization) 항목 $s$ 에 대해서 목적 함수(objective function) $J=L+s$ 의 그래디언트(gradient)를 계산하는 것입니다.
하나의 은닉층(hidden layer) 갖는 간단한 네트워크의 파라매터는 $\mathbf{W}^{(1)}$ 와 $\mathbf{W}^{(2)}$ 이고, 역전파(back propagation)는 미분값 $\partial J/\partial \mathbf{W}^{(1)}$ 와 $\partial J/\partial \mathbf{W}^{(2)}$ 를 계산하는 것입니다. 이를 위해서 우리는 체인룰(chain rule)을 적용해서 각 중간 변수와 파라미터에 대한 그래디언트(gradient)를 계산합니다. 연산 그래프의 결과로부터 시작해서 파라미터들에 대한 그래디언트(gradient)를 계산해야하기 때문에, 순전파(forward propagation)와는 반대 방향으로 연산을 수행합니다. 첫번째 단계는 손실(loss) 항목 $L$ 과 정규화(regularization) 항목 $s$ 에 대해서 목적 함수(objective function) $J=L+s$ 의 그래디언트(gradient)를 계산하는 것입니다.

$$\frac{\partial J}{\partial L} = 1 \text{ and } \frac{\partial J}{\partial s} = 1$$

Expand Down Expand Up @@ -95,13 +95,13 @@ $$

## 모델 학습시키기

네트워크를 학습시킬 때, 순전파(forward propagation) 역전파(backward propagation) 서로 의존하는 관계입니다. 특히 역전파(forward propagation)는 연관되는 관계를 따라서 그래프를 계산하고, 그 경로의 모든 변수를 계산합니다. 이것들은 연산이 반대 방향인 역전파(back propagation)에서 다시 사용됩니다. 그 결과 중에 하나로 역전파(back propagation) 완료할 때까지 중간 값들을 모두 가지고 있어야하는 것이 있습니다. 이것이 역전파(back propagation)가 단순 예측을 수행할 때보다 훨씬 더 많은 메모리를 사용하는 이유들 중에 하나입니다. 즉, 체인룰(chain rule)을 적용하기 위해서 모든 중간 변수를 저장하고 있어야, 그래디언트(gradient)인 텐서(tensor)들을 계산할 수 있습니다. 메모리를 더 많이 사용하는 다른 이유는 모델을 학습 시킬 때 미니 배치 형태로 하기 때문에, 더 많은 중간 활성화(activation)들을 저장해야하는 것이 있습니다.
네트워크를 학습시킬 때, 순전파(forward propagation) 역전파(backward propagation) 서로 의존하는 관계입니다. 특히 역전파(forward propagation)는 연관되는 관계를 따라서 그래프를 계산하고, 그 경로의 모든 변수를 계산합니다. 이것들은 연산이 반대 방향인 역전파(back propagation)에서 다시 사용됩니다. 그 결과 중에 하나로 역전파(back propagation) 완료할 때까지 중간 값들을 모두 가지고 있어야하는 것이 있습니다. 이것이 역전파(back propagation)가 단순 예측을 수행할 때보다 훨씬 더 많은 메모리를 사용하는 이유들 중에 하나입니다. 즉, 체인룰(chain rule)을 적용하기 위해서 모든 중간 변수를 저장하고 있어야, 그래디언트(gradient)인 텐서(tensor)들을 계산할 수 있습니다. 메모리를 더 많이 사용하는 다른 이유는 모델을 학습 시킬 때 미니 배치 형태로 하기 때문에, 더 많은 중간 활성화(activation)들을 저장해야하는 것이 있습니다.

## 요약

* 순전파(forwards propagation) 뉴럴 네트워크의 그래프를 계산하기 위해서 중간 변수들을 순서대로 계산하고 저장합니다. 즉, 입력층부터 시작해서 출력층까지 처리합니다.
* 역전파(back propagation) 중간 변수와 파라미터에 대한 그래디언트(gradient)를 반대 방향으로 계산하고 저장합니다.
* 딥러닝 모델을 학습시킬 때, 순전파(forward propagation) 역전파(back propagation)는 상호 의존적입니다.
* 순전파(forwards propagation) 뉴럴 네트워크의 그래프를 계산하기 위해서 중간 변수들을 순서대로 계산하고 저장합니다. 즉, 입력층부터 시작해서 출력층까지 처리합니다.
* 역전파(back propagation) 중간 변수와 파라미터에 대한 그래디언트(gradient)를 반대 방향으로 계산하고 저장합니다.
* 딥러닝 모델을 학습시킬 때, 순전파(forward propagation) 역전파(back propagation)는 상호 의존적입니다.
* 학습은 상당히 많은 메모리와 저장 공간을 요구합니다.

## 문제
Expand Down
2 changes: 1 addition & 1 deletion chapter_deep-learning-basics/dropout.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ $$
\end{aligned}
$$

은닉층에 드롭아웃(dropout)을 확률 $p$ 로 적용하는 경우, 은닉 유닛들을 $p$ 확률로 제거하는 것이 됩니다. 이유는, 그 확률을 이용해서 출력을 0으로 설정하기 때문입니다. 이를 적용한 네트워크는 아래 그림과 같습니다. 여기서 $h_2$ 와 $h_5$ 가 제거되었습니다. 결과적으로 $y$ 를 계산할 때, $h_2$ 와 $h_5$ 는 사용되지 않게 되고, 역전파(backprop)을 수행할 때 이 것들에 대한 그래디언트(gradient)들도 적용되지 않습니다. 이렇게 해서 출력층으ㄹ 계산할 때 $h_1, \ldots, h_5$ 중 어느 하나에 전적으로 의존되지 않게 합니다. 이것이 오버피팅(overfitting) 문제를 해결하는 정규화(regularization) 목적을 위해서 필요한 것입니다. 테스트 시에는, 더 확실한 결과를 얻기 위해서 드롭아웃(dropout)을 사용하지 않는 것이 일반적입니다.
은닉층에 드롭아웃(dropout)을 확률 $p$ 로 적용하는 경우, 은닉 유닛들을 $p$ 확률로 제거하는 것이 됩니다. 이유는, 그 확률을 이용해서 출력을 0으로 설정하기 때문입니다. 이를 적용한 네트워크는 아래 그림과 같습니다. 여기서 $h_2$ 와 $h_5$ 가 제거되었습니다. 결과적으로 $y$ 를 계산할 때, $h_2$ 와 $h_5$ 는 사용되지 않게 되고, 역전파(backprop)을 수행할 때 이 것들에 대한 그래디언트(gradient)들도 적용되지 않습니다. 이렇게 해서 출력층을 계산할 때 $h_1, \ldots, h_5$ 중 어느 하나에 전적으로 의존되지 않게 합니다. 이것이 오버피팅(overfitting) 문제를 해결하는 정규화(regularization) 목적을 위해서 필요한 것입니다. 테스트 시에는, 더 확실한 결과를 얻기 위해서 드롭아웃(dropout)을 사용하지 않는 것이 일반적입니다.

![MLP before and after 드롭아웃(dropout)](../img/dropout2.svg)

Expand Down
2 changes: 1 addition & 1 deletion chapter_deep-learning-basics/underfit-overfit.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@

### $K$-겹 교차 검증($K​$-Fold Cross-Validation)

학습 데이터가 충분하지 않을 경우 검증 데이터를 많이 확보하는 것은 과하다고 간주됩니다. 왜냐하면, 검증 데이터는 모델 학습에 어떤 역할도 할 수 없기 때문입니다. 이에 대한 해결책으로 $K$-겹 교차 검증($K$-Fold Cross-Validation) 방법이 있습니다. $K$-겹 교차 검증($K$-Fold Cross-Validation)에서는 원래 학습 데이터를 겹치지 않는 K개의 부분 데이터셋으로 나누고, 모델 학습과 검증을 $K$ 번 반복합니다. 검증이 수행될 때마다 $K-1$ 개의 부분 데이터셋으로 학습을 하고, 1개의 부분 데이터셋으로 검증을 수행합니다. 모델을 검증하는데 사용하는 부분 데이터셋은 계속 바꾸면서 $K$ 번 학습과 검증을 수행하게 됩니다. 마지막으로, $K$ 번의 학습과 검증 오류에 대한 평균을 각각 구합니다.
학습 데이터가 충분하지 않을 경우 검증 데이터를 많이 확보하는 것은 과하다고 간주됩니다. 왜냐하면, 검증 데이터는 모델 학습에 어떤 역할도 할 수 없기 때문입니다. 이에 대한 해결책으로 $K$-겹 교차 검증($K$-Fold Cross-Validation) 방법이 있습니다. $K$-겹 교차 검증($K$-Fold Cross-Validation)에서는 원래 학습 데이터를 겹치지 않는 K개의 부분 데이터셋으로 나누고, 모델 학습과 검증을 $K$ 번 반복합니다. 검증이 수행될 때마다 $K-1$ 개의 부분 데이터셋으로 학습을 하고, 1개의 부분 데이터셋으로 검증을 수행합니다. 모델을 검증하는데 사용하는 부분 데이터셋은 계속 바꾸면서 $K$ 번 학습과 검증을 수행하게 됩니다. 마지막으로, $K$ 번의 학습과 검증 오류에 대한 평균을 각각 구합니다.


## 언더피팅(underfitting)과 오버피팅(overfitting)
Expand Down