핸즈 온 머신러닝 (Hands-On Machine Learning with Scikit-Learn & TensorFlow) / 오렐리앙 제론 지음 , 박해선 옮김
을 읽고, 추후 기억을 되살릴 수 있게끔 나만의 방법으로 내용을 리뷰한다. 따라서 리뷰의 내용 별 비중이 주관적일 수 있다.
챕터 10. 인공 신경망 소개
뇌의 구조로부터 아이디어를 얻은 것이 artificial neural networks의 핵심 아이디어이다. 그리고 인공 신경망은 딥러닝의 핵심이다. 이는 강력하고 확장성이 좋아서 수백만개의 이미지를 분류하거나, 음성 인식 서비스 등을 진행하거나 게임하면서 학습하는 알파고 등 대규모 머신러닝 문제를 다루기 좋다.
10.1 생물학적 뉴런에서 인공 뉴런까지
인공 신경망 자체는 오래전부터 있었다. 1943년에 처음 소개된 인공신경망은 긴 침체기에 들어섰다가 최근에 다시 부흥하고 있다. 게임 산업의 강력한 GPU 성능과 향상된 훈련 알고리즘이 발견되었기 때문이다.
10.1.1 생물학적 뉴런
뉴런은 세포체, 수상돌기, 축삭돌기, 시냅스 등으로 이루어지며 시냅스를 통해 다른 뉴런으로부터 짧은 전기 자극 신호를 받는다. 개개의 생물학적 뉴런은 아주 단순하게 작동하지만 수십억 개의 뉴런으로 구성된 거대한 네트워크로 조직되어 있고 각 뉴런은 수천 개의 다른 뉴런과 연결되어있다.
10.1.2 뉴런을 사용한 논리 연산
생물학적 뉴런에서 인공 뉴런(artificial neuron)이 생겨났다. 이 모델은 하나 이상의 binary input과 하나의 binary output을 가진다. 이런 뉴런 모델을 가지고, 대입 혹은 and, or 등 여러 가지 논리 표현식을 표현할 수 있다.
10.1.3 퍼셉트론
퍼셉트론은 가장 간단한 인공 신경망 구조 중 하나로, threshold logic unit이라는 조금 다른 형태의 인공 뉴런을 기반으로 한다. 입력과 출력이 binary가 아니라 어떤 실수이고 각각의 입력 연결에는 가중치가 존재한다. TLU는 입력의 가중치 합을 계산하고 threshold에 기반하여 step function을 적용하여 결과를 출력한다. 가장 널리 사용되는 계단 함수는 Heaviside step function인데, z<0일때는 0이고 아닐 때에는 1이 되는 함수이다.
TLU를 훈련 시킨다는 것은 최적의 가중치 (bias를 포함하여)를 찾는 것이다. 퍼셉트론은 층이 하나뿐인 TLU로 구성되는데, 입력층과 출력층만이 존재한다는 뜻이다.
10.1.4 다층 퍼셉트론과 역전파
타층 퍼셉트론은 입력층 하나, 은닉층 하나 이상, 출력층 하나로 구성된다. 모든 층은 편향 뉴런을 추가하여 다음 층과 완전히 연결되어있다. 은닉층이 2개 이상일 때, deep neural network 라고 한다.
다층 퍼셉트론을 훈련시키는 방법으로는 backpropagation 알고리즘을 사용한다. 각 훈련 샘플을 입력으로 주입하여 각 뉴런의 출력을 계산한 후, 최종 출력과 기댓값의 오차를 계산하여 오차에 마지막 뉴런층이 기여한 오차를 계산한다. 이를 기반으로 마지막 직전 뉴런층이 기여한 오차를 계산하고, 이 과정을 입력층까지 측정한다. 이 과정에서 tensorflow의 후진 모드 자동 미분 알고리즘이 사용된다. 이 값들을 이용하여 각 가중치에 경사 하강법을 적용시킨다.
활성화 함수에는 주로 ReLU(z) = max(0, z) 함수나 tanh(z) 함수를 사용한다. 또한 클래스가 배타적인 분류 문제에서는 출력층에 softmax 함수를 적용하여 확률로 변환시킨다. 신호가 입력에서 출력으로만 흐르므로 feed forward neural network 라고 부른다.
10.2 텐서플로의 고수준 API로 다층 퍼셉트론 훈련하기
https://www.tensorflow.org/api_docs/python/tf/compat/v1/estimator/DNNClassifier
tensorflow v1에서 DNNClassifier를 사용하면 된다.
10.3 텐서플로의 저수준 API로 심층 신경망 훈련하기
네트워크의 구조를 더 상세히 제어하고 싶다면 tf의 저수준 파이썬 API를 사용하여 직접 그래프를 구현하면 된다.
10.3.1 구성 단계
우선 그래프를 구성하여야 한다. input 데이터들을 placeholder로 구현하고 이 과정에서 shape에 None을 입력하면 자유로운 크기가 된다. (훈련 데이터의 수를 모르기 때문) n개 뉴런으로 구성된 하나의 층을 만드는 neuron_layer 함수를 구현한 후 (파라미터로 name_scope 도 받음), "dnn" name scope를 이용하여 각 층을 선언해주면 된다.
neuron_layer 함수를 직접 구현하지 않고
https://www.tensorflow.org/api_docs/python/tf/compat/v1/layers/dense
위 함수를 사용하여도 된다. 모든 입력이 은닉층에 있는 모든 뉴런과 연결된 fully connected layer를 만든다.
최종 층에 softmax 함수를 적용한 후 cross entropy 함수에 적용시키고, 비용함수를 최소화 하는 방향으로 GradientDescentOptimzer를 사용하면 된다.
https://www.tensorflow.org/api_docs/python/tf/nn/sparse_softmax_cross_entropy_with_logits
훈련을 마친 후에는 Validation Data로 모델을 평가해야하는데, 간단하게 in_top_k 함수를 사용하여 정확도를 계산할 수 있다. 마지막으로 Saver 객체를 이용하여 저장하면 된다.
10.3.2 실행 단계
데이터를 분할 한 후, init 노드를 실행해서 초기화하고 각 미니배치를 placeholder에 입력하여 학습하면 된다. 마지막에는 검증 데이터를 사용해 평가하고 파라미터를 저장한다.
10.3.3 신경망 사용하기
훈련한 후 예측을 하려면, saver로 부터 모델을 불러온 후 예측 데이터를 입력하여 결과 노드를 평가하면 된다.
10.4 신경망 하이퍼파라미터 튜닝하기
신경망의 유연성은 단점이 되기도 하는데, 조절해야 할 하이퍼파라미터가 많아진다. 어떤 하이퍼파리미터의 조합이 최적인지 찾아야 한다. 교차 검증을 활용한 그리드 탐색을 할 수도 있지만, 조정할 하이퍼파라미터가 많고 훈련 시간도 길기 때문에 랜덤 탐색 혹은 Oscar 같은 도구를 사용하는 것이 좋다.
10.4.1 은닉층의 수
많은 문제가 은닉층 하나로 시작해도 쓸 만한 결과를 얻을 수 있다. 은닉층이 하나인 다층 퍼셉트론이더라도 뉴런 수가 충분하면 아주 복잡한 함수도 모델링 할 수 있다는 것이 밝혀졌다. (시벤코 정리 / 일반 근사 이론) 하지만 심층 신경망이 파라미터 효율성이 훨씬 좋다. 숲을 그릴 때에 나뭇잎만 그릴 수 있더라도 모든 숲을 그릴 수는 있지만, 나뭇잎을 복사하여 가지를 만들고 가지를 복사하여 나무를 만든 후 나무를 복사하여 숲을 만든다면 더 효율적으로 만들 수 있을 것이다. 실제 모델에서도, 각 층이 저수준에서 고수준으로 조금씩 표현하게 된다. 이러한 방법은 같은 저수준을 이용하는 다른 고수준 모델을 훈련할 때에도 파라미터를 유지하며 도움을 줄 것이다.
10.4.2 은닉층의 뉴런 수
입력층과 출력층의 뉴런 수는 모델과 데이터에 따라 주로 결정되지만, 은닉층의 뉴런 수는 직접 결정해야 한다. 주로, 고수준으로 갈 수록 적은 뉴런을 사용한다. 하지만 요즘 들어서 모든 은닉층에 같은 수의 뉴런을 사용하여 단 하나의 하이퍼파라미터로 통일하기도 한다. 최적의 뉴런 수를 찾는 것은 아직 불가능하고 과대적합이 될 때까지 뉴런 수를 늘리거나, 많은 뉴런 수를 사용하여 학습시킨 후 조기종료를 시키거나 dropout을 사용하는 방식이 있다.
10.4.3 활성화 함수
대부분 은닉층에 ReLU 함수를 사용한다. 이는 계산이 빠르고 특정 값에 수렴하지 않는 덕분에 그래디언트가 0에 가까워지지 않는다. 또한 분류 모델의 출력층에서는 소프트맥스 활성화 함수를 자주 사용한다.
'개발 인생 > ML' 카테고리의 다른 글
핸즈 온 머신러닝 :: 12. 다중 머신과 장치를 위한 분산 텐서플로 (0) | 2020.01.24 |
---|---|
핸즈 온 머신러닝 :: 11. 심층 신경망 훈련 (0) | 2020.01.22 |
핸즈 온 머신러닝 :: 9. 텐서플로 시작하기 (0) | 2020.01.18 |
핸즈 온 머신러닝 :: 8. 차원 축소 (0) | 2020.01.18 |
핸즈 온 머신러닝 :: 7. 앙상블 학습과 랜덤 포레스트 (0) | 2020.01.17 |