멋쟁이 사자처럼 AI 스쿨 TIL-43

김영민·2022년 11월 30일
0

딥러닝

QnA

  1. 레이어 구성을 2의 제곱들로만 해야하나요?
    -> 보통은 2의 제곱으로 사용하는 편인데 그렇게 사용하지 않아도 상관 없습니다.

  2. loss, metric 의 차이는 무엇인가요?
    -> loss 는 실제값과 예측값이 얼마나 다른지를 나타내고, 훈련에 사용해서 가중치와 편향을 업데이트한다.
    -> metric은 얼마나 잘 예측했는지를 나타내는 평가 지표이며, 검증에 사용한다.

  3. loss => W, b 값을 업데이트 해주기 위해 사용하고, metric 모델의 성능을 평가
    분류일 때 사용하는 loss 의 종류는 무엇이 있을까요?
    -> 이진분류 - binarycrossentropy
    -> 다중분류 : 원핫인코딩 - categorical_crossentropy
    -> 다중분류 : 오디널 – sparse_categorical_crossentropy

  4. 머신러닝을 썼을 때와 딥러닝을 사용했을 때 성능이 어떤가요?
    -> 보통은 정형데이터는 딥러닝보다는 머신러닝이 대체적으로 좋은 성능을 내기도 합니다. 물론 딥러닝이 좋은 성능을 낼때도 있습니다. 무엇보다도 중요한 것은 데이터 전처리와 피처엔지니어링이 성능에 더 많은 영향을 줍니다.

garbage in garbage out => 좋은 데이터를 통해 모델을 만드는게 성능에 가장 중요한 역할을 합니다.

  1. 스케일값의 차이가 클 때 할 수 있는 것?
    -> 정규화

  2. standard, min-max, robust 스케일링 각각의 특징을 얘기해 주세요!
    ->Z-score scaling은 평균을 0으로, 표준편차를 1로 만들고 평균을 이용하여 계산하기 때문에 이상치에 민감하지 않습니다.

-> Min-Max scaler는 이름 그대로 최솟값과 최댓값을 0과 1로 지정합니다. 이는 정규분포가 아니거나 표준편차가 작을 때 효과적입니다. 하지만 이상치를 포함하고 있다면 범위 설정에 영향이 가기 때문에 이상치에 민감합니다.

-> Robust scaler는 중앙값을 0으로, 사분위 수를 1로 만들고 중앙값을 이용라기 때문에 앞의 두 정규화 방법들에 비해 이상치에 강합니다.

standard, min-max, robust => 스케일만 바꿀 뿐이지 분포는 변하지 않습니다.

  1. 레이어 구성에서 출력층의 분류와 회귀의 차이
    -> 분류는 (n, activation='softmax'), (1, activation='sigmoid')
    -> 회귀는 항등함수

  2. 이전 분류 실습과 회귀 loss 의 차이?
    -> 분류: crossentropy
    -> 회귀: mae, mse 등

  3. 항등함수
    -> 입력받은 값을 그대로 출력하는 함수입니다.
    -> 회귀의 출력층은 항상 layers.Dense(units=1)

  4. 딥러닝에서는, model 에 fit 해준걸 왜 history 라고 하나요?
    -> epoch 를 통해 학습을 하면 그 학습결과를 로그로 저장을 해서 history라는 API 명을 사용합니다.

  5. 어떻게 해야 val 결과가 나올까요?
    -> validation_split 옵션 지정

  6. dnn_model.predict(test_features).flatten() 예측 결과 뒤에 flatten() 이 있는 이유는 무엇일까요?
    -> 2차원을 1차원으로 만들어 주기 위해

텐서플로

regression 실습에서 보고자 하는 point

1) 정형데이터 입력층 input_shape
2) 정규화 레이어의 사용 => 직접 정규화해도 됩니다.
3) 출력층이 분류와 다르게 구성이 된다는 점
4) 입력변수(피처)를 하나만 사용했을 때보다 여러 변수를 사용했을 때 성능이 더 좋아졌다. => 반드시 여러 변수를 사용한다라고 해서 성능이 좋아지지 않을 수도 있지만 너무 적은 변수로는 예측모델을 잘 만들기 어렵다는 점을 알 수 있습니다.

loss와 val_loss의 차이

  • loss는 훈련 손실값
  • val_loss는 검증 손실값
  • 머신러닝에서도 train으로 학습하고 valid에서 검증한 것과 마찬가지로 딥러닝에서도 모델 성능 검증을 위해서 검증 손실값을 확인해보는 과정

validation_split

지정 위치 : model.fit(X_train, y_train, epochs, validation_split)

신경망모델

API 에서 제공하는 기능이라 사이킷런과 차이가 있습니다.
내부에서 사용하는 알고리즘의 원리는 비슷하지만 기능 구현에 차이가 있습니다.
논문을 작성할 때는 c, c++로 머신러닝, 딥러닝 알고리즘을 작성하기도 합니다. 텐서플로, 파이토치는 리서처도 사용하기는 하지만 프로덕트 개발 등을 위한 목적으로 만들어졌기 때문에 밑바닥부터 코드를 작성하는 것에 비해 간단한 API를 제공합니다. API 마다 기능의 차이가 있습니다.
사이킷런에서 정형데이터를 전처리하는 기능을 포함하고 있는 것처럼 텐서플로에서도 정형데이터, 이미지, 텍스트 등을 전처리하는 기능들도 포함하고 있습니다.

딥러닝 레이어 만들기

층설정

  • 신경망의 기본 구성 요소는 층(layer)입니다.
  • 층은 주입된 데이터에서 표현을 추출합니다.
  • 대부분 딥러닝은 간단한 층을 연결하여 구성됩니다.
  • tf.keras.layers.Dense와 같은 층들의 가중치(parameter)는 훈련하는 동안 학습

Dense Layer

  • 밀집 연결(densely-connected) 또는 완전 연결(fully-connected) 층이라고 부릅니다.
  • 첫 번째 Dense 층은 128개의 노드(또는 뉴런)를 가집니다.
  • 마지막 층은 출력층 입니다.
  • 소프트맥스 일 때 : 2개의 노드의 소프트맥스(softmax) 층입니다. 이 층은 2개의 확률을 반환하고 반환된 값의 전체 합은 1입니다.
  • 각 노드는 현재 이미지가 2개 클래스 중 하나에 속할 확률을 출력합니다.
  • 시그모이드 일 때 : 둘 중 하나를 예측할 때 1개의 출력값을 출력합니다. 확률을 받아 임계값 기준으로 True, False로 나눕니다.

출력층

  • 예측 값이 n개 일 때 : tf.keras.layers.Dense(n, activation='softmax')
  • 예측 값이 둘 중 하나일 때 : tf.keras.layers.Dense(1, activation='sigmoid')

드롭아웃(dropout)

  • 신경망에서 가장 효과적이고 널리 사용하는 규제 기법 중 하나
  • 드롭아웃을 층에 적용하면 훈련하는 동안 층의 출력 특성을 랜덤하게 0으로 만듦.
  • "드롭아웃 비율"은 0이 되는 특성의 비율
  • 보통 0.2에서 0.5 사이를 사용
  • 테스트 단계에서는 어떤 유닛도 드롭아웃하지 않는다.

실습의 단계 및 플로우

  1. 딥러닝 모델을 조정하여서 회귀 딥러닝 모델을 생성하였습니다!
    (분류 모델과 다르게 Dense 출력 유닛 1로 설정, Compile에서 loss, metrics 변경)

  2. 자원과 시간을 아끼기 위해서 학습 과정 중 성능이 비슷하면 멈출 수 있도록 EarlyStopping을 설정해줍니다!
    (tf.keras.callbacks.EarlyStopping -> 성능이 비슷함에도 남은 epochs가 많이 남았다면 시간이 아까우니까요)

  3. 학습 과정에서 validation_split을 설정하여 검증 데이터셋도 설정해줍니다!
    (모델이 과적합인지 과소적합인지 제 성능을 하는지 확인하기 위해서 -> model.fit(validation_split=0.2))

  4. 딥러닝 모델을 학습시킵니다.
    (model.fit)

  5. 학습한 모델의 성능을 history 표를 보면서 측정합니다!
    (여기서 우리 전에 배웠던 loss, mae, mse 지표를 보면서 모델이 잘 예측했는지 평가해봅니다.

-> 검증모델에서의 지표와 비교를 해보고(val_loss, val_mae, val_mse 등등) 과대적합이 됐는지, 과소적합이 됐는지도 볼 수 있습니다.)

profile
배운걸 다 흡수하는 제로민

0개의 댓글