신경망이 학습하지 않으면 어떻게해야합니까?


147

신경망을 훈련하고 있지만 훈련 손실은 줄어들지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

과적 합이나 정규화에 대해 묻지 않습니다. 훈련 세트 에서 네트워크 성능이 향상되지 않는 문제를 해결하는 방법에 대해 묻고 있습니다.


이 질문은 의도적으로 일반적이므로 신경망을 훈련하는 방법에 대한 다른 질문은 "사람에게 물고기를 주면 하루 동안 먹이를 주지만 남자에게 물고기를 주면 남은 생애 동안 그를 먹일 수 있습니다. " 토론에 대해서는이 메타 스레드를 참조하십시오. "내 신경망이 작동하지 않습니다. 수정하십시오"질문에 대답하는 가장 좋은 방법은 무엇입니까?

신경망이 일반화되지 않으면 신경망이 일반화되지 않으면 어떻게해야합니까?를 참조하십시오.


1
NN이 진행되지 못한 경우입니다. youtu.be/iakFfOmanJU?t=144
Joshua

4
Ivanov의 블로그 " 신경망이 작동하지 않는 이유 ", 특히 섹션 II, III 및 IV가 도움이 될 수 있습니다.
user5228 2016 년

답변:


187

단위 테스트는 당신의 친구입니다

작가들 사이에 "모든 글은 다시 쓰기"입니다. 즉, 글쓰기의 대부분이 수정되고 있습니다. 프로그래머 (또는 최소한 데이터 과학자)에게 표현은 "모든 코딩은 디버깅 중"으로 표현 될 수 있습니다.

코드를 작성할 때마다 코드가 의도 한대로 작동하는지 확인해야합니다. 정확성을 검증하기 위해 내가 찾은 가장 좋은 방법은 코드를 작은 세그먼트로 나누고 각 세그먼트가 작동하는지 확인하는 것입니다. 이것은 세그먼트 출력을 정답이라고 알고있는 것과 비교하여 수행 할 수 있습니다. 이것을 단위 테스트 라고 합니다. 좋은 단위 테스트를 작성하는 것은 좋은 통계 학자 / 데이터 과학자 / 기계 학습 전문가 / 신경망 전문가가되기위한 핵심 요소입니다. 대체물은 없습니다.

네트워크 성능을 조정하기 전에 코드에 버그가 없는지 확인해야합니다! 그렇지 않으면 RMS 타이타닉 에서 갑판 의자를 재배치 할 수도 있습니다 .

신경망에는 다른 유형의 기계 학습 또는 통계 모델보다 검증을 더욱 중요하게하는 두 가지 기능이 있습니다.

  1. 신경망은 랜덤 포레스트 또는 로지스틱 회귀와 같은 방식으로 "기성품"알고리즘이 아닙니다. 단순한 피드 포워드 네트워크의 경우에도 네트워크 구성, 연결, 초기화 및 최적화 방법에 대한 수많은 결정을 내릴 책임은 사용자에게 있습니다. 이것은 코드 작성을 의미하고 코드 작성은 디버깅을 의미합니다.

  2. 신경망 코드가 예외를 일으키지 않고 실행 되더라도 네트워크에는 여전히 버그가있을 수 있습니다! 이러한 버그는 네트워크가 훈련 할 교활한 종류 일 수도 있지만 차선책으로 해결되지 않거나 결과 네트워크에 원하는 아키텍처가 없습니다. ( 이것은 구문 오류와 의미 오류의 차이점에 대한 예입니다 .)

체이스 로버츠 (Chase Roberts) 의이 " 중간 테스트 기계 학습 코드 방법 "에서는 기계 학습 모델의 단위 테스트에 대해 자세히 설명합니다. 이 기사에서 버그가있는 코드 예제를 빌 렸습니다.

def make_convnet(input_image):
    net = slim.conv2d(input_image, 32, [11, 11], scope="conv1_11x11")
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv2_5x5")
    net = slim.max_pool2d(net, [4, 4], stride=4, scope='pool1')
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv3_5x5")
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv4_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool2')
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv5_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool3')
    net = slim.conv2d(input_image, 32, [1, 1], scope="conv6_1x1")
    return net

오류가 보입니까? 이전 결과가 새 변수로 덮어 쓰기 때문에 많은 다른 작업이 실제로 사용 되지 않습니다 . 네트워크에서이 코드 블록을 사용하면 계속 훈련되고 가중치가 업데이트되고 손실이 줄어들 수 있지만 코드는 의도 한대로 작동하지 않습니다. 저자는 또한 작은 따옴표 나 큰 따옴표를 사용하는 데 일관성이 없지만 순전히 문체입니다.

신경망과 관련된 가장 일반적인 프로그래밍 오류는 다음과 같습니다.

  • 변수는 만들어 지지만 사용되지는 않습니다 (보통 복사-붙여 넣기 오류로 인해).
  • 그라디언트 업데이트에 대한 표현식이 올바르지 않습니다.
  • 체중 업데이트는 적용되지 않습니다.
  • 손실 함수는 올바른 척도로 측정되지 않습니다 (예를 들어, 교차 엔트로피 손실은 확률 또는 로짓으로 표현 될 수 있음)
  • 손실은 작업에 적합하지 않습니다 (예 : 회귀 작업에 범주 형 교차 엔트로피 손실 사용).

걷기 전에 기어 다니십시오. 달리기 전에 걷기

넓고 깊은 신경망과 이국적인 배선을 가진 신경망은 현재 머신 러닝의 핵심입니다. 그러나 이러한 네트워크는 완전히 형성되지 않았습니다. 그들의 디자이너는 더 작은 단위에서 그들까지 구축했습니다. 먼저 단일 숨겨진 계층으로 소규모 네트워크를 구축하고 올바르게 작동하는지 확인하십시오. 그런 다음 모델 복잡성을 점진적으로 추가하고 각각의 모델이 제대로 작동하는지 확인하십시오.

  • 한 레이어에 너무 적은 뉴런 은 네트워크가 학습하는 표현을 제한하여 언더 피팅을 유발할 수 있습니다. 네트워크가 훈련 데이터를 "암기"하기 때문에 너무 많은 뉴런이 과적 합을 유발할 수 있습니다.

    수학적으로 문제를 모델링하는 데 필요한 소수의 뉴런 만 있다는 것을 수학적으로 증명할 수 있더라도 "몇 가지 더 많은"뉴런이 있으면 옵티마이 저가 "좋은"구성을 쉽게 찾을 수있는 경우가 종종 있습니다. (그러나 나는 이것이 왜 그런지를 완전히 이해하지 못한다고 생각합니다.) XOR 문제와 관련하여 여기에 대한 예를 제공합니다 .MOR <0.001이 너무 높은 XOR에 대해 NN을 훈련시키는 데 반복이 필요하지 않습니까? .

  • 숨겨진 레이어 수를 선택하면 네트워크가 원시 데이터에서 추상화를 배울 수 있습니다. 딥 러닝은 요즘의 모든 분노이며 많은 레이어를 가진 네트워크는 인상적인 결과를 보여주었습니다. 그러나 너무 많은 숨겨진 계층을 추가하면 과적 합의 위험이 발생하거나 네트워크를 최적화하기가 매우 어려워 질 수 있습니다.

  • 영리한 네트워크 배선을 선택하면 많은 작업을 수행 할 수 있습니다. 데이터 소스가 특수한 네트워크 아키텍처에 적합합니까? 컨볼 루션 신경망은 "구조화 된"데이터 소스, 이미지 또는 오디오 데이터에서 인상적인 결과를 얻을 수 있습니다. 반복적 인 신경망은 자연어 또는 시계열 데이터와 같은 순차적 데이터 유형에 적합합니다. 잔여 연결은 딥 피드 포워드 네트워크를 향상시킬 수 있습니다.

신경망 훈련은 자물쇠 따기와 같습니다

최신의 결과를 얻거나 단순히 좋은 결과를 얻으려면 함께 작동하도록 구성된 모든 부품을 설정해야 합니다 . 실제로 학습하는 신경망 구성을 설정하는 것은 잠금 장치를 선택하는 것과 매우 유사합니다. 모든 부분을 올바르게 정렬해야합니다 . 올바른 위치에 단일 텀블러를 설치하는 것만으로는 충분하지 않지만 아키텍처 만 또는 최적화 프로그램 만 설정해도 충분하지 않습니다.

구성 선택 조정은 하나의 구성 선택 (예 : 학습 속도)이 다른 선택 (예 : 단위 수)보다 중요하거나 중요하지 않다고 말하는 것만 큼 간단하지 않습니다. 이러한 선택은 모두 다른 선택과 상호 작용하므로 선택은 다른 곳에서 이루어진 다른 선택과 함께 잘 할 수 있습니다 .

이는 정규화 옵션이나 수치 최적화 옵션이 아닌 구성 옵션의 전체 목록입니다.

이 모든 주제는 활발한 연구 분야입니다.

볼록하지 않은 최적화는 어렵다

신경망의 목적 함수는 숨겨진 단위가없고 모든 활성화가 선형이고 설계 행렬이 전체 순위 인 경우에만 볼록합니다.이 구성은 일반적인 회귀 문제이기 때문입니다.

다른 모든 경우에 최적화 문제는 볼록하지 않으며 볼록하지 않은 최적화는 어렵습니다. 신경망 훈련의 과제는 잘 알려져 있습니다 ( 심층 신경망을 훈련하기 어려운 이유는 무엇입니까? 참조 ). 또한 신경망에는 매우 많은 수의 매개 변수가 있으므로 1 차 방법으로 만 제한됩니다 ( 뉴턴의 방법이 기계 학습에 널리 사용되지 않는 이유는 무엇입니까? 참조 ). 이것은 매우 활발한 연구 분야입니다.

  • 학습 속도를 너무 크게 설정하면 "캐년"의 한 쪽에서 다른쪽으로 도약하기 때문에 최적화가 분기됩니다. 이 값을 너무 작게 설정하면 실제 진행 상황을 막을 수 있으며 SGD 고유의 노이즈가 경사도 추정치를 압도 할 수 있습니다.

  • 그라디언트 클리핑 은 그라디언트가 임계 값을 초과하면 그라디언트의 규범을 다시 조정합니다. 나는 이것이 일반적으로 1.0의 설정 및 잊어 버림 매개 변수라고 생각했지만 LSTM 언어 모델을 0.25로 설정하여 크게 향상시킬 수 있음을 발견했습니다. 왜 그런지 모르겠습니다.

  • 학습 속도 예약 은 교육 과정에서 학습 속도를 낮출 수 있습니다. 내 경험상, 스케쥴링을 사용하는 것은 정규 표현식 과 매우 흡사 합니다. 하나의 문제 ( "특정 시대 이후 계속 배우는 방법")를 두 가지 문제 ( "특정 시대 이후 계속 배우는 방법")를 대체합니다. ? "및"좋은 일정을 어떻게 선택합니까? "). 다른 사람들은 일정이 필수적이라고 주장합니다. 내가 결정하게 해줄 게

  • 좋은 미니 배치 크기를 선택하면 학습 과정에 간접적으로 영향을 줄 수 있습니다. 더 큰 미니 배치는 작은 미니 배치보다 분산이 적습니다 ( ). 미니 배치가 그라디언트의 방향에 대한 정보를 제공 할 수있을만큼 커야하지만 SGD가 네트워크를 정규화 할 수있을만큼 작아야합니다.

  • 확률 론적 경사 하강 에는 바닐라 SGD를 향상시키기 위해 운동량, 적응 학습률, Nesterov 업데이트 등을 사용 하는 여러 가지 변형 이 있습니다. 더 나은 최적화를 설계하는 것은 매우 활발한 연구 분야입니다. 몇 가지 예 :

  • 아담 옵티마이 저가 처음 나왔을 때 많은 관심을 끌었습니다. 그러나 최근의 일부 연구에 따르면 운동량을 가진 SGD는 신경망에 대한 적응 형 그래디언트 방법을 능가 할 수 있습니다. " 머신 러닝에서 적응 형 그라디언트 방법의 한계 값 "Ashia C. Wilson, Rebecca Roelofs, Mitchell Stern, Nathan Srebro, Benjamin Recht

  • 그러나 다른 한편으로,이 최근 논문은 적응 속도 방법과 SGD 간의 모멘텀을 좁히는 새로운 적응 학습 속도 최적화 프로그램을 제안합니다. " 교육 깊은 신경망에 적응 그라데이션 방법의 일반화 격차를 징후이 첸, Quanquan 구에 의해"

    학습 그라디언트 정보를 자동으로 학습하기 위해 히스토리 그라디언트 정보를 채택하는 적응 형 그라디언트 방법은 심층 신경망 훈련에서 추진력으로 확률 적 그라디언트 디센트 (SGD)보다 더 악화되는 것으로 관찰되었습니다. 이것은 적응 적 그라디언트 방법의 일반화 격차를 해소하는 방법을 공개적인 문제로 남겨둔다. 이 연구에서 우리는 Adam, Amsgrad와 같은 적응 형 그래디언트 방법이 때때로 "과도하게 적용됨"을 보여줍니다. 우리는 Partially adaptive momentum 추정 방법 (Padam)이라는 새로운 알고리즘을 설계합니다.이 알고리즘은 Adam / Amsgrad를 SGD와 통합하여 두 세계에서 최고를 달성합니다. 표준 벤치 마크에 대한 실험에 따르면 Padam은 심층 신경망 교육에서 SGD뿐만 아니라 일반화하면서 Adam / Amsgrad와 같은 빠른 수렴 속도를 유지할 수 있습니다.

표준화

데이터의 규모는 훈련에 큰 차이를 만들 수 있습니다.

정규화

네트워크 정규화를 선택하고 조정하는 것은 일반화하는 모델 (즉, 훈련 데이터에 적합하지 않은 모델)을 구축하는 데있어 중요한 부분입니다. 그러나 네트워크가 학습 중이 아닌 경우 훈련 데이터의 손실을 줄이기 위해 고군분투 할 때 정규화는 문제가 무엇인지 모호하게 할 수 있습니다.

네트워크가 학습되지 않으면 모든 정규화 기능을 끄고 비정규 화 된 네트워크가 올바르게 작동하는지 확인합니다. 그런 다음 각 정규화 부분을 다시 추가하고 각 정규화가 작동하는지 확인합니다.

이 전략은 일부 정규화가 제대로 설정되지 않은 위치를 찾아 낼 수 있습니다. 몇 가지 예는

실험 일지 보관

신경망을 설정할 때 매개 변수 설정을 하드 코딩하지 않습니다. 대신 런타임에 읽고 네트워크 구성 세부 정보를 채우는 데 사용되는 구성 파일 (예 : JSON)에서이 작업을 수행합니다. 이 모든 구성 파일을 유지합니다. 매개 변수를 수정하면 새 구성 파일을 만듭니다. 마지막으로, 교육 및 검증에 대한 모든 에포크 손실을 주석으로 추가합니다.

이전 결과를 유지하는 데 너무 강박적인 이유는 이전 실험을 매우 쉽게 되돌아 가서 검토 할 수 있기 때문입니다. 또한 동일한 데드 엔드 실험을 실수로 반복하지 않도록 방지합니다. 심리적으로, 그것은 당신이 뒤돌아 보면서 "글쎄, 프로젝트가 내가 원하는 곳이 아닐 수도 있지만, 내가 주 전에 있었던 곳과 비교하여 진전을 보이고있다 ."k

예를 들어 LSTM 언어 모델에 대해 배우고 싶었으므로 다른 트위터 사용자에 대한 응답으로 새로운 트윗을 작성하는 트위터 봇을 만들기로 결정했습니다. 나는 자유 시간에 대학원과 직장 사이에서이 일을했습니다. 약 1 년이 걸렸으며, 내가 원하는 것을 한 모델에 도달하기 전에 약 150 가지가 넘는 모델을 반복했습니다. (다양한) 의미가있는 새로운 영어 텍스트를 생성합니다. (한 가지 중요한 문제는 여러 번 시도한 이유 중 하나는 초기 저손실 모델이 훈련 데이터를 기억할 수 있었기 때문에 단순히 샘플 외부 손실을 얻는 것만으로는 충분하지 않았기 때문입니다. 따라서 프롬프트에 응답하여 독일어 텍스트 블록을 그대로 재생했습니다. 모델을 더 자연스럽게 만들고 여전히 손실이 적도록 조정하는 데 약간의 조정이 필요했습니다.)


11
좋은 조언이 많이 있습니다. MCMC 샘플링 방식을 사용하여 복잡한 모델의 매개 변수 또는 예측을 디버깅하는 것과 관련하여 내가 작성한 (또는 다른 사람들이 본) 의견과 비슷한 의견이 얼마나 많은지 흥미 롭습니다. (예를 들어, 코드가 올바르게 구현되지 않으면 코드가 작동하는 것처럼 보일 수 있습니다.)
Glen_b

11
@Glen_b 코딩 모범 사례는 대부분의 통계 / 머신 러닝 커리큘럼에서 충분한 강조를받지 못한다고 생각합니다. 그 점을 강조했습니다. OP가“오, 지금 버그가 발견되었습니다.”와 같은 주석을 남긴 여러 NN 게시물을 보았습니다.
Sycorax

7
저는 파이썬에서 데이터 과학 과정을위한 프로그래밍을 가르치고 있으며, 실제로 첫날에는 기본 개념으로 함수와 단위 테스트를 수행합니다. 선한 싸움
Matthew Drury

8
"모든 코딩이 디버깅 중"인 경우 +1 코딩에 노력이 거의 들지 않는 간단한 운동이라고 생각하는 포스터가 얼마나 많은지 놀랍습니다. 코드를 처음 실행할 때 코드가 올바르게 작동하는 사람 그렇지 않으면 누가 진행할 수없는 것 같습니다. 재미있는 것은 코딩 쉽지만 프로그래밍이 어렵다는 것입니다.
밥 자비스

41

게시 된 답변은 훌륭하며 과거에 크게 도움이 된 몇 가지 "Sanity Checks"를 추가하고 싶었습니다.

1) 단일 데이터 포인트에서 모델을 훈련시킵니다. 이것이 작동하면 다른 출력을 가진 두 개의 입력에 대해 학습하십시오.

이것은 몇 가지 사항을 확인합니다. 먼저, 모델이 데이터에 적합 할 수 있는지 확인하여 모델을 학습 할 수 있음을 신속하게 보여줍니다. 필자의 경우, 나는 이진 예측에 대해 Dense(1,activation='softmax')vs Dense(1,activation='sigmoid')를 잘못하는 실수를 끊임없이 하며 첫 번째는 가비지 결과를 제공합니다.

모델이 몇 가지 데이터 요소를 과도하게 맞출 수없는 경우 너무 작거나 (오늘날의 경우는 아님) 구조 또는 학습 알고리즘에 문제가있는 것입니다.

2) 초기 손실에주의하십시오.

이진 예제를 계속하면 데이터가 30 % 0과 70 % 1 인 경우 초기 예상 손실은 입니다. 모델이 무작위로 추측하기 시작해야하기 때문입니다.L=0.3ln(0.5)0.7ln(0.5)0.7

많은 경우에 6.5와 같은 말도 안되는 초기 손실을 보게 될 것입니다. 개념적으로 이것은 예를 들어 0을 향하여 출력이 심하게 포화됨을 의미합니다. 예를 들어 이므로 1보다 큰 손실이 발생하면 모델이 매우 왜곡되어 있습니다. 이것은 일반적으로 신경망 가중치가 적절하게 균형이 맞지 않을 때 발생하며, 특히 softmax / sigmoid에 더 가깝습니다. 따라서 이것은 초기화가 나쁜지 알려줍니다.0.3ln(0.99)0.7ln(0.01)=3.2

모델을 수천 개의 예에서 예측 한 다음 출력을 히스토그램 화하여이를 더 연구 할 수 있습니다. 이것은 데이터가 올바르게 정규화되었는지 확인하는 데 특히 유용합니다. 예를 들어, 출력이 0쪽으로 치우친 것으로 예상되는 경우 예상 출력의 제곱근을 취하여 예상 출력 (훈련 데이터)을 변환하는 것이 좋습니다. 이것은 출력에서 ​​포화 시그 모이 드에 대한 기울기 문제를 피할 것입니다.

3) 디버그하기 위해 모델 출력을 일반화하십시오

예를 들어 시계열 데이터에서 예측하기 위해 LSTM을 사용한다고 가정합니다. 어쩌면 귀하의 예에서는 최신 예측에만 관심이 있으므로 LSTM은 단일 값을 출력하지만 시퀀스는 출력하지 않습니다. 각 단계에서 예측을 반환하도록 LSTM을 전환합니다 (케 라스 단위로 return_sequences=True). 그런 다음 모든 단계 후에 숨겨진 상태 출력을 살펴보고 실제로 다른지 확인할 수 있습니다. 이것의 적용은 시퀀스를 마스킹 할 때 (즉, 길이를 동일하게 만들기 위해 데이터로 패딩 할 때) LSTM이 마스킹 된 데이터를 올바르게 무시하는지 확인하는 것입니다. 모델 일반화하지 않으면 이 문제를 발견 할 수 없습니다 .

4) 개별 레이어를보십시오

Tensorboard는 레이어 출력시각화 하는 유용한 방법을 제공합니다 . 이를 통해 각 레이어에서 입력 / 출력이 올바르게 정규화되도록 할 수 있습니다. 버그가있는 활성화를 잡을 수도 있습니다. 또한 배치의 예측에 대해 케 라스의 레이어 출력을 쿼리 한 다음 의심스러운 활성화 (모든 0 또는 0이 아닌)가있는 레이어를 찾을 수 있습니다.

5) 더 간단한 모델을 먼저 구축

문제를 해결하는 가장 좋은 방법은 경계 상자 탐지기와 결합 된 CNN을 사용하여 이미지 자르기를 추가로 처리 한 다음 LSTM을 사용하여 모든 것을 결합하는 것입니다. GPU가 모델을 초기화하는 데 10 분이 걸립니다.

대신 가짜 데이터 (같은 모양)를 배치하고 모델을 구성 요소로 분류하십시오. 그런 다음 각 구성 요소 대신 더미 모델을 만듭니다 ( "CNN"은 단일 2x2 20 스트라이드 컨볼 루션 일 수 있으며 LSTM은 2 개의 숨겨진 단위 일 수 있습니다). 이를 통해 모델 구조가 올 바르고 외부에 문제가 없는지 확인할 수 있습니다. 나는 그런 모델로 잠시 고생했고, 더 간단한 버전을 시도했을 때 층 중 하나가 케 라스 버그로 인해 제대로 마스크되지 않았다는 것을 알았습니다. 당신은 쉽게 (그리고 빨리 올바르게 설치를 그래프를 한 경우) 쿼리 내부 모델의 레이어와 참조하십시오.

6) 전처리 및 패키지 버전 표준화

특히 신경망은 데이터의 작은 변화에 매우 민감합니다. 예를 들어 널리 사용되는 두 가지 이미지로드 패키지는 cv2PIL입니다. JPEG 를 열기 만하면 두 패키지 모두 약간 다른 이미지를 생성 합니다. 차이점은 일반적으로 작지만 이러한 종류의 요인으로 인해 모델 성능이 저하되는 경우가 있습니다. 또한 악몽을 디버깅합니다. 훈련 중에 유효성 검사 점수를 얻은 다음 나중에 다른 로더를 사용하고 동일한 데이터 세트에서 다른 정확도를 얻습니다.

따라서 github에서 누군가의 모델을 다운로드하는 경우 전처리에주의를 기울이십시오. 어떤 이미지 로더를 사용합니까? 어떤 이미지 전처리 루틴을 사용합니까? 이미지 크기를 조정할 때 어떤 보간법을 사용합니까? 먼저 이미지 크기를 조정 한 다음 정규화합니까? 아니면 다른 방법? RGB 이미지의 채널 순서는 무엇입니까?

패키지를 표준화하는 가장 안전한 방법은 requirements.txt교육 시스템 설정과 마찬가지로 모든 패키지를 keras==2.1.5버전 번호 까지 설명 하는 파일 을 사용하는 것입니다 . 이론적으로 훈련 시스템에서와 동일한 GPU와 함께 Docker를 사용하면 동일한 결과를 얻을 수 있습니다.


7
(+1) 초기 손실을 확인하는 것이 좋습니다. 답변을 생략 한 것을 후회합니다.
Sycorax

7
모델이 과적 합할 수 있는지 확인하는 것이 좋습니다. 나는 과적 합을 약점으로 생각 하는 데 너무 익숙해 져 있습니다.
존 콜먼

15

신경망을 시작하도록 훈련시키지 마십시오!

모든 대답은 훌륭하지만 언급해야 할 한 가지 점이 있습니다. 데이터에서 배울 것이 있습니까? (어떤 종류의 테스트로 간주 될 수 있음).

예측하려는 레이블이 기능과 독립적 인 경우 교육 손실을 줄이는 데 어려움이있을 수 있습니다.

대신 선형 회귀, 임의 포리스트 (또는 하이퍼 파라미터 수가 적고 동작을 이해할 수있는 방법)를 교정하십시오.

그런 다음 이러한 모델에서 임의의 추측보다 나은 성능을 달성하면 신경망 조정을 시작할 수 있습니다 (@Sycorax의 답변이 대부분의 문제를 해결할 것입니다).


5
이 답변에 동의합니다. 신경망과 다른 형태의 ML은 "지금 매우 뜨겁다". 종종 단순한 형태의 회귀가 간과되기도합니다. 또한 모델을 설명 할 때 누군가가 와서 " 결과 에 의 영향은 무엇 입니까?"라고 물을 것입니다. 그리고 당신이 할 수있는 것은 어깨를 으 is하는 것입니다. 간단한 기술이 실패한 경우에만 기계 학습 솔루션을 찾으십시오. xk
Ingolifs 2018 년

11

기본적으로 NN / DNN 모델 교육을위한 기본 워크 플로는 거의 동일합니다.

  1. NN 아키텍처 정의 (얼마나 많은 계층, 어떤 계층, 계층 간 연결, 활성화 기능 등)

  2. 일부 소스 (인터넷, 데이터베이스, 로컬 파일 세트 등)에서 데이터를 읽고, 가져 오기가 제대로 수행되었는지 확인하기 위해 몇 가지 샘플을 살펴보고 필요한 경우 데이터 정리를 수행하십시오. 이 단계는 사람들이 일반적으로 생각하는 것처럼 사소한 것이 아닙니다. 그 이유는 DNN의 경우 표준 비선형 파라 메트릭 통계 모델 (NN은 이론적으로이 제품군에 속함)에 적합 할 때 일반적으로 사용하는 것보다 몇 배 더 큰 거대한 데이터 세트 를 처리하기 때문입니다.

  3. 어떤 식 으로든 데이터를 정규화 또는 표준화합니다. NN은 비선형 모델이므로 데이터 정규화는 수치 안정성뿐만 아니라 학습 시간 및 NN 출력에도 영향을 줄 수 있습니다 (정규화와 같은 선형 함수는 비선형 계층 함수로 출퇴근하지 않습니다).

  4. 훈련 / 검증 / 테스트 세트 또는 교차 검증을 사용하는 경우 여러 번 데이터를 분할합니다.

  5. 검증 세트의 손실을 제어하면서 동시에 신경망을 훈련시킵니다. 여기서는 솔루션이 존재하는지, 여러 솔루션이 존재하는지 알 수없는 비 볼록 최적화의 즐거움을 누릴 수 있습니다. 이는 일반화 오류와 얼마나 근접했는지에 대한 최상의 솔루션입니다 그것. 훈련 손실 및 검증 손실 곡선 사이의 비교는 물론, 당신을 안내하지만, 과소 평가하지 않는 다이 하드 의 NN (특히 DNNs)의 태도 : 그들은 종종 보여 (아마 천천히) 당신이 심지어 교육 / 검증 손실을 감소 귀하의 코드에 치명적인 버그 가 있습니다.

  6. 테스트 세트의 정확성을 확인하고 진단 플롯 / 테이블을 작성하십시오.

  7. 결과가 좋지 않기 때문에 포인트 1로 돌아갑니다. 광고 구역을 반복하십시오 .

물론 구체적인 사용 사례에 따라 세부 사항이 변경 될 수 있지만이 거친 캔버스를 염두에두고 잘못 될 가능성이 더 높은 것을 생각할 수 있습니다.

기본 아키텍처 확인

이것은 문제의 원인이 될 수 있습니다. 일반적으로 다음과 같은 예비 점검을 수행합니다.

  • 문제에 잘 작동하는 간단한 아키텍처 (예 : 이미지 분류의 경우 MobileNetV2)를 찾고 적절한 초기화를 적용하십시오 (이 레벨에서는 일반적으로 임의 수행). 이것이 데이터에 대해 올바르게 학습하는 경우 최소한 데이터 세트에 눈부신 문제가 없음을 알고 있습니다. 귀하의 경우에 작동하는 단순하고 테스트 된 아키텍처를 찾을 수 없다면 간단한 기준을 생각 하십시오 . 예를 들어 분류를위한 Naive Bayes 분류기 (또는 가장 일반적인 클래스 만 분류) 또는 시계열 예측을위한 ARIMA 모델

  • 단위 테스트를 빌드하십시오. 이 작업을 무시하고 피 묻은 Jupyter Notebook을 사용하는 것은 대개 검토해야 할 NN 코드의 문제의 근본 원인이며 특히 모델을 프로덕션에 배포해야하는 경우입니다. 가장 유력한 답변이 이미 단위 테스트를 다루었으므로 NN에 대한 단위 테스트 개발을 지원하는 라이브러리가 있습니다 (불행히도 Tensorflow에서만).

훈련 세트

입력 데이터를 다시 확인하십시오. 예를 들어 훈련 세트 및 테스트 세트 레이블을 뒤집 었는지 (예 : 나에게 -___- 한 번) 또는 잘못된 파일을 가져 왔는지 확인하십시오. 입력 샘플 몇 개와 관련 레이블을 살펴보고 의미가 있는지 확인하십시오. 정규화 된 데이터가 실제로 정규화되어 있는지 확인하십시오 (범위를 살펴보십시오). 또한 실제 데이터 세트는 더러워집니다. 분류를 위해 높은 수준의 레이블 노이즈 (잘못된 클래스 레이블이있는 샘플)가 있거나 다변량 시계열 예측이있을 수 있으며 일부 시계열 구성 요소에는 누락 된 데이터가 많이있을 수 있습니다 ( 나는 일부 입력에 대해 94 %의 숫자를 보았습니다.

트레이닝 중에 트레이닝 세트가 네트에 공급되는 순서가 영향을 줄 수 있습니다. 입력과 출력 사이의 연결을 끊지 않고 훈련 세트를 임의로 섞어서 훈련 손실이 감소하는지 확인하십시오.

마지막으로 훈련 세트 문제가 있는지 확인 하는 가장 좋은 방법은 다른 훈련 세트를 사용하는 것입니다. 수집 한 이미지 대신 이미지 분류를 수행하는 경우 CIFAR10 또는 CIFAR100 (또는 훈련 할 여유가있는 경우 ImageNet)과 같은 표준 데이터 세트를 사용하십시오 . 이러한 데이터 세트는 잘 테스트되었습니다. 트레이닝 손실이 여기로 내려 가고 원래 데이터 세트가 아닌 경우 데이터 세트에 문제가있을 수 있습니다.

골든 테스트를

골든 테스트라고하는 두 가지 테스트가 있는데, 훈련하지 않은 NN에서 문제를 찾는 데 매우 유용합니다.

  • 훈련 세트를 1 개 또는 2 개의 샘플로 줄이고이를 훈련시킵니다. NN은 훈련 세트에 즉시 100 %의 정확도에 도달하는 동시에 훈련 세트를 과적 합해야하며, 검증 / 테스트 세트의 정확도는 0 %가됩니다. 이것이 발생하지 않으면 코드에 버그가있는 것입니다.

  • 반대 테스트 : 전체 트레이닝 세트를 유지하지만 레이블을 섞습니다. NN이 지금 배울 수있는 유일한 방법은 훈련 세트를 기억하는 것입니다. 이는 훈련 손실이 매우 느리게 감소하는 반면 테스트 손실은 매우 빠르게 증가한다는 것을 의미합니다. 특히, 테스트 세트에서 랜덤 확률 손실에 도달해야합니다 . 즉, 수업이 1000 명인 경우 0.1 %의 정확도에 도달해야합니다. 레이블을 섞기 전과 후에 학습 손실간에 차이가 없다면 코드가 버그가 있음을 의미합니다 (이전 단계에서 학습 세트 레이블을 이미 확인했음을 기억하십시오).

훈련 지표가 적합한 지 확인

클래스 불균형이 강한 경우 정확도 (0-1 손실)는 엉터리입니다. 교차 엔트로피 손실과 같이보다 의미있는 것을 시도해보십시오. 정확하게 분류하고 싶지는 않지만 높은 정확도로 분류하고 싶습니다.

큰 총을 꺼내

도움이되지 않으면 이제 하이퍼 파라미터로 시작해야합니다. 이것은 NN 훈련의 가장 나쁜 부분이지만, 볼록하지 않은 최적화를 해결하여 매개 변수가 적합한 거대한 식별 할 수없는 모델이므로 이러한 반복을 피할 수없는 경우가 많습니다.

  • 다른 최적화 프로그램을 시도하십시오. SGD는 느리게 훈련되지만 일반화 오류는 낮아지고 Adam은 더 빨리 훈련하지만 테스트 손실은 더 높은 값으로 멈 춥니 다
  • 배치 크기를 줄이십시오
  • 처음에는 학습 속도를 증가시킨 다음 부패 시키거나 주기적 학습 속도를 사용하십시오.
  • 레이어 추가
  • 숨겨진 유닛 추가
  • 정규화를 점차적으로 제거하십시오 (몇 층의 경우 배치 표준 전환 가능). 훈련 손실이 감소하지만 테스트 손실이 증가 할 수 있습니다.
  • 각 레이어의 가중치 및 바이어스 분포를 시각화합니다. 나는 여기에 도착할 필요가 없었지만 BatchNorm을 사용한다면 대략 표준 정규 분포를 기대할 수 있습니다. 신기원으로 가중치의 표준이 비정상적으로 증가하는지 확인하십시오.
  • 교육 시간에 오류가 발생하면 해당 오류를 Google에 알려 주십시오. 어느 날 아침 완벽하게 작동하는 아키텍처를 수정하려고 노력하면서 설치 한 Keras 버전에 버그가있는 다중 GPU 지원이 있으며 업데이트해야한다는 것을 알았습니다. 때때로 나는 반대를해야했다 (패키지 버전을 다운 그레이드).
  • 이력서를 업데이트하고 다른 직업을 찾기 시작하십시오 :-)

+1이지만 "피의 주피터 노트"? 그것에 대해 의견이 있으십니까? :)
amoeba

2
내가 Jupyter Notebooks를 싫어하는 이유는 다음과 같습니다 . TL : DR : 숨겨진 상태, 확산은 고통, 보안 문제이며 단위 / 회귀 / 통합 테스트를 사용하지 않는 등의 나쁜 프로그래밍 방법을 권장합니다. 사람들이 프로그래밍의 기본 사항을 잊어 버리지 않고 NN 교육은 이미 충분히 어렵습니다.
DeltaIV

2
나는 아마도 너무 부정적 일지 모르지만 솔직히 GitHub에서 Jupyter Notebook을 복제하는 사람들과 충분했습니다. 코드를 사용 사례에 맞게 수정하고 아무것도 작동하지 않는다고 불평하는 데 몇 분이 걸릴 것이라고 생각했습니다. 크리프를 위해 PyCharm 또는 VisualStudio Code와 같은 실제 IDE를 사용하여 노트북을 요리하지 않고 잘 구성된 코드를 만드십시오! 특히 모델을 프로덕션으로 배송 할 계획이라면 훨씬 쉽게 할 수 있습니다.
DeltaIV

2
롤 'Jupyter notebook'과 'unit testing'은 서로 관련이 없습니다.
Sycorax

2
(+1) 좋은 글씨입니다. 무작위 테스트에 대한 제안은 실제로 버그가있는 네트워크에 접근하는 좋은 방법입니다.
Sycorax

6

모델이 학습하지 않으면 역 전파가 작동하지 않을 가능성이 높습니다. 그러나 신경망과 같은 블랙 박스 모델에는 잘못된 점이 많으므로 확인해야 할 사항이 많이 있습니다. Sycorax와 Alex는 모두 매우 포괄적 인 답변을 제공한다고 생각합니다. 아직 논의되지 않은 기술 하나를 추가하고 싶습니다.

ϵ

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.