개발/머신러닝

[요약] 핸즈온 머신러닝 - 10. 케라스를 사용한 인공 신경망 소개

소년택이 2022. 6. 9. 08:55

인공신경망 ANN

생물학적 신경망 BNN

  • ANN 은 BNN 의 구조를 본따 만듬.
  • 그렇다고 실제 신경망을 흉내낼 필요는 없음.
    • 어짜피 인간은 진짜 뇌의 동작을 규명하지 못하고 있음.
    • 비행기는 날개를 펄럭이지 않음.
  • 현대 ANN 은 이미 BNN 으로 부터 많이 멀리 와있음.

과거와의 비교

  • 학습을 위한 데이터가 늘어남.
  • 컴퓨팅 파워의 급격한 증가.
  • 훈련 알고리즘 향상.
  • 일부 이론적 제약들이 실제에서는 큰 문제가 되지 않거나, 지역 최적점에 수렴할 확률이 매우 적음을 밝혀냄.

 

인공신경망의 구조

인공 뉴런

  • 실제 뇌의 뉴런을 모사. 
  • 뉴런과 뉴런을 연결하고, 입력이 일정 수준(=개수) 이상일 경우(=활성화) 출력하는 구조.
  • 간단한 논리 연산 가능 : AND, OR, NOT
  • 한계 : XOR 을 해결할 수 없음.

퍼셉트론

  • TLU (Threshold Logic Unit)
  • 입력 X 가중치 한 값을 계단함수 통과 후 출력 : $h_{w}(\textbf{x})=step(\textbf{w}^T\textbf{x})$
  • 계단 함수로 heaviside, sign function 등을 사용할 수 있다.
  • TLU 를 훈련한다 == 가중치 벡터 $w$ 의 값을 찾는다.
  • 모든 TLU 는 편향뉴런 $x_{0}=1$ 로부터 입력을 받으며 가중치 $w_{0}$는 편향에 대한 값이다. 단 도식화 시에 편향 뉴련은 생략해도 된다.
  • 한계 : XOR 을 해결할 수 없음.

따라서 여러개의 TLU 로 구성 한 하나의 퍼셉트론 완전 연결층의 출력을 수식화 하면 다음과 같다.

$h_{w,b}(\textbf{X})=\phi(\textbf{XW}+\textbf{b})$

편향과 가중치의 곱 행렬은 $b$로 분리해서 표기 함.

다층 퍼셉트론 MLP

  • 퍼셉트론을 2개 이상의 층으로 쌓으면 어떨까? >> XOR 을 해결 할 수 있다!
  • 입력층 > 은닉층s > 출력층 으로 구성
    • DNN : 은닉층이 많음.
    • 딥러닝 : DNN 을 학습.
    • 현대는 컴퓨팅 파워가 강력하여 "딥" 의 정의가 큰 의미가 없음.
  • 역전파 : MLP 를 위한 획기적인 훈련 방법.
    1. 예측 : 네트웍을 정방향으로 한번 통과시킨다.
    2. 오차 : 예측값과 실제 값을 비교한다.
    3. 전파 : 네트웍에 역방향으로 오차를 전파하여 각 연결 별 기여도(그레디언트)를 계산한다. 
    4. 조정 : 오차가 감소하도록 가중치를 조정한다.
  • 일부 훈련에 대하여 1회의 훈련을 수행하는것을 배치batch 라 한다.
  • 전체 훈련 세트하여 배치 학습을 완료하는것을 에포크epoch 라 한다.

 

활성화 함수

  • TLU 의 출력을 처리하는 함수. 퍼셉트론 수식의 $\phi$에 해당.
  • 다양한 수식을 쓸 수 있다
    • heaviside (계단함수)
    • sgn (부호가 있는 계단함수)
    • sigmoid
    • 하이퍼볼릭 탄젠트 함수
    • ReLU 함수
    • softplus 함수

활성화 함수의 기울기
역전파를 이용한 학습을 하려면 경사하강법을 써야 하는데, 그러러면 기울기가 필요하다. 계단 함수는 기울기가 없으므로 학습이 불가하다. 대신 sigmoid 와 같이 극값에서 연속이고, 미분 가능한 활성화 함수를 사용함으로써 다층 퍼셉트론의 역전파 학습이 가능해졌다.

생물학적 비유와 오해
생물학적 뉴런이 자극에 sigmoid 형태로 반응하므로 오랫동안 이를 모사해왔으나, 이후 ReLU 와 같이 전 미분 불가능한 함수가 성능이 더 좋을 수 도 있음을 알았다. ReLU 는 0 에서 미분 불가하지만, 0 보다 큰 값에 대해서는 매우 단순한 기울기 (=1) 를 가지므로 계산속도가 매우 빠르며 실제 환경에서는 아주 잘 동작한다.

활성화 함수의 비선형성
함수안에 함수 형태로 아무리 많은 선형수식을 연결 시켜도 하나의 선형수식으로 전개가 가능하다. 따라서 활성화 함수가 선형이라면 멀티 레이어가 의미가 없어지며 단일 레이어 수식으로 정리가 되어버린다. 활성화 함수가 비선형 이므로 멀티 레이어가 의미를 가지게 된다. 이론적으로 충분히 큰 심층 신경망은 어떠한 형태의연속 함수도 근사할 수 있다.

회귀
변량, Feature 또는 차원 별로 출력 레이어에 활성화 함수가 없거나 (y=x) 범위형 (ReLU) 활성화 함수를 적용한 다음 MSE 를 비용함수로 사용하는 회귀 모델을 학습할 수 있다.

분류
출력 레이어에 softmax 나 (배타적 분류), 로지스틱 함수 (다중 레이블 분류) 를 활성화 함수로 써서 구현할 수 있다.

 

케라스로 다층 퍼셉트론 구현하기

API 활용

시퀀셜 API

  • keras.models.Sequential()
  • 모델 인스턴스를 생성하고 필요한 Layer 를 하나씩 추가함.
  • 또는 모델 인스턴스 생성 시 필요한 Layer 리스트를 전달함.
  • 명시한 Layer 순서대로 완전 연결 다층 퍼셉트론을 생성한다.
  • 구성 요소
    • Dense : 완전 연결층
      • activation : 활성화 함수
      • kernel_initializer : 연결 가중치 초기화 전략
    • Concatenate : 레이어 병합
    •  

함수형 API

  • Layer 정의 시 입력 레이어 (입력층 또는 직전 레이어) 를 명시한다.
  • keras.layers.Concatenate() 를 이용하여 서로 경로가 다른 두개 이상의 네트워크를 합칠 수 있다.
    예) 와이드 & 딥 신경망
  • 인풋과 아웃풋을 여러개로 정의할 수 있다.
    • N개의 샘플에 대하여 (중복을 포함하여) x개의 파라미터는 입력 1로, y 개의 파라미터는 입력 2로 정의할 수 있다.
    • 은닉층의 결과를 중간(or 보조)출력으로 활용할 수 있다.
    • 보조출력을 이용하여 부분 네트워크의 출력을 확인거나 제약으로 쓸 수 있다.

모델 저장과 복원

  • 학습이 완료한 모델을 저장 (save) 하거나, 저장한 모델을 복원 (load_model) 할 수 있다.
  • 콜백 함수를 지정하여 이벤트 처리, 학습 중 snapshot 저장, 조기 종료를 구현할 수 있다.

 

튜닝

은닉층

  • 뉴런 개수가 무한하다면 한개의 층으로도 모든 함수를 근사할 수 있다.
  • 같은 개수의 뉴런이라면 단층 모델 보다, 다층 모델이 정확하고 학습이 빠르다.
  • 은닉층의 뉴런 개수가 차원수 보다 적으면 데이터는 유실된다. 동시에 이 손실은 다음 레이어에서 복구할 수 없다.
  • 스트레치 팬츠 방식 : 차라리 크고 아름다운 모델을 학습시키다 조기 종료 해버리는게 딱 맞는 은닉층 스펙을 찾는것 보다 나음.

전이 학습

  • 복잡한 모델을 한꺼번에 훈련시키는건 어렵다.
  • 저수준 구조를 먼저 학습 시킨 후, 해당 네트웍을 재사용하여 고수준 구조를 학습 시킬 수 있다
    • 저수준 구조 (예: 얼굴 형)을 학습하여 네트워크A 를 구성한다.
    • 네트워크A 보다 더 많은 레이어를 가지는 네트워크B를 정의한다.
    • 네트워크B의 하위  레이어를 네트워크A 에서 학습한 가중치와 편향으로 갈음한다.
    • 고수준 구조 (예: 머리 형태)를 추가로 학습하여 네트워크B 를 완성한다.

그 외 튜닝 포인트

학습률
속도 vs 과대적합의 트레이드 오프 관계이다. 다양한 학습률로 학습해 보고 최적점을 찾는것이 가장 좋은 방법이다.

옵티마이저
11장에 설명.

배치 크기
큰 배치 크기는 일반화 성능에 영향을 미치지 않고 훈련 시간을 매우 단축한다. 학습 예열 기법을 통해 다양한 크기 배치에 대해 학습을 해볼 수 있다.

활성화 함수
일반적으로 ReLU 가 갑이다.

반복 횟수
반복 횟수를 튜닝하는것은 큰 의미가 없다. 대신 조기종료.