본문 바로가기
DL|ML

<혼자 또는 같이하는 머신러닝 스터디 잼> Intro to Deep Learning 코스 요약 (1)

by 이든Eden 2021. 4. 16.

하 내용 많다 많아 (1), (2)로 나눠야겠다.

 

1. A single Neuron

딥러닝이란 무엇?

딥러닝은 심층 계산 스택으로 특징지어지는 머신러닝에 대한 접근법이다. 이러한 계산 깊이는 딥러닝 모델이 가장 까다로운 실제 데이터 세트에서 발견되는 복잡하고 계층적인 패턴의 종류를 분리하도록 가능하게 한 것이다.

 

신경망은 뉴런으로 구성되며, 각 뉴런은 개별적으로 간단한 계산만 수행한다. 신경망의 힘은 대신 이 뉴런들이 형성할 수 있는 연결의 복잡성에서 옵니다.

The Linear Unit

  • W : weight, 이 알맞은 w를 찾아내는 것을 뉴럴넷이 학습한다고 한다
  • b : bias, input x의 값과 별개로 뉴런의 출력값을 조절할 수 있다

 

 

Linear Units in Keras

케라스의 kears.Sequential을 이용하여 linear units을 만들어보자.

from tensorflow import keras
from tensorflow.keras import layers

# Create a network with 1 linear unit
model = keras.Sequential([
    layers.Dense(units=1, input_shape=[3])
])

 

 

2. Deep Neural Networks

Layers

신경망은 전형적으로 뉴런을 layers으로 구성한다. 같은 입력 셋을 갖는 linear units를 모인 것을 우리는 dense layer라고 한다.

 

 

The Activation Function

그러나 그 사이에 아무것도 없는 두 개의 dense layer는 그 자체로 하나의 dense layer보다 낫다고 할 수 없다. Dense layer만으로 절대 선과 평면의 세계에서 나아질 수 없다. 우리에게 필요한 것은 비선형성이다. 따라서 activation function이 필요하다.

 

인공 신경망의 능력을 높이기 위해서는 은닉층을 계속해서 추가해야 합니다. 그런데 만약 활성화 함수로 선형 함수를 사용하게 되면 은닉층을 쌓을 수가 없습니다. 예를 들어 활성화 함수로 선형 함수를 선택하고, 층을 계속 쌓는다고 가정해보겠습니다. 활성화 함수는 f(x)=Wx라고 가정합니다. 여기다가 은닉층을 두 개 추가한다고하면 출력층을 포함해서 y(x)=f(f(f(x)))가 됩니다. 이를 식으로 표현하면 W×W×W×x입니다. 그런데 이는 잘 생각해보면 W의 세 제곱값을 k라고 정의해버리면 y(x)=kx와 같이 다시 표현이 가능합니다. 즉, 선형 함수로는 은닉층을 여러번 추가하더라도 1회 추가한 것과 차이를 줄 수 없습니다.

<출처 : PyTorch로 시작하는 딥러닝 입문>

 

Activation function의 종류 : ReLU, flu, SELU, swish 등

 

ReLU, ELU, Swish

 

Stacking Dense Layers

출력 계층 이전의 계층들은 우리가 그들의 출력을 직접 보지 못하기 때문에 hidden layer라고 불린다.

 

Building Sequential Model

케라스의 kears.Sequential을 이용하여 딥러닝 모델의 레이어를 쌓아보자.

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    # the hidden ReLU layers
    layers.Dense(units=4, activation='relu', input_shape=[2]),
    layers.Dense(units=3, activation='relu'),
    # the linear output layer 
    layers.Dense(units=1),
])

 

 

3. Stochastic Gradient Descent

The Loss Function

네트워크(뉴럴넷)를 위한 아키텍처를 설계하는 방법은 봤지만, 네트워크가 어떤 문제를 해결해야 할지 알 수 없었다. 이것이 loss function이 하는 일이다.

 

loss function은 타겟의 값과 모델이 예측한 값의 차이를 계산한다.

문제마다 각자 잘 맞는 loss function을 선택해야 한다. 이전에 튜토리얼에서 숫자 값을 예측하는 regression 문제 해결을 할 때 — calories in 80 Cereals, rating in Red Wine Quality 을 했었다.보통 regression에서 사용하는 loss function은 mean absolute error 혹은 MAE이다. 이전에 봤전 것과 같이 abs(y_true - y_pred) 이다. Mean squared error역시 regression에 사용된다.

 

The Optimizer - Stochastic Gradient Descent

네트워크에서 해결하고자 하는 문제에 대해 이야기했고, 이제 문제를 해결하는 방법을 이야기해봐야 한다. 이것이 optimizer가 하는 일이다. optimizer(최적화)는 loss(손실)를 최소화하기 위해 가중치를 조정하는 알고리즘이다.

 

딥러닝에 사용되는 사실상 모든 optimization 알고리즘은 stochastic gradient descent(확률적 경사 하강)이라는 계열에 속한다. 이것은 네트워크를 단계별로 훈련시키는 반복 알고리즘이다. 그 중 한 단계는 아래와 같다:

 

  • 몇 가지 학습 데이터를 샘플링하여 네트워크를 통해 실행하여 예측
  • 예측값과 참 값 사이의 loss를 측정
  • loss를 줄이는 방향으로 가중치를 조정

이 방법을 loss가 최소가 될 때까지 반복한다.

 

각각의 반복의 샘플을 minibatch(가끔은 batch)라고 부르고, 학습 데이터를 한 바퀴 모두 학습을 완료하면 이것을 epoch이라고 한다.

 

Learning Rate and Batch Size

위의 gif에서 line은 각 배치의 방향으로만 약간 이동한다. 이러한 이동의 크기는 learning rate에 따라 결정된다. 작은 learning rate의 의미는 네트워크의 가중치가 최상의 값으로 수렴하기 전에 더 많은 minibatch들을 볼 필요가 있다는 것을 의미한다.

 

Learning rate와  minibatch의 크기는 SGD 학습이 진행되는 방식에 가장 큰 영향을 미치는 두 가지 hyperparameter(하이퍼파라미터)이다. 이들의 상호작용은 종종 미묘하며 이러한 hyperparameter에 대한 선택이 항상 명확한 것은 아니다.

 

다행히 대부분의 작업에서는 만족스러운 결과를 얻기 위해 광범위한 hyperparameter를 찾아볼 필요는 없다. Adam은 hyperparameter tuning(어떤 의미에서 "셀프 튜닝") 없이 대부분의 문제에 적합하도록 하는 적응형 학습 속도를 가진 SGD 알고리즘이다. Adam은 훌륭한 general-purpose optimizer(범용 최적화 도구)이다.

 

Adding the Loss and Optimizer

model.compile(

    optimizer="adam",

    loss="mae",

)

 

 

최대한 깔끔히 정리하는건 어렵다. 티셔츠! 티셔츠!