본문 바로가기

AI Study

Advanced Learning Algorithms #2 (Neural Network Training)

Keywords: Activation functions, Muliticlass classification, Softmax, Adam optimization, Numerical Roundoff Error, Back propagation(computation graph)

 

2.1 Neural Network Training

2.1.1 TensorFlow implementation

 

TensorFlow를 사용해 신경망을 훈련시키는 주요 단계는 다음과 같다:

  1. 모델 정의: Sequential 모델로 세 층(첫 번째 숨겨진 층 25개 유닛과 sigmoid 활성화 함수, 두 번째 숨겨진 층, 출력층) 구성.
  2. 모델 컴파일: 손실 함수로 binary crossentropy 지정.
  3. 모델 훈련: fit 함수를 사용해 데이터셋(X, Y)에 모델을 맞추고, 학습 반복 횟수(epochs)를 설정해 학습 실행.

이 단계를 이해하면 모델 훈련 중 문제가 발생할 때 디버깅에 도움이 된다.

 

2.1.2 Training details

[모델 학습 과정 개요]

 

 

 

 

  • TensorFlow를 사용해 신경망을 훈련할 때, 모델 정의와 컴파일 후, model.fit을 호출하여 데이터를 학습시킨다.
  • 이는 역전파(backpropagation) 알고리즘을 사용해 손실 함수의 파라미터를 최적화한다.
  • TensorFlow는 이러한 과정을 자동으로 처리하며, 이는 과거에 직접 구현해야 했던 작업을 라이브러리로 간편하게 수행할 수 있게 해준다.
  • 현대의 딥러닝 개발은 주로 TensorFlow나 PyTorch 같은 성숙한 라이브러리를 사용한다.
  • forward propagation & backward propagation 정리 🔥🔥
    1. Forward Propagation: 입력 데이터를 신경망을 통해 전달하면서 각 층의 출력을 계산하고 최종 예측값을 얻는다. 이 예측값을 이용해 손실 함수를 계산한다.
    2. Backward Propagation: 손실 함수의 값을 기준으로 각 층의 파라미터(가중치와 편향)에 대한 기울기를 계산한다. 이는 체인 룰(chain rule)을 사용하여 네트워크의 마지막 층에서 처음 층까지 역방향으로 진행된다.
    3. 파라미터 업데이트: backward propagation을 통해 계산된 기울기를 사용하여 gradient descent 알고리즘에 따라 파라미터를 업데이트한다.
    따라서, 파라미터 업데이트는 backward propagation이 기울기를 계산한 후에 수행된다. 다시 말해, backward propagation은 기울기를 계산하는 과정이고, gradient descent는 이 기울기를 사용하여 파라미터를 업데이트하는 과정이다.

 

2.2 Activation Functions

2.2.1 Alternatives to the sigmoid function

  • 신경망에서 awareness는 이진 값(0, 1)이나 0과 1 사이의 값이 아닌, 0부터 매우 큰 값까지의 비음수로 모델링하는 것이 더 적절할 수 있다. 이는 구매자가 약간, 어느 정도, 매우 인지하고 있거나 완전히 바이럴된 경우를 모두 표현할 수 있기 때문이다.
  • 이러한 상황에서 활성화 함수로 ReLU 함수를 사용하면 더 강력한 모델을 만들 수 있다.
  • 이는 ReLU 함수가 음수일 때 0, 양수일 때는 z 값을 그대로 반환하여, sigmoid 함수보다 비선형성을 잘 반영하고, gradient 소실 문제를 줄여 학습 속도와 성능을 향상시키기 때문이다.

  • 위는 가장 많이 사용되는 활성화 함수이다.
  • Linear activation function을 사용하는 경우, “우리는 활성화 함수를 사용하지 않는다”라고 표현하기도 한다.

 

2.2.2 Choosing Activation Functions

출력층의 활성화 함수를 선택할 때는 예측하려는 레이블 y에 따라 가장 적합한 함수가 있다.

  1. 이진 분류 문제: y가 0 또는 1인 경우, sigmoid 활성화 함수 사용.
  2. 회귀 문제: y가 양수 또는 음수가 될 수 있는 경우, 선형 활성화 함수(linear activation) 사용.
  3. 양수 값 예측 문제: y가 음수가 될 수 없는 경우(예: 집 값 예측), ReLU 활성화 함수 사용.

이 가이드는 출력층의 활성화 함수를 선택하는 데 있어 일반적으로 따르는 방법이다.

 

  • 숨겨진 층의 활성화 함수로 ReLU 함수가 가장 일반적으로 사용된다.
  • 이는 ReLU 함수가 sigmoid 함수보다 계산이 빠르고, gradient descent를 사용할 때 학습이 더 효율적이기 때문이다.
  • ReLU는 그래프의 왼쪽만 평평한 반면, sigmoid는 양쪽이 평평하여 학습 속도가 느려질 수 있다.

 

 

2.2.3 Why do we need activation functions

 

  • 하나의 숨겨진 유닛과 하나의 출력 유닛을 가진 신경망에서, 모든 활성화 함수로 선형 함수 g(z)=z를 사용하면, 출력 a2는 입력 x의 선형 함수가 된다.
  • 이는 수학적으로 a2=w⋅x+b와 같아져, 결국 선형 회귀 모델과 동일한 결과를 낳는다.
  • 따라서, 선형 활성화 함수를 사용하면 여러 층을 추가해도 복잡한 기능을 학습할 수 없다.

 

  • hidden layers의 activation function을 linear activation function을 사용하고 output layer의 activation function을 sigmoid로 한다면 이건 logistics regression과 동일한 결과를 낳는다.
  • So Don’t use linear activations in hidden layers!

 

2.3 Multiclass Classification

2.3.1 Multiclass

 

 

2.3.2 Softmax

 

  • Softmax 회귀 알고리즘은 로지스틱 회귀의 일반화로, 다중 클래스 분류 문제에 적용된다.
  • 로지스틱 회귀는 이진 분류 문제에서 y가 0 또는 1일 확률을 예측한다. 반면, softmax 회귀는 y가 0 또는 1일 확률을 예측한다.
  • 반면, softmax 회귀는 y가 여러 값(예: 1, 2, 3, 4)을 가질 수 있을 때, 각 클래스에 대한 확률을 계산한다. 이는 각 클래스에 대해 z 값을 계산한 후, 이를 사용해 확률 ai를 구하는 방식이다. 모든 클래스의 확률 합은 1이 된다.
  • softmax 회귀는 n개의 클래스를 처리할 수 있으며, n=2인 경우 로지스틱 회귀와 동일한 결과를 낸다.

  • Softmax 회귀의 비용 함수는 각 클래스에 대한 확률 ai를 기반으로 한다.
  • 로지스틱 회귀에서 비용 함수는 예측 확률 a1 a2를 사용하여 계산되었듯이, softmax 회귀에서도 유사하게 동작한다.
  • y가 특정 클래스 j일 때 손실은 -log(aj)로 계산되며, 이는 aj가 클수록 손실이 작아지게 하여 모델이 정확한 클래스를 높은 확률로 예측하도록 유도한다.
  • 전체 비용 함수는 모든 훈련 데이터에 대한 평균 손실로 정의된다.

2.3.3 Neural network with softmax output

  • 다중 클래스 분류를 위한 신경망을 구축하려면 Softmax 회귀 모델을 출력층에 사용한다.
  • 손글씨 숫자 인식에서 두 클래스만 다루던 신경망을 10개의 클래스(0부터 9까지)로 확장하려면, 출력층에 10개의 출력 유닛을 추가하고 Softmax 출력을 사용한다.
  • 입력X에 대해 이전과 동일하게 첫 번째와 두 번째 숨겨진 층의 활성화 값을 계산한 후, 출력층의 활성화 값 a3를 계산한다.
  • Softmax 출력층은 각 클래스에 대한 확률을 계산하며, 각 출력 ai는 모든 Z 값에 의존한다. 따라서 a1부터 a10까지의 값은 Z1부터 Z10까지의 값에 기반하여 동시에 계산된다.

[기본 코드 structure]

 

2.3.4 Improved implementation of softmax

  • Softmax 층이 있는 신경망 구현에서 숫자를 계산할 때, 잘못된 방법으로 계산하면 수치적 반올림 오류가 발생할 수 있다.
  • 예를 들어, 2/10,0002/10,0002/10,000을 직접 계산하는 방법은 정확하지만, 1+1/10,0001 + 1/10,0001+1/10,000에서 1−1/10,0001 - 1/10,0001−1/10,000을 뺀 결과로 계산하면 반올림 오류가 발생할 수 있다.
  • 이는 컴퓨터의 유한한 메모리로 인해 발생하는 문제이다. 더 나은 구현을 위해서는 이러한 오류를 피할 수 있는 계산 방법을 선택해야 한다.

  • Softmax 비용 함수의 계산에서 수치적 반올림 오류를 줄이기 위해, 기존의 중간 값을 명시적으로 계산하는 대신, TensorFlow가 직접 비용 함수를 계산하도록 하면 더 정확한 결과를 얻을 수 있다.
  • 로지스틱 회귀에서 손실 함수 계산 시 중간 값 a를 계산하는 대신, 이를 포함한 표현식을 직접 사용하면 TensorFlow가 더 효율적으로 계산할 수 있다.
  • 이는**output layer의 activation function을 ‘linear’**으로 바꾸고 from_logits=True 인자를 사용하여 구현할 수 있다. Softmax의 경우(Numberical Roundoff Error가 특히 두드러지기 때문에), 이러한 접근 방식이 수치적 오류를 더욱 효과적으로 줄여준다.

 

  • Softmax 회귀에서 수치적 반올림 오류를 줄이기 위해, 활성화 값과 손실 함수를 별도로 계산하는 대신 TensorFlow가 직접 손실 함수를 계산하도록 지정하면 더 정확한 결과를 얻을 수 있다.
  • 이를 위해 출력층에서 선형 활성화 함수를 사용하고, from_logits=True 인자를 사용하여 손실 함수를 설정한다.
  • 이렇게 하면 TensorFlow가 중간 값을 효율적으로 처리하여 매우 작은 값이나 매우 큰 값으로 인한 오류를 피할 수 있다. 이 방식은 더 정확하지만 코드 가독성은 다소 떨어질 수 있다.

 

For softmax (multiclass classification)

 

For sigmoid (binary classification)

 

Just one more thing!!

  • 출력층을 선형 활성화 함수로 변경하면, 신경망의 최종 출력은 확률이 아닌 z1에서 z10까지의 값이 되며, 확률을 얻기 위해서는 출력값을 적절한 함수로 변환해야 한다.

 

2.3.5 Classification with multiple outputs (optional)

  • 다중 클래스 분류와 달리, 다중 라벨 분류는 하나의 입력 이미지에 대해 여러 개의 라벨이 있을 수 있다.
  • 예를 들어, 자율 주행 차의 경우 이미지에 차, 버스, 보행자가 있는지 각각 판단해야 한다.
  • 다중 라벨 분류에서는 Y가 세 개의 숫자로 구성된 벡터가 되며, 각 숫자는 특정 객체의 존재 여부를 나타낸다.
  • 이 문제를 해결하는 한 가지 방법은 각 객체에 대해 별도의 신경망을 구축하는 것이다.

 

  • 다중 라벨 분류를 위해 하나의 신경망을 사용하여 동시에 여러 객체(차, 버스, 보행자)를 감지할 수 있다.
  • 입력 X를 받아 첫 번째와 두 번째 숨겨진 층을 거쳐, 출력층에 세 개의 뉴런을 배치하고 각 뉴런에 sigmoid 활성화 함수를 사용하여 각각의 이진 분류 문제를 해결한다.
  • 이를 통해 a3는 차, 버스, 보행자의 존재 여부를 나타내는 세 개의 숫자로 구성된 벡터가 된다. 다중 클래스 분류와 다중 라벨 분류의 차이를 이해하여 적절한 방법을 선택할 수 있다.

 

2.4 Additional Neural Networks Concepts

2.4.1 Advanced Optimization

  • Adam 알고리즘은 비용 함수 최소화를 위해 학습률(Alpha)을 자동으로 조정하여 신경망 훈련을 가속화하는 최적화 알고리즘이다.
  • Gradient descent는 일정한 학습률을 사용하지만, Adam은 작은 스텝이 반복되면 학습률을 키우고, 큰 스텝이 반복되면 학습률을 줄여 효율적으로 최소값에 도달하도록 한다.
  • 이는 학습 속도를 높이고 진동을 줄여 더 안정적인 최적화를 가능하게 한다.

  • Adam 알고리즘은 모델의 모든 파라미터에 대해 개별 학습률을 적용하여 더 효과적으로 최적화한다.

  • Adam 알고리즘의 핵심 아이디어는 파라미터가 일정한 방향으로 계속 움직이면 학습률을 높여 더 빠르게 진행하고, 파라미터가 진동하면 학습률을 줄여 진동을 완화하는 것이다.
  • Adam은 각 파라미터에 대해 개별적으로 학습률을 조정하여 최적화를 더욱 효율적으로 수행한다.

 

  • Adam 최적화 알고리즘은 초기 학습률 α가 필요하며, 일반적으로 10^−3을 설정한다.
  • 실제로 사용할 때는 여러 학습률을 시도해보며 가장 빠른 학습 성능을 찾는 것이 좋다.
  • Adam은 학습률을 자동으로 조정하기 때문에, 기본 gradient descent 알고리즘보다 학습률 선택에 덜 민감하다. 하지만 여전히 학습률을 조정해 최적의 성능을 찾는 것이 필요하다.

Additional Layer Types

  • Dense layer의 경우, 두 번째 숨겨진 층의 뉴런 활성화 값은 이전 층의 모든 활성화 값의 함수이다.
  • 하지만 특정 상황에서는 다른 유형의 층을 사용할 수도 있다.

 

  • Convolutional layer는 입력 이미지의 일부 영역만을 보는 뉴런들로 구성된다.
  • 예를 들어, 손글씨 숫자 9의 이미지를 처리할 때, 각 뉴런이 이미지의 작은 부분만을 관찰한다.
  • 이렇게 하면 계산 속도가 빨라지고, 필요한 학습 데이터가 줄어들며 과적합 가능성이 감소한다.

  • Convolutional neural network(CNN)은 여러 convolutional layer로 구성된 신경망이다.
  • 예를 들어, EKG 신호 분류에서 각 convolutional layer의 뉴런은 입력 신호의 일부 영역만 본다.
  • 첫 번째 숨겨진 층의 뉴런은 입력 신호의 작은 창을 보고, 두 번째 숨겨진 층의 뉴런은 이전 층의 일부 활성화 값만 본다.
  • 마지막으로 출력층은 모든 값을 보고 이진 분류를 수행한다.
  • Convolutional layer는 창 크기뉴런 수다양한 설계 선택이 가능하여, 특정 응용 분야에서 dense layer보다 더 효과적일 수 있다.

2.5 Back Propagation (Optional)

2.5.1 What is derivative (optional)

Ans: 4

 

[sympy package for get derivatives in code]

 

 

2.5.2 Computation graph (Optional)

[Forward Prop(Getting loss and cost value from left to right)] 🔥🔥🔥

 

[Backward Prop(Getting derivatives from right to left)] 🔥🔥🔥

 

 

 

[Double Checking the Calculation]

 

 

[why going right to left?] 🔥🔥

 

  • Backpropagation은 derivatives를 효율적으로 계산하는 방법으로, 오른쪽에서 왼쪽으로 계산을 수행한다.
  • 이는 각 중간 값의 변화가 최종 output j에 미치는 영향을 순차적으로 계산하기 때문이다.
  • 이 방법은 각 중간 값의 derivatives를 한 번만 계산하여 모든 파라미터에 대한 derivatives를 효율적으로 계산할 수 있게 한다.
  • 따라서, n개의 노드와 p개의 파라미터를 가진 신경망에서n+p 단계로 derivatives를 계산할 수 있어,n×p 단계가 필요한 경우보다 훨씬 빠르다.

2.5.3 Larger neural network example (Optional)