[IMLP] Chapter 2. 지도 학습 (3) - 지도학습 알고리즘 (7): 신경망(딥러닝)
- 신경망 알고리즘 혹은 딥러닝
- 딥러닝 알리즘의 출발점이며 간단하게 분류와 회귀에 쓸 수 있는 다층 퍼셉트론(Multilayer perceptrons, MLP) (혹은 피드포워드 신경망, 신경망)
[신경망 모델]
- MLP는 여러 단계를 거쳐 결정을 만들어내는 선형 모델의 일반화된 모습
- 가중치 합을 만드는 과정이 여러 번 반복되며, 중간 단계를 구성하는 은닉 유닛 (hidden unit) 계산하고 최종 결과 산출을 위해 다시 가중치 합을 계산함
- 각 은닉 유닛의 가중치 합을 계산한 후 그 결과에 비선형 함수인 렐루(ReLU)나 하이퍼볼릭 탄젠트(hyperbolic tangent, tanh) 적용
line = np.linspace(-3,3,100)
plt.plot(line, np.tanh(line), lablel="tanh")
plt.plot(line, np.maximum(line,0), label="relu")
plt.legend(loc="best")
plt.xlabel("x")
plt.ylabel("relu(X), tanh(X)")
[신경망 튜닝]
from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier(solver='lbfgs', random_state=0).fit(X_train,y_train)
- 기본값으로 은닉 유닛 100개 사용함 (hidden_layer_sizes 로 조정)
- 은닉 유닛 추가 가능
mlp = MLPClassifier(solver='lbfgs', random_state=0, hidden_layer_sizes=[10,10])
- 활성화 함수 변경 가능
mlp = MLPClassifier(solver='lbfgs', activation='tanh', random_state=0, hidden_layer_sizes=[10,10])
- L2 페널티 사용해서 가중치를 0에 가깝게 감소시켜 모델의 복잡도 제어 가능한데 이는 매개변수 alpha 사용 (기본값은 매우 낮게 되어 있음)
- 데이터 스케일 조정 (Standardcaler) 후 시도하였을 때 결과가 매우 좋아짐
mean_on_train = X_train.mean(axis=0)
std_on_train = X_train.std(axis=0)
X_train_scaled = (X_train - mean_on_train) / std_on_train
X_test_scaled = (X-test - mean_on_train) / std_on_train
- 최대 반복 횟수에 도달했다고 알려주는 경고가 뜨면 max_iter 로 반복 횟수 늘려줌
- 훈련 세트와 테스트 세트 사이 성능 차이 존재하면 일반화 성능을 올리기 위해 복잡도 낮춰보기 (alpha 증가)
- 선형 모델이나 트리 모델보다 까다로움
[장단점과 매개변수]
- 매우 복잡한 모델 만들 수 있는데 추분한 연산 시간과 데이터를 주고 매개변수를 세심하게 조정하면 성능 높아질 수 있음
- 종종 학습이 오래 걸리고 데이터 전처리 주의해야 함 (동질의 데이터에서 잘 작동하고, 다른 종류의 특성을 가진 데이터는 트리 기반 모델이 더 잘 작동할 수 있음)
[신경망의 복잡도 추정]
- 가장 중요한 매개변수는 은닉층의 개수와 각 은닉층의 유닛 수
- solver 매개변수:
1) 'adam': 기본값으로 데이터 스케일에 조금 민감함
2) 'lbfgs': 안정적이지만 규모가 큰 모델이나 대량의 데이터셋에서는 시간이 오래 걸림
3) 'sgd': 다른 여러 매개변수와 함께 튜닝하여 최선의 결과를 만들 수 있음