오랑우탄의 반란

[ML] 딥러닝 기초이론 (+Tensorflow) 본문

PYTHON/머신러닝

[ML] 딥러닝 기초이론 (+Tensorflow)

5&2 2024. 8. 14. 17:21
반응형

 

 

딥러닝 Deep Learning 

딥러닝은 머신러닝의 한 분야로, 신경세포 구조를 모방한 인공 신경망(Artificial Neural Networks)을 사용합니다. 

딥러닝은 머신러닝과 기본적인 흐름은 같지만 내부 구조가 다르며 자연어 처리와 이미지 처리에 최적화 되어 있는 기법입니다. 둘 다 데이터로부터 가중치를 학습해서 패턴을 인식하고 결정을 내리는 알고리즘 개발과 관련된 AI의 하위 분야입니다. (머신러닝은 데이터 안의 통계적 관계를 찾아내 예측/부류를 함)

 

  • 인공 신경망(Artificial Neural Networks): 인간의 신경세포를 모방하여 만든 망(Networks)
  • 퍼셉트론(Perceptron): 인공 신경망의 가장 작은 단위

앞서 선형회귀에서 키와 몸무게를 예제 데이터를 퍼셉트론으로 표현하면 아래와 같습니다. 

 

경사 하강법 Gradient Descent 

모델의 손실 함수를 최소화하기 위해 모델의 가중치를 반복적으로 조정하는 최적화 알고리즘으로, 가중치(weight)를 찾기 위한 직관적이고 빠른 계산법. 변수 X가 여러 개 있다면 동시에 여러 개의 값을 조정하면서 최소의 값을 찾으면 됨.

 

이때 최소화하려는 값을 목적 함수/소실함수(cost function) 이라고 합니다. 

cost = mse, find smallest cost

source: Analytics Vidhya

 

 

step size 알파가 너무 작거나 너무 클 경우 아래 이미지와 같이 가중치를 구하는데 방해가 될 수 있습니다. 

source: Dot Net Tutorials

 

 

활성화 함수 Activation Functions

비선형적 분류를 위해서는 로지스틱 회귀함수(시그모이드 함수)와 같은 활성화함수를 사용해 분류를 진행합니다. 

 

 

히든 레이어 Hidden Layer

비선형적 데이터로 변환했을 때의 고차원적 특성 (이미지, 자연어)을 학습하기 위해 중간에 히든 레이어가 추가되는데, 이때 기울기 소실 문제가 발생하게 되는데, 이때 Relu 라는 특정 활성화함수를 사용해서 해결하게 됩니다. 

 

기울기 소실 문제 Vanishing Gradient

인공 신경망 학습 과정에서 입력 → 출력 방향의 순전파 propogation 과정과 출력 → 입력 방향의 역전파 backpropagation 과정을 진행하는데 후자의 경우 하위 레이어로 갈수록 오차의 기울기가 점점 작아져 가중치 업데이트가 안 되는 현상

 

 

 

  • epoch: batch * iteration, 전체 데이터가 신경망을 통과하는 한 번의 사이클 (1000 epoch = 1000번 학습) 
  • batch: 전체 훈련 데이터 셋을 일정한 크기의 소그룹으로 나눈 것
  • iteration: batch가 학습되는 횟수, 가중치가 업데이트 되는 횟수 

 

 

 

딥러닝 실습 Tensorflow Keras Package 

tensorflow.keras.model.Sequential

  • model.add: 모델에 대한 새로운 층을 추가함
    • unit
  • model.compile: 모델 구조를 컴파일하며 학습 과정을 설정
    • optimizer : 최적화 방법, Gradient Descent 종류 선택
    • loss : 학습 중 손실 함수 설정
      • 회귀: mean_squared_error
      • 분류: categorical_crossentropy
    • metrics : 평가척도
      • mse: Mean Squared Error
      • acc : 정확도
      • f1_score: f1 score
  • model.fit: 모델을 훈련 시키는 과정
    • epochs: 전체 훈련 데이터 셋에 대해 학습을 반복하는 횟수
  • model.summary(): 모델의 구조를 요약하여 출력

 

tensorflow.keras.model.Dense: 완전 연결된 층

  • unit: 층에 있는 유닛의 수. 출력에 대한 차원 개수
  • input_shape:1번째 층에만 필요하면 입력데이터의 형태를 지정

 

  • model.evaluate: 테스트 데이터를 사용하여 평가
  • model.predict: 새로운 데이터에 대해서 예측 수행
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
from sklearn.preprocessing import StandardScaler

weights = np.array([87,81,82,92,90,61,86,66,69,69])
heights = np.array([187,174,179,192,188,160,179,168,168,174])

# sequential 모델 초기화
model=Sequential()

# 단일을 추가하기

dense_layer = Dense(units=1, input_shape=[1])
model.add(dense_layer)
model.compile(optimizer='adam',loss='mean_squared_error')

model.summary()
model.fit(weights, heights, epochs=100)

 

위 아키텍쳐로는 너무 간단해서 부정확할 수 있기 때문에 히든레이어를 생성해줍니다. 

# hidden layer 포함한 아키텍처

model2 = Sequential()
model2.add(Dense(unit=64, activation = 'relu', input_shape=[1]))
model2.add(Dense(unit=64, activation = 'relu'))
model.add(Dense(unit=1)) #최종 숫자가 1개이기 때문에 1, 이진분류면 2, 다중분류면 그 개수만큼 

model2.compile(optimizer='adam',loss='mean_squared_error')

model2.summary()
model2.fit(weights, heights, epochs=100)

 

여기서 더 복잡한 데이터로 복잡한 히든레이어로 모델을 만들거나, batch size 를 바꾸면서 loss를 줄일 수도 있습니다. 

반응형