비전공자를 위한 AI 딥러닝 Week. 7 DNN
1. Gathering data
2. Preprocessing data
3. Researching the model than will be best for the type of data
training the model
evaluate and update model
딥러닝 처음엔 개념적으로 쉬움
어떤 신경망? 어떤 파라미터를 가지고 배울 것인지?
데이터가 굉장히 중요함!
데이터 틀림 -> 좋은 결과 x
MNIST(엠니스트) : 잘 정제된 데이터
얼마큼 신경망 학습시킬 때 사용할 것인가?
Training data : Test data = 8:2
Validation : 모델이 잘 세팅되고 있는지? 1~2
좀 더 모든 데이터를 활용해 좋은 결과를 얻기 위해서는?
Cross-Validation
Model Design
MLP도 있으나 CNN, RNN도 있음!
내가 풀고자하는 문제에 가장 적합한 알고리즘을 구해야 함
Network의 사이즈, Topolgy 어떻게 되는지?
Activation function 설정
원하는 타겟 함수와 신경망이 만들어내는 출력이 얼마나 차이 나는지 loss function 결정
--
Model Hyperparameter
learning rate로 Gradients의 크기를 빨리 움직일 것인지?
Regularization을 위한 Dropout
Batch : training 시킬 때 모든 example을 다 학습시킬 수도 있지만 일부를 떼어서 학습 -> 그 다음 것을 학습
activation function은 dnn이 비선형문제를 해결하도록 중요한 역할
hidden node와 output node에 들어온 input을 변형시켜줌
tagent hyperbolic
sigmoid
linear : 들어온 것 그대로 사용
relu : 최근에 가장 많이 사용,
hidden node 대부분 사용
why?
back-propagation
: input의 w를 순차적으 변화시킴
이 경우 chain rule 사용
input -> activation function ->
input쪽의 w이 늘어나느 걸 계산하기 위해서 뒤쪽에 있는 error로붙터 시작해 hidden node에 있는 activation function의 미분값을 곱함
-> back-progation
미분값이 항상 1보다 작음
-> 많은 node를 계속 거쳐서 나오는 값을 계산하기 위해 미분값을 계속 곱하면
derivatives가 최종 back-propagation에 의한 w에 대한 변화값이 0에 가깝게 됨
= Vanishing Gradient problem
반대로 너무 커져서 문제도 있는데 대부분 없음
but ReLU로 이 문제 해결
0보자 큰 곳 1, 작으면 0
미분값이 쉽게 빨리 계산, Gradeint가 너무 작아지지도 않음
어떤 것들을 결정해야 DNN의 학습 성능을 높일 수 있는지?
SUMMARY
적합한 모델 결정
하이퍼파라미터 결정
활성화함수 설정 - Hideen layer :ReLU 사용
-----
학습목표
활성함수, 옵티마이저, 하이퍼파라미터 이해하기
DNN 학습은 출력과 타겟 함수의 출력의 차이를 나타내는 주는 Loss함수를 Gradient descent 방법으로 줄여나가는 것
줄여나가는 방법은 다양한 방법이 있음
여러 개의 example에 대해서 여러 개의 데이터의 손실함수를 계산
각각의 손실 함수를 합친 Cost Function에 대한 Gradient를 계산
example gradient를 다 계산해서 합쳐서 gradient를 계산하는 것을 batch gradient라고 함
파란 라인을 따라서 감
모든 example에 대한 error를 최소화
한 스텝을 가기 위해서 매우 복잡한 방법 사용
1. stochastic gradient
하나하나의 training example만 계산 랜덤한 방향 -> 합치면 같은 도착점 도달
그러면 너무 불규칙하지 않나?
function gradient 계산 -> 파라미터 업데이트
즉, 데이터 한 개씩 처리 -> 빠른 학습 속도, 불안정한 업데이트 특성
2. mini batch gradient
batch gradient로 전부 계산을 하는 것이 아니라 일부만 계산
데이터를 mini_batch로 나눠서 gradient 계산 -> 파라미터 업데이트
그러면 사이즈를 결정해야 함
example < 2000 -> batch_size 64~512개
최종적으로 loss function의 minimum을 찾아감
그냥 gradient만 쫓아가지는 않음
움푹한 local minima도 있음
평평한 plateau(플래타)
global minima를 여기 있는 global minimum으로 쫓아가기 위해 여러가지 고려 필요
-> 이를 감안한 것은 Optimizer라고 부름
Optimization을 할 수 있는 여러 가지 방법들 발견
Learning Rate 중요함
gradient가 줄어드는 방향으로 가는데 미세한 구간으로 따라갈 수 없음
천천히 가기 -> 오래걸림
빨리가기 -> minimum을 지나침 -> 되돌아가기 -> 또 다시 반대편으로 가기
중간이 되는 rate가 중요함
Momentum
최종적으로 loss function이 작은 점에 가기 위해 local minimum을 지나갈 수 있는 방법이 있음
gradient에 따라서 내려가다 보면 loca
가던 방향으로 계속 우리가 관성 moment를 가지게됨
minimum이 있어도 지나갈 수 있도록 적절한 관성 moment를 주는 것이 필요함
-> momentum 방법!
-> 하이퍼파라미터를 튜닝해야 함!
learning rate, momentum을 얼마나 많이 줄 것인가?
적절한 하이퍼파라미터 값을 스캔해야 함
1. Grid 만들어서 하나씩 훑기
2. 랜덤 넘버를 이용하기
하이퍼파라미터 개수 많으면 후자가 효율
Popular Optimizera
Adam : 좋은 아이디어를 거의 다 모은 복합 옵티마이저
잘 모를 때는 Adam 사용
원하는 출력과 dnn 출력의 차이를 결정하는 loss함수 손실함수
loss 함수를 모든 example에 대해서 모든 테스트셋에 대해서 합치면 cost function이라고 부름
cross entropy
언제 적합한지?
여러가지 class가 있는 classification문제에 적합
1. categorical crossentropy
binary cross entropy는 class가 2개(0 or 1)
2. sparscategorical crossentropy
이 경우에는 softmax라는 최종 단의 activation funciton 씀
exxample 코드에서 흔히 쓰는 configuration임
그래서 tensorflow에서 이런 걸 어덯게 결정하는가?
선택이 간단하고, 원리를 몰라서 예제코드를 통해서 효율적으로 사용할 수 있음
model.compile(optimizer=tf.train.AdamOptimizer(),
loss='sparse_categorical_crossentropy')
Summary
하이퍼파라미터 결정하는 방법
주요 : learning rate (얼마나 빨리), batch_size(얼마나 크게), optimizer 어던거 선택?
-----
학습목표 : 언더피팅, 오버피팅, 최적화 학습법 배우기
bias, varience tradeoff 문제 !1
파란색 점을 연결하는 그래프 만드는 목표!
2차 함수 되는 함수 찾기
대략 중간을 지나가는 것 찾음
하지만 정밀하게 하기 위해 모든 점이 다 연결되는 함수 찾음 -> overfitting
Bias는 선입관을 갖고 있어서 발생
overfitting : Variance 너무 많이 줌 -> 큰 그림을 놓침
2개의 클래스 가
베스트 : 대략 트렌드를 쫓아감, 덜 복잡한 함수!
다 맞추려고 하면 경계선이 복잡해짐 train 데이터 성능 좋지만 새로운 test 데이터에서 성능이 떨어짐
처음에는 random하게 시작하다가 딱 적당하게 학습이 되는 경우에 도달함
적당하게 학습이 되는 데에서 멈추게 하는 것이 중요함
신경망뿐만 아니라 머신러닝에서도 어려운 문제임
해결하는 방법은 있음
학습이 덜 돼서 정확도가 높지 않은 경우에는 학습을 더 오래 시키는 방법이 이씅ㅁ
딥러닝 : neural network는 더 깊은 깊이
regulaization
feature 추가
fix overfitting
: 데이터 add, 새로 데이터를 augmentation방법으로 증강, regularization 적용, 모델의 complexity 줄여줌
내가 배우지 않은 거에 대한 퍼모먼스는 어떻게 되는지 해보고
그 에러가 다시 늘어나게 되는 점들이 생김
그래서 거기 까지만 학습시키는 방법 존재
= Early stopping
학습의 기준이 되는 loss는 training 데이터 사용
stop 기준은 validation 데이터 사용
L1 Norm
w의 절대값의 합
L2 Norm
w의 값의 제곱의 합
w이 너무 크면 loss function이 커짐
overfitting되는 경우에는 특정한 점을 맞추기 위해서 configuration이 굉장히 커져야 함
-> 특정 점에만 최적화된 hidden node들을 없애자!!!
w값을 줄이면 -> 대개 w의 값은 activation function이 값이 작으니 중간 부분에서 함수 사용됨
즉, 중간 부분은 linear한 부분이 됨
dropout regularization
multilayer perceptron은 input -> hidden -> hidden 전체가 연결되는
fully connected
but hidden node들을 x표를 적당히 침
어떤 확률로 x표를 해서 네트워크 간의 연결에 참여하지 않게 함
구멍을 냄!
그러면 성능이 낮아지지 않음???
그럴 수도 있음
but w가 줄어드면
complexity 감소, 특정 node에 많이 학하고 있던 것을 완화시킴
발전된 방법 Batch Normalization
hidden node에 나오는 값을 normalize해서 너무 큰 값이 나오지 않도록 매번 바꿔주는 방법
biase 와 variance의 균형을 맞춰주기
but 개선되지 않을 때가 더 많음
-> data preprocessing 사용
캐글에서는 이걸 얼마나 잘 하는지에 따라서 등수 높일 수 있음
normalize
증강
feature engineering
dimension 줄이기
high dimension 에서 만들어짐 픽셀 수 많음
-> 그 중 중요한 차원만 사용하면?
3차원도 가능
대개 각각의 숫자의 클러스터링 잘 되어 있는 것 볼 수 있음
feature engineering
굉장히 풀기 어려운 문제
x^2 + y^2 루트를 통해서 분류 잘 함
Dimensionality reduction
기계학습의 unsupervised learning과 관련됨
pca, ica
딥러닝적 방법으로 개발된 nmf, uppropagation
Data aumentation
각도 옆으로 회전, 좌측 우측 바꾸기 -> 데이터 증가
------------
찾아본 내용
loss function
: machine learning 성능 측정, 최적화시 사용되는 함수
모델이 예측한 값과 실제 데이터 값 사이의 차이를 측정해 정확도, 성능 평가함
얼마나 정확하게 작업을 수행하는지 나타내는 지표
최적화 알고리즘(gradient descent) 사용해 파라미터 조정함
+ mae, mse, cross-entropy loss, log loss(binary cross_entropy loss) 등등..
gradient descent
: loss function의 gradient를 활용해 w, b 업데이트 함
: 모델의 w, b를 조정해 loss function을 최소화하는 방향으로 모델을 업데이트 하는 과정
이 때 각 업데이트 단계에서 w, b를 얼마나 크게 조정할지 결정하는 역할
기본 동작을 설명
1. initialization : 모델의 w, b 무작위로 초기화
2. prediction : 초기화된 모델 사용해 train 데이터 예측
3. loss calculation : predction vs real 차이 계산해 손실 함수 구함 -> 이를 최소화하기 위해 모델 조정
4. gradient computation : gradeint 계산 -> 현재 파라미터 값에서 손실 함수가 어느 방향으로 더 낮아지는 알 수 있음
gradeint : 수학적으로 loss function의 각 파라미터에 대한 편미분으로 이뤄진 벡터
ex)
w1, w2 파라미터
-> 기울기는 [∂L/∂w1, ∂L/∂w2]와 같은 벡터로 표현(편미분)
이 기울기를 계산함으로써 어떤 방향으로 조정해 손실을 최소화해야 하는지 결정함
양수인지, 음수인지에 따라서 결정됨!!!
5. parameter update : gradient의 반대 방향으로 업데이트 -> gradient 작으면 업데이트 작게, 크면 업데이트 크게
gradient가 손실 증가의 가장 가파른 방향을 가리키기 때문임
손실을 줄이기 위함이기 때문에 gradient의 반대 방향으로 조절함
즉, gradient가 양수 -> 줄이고, 음수 -> 증가
이 파라미터 업데이트의 크기는 learning rate에 의해 결정됨
6. iteration : 미리 정한 횟수, 손실 함수가 충분히 작아질 때까지 반복
learning rate
: gradient descent에서 한 번의 업데이트 단계에서 적용되는 스케일링된 값을 의미
deep learning에서 사용되는 hyperparameter
작은 값 -> w, b 조금씩 조정
큰 값 -> w, b 크게 조절