hwijin97 2021. 11. 10. 01:27

 

 10.1 생물학적 뉴런에서 인공 뉴런까지

많은 강력한 머신러닝 기술들이 개발되었지만, 인공 신경망이 현재 커다란 영향을 줄 근거

- 많은 데이터

- 컴퓨터 파워의 발전

- 훈련 알고리즘 향상

 

10.1.1 생물학적 뉴런

수상돌기dendrite, 축삭돌기axon, 축삭끝가지telodendria, 시냅스 말단synaptic terminals, 활동 전위action potential, 신경 전달물질neurotransmitter등 으로 이루어져 있다. 이를 통해 화학적 신호 -> 전기적 신호 -> 화학적 신호로 전달한다.

 

10.1.2 뉴런을 사용한 논리 연산

이 뉴런을 이용해 인공 뉴런을 고안했다. 하나 이상의 이진 입력과 하나의 이진 출력을 가진다. 각 뉴런은 일정 입력이 활성화 될 경우 출력을 내보낸다.

 

10.1.3 퍼셉트론

퍼셉트론perceptron 은 가장 간단한 인공 신경망 구조중 하나이다. TLU threshold logic unit, LTU linear threshold unit으로 불린다

입력마다 가중치값이 있고, 입력값과 가중치의 곱의 합을 계단함수 step function을 적용한뒤 결과를 출력한다.

 

헤비사이드 계단 함수heaviside step function

heaviside(z) = 0 (z < 0) , 1 (z >= 1)

sgn(z) = -1 (z < 0) , 0 (z = 0), 1 (z > 1)

 

퍼셉트론이 한 층에 있는 모든 뉴런이 이전 모든 뉴런과 연결되어 있을 때 완전 연결층fully connected layer 밀집 층dense layer라고 한다. 입력 층은 입력 뉴런과 편향특성이 더해져서 구성된다.

 

X : 입력 특성 행렬

W : 편향을 제외한 가중치 행렬

b : 편향 벡터

phi :  활성화 함수activation function

 

 

퍼셉트론 훈련

 

-- 헤브의 규칙Hebb's rule

w_i,j : 입력 뉴런 i 와 j 를 연결하는 가중치

x_i : 현재 훈련 샘플의 i 번째 뉴런 입력

y_j_hat : 훈련 샘플의 j 번째 뉴런의 출력값

y_j : 현재 훈련 샘플의 j 번째 뉴런의 타깃값

eta : 학습률

 

퍼셉트론 수렴 이론

훈련 샘플이 선형적으로 구분될 수 있으면, 이 훈련은 정답에 수렴한다.

 

 10.1.4 다층 퍼셉트론과 역전파

하나의 입력층, 하나이상의 TLU층인 은닉층, 출력층 으로 구성된다.

입력층과 가까우면 하위 층, 출력에 가까운 층을 상위 층 이라고 한다.



이러한 다층 퍼셉트론을 훈련하기 위해서 역전파backpropagation 을 이용한다.

네트워크를 두번 (정방향, 역방향) 통과 하는 것만으로 모든 모델 파라미터에 대한 네트워크 오차의 그레디언트를 계산가능하다. 

그레디언트를 구하면 평범한 경사 하강법을 수행하면서 훈련한다.

역전파에서는 후진 모드 자동 미분reverse-mode autodiff 를 사용한다.

 

역전파 과정

 

하나의 미니배치씩 진행하여 모든 훈련세트를 처리하는 일련의 과정을 에폭epoch 이라고 한다.

미니배치를 입력층, 은닉층, 출력층 까지 계산하는 과정을 정방향 계산forward pass 라고한다.

알고리즘이 네트워크의 출력 오차를 측정한다. (손실함수 사용하여 기대 값과, 실제 값을 비교한다.)

각 출력 연결이 오차에 기여하는 정도, 그 이전 층이 기여하는 정도를 반복해서 입력층에 도달 할 때 까지 기여도를 계산한다. 연쇄 법칙chain rule 을 적용한다.

이 그레디언트를 각 가중치에 적용한다.

 

기존의 계단함수에는 수평선 밖에 존재하지 않기 때문에 기울기가 0 으로 계산할 그레디언트가 없지만,

이 계단함수를 로지스틱함수로 정의하면, 어느 곳에서도 0 이 아닌 그레디언트로 정의 되기 때문에, 수렴을 도와준다.

시그모이드 함수

다른 활성화 함수

하이퍼 볼릭 탄젠트 함수
ReLU 함수

활성화 함수가 필요한 이유

활성화 함수가 없는 선형 변환의 조합에는 동일한 선형 변환이 출력되기 때문에, 복잡한 문제를 해결하지 못한다.

비선형 활성화 함수가 있으면 충분히 큰 선형 변환으로 어떤 연속함수든 근사할 수 있다.

 

 

10.1.5 회귀를 위한 다층 퍼셉트론

 

회귀용 다층 퍼셉트론을 구성할 때는 출력 뉴런에 활성화 함수를 사용하지않고 어떤 범위의 값도 출력 되도록 한다.

그런데 값의 범위를 지정하고 싶다면, Relu, softplus, 로지스틱, 하이퍼볼릭 함수를 이용해서 레이블의 스케일을 적절한 범위로 조정가능하다.

훈련의 손실함수는 보통 평균 제곱오차를 사용하는데, 훈련 세트에 이상치가 많으면 평균 절대값오차, 이 둘을 조합한 후버Huber손실을 사용할 수 있다.

 

 

10.1.6 분류를 위한 다층 퍼셉트론

 

이진 분류 문제에서 로지스틱 활성화 함수를 가진 하나의 뉴런을 통해 예측확률로 해석가능하다.

각 샘플이 여러 클래스중 단 하나의 클래스에만 속해야 할 경우 softmax 활성화 함수를 통해 각 클래스에 속할 확률을 출력가능하다.

 

 

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



케라스를 수행가능한 다양한 딥러닝 라이브러리 백엔드 :

텐서플로, 마이프로 코그니티브 툴킷, 시애노

아파치 MXNet, 애플 CoreML, PlaidML

 

케라스와 비슷한 라이브러리 :

파이토치

 

10.2.1 텐서플로 2 설치

10.2.2 시퀀셜 API로 이미지 분류기 만들기

 

데이터셋 : 한번 스케일 조정하여 훈련한 모델에는 계속해서 스케일 조정을 필요로 한다.

Sequential 모델 : 순서대로 연결된 층을 일렬로 쌓아서 만든다.

InputLayer : 입력 층, 형태를 지정함

Flatten : 입력 데이터를 reshape( - 1, row * col ) 을 계산하고 어떤 파라미터도 가지지않는다.

Dense : 행렬에 층이 뉴런과 입력 뉴런사이의 모든 연결 가중치를 포함한다.

summary : 모델에 있는 모든 층과 이름, 파라미터 개수를 출력한다.

 

 

Dense 

많은 파라미터를 가지고, 충분한 유연성을 가지지만 과대적합의 위험을 갖는다. 특히 데이터 수가 적을 때 위험하다.

초기에 연결 가중치를 무작위로, 편향을 0으로 초기화한다.

kenel_initializer, bias_initializer 으로 설정 가능하다.

 

model.layers 

모델의 층을 반환하고, model.layers[인덱스] 또는 model.get_layer[이름] 으로 접근 가능하다.

 

input_shape

모델에 입력 크기를 지정해주지 않으면, 모델을 빌드(실제 데이터를 주입하여 훈련)하기 전까지 대기하고, 모델이 빌드를 시작하려고할 때 층이 가중치를 가지지 않는다면(입력 크기가 지정되지 않으면) 특정 작업을 수행할 수 없다.

 

model.compile

사용할 손실 함수와 옵티마이저optimizer, 평가지표를 지정한다.

 

sparse_categorical_crossentropy

mnist 의 경우 레이블이 정수 하나로 이루어져 있고, 클래스가 베타적으로 0~9로 이루어져 있으므로 sparse_categorical_crossentropy를 사용한다.

 

categorical_crossentropy

레이블이 베타적이고, 원-핫 인코딩 되어있으면, categorical_corssentropy 로스를 사용한다.

sparse lable을 keras.utils.to_categorical() 함수를 통해 원-핫 벡터로 변환 가능하다.

 

binary_corssentropy

이진 분류나, 다중 레이블 이진 분류를 수행한다면, softmax 함수 대신, sigmoid 함수를 사용하고, binary_crossentropy 로스를 사용한다.

 

SGD

옵티마이저에 sgd를 지정하면 기본 확률적 경사 하강법을 사용하여 모델을 훈련시킨다. 즉 역전파 알고리즘을 수행한다.

SGD에서는 학습률 튜닝이 중요하다. 기본값은 learning_rate=0.01 이다.

 

accuracy

모델의 훈련과 평가를 정확도로 측정한다.

 

model.fit

에폭회수를 지정하고, validation_data 로 검증 데이터를 입력하거나, validation_split으로 검증세트에 사용할 훈련세트의 비율을 정할 수 있다.

클래스들의 등장 빈도가 달라 훈련 세트가 편중되어 있다면, class_weight를 통해 적게 등장하는 클래스의 가중치를 높일 수 있다.

샘플별로 가중치를 부여하고싶으면, sample_weight를 사용가능하다. 레이블 할당이 전문가에 의해서 된 샘플과 클라우드 소싱을 통해서 된 샘플의 경우 가중치를 다르게 하여 훈련시킬 수 있다.

validation_data 튜플의 세번째 값으로 샘플 가중치를 입력할 수 있다.

fit 함수가 반환하는 History 객체에 history.params, history.epoch, history.history 를 가진다. 혼련한 모델 파라미터, 에폭, 검증 세트에 대한 손실과 지표를 의미한다.

 

History

훈련 손실과 검증 손실을 볼때, 검증 손실을 훈련 에폭이 끝난뒤 계산되므로 훈련 손실을 한칸 앞당겨봐야한다.

충분히 오래 훈련하면 훈련 성능이 검증 성능을 앞지르는데 그래도 검증 성능이 줄어든다면 수렴하지 않은것이고,

성능이 충분히 만족스럽지 않다면 처음부터 하이퍼파리미터를 튜닝하고 다시 훈련한다.

하이퍼 파라미터를 조정하면 꼭 다시 학습률을 조정해야 한다.

학습률, 옵티마이저, layer 층 개수, layer 뉴런 개수, 활성화 함수, batch_size ...

 

Evaluate

테스트 세트로 모델을 평가한다. batch_size, sample_weight 도 지원한다.

 

Predict

새로운 샘플에 대한 예측을 만든다.

 

 

10.2.3 시퀀셜 API를 사용해서 회귀용 다층 퍼셉트론 만들기

 

10.2.4 함수형 API를 사용해 복잡한 모델 만들기

딥 & 와이드 신경망의 구조는 복잡한 패턴과 간단한 규칙을 모두 학습할 수 있다. 반대로 MLP는 층의 네트워크에 모든 데이터를 통과시켜 왜곡될 수 있다.

함수형 층을 만들기 위해서는 레이어 객체를 만들면서 함수처럼 이전의 층을 입력으로 받아 만들어진다. 이는 연결될 방법을 알려주는 것이고 아무런 데이터 처리도 하지 않은 상태이다.

 

Concatenate

Concatenate층은 함수처럼 호출해서 여러 입력을 하나로 연결 해주는 역할을 한다.

 

여러개의 입력

데이터를 다른 부분으로 보내고 싶을때, 예를 들어 어떤 특성들은 간단한 규칙을가지고, 어떤 특성은 복잡한 패턴을 만들어 내고싶을 때

 

여러개의 출력

여러개의 출력이 필요할 때, 예를 들어 이미지의 주요 물체와 그 위치를 출력해야 할때. 분류작업과 회귀 작업을 함께한다.

동일한 데이터에서 여러 작업을 수행할 때. 얼굴 사진으로 다중 작업 분류를 수행할 때.

규제 기법으로 사용할 때.

 

10.2.5 서브클래싱 API로 동적 모델 만들기

기존 모델방식은 층과 연결방식을 선언한 후 데이터를 주입하는 방식으로 모델 저장, 복사, 공유, 구조분석 등이 쉽다.

그러나 동적 구조를 필요로 할경우 명령형 프로그래밍인 서브클래싱 API를 이용한다.

 

__init__

클래스에 keras.models.Model 을 상속받고 생성자에 필요한 층을 만든다.

call

call 메서드 안에 수행하려는 연산(모델 구조를 만들고)을 기술하고 함수형 모델과 같이 호출하여 사용한다.

 

모델 연결

keras 의 모델은 각 층으로 사용할 수 있어서 더 복잡한 구조를 만들 수 있다.

 

제한

call 메서드 안에 정의된 모델 구조는 분석될 수 없어 높은 유연성이 필요하지 않는다면 이외의 모델 구조를 사용하는 것이 좋다.

 

 

10.2.6 모델 저장과 복원

 

케라스는 HDF5 포맷을 사용한다. model.save()를 사용하면 SavedModel 포멧으로 저장되고, 파일의 확장자가 '.h5' 이거나 save_format 매개변수를 'h5'으로 지정하면 HDF5로 저장한다.

HDF5포멧은 모델 구조, 모델 파라미터, 옵티마이저를 저장한다.

 

모델 서브클래싱 저장

서브클래스 구조는 모델의 구조가 정해져 있지 않기때문에, 모델을 저장할 수 없다.

그래서 model.save_weights(), model.load_weights() 을 이용해서 모델 파라미터를 저장하고 복원한다.

 

 

10.2.7 콜백 사용하기

 

keras.callbacks.ModelCheckpoint

callbacks 객체를 이용해서 에폭의 시작, 끝, 배치 처리 시작, 끝 호출 가능하다.

save_best_only=True 이면 검증 세트 최고 점수 모델만을 기록해서 훈련을 오래지속해도 과대적합된 모델을 사용할 걱정이 없다.

 

keras.callbacks.EarlyStopping

일정 에폭동안 검증 세트에 대한 점수가 향상되지 않으면 훈련을 멈춘다. 선택적으로 최상위 모델을 복원 가능하다.

모델이 향상되지않으면 훈련이 자동종료되기 때문에 에폭수를 크게 해도 상관없다.

 

사용자 정의 콜백

훈련동안 훈련 과정을 확인할 사용자 정의 연산을 수행할 수 있다.

on_ epoch / train / batch _ begin / end 를 구현 할 수 있다.

 

 

10.2.8 텐서보드를 사용해 시각화하기

인터렉티브 시각화 도구로 학습곡선 그리기, 비교하기, 계산 그래프 시각화, 통계 분석

3D에 투영된 다차원 데이터 시각화, 자동 클러스터링 등 많은 기능을 제공한다.

 

텐서보드 서버는 로그 디렉터리를 모니터링하고 변경된 사항을 읽어 그래프를 업데이트한다.

보통 루트 로그 디렉터리를 서버가 모니터링하고, 프로그램이 실행할 때마다 서브 디렉토리에 이벤트를 기록한다.

데이터는 이벤트 파일이라는 특별한 이진 로그 파일에 출력해야 하고 이진 데이터 레코드를 서머리 라고 부른다.

 

텐서보드 웹 인터페이스에서 훈련때 기록된 정보들을 그래프로 볼수 있고, 학습된 가중치, 프로파일링 트레이스 등을 볼 수 있다.

 

 

10.3 신경망 하이퍼 파라미터 튜닝하기

신경망의 유연성은 하이퍼파라미터 튜닝에서 어떤것이 최적인지 찾기 힘들게하는 단점이 있다.

자동으로 튜닝해서 더 적은 시간에 더나은 솔루션을 만드는 라이브러리들이 있다.

- Hyperopt

모든 종류의 복잡한 탐색 공간에 최적화를 수행함

- Hyperas, kopt, Talos

케라스 모델을 위한 최적화

- 케라스 튜너keras tuner

사용하기 쉬운 케라스 최적화

-Scikit-Optimize(skopt)

범용 최적화

-Spearmint

베이즈 최적화

- Hyperband

Hyperband 논문을 기반으로 최적화

-Sklearn-Deap

진화 알고리즘evolutionary 기반의 최적화

 

10.3.1 은닉층 개수

복잡한 문제에서 심층 망이 얕은 신경망보다 파라미터 효율성parameter efficiency 가 훨씬 좋다. 복잡한 모델은 보통 계층구조를 가지기 때문에 오히려 모델링 하는데 훨씬 적은 수의 뉴런을 사용한다.

계층구조는 심층 신경망이 빠르게 수렴할 수 있도록 도와주고, 새로운 데이터의 일반화 능력도 향샹시켜준다. 저수준인식을 공유하는 모델에서 기존 잘학습된 모델의 저수준 층의 파라미터를 이용하여 고수준 구조만 학습하게 할 수있다. 이를 전이 학습transfer learning 이라고 한다.

 

10.3.2 은닉층의 뉴런 개수

보통 깔때기 형식으로 각층을 줄여 저수준 특성을 고수준 특성으로 합치는 형태로 구성한다. 그런데 층마다 같은 뉴런개수로 해도 동일하거나 더좋은 성능을 낸다. 이렇게하면 튜닝할 파라미터가 층마다에서 하나로 줄어든다.

층의 개수, 뉴런의 개수는 네트워크가 과대적합되기 전까지 점진적으로 뉴런을 늘릴 수 있지만,

실전에서는 필요한 것보다 더많은층과 뉴런을 가진 모델을 선택하고 과대적합되지 않도록 조기종료나, 규제기법을 사용하는편이 간단하다고 한다. 이를 스트레치 팬츠라고한다. ㅋㅋ

이 방식은 병목이 될수 있는 문제층을 피할 수 있다. 뉴런수가 적은 층은 유용한 정보를 충분히 포함할 수 없다.

 

 

10.3.3 학습률, 배치크기, 등등...

 

학습률

최적의 학습률은 발산하는 최소 학습률의 절반 정도라고 한다. 좋은 학습률을 찾으려면 매우낮은 값에서 점진적으로 수백번 반복해서 그래프로 나타내 높은 학습률에서 상승하는 지점보다 낮은 지점이 일반적으로 최적인 값이다.

 

옵티마이저

옵티마이저의 종류를 선택하거나, 옵티마이저의 하이퍼파라미터를 튜닝하는 방법. 11장

 

배치 크기

큰 배치크기는 하드웨어 가속기를 효율적으로 사용가능하게 한다.

배치크기는 보통 GPU Ram 용량에 맞추지만, 배치 크기가 크면 훈련초기에 불안정할 수 있다.

따라서 먼저 학습률 예열을 사용해 큰 배치를 시도해보고, 훈련이 불안정하거나 만족스럽지 않으면 작은 배치로 사용해본다.

 

활성화 함수

일반적으로 ReLU 활성화 함수가 모든 은닉층에 좋은 기본값이다. 활성화 함수는 수행하는 작업에 따라 달라진다.

 

반복 횟수

대부분 훈련 반복횟수는 튜닝할 필요가 없고, 조기종료를 사용해서 훈련을 종료한다.