Deep Learning Specialization - Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization [1주 차]
마감일에 쫓기며 공부하는 나....
나 자신아.. 미안해
학습 목표
- Give examples of how different types of initializations can lead to different results
- Examine the importance of initialization in complex neural networks
- Explain the difference between train/dev/test sets
- Diagnose the bias and variance issues in your model
- Assess the right time and place for using regularization methods such as dropout or L2 regularization
- Explain Vanishing and Exploding gradients and how to deal with them
- Use gradient checking to verify the accuracy of your backpropagation implementation
- Apply zeros initialization, random initialization, and He initialization
- Apply regularization to a deep learning model
목표:
다양한 초기화 방법을 발견하고 실험하며, 모델 과적합을 방지하기 위해 L2 정규화와 드롭아웃을 적용하고, 사기 탐지 모델에서 오류를 식별하는 방법을 살펴보세요.
학습 목표:
서로 다른 초기화 유형이 다른 결과를 가져올 수 있는 예제 제시하기.
복잡한 신경망에서 초기화의 중요성 검토하기.
학습/개발/테스트 세트 간의 차이 설명하기.
모델 내에서 편향과 분산 문제 진단하기.
드롭아웃 또는 L2 정규화와 같은 정규화 방법을 사용하는 올바른 시기와 장소 평가하기.
사그라드 문제와 폭주 그래디언트에 대한 설명 및 이를 다루는 방법 설명하기.
그래디언트 체크를 사용하여 역전파 구현의 정확성 확인하기.
제로 초기화, 무작위 초기화 및 He 초기화 적용하기.
깊은 학습 모델에 정규화 적용하기.
Train / Dev / Test sets
머신 러닝 모델을 훈련시키기 위해 데이터를 훈련(train) 세트, 검증(dev) 세트, 테스트(test) 세트로 나누는 것이 일반적이다.
훈련 세트: 모델을 학습시키는 데 사용되며, 모델 파라미터를 조정하기 위해 사용된다.
검증 세트 (또는 개발 세트): 다양한 모델을 평가하고 최적의 모델을 선택하기 위해 사용되며, 모델 선택 및 하이퍼파라미터 조정에 활용된다.
테스트 세트: 최종 모델의 성능을 평가하고, 편향되지 않은 성능 추정을 제공한다.
초기에는 훈련/검증/테스트 세트를 70/30 또는 60/20/20과 같은 비율로 나누는 것이 일반적이었으나, 현대의 빅데이터 시대에서는 훈련/검증/테스트 세트의 비율이 더 낮아지고 있다.
검증 세트와 테스트 세트는 목적에 맞게 더 작게 만들 수 있으며, 주어진 상황에 따라 1% 또는 0.25%와 같이 작은 비율로 나눌 수 있다.
데이터 분포가 다른 경우도 있으며, 딥러닝에서는 훈련 세트가 검증 및 테스트 세트와 다른 분포를 가질 수 있다. 하지만 검증 세트와 테스트 세트는 동일한 분포에서 가져와야 한다.
테스트 세트를 사용하지 않고 모델을 평가하는 것도 가능하며, 모델 개발 단계에서만 검증 세트를 사용할 수도 있다.
데이터 분할 방법은 목적과 데이터 크기에 따라 조절되어야 하며, 편향과 분산을 효과적으로 측정하고 모델 개선 방법을 선택하는 데 도움이 된다.
개인 주의:
훈련, 검증, 테스트 세트의 목적과 비율은 데이터 크기와 문제에 따라 다를 수 있으며, 더 큰 훈련 세트를 얻기 위해 다양한 데이터 수집 전략을 사용할 수 있다.
훈련 세트가 다른 분포에서 온 경우, 테스트 세트와 동일한 분포에서 가져오도록 노력해야 하며, 이것은 딥러닝에서 빠른 진전을 이루도록 도와줄 수 있다.
Bias / Variance

중요 내용 요약:
편향(bias)과 분산(variance)는 모델의 성능 평가를 통해 이해할 수 있는 중요한 요소이다.
훈련 세트 에러와 개발(검증) 세트 에러를 비교하여 편향과 분산 문제를 진단할 수 있다.
높은 편향(high bias): 훈련 세트 에러와 개발 세트 에러가 모두 높을 때, 모델이 훈련 데이터를 적절히 학습하지 못하는 경우.
높은 분산(high variance): 훈련 세트 에러는 낮지만 개발 세트 에러가 높을 때, 모델이 훈련 데이터에 과적합되어 새로운 데이터에 일반화하지 못하는 경우.
편향과 분산 문제를 동시에 가질 수 있으며, 이를 고치기 위해 다양한 방법을 시도할 수 있다.
머신 러닝 알고리즘 개선을 위한 기본적인 레시피를 사용하여 편향 또는 분산 문제에 대응할 수 있다.
개인 주의:
훈련 세트 에러와 개발 세트 에러를 통해 모델의 편향과 분산을 평가하고 이를 개선하기 위한 조치를 취할 수 있다.
높은 편향은 모델이 너무 단순하거나 복잡한 문제를 해결하기에 부적합할 때 발생하며, 높은 분산은 모델이 과적합되었을 때 발생한다.
모델의 복잡성을 조절하거나 데이터를 추가하고, 하이퍼파라미터를 조정하여 편향과 분산 문제를 개선할 수 있다.
Basic Recipe for Machine Learning
중요 내용 요약:
모델의 편향 또는 분산 문제를 해결하기 위해 다음 단계를 사용하는 기본적인 기계 학습 레시피가 있다.
먼저 편향 문제를 진단하고 해결하기 위해 훈련 세트 성능을 확인한다. 편향이 높을 경우, 더 많은 은닉층 또는 은닉 유닛을 사용하거나 훈련을 더 오래 실행하거나 고급 최적화 알고리즘을 시도할 수 있다.
편향 문제를 해결한 후, 분산 문제를 진단하고 해결하기 위해 개발(검증) 세트 성능을 확인한다. 분산이 높을 경우, 더 많은 데이터를 얻는 것이 가장 효과적이지만, 데이터를 더 얻을 수 없는 경우 정규화 기법을 사용하여 오버피팅을 줄일 수 있다.
머신 러닝에서는 편향과 분산 문제를 동시에 가질 수 있으며, 이에 대응하기 위해 특정 조치를 시도해야 할 수 있다.
편향 또는 분산 문제에 따라 시도해야 할 작업이 다를 수 있으므로 진단 후 적절한 작업을 선택하는 것이 중요하다.
규제(정규화)는 분산을 줄이는 데 유용한 기술 중 하나이며, 규제를 적절하게 사용하면 편향을 조금 증가시킬 수 있지만 대부분의 경우 분산을 감소시킬 수 있다.
현대 딥 러닝 및 대규모 데이터 시대에서는 편향과 분산 간의 균형을 맞추기보다 편향 또는 분산을 감소시킬 다양한 도구와 옵션이 있으므로 기계 학습이 훨씬 더 효과적으로 사용될 수 있다.
개인 주의:
편향 및 분산 문제를 진단하고 적절한 조치를 취하여 모델 성능을 향상시킬 수 있다.
머신 러닝 문제를 효과적으로 해결하려면 편향과 분산 문제에 따라 다른 단계를 사용하고 데이터와 규제를 적절하게 활용해야 한다.
규제는 분산을 줄이는 데 도움이 되며, 편향을 약간 증가시킬 수 있지만 대부분의 경우 모델 성능을 향상시키는 데 도움이 된다.
현대 딥 러닝과 대규모 데이터로 인해 편향과 분산 문제를 동시에 다루는 대신, 각각을 효과적으로 감소시킬 수 있는 도구와 옵션이 늘어났다.
Regularization
Frobenius norm 공식은 다음과 같아야 합니다: 행렬 W^(l)의 프로베니우스 놈(Frobenius Norm): ∥W^(l)∥F = ∑(i=1 to n^(l)) ∑(j=1 to n^(l-1)) (w_i,j^(l))^2 여기서 i의 합산 한계는 현재 레이어의 뉴런 수 n^(l)까지이어야 합니다. 또한 j의 합산 한계는 이전 레이어의 뉴런 수 n^(l-1)까지이어야 합니다. 즉, 행렬의 행 "i"는 현재 레이어의 뉴런 수 n^(l)와 일치해야 하며, 가중치 행렬의 열 "j"는 이전 레이어의 뉴런 수 n^(l-1)와 일치해야 합니다. |
신경망이 데이터를 과적합하는 것으로 의심될 때, 고분산 문제가 있을 때, 정규화(regularization)를 시도해볼 것.
고분산 문제를 해결하기 위한 또 다른 방법은 신뢰할 만한 더 많은 훈련 데이터를 얻는 것이지만 항상 가능하지 않거나 비용이 들 수 있음.
정규화를 추가하면 과적합을 방지하거나 신경망의 분산을 줄이는 데 도움이 됨.
로지스틱 회귀에서 L2 정규화는 비용 함수 J에 λ/2m * w 벡터의 제곱 노름을 추가하는 것.
L2 정규화는 주로 사용되는 정규화 유형 중 하나이며 L1 정규화도 있음.
λ는 정규화 매개변수로 개발 세트나 홀드아웃 교차 검증을 사용하여 설정.
뉴럴 네트워크에서 L2 정규화는 모든 매개변수에 적용되며 Frobenius 노름을 사용하여 정의.
가중치 감쇠(weight decay)는 L2 정규화의 대안 이름으로 사용되며 가중치 행렬을 약간 작게 만들어 과적합을 방지.
정규화는 과적합을 방지하는 방법에 대한 직관을 제공.
공식:
로지스틱 회귀에서 L2 정규화: J = (1/m) * Σ(-y log(a) - (1-y) log(1-a)) + (λ/2m) * Σ(wj^2)
뉴럴 네트워크에서 L2 정규화: J = (1/m) * Σ(Σ(-y log(a) - (1-y) log(1-a))) + (λ/2m) * Σ(Σ(wij^2))
(L2 정규화와 가중치 감쇠(weight decay)는 동일한 개념을 나타냄)
Why Regularization Reduces Overfitting?
정리:
정규화(regularization)가 과적합을 어떻게 방지하고 분산 문제를 줄이는 데 도움을 주는지에 대한 직관을 얻기 위해 몇 가지 예제를 살펴보자.
정규화는 가중치 행렬이 너무 크지 않도록 하는 추가 용어를 비용 함수에 추가하여 작동함. 이것은 Frobenius 노름이라고 불림.
큰 λ(정규화 매개변수)를 사용하면 가중치 행렬 W를 거의 0에 가깝게 설정하려고 하며, 이로 인해 일부 숨겨진 단위의 영향을 제거하려고 함.
정규화 매개변수 λ를 크게 하면 네트워크가 더 단순한 모델로 수렴할 수 있으며, 따라서 과적합 가능성이 감소함.
λ가 크면 파라미터가 상대적으로 작아지므로 활성화 함수의 비선형성을 줄일 수 있으며, 이로 인해 전체 신경망이 더 단순한 함수를 학습하게 됨.
작은 λ를 사용하면 모델은 더 복잡한 결정 경계를 학습하려고 시도하며, 이로 인해 과적합 가능성이 높아짐.
정규화를 구현할 때 비용 함수 J의 정의를 수정하여 정규화 항을 추가하고, 경사 하강법을 디버깅할 때 J를 올바르게 플롯하도록 주의해야 함.
이론 및 직관:
정규화는 과적합을 방지하고 분산 문제를 줄이는 데 도움을 주는 주요 기술 중 하나이며, 가중치를 제한하여 모델을 더 간단하게 만듭니다.
정규화 매개변수(λ)를 조절하면 모델의 복잡성을 조절할 수 있으며, 적절한 값은 과적합을 방지하고 일반화 성능을 향상시킵니다.
정규화는 모델의 가중치를 줄여 선형성을 증가시키고, 더 단순한 모델을 학습시키며, 이로써 과적합을 방지합니다.
Dropout Regularization
정리:
L2 정규화 외에도 "드롭아웃(dropout)"이라고 불리는 강력한 정규화 기술이 있음.
드롭아웃은 신경망에서 과적합을 줄이는 기술로, 각 레이어의 노드를 제거할 확률을 설정하여 작동함.
예를 들어, 레이어마다 0.5의 확률로 노드를 제거하는 경우가 있다.
노드를 제거하면 해당 노드와 관련된 연결도 제거되어 네트워크가 크게 축소됨.
각 훈련 예제마다 다른 노드 집합을 제거하여 여러 개의 "작은" 신경망을 훈련함.
드롭아웃은 모델의 일반화 능력을 향상시키고 과적합을 줄이는 데 도움을 줌.
드롭아웃 구현:
드롭아웃을 구현할 때 "역 드롭아웃(inverted dropout)" 기술을 사용함.
드롭아웃 확률(keep.prob)에 따라 각 레이어의 드롭아웃 벡터(d)를 생성함.
활성화 함수의 결과를 드롭아웃 벡터와 element-wise 곱셈으로 "끄고 켜는" 효과를 줌.
드롭아웃 확률에 따라 기대값을 보존하기 위해 드롭아웃 이후에 활성화를 스케일 업함.
드롭아웃 확률 설정: 각 레이어 l에 대해 드롭아웃 확률을 keep_prob로 설정합니다. 드롭아웃 벡터 생성: 레이어 l에 대한 드롭아웃 벡터 d^l을 생성합니다. d^l은 레이어 l의 활성화 a^l과 동일한 형태를 가지며, 각 원소는 0 또는 1의 값을 가집니다. 각 원소 d^l_i는 Bernoulli 분포를 따라 0 또는 1이 됩니다. (d^l_i = 1의 확률은 keep_prob, d^l_i = 0의 확률은 1 - keep_prob) 드롭아웃 적용: 활성화 함수를 적용하기 전에 드롭아웃 벡터 d^l을 활성화 a^l에 element-wise 곱셈을 수행합니다. a^l = a^l * d^l 스케일 업: 훈련 중 드롭아웃을 적용한 후에는 활성화 a^l을 스케일 업합니다. a^l = a^l / keep_prob 이렇게 하면 드롭아웃이 훈련 중에 무작위로 일부 노드를 제거하고 예측 시에는 스케일 업하여 일반화 능력을 향상시키는 효과를 줍니다. 이러한 과정을 반복하여 다양한 작은 신경망을 훈련하고 과적합을 방지하는 데 사용됩니다. |
Understanding Dropout

동영상 오류 w[1]의 차원은 3x7이어야 합니다. w[3]의 차원은 7x3이어야 합니다. 이전 레이어의 뉴런 수가 가중치 행렬의 열 수를 결정하고, 현재 레이어의 뉴런 수가 행 수를 결정합니다. |
Dropout은 신경망에서 무작위로 유닛을 제외시키는 것처럼 보이는데 왜 동작하는 것일까요? Dropout을 규제 기법으로서 더 잘 이해하기 위해 더 나은 직관을 제공해보겠습니다.
작은 신경망으로 작업: Dropout은 무작위로 네트워크의 유닛을 제외시키는 것처럼 작동합니다. 따라서 매 반복마다 더 작은 신경망과 함께 작업하는 것처럼 보입니다. 더 작은 신경망을 사용하는 것은 정규화 효과를 가져오는 것처럼 보입니다.
개별 유닛 관점: 각 유닛의 관점에서 살펴보겠습니다. 하나의 유닛을 생각해 봅시다. 이 유닛은 네 개의 입력이 필요하고 의미 있는 출력을 생성해야 합니다. 그러나 Dropout을 사용하면 입력이 무작위로 제거될 수 있습니다. 때로는 두 개의 유닛이 제거될 수도 있고, 때로는 다른 유닛이 제거될 수도 있습니다. 따라서 이 유닛은 어떤 특징에도 의존할 수 없습니다. 어떤 특징이든 무작위로 사라질 수 있기 때문에 한 특징에 지나치게 의존하기를 꺼릴 것입니다. 따라서 가중치를 고르게 분산시키려고 노력할 것이며 이것은 가중치의 제곱 노름을 줄이는 효과를 가져올 것입니다. 이것은 L2 정규화와 유사한 효과를 갖게 됩니다.
적응형 L2 정규화: Dropout은 공식적으로는 L2 정규화의 적응형 형태로 나타낼 수 있습니다. 그러나 다른 가중치에 대한 L2 패널티가 서로 다르며 각 가중치가 곱해지는 활성화의 크기에 따라 달라집니다. 결론적으로 Dropout은 L2 정규화와 유사한 효과를 갖게되지만 다양한 입력의 크기에 더 적응적입니다.
Dropout 적용: Dropout을 구현할 때 주의할 점 중 하나는 어떤 레이어에서 Dropout을 적용할지 선택하는 것입니다. 일반적으로 많은 매개변수를 가진 레이어에서 과적합을 줄이기 위해 더 낮은 keep_prob 값을 설정하고, 덜 걱정하는 레이어에서는 더 높은 keep_prob 값을 설정할 수 있습니다.
디버깅 및 검증: Dropout을 구현할 때 주의해야 할 점은 비용 함수 J가 매 반복마다 정확하게 정의되지 않는다는 것입니다. 무작위로 몇몇 노드를 제외하기 때문에 J를 계산하는 것이 어려워집니다. 이를 극복하기 위해 일시적으로 Dropout을 비활성화하고(즉, keep_prob = 1) 코드를 실행하여 J가 빠르게 감소하는지 확인한 다음 Dropout을 활성화하고 테스트하여 코드가 Dropout으로 인해 오류가 발생하지 않았는지 확인할 수 있습니다.
Other Regularization Methods
데이터 확장 (Data Augmentation):
데이터 부족 문제를 해결하기 위해 기존 학습 데이터를 확장합니다.
이미지 데이터의 경우, 예를 들어 이미지를 수평으로 뒤집거나 임의의 위치에서 잘라내어 새로운 학습 예제를 생성합니다.
이렇게 생성된 가짜 학습 예제를 기존 데이터셋에 추가하여 데이터 양을 증가시킵니다.
데이터 확장은 비교적 저렴한 방법으로 모델을 더 규제하고 과적합을 줄이는 역할을 합니다.
조기 종료 (Early Stopping):
모델 학습 중에 훈련 오류 또는 비용 함수 J 값을 모니터링하고 개발 세트 오류도 관찰합니다.
초기에는 개발 세트 오류가 감소하다가 어느 시점에서 다시 증가하기 시작합니다.
조기 종료는 이전에 최적 상태에 있던 모델을 선택하여 학습을 조기에 중단하는 방식입니다.
작은 가중치를 가진 중간 모델을 선택하므로 과적합이 덜 발생하도록 합니다.
단점과 대안:
조기 종료는 두 가지 작업을 동시에 처리하므로 기계 학습 프로세스를 복잡하게 만들 수 있습니다.
대신 L2 정규화를 사용하고 다양한 lambda 하이퍼파라미터 값을 시도하는 대안이 있습니다.
L2 정규화를 사용하면 학습을 가능한 한 오래 진행할 수 있으며 더 많은 lambda 값에 대한 실험을 수행해야 할 수 있습니다.
조기 종료는 더 많은 lambda 값을 명시적으로 시도하지 않고도 유사한 효과를 얻을 수 있도록 합니다.
이러한 규제 기법은 과적합을 줄이고 신경망의 성능을 향상시키는 데 도움이 되며, 데이터 확장 및 조기 종료는 신경망 학습을 개선하기 위한 중요한 도구 중 하나입니다.
Normalizing Inputs
데이터 정규화:
입력 데이터 정규화는 뉴럴 네트워크 학습 속도를 높이는 기법 중 하나입니다.
두 개의 입력 특성을 가진 학습 데이터셋을 예로 들어 설명합니다.
정규화에는 두 단계가 있습니다.
1단계 - 평균 제거 (Zero-Mean):
평균 값을 계산하여 평균을 각 학습 예제에서 뺍니다.
이것은 학습 데이터셋을 이동하여 평균이 0이 되도록 만드는 단계입니다.
2단계 - 분산 정규화 (Variance Normalization):
각 특성의 분산을 계산하여 분산을 1로 만듭니다.
입력 데이터의 평균은 이미 제거했으므로 분산만 정규화합니다.
테스트 데이터 정규화:
훈련 데이터를 정규화할 때 사용한 평균(mu)과 분산(sigma squared) 값을 동일하게 테스트 데이터에 적용해야 합니다.
훈련 세트와 테스트 세트를 서로 다르게 정규화하지 않도록 주의해야 합니다.
정규화의 이유:
정규화된 입력 특성을 사용하면 비용 함수의 형태가 더 간단한 모양으로 바뀝니다.
비정규화된 입력 데이터를 사용하면 형태가 찌그러진 비대칭 형태의 비용 함수가 될 가능성이 높습니다.
정규화된 입력은 뉴럴 네트워크 학습에 더 빠르게 수렴하도록 도와줍니다.
정규화의 이점:
정규화된 입력 데이터는 학습 속도를 높이며, 경사 하강법의 수렴을 더 빠르게 만듭니다.
입력 특성의 스케일을 조절하여 최적화 과정이 더 원활하게 진행됩니다.
정규화 필요성:
입력 특성의 범위가 크게 다를 때, 예를 들어 하나의 특성은 1-1000 범위를 가지고 다른 하나는 0-1 범위를 가질 때 정규화가 중요합니다.
입력 특성의 범위가 유사하면서 중요한데, 이 경우에도 정규화는 항상 유용하게 작용할 수 있습니다.
요약:
입력 데이터 정규화는 뉴럴 네트워크 학습을 빠르게 만들어주는 중요한 기술입니다.
특히 입력 특성의 범위가 크게 다를 때 필요하며, 훈련 데이터와 테스트 데이터를 동일한 방식으로 정규화해야 합니다.
Vanishing / Exploding Gradients
Vanishing and Exploding Gradients:
심층 뉴럴 네트워크, 특히 매우 깊은 뉴럴 네트워크를 학습할 때 문제 중 하나는 그래디언트가 사라지거나 폭발하는 현상입니다.
이것은 학습 중에 기울기(gradient) 또는 경사가 매우 커지거나 매우 작아지는 현상을 의미하며, 이는 학습을 어렵게 만듭니다.
Exploding Gradients:
가중치 행렬(W)이 각 레이어에서 약간 큰 값을 갖는 경우, 깊은 뉴럴 네트워크에서 출력값(Y)이 급격히 커질 수 있습니다.
깊은 뉴럴 네트워크에서 Y-hat이 기하급수적으로 커지면서 학습이 어려워집니다.
Vanishing Gradients:
가중치 행렬(W)이 각 레이어에서 약간 작은 값을 갖는 경우, 깊은 뉴럴 네트워크에서 활성화 값(activations)이 기하급수적으로 작아질 수 있습니다.
이로 인해 깊은 네트워크에서 활성화 값들이 지수 함수처럼 감소하면서 학습이 어려워집니다.
가중치 초기화:
이 문제를 완전히 해결하지는 못하지만, 가중치 초기화를 신중하게 선택함으로써 문제를 완화할 수 있습니다.
가중치 초기화를 조절하여 그래디언트의 폭발 또는 소멸을 완화할 수 있습니다.
요약:
심층 뉴럴 네트워크에서 발생하는 그래디언트 소멸과 폭발 문제에 대한 이해와 초기화 가중치의 신중한 선택이 중요합니다.
이 문제를 완전히 해결하지 못하지만, 적절한 가중치 초기화를 통해 학습을 더욱 효과적으로 진행할 수 있습니다.
Weight Initialization for Deep Networks
Back Propagation의 정확성 확인:
Back Propagation을 구현할 때, 그 구현이 정확한지 확인하기 위해 그래디언트 체크(gradient checking)라는 테스트를 사용할 수 있습니다.
수치적 그래디언트 계산:
그래디언트 체크를 이해하기 위해, 그래디언트를 수치적으로 근사하는 방법을 먼저 살펴봅니다.
함수 f(θ)가 주어졌을 때, θ를 조금 오른쪽으로(θ + ε)와 왼쪽으로(θ - ε) 움직여서 그래디언트를 근사합니다.
수치적 그래디언트의 정확성:
두 개의 포인트를 사용하여 그래디언트를 근사하면 더 정확한 결과를 얻을 수 있습니다.
이를 통해 그래디언트 근사 오차를 줄일 수 있습니다.
이 방법은 한 쪽 그래디언트 계산 방법보다 더 정확하지만, 계산 시간은 두 배가 소요됩니다.
수식 및 공식:
그래디언트 체크에서 사용되는 수식은 다음과 같습니다:
두 포인트를 이용한 두 측면 차이(2-sided difference): (f(θ + ε) - f(θ - ε)) / (2 * ε)
오차는 ε의 제곱에 반비례하므로 작은 ε를 사용하면 정확한 그래디언트 근사가 가능합니다.
결론:
그래디언트 체크를 통해 Back Propagation 구현의 정확성을 확인할 수 있으며, 수치적 그래디언트 계산 방법을 사용하여 오차를 최소화합니다.
이러한 그래디언트 체크를 통해 Back Propagation 구현의 정확성을 검증할 수 있으며, 오차를 최소화하여 더 신뢰성 있는 결과를 얻을 수 있습니다.
Gradient Checking
Gradient checking(그래디언트 체크)은 백 프로파게이션(backpropagation) 구현을 디버깅하거나 검증하는 데 사용되는 기술로, 주로 뉴럴 네트워크 모델의 그래디언트(기울기) 계산이 올바른지 확인하는 데 도움을 줍니다. 이를 위해 다음과 같은 과정을 수행합니다.
뉴럴 네트워크의 파라미터들을 모두 하나의 큰 벡터 데이터(theta)로 재구성합니다. 즉, 모든 가중치와 편향을 벡터로 만들어 연결(concatenate)합니다.
그 후, 비용 함수 J를 이 큰 파라미터 벡터(theta)에 대한 함수로 취급합니다. J는 이제 theta에 대한 함수로 정의됩니다.
파라미터와 동일한 순서로 그래디언트(dW[1], db[1] 등)를 큰 벡터 d theta로 변환합니다. 이때, 각 그래디언트는 해당 파라미터와 동일한 차원을 갖도록 재구성됩니다.
그래디언트 체크를 위해 theta의 각 요소(theta i)에 대해 수치적으로 근사화된 그래디언트(d theta approx i)를 계산합니다. 두 가지 새로운 위치(theta i + epsilon와 theta i - epsilon)에서 비용 함수 J를 계산하고, 이를 사용하여 해당 파라미터에 대한 편도 파생 값을 근사화합니다.
각 theta i에 대한 근사 그래디언트(d theta approx)와 실제 그래디언트(d theta) 사이의 차이를 계산하여 두 벡터가 서로 얼마나 가까운지 확인합니다.
두 벡터 사이의 유클리드 거리를 계산하고, 이 거리를 두 벡터의 크기로 나누어 비율을 얻습니다.
비율이 아주 작은(일반적으로 10^-7 이하) 값이라면, 그래디언트 근사화가 거의 정확하다고 판단할 수 있습니다.
비율이 10^-5 정도면 조심해야 하며, 비율이 10^-3 이상이라면 버그의 가능성이 높으므로 개별 요소(theta i)를 검토하여 오류를 찾아내야 합니다.
버그를 찾고 수정한 후, 비율이 매우 작은 값(일반적으로 10^-7 이하)이라면 모델의 그래디언트 계산이 올바르다고 확신할 수 있습니다.
이를 통해 그래디언트 체킹은 뉴럴 네트워크 구현 시 모델이 올바르게 학습하는지 확인하고 디버깅하는 데 도움을 줄 수 있습니다. 그래디언트 체킹은 머신러닝 및 딥러닝에서 신뢰성 있는 모델 학습을 보장하기 위한 중요한 도구 중 하나입니다.
Gradient Checking Implementation Notes
Gradient checking(그래디언트 체크)은 백 프로파게이션(backpropagation) 구현을 디버깅하거나 검증하는 데 사용되는 기술로, 주로 뉴럴 네트워크 모델의 그래디언트(기울기) 계산이 올바른지 확인하는 데 도움을 줍니다. 이를 위해 다음과 같은 과정을 수행합니다.
뉴럴 네트워크의 파라미터들을 모두 하나의 큰 벡터 데이터(theta)로 재구성합니다. 즉, 모든 가중치와 편향을 벡터로 만들어 연결(concatenate)합니다.
그 후, 비용 함수 J를 이 큰 파라미터 벡터(theta)에 대한 함수로 취급합니다. J는 이제 theta에 대한 함수로 정의됩니다.
파라미터와 동일한 순서로 그래디언트(dW[1], db[1] 등)를 큰 벡터 d theta로 변환합니다. 이때, 각 그래디언트는 해당 파라미터와 동일한 차원을 갖도록 재구성됩니다.
그래디언트 체크를 위해 theta의 각 요소(theta i)에 대해 수치적으로 근사화된 그래디언트(d theta approx i)를 계산합니다. 두 가지 새로운 위치(theta i + epsilon와 theta i - epsilon)에서 비용 함수 J를 계산하고, 이를 사용하여 해당 파라미터에 대한 편도 파생 값을 근사화합니다.
각 theta i에 대한 근사 그래디언트(d theta approx)와 실제 그래디언트(d theta) 사이의 차이를 계산하여 두 벡터가 서로 얼마나 가까운지 확인합니다.
두 벡터 사이의 유클리드 거리를 계산하고, 이 거리를 두 벡터의 크기로 나누어 비율을 얻습니다.
비율이 아주 작은(일반적으로 10^-7 이하) 값이라면, 그래디언트 근사화가 거의 정확하다고 판단할 수 있습니다.
비율이 10^-5 정도면 조심해야 하며, 비율이 10^-3 이상이라면 버그의 가능성이 높으므로 개별 요소(theta i)를 검토하여 오류를 찾아내야 합니다.
버그를 찾고 수정한 후, 비율이 매우 작은 값(일반적으로 10^-7 이하)이라면 모델의 그래디언트 계산이 올바르다고 확신할 수 있습니다.
이를 통해 그래디언트 체킹은 뉴럴 네트워크 구현 시 모델이 올바르게 학습하는지 확인하고 디버깅하는 데 도움을 줄 수 있습니다. 그래디언트 체킹은 머신러닝 및 딥러닝에서 신뢰성 있는 모델 학습을 보장하기 위한 중요한 도구 중 하나입니다.
--------------------------------
Gradient Checking은 디버깅(debug) 목적으로만 사용하라: Gradient Checking은 미분 근사 계산으로 인해 연산이 느리므로 훈련(training) 중에는 사용하지 말아야 합니다. 훈련에는 백 프로파게이션(backpropagation)을 사용하여 실제 그래디언트(d theta)를 계산하고, 디버깅 시에만 Gradient Checking을 활용하여 근사 그래디언트(d theta approx)와 실제 그래디언트(d theta)의 일치 여부를 확인합니다.
Grad Check 실패 시 개별 컴포넌트 확인: Gradient Checking이 실패하면 근사 그래디언트(d theta approx)와 실제 그래디언트(d theta)의 값 차이를 개별 컴포넌트(theta i)별로 확인하여 버그의 위치를 찾아냅니다. 어떤 레이어의 파라미터(b 또는 w)에 대한 그래디언트가 다른 레이어에 비해 두드러지게 다를 경우, 해당 파라미터 계산에 문제가 있을 가능성이 높습니다.
정규화 항을 고려: 만약 정규화 항(L2 정규화 등)을 사용한다면, Gradient Checking 시에도 이 항을 포함하여 그래디언트(d theta)를 계산해야 합니다.
Dropout과 Gradient Checking: Dropout을 사용하는 경우 Gradient Checking은 적용하기 어렵습니다. Dropout은 매 반복에서 랜덤하게 은닉 유닛을 제거하므로 이러한 변동성을 고려한 비용 함수 J를 계산하기 어렵습니다. 보통 Dropout을 끄고 Gradient Checking을 수행한 다음, Dropout을 다시 활성화하여 제대로 구현되었는지 확인합니다.
가중치 크기에 주의: 가끔 가중치(w)와 편향(b)이 작을 때(랜덤 초기화 시) Gradient Descent가 올바르게 작동하지만, 가중치가 커질수록(backpropagation 미구현) 오차가 증가할 수 있습니다. 이를 확인하려면 초기화 후 일부 반복을 수행한 다음 다시 Gradient Checking을 실행할 수 있습니다.
이러한 팁과 주의사항을 고려하여 Gradient Checking을 활용하면 뉴럴 네트워크의 구현 오류를 찾는 데 도움이 됩니다.
틀린 문제
정규화 매개변수(예: L2 정규화)는 훈련(training) 중에 가중치(weight)가 업데이트되는 방식, 즉 역전파(backpropagation) 과정에 영향을 미칩니다. 이것은 모델이 학습 데이터를 학습하고 가중치를 조정할 때 사용됩니다. 모델이 훈련 데이터를 통해 학습하는 동안 정규화는 가중치에 패널티를 주어 모델이 훈련 데이터에 과적합되지 않도록 도와줍니다. 이러한 패널티 항은 모델의 손실 함수에 추가되어 가중치를 제한하거나 줄입니다. 그러나 모델이 학습을 마치고 테스트 데이터에 대한 예측을 수행하는 순방향 전파(forward propagation) 단계에서는 정규화 매개변수는 직접적인 영향을 미치지 않습니다. 모델은 테스트 데이터에 대한 예측을 수행할 때 이미 학습된 가중치를 사용하며, 이 가중치에는 훈련 중에 정규화가 적용되었습니다. 따라서 정규화는 주로 훈련(training) 중에 가중치를 관리하고, 테스트(testing) 단계에서는 그저 학습된 모델을 사용하여 예측을 수행합니다. |
등등