Artificial Neural Networks with Keras

이수진·2023년 12월 2일
0

Neurons의 논리연산

적어도 입력이 둘은 있어야 출력 1개가 나온다. (뉴런이 활성화 된다)

퍼셉트론이란?

TLU(Threshold Logi unit), LTU(linear threshold unit)

TLU

  • 가중합을 계산한다 (input은 이진이 아니라 숫자)
  • step function으로 분류한다.

step function의 종류

  1. heaviside ⇒ 0/1로 나누어짐
  2. sgn ⇒ -1, 0, 1로 나누어짐

single TLU

  • 심플 선형 분류
  • 입력선형조합을 계산함
  • 임계값 넘으면 양성, 안넘으면 음성
  • 여기서 영향을 주는 가중치 (W)를 찾는 것이 주 목표이다

2개의 인풋과 3개의 아웃풋을 가지는 퍼셉트론

각각의 TLU는 모든 Input과 연결되어 있다. (한개의 층)

완전연결층의 출력을 계산하는 방법은 각각의 가중합을 계산한 뒤 활성함수에 넣는 것을 말한다.

바이어스는 모든 연결된 가중치에 포함된다.

가중치 업데이트

그 전의 가중치 + 학습률(오차)입력

퍼셉트론 수렴이론

각 출력 뉴런의 decision boundary를 선형으로 갖는 단층 퍼셉트론은 복잡한 문제를 학습할 수 없다 .

하지만 만약 트레이닝 샘플이 선형구분 된다면 해당 알고리즘은 정답에 수렴한다.

퍼셉트론의 한계

  1. 싱글 퍼셉트론은 클래스의 확률을 출력하지 않는다.

    이는 로지스틱 회귀를 퍼셉트론보다 더 선호하는 이유이다.

  2. XOR과 같은 문제는 풀지 못한다.

⇒ 따라서 MLP를 사용한다( 다층퍼셉트론)

다층 퍼셉트론과 역전파

입력층→은닉층→출력층으로 구성되어 있다.

입력층 → lower layer

출력층 → upper layer

은닉층 ⇒ bias 포함

MLP의 단점: 직관적으로 알기 어렵다 (Black BOX)

DNN

deep stack of computation을 말한다

deep stack of hidden layer

역전파 실행과정

  • 자동으로 Gradient Descent를 찾는다.
  • 네트워크 에러의 gradient를 찾는다.
  • error를 줄일 수 있는 가중치와 바이어스를 찾는다.
  • 정답에 수렴할 때 까지 역전파를 실행한다.

그 전의 가중치 + 학습률(오차)입력

  • 임의로 초반 가중치를 초기화 해야함
  • 가중치와 바이어스가 모두 0이면 모든 뉴런이 동일하다
  • 랜덤으로 가중치를 설정했다면 역전파가 필요하다

Forword Pass (순전파)

  • 하나의 미니배치를 갖고 각각의 통과를 에포크라고 한다.
  • 인풋레이어를 지나친 미니배치는 첫번째 히든레이어를 지난다.
  • 히든 레이어를 지나온 뉴런의 모든 아웃풋을 계산한다.
  • 아웃풋 레이어에 도달할 때 까지 이를 반복한다.

Backward Pass (역전파)

  • 아웃풋과 기대값의 차이를 구한다(에러)
  • chain rule을 적용한다.
  • 뒤로 돌아가면서 다음 가중치를 업데이트 한다.

활성함수(역전파)

  1. 스텝함수
    미분 불가능
  2. sigmoid 함수
    미분 가능, 0과 1사이로 나옴
  3. tanh함수
    연속, 미분가능, -1~1사이 값으로 나옴
  4. ReLU함수
    0에서는 구분하지 않고, 그 이후부터 구분함, 계산속도 올라감, 최대 출력값이 없음(한계X)

MLP 회귀

  1. 한개 값 예측하기 → single 출력 뉴런
  2. 다중회귀→ multiple 출력 뉴런

활성함수 (은닉층)

  1. 모든 범위 값 출력 → 활성함수 없음
  2. 항상 양수 출력 → relu
  3. 값이 양수면 양수, 아니면 0 →softPlus (relu업그레이드)
  4. 0~1 → logistic(시그모이드)
  5. -1~1 → tanh

loss function

  1. MSE (quadratic)
  2. MAE (linear)
  3. Huber loss (quadratic + linear)

Huber loss란?

2차와 1차 사이에 존재하는 loss fonction

2차의 장점: 빠르고 정밀

1차의 장점: 이상치에 덜 민감

임계값보다 에러가 작으면 quadratic, 임계값보다 에러가 크면 linear를 섞어 쓰는 Loss function

MLP 분류

  1. 이진분류
    1. logistic 활성함수 사용
    2. log loss 사용 (Cross entropy)
    3. 양성확률이 0~1 사이의 값으로 나옴, 1에서 빼면 음성
  2. multilabel binary 분류 (1,A)
    1. logistic 활성함수 사용
    2. log loss 사용 (Cross entropy)
    3. 아웃풋 뉴런이 1개의 레이블 마다 1개씩 있음
  3. multiclass 분류 (1 or 2 or 3)
    1. softmax 활성함수 사용 (은닉층은 ReLU)
    2. log loss 사용
    3. 각 클래스마다 확률 나옴(합은 1)
    4. 아웃풋 뉴런이 1개의 클래스마다 1개씩 있음

시퀀셜 라이브러리 (API)

: 케라스 신경망 모델

  • 순서대로 1층씩 쌓아서 시퀀셜이라고 함

층 만들고 학습시키기

add로 추가할 것

flatten(입력 이미지 1차원 배열)

dense(은닉층 추가) , 앞에 뉴런개수 설정 가능, activation 함수 설정 가능

  • dense의 마지막은 softmax로 설정해 분류가 가능하게 한다.

summary() → 각 층의 정보 확인 가능

각 층의 파라미터는 이전 층의 뉴런 개수*지금 뉴런의 개수

파라미터 접근을 위한 메서드

  • set_weights()
  • get_weights()

가중치를 랜덤으로 초기화할 수 있다. 원한다면 kernel_initializer, bias_initializer()로 설정 가능

complie → 손실함수와 옵티마이저 지정

loss 방법, 옵티마이저 방법, 점수 기준 설정

loss 설정

if) 다중클래스라면

if) 샘플마다 클래스별 타깃 확률을 가진다면 [[0.5, 0.5], [1, 0]]→ categorial_crossentropy

if) 샘플마다 레이블이 정수로 되어있다면[1, 2] → Sparse_categorial_crossentropy

if) 이진, 다중레이블이라면 → sofrmax 대신 sigmoid / binary_crossentropy

sparse label을 one-hot-vector를 사용해 categorial로 바꿀 수 있다.

옵티마이저 설정

SGD, ADAM 등

lr (학습률)설정 가능 → 기본값 0.01

fit → 모델 학습

  • validation set 설정 가능
  • training set 이 validtion보다 너무 좋다면 overfitting

history

파라미터, 에포크, val set에 대한 손실 측정한 지표

그래프를 그렸을 떄 검증손실은 에포크가 실행되고 나서 계산되고, 훈련손실은 에포크 진행동안 계산되기 때문에 훈련 손실이 에포크의 절반만큼 왼쪽으로 이동해야 한다.

치우친 데이터의 경우

Skewed data

class_weight → 과소표현된 클래스에 더 큰 가중치, 과대표현된 클래스에 더 작은 가중치 주기

per-instance weight → 일회용 가중치

파라미터 튜닝

층 수 , 층 속 뉴런 수, 활성함수 타입, 배치사이즈 등을 바꿔본다.

검증 정확도가 만족스러우면 테스트셋으로 일반화 오류를 측정한다. (검증보다 테스트가 성능 낮은게 일반적)

evaluate 사용

모델 사용해 예측하기

predict 사용

샘플별 각 클래스별로 확률 도출된다.

predict_class 사용하면 샘플의 클래스가 뜬다.

회귀용 MLP 만들기

분류와 다른 점

  1. 출력층이 하나의 뉴런이다.
  2. 활성화 함수가 출력층에 없다
  3. MSE사용된다. (loss function)

분류와 같은 점

  1. 시퀀셜 API 사용한다.

더 복잡한 모델을 만들 때 Functional API

wide and deep 모델

: 입력의 일부, 전체가 출력층과 바로 연결된다.

  • 일반적 MLP는 네트워크에 있는 층 전체에 모든 데이터를 통과시킨다. → 연속변환은 데이터 흐트러질 수 있음
  • 층이 만들어지자마자 함수처럼 호출된다. (파라미터로 입력층과 은닉층1을 호출한다)
  • concat을 사용해 input 과 은닉층을 연결시킨다.
  • 회귀이므로 출력층에 활성함수 없음

모델은 인풋과 아웃풋만을 정의하고 끝난다.

wide conponent → 일반화된 선형모델을 말한다.

deep component→ feed-forward 모델을 말한다.

일부 특성을 짧은 경로로 전달, 다른 경로를 깊은 경로로 전달할 때 사용된다.

이때, 따로따로 계산한다 (A, B라고 두고 train, test, val 모두 따로따로 계산)

  • fit , eval, predict 모두 괄호로 묶어 계산

multiple output을 가질 때

  1. 여러 출력이 필요할 때 (너비, 높이)
  2. 동일한 데이터에서 독립적인 여러 작업이 필요할 때 (1. 표정, 2. 안경유무)
  3. 규제기법을 사용하는 경우

규제기법

: 보조출력을 추가하는 경우 → 과적합을 줄여 일반화 능력을 향상시킨다.

  • 적절한 층에 연결시키고 출력리스트에 추가한다.
  • 네트워크의 기본 부분이 나머지 부분에 의존하지 않고 자체적으로 유용한 것을 학습하도록 한다.
  1. extra output을 추가한다.
  2. 각각의 로스함수를 갖는다
    모델 컴파일 시 손실 리스트를 전달해야 한다
    보조 출력보다 주 출력에 관심이 많다면 주출력에 가중치 키운다. (주로 보조 출력을 규제로 사용)
  3. 각 레이블을 부여한다. (주, 보조출력의 예측이 같다면 두개 다 같게 둔다)

Subclassing API 사용하는 경우

:동적 모델 만들 때

시퀀셜과 함수형은 선언적이다.

사용 층, 연결 방식 정의 후에 데이터를 주입해 학습한다.

장점

  1. 모델을 저장, 복사, 공유하기 쉽다.
  2. 모델의 구조를 파악하기 쉽다.
  3. 프레임워크의 크기를 짐작하고 타입을 확인해 에러를 줄일 수 있다
  4. 디버깅하기 쉽다.

단점

  1. 정적인게 단점

장점

서브클래싱 API는 반복, 다양한 형태 등 구현이 가능

  • 모델 클래스 만들고 생성자 안에서 필요 층 만들기
  • call 메서드 안에서 수행연산 기술
  • input 객체가 필요없다. (call의 input()사용하면 됨)

단점

  1. 공유, 저장, 복사 어려움
  2. 사전에 종류나 모양을 파악하기 어려움
  3. 실수 만들기 쉬움
  4. summary시 층의 리스트밖에 못얻음(정보없음)
  5. 유연성 높아지면 비용 발생

subclassing에서는 model.save 사용 불가능하므로 save_weight(), load_weighr() 사용해야한다.

CallBack 사용

조기종료 사용

  1. 훈련이 몇시간동안 진행되는 경우 체크포인트 필요
  2. 일정 에포크 동안 검증셋의 점수 향상이 안되면 stop (patience) → 에포크 커도 됨

EarlyStopping → 종료에 관여, 직후 어떤 모델의 가중치를 return할지 설정 가능

ModelCheckPoint → 저장에 관여, 직후 어떤 모델의 가중치 리턴할지 관여 안함

두개 같이 사용 가능

Custom callback

검증 로스와 훈련 로스의 비율을 훈련동안 정하기 가능

텐서보드로 시각화 하기

  1. 학습곡선 그리기
  2. 여러 실행간의 학습곡선 비교
  3. 계산그래프 시각화
  4. 통계분석
  5. 모델생성 이미지
  6. 3D에 투영된 다차원 데이터 시각화

텐서보드 서버

  1. 로그 디렉토리 모니터링
  2. 자동으로 변경사항 읽기
  3. 실시간 데이터 시각화

루트디렉토리 밑에 다른 디렉토리 설정해 기록해 여러번 실행 가능 → 훈련하는 동안 이벤트 파일 만들고 서머리 기록

실행마다 하나의 디렉토리 설정, train, validation으로 서브디렉토리 설정

train에는 성능 병목지점 찾는 profileing trace 존재

summary package

  1. 스칼라
  2. 히스토그램
  3. 이미지
  4. 텍스트
  5. 오디오

기록 가능

하이퍼 파라미터 파인튜닝

  1. 많은 파라미터 조합 실행해보고 val set에서 가장 좋은 성능을 내는 파라미터로 설정하기

    하이퍼파라미터 공간 탐색 필요

    1. 케라스 모델을 사이킷런 추정기처럼 보이게 바꾼다
    2. 케라스 모델 만들고 컴파일한다.
    3. build model 사용해 케라스회귀 객체 만든다

    사이킷런은 손실이 아니라 점수를 계산하기 때문에 음수의 MSE나온다.

    이때 randomized search가 많이 사용된다→ 하이퍼파라미터 객체가 많기 때문이다.

    1. 검증셋에서 제일 좋은 결과 찾는댜 (val 따로 필요 없음 → k-fold 사용함)
    2. test set으로 일반화 오류 찾기

훈련에 시간이 많이 걸리면 탐색할 파라미터 공간에 제약이 생긴다. → 수동으로 탐색과정을 보조할 수 있으나 시간 많이 든다.

탐색 지역이 더 좋다고 판명될 때 더 탐색을 수행하는 방법이 있음

히든레이어의 수

은닉층이 하나인 MLP여도 뉴런개수 충분하면 복잡한 함수를 모델링 할 수 있다.

하지만 복잡한 문제에서는 심층신경망이 더 좋음

훨씬 적은 양의 뉴런을 사용하므로 성능올라감

과적합 전까지 은닉층 개수 늘린다.

층 증가할수록 뉴런 개수는 줄인다.

그러나 데이터셋에 대해 같은 뉴런수를 쓰기도 하고, 첫번째 층의 뉴런을 다른 것 들보다 아주 키우기도 한다

실전에서 조기정지, 정규화사용하고, stretch pants (늘릴만큼 늘리고 점차줄이는 방법) 사용

  1. 병목현상 막기
  2. 한 층이 너무 적은 뉴런을 가지면 충분한 표현력을 갖지 못한다.

학습률

최적 파라미터는 최대학습률/2이다.

점진적으로 매우 큰 학습률까지 키워본 다음 수백번 반복해 학습

처음에는 학습률의 손실이 줄어들지만 점차 는다 → 늘어나기 직전이 최적 파라미터

배치사이즈

매우 큰 배치는

  1. GPU같은 하드웨어 가속기를 효율적으로 사용
  2. 초당 많은 샘플 처리 가능

but

  1. 훈련 초기 불안정한 훈련
  2. 좋지 못한 일반화 성능

학습률 예열 방법 쓰면 됨

램에 맞는 최대배치 사이즈 쓰면 됨

활성함수, 반복 수

활성함수

  • 일반적으로 은닉층은 ReLU

반복횟수(에포크)

  • 일반적으로 사용필요 없음
  • 조기종료로 사용(대치가능)

하이퍼파라미터를 수정하는 경우 다른 하이퍼 파라미터를 업데이트 해야한다.

최적의 학습률은 다른 파라미터에 의존적이다.

profile
뇽안

0개의 댓글