딥러닝에 대해서

yoon·2022년 1월 20일
0

(혼자 공부하는 머신러닝+딥러닝 내용을 포함합니다)

1. 인공신경망(Artificial Neural Network, ANN)

  • 인공신경망
    • 동물의 뇌에서 영감을 얻은 통계학적 학습 알고리즘.
    • 시냅스의 결합으로 네트워크를 형성한 인공 뉴런이 학습을 통해 시냅스의 결합 세기를 변화시켜, 문제 해결 능력을 가지는 모델 전반을 가리킨다. 즉, 인간의 뉴런을 모방해 가중치 조정을 통한 분류와 예측을 위해 다수의 노드를 연결한 계층적 조직을 말한다.
    • 하지만 뇌에 있는 뉴런과 같지 않음. 다만 기존의 머신러닝 알고리즘이 잘 해결하지 못했던 문제에서 높은 성능을 발휘하는 새로운 종류의 머신러닝 알고리즘일 뿐이다.
  • 텐서플로와 케라스
    • 텐서플로(Tensor Flow)
      • 구글이 개발한 오픈소스 딥러닝 라이브러리
      • 딥러닝 라이브러리가 다른 머신러닝 라이브러리와 다른 점 중 하나는 GPU를 사용해 인공 신경망을 훈련하는 것이다.(GPU는 벡터와 행렬 연산에 최적화되어 있음)
      • 저수준 api와 고수준 api가 있음
        - 저수준 api: 기계학습 알고리즘을 직접 구현할 수 있는 프로그래밍 언어적 요소를 모두 제공
        - 고수준 api: 저수준 api를 기반으로 하며 기계학습에 필요한 개발을 단순화 할 수 있게 한다.(예를 들어 keras)
    • 케라스(Keras)
      • tensorflow와 같은 딥러닝 라이브러리이다.
      • 직관적인 표현으로 신경망 구성을 쉽게 만들어줌.
      • 직접 gpu 연산을 수행하지는 않고 다른 라이브러리를 백엔드로 사용한다.(예를 들어 tensorflow, CNTK와 같은 딥러닝 라이브러리를 백엔드로 사용함) -> 멀티-백엔드 케라스
      • 즉, 케라스 API만 익히면 다양한 딥러닝 라이브러리를 골라서 쓸 수 있음.
      • 근데 현재는 tensorflow가 케라스 api만 남기고 나머지 고수준 api를 전부 정리했고, keras도 더이상 멀티-백엔드 케라스 버전 2.3.1 이후로 개발하지 않음. 거의 tensorflow와 keras가 동의어가 됨.
  • 원-핫 인코딩(one-hot encoding)
    • 많은 데이터 중 한 개의 요소는 True(1), 나머지 요소는 False(0)로 만들어 주는 기법
    • 범주형 데이터 혹은 카테고리를 나누는 문제에서 주로 사용한다.
    • 분류 문제의 경우 정답 클래스만 True, 나머지 클래스는 False로.
  • 인공신경망으로 모델 만들기
    • 인공 신경망에서는 검증을 할 때 주로 검증 세트를 따로 분리해서 사용한다.

      • 딥러닝 분야의 데이터셋은 충분히 크기 때문에 나누어도 안정적임
      • 교차 검증을 수행하기에는 훈련 시간이 너무 오래 걸린다.
      • 데이터셋을 나눌 때 사용하는 함수는 사이킷런의 train_test_split()
    • 밀집층

      • 각 층의 뉴런끼리 빽빽하게 연결되어 있어서
    • 완전 연결층

      • 양쪽의 뉴런이 모두 연결 되어 있음
    • 활성화 함수

      • 뉴런의 선형 방정식 계산 결과에 적용되는 함수.
      • 다음 레이어에 데이터를 전달하기 전에 비선형 함수(활성화 함수)를 통과 시켜 전달.
      • 비선형 함수를 사용하는 이유는 활성화 함수로 선형 함수를 사용하면 층을 깊게 하는 의미가 줄어들기 때문임.(자세한 내용은 맨 아래 링크 참고)

2. 심층신경망(Deep Neural Network, DNN)

  • 심층신경망

    • 입력층(input layer)와 출력층(output layer) 사이에 여러 개의 은닉층(hidden layer)들로 이뤄진 인공신경망이다.
    • 다수의 층의 깊이로 구성됨.
    • 서로 교차하는 선형, 비선형 처리 단위들로 구성된 수많은 계층에 기반을 두고 있고, 수많은 데이터로 훈련하는 방식이다.
    • 보통 인공신경망에는 2~3개의 층이 있지만 심층신경망은 10~20개의 층이 존재할 수 있다.
    • 심층 신뢰 신경망, 심층 오토인코더, 합성곱 신경망, 순환 신경망 등이 있다.
      (http://wiki.hash.kr/index.php/%EC%8B%AC%EC%B8%B5%EC%8B%A0%EA%B2%BD%EB%A7%9D)
    • 과적합과 높은 시간복잡도 문제가 있음.
      - 과적합의 경우 L2, L1 방식과 같은 정규화를 해주는 방법이 있음. 또는 hidden layer의 몇몇 유닛들이 임의로 생략되는 dropout을 활용한다.

  • LeRU 함수

    • 활성화 함수(activation function)의 종류

    • sigmoid 함수의 단점인 기울기 소실(gradient vanishing)문제 등을 해결하기 위해 나온 활성화 함수

    • 심층 신경망에서 좋은 성능을 보여줌.

    • 입력이 양수일 경우 입력 그대로를 출력하고, 음수이면 0을 출력한다.

    • max(0, z): z가 0보다 크면 z를 출력하고 0보다 작으면 0을 출력한다.

    • 특히 이미지 처리에서 좋은 성능을 낸다고 알려져 있음

각각의 입력이 출력에 끼치는 영향을 알고, 가중치를 조절하기 위해 오차역전파(Backpropagation) 알고리즘을 사용한다. 그런데 이 알고리즘을 사용하여 층이 10개 이상으로 많아지고 출력부터 입력까지 미분 값을 연쇄법칙으로 계산해오면, 시그모이드 함수를 이용한 경우 0에서 1까지의 소숫점 값이 계속 곱해지다보니 입력이 출력에 끼치는 영향이 거의 0에 가까운 것을 발견하였다. 이렇게 되면 학습이 잘 이루어지지 않아서, 최근에는 시그모이드 함수를 잘 이용하지 않고 렐루를 많이 사용하는 것이다.

  • 옵티마이저(optimizer)
    • 학습 데이터셋을 이용해 모델을 학습할 때 경사하강법을 통해데이터의 실제 결과와 모델이 예측한 결과를 기반으로 잘 줄일 수 있게 만들어주는 역할을 한다.
    • 다양한 optimizer들이 있음.
    • 현재 가장 많이 쓰이는 optimizer는 Adam이다. 빠르기도 하고 성능도 좋아 무난하기 때문인데, 무조건적으로 가장 좋은 성능을 보이는 것은 아니기 때문에 데이터셋이나 프로젝트에 따라 다른 optimizer가 더 좋을 수도 있다.

3. 신경망 모델 훈련

  • 드롭아웃(Drop-out)

    • 서로 연결된 연결망(layer)에서 0~1사이의 확률로 노드 중 일부를 제거하여 학습을 진행하는 기법
    • 단 테스트할 땐 모든 노드를 사용한다.
    • 학습할 때 무작위의 노드를 학습함으로서 매 번 다른 노드를 학습할 수 있다.
    • 오버피팅을 방지하기 위한 방법 중 하나.
    • co-adaptation(동시 적응 또는 상호적응)을 방지한다.

      co-adaptation이란?
      어떤 특성이 집단의 생존에 유리하게 작용하면 이 특성은 후세에 더 잘 발현하고 진화하고, 반대로 불리한 특성은 퇴화하다가 발현하지 않는다는 생물학 이론에서 온 개념으로, 신경망 내부에서도 일어난다.
      신경망에서 보면 학습 진행시 인접레이어 노드의 영향을 받아 학습할 수 밖에 없는 구조를 가지고 있는데, 예측하는데 유리한 신호가 입력된 노드에는 가중치를 더하는 방향으로, 불리한 신호가 들어온 노드에는 가중치를 적게 하는 방향으로 학습한다. 이 과정을 통해 학습데이터를 과도하게 학습하게 되고 실제 데이터는 잘 예측하지 못하게 된다.(과적합을 말하는 듯)

  • 콜백(callback)

    • 훈련 과정 중간에 어떤 작업을 수행할 수 있게 하는 객체.
    • keras.callbacks 패키지 안에 있다.
      • ModelCheckpoint: 기본적으로 에포크마다 모델을 저장한다.
      • EarlyStopping: 학습 중 특정 조건(과대적합이 되기 전 등)이 되면 학습을 종료한다.
      • LambdaCallback: 콜백은 자체적으로 조건을 클래스로 만들어 사용할 수 있는데, 전체 클래스를 만들기 부담스러울 때 함수형태로 전달할 수 있게 해준다.
      • 위와 더불어 다양한 callback이 있음.(https://jins-sw.tistory.com/27)

callback = tf.keras.callbacks.LambdaCallback(on_epoch_begin=lambda epoch, logs: print('We are starting epoch {}'.format(epoch +1 )))
model.fit(dataset, epochs=10, callbacks=[callback])
#loss가 3번 동안 나아지지 않으면 훈련을 종료하는 callback

  • 조기 종료(early stopping)
    • 케라스에서 제공하는 콜백.
    • 필요 이상의 학습으로 인한 과적합을 방지한다.

profile
공부하자

0개의 댓글