학습 목표
- Master the process of hyperparameter tuning
- Describe softmax classification for multiple classes
- Apply batch normalization to make your neural network more robust
- Build a neural network in TensorFlow and train it on a TensorFlow dataset
- Describe the purpose and operation of GradientTape
- Use tf.Variable to modify the state of a variable
- Apply TensorFlow decorators to speed up code
- Explain the difference between a variable and a constant
Tuning Process
Redes Neuronales Cambiantes y Hiperparámetros:
뉴럴 네트워크의 변화하는 구성은 여러 다양한 하이퍼파라미터를 포함한다.
하이퍼파라미터 조정 방법:
효율적인 하이퍼파라미터 조정 프로세스에 대한 지침과 조언을 공유하고자 함.
효과적인 하이퍼파라미터:
학습률(alfa)이 가장 중요한 하이퍼파라미터로 간주됨.
다음 중요도는 인공적으로 선택된 오렌지색 항목들 (모멘텀, 미니 배치 크기, 은닉층의 유닛 수).
파란색 항목 (레이어 수, 학습률 감소)은 상대적으로 덜 중요하지만 영향을 미칠 수 있음.
하이퍼파라미터 값 조정:
무작위 선택을 권장하며, 중요한 하이퍼파라미터를 더 많이 탐색하기 위해 무작위 샘플링이 유용하다.
그리드 대신 무작위 샘플링을 통해 더 효과적인 하이퍼파라미터 탐색 가능.
그로스 투 파인 스키마:
초기에 넓은 범위에서 샘플링하고, 성능이 좋아지는 영역을 더 자세히 조사하기 위해 밀도 높은 샘플링을 수행.
성능 기반 하이퍼파라미터 선택:
모델 학습 및 개발 세트에서의 성능을 기반으로 하이퍼파라미터를 선택하여 최적화 과정을 진행.
하이퍼파라미터 탐색의 규모 선택:
어떤 규모로 하이퍼파라미터를 탐색할지 결정할 때 논의할 내용이 더 있음.
Using an Appropriate Scale to pick Hyperparameters
하이퍼파라미터 검색의 스케일 선택:
무작위로 샘플링하는 것은 중요하지만, 모든 유효한 값 범위에서 균일하게 샘플링하는 것은 항상 최적이 아니다.
하이퍼파라미터를 탐색할 때 적절한 스케일을 선택하는 것이 중요하다.
선형 스케일 vs. 로그 스케일:
일부 하이퍼파라미터에 대해선 균일하게 무작위로 샘플링하는 것이 적절한 경우도 있음.
그러나 학습률(alpha)과 같이 범위가 큰 하이퍼파라미터의 경우 로그 스케일에서 샘플링하는 것이 효율적임.
로그 스케일에서 샘플링하는 방법은 10의 제곱으로 변환하여 무작위로 샘플링하는 것이다.
베타 하이퍼파라미터의 로그 스케일 샘플링:
베타 하이퍼파라미터를 샘플링할 때도 로그 스케일을 사용할 수 있다.
예를 들어, 0.9에서 0.999 사이의 값을 샘플링하려면 베타 값이 아닌 1 - 베타 값을 로그 스케일로 샘플링하여 베타 값을 얻을 수 있다.
로직 스케일의 이점:
로그 스케일은 하이퍼파라미터가 1에 가까울 때 민감하게 반응하는 경우에 민감성을 감소시켜준다.
로그 스케일을 사용하면 중요한 범위 주변에서 더 밀도 높게 샘플링하여 효율적으로 탐색할 수 있다.
하이퍼파라미터 스케일 선택의 중요성:
올바른 스케일을 선택하면 하이퍼파라미터 검색 과정이 더 효율적으로 이루어질 수 있다.
Hyperparameters Tuning in Practice: Pandas vs. Caviar
하이퍼파라미터 인투이션의 한계:
딥러닝은 다양한 응용 분야에 적용되며, 하나의 응용 분야에서 얻은 하이퍼파라미터 설정이 다른 응용 분야로 전이되지 않을 수 있다.
다른 응용 분야의 연구 논문을 읽어서 상호 교감을 통해 하이퍼파라미터에 대한 아이디어를 얻을 수 있다.
하이퍼파라미터 업데이트 주기:
하이퍼파라미터 설정은 환경이나 데이터의 변화에 따라 변할 수 있으므로 일정 기간마다 재평가하거나 재테스트하는 것이 좋다.
하이퍼파라미터 검색 방법:
하이퍼파라미터 검색을 위한 주요 두 가지 방법은 "판다(Panda) 방식"과 "캐비어(Caviar) 방식"이다.
"판다 방식"은 단일 모델을 지속적으로 감독하면서 하이퍼파라미터를 조정하는 방식이며, 컴퓨팅 리소스가 제한된 경우에 사용된다.
"캐비어 방식"은 여러 모델을 병렬로 훈련하고 최상의 결과를 선택하는 방식으로, 더 많은 컴퓨팅 리소스를 가지고 있는 경우에 유용하다.
하이퍼파라미터 검색 방법 선택:
어떤 방법을 선택할지는 사용 가능한 컴퓨팅 리소스에 따라 달라진다.
많은 컴퓨팅 리소스가 있는 경우 "캐비어 방식"을 사용하고, 제한된 리소스가 있는 경우 "판다 방식"을 사용할 수 있다.
Normalizing Activations in a Network
정규화는 다음과 같아야 합니다.
Batch Normalization (배치 정규화):
Batch Normalization은 Sergey Ioffe와 Christian Szegedy에 의해 개발된 중요한 딥 러닝 알고리즘 중 하나입니다.
Batch Normalization은 하이퍼파라미터 탐색 문제를 간단하게 만들어주며, 신경망을 더 견고하게 만들어줍니다.
일반적으로 입력 특성을 정규화(normalize)하여 학습 속도를 향상시키는 것을 기억합니다.
Batch Normalization의 목적:
Batch Normalization은 단일 레이어 뿐만 아니라 심층 신경망에서도 활용할 수 있습니다.
특히, 중간 레이어의 활성화 함수 입력 값을 정규화하여 해당 레이어의 파라미터 학습을 효율적으로 만듭니다.
Batch Normalization 구현 방법:
주어진 중간 값(z)에 대한 평균(mean)과 분산(variance)을 계산합니다.
각 값을 평균과 분산으로 정규화(normalize)합니다.
정규화된 값을 학습 가능한 파라미터(gamma와 beta)로 조정하여 원하는 평균과 분산을 설정합니다.
이를 통해 은닉 레이어의 값(z)이 표준화된 평균과 분산을 가지도록 합니다.
Batch Normalization의 장점:
Batch Normalization은 중간 레이어의 값들을 정규화하여 학습 속도를 빠르게 만들고 신경망을 안정화시킵니다.
활성화 함수의 입력 값을 특정 분포로 고정시키는 것이 아니라 파라미터(gamma와 beta)를 조정하여 원하는 분포로 만들 수 있습니다.
Fitting Batch Norm into a Neural Network
Batch Normalization (배치 정규화)을 딥 네트워크에 적용하기:
배치 정규화는 뉴럴 네트워크를 훈련하는 데 어떻게 맞춰져 있는지 알아보겠습니다.
뉴럴 네트워크는 여러 레이어로 구성되며 각 레이어는 Z와 A의 두 단계 계산으로 나눠집니다.
배치 정규화를 적용하기 이전에는 Z값을 계산하고 활성화 함수를 적용하여 A값을 얻었습니다.
Batch Normalization의 적용:
배치 정규화를 사용하면 Z값을 정규화(normalize)할 수 있습니다.
이렇게 정규화된 Z값을 사용하여 A값을 얻게 됩니다.
각 레이어에서 배치 정규화를 수행하며, 각 레이어에 대한 파라미터인 Beta와 Gamma가 새로 추가됩니다.
Beta와 Gamma는 미니 배치를 기반으로 Z값을 정규화하고 다시 스케일링하는 데 사용됩니다.
미니 배치에서의 Batch Normalization:
배치 정규화는 미니 배치(일부 데이터)를 기반으로 작동합니다.
미니 배치별로 Z값을 정규화하고 스케일링합니다.
각 미니 배치에 대해 경사 하강법을 사용하여 파라미터를 업데이트합니다.
Batch Normalization의 파라미터 조정:
배치 정규화를 사용하면 편향(B) 파라미터를 삭제하거나 0으로 설정할 수 있습니다.
Beta와 Gamma 파라미터는 평균과 분산을 조정하여 레이어의 출력을 조절하는 데 사용됩니다.
Batch Normalization은 모든 레이어에서 적용할 수 있으며, 미니 배치를 사용하여 효율적으로 훈련됩니다.
배치 정규화의 구현:
배치 정규화는 프레임워크에서 일반적으로 한 줄의 코드로 구현할 수 있으며, 딥 러닝 프레임워크를 사용하면 이러한 세부 정보를 직접 구현할 필요가 없습니다.
최적화 알고리즘과의 결합:
배치 정규화는 경사 하강법, 모멘텀, RMSprop, Adam과 같은 최적화 알고리즘과 결합하여 사용될 수 있습니다.
각 레이어의 Beta와 Gamma 파라미터는 업데이트될 수 있습니다.
Why does Batch Norm work?
Batch Normalization의 작동 원리:
배치 정규화는 입력 특성(X)을 평균이 0이고 분산이 1인 값으로 정규화함으로써 학습 속도를 높일 수 있음을 설명합니다.
배치 정규화는 입력 특성 뿐만 아니라 숨겨진 레이어의 값(Z)에 대해서도 정규화를 수행합니다.
배치 정규화가 동작하는 한 가지 직관은 입력 특성뿐만 아니라 모든 레이어의 값에 대해 유사한 값의 범위를 갖도록 만든다는 것입니다.
Batch Normalization의 두 번째 이유:
배치 정규화는 네트워크의 깊은 레이어의 가중치를 이전 레이어의 가중치 변화에 대해 더 견고하게 만듭니다.
이를 설명하기 위해 예를 들어, 검은 고양이 이미지로 훈련된 모델을 컬러 고양이 이미지에 적용할 때 발생하는 문제를 다룹니다.
이것은 데이터 분포의 변화로 인한 문제로 "covariate shift"라고 알려져 있습니다.
배치 정규화는 각 레이어의 값 분포의 변화를 제한하므로 이러한 문제를 완화합니다.
Batch Normalization의 정규화 및 정규화 효과:
배치 정규화는 미니 배치별로 평균과 분산을 계산하여 스케일링합니다.
이로 인해 미니 배치에 대한 평균 및 분산 계산이 약간의 노이즈를 도입하므로 약간의 정규화 효과가 있습니다.
이 노이즈는 매우 작기 때문에 본질적인 정규화 기법으로 사용하지 않는 것이 좋습니다.
Batch Normalization의 적용 시 주의사항:
배치 정규화는 미니 배치 단위로 처리됩니다.
테스트 시에는 미니 배치가 없는 경우도 있으므로 이에 대한 처리가 필요합니다.
배치 정규화에 대한 더 깊은 이해를 제공하고 있으며, 배치 정규화가 학습 속도 향상과 미니 배치에 대한 정규화 효과를 어떻게 불러오는지에 대한 직관을 제공합니다.
Batch Norm at Test Time
배치 정규화의 테스트 시 문제와 대응 방법:
배치 정규화는 데이터를 미니 배치 단위로 처리하며, 테스트 시에는 하나씩 예제를 처리해야 할 때가 있습니다.
테스트 시에는 미니 배치가 없는 경우가 많아, 평균(mu)과 분산(sigma squared)을 어떻게 계산할지 고려해야 합니다.
일반적인 배치 정규화 구현에서는 지수 가중 평균(Exponentially Weighted Average)을 사용하여 mu와 sigma squared의 추정치를 계산합니다.
평균과 분산 추정치의 계산:
훈련 중, 각 레이어 L에서 미니 배치 별로 mu 값을 계산합니다.
이러한 mu 값들을 지수 가중 평균을 통해 업데이트하여 최신 평균 값으로 사용합니다.
이와 유사하게, 각 미니 배치에서 sigma squared 값을 계산하고 업데이트하여 최신 분산 값으로 사용합니다.
테스트 시의 스케일링 계산:
테스트 시에는 mu와 sigma squared의 최신 추정치를 사용하여 스케일링을 수행합니다.
이 추정치로 Z 값을 스케일링하여 Z̃를 계산하고, 이 값을 신경망의 테스트 과정에 사용합니다.
테스트 시의 mu와 sigma squared 추정 방법:
훈련 시에 mu와 sigma squared를 미니 배치 전체를 기반으로 계산하지만, 테스트 시에는 하나의 예제를 처리해야 합니다.
이를 위해 훈련 중에 보통 지수 가중 평균을 사용하여 mu와 sigma squared를 추정합니다.
정확한 추정 방법에 대해서는 크게 걱정할 필요가 없으며, 대부분의 딥러닝 프레임워크에서는 이러한 추정을 자동으로 처리합니다.
마무리:
배치 정규화를 사용하여 더 깊은 신경망을 훈련하고 학습 속도를 향상시킬 수 있습니다.
테스트 시에는 mu와 sigma squared의 추정치를 사용하여 정규화를 수행하며, 추정 방법은 일반적으로 지수 가중 평균을 사용합니다.
이를 통해 훈련 및 테스트 시에 일관된 스케일링을 보장할 수 있습니다.
Softmax Regression
소프트맥스 수식의 텍스트에는 아래 첨자 ""와 "¡"가 혼합되어 있습니다.
아래 첨자는 수식 전체에서 동일해야 합니다(단지 "¡").
따라서 소프트맥스의 공식은 다음과 같습니다.
소프트맥스 회귀 (Softmax Regression) 소개:
이전까지는 이진 분류(Binary Classification)를 다루었으며, 두 가지 레이블 (0 또는 1)을 예측했습니다. "고양이인가 아닌가?"와 같은 문제입니다.
그러나 다중 클래스 분류(Multi-Class Classification) 문제를 다루어보겠습니다. 이러한 문제에는 두 개 이상의 가능한 클래스가 존재합니다. Softmax 회귀는 이러한 다중 클래스 분류를 위한 로지스틱 회귀의 일반화입니다.
다중 클래스 분류 예시:
예를 들어, "고양이, 강아지, 병아리"를 구분하고자 한다고 가정합니다. 이를 각각 클래스 1, 클래스 2, 클래스 3으로 표시하고, "그 외"나 "아무것도 해당하지 않음"을 나타내는 클래스 0을 추가합니다.
클래스 및 표기법:
클래스의 개수를 나타내기 위해 C로 표기하며, 이 경우 4개의 가능한 클래스가 있습니다 (클래스 0, 클래스 1, 클래스 2, 클래스 3).
출력 레이어의 노드 수도 클래스의 개수와 일치하며, 각 노드는 각 클래스에 속할 확률을 출력합니다.
Softmax 활성화 함수:
신경망의 마지막 레이어에서는 일반적으로 Softmax 활성화 함수를 사용합니다.
Softmax 함수는 출력 벡터의 원소를 계산하기 위해 다음과 같은 단계를 거칩니다.
zL (선형 부분)을 계산합니다.
t = e^zL를 계산하고, 각 원소에 대한 지수 계산을 수행합니다.
벡터 t의 원소를 모두 합한 값을 분모로 사용하여 벡터 t의 원소를 정규화합니다.
정규화된 결과 벡터 aL을 얻습니다.
소프트맥스 활성화 함수의 출력:
Softmax 활성화 함수를 통해 얻은 출력 aL은 각 클래스에 속할 확률을 나타내는 4x1 벡터 또는 Cx1 벡터입니다.
이 벡터의 원소는 각 클래스에 속할 확률을 나타내며, 이 확률 값들은 합쳐서 1이 되어야 합니다.
소프트맥스 회귀의 결정 경계:
Softmax 회귀는 다중 클래스 분류를 수행하기 위한 모델로, 각 클래스 간의 결정 경계가 선형인 경우가 많습니다.
예시로 다양한 클래스 수에 따른 결정 경계 그림을 제시하며, 이러한 결정 경계는 각 클래스를 분리하기 위한 선형 함수로 나타낼 수 있음을 보여줍니다.
더 복잡한 결정 경계와 은닉 레이어:
Softmax 회귀를 사용할 때는 주로 선형 결정 경계를 생성합니다.
그러나 더 복잡한 비선형 결정 경계를 얻으려면 은닉 레이어를 추가한 딥러닝 모델을 사용해야 합니다.
은닉 레이어를 통해 다양한 클래스 간의 복잡한 관계를 학습할 수 있습니다.
소프트맥스 회귀 요약:
Softmax 회귀는 다중 클래스 분류를 위한 모델로, 출력 레이어에서 Softmax 활성화 함수를 사용하여 각 클래스에 속할 확률을 출력합니다.
선형 결정 경계를 생성하며, 은닉 레이어를 추가하면 더 복잡한 결정 경계를 학습할 수 있습니다.
Training a Softmax Classifier
소프트맥스 활성화 함수 (Softmax Activation Function):
소프트맥스 활성화 함수는 다중 클래스 분류를 위한 활성화 함수로 사용됩니다.
이 함수는 입력 벡터를 확률 분포로 변환하며, 출력 벡터의 원소들은 합쳐서 1이 됩니다.
"소프트맥스"라는 이름은 이것이 "하드 맥스"와 대조적인 더 부드러운 매핑을 수행한다는 개념에서 비롯되었습니다.
소프트맥스 회귀와 로지스틱 회귀의 관계:
소프트맥스 회귀는 로지스틱 회귀를 C개의 클래스로 일반화한 것입니다. (C는 클래스의 개수)
C가 2일 경우 소프트맥스 회귀는 로지스틱 회귀와 동일합니다.
손실 함수 (Loss Function):
소프트맥스 회귀에서 사용되는 손실 함수는 크로스 엔트로피 손실 함수입니다.
각 학습 예제에 대한 손실을 계산하고, 이를 전체 학습 세트에 대해 합산하여 전체 비용을 얻습니다.
비용 함수의 목표는 실제 클래스에 해당하는 확률을 최대화하는 것입니다.
그래디언트 디센트 (Gradient Descent):
소프트맥스 회귀를 학습하기 위한 역전파 과정에서 중요한 식은 손실 레이어에서의 그래디언트 계산입니다.
이 그래디언트는 소프트맥스 함수의 출력과 실제 클래스 레이블의 차이를 나타냅니다.
행렬 표기법:
학습 예제와 모델 출력은 각각 행렬로 표시됩니다.
행렬의 각 열은 개별 학습 예제에 해당하며, 각 행은 클래스에 대한 확률을 포함하는 벡터입니다.
Deep Learning Frameworks
TensorFlow
TensorFlow 소개:
TensorFlow는 딥 러닝 프로그래밍을 더 효율적으로 할 수 있게 도와주는 딥 러닝 프로그램 프레임워크 중 하나입니다.
TensorFlow 프로그램 구조:
TensorFlow 프로그램의 기본 구조를 학습하고, TensorFlow를 사용하여 신경망을 구현하는 방법을 설명합니다.
옵티마이저와 학습률:
TensorFlow에서는 다양한 옵티마이저를 사용하여 모델을 학습할 수 있습니다.
학습률(learning rate)은 옵티마이저가 모델 파라미터를 업데이트할 때 얼마나 큰 단계로 이동할지를 결정합니다.
비용 함수와 경사 하강법:
비용 함수(cost function)는 모델의 성능을 평가하는 데 사용되며, TensorFlow를 사용하여 비용 함수를 계산하는 방법을 설명합니다.
TensorFlow는 자동으로 역전파(backpropagation)를 수행하여 그레이디언트(gradient)를 계산하고 비용을 최소화합니다.
텐서플로우를 통한 모델 최적화:
TensorFlow를 사용하면 주어진 비용 함수를 최소화하기 위한 모델 파라미터를 자동으로 찾을 수 있습니다.
TensorFlow는 그래디언트를 계산하고 옵티마이저를 적용하여 모델을 효율적으로 최적화합니다.
데이터를 이용한 텐서플로우 프로그래밍:
TensorFlow 프로그램에서 비용 함수의 계수를 제어하기 위해 데이터를 사용하는 방법을 설명합니다.
데이터를 사용하여 모델의 동작을 변경하고 비용 함수를 다양하게 설정할 수 있습니다.
컴퓨테이션 그래프 (Computation Graph):
TensorFlow는 컴퓨테이션 그래프를 사용하여 비용 함수 계산 및 역전파를 자동으로 처리합니다.
순방향 전파 단계만 구현하면 TensorFlow가 자동으로 그래디언트 계산을 수행합니다.
프로그램 프레임워크의 장점:
프로그램 프레임워크를 사용하면 복잡한 신경망도 효과적으로 개발할 수 있습니다.
옵티마이저 변경 등 몇 줄의 코드 수정으로 다양한 실험을 수행할 수 있습니다.