신경망 학습을 위한 recipe 정리 - yarak001/machine_learning_common GitHub Wiki
- 신경망 학습은 약간만 추상적이다.
- 많은 library와 framework가 약 30줄 정도의 놀라운 code로 실행하면 당신의 문제를 바로 해결할 수 있을것 같은 (잘못된)느낌은 준다
>>> your_data = # 당신의 놀라운 data는 여기에 연결
>>> model = SuperCrossValidator(SuperDuper.fit, your_data, ResNet50, SGDOptimizer)
- 이 library와 예제는 아래 requests library처럼 표준 S/W 처럼 깔끔한 API와 추상화를 할 수 있는 것 같은 인상을 줌
>>> r = requests.get('https://api.github.com/user', auth={'user, 'pass'})
>>> r.status_code
200
- 멋지다!. 용기있는 개발자는 query string, urls, GET/POST requests, HTTP connections, 기타등등을 이해해야하는 부담을 감수하고 몇줄의 code뒤의 복잡성을 숨겼음.
- 우리가 익숙하고 기대하는 방식임.
- 불행하게도, 신경망은 이와 같지 않음
- 바로 사용할 수 있는 그런 기술이 아님
- 저자는 Yes you should understand backprop에서 backpropagation을 누수 추상화(leaky abstraction)이라 부르며 이를 설명하였고, 불행히도 상황을 더 심각함
- Backprop + SGD가 마법처럼 당신의 network를 동작하게 하진 않음, Batch norm이 마법처럼 network를 빠르게 수렴하게 하지 않음
- RNN은 마법처럼 text를 바로 plug in하게 하지 않음
- 그리고 문제를 RL(강화학습)으로 공식화 할 수 있다고 해서 꼭 그렇게 해야하는 것도 아님
- 만약 당신이 이런것들이 어떻게 동작하는지 이해하지 못하고 사용할 수 있다고 주장한다면, 당신을 실패할 것임
- 신경망 학습은 서서히 실패한다.
- Code를 잘못 작성하거나, 구성을 잘못하면 종종 예외가 발생함.
- String에 integer를 연결하거나, 어떤 함수가 오직 3개의 인자를 받거나, import가 실패하거나, key가 존재하지 않거나, 두개 list의 element수가 같지 않거나 한 경우
- 추가적으로 특정 기능을 위한 unit test 생성은 가능함
- 이것은 단지 신경망을 학습할때 접할 수 있음
- 문벅적으로 모든것이 정확하더라도, 모든 것이 적합하게 놓여지지 않는다면, 이는 정말로 말하기가 어려움
- Error 발생 가능성은 크고, 논리적이고(구문적과 반대되는), unit test는 어려움이 있음
- 예를들어, data augumentation에서 image 좌우를 flip할때 label을 flip을 잊었다고 해보자. 당신의 신경망은 내부적으로 flip된 image들을 발견하고, 좌우 flip를 추론할 수 있기 때문에 충격적이게도 잘 구동된다.
- 또는 당신의 autoregressive model은 off-by-one bug로 인해 예측값을 입력값으로 취할수 도 있음
- 또는 gradient를 clip하는 대신, loss를 clip하면 훈련 중에 이상치(outlier) 예제가 무시될 수 도 있음
- 또는 가중치를 사전학습 model로부터 초기화하고, original 평균값을 사용하지 않을 수 도 있음
- 또는 규제(regularization)강도, 학습률, decay rate, model size등을 잘못 설정할 수도 있음
- 그러므로, 운이 좋다면, 당신이 잘못 설정한 신경망이 exception을 발생할 것임
- 대부분의 경우는 잘못된 방향으로 서서히 학습됨!!!
- 결과적으로 "빠르고 명렬한(fast and furious)한 신경망 학습 방법은 동작하지 않고, 고통으로 이끌 것임"
- 이제, 고통은 신경망이 잘 학습되게 만들기 위한 위한 완벽히 자연스러운 부분이지만 철처하고, 방어적이고, 편집증적이며, 기본적로 가능한 모든 것을 시각화하 데 집착함으로서 완화될 수 있다.
- 저자의 경험에 따르면 deep learning의 성공과 가장 밀접한 관련이 있는 자질은 인내심과 세부사항에 대한 관심이다.
- 위 두가지 사실에 비추어, 새로운 문제에 신경망을 적용할때 따르는 특정 process를 개발함. 위 두가지 법칙을 진지하게 받아들였음
- 특히, 단순한 것에서 복잡한 것으로 만들면서, 매 단계마다 어떤 것이 발생하고, 실험이나 조사로 issue를 검증한느 방식으로 가설을 견고하게 만들것임
- 우리가 매우 열심히 방지하려는 것은 영원히 발견할 수 없는 bug는, 오설정(misconfiguration)과 연관된 미검증된 복잡성이 한번에 도입되는 것임
- 신경망 code를 작성하는 것이 훈련하는 것과 같다면, 매우 작은 학습률과 추측을 사용하고, 전체 반복 후 full test set를 evaluate하기 원할 것임
- Data와 하나 되기(Become one with the data)
- 신경망을 훈련하기 위한 첫 단계는 신경망 code를 일절 건드리지말고, 대신 온전히 data를 검사하는 것에서 시작함
- 저자는 이 단계는 매우 중요함. 몇 천개의 예제를 scanning하고, data 분포를 이해하고, pattern을 찾는데 매우 많은 시간을 보내는 것을 좋아함. 운이 좋게도 당신의 뇌는 이것에 매우 적합함. 중복된 예제를 발견하거나 손상된 image와 label을 찾음. data 불균형과 편향을 찾음. 전형적으로 data 분류를 위한 process에 좀 더 주의를 기울이 것이며, 이것은 결국 우리가 탐험해야할 architecture종류에 힌트를 줌. 예를들어, local feature들이 충분한가?, global context가 필요한가?, 얼마나 많은 변수들이 있고, 그것의 형태는? 어떤 변수들이 가짜이며 사전처리 되어야하는가? 공간적인 문제인가 또는 평균 pooling을 산출해야하는가? 얼마나 많은 상세 문제들이 있고, image들을 얼마나 down sampling해야하는가? label에 얼마나 많은 noise가 있는가?
- 추가적으로, 신경망은 당신의 data에 대해 효과적으로 압축되고, compile되었기 때문에, 신경망이 잘못 예측한 것과 이것이 어디로부터 왔는지 알수가 있다.
- 만약 당신의 신경망 예측이 원래 data와 일관성이 없으면, 뭔가 잘못된 것이다.
- Data에 대한 품질적인 감을 가지고 되면, search/filter/sort와 같은 당신이 생각할 수 있는 어떤 것(예를들어, label의 type, 주석의 size, 주석의 개수 등과 같은)이라도 간단한 code를 작성하고, 그것들의 분포와 outlier(이상치)을 축을 따라 시각해 보는것은 좋은 생각이다. 이상치는 특히 거의 항상 data 품질이나 전처리 bug로 인해 발견됨.
- 훈련/평가 end-to-end 골격을 먼저 설정하고, 기준 성능을 측정하기(Set up the end-to-end training/evaluation skeleton + get dumb baselines)
-
이제 data도 이해했으니, 우리는 완전 최고의 multi-scale ASPP FPN ResNet에 다다랐고, 이 굉장한 model를 훈련시킬수 있을까요? 당연히 아니다. 그것은 고통스러운 과장입니다. 우리의 다음 과정은 전체 훈련(training) + 평가(evaluation) 골격을 설정하고, 여러 종류의 실험을 통하여 정확성에 대한 신뢰를 획득하는 것이다. 이 단계에서는 어떻게든 망칠수 없는 간단한 model을 선택하는 것이 좋다. 예를들면, 선형 분류기나 매우 작은 ConvNet 같은... 우리는 이것을 훈련하고, loss를 시각화하고, 정확도와 같은 선능 측정을 하고, model로 예측을 하고, 그리고 그 과정에서 명백한 가설로 일련의 실험을 실행한다.
-
Tip & tricks:
- Random seed를 고정(fix random seed)
- Code를 두번 실행할 때 항상 고정된 random seed 사용은 동일한 출력을 보장함, 이는 변동 요인를 제거하고 제정신을 유지하도록 도와줌
- 단순화(simplify)
- 불필요한 치장은 무력하 해라. 예를들어, 이 과정에서는 data augmentation을 명확히 꺼놓는다. Data augmentation은 후에 우리가 포함시킬 규제(regularization)정책(regularization strategy)이지만, 핸재서는 멍청한 bug를 만들어낼 또 다른 기회일 뿐이다.
- 평가(eval)시 중요한 숫자 추가(add significant digits to your eval)
- test loss를 plot할때 전체(큰) test set에 대해서 평가를 실행해라. Batch에 대해서 test loss를 plot하고, tensorboard에서 이를 부드럽게 만드는 것에 의존하지 마라. 우리는 정확성을 추구하며, 제정신을 유지하기 위해 시간을 기꺼이 포기해야 한다.
- 초기화시 loss를 검증(verify loss @ init)
- 당신의 loss가 정확한 loss값에서 시작하도록 검증해라. 예를들어, 마지막 layer를 정확하게 초기화했다면, 초기화시 softmax의 -log(1/n_classes)를 측정해야 한다. L2 regression이나 huber loss등에 대해서도 동일한 기본값을 도출할 수 있다.
- 초기화를 잘(init well)
- 마지막 layer의 가중치를 정확히 초기화하라. 예를들어, 만약 평균이 50인 일부 값들을 회귀하고 있다면, 마지막 편향을 50으로 초기하해라. 만약 긍정:부정이 1:10 비율의 불균형 dataset를 가지고 있다면, 초기화시 신경망이 0.1의 가능성을 예측할 수 있도록 logit에 편향을 설정해라. 이를 정확하게 설정하면 수렴 속도가 빨라지고, 최초 몇번의 반복에서 신경망이 기본적으로 단지 편향을 학습하는 hocky stick loss 곡선이 제거될 것이다.
- 인간 기준(human baseline)
- loss보다는 인간이 해석하고 check할 수 있는 성능지표를 monitoring하라(예를들어 정확도). 가능할때마다 자신의(인간) 정확도를 평가하고 그것과 비교하라. 대안으로는 test data에 두번 주석을 달아서 각 예제를 하나는 예측으로 주석을, 다른 하나는 실제값으로 주석을 달아 취급하는 것이다.
- 입력 독립적 기준(input-independent baseline)
- 입력 독립적인 기준을 훈련하라(예를들어, 가장 쉬은 방법은 모든 input을 0으로 설정하는 것이다). 이것은 당신 data를 0으로 만들어 연결하는 것보다 훨씬 바는 성능을 낼것이다. 그렇지요? 다시말해, model이 입력으로부터 data를 추출하는 방법을 배우나요?
- 한 batch를 과적합하라(overfit one batch)
- 예를들어, 2개 정도의 작은 예제 batch를 과적합하라. 이렇게 함으로써 model의 수용력(예를들어, layer나 filter추가)를 증가시킬 수 잇고, 가장 낮게 달성할 수 있는 loss(예를들어 0)에 접근할 수 있다는 것을 검증한다. 저자는 label과 예측값을 같은 plot으로 시각화하고, 최소 손실에 도달하면 이것들이 완벽하게 정렬되도록 하는 것을 선호한다. 그렇지 않다면, 어딘가에 bug가 존재하는 것이며, 다음 단계로 진행할 수 없다.
- 감소하는 훈련 loss를 검증하라(verify decreasing training loss)
- 장난감 같은 간단한 model로 작업을 하고 있기 때문에 이 시점에 당신의 dataset에 과소적합(underfit) 되어 있을 것이다. 수용력을 조금만 늘려보아라. 자! 당신의 훈련 loss가 감소하지?
- model 바로 직전에 시각화하라(visualize just before the net.)
- 당신의 data를 시각화하기 분명하게 정확한 곳은
y_hat = model(x)
(또는 Tensorflow에서sess.run
) 바로 앞이다. 즉, data와 label의 raw tensor를 시각화로 decoding하여 신경망으로 들어가는 것을 정확히 시각화하길 원할 것이다. 이것이 오직 "진리의 근원"이다. 저자는 셀수 없을만큼 이 과정을 거져 시간 낭비를 줄이고, data 전처리(preprocessing)와 증식(augmentation)에서의 문제점을 도출할 수 있었다.
- 당신의 data를 시각화하기 분명하게 정확한 곳은
- 예측 역동성을 시각화하라(visualize prediction dynamics)
- 저자는 훈련 과정동안 고정된 test batch에 대한 model 예측값을 시각화하는 것을 선호한다. 에측이 어떻게 변화는지에 대한 "역동성"은 훈련이 어떻게 진행되는지에 대한 매우 좋은 직관을 제공한다. 여러 번 신경망이 어떤 방식으로든 너무 많이 흔들려 불안정성을 드러내면 data에 맞추기 위해 "고군분투"하고 있다는 것을 느낄 수 있다. 매우 낮은 또는 매우 높은 학습률은 jitter의 양에서 쉽게 알 수 있다.
- 의존성 chart를 위해 역전파를 사용하라(use backprop to chart dependencies.)
- Deep learning code는 빈번하게 복잡하고, vector화된, 그리고 broadcasting 되는 연산들을 포함한다. 사람들이 이것을 잘못이해하고(예를들어, 어딘가에서 전치(trasnpose)/순열(permute) 대신 보기(view)를 사용) batch 전체에서 의도치않게 정보를 혼합하는 bug를 간간이 볼수 있다. 당신의 신경망은 다른 예제로부터 data를 무시하는 것을 학습할 것이기 때문에 여전히 제대로 동작한다는 우울한 사실이다. 이(또는 이와 관련된)를 debug하는 한 방법은 i번째 예제의 모든 출력을 합산한 것과 같은 어떤 시시한 값으로 loss를 설정하고, 입력까지 모든 역방향 경로로 실행하고, i번째</>입력에 대해서만 0이 아닌 값을 얻도록 하는 것이다. 예를 들어, 시간 t에서의 자기회귀 모델이 1..t-1에만 의존하는지 확인하면서 동일한 전략을 사용할 수 있다. 좀더 일반적으로, 기울기는 당신에게 debug시 유용한 신경망에서 어떤 것이 상호 연관되었는지에 대한 정보를 제공한다.
- 특별한 경우를 일반화하라(generalize a special case.)
- 이것은 매우 일반적인 coding tip이지만, 밑바닥부터 연관된 기능을 구현함으로써 bug를 만들어내는 사람은 볼 수 있다. 지금 바로 할 수 있는 명확한 기능을 작성하여 구동한 후, 향후 이를 동일한 결과를 만들어 낼 수 있도록 일반화하는 것을 선호한다. 전체 loop구조의 code를 먼저 만들고, 한번에 한단계씩 vector화 code할때도 이를 많이 적용한다.
- Random seed를 고정(fix random seed)
- 과적합(Overfit)
-
이 단계에서 우리는 dataset에 잘 이해하고 있으며, 전체 동작하는 훈련+평가 pipeline을 가지고 있다. 주어진 어떤 model에 대해서도 우리는 (반복적으로) 신뢰할 수 있는 지표를 계산할 수 있다. 또한 입력 독립적인 기준에 대한 성능, 몇몇의 엉뚱한 기준에 대한 성능(우리는 이것들은 이겨낼 것이다.)으로 무장했으며, 인간의 성능(여기에 도달하길 바라는)에 대한 개략적인 감을 가지고 있다. 이제 이 단계는 좋은 model을 대한 반복적인 설정이다.
-
좋은 model을 찾기위한 접근법에는 두 단계이다. 첫째는, 과적합 할 수 있는(다시말해, 훈련 loss에 중점을 둔) 충분히 큰 model을 가지고, 이를 적절하게 규제하는 것(검증 loss를 향상시키는 대신 훈련 loss를 포기하는)이다. 이 두 단계를 선호하는 이유는 만약 어떤 model을 가지고도 더 이상 낮은 error율에 도달할 수 없는 경우, 이를 통해 issue, bug, 오설정들을 알아낼 수 있기 때문이다.
-
Tip & tricks:
- model을 선택하라(picking a model.)
- 좋은 훈련 loss에 도달하기 위해서 data에 적합한 구조를 선택하기 원할 것이다. 이때 첫번째 조언은 영웅이 되지 마라(Don't be a hero). 신경망 도구상자에서 어떤 이들에게 의미가 있는 다양한 이국적인 구조에서 신경망 도구상자의 lego block을 쌓은데 창의적이고 미친듯 열정적인 사람들이 있다. Project 초기 단계에서의 이런 유혹은 강하게 이겨내라. 간단하게 가장 연관된 논문을 찾고, 좋은 성능을 낼 수 있는 가장 간단한 구조를 복사/붙여넣기 할 것을 조언한다. 예를들어, image 분류를 하고 있다면, 영웅이 되지말고, 단지 ResNet-50 code를 복사/붙여넣기하여 실행해라. 이후 얼마든지 customization을 할 수 있다.
- adam이 안전하다(adam is safe.)
- 이전 단계의 기준값 설정시 학습률 3e-4의 Adam사용을 선호한다. 경험상 Adam이 잘못된 학습률을 포함한 hyper-parameter들에 관대하다. ConvNet에서 잘 tuning된 SGD가 거의 대부분 Adam보다 약간 성능이 좋겠지만, 최적화 학습률 구간이 더 좁고 문제의 소지가 있다. (주의: 만약 RNN과 연관된 model을 사용하고 있다면, Adam을 사용하는 것이 일반적이다. 다시 말하지만, project 초기단계에서 영웅이 되지말고 연관된 논의을 따라하라)
- 한번에 하나씩 복잡화하라(complexify only one at a time.)
- 만약 당신의 분류기에 개선할 것이 여러 것이 있다면, 매번 기대했던 것처럼 성능이 개선되는 것을 확인하면서 한개씩 연결하라. 처음에 모든 것을 model에 쑤셔넣지는 말아라. 복잡성을 구축하는 다른 방법은 예를들어, 처음에는 작은 image를 사용하고 이후 더 큰 image를 사용하는 것이다.
- 학습률 감소 기본값을 신뢰하지 마라(do not trust learning rate decay default.)
- 만약 다른 domain code를 재사용하는 경우, 항상 학습률 감소에 주의해야한다. 다른 문제에는 다른 감소를 사용하길 원하며, 더 나쁜 것은 일반적인 구현에서 schedule은 현재 epoch 번호에 기반하며, 이는 단순히 dataset의 크기에 따라 크게 달라질 수 있다. 예를들어, ImageNet은 epoch 30에 1/10으로 감소한다. 만약 ImageNet을 훈련시키고 있지 않다면, 거의 확실히 이를 원하지 않을 것이다. 주의를 기울이고 있지 않으면 당신의 code는 비밀리에 학습률이 너무 일찍 0으로 감소하여 model이 수렴되지 않게 할 것이다. 업무에서 전체적으로 항상 학습률 감소를 꺼놓고(contant LR사용), 감쇠값을 가장 마지막에 tuning한다.
- model을 선택하라(picking a model.)
- 규제(Regularize) 이상적으로는 현재 우리는 훈련 set을 학습한(fitting)한 거대한 model을 가지고 있다. 이제 이를 규제하고, 학습 정확도를 포기하고 검증 정확도를 얻을 때이다.
-
Tip & tricks:
- 더 많은 data를 모아라(get more data.)
- 첫째로, 어떤 경우든 model을 규제하기 위해서 가장 좋은 방법은 좀더 많은 실제 훈련 data를 제공하는 것이다. 좀 더 많은 data 수집이 가능한데 작은 dataset으로 끝까지 쥐어짜는 것은 많은 노력을 소모하는 흔한 실수이다. 더 많은 data를 추가하는 것이 잘 구성된 신경망을 거의 무한정 성능을 단조롭게 개선할 수 있는 유일한 보장된 방법이다. (당신이 여유가 있다면)다른 방법은 ensemble이지만 model이 5개 이후부터 최고 성능을 냅니다.
- data 증식하라(data augment)
- 다음으로 실 data에 가장 좋은 것은 반쪽짜리 가짜 data를 입니다. 더 공격적으로 data 증식을 해보아라.
- 창의적이 증식(creative augmentation.)
- 반쪽짜리 가짜 data를 만들수 없으면, 완전한 가짜 data를 만들어라. dataset를 확장할 수 있는 창의적인 방법들이 있다. 예를들어, domain randomization, simulation사용, 화면에 data를 삽입하는 것과 같은 영리한 hybrids, 또는 GAN이 있다.
- 사전학습(pretrain)
- 이미 충분한 양의 data가 있더라도 가능하면 사전 훈련된 신경망을 사용하는 것이 나쁠 일은 거의 없다.
- 지도학습을 고수하라(stick with supervised learning.)
- 비지도식 사전학습에 현혹되지 마라. 2008년도의 blog글과 다르게, 현재의 computer vision에서 좋은 결과가 보고된 경우는 없다(BERT류와 같은 NLP에는 잘 맞는다 하더라도, text의 신중한 특성과 높은 noise 비율에 대한 신호로 인할 가능성이 높다.)
- 입력 차원을 줄여라(smaller input dimensionality.)
- 비논리적인 징조가 있는 feature는 제거하라. dataset이 작다면, 비논리적인 입력은 과적합을 만드는 또 다른 요소일 뿐이다. 유사하게, 저수준의 세부사항이 그다지 중요하지 않은 경우 더 작은 image를 사용하라.
- model size를 줄여라(smaller model size.)
- 많은 경우 model size를 줄이기 위해 domain 지식 제약(constraint)를 사용할 수 있다. 예를들어, ImageNet 상단에 완전 연결층을 사용하는 것이 trend이기는 하지만, 간단한 average pooling으로 교체하여 처리시 많은 양의 parameter를 제거할 수 있다.
- batch size를 감소시켜라(decrease the batch size.)
- batch norm의 정규화로 인해 어떻게 보면 더 작은 batch size가 강한 규제과 연관될 수 있다.
- drop
- dropout을 추가하라. ConvNet은 dropout2d(spatial dropout) 을 사용하라. batch normalization에서 dropout은 제대로 동작하지 않을수 있기 때문에 신중하게 사용해야한다. 이는 배치 경험적인 평균/분산이 전체 평균/분산 version보다 더 적합하기 때문에 scale과 offset이 batch에 좀 더 흔들리기(wiggle) 때문이다.
- 가중치 감소(weight decay)
- 가중치 감소 penalty를 증가시켜라
- 조기종료(early stopping)
- 축정된 검증 loss를 기반으로 model이 막 과적합 되려고 할때 훈련을 멈춰라.
- 더 큰 model을 시도하라(try a large model.)
- 조기종료 뒤에 이것을 마지막으로 언급하지만, 더 큰 model은 결국에 좀 더 과적합하게 되지만 이 model의 "조기종료 된" 성능은 종종 더 작은 model보다 좋다는 것을 몇 번 경험했다.
- 더 많은 data를 모아라(get more data.)
-
마지막으로 당신의 신경망이 의미있는 분류기라는 추가적인 확신을 얻기위해, 신경망의 첫번째 layer 가중치값을 시각화하고, 의미있는 멋진 모서리(edges)를 얻는 것을 선호한다. 만약 첫번째 filter가 noise처럼 보인다면, 뭔가 꺼져있을 수도 있다. 유사하게, 신경망내의 활성값들(activations)이 때때로 이상한 요소를 표시하고, 문제에 대한 hint를 제공한다.
- 튜닝(tune)
-
이제 당신은 dataset과 함께 낮은 검증 loss를 달성하기 위해서 architecture를 위한 광범위한 model 공간을 탐색하는 "loop 안에"에 있어야 한다.
-
Tip and tricks:
- Grid 검색보다는 random search(random over grid search.)
- 동시에 많은 hyper-parameter에 대한 tuning은 grid검색을 사용하여 모든 설정의 포함하도록 하는게 매혹적으로 들리겠지만, 대신에 random 검색 사용하는게 최고라는 것은 명심해야한다. 직관적으로, 이것은 신경망이 빈번하게 몇몇의 parameter에 민감하기 때문이다. 한계내에서, parameter a가 중요하지만 b를 변경해도 효과가 없는 경우, 몇몇의 지점에서 여러번 더 철저하게 a를 sampling하는 것이 좋다.
- hyper-parameter 최적화(hyper-parameter optimization)
- 주위에 많은 bayesian hyper-parameter 최적화 toolbox가 있지만, 개인적인 경험으로는 model의 멋지고 넓은 공간을 탐색하기 위한 SOTA(State Of The Art) 접근법은 intern에게 맡기는 것이다. 농담이다!
- Grid 검색보다는 random search(random over grid search.)
- 쥐어짜기(Squeeze out the juice)
- 일단 최고의 architecture type과 hyper-parameter를 찾았다면, system의 최고의 성능을 얻어내기 위한 몇가지 trick이 있다.
- 앙상블(ensembles)
- ensemble은 무엇이든 2%정도 정확도 향상을 얻을수 있는 보장된 방법이다. test시 계산을 할 여유가 없다면 어둠의 지식을 사용하여 ensemble을 증류(disitil)하는 것을 살펴보아라
- 지속적인 훈련(leave it training)
- 검증 loss가 평준화 되는 것처럼 보이면 사람들은 종종 훈련 중단에 대한 유혹을 받게된다. 경험상 신경망은 직관적이지 않은 긴 시간동안 훈련을 지속한다. 실수로 겨울 방학동안 model을 훈련시켜져, 1월에 돌아왔을때 SOTA를 달성했다.
- 앙상블(ensembles)
일단 당신이 여기에 있다면, 당신은 성공을 위한 모든 재료를 가지게 될 것이다. 기술, dataset, 문제에 대한 깊은 이해를 가지고 있고, 전체적인 훈련/평가 infra structure를 구축하였으며, 높은 신뢰성의 정확도를 달성하였고, 각 단계에서 예측한 방식으로 성능을 향상하면서 점점 더 복잡해지는 model을 탐색하였다. 이제 많은 논문을 읽을, 많은 실험을 하면서, SOTA결과를 얻을 준비가 되었다. 행운을 빌겠다.