|
| 1 | +> Q. 어떻게 Neural Network를 만들까? |
| 2 | +> |
| 3 | +> - *데이터 및 모델 준비(Setup)* |
| 4 | +> |
| 5 | +> *-Activation function* |
| 6 | +> |
| 7 | +> *-Data Preprocesssing* |
| 8 | +> |
| 9 | +> *-Weight Initialization* |
| 10 | +> |
| 11 | +> *-Batch Normalization* |
| 12 | +> |
| 13 | +> - Traning dynamics |
| 14 | +> |
| 15 | +> -Hyperparameter optimization |
| 16 | +> |
| 17 | +> - Evaluation |
| 18 | +
|
| 19 | +실제로 Neural network를 구현할 때 좋은 예측을 위해서는 어떤 것들을 고려해야 하는 지 확인해보자 |
| 20 | + |
| 21 | +1. Activation function |
| 22 | + |
| 23 | + 사용할 수 있는 activation function의 종류는 여러가지가 있다. |
| 24 | + |
| 25 | +  |
| 26 | + |
| 27 | + |
| 28 | + |
| 29 | + > 좋은 activation function의 조건: |
| 30 | + > |
| 31 | + > -functions의 기울기가 평평한 곳이 없어야 한다 |
| 32 | + > |
| 33 | + > -activation function의 결과값이 양수,음수 모두 |
| 34 | +
|
| 35 | + 만약 기울기가 평평한 곳이 있다면(x=10이라고 가정), downstream으로의 gradient가 0이 된다. 이는 결국 gradient가 소멸되게 만들수 있다. |
| 36 | + |
| 37 | +  |
| 38 | + |
| 39 | + 또한 위의 그래프와 같이 activation function의 함숫값이 모두 양수라면, downstream으로 넘어가는 X값은 항상 절댓값을 증가시키는 방향이 된다. 만약 양수였다면 계속 커지고, 음수였다면 계속 작아진다. 따라서 gradient update의 진행 방향이 한정적일 수 밖에 없다. 따라서 파란색 화살표와 같은 w를 얻고 싶을 때는 지그재그로 움직여서 매우 비효율적으로 w를 구하게 된다. |
| 40 | + |
| 41 | +2. Data Preprocessing |
| 42 | + |
| 43 | + > -0 centering |
| 44 | + > |
| 45 | + > -normalization |
| 46 | +
|
| 47 | + Data를 원점으로 맞추고, 각 차원의 데이터가 동일한 범위 내의 값을 갖도록 정규화 시켜 준다. 이미지의 경우 대부분 픽셀이 0-255사이의 값을 가지고 있기 때문에 normalization 과정은 반드시 필요하지는 않다. |
| 48 | + |
| 49 | +  |
| 50 | + |
| 51 | + 실제 전처리 과정에서는 PCA(Principal Component Analysis)와 whitening이 쓰인다. 자세한 것은 아래의 사이트를 참고 |
| 52 | + |
| 53 | + http://aikorea.org/cs231n/neural-networks-2-kr/(cs231n 강의 노트 한국어 번역 ) |
| 54 | + |
| 55 | + http://cs231n.github.io/neural-networks-2/(cs231n 강의 노트) |
| 56 | + |
| 57 | +3. Weight Initialization |
| 58 | + |
| 59 | + 처음 training을 시킬 때는 사용자가 weight을 정해주고, 2번째부터 gradient를 이용해 최적화를 시킨다. 처음 넣어주는 weight에 따라 결과값이 천차만별이 되기 때문에 첫weight을 설정해주는 방법에는 여러가지가 있다. |
| 60 | + |
| 61 | + 만약 w을 모두 0으로 설정해둔다면, 신경망 내의 모든 뉴런은 동일한 결과를 내게 되고 결과적으로 모두 같은 parameter로 업데이트가 된다. 이렇게 하면 가중치를 주는 의미가 없어진다. |
| 62 | + |
| 63 | + 따라서 고안해낸 방법이 0에 가까운 작은 난수를 weight로 넣는 것이다. 이 때 주의할 점은 만약 신경망이 deep해진다면 downstream으로 가면서 0에 가까운 작은 수들이 곱해져 gradient가 감소할 수도 있다는 점이다. |
| 64 | + |
| 65 | + 반대로 큰 난수를 weight로 넣는다면 각 노드에서 downstream으로 넘어가는 값이 커지게 되어 결국엔 결과값의 격차가 매우 큰 상태가 되어버린다. |
| 66 | + |
| 67 | + weight를 초기화하는 좋은 방법 중의 하나는 Xavier Initialization이다. 위의 방법들은 입력 데이터수가 커지면 분산도 커진다는 단점이 있는데, 여기서는 가중치 벡터를 입력 데이터 수의 제곱근 값으로 나누어 뉴런 출력의 분산을 1로 정규화한다. 특히 ReLu를 activation function으로 쓴다면 w = np.random.randn(n) * sqrt(2.0/n)로 가중치를 초기화 하는 것이 권장된다. |
| 68 | + |
| 69 | + [Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification](http://arxiv-web3.library.cornell.edu/abs/1502.01852) by He et al (이유는 잘...) |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | +4. Batch Normalization |
| 74 | + |
| 75 | + 모델에 Traning data 전체를 한꺼번에 학습시키면 부담이 크기 때문에 **작은 mini-batch 단위로 만들어** 학습시키면서 parameter를 업데이트 한다. 전체에 대해 학습 시키는 것이 효과가 최고겠지만, mini-batch로 나누어 학습시키면 **더 자주, 빠르게 parameter를 업데이트** 할 수 있어 충분히 효과적이다. |
| 76 | + |
| 77 | + 이때 mini-batch는 전체를 대표할 수 있도록 만들어주어야하며, Normalization을 해 주어야 한다. |
| 78 | + |
| 79 | + *자세한 정보는 아래 블로그 참조 |
| 80 | + |
| 81 | + https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220808903260&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F |
| 82 | + |
| 83 | + |
| 84 | + |
| 85 | +> Q. 좀 더 효율적으로 학습하는 방법? |
| 86 | +> |
| 87 | +> :학습과정을 지켜보면서 값들(hyperparameter)을 조정해보자! (Babysitting the learning process) |
| 88 | +
|
| 89 | +과정: Preprocess data --> choose architecture |
| 90 | + |
| 91 | +*중요 개념 |
| 92 | + |
| 93 | + -epoch: 각 자료가 몇 번이나 학습에 사용되었는지 |
| 94 | + |
| 95 | + (반복횟수는 배치 사이즈 선택에 따라 임의로 바뀔 수 있음) |
| 96 | + |
| 97 | + |
| 98 | + |
| 99 | +1. Loss 를 확인하자. |
| 100 | + |
| 101 | + :epoch이 지남에 따라 loss가 어떻게 변화하는 지 확인하자. |
| 102 | + |
| 103 | +  |
| 104 | + |
| 105 | +2. Train/Validation accuracy |
| 106 | + |
| 107 | +  |
| 108 | + |
| 109 | +3. Parameter optimization |
| 110 | + |
| 111 | + :cross validation, learning rate.. |
| 112 | + |
| 113 | + :grid search보다는 random search |
| 114 | + |
| 115 | +  |
| 116 | + |
| 117 | +<Recommendation> |
| 118 | + |
| 119 | +-Activation Function: ReLU |
| 120 | + |
| 121 | +-Data Preprocessing: substract mean |
| 122 | + |
| 123 | +-Weight Initialization: Xavier init |
| 124 | + |
| 125 | +-Use Batch Normalization |
| 126 | + |
| 127 | +-Babysitting the Learning process |
| 128 | + |
| 129 | +-Hyperparameter Optimization |
| 130 | + |
0 commit comments