: 특정 공간 내에서 입력과 제일 근접한 k개의 요소를 찾아, 더 많이 일치하는 것으로 분류 하는 알고리즘 입니다.
k - 최근접 이웃 특징
① 데이터 분류에 사용되는 아주 간단한 지도학습 알고리즘 - 지도학습 : 머신러닝 학습 시 데이터와 함께 데이터에 대한 레이블(정답)을 함께 부여하는 학습 방식. - 데이터 분류 : 새로운 데이터를 기존 데이터의 레이블 중 하나로 분류하는 작업.
② 유사한 특성을 가진 데이터들끼리는 거리가 가깝고, 거리 공식을 사용하여 데이터 사이의 거리를 구함 ③ 분류기의 효과를 높이기 위해 파라미터를 조정 ④ K-Nearest Neighbors의 경우 k 값을 변경 ⑤ 분류기가 부적절하게 학습되면 overfitting 또는 underfitting이 나타날 수 있음 ⑥ K-Nearest Neighbors의 경우 너무 작은 k는 overfitting, 너무 큰 k는 underfitting을 보임
: RNN(Recurrent Neural Network)는 뉴런의 상태(state)를 저장하고 이를 다음 스텝에서의 입력으로 사용함으로써 긴 순서열에 대해서도 예측을 할 수 있는 신경망 구조이다.
- 순차적(sequence) 인 데이터를 입력 받아 결과값을 도출하는데 사용하는 딥러닝 모델 - 대표적으로 자연어 처리에 상당히 많이 사용 - 이전 입력 값들(단어들)이 현재 입력 값(단어)의 출력 값(품사)에 영향을 줌
품사가 도출 되도록 프로그램을 만들었는데, google 이라는 단어를 봤을 때 자리에 따라서 동사와 명사로 다른 품사로 출력됩니다. 문장을 통해서 공통점을 찾아 출력될 수 있도록 만듭니다 . 제시된 방향성을 정해줘야지 정확한 데이터를 출력해줍니다.
RNN의 일반적인 구조
RNN 의 심층 구조
활성화 함수 : 탄젠트 함수 사용.
시간 차를 두고 순차적인 데이터를 넣습니다. 시계열의 특징을 가지고 있습니다.
RNN 의 구조 메모리 셀
메모리 셀 (memory cell 혹은 간단히 cell) - 타임 스텝 t 에서 순환 뉴런의 출력은 이전 타임 스텝의 모든 입력에 대한 함수이기 때문에 이를
일종의 메모리 형태라고 말할 수 있음
- 타임 스텝에 걸쳐서 어떤 상태를 보존하는 신경망의 구성 요소 - 보통 RNN 에서 셀이라고 말할 때는 완전 연결 신경망에서 층 ( 을 의미
일반적으로 타임 스텝 t 에서의 셀의 상태 ℎ𝑡 ℎ는 hidden 을 의미
RNN 네트워크에 셀이 한 개일 경우의 가중치 , 상태값 , 출력값
import tensorflow as tf
import numpy as np
tf.set_random_seed(777)
# hello 다음을 추천해주게끔 하는...
# 스펠링은 각각의 독립적인 의미를 가지고 있지만
# 'he'를 입력 했을 때, 서로의 연관성을 가지고 추천하게끔 만들어준다.
# 컴퓨터 선택의 최적화 되어 있는 수치로 표현 해야한다.
# h:0 , e:1 , l:2 , o:3 임의의 수를 넣어준다.
# One Hot Encoding
h = [1,0,0,0]
e = [0,1,0,0]
l = [0,0,1,0]
o = [0,0,0,1]
# RNN input_dim(4) -> output_dim(2), hidden_size(2)
hidden_size = 2
cell = tf.contrib.rnn.BasicRNNCell(num_units=hidden_size)
# contrib : 상당수 많은 개발자들이 미리 구현해서 오픈하거나 공개하는 경우가 많다.
# print("cell:", cell.output_size, cell.state_size)
x_data = np.array([[h,e,l,l,o]],dtype=np.float32)
# print("x_data:", x_data)
output, _states = tf.nn.dynamic_rnn(cell, x_data, dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print('output: ',output.eval())
eval() : 내부에서 자동적으로 tensor들의 동작이 되어지고 출력되지는 결과값 들을 return 시킨다.
입력값이 1x2 행렬이고 , RNN 의 상태값이 1x3 의 행렬일 경우 , W 는 총 5 개의 행을 가지게 됩니다
매개변수 갱신 신경망 학습의 목적 : 손실 함수의 값을 가능한 한 낮추는 매개변수를 찾는 것입니다.
- 확률적 경사 하강법(SGD : Stochastic Gradient descent) : 최적의 매개변수 값을 찾는 단서로 매개변수의 기울기(미분)를 이용합니다.
SGD 단점
: 방향성이 위에서 아래로 내려올 때는 빠를게 학습하면서 찾아가지만 평면적인 면으로 가게 되면 더이상 오차가 줄어들지 않는 문제점이 생길 수 있습니다.
위의 그림과 같은 모습으로 나타나게 됩니다.
SGD에 의한 최적화 갱신 경로 : 최소값인 (0, 0)까지 지그재그로 이동하니 비효율적이며 퍼포먼스의 문제를 야기합니다.
① SGD 단점의 개선책 - 모멘텀(Momentum)
- V : 속도(Velocity) - 기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙
- 올바르게 최소값을 찾아가는 장점을 가집니다.
- 모멘텀에 의한 최적화 갱신 경로
② AdaGrad : : 각각의 매개변수에 맞춤형 값을 만들어 주는 방식
- 신경망 학습에서는 학습률 값이 중요한데, 학습률 값이 너무 작으면 학습 시간이 너무 길어지고, 반대로 너무 크면
발산하여 학습이 제대로 이뤄지지 않습니다. 효율적으로 빠르게 최소값을 찾아가도록 하는 것입니다.
- 학습률 감소(learning rate decay) : 학습률을 정하는 효과적 기술 처음에는 크게 학습하다가 학습률을 점차 줄여가면서 조금씩 작게 학습시키는 방법 학습률을 서서히 낮추는 가장 간단한 방법은 매개변수 전체의 학습률 값을 일괄적으로 낮추는 것
- 최소값을 향해 효율적으로 이동 - y축 방향은 기울기가 커서 처음에는 크게 움직이지만, 그 큰 움직임에 비례해 갱신 정도도 큰 폭으로 작아지도록 조정 - 따라서 y축 방향으로 갱신 강도가 빠르게 약해지고, 지그재그 움직임이 줄어듬
③ Adam
: 모멘텀과 AdaGrad를 융합한 듯한 방법으로 2015년에 제안된 새로운 방법으로 두가지의 특징을 같이 점목하여 효율적으로 처리 할 수 있도록 만들어진 것이다.
무조건 이상적인 최적의 값이 나온다고 할 수 없습니다. 그렇기 때문에 입력으로 전달되는 데이터에 따라서 최적인 알고리즘을 골라서 사용하는 것이 중요합니다.
1) 경사하강법을 적용
2) 결과를 확인 - 데이터에 따라서 값이 오차가 클 때
3) 새로운 알고리즘을 적용
가장 중요한 것은!!! data 입니다!!! 절대적이라고 해도 과언은 아니라고 할 수 있습니다.
data에 맞는 최적의 모델을 설계하는 것이 포인트 입니다!!
MNIST 데이터셋으로 본 갱신 방법 비교
가장 크게 효과를 발휘하는 AdaGrad인것을 확인 할 수 있습니다. 가장 안좋은 포퍼먼스를 보여주는 알고리즘은 SGD(경사하강법)인 것을 확인 할 수 있으며, 가장 손실함수의 값이 크다는 사실까지 확인됩니다.
가중치 초기값
가중치 감소(weight decay) 기법 - 오버피팅을 억제해 범용 성능을 높이는 테크닉 - 가중치 매개변수의 값이 작아지도록 학습하는 방법 - 즉, 가중치 값을 작게 하여 오버피팅이 일어나지 않게 하는 것
지금까지의 가중치 초기값은 0.01 * np.random.randn(10,100) 처럼 정규분포에서 생성되는 값을 0.01배 한 작은 값(표준편차가 0.01인 정규분포)을 사용.
가중치를 표준편차가 0.01인 정규분포로 초기화할 때의 각 층의 활성화값 분포
- 가중치의 초기값으로 Xavier 초기값을 이용할 때의 각 층의 활성화값 분포
- 각 층의 활성화 값들을 광범위하게 분포시킬 목적으로 가중치의 적절한 분포를 찾고자 함.
- 앞 계층의 노드가 n개라면 표준편차가 sqrt(1/n)인 분포를 사용하면 된다는 결론.
- He 초기값 : sqrt(2/n)
ReLU를 사용할 때의 가중치 초기값
- 활성화 함수로 ReLU를 사용한 경우의 가중치 초기값에 따른
활성화값 분포변화
MNIST 데이터셋으로 본 가중치 초기값 비교
배치 정규화 - 배치 정규화를 사용한 신경망의 예
- 배치 정규화는 데이터 분포가 평균이 0, 분산이 1이
되도록 정규화함
- 배치 정규화 계산 그래프
- 배치 정규화의 효과 : 배치 정규화가 학습 속도를 높인다.
오버피팅 : 신경망이 훈련 데이터에만 지나치게 적응되어 그 외의 데이터에는 제대로 대응하지 못하는 상태
오버피팅 발생 주요 원인 - 매개변수가 많고 표현력이 높은 모델 - 훈련 데이터가 적음
오버피팅 억제용 : 가중치 감소(weight decay) - 학습 과정에서 큰 가중치에 대해서는 그에 상응하는 큰 페널티를 부과하여 오버피팅 억제하는 방법 - 원래 오버피팅은 가중치 매개변수의 값이 커서 발생하는 경우가 많음.
드롭아웃 - 신경망 모델이 복잡해지면 가중치 감소만으로는 대응하기 어려울 때 이용할 수 있는 기법 - 뉴런을 임의로 삭제하면서 학습하는 방법으로 초적의 파라미터를 찾는 것 - 훈련때는 데이터를 흘릴 때마다 삭제할 뉴런을 무작위로 선택하고, 시험 때는 모든 뉴런에 신호를 전달하되
각 뉴런의 출력에 훈련 때 삭제한 비율을 곱하여 출력(완전연결형).
하이퍼파라미터
- 각 층의 뉴런 수 - 배치 크기 - 매개변수 갱신 시의 학습률 - 가중치 감소 등의 매개변수
데이터 셋의 구별
- 훈련 데이터 : 매개변수 학습 - 검증 데이터 : 하이퍼파라미터 성능 평가(훈련 데이터 중 20% 정도 분리) - 시험 데이터 : 신경망의 범용 성능 평가
하이퍼파라미터 최적화
- 0단계 : 하이퍼파라미터 값의 범위를 설정 - 1단계 : 설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출 - 2단계 : 1단계에서 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가
(단, 에폭은 작게 설정) - 3단계 : 1단계와 2단계를 특정 횟수(100회 등) 반복하여, 그 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힘