미래연구소 딥러닝 6주 차
Computer Science/Deep Learning

미래연구소 딥러닝 6주 차

728x90

미래연구소 http://futurelab.creatorlink.net/

 

미래연구소

AI, 인공지능 Deep Learning beginner 미래연구소 딥러닝 입문 스터디 / 모집인원 : 25명 (선착순 마감) 수강료 : 월 15만원 / (Coursera 강의 수강료 월 5만원 개인결제)

futurelab.creatorlink.net


C2W3L08 Softmax regression

Recognizing cats, dog, and baby chicks

, 고양이, 병아리를 인식하는 경우이다.

고양이는 클래스 1, 개는 클래스 2, 병아리는 클래스 3이다.

그리고 여기에 해당하지 않는 경우는 클래스 0이다.

 

여기서 대문자 C는 클래스의 개수를 나타내는 데 사용한다.

여기서 C=4 이다. (아무것도 아닌 경우 포함)

C = #classes

 

만약 C에 숫자를 붙인다면 0에서 C-1까지 부여 된다.

여기서는 0, 1, 2, 3 이다.

 

이런 NN을 하나 만들었다.

output layer에는 C개의 output unit이 있다.

이 경우에는 4.

 

output layer Lunit 개수인 n

$n^{[L]}=C$

이 경우에는 $n^{[L]}=4$

 

output layer의 첫 번째 unit은 입력값 X가 주어졌을 때 기타 클래스가 나올 확률이다.

P(other | x)

두 번째 unit은 고양이가 나올 확률이다.

P(cat | x)

세 번째 unit은 개가 나올 확률이다.

P(dog | x)

네 번째 unit은 병아리가 나올 확률이다.

P(bc | x)

 

따라서 출력 값은 $\hat{y}$은 (4, 1)vector가 될 것이다.

그리고 $\hat{y}$의 각 값들의 합은 1이 되어야 한다.

 

이런 NN을 얻기 위한 가장 표준적인 모델은 output layer에 이런 출력 값을 만들 수 있도록 softmax layer를 사용하는 것이다.

 

Softmax layer

NN의 최종 layer에서 $z^{[L]}$을 계산한다.

평소 $z^{[L]}$를 구할 때는 $z^{[L]}=W^{[L]}a^{[L-1]}+b^{[L]}$로 구했다.

 

이제 z값을 계산하기 위해서는 softmax activation function이라는 것을 사용해야 한다.

softmax layeractivation function은 조금 다르다.

우선 $t=e^{z^{[L]}}$라는 임시 변수를 사용한다..

z(4, 1) vector이기 때문에 t 역시 (4, 1) vector이다.

 

출력값인 $a^{[L]}$vector t와 같다.

다만 합이 1이 되도록 정규화한다.

$a^{[L]}=\frac{e^{z^{[L]}}}{\sum_{i=1}^C t_i}$

 

$a^{[L]}$은 당연히 (4, 1) vector이고, vectori번째 원소는 $a^{[L]}_i$라고 적는다.

$a^{[L]}_i=\frac{t_i}{\sum_{i=1}^C t_i}$

 

이 알고리즘은 $z^{[L]}$라는 vector를 취해서 합이 1이 되는 네 개의 확률 값을 내놓는다.

 

sigmoidReLU activate function은 실수를 받아서 실수를 내놨다.

softmax activate function의 특이한 점은 정규화를 하기 위해서 입력값과 출력 값이 모두 vector라는 것이다.

 

C2W3L09 Training a softmax classifier

Understanding softmax

softmax라는 이름은 hardmax와 반대되는 뜻을 갖는다.

hardmaxz vector를 받아와서 $\begin{bmatrix} 1 \\ 0 \\ 0 \\ 0 \end{bmatrix}$ 와 같은 vector에 대응시킨다.

(이를 one-hot encoding라고 한다.)

hardmaxz의 원소를 살펴보고 가장 큰 값이 있는 곳에 1을 나머지에는 0을 갖는 vector로 대응시킨다.

 

softmax regression이나 activation function이 두 class만 다루는 logistic regression을 일반화했다.

만약 C=2라면 즉, softmax에서 C2라면 결국 logistic regression과 같아진다.

 

Loss function

sample이 목표로 하는 출력 값이 관측을 기반으로 $y=\begin{bmatrix} 0 \\ 1 \\ 0 \\ 0 \end{bmatrix}$이다.

위의 예에 대입해보면 이 vector는 고양이를 뜻한다.

그리고 우리 신경막의 출력 값 $\hat{y}$은 다음과 같다.

$\hat{y}=\begin{bmatrix} 0.3 \\ 0.2 \\ 0.1 \\ 0.4 \end{bmatrix}=a^{[L]}$

여기서 NN은 고양이일 확률이 20% 밖에 되질 않으니 이 sample에 대해서는 잘 작동하지 않는다.

 

softmax 분류에서 주로 사용하는 loss function

$L(\hat{y}, y)=-\sum_{j=1}^C y_jlog\hat{y}_j$이다.

(이를 categorical cross entropy라고 부른다.)

 

위의 예에서 $y_1=y_3=y_4=0$인 것을 알 수 있다.

그리고 $y_2$만 유일하게 1이다.

위의 식의 합을 구할 때 $y_j$가 0이면 고려해주지 않아도 된다.

따라서 유일하게 남는 항은 $–y_2log(\hat{y}_2)$이다.

그리고 $y_2$는 1이므로 결국 $–log(\hat{y}_2)$가 된다.

 

우리의 training algorithm이 gradient dscent를 이용해서 이 loss function의 값을 작게 만들려고 할 것이다.

그러면 결국 $–log(\hat{y}_2)$ 이 값을 작게 만드는 것이다.

그러면 최종적으로 $\hat{y}_2$ 이 값을 가능한 한 크게 만들어야 한다.

이 값들은 확률이므로 1보다는 커질 수 없다.

 

, loss functiontraining set에서 관측에 따른 클래스가 뭐든 간에 그 클래스에 대응하는 확률을 가능한 한 크게 만드는 것이다.

 

전체 training set에 대해 cost function J는 전체 training set에서 training algorithm의 예측에 대한 loss function을 합하는 것이다.

$J(w^{[1]}, b^{[1]}, \cdots ) = \frac{1}{m}\sum_{i=1}^m h(\hat{y}^{(i)}, y^{(i)})$

그리고 이 cost function을 최소로 하기 위해 gradient dscent를 써야 한다..

 

C=4이고 y(4, 1) vector인 상황에서 $\hat{y}$도 (4, 1) vector이다.

Y라는 행렬은 $Y=\begin{bmatrix} y^{(1)} & y^{(2)} & \cdots & y^{(m)} \end{bmatrix}$ 이렇게 수평하게 쌓는다.

그러면 Y(4, m) 차원의 행렬이 된다.

 

비슷하게 $\hat{Y}$은 $\hat{Y}=\begin{bmatrix} \hat{y}^{(1)} & \hat{y}^{(2)} & \cdots & \hat{y}^{(m)} \end{bmatrix}$이다.

그러면 $\hat{Y}$도 (4, m) 차원이 될 것이다.

 

Gradient descent with softmax

output layer$Z^{[L]}$을 계산한다.

$Z^{[L]}$(C, 1) 차원이다.

여기에 softmax activation function을 취해서 $a^{[L]}$나 $\hat{y}$를 얻는다.

그리고 그 값을 가지고 loss function을 구한다.

 

backward propagation에서 초기화를 위한 핵심이 되는 식은 마지막 layer에서 $z^{[L]}$의 미분이 (C, 1) vector인 $\hat{y}$에서

(C, 1) vectory를 뺀 것과 같다는 것이다.

$dz^{[L]}=\hat{y}-y$

따라서 $dz^{[L]}$(C, 1) 차원이다.
이런 식으로 NN 전체에 대한 미분을 backward propagation으로 구한다.

728x90

C2W1L03 Basic “recipe” for machine learning

Basic recipe for machine learning

최초의 모델을 훈련하고 난 뒤 알고리즘이 높은 편향(high bias)을 가지는지 즉, 과소 적합(under fit)인지

training set 혹은 training data의 성능을 본다.

만약 높은 편향을 가져서 training set에도 잘 맞지 않는다면 더 많은 hidden layer 혹은 hidden unit을 갖는 Network를 선택하는 것이다.

아니면 더 오랜 시간 훈련시키거나 다른 발전된 최적화 알고리즘을 사용한다.

또한 시도해볼 수 있는 방법으로는 작동할 수도 하지 않을 수도 있지만 다양한 NN 아키텍처가 있다.

따라서 이 문제에 더 잘 맞는 NN 아키텍처를 찾을 수도 있다.

NN 아키텍처는 작동할 수도 안 할 수도 있는 반면에 더 큰 Network를 갖는 것은 대부분 도움이 되고 더 오래 훈련시키는 것은 도움이 안 될 수도 있지만 해는 되지 않는다.

따라서 training algorithm은 훈련시킬 때 최소한 편향 문제를 해결할 때까지 이 방법들을 시도할 것이다.

보통 충분히 큰 Network라면 보통은 training data에는 잘 맞출 수 있다.

 

어떤 경우에는 가능하지만 이미지가 매우 흐릿한 경우는 불가능할 수 있다.

그러나 최소한 인간이 구별할 수 있다면 즉, 베이스 오차가 그렇게 높지 않다면

그것보다 더 크게 훈련하는 경우 최소한 훈련 세트에 대해서는 과대 적합(over fit)이 되더라도 잘 맞는다.

 

편향을 수용 가능한 크기로 줄이게 되면 그다음에 물어볼 것은 분산 문제가 있는지이다.

이를 평가하기 위해 dev set 성능을 보게 된다.

꽤 좋은 training set 성능에서 꽤 좋은 dev set 성능을 일반화할 수 있는지를 본다.

 

높은 분산(high variance) 문제가 있을 때 즉, 과대 적합일 때 이를 해결하는 가장 좋은 방법은 데이터를 더 얻는 것이다.

얻을 수 있다면 가장 좋은 방법이다.

그러나 가끔은 데이터를 더 얻지 못하는 경우가 있다.

또한 과대 적합을 줄이기 위해 정규화(Regularization)를(Regularization) 시도할 수 있다.

그리고 다른 NN 아키텍처를 찾는 것을 시도해 볼 수도 있다.

더 적합한 NN 아키텍처를 찾을 수 있다면 가끔은 편향 문제처럼 분산을 줄일 수 있다.

그러나 이 방법을 완전히 체계화하기는 어렵다.

 

이 방법들은 낮은 편향과 분산을 찾을 때까지 계속 시도하고 반복하게 된다.

 

몇 가지 중요한 것은 첫 번째로 높은 편향이냐 분산이냐에 따라 시도해 볼 수 있는 방법이 아주 달라질 수 있다.

그래서 주로 training setdev set을 편향이나 분산 문제가 있는지 진단하는 데 사용한다.

그 결과 시도해 볼 수 있는 방법을 적절하게 선택한다.

편향과 분산, 혹은 둘 다의 문제가 얼마나 있는지를 명확히 하는 것은 가장 유용한 시도를 선택하는데

집중할 수 있도록 한다.

 

두 번째로 초기 머신러닝의 시대에는 편향-분산 트레이드오프(Bias variance tradeoff)에 대한 많은 논의가 있었다.

그 이유는 시도할 수 있는 많은 것들이 편향을 증가시키고 분산을 감소시키거나 편향을 감소시키고

분산을 증가시키기 때문이다.

딥러닝 이전 시대로 돌아가면 툴이 그렇게 많지는 않았다.

서로를 나쁘게 하지 않고 편향만 감소시키거나 분산만 감소시키는 툴이 많이 없었다.

그러나 현대의 딥러닝 빅데이터 시대에는 더 큰 Network를 훈련시키고 더 많은 데이터를 얻는 것이 정규화를 올바르게 했다면 대부분 분산을 해치지 않고 편향만을 감소시킨다.

그리고 데이터를 더 얻는 것도 대부분 편향을 해치지 않고 분산을 감소시킨다.

 

따라서 더 큰 Network를 훈련시키거나 더 많은 데이터를 얻는 이 두 단계는 서로 영향을 미치지 않고 편향만을 감소시키거나 분산만을 감소시키는 툴이 된다.

이것이 편향과 분산의 균형을 신경 써야 하는 트레이드오프가 훨씬 적기 때문에 supervised learning에 딥러닝이 매우 유용한 큰 이유 중 하나이다.

 

그러나 가끔은 편향이나 분산을 줄이는데 어쩔 수 없이 다른 것을 증가시키는 선택을 하는 경우도 있다.

 

C2W1L04 Regularization

높은 분산으로 NN이 데이터를 과대 적합하는 문제가 의심된다면 가장 처음 시도해야 할 것은 정규화이다.

높은 분산을 해결하는 다른 방법은 더 많은 training data를 얻는 것이다.

꽤 믿을만한 방법이지만 더 많은 training data를 얻는 것은 비용이 많이 들어간다.

그러나 정규화를 추가하는 것은 과대 적합을 막고 NN의 분산을 줄이는데 도움이 된다.

 

Logistic regression

Logistic regression은 다음과 같이 정의된 cost function J를 최소화하는 것이다.

$J(w, b) = \frac{1}{m}\sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)})$

training sample의 개별적인 예측의 loss에 관한 함수이다.

logistic regressionwbparameter이다.

wx차원의 parameter vector이고 b는 실수이다.

따라서 logistic regression에 정규화를 추가하기 위해서 정규화 매개변수라고 부르는 $\lambda$(lambda)를 추가해야 한다.

$J(w, b) = \frac{1}{m}\sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)})+\frac{\lambda}{2m}||x||^2_2$

(여기서 $\lambda$는 regularization parameter라고 부른다.

dev set를 주로 사용한다.

다양한 값을 시도해서 training set에 잘 맞으면서 두 parameter의 ||w||를 잘 설정해

과대 적합을 막을 수 있는 최적의 값을 찾는다.

따라서 $\lambda$는 설정이 필요한 또 다른 hyperparameter이다.)

여기서 $||x||^2_2$은 $\sum_{j=1}^{n_x} w^2_j$과 같다.

또한 $w^Tw$와도 같다.

이것을 $L_2 regularization$이라고 한다.

$L_2 regularization ||x||^2_2=\sum_{j=1}^{n_x} w^2_j=w^Tw$

 

b에 관한 것은 추가하지 않고 parameter w만 정규화하는 이유는 실제로

$J(w, b) = \frac{1}{m}\sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)})+\frac{\lambda}{2m}||x||^2_2$$+\frac{\lambda}{2m}b^2$와 같이 추가하는 것이 가능하지만, 보통 생략한다.

보통 parameter w는 높은 차원의 parameter vector이기 때문이다.

특히 높은 분산을 가질 때 w는 많은 parameter를 갖는다.

반면에 b는 하나의 숫자이다.

따라서 거의 모든 parameterb가 아닌 w에 있다.

위의 마지막 항을 넣어도 실질적인 차이는 없다.

왜냐하면 많은 parameter b는 하나의 parameter이기 때문이다.

 

따라서 L2 regularization은 가장 일반적인 정규화이다.

 

L1 regularization

$||x||^2_2$ 대신 다른 항을 추가한다.

$L1 regularization ||w||_1=\sum_{j=1}^{n_x} |w_j|$

L1 regularization을 사용하게 되면 w는 희소해지는데 이는 w vector안에 0이 많아진다는 의미이다.

특정 parameter0일 경우 메모리가 적게 필요하기 때문에 이것이 모델을 압축하는데 도움이 된다고는 하지만 모델을 희소하게 만들기 위해 L1 regularization을 사용하는 것은 큰 도움이 되지 않는다.

모델을 압축하겠다는 목표가 있지 않는 이상 이 정규화를 많이 사용하지 않는다.

Network를 훈련할 때는 L2 regularization을 훨씬 더 많이 사용한다.

 

Neural network

NN에는 cost function이 있다.

모든 parameter $w^{[1]}, b^{[1]}$부터 $w^{[L]}, b^{[L]}$까지의 parameter를 갖는 함수이다.

(LNN이 있는 layer의 개수)

따라서 cost functiontraining samplem까지의 loss의 합을 m으로 나눈 값이다.

$J(w^{[1]}, b^{[1]}, \cdots ,w^{[L]}, b^{[L]}) = \frac{1}{m}\sum_{i=1}^m h(\hat{y}^{(i)}, y^{(i)})$

여기에 정규화를 더하기 위해 $\lambda$2m으로 나눈 값 곱하기 parameter ||w|| 제곱의 모든 값을 더해준다.

$J(w^{[1]}, b^{[1]}, \cdots ,w^{[L]}, b^{[L]}) = \frac{1}{m}\sum_{i=1}^m h(\hat{y}^{(i)}, y^{(i)})+\frac{\lambda}{2m}\sum_{l=1}^L ||x^{[l]}||^2$

 

여기 있는 $||x^{[l]}||^2$ij에 해당하는 각각의 행렬의 원소를 제곱한 것을 모두 더해준 값이다.

$||w^{[l]}||^2 = \sum_{i=1}^{n^{[l-1]}} \sum_{j=1}^{n^{[l]}} (w^{[l]}_ij)^2$

$w: (n^{[l-1]}, n^{[l]})$

이 행렬의 ||w||Frobenius norm이라고 하며 아래 첨자에 F를 표시해준다.

$J(w^{[1]}, b^{[1]}, \cdots ,w^{[L]}, b^{[L]}) = \frac{1}{m}\sum_{i=1}^m h(\hat{y}^{(i)}, y^{(i)})+\frac{\lambda}{2m}\sum_{l=1}^L ||x^{[l]}||^2_F$

 

이때의 Gradient Descent는 다음과 같다.

$dw^{[l]}=(from backprop)+\frac{\lambda}{m}w^{[l]}$

$w^{[l]}:=w^{[l]}-\alpha dw^{[l]}$

원래의 식에 parameter에 관해 끝에 정규화 항을 더해준 것뿐이다.

L2 regularization은 Weight decay(가중치 감쇠)라고 불리기도 한다.

1보다 살짝 작은 값을 가중치 행렬에 곱해준다는 이유에서 나온 이름이다.

 

C2W1L05 why regularization reduces overfitting

How does regularization prevent overfitting?

정규화 parameter가 매우 크면 parameter w는 매우 작아진다.

또한 b의 효과를 무시하면 z의 값은 상대적으로 작다.

 

z가 상대적으로 작고 작은 범위의 값을 가지기 때문에 tanh activation function은 상대적으로 선형이 된다.

전체 NN은 선형 함수로부터 그리 멀지 않은 곳에서 계산될 것이다.

즉 매우 복잡한 비선형 함수보다 더 간단한 함수이다.

따라서 overfitting의 가능성이 줄어든다.

 

C2W1L06 Dropout regularization

Drpoout regularization

dropout은 각각의 노드마다 0.5의 확률로 해당 노드를 유지하고 0.5의 확률로 노드를 삭제한다.

그 후 삭제된 노드의 들어가는 링크와 나가는 링크를 모두 삭제한다.

그럼 더 작고 간소화된 Network가 된다.

그럼 이 감소된 Network에서 하나의 sample을 역전파로 훈련시킨다.

다른 sample에 대해서도 다른 set의 노드들을 남기고 다른 set의 노드들은 삭제한다.

그럼 각각의 training sample에 대해서 감소된 Network를 사용해 훈련시키게 된다.

 

노드를 무작위로 삭제하는 이상한 기법처럼 보일 수도 있지만 실제로 잘 작동한다.

이것은 각각의 sample에서 더 작은 Network를 훈련시키는 방식이다.

 

Implementing dropout (“Inverted dropout”)

layer3인 경우(l=3)에서의 코드이다.

 

먼저 layer 3에 대한 dropout vectorvector d3를 설정한다.

d3=np.random.rand(a3.shape[0], a3.shape[1])

 

이 값이 keep_prob라는 숫자보다 작은지 비교한다.

(keep_prob은 보존할 확률이라는 뜻)

keep_prob의 값은 0.8로 설정한다.

이 수는 주어진 hidden unit이 유지될 확률이다.

keep_prob0.8이라는 것은 어떤 hidden unit이 삭제될 확률이 0.2라는 것이다.

 

keep_prob=0.8
d3=np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob

 

이 코드는 무작위의 행렬을 생성하게 된다.

vectorization된 경우도 잘 실행된다.

따라서 d3는 각각의 sample과 각각의 unit에 의해 0.8의 확률로 대응하는 d31의 값을 가지고 0.2의 확률로 0의 값을 가지는 행렬이 된다.

 

다음은 3번째 layer의 활성화인 a3에 관한 코드이다.

a3의 값은 예전 a3의 값에 요소별 곱셈으로 d3를 곱해준 것이다.

a3=np.multiply(a3, d3)

(a3 *=d3 으로 써줘도 된다.)

모든 원소에 대해 20% 확률로 0이 되는 d3의 원소를 곱해 대응되는 a3의 원소를 0으로 만들게 된다.

최종적으로 얻은 a30.8(keep_prob)로 나눠준다.

a3 /= keep_prob

이 줄이 implementing dropout(역 드롭아웃)이라고 불리는 기법이다.

keep_prob을 어떤 값으로 설정하든 keep_prob을 다시 나눠줌으로써 a3의 기댓값을 같게 유지한다.

 

implementing dropout은 요즘 가장 보편적인 dropout 기법이기도 하다.

 

d vector를 사용해 서로 다른 training sample마다 다른 hidden unit들을 0으로 만들게 된다.

같은 training set를 통해 여러 번 반복하면 그 반복마다 0이 되는 hidden unit은 무작위로 달라져야 한다,

따라서 하나의 sample에서 계속 같은 hidden unit0으로 만드는 것이 아닌 Gradient Descent의 하나의 반복마다 0이 되는 hidden unit들이 달라진다.

, 같은 training set를 두 번째로 반복할 때는 0이 되는 hidden unit의 패턴이 달라지게 된다.

세 번째 layerd3 vector는 어떤 노드를 0으로 만들지 결정한다.

 

Making predictions at test time

test에서는 dropout을 사용하지 않는다.

그렇기 때문에 어떤 hidden unit을 삭제할지에 관한 random을 하지 않는다.

 

그 이유는 test에서는 예측을 하는 것이므로 결과가 무작위로 나오는 것을 원하지 않기 때문이다.

testdropout을 구현하는 것은 노이즈만 증가시킬 뿐이다.

이론적으로 무작위로 dropout된 서로 다른 hidden unit을 예측 과정에서 여러 번 반복해 그들의 평균을 낼 수도 있지만 컴퓨터적으로 비효율적이고 이 과정과 거의 비슷한 결과를 낸다.

마지막에 keep_prob으로 나누는 inplementing dropout의 효과는 test에서 dropout을 구현하지 않아도 활성화 기댓값의 크기는 변하지 않기 때문에 test할 때 스케일링 parameter를 추가해주지 않아도 된다.

 

Understanding dropout

Why does drop-out work?

단일 unit의 경우, unit이 해야 하는 일은 입력을 받아 의미 있는 출력을 생성하는 것이다.

dropout을 통해 input은 무작위로 삭제될 수 있다.

따라서 이 단일 unit은 어떤 특성에도 의존할 수 없다.

그 특성의 고유한 입력이 무작위로 바뀔 수 있기 때문이다.

따라서 이 특정 input에 모든 것을 걸 수 없는 상황이다.

, 특정 input에 유난히 큰 가중치를 부여하기가 꺼려지는 상황이다.

따라서 모든 input 각각에 가중치를 분산시키는 편이 낫다.

 

layer마다 lee_prob을 바꾸는 것도 가능하다.

parameter가 많은 layer는 과대 적합의 우려가 크므로 상대적으로 낮은 keep_prob을 설정한다.

반면에 과대 적합의 우려가 적은 layer에서는 더 높은 keep_prob을 설정해도 된다.

과대적합의 우려가 없는 layerkeep_prob1로 설정해도 된다.

keep_prob1의 값을 갖는 것은 모든 unit을 유지하고 해당 layer에서는 dropout을 사용하지 않는다는 의미이다.

그러나 parameter가 많은 layer , 과대적합의 우려가 많은 layer는 더 강력한 형태의 dropout을 위해 keep_prob을 작게 설정한다.

 

이론적으로 dropoutinput layer에도 적용시킬 수 있다.

한 개나 그보다 더 많은 개수의 input 특성을 삭제할 수도 있다.

하지만 실제로 자주 사용하지 않는 것이 좋다.

input layer에 대해서는 1keep_prob이 가장 흔한 값이다.

 

정리하자면 다른 layer보다 과대적합의 우려가 더 큰 layer에 대해서는 더 낮은 값의 keep_prob을 설정할 수 있다.

단점은 교차 검증을 위해 더 많은 hyperparameter가 생긴다는 것이다.

 

또 다른 대안으로는 어떤 layer에는 dropout을 적용하고

어떤 layer에는 적용하지 않아서 parameterdropout을 적용한 layer에 대한 keep_prob 하나만 갖는 것이다.

 

여기서 기억해야 할 점은 dropout은 정규화 기법이고 과대 적합을 막는데 도움을 준다.

따라서 Network에 과대 적합의 문제가 생기기 전까지는 dropout을 사용하지 않는다.

(상황에 따라 어떤 애플리케이션 영역에서는 자주 사용되기도 한다.)

dropout의 큰 단점은 cost function J가 더 이상 잘 정의되지 않는다는 것이다.

728x90