[DeepLearning] CH04. 머신 러닝의 기본 요소(3)


케라스 창시자에게 배우는 딥러닝을 기반으로 공부한 내용을 정리합니다.

4.3 데이터 전처리, 특성 공학, 특성 학습

4.3.1 신경망을 위한 데이터 전처리

데이터 전처리 목적은 주어진 원본 데이터를 신경망에 적용하기 쉽도록 만드는 것입니다.
벡터화(vectorization), 정규화(normalization), 누락된 값 다루기, 특성 추출 등이 포함됩니다.

  • 벡터화
    신경망에서 모든 입력과 타깃은 부동 소수 데이터로 이루어진 텐서여야 합니다(또는 특정 경우에 정수로 이루어진 텐서입니다). 사운드, 이미지, 텍스트 등 처리해야 할 것이 무엇이든지 먼저 텐서로 변환해야 합니다.
    이 단계를 데이터 벡터화라고 합니다. 예를 들어 2개의 텍스트 분류 예에서 텍스트를 정수 리스트로 변환했습니다. 그다음 원-핫 인코딩을 사용하여 float32 타입의 데이터로 이루어진 텐서로 바꾸었습니다.

  • 값 정규화
    숫자 이미지 분류 예에서 이미지 데이터를 그레이스케일 인코딩인 0~255 사이의 정수로 인코딩했습니다. 이 데이터를 네트워크에 주입하기 전에 float32 타입으로 변경 후 255로 나누어서 최종적으로 0~1 사이의 부동 소수 값으로 만들었습니다.
    주택 가격을 예측할 땐 특성들의 범위가 제각각이었습니다. 이 데이터를 네트워크에 주입하기 전에 각 특성을 독립적으로 정규화하여 평균이 0이고 표준편차가 1이 되도록 만들었습니다.

일반적으로 비교적 큰 값이나 균일하지 않은 데이터를 신경망에 주입하는 것은 위험합니다. 업데이트할 그래디언트가 커져 네트워크가 수렴하는 것을 방해합니다.

네트워크를 쉽게 학습시키려면 데이터가 다음 특징을 따라야합니다.

  • 작은 값을 취합니다. 일반적으로 대부분의 값이 0~1 사이여야 합니다.
  • 균일해야 합니다. 즉 모든 특성이 대체로 비슷한 범위를 가져야 합니다.

추가적으로 다음에 나오는 엄격한 정규화 방법은 자주 사용되고 도움이 될 수 있습니다.

  • 각 특성별로 평균이 0이 되도록 정규화합니다.
  • 각 특성별로 표준 편차가 1이 되도록 정규화합니다.

넘파이 배열에서 하는 방법은 간단합니다.

x -= x.mean(axis=0) # x가 (샘플, 특성) 크기인 2D 행렬이라고 가정합니다.
x /= x.std(axis=0)
  • 누락된 값 다루기
    일반적으로 신경망에서 0이 사전에 정의된 의미있는 값이 아니라면 누락된 값을 0으로 입력해도 괜찮습니다. 네트워크가 0이 누락된 데이터를 의미한다는 것을 학습하면 이 값을 무시하기 시작할 것입니다.

    테스트 데이터에 누락된 값이 포함될 가능성이 있다고 가정하겠습니다. 하지만 네트워크가 누락된 값이 없는 데이터에서 훈련되었다면 네트워크는 누락된 값을 무시하는 법을 알지 못합니다.

    누락된 값이 있는 훈련 샘플을 고의적으로 만들어야 합니다. 훈련 샘플의 일부를 여러벌 복사해서 테스트 데이터에서 빠질 것 같은 특성을 제거합니다.

4.3.2 특성 공학

특성 공학은 데이터와 머신 러닝 알고리즘에 관한 지식을 사용하는 단계입니다.
모델에 데이터를 주입하기 전에 (학습이 아닌) 하드코딩된 변환을 적용하여 알고리즘이 더 잘 수행되도록 만들어 줍니다.
머신 러닝 모델이 임의의 데이터로부터 완벽한 학습을 한다고 기대하기는 어렵습니다. 모델이 수월하게 작업할 수 있는 어떤 방식으로 데이터가 표현될 필요가 있습니다.

예를 들어 시계 이미지를 입력으로 받고 하루의 시간을 출력하는 모델을 개발한다고 가정하겠습니다.
이미지의 원본 픽셀을 입력으로 사용한다면 어려운 머신 러닝 문제가 될 것입니다.

img

고수준에서 이 문제를 이해하고 있다면 머신 러닝 알고리즘을 위해 훨씬 더 좋은 입력 특성을 만들 수 있습니다.
예를 들어 시계 바늘의 검은색 픽셀을 따라 각 바늘 끝의 (x,y)좌표를 출력하는 간단한 파이썬 스크립트를 만듭니다. 그다음 좌표와 적절한 시각을 연결하도록 쉽게 학습될 수 있습니다.

이보다 더 좋은 특성으로, (x, y) 포인트를 이미지 중심에 대한 극좌표로 나타낼 수 있습니다. 이제 각 시계 바늘의 각도가 입력됩니다.
이렇게 특성을 준비하면 문제가 너무 쉬워져서 머신러닝이 전혀 필요하지 않습니다.

이것이 특성 공학의 핵심으로 특성을 더 간단한 방식으로 표현하여 문제를 쉽게 만듭니다.

다행히 최근 딥러닝은 대부분 특성 공학이 필요하지 않습니다. 신경망이 자동으로 원본 데이터에서 유용한 특성을 추출할 수 있기 때문입니다.

하지만 심층 신경망을 사용할 때 아래와 같은 이유로 특성공학에 대해 신경써야 합니다.

  • 좋은 특성은 적은 자원을 사용하여 문제를 더 멋지게 풀어낼 수 있습니다.
  • 좋은 특성은 더 적은 데이터로 문제를 풀 수 있습니다. 딥러닝 모델이 스스로 특성을 학습하는 능력은 가용한 훈련 데이터가 많을 때 발휘됩니다. 샘플의 개수가 적다면 특성에 있는 정보가 매우 중요해집니다.



Reference

  1. 케라스 창시자에게 배우는 딥러닝





© 2020. by GeonKimdcu

Powered by aiden