일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Python
- Brightics studio
- 범주형 변수 처리
- michigan university deep learning for computer vision
- 비전공자를 위한 데이터 분석
- 브라이틱스 서포터즈
- 딥러닝
- pymysql
- 머신러닝
- 데이터 분석 플랫폼
- Activation Function
- 분석 툴
- Brigthics Studio
- Deep Learning for Computer Vision
- 파이썬 SQL 연동
- 데이터 분석
- Brightics AI
- paper review
- Brightics EDA
- 파이썬 내장 그래프
- 검증 평가 지표
- 삼성 SDS
- 브라이틱스 스태킹
- 삼성 SDS 서포터즈
- 브라이틱스 프로젝트
- 브라이틱스 분석
- Random Forest
- 서포터즈 촬영
- 브라이틱스 AI
- Brightics 서포터즈
- Today
- Total
하마가 분석하마
10. Training Neural Network 본문
10. Training Neural Network
Rrohchan 2022. 2. 7. 11:49Michigan University의 'Deep Learning for Computer Vision' 강의를 듣고 정리한 내용입니다.
Training Neural Network
neural networks를 학습시키기 위해, 학습 이전에 필요한 설정들, 그리고 트레이닝을 진행하는 동안 필요한 것들에 대해 알아봄
Activation Function
활성화 함수 각각에 대해서 어떤 특징과 장단점이 있는지 하나씩 살펴보겠다.
1. Sigmoid
전통적으로 사용해온 활성함수이다. Sigmoid 함수는 로지스틱 회귀분석으로부터 왔고, 확률적인 해석이 가능하다. 따라서 확률과 비슷하게 [0,1] 값을 갖는다. 예를 들어, σ(x)=0.8 이면, 다음 레이어의 특정 노드를 활성화시킬 확률이 0.8이라고 해석할 수 있다.
Sigmoid는 2가지 문제점이 있다.
- graident 값이 죽음
- sigmoid 활성홤수의 output이 0 근처에 center가 되어 있지 않음
- exp 연산이 비쌈
gradient 값이 죽는 것부터 살펴보자.

Downstream gradient를 계산할 때, local gradient와 upstream gradient가 곱해지는데, 만약 x가 10 또는 -10이면 기울기가 0이 되어 sigmoid 노드에서의 local gradient가 거의 0이 된다. 아랫단 layer에 대응하는 weight의 업데이트는 아주 미미하다고 할 수 있다.
Deep Neural Network를 쌓으면, X에서 10이상, -10 이하의 값이 나타나는 layer의 노드들이 매우 많을 것이다. 이 값들의 그래디언트가 계속해서 누적되면서, 맨 아랫단에 대응하는 weight에는 업데이트되는 그래디언트 양이 거의 없을 것이다. 결과적으로 트레이닝이 거의 되지 않는다.
2번째 문제인 not zero-centered를 보자.

Input 값이 모두 양수일 때, w쪽으로의 local gradient를 계산해보면 늘 양수가 나온다. (x가 전부이기에) weight 쪽으로의 로컬 그래디언트는 무조건 양수. X0이니까. Upstream 그래디언트와 같은 부호가 다운스트림으로 나가게 된다. (local이양수니까) 이렇게 되면 w들이 모두 positive 혹은 모두 negative값이 된다. 따라서 그림의 초록색 방향(제 1사분면, 제3 사분면)으로만 그래디언트가 계산된다. 따라서 그래디언트에 의한 파라미터 w의 업데이트가 효율적이지 않게 된다. 파란색 방향으로 w를 업데이트하는 것이 목표라면, 매 iteration마다의 step이 파란색 방향으로 가지 못하고, 계단 형태로 이동한다. 이 점이 비효율 적라고 볼 수 있다.
샘플 사이즈 하나에 대한 설명이었다. 미니배치를 활용하면, all negative, all positive문제는 줄어들 수 있다.
2. Tanh
Output이 [-1, 1]값을 갖기 때문에, 0에 중심 되어있다. 따라서 single element에 대해서 w의 그래디언트 방향이 다양해질 수 있다. 그러나 여전히 x가 크거나 작은 값일때, gradient가 죽는다는 잠재적인 문제가 있다.
3. ReLU
0보다 작으면 그래디언트가 0, 크면 1이다. input이 positive값이라면, 아무리 큰 값이어도 kill 될 일은 없다. 그리고 연산이 효율적이고, 수렴이 매우 빠르고 잘 된다는 장점이 있다. ReLU 함수에도 잠재적인 문제점들이 존재한다. 우선 output값이 0이 모두 non-negative이므로, 0에 중심되어 있지 않다. 이는 sigmoid와 같은 문제점이라고 할 수 있다. 이 문제는 위에서 말했다시피 batch normalization을 통해 해결할 수 있다. Negative input에 대해 그래디언트가 exactly 0 값을값을 갖게 되어, 밑으로는 계속 0 값을 전파한다. 이렇게 되면 절대 gradient가 업데이트되지 않는 구간이 생긴다. 해결 방안으로 ReLU를 지나는 곳에 뉴런도 초깃값으로 positive값을 주어서, 그래디언트가 처음에 0이 아니게 시작하는 방법이 있다.
4. Leaky ReLU
Dead ReLU문제점 해결을 위해, negative 값에 대한 그래디언트 값을 0으로 만드는 것보다 조금이라도 업데이트되는 방안을 고려했다. 네 번째함수이다. 0보다 크면 1, 작으면 그래디언트가 0.01x정도의 값을 갖는다 어떤 값이 input 되어도되어도 그래디언트가 죽지는 않을 것이다. 여전히 연산이 빠르고, 수렴이 빠르고 잘 된다.
5. SELU
마지막으로, SELU 함수이다. SELU함수에서 lambda가 없으면 ELU 함수가 된다. 아주 deep 한한 네트워크를 설정하면, BatchNorm 없이도없이도 계속 activate 되는되는 람다, 알파값들이 mean = 0, sd = 1로 normalization 된된 후, 다음 레이어에 들어간다.
ELU 함수는 ReLU의 장점을 모두 갖고 있으면서, 지수함수를 이용하여 입력이 0 이하일 때 부드러운 곡선을 갖는다. ReLU의 '음수 값을 0으로 죽이는 문제'에 대해 leaky relu보다 노이즈에 더 강건하게 대응한다. 그러나 연산에 exp함수가 포함되어, 연산 비용이 발생한다는 단점이 있다.
Data Preprocessing
1. zero-centered
- Zero-centered data란 자료 자체를 dim=0에 대해 mean 시켜서, X에 대해서 빼주는 것이다. 데이터 군집을 모든 차원에 대해 원점으로 이동시킨다는 의미가 있다.
- Normalized data란 각 variable별로 std를 샘플에 대해서 reduction 해서 나누는 것이다. Normalize를 한 후, 위아래와 좌우의 변동성이 균등하게 조절된다.
preprocessing을 하는 이유: Loss가 최소인 지점은 변하지 않지만, preprocessing을 하면 gradient 계산에 조금 유리해진다. 또한 X가 zero-centered data로 나오면, gradient direction이 다양하게 나와서, 파란색 방향으로 더 잘 표현된다.
2. PCA & Whitening
자료의 Correlation을 제거해주는 whietened data. 이미지에는 잘 사용하지 않는다. (주로 정형 데이터(키, 몸무게 등)에 사용한다.)
3. normalization 이후
위의 decision boundary의 slope를 -2x+1이라고 해보자. 왼쪽 그림(normalization을 하지 않은 상황)처럼 데이터가 원점에서 멀면(zero-centered 되지 않으면) 직선 함수가 -2.1x+1로 바뀔 때, (weight matrix가 조금만 바뀌면) 데이터의 분류 상황이 많이 바뀌며 classification loss가 많이 바뀐다. 결론적으로 optimization process를 어렵게 만든다. 반면, 우측은 normalize를 한 상태이고, 원점에 데이터들이 분포해있다. 이런 상황에서는 작은 변화에 덜 민감해진다. 따라서 optimization process가 비교적 쉬워진다.
Weight Initialization
맨 처음에 Neural Network의 초깃값을 설정하는 문제.
만약 W와 b에 대한 convex function이 주어졌다면, 초깃값으로 아무거나 설정해도 global minimum으로 수렴하게 된다. 그러나 우리는 nonconvex를 다룬다. 따라서 W=0, b=0으로 설정하면, forward pass 계산시계산 시, input이 무엇이든지 output 노드는 모두 0이 된다. 그 결과 backward pass 계산시에계산 시에, 모든 gradient가 같은 값이 된다. 즉, NN구조는 각각의 노드들의 역할이 대칭적인데, 모두 0으로 초기화하면, 대칭적 구조를 깰 수 없게 된다. (solution) W와 b가 모두 조금씩 달라서, layer의 모든 노드들이 다른 역할을 하도록 만들어주어야 다음 process에서 각자의 역할을 찾아간다.
따라서 all zero 대신 all random으로 설정해준다.
1. Xavier Initialization
all random은 잘 작동하나 network가 깊어지면 문제가 생긴다. activation function으로 tanh를 쓸 때, 처음에는 output 값이 잘 분포되어 있지만 layer가 쌓이면서 점점 0 쪽으로 기운다. 표준편차를 조금 키우면 (예 0.05) 모든 activation이 -1 혹은 1에 집중된다. tanh함수는 -1,1 값에 대해서 gradient를 0 근처로 반환한다. 따라서 또다시 학습이 거의 되지 않는다.
Xavier Initialization은 std를 1/ sqrt(Din)으로 정하는 방법이다. Xavier initialization을 활용했을 때, layer가 계속 쌓여도 activation 값이 적당히 잘 퍼져서 분포해있음을 볼 수 있다. Xavier initialization의 목표는 output노드들의 activation variance와 input노드들의 activation variance가 같도록 하는 것이다.
2. Kaming Initialization
Xavier initialization은 ReLU에서는 잘 작동하지 않는다. Xavier는 x와 w가 zero-mean임을 가정하고 진행하는데, x가 zero-centered 되지되지 않은 상태라서 이런 결과를 낳는다. (ReLU는 0 이하의 값을 0으로 출력하기 때문)
따라서 input에서 반이 날아가버렸기때문에날아가 버렸기 때문에, std = sqrt(2/Din)으로 설정해주면, 0으로 모이지않고 적당히 잘 퍼지게 된다. 이 방법은 Kaming Initialization이라고 부른다.
ResNet의 residual block의 경우, +를 지날 때마다 variance가 점점 커진다. 따라서 첫번째 conv레이어는 Kaming initialization을 하고, 두번째 conv레이어의 filter weight를 0으로로 만들어준다. 그러면 레지듀얼 블락을 지나기전과 후의 분산이 같아진다
Regularization
1. Dropout
Dropout은 최근 Network 아키텍쳐에서는 많이 사용하지는 않는다. 매 iteration마다 forwardpass를 할 때, 각 층의 어떤 뉴런들을 없앤다. 이때, 0.5의 확률로 없앨 뉴런들을 정한다. 이후, 남아있는 노드들에 대해서만 forward/backward pass를 진행한다.
Hidden layer 뉴런 하나하나가 x의 표현을 배운다면, X의 feature를 잘 학습하기 위해서, 필요없는 feature는 덜 배우고, 여러 노드가 같은 것을 배우는 것을 방지한다. Dropout은 파라미터를 공유하는 여러개의 Neural network 앙상블을 트레이닝하는 것이라고 생각할 수 있다. 여러 개의 submodel들을 만들어서, 앙상블처럼 최종 결론을 여러 네트워크의 투표로 결정한다.
만약 테스트시에도 랜덤하게 뉴런을 끄게되면끄게 되면, 테스트할 때마다 결과가 다르게나온다다르게 나온다. 이를 방지하기 위해서, 모든 뉴런을 켜고, 각 뉴런의 결과값에 확률 p(z)를 곱한다.
AlexNet, VGG 아키텍쳐의 맨 윗단 레이어인 fully-connected layer에서 dropout을 적용한다. 최근 아키텍쳐들에서는 fully-Connected layer들을 줄였기때문에줄였기 때문에, dropout을 활용할 필요가 거의 없다.
2. Data Augmentation
비슷한 image지만 CNN 모델은 다른 이미지로 인식하며, 밝기 조절 혹은 좌우 대칭 등을 randomness의 일종으로 볼 수 있다.
Data Augmentation 방법들
- 좌우 대칭
- Random Crops and Scales : 랜덤 하게 이미지를 잘라내고, 랜덤하게 사이즈를 조정하는 방법도 있다. 트레이닝 시에는 이렇게 진행을 하고, 테스트 시에는, 테스트용 이미지를 5개의 스케일로 만든 후, 224 * 224 사이즈의 이미지를 10개로 크롭하여 10개에 대한 분류 결과를 투표시킨다.
- Color Jitter : R, G, B 픽셀에 대해 PCA를 진행하여, 조도를 조절하는 방법이다.
3. Drop Connect
Dropout의 반대 개념으로, x대신 weight를 날리는 방식이다.
4. Fractional Pooling
Downsizing 하는 영역을 랜덤하게 가져가는 Fractinal Pooling.
5. Stochastic Depth
랜덤하게몇 개의 레지듀얼 블락을 무시하고, forward pass를 진행하는 Stochastic Depth.
이미지에서 랜덤하게 사각형 영역을 지정하여 픽셀값을 0으로 대체하는 Cutout.
이미지 두개를 블렌딩하여블렌딩 하여, 사용하는 Mixup. Mixup방법을 활용할 때, y label을 0.4 --> cat, 0.6 --> dog로 설정한다.
'Deep learning > Michigan university deep learning' 카테고리의 다른 글
12. Recurrent Neural Networks (0) | 2022.02.11 |
---|---|
11. Training Neural Network 2 (0) | 2022.02.10 |
8. CNN Architectures (0) | 2022.02.07 |
7. Convolutional Network (0) | 2022.02.03 |
6강. Backpropagation (0) | 2022.01.24 |