강의 정리/MIT 딥러닝 유튜브 강의 정리

MIT - Introduction to Deep Learning

htaekjung 2024. 10. 2. 14:22

이번 포스트에는 MIT youtube lecture, SNU Intermediate Project lecture를 통해 딥러닝에 대한 이해를 깊이 있게 하고자 제작되었습니다.

MIT Introduction to Deep Learning | 6.S191 - YouTube

 

What is Deep Learning?

AI : 컴퓨터가 인간의 지능을 모방하여 문제 해결, 추론, 학습, 계획 등을 수행할 수 있게 하는 기술

Machine Learning : 컴퓨터가 명시적인 프로그래밍 없이 데이터를 통해 패턴을 학습

Deep Learning : 인간의 뇌 신경(neural network)을 모방한 인공신경망을 이용해 데이터를 학습

 

Why Deep Learning and Why Now?

딥러닝이 필요한 이유 : 대규모 데이터에서 복잡한 패턴을 학습할 수 있기 때문

Why Now

Big Data : 많은 양의 데이터 효율적으로 처리, 분석

Hardware : GPU, 병렬 연산 가능한 GPU를 통해 빠르게 학습 가능

Software : 새로운 라이브러리들과 툴 개발됨

 

 

The Perceptron - The structural building block of deep learning

The Perceptron : Forward Propagation(순전파)

퍼셉트론을 통해 학습하는 과정을 살펴보겠습니다.

입력값인 x에 대해 가중치인 w가 곱해져 non-linearity 기능을 하는 activation function을 통해 출력값이 나오게 됩니다.  

 

  • w0bias(편향값)으로, 기준이 0이 아닌 활성화 함수를 기준 0에서 작동하도록 보정해주는 값입니다.
  • Non - linearity란, 단순한 선형(linearity)모델로는 처리할 수 없는 복잡한 데이터 구조를 학습할 수 있도록 하는 요소입니다.

Importance of Activation Functions

위와 같은 데이터 구조가 있을 때, 가운데의 linear model로는 이를 구분을 할 수 없지만, 오른쪽의 non-linear model을 사용하여 구분이 잘 이루어지는 것을 알 수 있습니다.

 

  • 따라서 위의 non-linearity한 특성을 가지는 activation Function은 다음과 같습니다.

Activation Function

Building Neural Networks with Perceptrons

Multi Output Perceptron

위의 그림처럼 모든 output에 input이 연결되어 있다면, dense layer이라고 부른다. 

class MyDenseLayer(tf.keras.layers.Layer):
    def __init__(self, input_dim, output_dim):
        super(MyDenseLayer, self).__init__()

        # Initialize weights and bias
        self.W = self.add_weight([input_dim, output_dim])
        self.b = self.add_weight([1, output_dim])

    def call(self, inputs):
        # Forward propagate the inputs
        z = tf.matmul(inputs, self.W) + self.b
        # Feed through a non-linear activation
        output = tf.math.sigmoid(z)
        
        return output

 

Single Layer Neural Network

Inputs -> Hidden, Hidden -> Final Output으로 진행될 때 각각 nonlinear activation function이 진행됩니다.

 

이러한 hidden layer(은닉층)들이 많아지면 아래의 그림처럼 Deep Neural Network가 됩니다.

Deep Neural Network

 

Applying Neural Networks

Example Problem

x1=4, x2=5인 학생이 있다고 가정해보자

위 그래프에서도 볼 수 있듯이 이 학생은 아마 수업에서 Pass를 할 수 있을 것이다. 

Quantifying Loss

하지만, 퍼셉트론을 이용한 학습을 통해 0.1이라는 값이 나왔다고 하자

Predicted value : 0.1, Actual value : 1이므로 loss가 발생했다.

Empirical Loss

아까 x1=4, x2=5인 학생의 경우에 대해 살펴보았는데 각각의 학생들이 가지고 있는 값들을 학습시켜 loss의 평균을 J(W)를 통해 알 수 있다.

당연히, 좋은 학습이란 여러 사람에 대해 train을 했을 때 loss의 평균이 작아야한다.

Binary Cross Entropy Loss

Softmax activation function 과 Cross Entropy function을 함께 사용한다면 더 성능이 좋은 손실함수를 사용할 수 있다. 

Softmax activation function - 모델의 출력값을 확률 분포로 변환하는 함수(0~1 사이의 확률 값 출력, 모든 값 더하면 1이 됨)

Cross Entropy function - Classification 문제에서 predicted value와 actual value간 차이를 측정하는 손실함수(이진 분류 문제를 해결하는 데 사용)

Categorical Crossentropy - 분류해야 할 분류가 셋 이상이라면 사용 가능(정답 레이블 - 원-핫 인코딩으로 주어짐)

Sparse Categorical Crossentropy - 정답 레이블이 원 핫 인코딩이 아니고 정수로 주어지는 경우

Mean Squared Errored Loss

MSE(Mean Squared Error) Loss는 회귀 문제에서 자주 사용되는 손실 함수 - 예측값과 실제값 사이의 차이 제곱하여 평균을 내 모델이 얼마나 정확하게 예측하는지 평가하는 손실함수

Training Neural Networks

위에서 loss 값이 적어야한다는 것을 알았다. 그러면 어떻게 loss를 적게 만드는지 알아보자

Loss Optimization

위의 수식에서 볼 수 있듯이, W^*이라는 값을 W에 대한 함수로 만들었다.

이를 도식화하면 다음과 같다.

Loss Optimization Schematicization

도식화를 하면 위와 같은 산(?)의 모양을 가진 사진을 얻을 수 있다. 위의 사진의 y축은 Loss의 값을 나타낸 것이기에 가장 낮은 곳을 찾아야 한다.

따라서 임의의 한 점을 잡은 후, 기울기를 계산해 계속 내려가면 된다. 

 

이를 경사하강법이라 한다.

결과적으로 다음과 같은 결과를 얻을 수 있다.

Gradient Descent
Gradient Descent coding

Loss를 줄이기 위해 어떠한 작업을 거치는 지 알아보았다.

그러면 입력값에 곱해지는 가중치를 조금 바꾸면 이게 어떻게 loss에 영향을 미치는지 알아보자

Back Propagation

가중치가 출력값에 얼마나 영향을 주는가는 ∂J(W)/ x를 통해 알 수 있습니다. 따라서 chain rule에 의해 오차 back propagation을 통해 구할 수 있습니다.   

 

Neural Networks in Practice : Optimization

이제 실습을 해보자

Training Neural Networks is Difficult

위에서 도식화한 Loss optimization 그림을 시각화한 모습이다.

Loss Functions can be difficult to optimize

Loss를 최소화하기 위해 위 사진의 learning rate를 어떻게 구해야 할까?

Gradient Descent Algorithms

  • SGD
    • 기본적인 경량 옵티마이저, 미니배치로 기울기 계산하여 가중치 업데이트
  • ADAM
    • Momentum과 RMSprop의 장점을 결합한 최적화 알고리즘 
  • Adadelta
    • Adagrad의 변형으로, 학습률이 과도하게 감소하는 문제 해결
  • Adagrad
    • 학습률을 파라미터마다 적응적으로 조정
  • RMSProp
    • 기울기의 제곱을 지수이동 평균으로 가중하여 학습률을 조정 

 

Neural Networks in Practice : Mini-batches

Gradient Descent

위 슬라이드와 경사하강법에 대해 아까 설명을 했습니다.

하지만 매 단계마다 gradient를 계산하는 것은 너무 시간이 오래걸리고 연산량도 많습니다.

따라서 임의의 data point를 잡아 그에 대해서만 진행할 것입니다.

Stochastic Gradient Descent

이를 SGD(Stochastic Gradient Descent)라고 부릅니다.

이는 계산하기 쉽지만 매우 noisy(불안정)하다는 단점이 있습니다. 

Stochastic Gradient Descent

따라서 전체도 아닌 극소수도 아닌 mini- batch 형식(32개의 평균값을 나타내는 것)을 선택했습니다. 

Training할 때 mini-batches를 사용해 더욱 정교하고 빠른 학습을 할 수 있습니다.  

 

Neural Networks in Practice : Overfitting

The problem of Overfitting

학습을 진행할 때 과적합(overfitting), 과소적합(underfitting) 모두 안 좋은 방식입니다.

과적합을 하게 된다면 새로운 데이터가 들어왔을 때 이에 대한 오차가 클 수도 있기 때문입니다.

 

따라서 Regularization(정규화)를 통해 Ideal fit을 찾아야 합니다. 

Regularization 1 : Dropout

학습 과정 중 무작위로 일부 뉴런을 비활성화하여 모델이 특정 뉴런이나 경로에 지나치게 의존하지 않도록 합니다.

 

Regularization 2 : Early Stopping

과적합(overfitting)되기 전에 학습을 멈추는방법입니다.

Early stopping 방식으로 인해 학습 중 overfitting 되는 것을 막을 수 있으며 ideal fit을 찾을 수 있습니다. 

 

 

 

 

 

이상으로 포스트를 마치겠습니다.



본 자료들은 MIT 강의자료에서 발췌하였습니다.