AIVLE TIL ('23.03.03) 딥러닝 기초 (4)

cjkangme·2023년 3월 3일
0

에이블스쿨

목록 보기
26/81
post-thumbnail
post-custom-banner

오늘 배운 것

Standardization

  • 스케일링의 한가지 방법으로, 데이터를 평균 0, 분산 및 표준편차 1이 되도록 변환한다.

  • 변환된 데이터는 표준정규분포의 z-score에 해당하는 값을 갖게 된다.
    • -1 ~ 1 사이에 약 68%
    • -2 ~ 2 사이에 약 95%
    • -3 ~ 3 사이에 약 99.7%
    • -3 미만 및 3 초과 값은 보통 이상치(outlier)로 본다.
  • 데이터의 최대 최소를 모를 때 minmax보다 안전하게 스케일링이 가능하다.
  • 이상치에 민감하므로 이상치 제거 등의 조치가 선행되어야 한다.

Fully Connected (FC)

  • 고전 딥러닝 모델의 연결 방식으로, 말 그대로 모든 노드가 하나도 빠짐 없이 연결된 구조를 말한다.
  • 문제점
    • 이미지 데이터 실습에서 알아보았듯이, 입력으로 1차원 벡터밖에 받지 못하기 때문에 고차원 데이터의 학습이 어렵다.
    • 또한 상관관계가 매우 큰 feature가 있을 경우 다음 hidden layer 또는 output의 모든 노드에게 큰 영향을 주어 다른 feature가 묻힐 수도 있다.
    • 인간이 Feature를 조정하기 어렵다.
    • 마지막으로 파라미터가 기하급수적으로 늘어나기 때문에 학습에 오랜 시간이 소요된다.

Locally Connected

  • 각 노드가 일부 Feature만을 사용하도록 하는 연결 구조이다.
  • Feature간 연결을 제어할 수 있는 방식이다.
    • 도메인 지식을 바탕으로, 보다 관계가 있을 것으로 예측되는 feature 끼리를 묶거나 빼면서 Input에 적용이 가능하다.
    • 즉, 인간의 의도를 모델에 담을 수 있다.
  • keras에서 Locally connected를 사용하기 위해서는 반드시 Functional API를 이용해야한다.

Concatenate

  • 별도의 feature로 학습한 서로 다른 레이어들을 한 레이어로 합치는 역할을 하는 레이어이다.
  • 합친 이후에 다시 히든 레이어에 넣거나, output을 출력하거나 할 수 있다.
  • 학습의 기능은 없기 때문에 Concatenate 층의 파라미터는 0이다.
# 1. 세션 클리어
clear_session()

# 2. 레이어 연결
il_l = Input( shape=(2,) )
hl_l = Dense(2, activation=relu)(il_l)
hl_l = Dense(2, activation=relu)(hl_l)

il_w = Input( shape=(2,) )
hl_w = Dense(2, activation=relu)(il_w)
hl_w = Dense(2, activation=relu)(hl_w)

cl = Concatenate()([hl_l, hl_w]) # <<< 여기가 Concatenate layer
ol = Dense(3, activation=softmax)(cl)

# 3. 모델 선언
model = Model([il_l, il_w], ol)

# 4. 모델 컴파일
model.compile(loss=categorical_crossentropy, metrics=['accuracy'],
              optimizer=Adam())

  • 2개의 노드가 합쳐져 4개가 된 것을 확인할 수 있다.

Add

  • 각각의 레이어에서 추출된 새로운 특징(가중치)를 더하는 것을 통해 합치는 연결 방식이다.
  • 되도록 shape가 같은 레이어끼리 add해야한다.
# 1. 세션 클리어
clear_session()
# 2. 레이어 연결
il_l = Input(shape=(2, ))
hl_l = Dense(4, activation=swish, name='Hidden_Sepal')(il_l)

il_w = Input(shape=(2, ))
hl_w = Dense(4, activation=swish, name='Hidden_Petal')(il_w)

al = Add()([hl_l, hl_w]) #
ol = Dense(3, activation=softmax)(al)
# 3. 모델 선언
model = Model([il_sp, il_pt], ol)
# 4. 컴파일
model.compile(loss=categorical_crossentropy, metrics=['accuracy'], optimizer=Adam())

  • 4개의 노드가 add되어 그대로 4개가 유지되었음을 확인할 수 있다.

실습

  • Functional API를 이용한 모델링 실습 진행

  • ADD Layer, Concatenate Layer를 통한 모델링 진행 및 기존 방법과 성능 비교

추가로 공부한 것

Dropout

  • dropout은 레이어의 일부 노드를 일부러 생략하는 regularization 방법론이다.
  • dropout 확률값을 정하여 각 노드별로 적용해, 매 미니 배치마다 랜덤한 노드가 drop된다.
    • 위의 그림에서 dropout rate = 0.4이다.
  • dropout은 주로 학습 시에 적용하며, 테스트 단계에서는 일반적으로 사용하지 않는다. (매 테스트마다 랜덤한 drop으로 인해 결과가 바뀌면 안되기 때문)

장점

Model Complexity & Overfitting in Machine Learning

  • 연산량을 줄이기 때문에 trade-off 관계인 모델의 편향을 줄인다.
    즉 모델의 과대적합을 방지한다.
  • 데이터가 충분할 경우 거의 모든 경우에서 더 좋은 일반화 성능을 보인다.

사용법

  • keras 모델링에서 Dropout 레이어를 연결하는 것을 통해 Dropout 적용이 가능하다.
il = Input(shape=(input_shape), dtype='int32')
hl = Dense(128, activation='relu')(il)
dl = Dropout(0.5)(hl) # 히든레이이어 dropout rate 50% 적용

소감

혼란으로 가득찼던 딥러닝 과정이 끝났다.

명쾌하게 무언가 배운 것 같지는 않고, 기계처럼 코드만 작성한 것 같아서 다소 찝찝하다.

앞으로 자연어 처리, CV 등 딥러닝 심화과정이 산더미처럼 남았는데, 배움을 통해 이번 과정을 통해 생긴 궁금증이 해소되기를 바란다.

또 커리큘럼에 의존하지 않고 지금처럼 나름대로 찾아 공부하는 것도 중요할 것이다.

post-custom-banner

0개의 댓글