Softmax Regression: 기본 개념 소개
Logistic Regression
x 값을 대입해서 W를 학습시켜 나온 결과 z를 sigmoid function을 통과시켜서 0~1 사이의 값을 산출해냄
Multinomial classification
multinomial: 여러 개의 클래스가 존재
A, B, C 세 가지 클래스를 구분하기 위해 binary classification을 이용합니다.
A를 구분하는 binary classification, B를 구분하는 binary classification, C를 구분하는 binary classification 이 세 가지를 이용하여 세 클래스 파일의 구분을 구현할 수 있습니다.
A 클래스를 구분하기 위한 binary classification
$$\begin{pmatrix} x _{1} & x_{2} & x_{3} \end{pmatrix}\begin{pmatrix} w1 \\ w2 \\ w3 \end{pmatrix} = \begin{pmatrix} x_1w_1 + x_2w_2 + x_3w_3 \end{pmatrix}$$
B 클래스를 구분하기 위한 binary classification
$$\begin{pmatrix} x _{1} & x_{2} & x_{3} \end{pmatrix}\begin{pmatrix} w1 \\ w2 \\ w3 \end{pmatrix} = \begin{pmatrix} x_1w_1 + x_2w_2 + x_3w_3 \end{pmatrix}$$
C 클래스를 구분하기 위한 binary classification
$$\begin{pmatrix} x _{1} & x_{2} & x_{3} \end{pmatrix}\begin{pmatrix} w1 \\ w2 \\ w3 \end{pmatrix} = \begin{pmatrix} x_1w_1 + x_2w_2 + x_3w_3 \end{pmatrix}$$
Matrix Multiplication
$$\begin{pmatrix} x _{A1} & x_{A2} & x_{A3} \\ x _{B1} & x_{B2} & x_{B3} \\ x _{C1} & x_{C2} & x_{C3}\end{pmatrix}\begin{pmatrix} w1 \\ w2 \\ w3 \end{pmatrix} = \begin{pmatrix} x_1w_{A1} + x_2w_{A2} + x_3w_{A3} \\ x_1w_{B1} + x_2w_{B2} + x_3w_{B3} \\ x_1w_{C1} + x_2w_{C2} + x_3w_{C3} \end{pmatrix} = \begin{pmatrix} y_A \\ y_B \\ y_C \end{pmatrix}$$
$$y_A=H(x_A)$$
$$y_B=H(x_B)$$
$$y_C=H(x_C)$$
Softmax Classifier의 cost 함수
Softmax Classifier
1. 0~1 사이의 값이다
2. 값들의 합이 1이다
$$cost=S(y_i)=\frac{e^(y_i)}{\sum_j(e^y_{j})} $$
One-Hot Encoding
가장 큰 값을 산출하는 기법
산출된 확률값들 중 하나만 정해서 알고자 할 때는
0.7->1.0
0.2->0.0
0.1->0.0
으로 매핑되어 0.7 값만 전달됩니다.
Cross-Entropy Cost Function
One-Hot Encoding을 구현하는 가장 적합한 cost function
$$D(S, L)=-\sum_{i}(L_ilog(s_i))$$
S=S(Y): 예측값
L=Y: 실제값
Logistic Cost VS Cross Entropy
$$C:(H(x), y)=ylog(H(x))-(1-y)log(1-H(x))$$
$$D(S, L)=-\sum_{i}(L_ilog(s_i))$$
$H(x)=S$
$y=L$
$$L=\frac{1}{N}\sum_{i}(D(S(Wx_i+b), L_i))$$
$$L; Loss(Cost Function)$$
$$\frac{1}{N}\sum_i, x_i, L_i: Training Set$$
여러 개의 데이터 셋이 있을 때는 각각의 distance를 더해서 전체의 거리를 구한 후 평균을 계산해줍니다.
Gradient descent
Learning rate, Overfitting, 그리고 일반화(Regularization)
Learning rate
1. Large learning rate: overshooting
learning rate만큼 그래프 위를 이동하게 되는데, step(기울기)이 너무 커지면 그래프 밖으로 튕겨나가게 됩니다.
2. Small learning rate: takes too long, stops at local minimum
step이 너무 작아지면 중간에 멈춰버리거나 도달하는데 지나치게 오래 걸리게 됩니다.
learing rate 값을 몇가지 시도해보면서 cost function을 관찰하고, 가장 적합한 값을 찾아냅니다.
Data (X) preprocessing for gradient descent
Data 값을 normalize하는 방법
1. original data: 원래의 데이터
2. zero-centered data: 데이터의 중심이 0으로 갈 수 있도록 normalize하는 방법
3. normalized data: 데이터 전체가 어떤 형태의 범위 안에 항상 들어가도록 normalize하는 방법
4. Standardization: 값들이 'pre'processing 되었는지, 차이가 비정상적으로 큰 것은 없는지 확인하는 방법
$$Standardization$$
$$x^\prime_j=\frac{x_j-\mu_j}{\sigma_j}$$
Overfitting
머신러닝은 학습을 통해 모델을 만들어가므로, 학습 데이터에 잘 맞는 모델을 만들어낼 수 있습니다.
그러나 테스트 혹은 실제 데이터와 비교해봤을 때 잘 맞지 않는 경우가 발생합니다.
model1이 더 일반적이고 좋은 모델입니다. 다른 데이터들이 들어와도 대체적으로 잘 맞는 모델입니다.
model2는 현재 가지고 있는 데이터에만 맞춰진 모델입니다. 실제로 사용할 때는 정확도가 떨어집니다.->Overfitting
overfitting을 줄이는 방법
1. training data를 많이 가지고 있어야 함
2. 가지고 있는 feature의 수를 줄임(중복 제거 등)
3. Regularization(일반화)
Regularization
너무 큰 값을 가지지 말 것
$$L=\frac{1}{N}\sum_{i}(D(S(Wx_i+b), L_i))+\lambda\sum(W^2)$$
$$\lamda: regularization strength(상수)$$
$\lambda$값이
1. 0이면, regularization을 사용하지 않음
2. 큰 값이면, regularization을 매우 중요하게 생각함
3. 작은 값이면, regularization을 중요하게 생각하지 않음
Training/Testing 데이터 셋
Training(교과서): 전체 데이터 중 70%
Test sets(실전 문제): 전체 데이터 중 training을 제외한 나머지 30%으로 절대 사용하지 않는다.(숨겨진 값이라 생각함)
1. training만을 가지고 학습을 시켜서 model을 만듭니다.
2. 만든 모델에 test sets 값을 대입하여 model의 예측값과 test sets의 실제값을 비교합니다.
처음부터 전체 데이터를 가지고 모델을 만들면 가지고 있는 데이터의 값을 가지고 테스트할 경우, 모델이 값을 거의 완벽하게 알고 있기 때문에 테스트를 할 수 없습니다. 그러므로 training과 test sets를 구분하여 사용합니다.
learning rate 또는 $\lambda$ 값을 튜닝해야 하는 경우, training을 한 번 더 나누기도 합니다.
training=training+validation
training: 완벽한 training 값
validation: 모의 시험을 통해 learning rate 또는 $\lambda$ 값을 변경할 때 사용
Online learning
대량의 데이터가 존재할 경우, 해당 데이터를 일정한 양으로 나누어서 차례대로 model에 학습을 시킵니다. 나눈 데이터들을 학습시킬 때 이전에 학습된 데이터는 model에 남아있게 됩니다.
나중에 데이터를 추가로 학습시켜야 하는 경우, 기존의 데이터가 모델에 기억되어 있기 때문에 기존 데이터는 다시 학습시킬 필요가 없어서 매우 유용한 방법입니다.
MINIST Dataset
사람들이 손으로 적은 숫자들을 보고 어떤 숫자인지 인식할 수 있도록 하기 위한 데이터 셋
Accuracy
전체 데이터 중 몇 개의 데이터가 정확한지를 나타냄
# Lab 6 Softmax Classifier
import tensorflow as tf
import numpy as np
x_raw = [[1, 2, 1, 1],
[2, 1, 3, 2],
[3, 1, 3, 4],
[4, 1, 5, 5],
[1, 7, 5, 5],
[1, 2, 5, 6],
[1, 6, 6, 6],
[1, 7, 7, 7]]
y_raw = [[0, 0, 1],
[0, 0, 1],
[0, 0, 1],
[0, 1, 0],
[0, 1, 0],
[0, 1, 0],
[1, 0, 0],
[1, 0, 0]]
x_data = np.array(x_raw, dtype=np.float32)
y_data = np.array(y_raw, dtype=np.float32)
nb_classes = 3
tf.model = tf.keras.Sequential()
tf.model.add(tf.keras.layers.Dense(input_dim=4, units=nb_classes, use_bias=True)) # use_bias is True, by default
# use softmax activations: softmax = exp(logits) / reduce_sum(exp(logits), dim)
tf.model.add(tf.keras.layers.Activation('softmax'))
# use loss == categorical_crossentropy
tf.model.compile(loss='categorical_crossentropy', optimizer=tf.keras.optimizers.SGD(lr=0.1), metrics=['accuracy'])
tf.model.summary()
history = tf.model.fit(x_data, y_data, epochs=2000)
print('--------------')
# Testing & One-hot encoding
a = tf.model.predict(np.array([[1, 11, 7, 9]]))
print(a, tf.keras.backend.eval(tf.argmax(a, axis=1)))
print('--------------')
b = tf.model.predict(np.array([[1, 3, 4, 3]]))
print(b, tf.keras.backend.eval(tf.argmax(b, axis=1)))
print('--------------')
# or use argmax embedded method, predict_classes
c = tf.model.predict(np.array([[1, 1, 0, 1]]))
c_onehot = tf.model.predict_classes(np.array([[1, 1, 0, 1]]))
print(c, c_onehot)
print('--------------')
all = tf.model.predict(np.array([[1, 11, 7, 9], [1, 3, 4, 3], [1, 1, 0, 1]]))
all_onehot = tf.model.predict_classes(np.array([[1, 11, 7, 9], [1, 3, 4, 3], [1, 1, 0, 1]]))
print(all, all_onehot)
'인공지능' 카테고리의 다른 글
[Training Neural Network] epoch, batch, and iteration (0) | 2021.01.20 |
---|---|
[Optimizer] Optimizer의 종류 (0) | 2021.01.19 |
[Keras] Keras에서 loss 함수 (0) | 2021.01.19 |
[모두를 위한 딥러닝1] Logistic Regression (2주차) (0) | 2021.01.09 |
[모두를 위한 딥러닝1] Linear Regression(1주차) (0) | 2021.01.07 |