No Story, No Ecstasy

[ADP 실기 with R] 7. Neural Networks 본문

Data Science Series

[ADP 실기 with R] 7. Neural Networks

heave_17 2020. 12. 12. 17:20

https://images.app.goo.gl/ttxYnjzzAqMLkT2v6

1. Neural Networks

  - 퍼셉트론: 각 노드의 입력치*가중치의 합과 활성 함수에 의하여 해당 노드의 활성화 여부가 결정되는 간단한 feedforward 인공 신경망

  - 다층 퍼셉트론과 역전파

    - 입력층, 은닉층, 출력층으로 구성된 인공 신경망을 다층 퍼셉트론, 은닉층이 2개 이상일 때 심층 신경망이라고 표현

    - 역전파 알고리즘은 네트워크의 출력 오차에 각 뉴런이 얼마나 기여했는지를 마지막 은닉층부터 측정하여, 이전 은닉층의 뉴런은 얼마나 기여했는지 입력층에 도달할 때까지 계속 측정하는 것을 의미한다.

    - 이렇게 역방향으로 계산한 오차 그래디언트를 네트워크의 모든 연결 가중치에 반영한다(경사 하강법). 

    - 역전파 알고리즘을 위한 대표적 활성화 함수: 로지스틱, 하이퍼볼릭 탄젠트, ReLU 함수

  - 심층 신경망

    - 심층 신경망은 얕은 신경망보다 훨씬 적은 수의 뉴런을 사용하기 때문에 파라미터 효율성이 훨씬 좋다. 

    - 하지만, 하위층으로 오차 그래디언트가 전달될 때 그래디언트 소실이 발생할 수 있다. 

    - 이를 해결하기 위한 기법들: He 초기화, ELU 활성화 함수 활용, 배치 정규화, 전이 학습, 동결, 캐싱 등

  - 과대 적합을 피하기 위한 규제 방법

    - 조기 종료(검증 세트의 정확도가 떨어지면 종료)

    - L1/L2 규제(비용 함수에 적절한 규제항을 추가하여 연결 가중치에 제약을 가한다)

    - 드롭아웃(훈련 스텝마다 각 뉴런에 드롭아웃될 확률 p를 부여)

    - 맥스-노름 규제(연결 가중치 제한)

    - 데이터 증식(기존 데이터에서 새로운 데이터 생성) 

  - 잘 정리된 링크: todayisbetterthanyesterday.tistory.com/44

 

[ADP] R로 하는 신경망(Neural Network) 모형

 이 게시글은 신경망 모형을 R로 구현하는 과정만 진행한다. 그렇기에 인경신경망에 대한 원리와 정확한 개념을 알기 위해서는 아래 링크를 통해서 학습하길 바란다. https://todayisbetterthanyesterday.

todayisbetterthanyesterday.tistory.com

  - R 코드 예제

# 0. package import
library(neuralnet)

# 1. 신경망 모델 생성
##  - threshold: a numeric value specifying the threshold for the partial derivatives of the error function as stopping criteria
##  - algorithm: backprop, rprop+, rprop-, sag, sir
##  - err.fct: function that is used for the calculation of the error. 'sse' or 'ce'
##  - linear.output: 0/1이면 FALSE
net.model = neuralnet(y ~ ., train_data, hidden = 1, threshold = 0.01, algorithm = "rprop+", linear.output = FALSE)

# 2. 학습된 결과 확인
names(net.model)
net.model$result.matrix
plot(net.model)
gwplot(net.model, selected.covariate = xk, min = -2.5, max = 2.5) #분산이 너무 작으면 제외하고 다시 분석한다.

# 3. 새로운 데이터 예측하기
predict(net.model, test_data)

# + multiclass classification
nn.model = neuralnet((y == "setosa") + (y == "versicolor") + (y == "virginica") ~ Petal.Length + Petal.Width, iris_train, linear.output = FALSE)
nn.pred = predict(nn.model, test_data)
table(test_data$y, apply(nn.pred, 1, which.max))

  * library(nnet)으로도 기본 모델을 생성할 수 있다.