본문 바로가기
번역한 IT 책/딥러닝 모델 설계를 떠받치는 기술

"딥러닝 모델 설계를 떠받치는 기술"에서 제시하는 55가지 기법

by 아리가람 아리가람1 2020. 5. 7.

제가 번역했던 "딥러닝 모델 설계를 떠받치는 기술(원제: Deep Learning Quick Reference)"(2019, 위키북스 간, 마이크 베르니코 저, 박진수 역)에서 제시하는 인공지능 모델 설계와 관련된 기법들을 정리해 보았습니다. 이 책에 실린 기법들은 참 소중한 것들이기에 널리 알려지기를 바라서 정리해 둔 것입니다. 딥러닝 모델을 개발하다가 모델이 바라던 대로 수렴하지 않는다면 아래 기법들을 선별해 적용해 보시기 바랍니다. 

이 블로그에는 참고문헌의 내용을 참조하여 이해하기 쉬운 문장으로 다시 정리해 두었으니(문장을 그대로 인용할 때는 인용부호를 사용함), 자세한 내용을 알고 싶다면 참고문헌에서 직접 찾아보시기 바랍니다. 그리고 p자로 시작되는 숫자는 해당 내용이 나오는 페이지 번호(쪽 번호)입니다. 

  1. p5: 활성함수는 신경망 모델의 중간 계층을 구성하고 있는 뉴런들에게 있어서 무척 중요한 역할을 한다. 활성함수를 사용하지 않으면 신경망 모델 자체는 일종의 선형 함수를 근사하는 모델이 되어 버리고 말기 때문이다.
  2. p7: 모델의 중간 계층에서는 활성함수 중에서도 tanh(쌍곡탄젠트 함수)가 sigmoid(S자형 함수)보다 더 잘 작동한다. 이는 tanh의 출력 구간이 [-1, 1]이고 sigmoid의 출력 구간이 [0, 1]이기 때문이다. tanh가 sigmoid보다 출력 구간이 더 넓은데, 이때의 추가 출력 구간인 [-1, 0] 부분이 경사도 소실 문제나 경사도 폭증 문제가 생길 때 어느 정도 복원력을 발휘할 수 있게 하기 때문이다.
  3. p7: 위 2항과 같은 이유로 인해 일반적으로 ReLU 활성함수를 쓰면 tanh나 sigmoid를 쓰는 경우보다 모델이 더 빠르게 수렴한다. 
  4. p7: ReLU는 비교적 안심하고 쓸 수 있는 활성함수다. 경사도 소실 문제에서 복원력을 발휘하기 때문이다. 
  5. p7: ReLU의 1차 미분계수가 정확하게 0으로 정의되지 않은 단점을 leaky ReLU 등의 변형 ReLU로 풀 수 있다. 
  6. p10: 모델을 훈련할 때 단일 데이터 점(즉, 한 가지 사례)이나 전체 데이터 점(즉, 전체 사례)을 사용하기보다는 데이터 점을 미니배치(mini batch, 즉 작은 집단) 단위로 묶어 훈련하는 게 거의 항상 바람직하다. 
  7. p11: 경사 하강법으로 모델을 훈련할 때 운동량(momentum)을 도입하면 한 방향으로 경사가 이어질 때에 학습 속도(learning late, 즉 학습률)를 높일 수 있어 경사 하강 속도를 높일 수 있다. 
  8. p11: 일반적으로 운동량을 그리스어 베타 문자로 표시하는 데, 이 때 운동량 값으로는 0.9를 지정하는 게 보편적이며, 굳이 변경할 필요가 없는 수치이므로 조율 대상 하이퍼 파라미터가 아닌 셈이다.
  9. p12: 최적화기(optimizer)로는 Adam이 보편적으로 쓰이는데, 다양한 문제에 잘 작용한다. 
  10. p12: 심층신경망을 밑바닥부터 만들기보다는 프레임워크(예를 들면 케라스, 텐서플로 등)를 활용하는 편이 더 실용적이다.
  11. p22: 훈련용, 검증용, 테스트용 데이터를 동일한 데이터셋에서 가져오는 게 좋으며, 최소한 검증용과 테스트용만이라도 같은 데이터셋에서 가져와야 한다. 그래야 동일한 데이터 분포를 사용하는 셈이 되어 신경망 성능을 제대로 측정할 수 있기 때문이다. 
  12. p23: 전체 데이터셋 분량 중 10~20%를 검증용과 테스트용으로 사용하는 게 관례이지만, 데이터셋이 커진다면 이 비율을 줄여도 좋다.
  13. p23: 신경망의 편향이 크다면 계층 추가, 뉴런 추가, 계층과 뉴런을 동시 추가, 합성곱 계층 이용, 재귀 계층 이용을 생각해 볼 수 있다. 
  14. p23: 신경망의 분산이 크다면 훈련용 데이터 추가, 신경망에 정칙화 기법 적용을 생각해 볼 수 있다. 정칙화 기법으로는 L2 정칙화, 드롭아웃, 배치 정규화 등이 있다.
  15. p28: 데이터 내용이 복잡할수록 신경망으로 처리하는 편이 더 바람직하다. 
  16. p31: 데이터를 정규화하여 각 특징의 척도(즉, 눈금)를 동일하게 함으로써 각 특징들을 서로 비교할 수 있게 해야 하고, 이러한 척도들이 모두 활성 함수로 처리할 수 있는 범위 내에 있게 해야 한다. 
  17. p32: 비용 함수를 고를 때는 사용 사례에 적절한 것을 골라야 한다. 예를 들어 MAE(평균 절대 오차)는 RMSE(제곱급 평균 제곱 오차)보다 해석하기 쉬운 반면에, 데이터에 큰 이상점(outliers)이 있을 때는 RMSE 값이 MAE 값보다 훨씬 크게 나타나므로 알아보기 쉽다.
  18. p32: 케라스를 프레임워크로 사용한다면 함수형 API를 쓰는 편이 더 바람직하다. "약간 더 장황하기는 해도 더 나은 유연성을 얻을 수 있다."
  19. p37: 입력과 출력 사이의 관계가 복잡할수록 은닉 계층을 더 늘린다. 
  20. p40: 모델을 조율해야 한다면 은닉 계층 개수 조절, 각 은닉 계층의 뉴런 개수 조절, 드롭아웃 계층 가감, 정칙화 기능 가감, 활성함수 변경, 학습 속도 변경 등을 해 본다. 
  21. p43: 텐서보드를 사용하면 계량 기준(metric)과 파라미터의 변화를 가시화해서 살펴볼 수 있으므로, 텐서보드는 최적화를 하기에 아주 적합하고, 이에 따라 우리가 풀어야 할 문제를 빠르게 풀 수 있다.
  22. p54: 기존 머신러닝 기법과 달리 딥러닝 기법에 쓰이는 심층신경망에서는 굳이 특징을 선별할 필요가 없다.
  23. p55: 어떤 특징이 표적치(target, 목푯값)의 변화에 크게 기여하는지를 알고 싶을 때는(즉, 모델을 해석해야 한다면) 심층신경망은 적절치 않다.
  24. p55: 정형 데이터(즉, 구조화된 데이터)라면 딥러닝 방식보다는 전통적인 머신러닝 방식부터 시도해 보고 나중에 딥러닝 방식을 시도해 보는 게 좋다. 
  25. p58: 손실이 큰 의미가 없는 경우라면 정확도(accuracy)를 계량기준(metric)으로 삼아도 무방하다.
  26. p60: 계층 수가 많으면(즉, 뉴런 개수가 많으면) 분산이 커질 가능성이 높지만, 뉴런이 너무 많은 신경망으로 시작해 실수를 거듭하며 뉴런 개수를 줄여가는 편이, 적은 뉴런으로 시작해서 뉴런 개수를 늘려 보는 편보다 더 좋다.
  27. p82: 심층신경망의 과적합을 줄이기에는 드롭아웃이 정말 좋은 방법이다. 
  28. p83: 신경망의 크기를 줄일수록 과적합 가능성이 줄어든다. 
  29. p84: 탈락 비율(dropout probability, 즉 드롭아웃 확률)을 0.5부터 지정해 보는 게 좋다. 이 값이 꽤 잘 먹힌다. 
  30. p84: 마찬가지로 모든 계층의 유지 확률(keep probability)도 0.5로 지정하는 편이 좋다. 
  31. p84: 첫 번째 계층에서만 드롭아웃을 사용하는 방법도 좋다. 
  32. p85: L1 정칙화와 L2 정칙화 중에서는 L2 정칙화가 더 효율적이다. 
  33. p90: 거인의 어깨 위에 서서 보면 더 멀리 볼 수 있듯이, 기존 신경망 아키텍처를 활용하면 더 나은 아키텍처를 만들기가 더 쉽다. 
  34. p91: 일단 신경망이 과적합될 때까지(즉, 더 이상 편향치가 큰 모델이 나오지 않을 때까지) 계층과 뉴런을 계속 추가해 보는 일부터 한 다음에, 드롭아웃이나 정칙화 또는 조기 중단 기법을 사용해 분산을 줄여 나가 보자. 
  35. p92: 조율해 보아야 할 하이퍼파라미터로는 최적화기(optimizer) 종류, 각 최적화기의 학습속도와 운동량과 감쇠율, 신경망의 초기 가중치, 뉴런의 활성함수 종류, 탈락 확률(dropout probability)과 정칙화 파라미터, 배치 크기 등이 있다. 
  36. p117: 신경망에 쓸 이미지 데이터를 늘리려고(즉, 데이터 확대를 하려고), 기존 이미지를 변형해서 새 이미지를 만들려고 할 때는 지나치게 많이 변형하지 말고 조금씩만 변형하는 게 좋다(예를 들면, 그림 내 물체를 조금만 비틀거나 옮기는 경우 등). 지나치게 변형하면 신경망이 해당 이미지를 학습하지 못하는 경구가 생긴다는 점을 경험적으로 알게 되었다.
  37. p120: 보유한 데이터가 많지 않다면 전이학습(transfer learning) 기술을 이용하는 게 바람직하다.
  38. p122: "모델 성능이 훈련에 사용되는 관측 개수의 로그에 맞춰 선형적으로 증가한다".
  39. p122: 전이학습 시에도 추가할 데이터 개수의 로그에 맞춰 모델 성능이 선형적으로 증가한다.
  40. p122: 전이학습 시에는 사전 훈련 모델이 다루던 분야와 새로 응용할 분야 간에 유사할수록 데이터가 덜 필요하다.
  41. p129: 전이학습 시에 미세조정(fine tuning)이 필요하다면 활성함수로는 adam이나 rmsprop을 사용하지 않는 게 좋다. 
  42. p141: 정상성을 지닌 데이터를 사용해 훈련한 LSTM이 훨썬 더 좋은 모델이 된다.
  43. p142: 모델을 구축할 때는 가능한 한 가장 단순한 모델부터 구축해 보자. 
  44. p151: 상태 저장 LSTM(statefull LSTM)을 훈련할 때 필요한 에포크 횟수는 상태 비저장 LSTM(stateless LSTM)을 훈련할 때보다 더 적다.
  45. p170: 시퀀스 형태로 구성한 텍스트가 있다면 일반적으로 임베딩 계층(매장 계층)을 사용하기보다는 LSTM 계층을 사용하는 편이 더 낫다.
  46. p171: 자연어 처리 문제를 해결해야 할 때는 일반적으로 CNN이 LSTM보다 더 잘 작동하고 더 빠르게 수렴한다.
  47. p171: 그렇지만 풀어야 할 문제에 어떤 상태(states)가 필요하다거나, 시퀀스 중에 한참 전에 나온 부분으로부터도 학습을 해야 한다면 LSTM보다는 CNN을 사용하는 편이 더 낫다. 
  48. p171: 반면에 본문을 잘 대표하는 특정 단어 집합을 찾아내야 하는 문제라거나 문서에 함축된 의미론적 정서를 감지해야 한다면 CNN을 사용하는 편이 더 낫다. 
  49. p191: 시퀀스-투-시퀀스 모델(sequence-to-sequence)의 가장 실용적인 용도는 기계번역과 챗봇과 자동 텍스트 요약이다. 
  50. p241: 생성적 적대 망(GAN)에서 최빈값 붕괴(mode collapse) 현상이 나온다면, 판별기(discriminator, 즉 판별자)의 성능을 높이면 문제를 해결하는 데 도움이 된다. 
  51. p242: GAN의 학습이 잘 되게 하려면 진짜 데이터로 이뤄진 미니배치와 가짜 데이터로 이뤄진 미니배치를 구성하고, 따로따로 갱신한다.
  52. p242: GAN의 학습이 잘 되게 하려면 ReLU보다는 leaky ReLU를 사용하자. 
  53. p242: GAN의 학습 시에 최빈값 붕괴에 대해 방어하려면 생성기(generator, 즉 생성자)에서 드롭아웃을 사용해 잡음을 공급한다.
  54. p242: GAN의 학습 시에 진짜 사례에 대해서는 그 레이블 값으로 0.7에서 1에 이르는 값을 유연하게 사용하고, 가짜 사례에 대해서는 0부터 0.3 사이의 값을 유연하게 선택해 사용하면, 잡음을 공급하는 꼴이 되어 정보가 판별기에서 생성기로 계속 흐르게 하는 데 도움이 된다. 이처럼 유연한 값으로 이뤄진 레이블을 소프트 레이블(soft lable)이라고 한다.
  55. p245: GAN의 경우에는 배치 정규화 기법과 드롭아웃 기법을 모두 사용하는 게 도움이 된다(일반적인 신경망에서는 이 두 가지 기법을 동시에 사용하지 않는다.)

댓글0