deep learning part
#0
Linear Regression, Logistic Regression.
가장 훌륭한 예측선 긋기란 Linear Regression을 쉽게 풀어쓴것. 머신러닝은 제대로 된 선긋기에서 시작된다.
*gradient decent
로지스틱회귀에선 sigmoid function을 조정. 이때도 경사하강법 통해서 a,b구함.
만약 입력값이 추가되어 세개이상의 입력값을 다룬다면 시그모이드가 아니라 softmax function 써야한다.
#1
perceptron: 입력값과 활성화 함수를 사용해 출력값을 다음으로 넘기는 가장 작은 신경망 단위
y=ax+b를 퍼셉트론에 맞춰 뭔가 딥러닝스럽게 표현해보면 a는 가중치(weight), b는 바이어스(bias), y는 입력값(x)와 가중치의 곱을 모두 더한다음 바이어스를 더한 값인 가중합(weighted sum)이다.
가중합의 결과를 놓고 1 또는 0을 출력해서 활성화함수(activation function)으로 보낸다. 대표적으로 시그모이드 함수
- 퍼셉트론의 한계: XOR problem
XOR 문제를 해결하기 위해서 2개의 퍼셉트론을 한번에 계산할 수 있어야함.
이를 가능하게 하려면 은닉층(hidden layer)만들면 됨. -> 다중 퍼셉트론// 뭔가 신경망을 닮아서 neural network라 부름.
#2
오차 역전파(back propagation): 신경망 내부의 가중치 수정방법// 경사하강법 확장개념임.
임의의 가중치를 선언하고 결과값을 이용해 오차를 구한뒤 이 오차가 최소인 지점으로 계속 이동해서 조금씩 가중치를 이동시킴
이 오차가 최소가 되는점(미분했을 때 기울기 0지점)을 찾으면 그게 찾고자하는 가중치임.
백 프로파게이션은 출력층으로부터 하나씩 앞으로 되돌아가면서 각 층의 가중치를 수정하는데 가중치를 수정하려면
미분 값(기울기)가 필요한데 시그모이드 함수를 생각해보면 문제가 발생함 -> 기울기소실(vanishing gradient)
시그모이드 함수 미분하다보면 점점 기울기가 0에 가까워지니까 가중치 수정이 어려워짐. 그래서 다른 활성화함수로 대체.
예를 들어 렐루함수.
#3
고급경사하강법
가중치를 업뎃하는 경사하강법은 정확하게 가중치를 찾아가기는 하는데 한번 업뎃할때마다 전체 데이터 미분해야해서 계산량이 매우 많음.
이거 보강하기 위해 고급경사하강법.
- 확률적 경사하강법. 전체데이터 안쓰고 랜덤하게 추출한 일부 데이터만 사용.
- 모멘텀. 경사하강법이랑 똑같이 매번 기울기를 구하는데 대신 이를 통해서 오차를 수정하기 전에 바로앞의 수정값과 방향(+,-) 참고해서
일정 비율만 수정되게한다. 수정방향 지그재그로 되는 현상 줄어들고 이전 이동값 고려해서 일정비율만큼만 효과를 낼 수 있음.
#4
Sequential 함수는 딥러닝의 구조를 한층 한층 쉽게 쌓아올릴 수 있게함.
Sequential 함수 선언 후 케라스의 model.add() 함수 사용해 필요한 층을 차례로 추가하면 됨.
케라스의 장점 중 하나는 model.add() 함수를 이용해 필요한 만큼의 층을 빠르고 쉽게 쌓을 수 있다는 것.
model.add() 안에는 Dense() 함수가 포함되어 있다. -> 각 층이 각각 어떤 특성을 가질지 옵션을 설정하는 역할.
딥러닝의 구조와 층별 옵션을 정하고 나면 compile()함수를 이용해 이를 실행시킴.
- loss, optimizer, activation
블랙박스를 극복하려면?
#5
과적합(overfitting)
층이 너무 많거나 변수가 복잡해서 생기기도 하고 학습 데이터셋과 테스트 데이터셋 구분하지 않고
딥러닝했을때 발생하기도 함.
방지하기 위해선:
-홀드아웃 교차검증(Holdout Cross Validation)
데이터셋을 학습데이터셋과 validation에 해당하는 테스트 데이터셋으로 나누어 사용하는 것
30%정도의 테스트 데이터셋을 가지고 실행되었던 딥러닝 모델을 기반으로 딥러닝 모델을 테스트한 후 정확도(accuracy) 계산.
향후 예측위해서 학습에 사용안한 테스트 데이터셋을 만들어 정확한 평가 병행하는게 매우 중요.
- 과적합 확인 방법
학습데이터셋만 가지고 딥러닝할 때 층 더하거나, epoch값을 높여 실행횟수를 늘리면 정확도 계속해 올라갈 수 있음
이 경우 학습이 깊어져서 학습데이터셋 내부에서의 성공률은 높아지는데 테스트데이터셋에서 효과가 없다면 오버핏일어나는거임.
정리하면 학습량이 늘어나면 학습데이터셋 통한 예측률은 계속 올라가지만 테스트데이터셋 이용한 예측률은 오히려 떨어진다.
학습계속해도 더이상 테스트 결과가 좋아지지 않으면 그 지점에서 학습 멈춰줄 필요가 있음,
- 홀드아웃교차검증했을때 문제:
홀드아웃교차검증하면 데이터중 70%를 학습데이터셋으로 쓰고 테스트데이터셋은 겨우 30%임. 이정도 테스트만으론 실제로 얼마나 잘 작동하는지 확인이 어려움.
테스트데이터셋 어떻게 잡는지에 따라 성능이 달라지고 우연의 효과로 인해서 모델 평가지표에 편향이 생길거임.
#6
K-겹 교차검증(K-fold Cross Validation): 홀드아웃교차검증의 단점보완
모든 데이터가 최소 한번은 테스트 데이터셋으로 쓰이도록 한다. 데이터를 K개 그룹으로 나누어 하나씩 교차해가면서 테스트 데이터셋으로 쓰는것.
모든 데이터를 학습 데이터셋과 validation위한 테스트 데이터셋으로 쓸 수 있고 오버핏도 해결가능. 다만 딥러닝이 오래걸림
학습자료 참고: http://archive.ics.uci.edu
머신러닝 공부할때 쓸만한 각종 데이터