Lec 7. Application & Tips
๐ Learning rate
- ๋ฐ์ดํฐ๋ฅผ ํตํด model ์์ฑ ์ ํต์ฌ ์์
- Learning rate์ Gradient๋ฅผ ์ด์ฉํด ์ต์ ์ ํ์ต ๋ชจ๋ธ ๊ฐ ์ฐพ์ (cost๊ฐ ์ต์๊ฐ ๋๋ ์ง์ )
- Hyper parameter (์ฌ์ฉ์๊ฐ ์ง์ ์ธํ ํด ์ฃผ๋ ๊ฐ) ์ค ํ๋
- ์ด๋ค optimizer๋ฅผ ํตํด ์ ์ฉํ ์ง ์ ์ธํ ๋ learning_rate๋ ํจ๊ป ์ง์ ํจ [GradientDescentOptimizer(learning_rate= x.xx)]
- ์ ์ ํ์ง ๋ชปํ ํฌ๊ธฐ์ learning rate (Stepํฌ๊ธฐ)๋ ์ต์ ๊ฐ์ ์ป๊ธฐ ์ด๋ ค์
→ ๋๋ฌด ํด ๊ฒฝ์ฐ: overshooting (High) ๋ฐ์ ๊ฐ๋ฅ
→ ๋๋ฌด ์์ ๊ฒฝ์ฐ: ์๊ฐ ์์, local minimum์์ ๋ฉ์ถค
∴ ์ ์ ํ ํฌ๊ธฐ์ learning rate ํ์ (ํ๊ท ์ ์ผ๋ก learning rate = 0.01 ๋ก ๋ง์ถ ํ ์กฐ์ ํด๋๊ฐ)
๐ Learning rate Decay ๊ธฐ๋ฒ
- Cost๊ฐ ์ผ์ ๊ฐ์์ ๋ ์ด์ ๋ณ๋ ์์ ๋๋ง๋ค, learning rate ๊ฐ์ ์กฐ์ ํด์ค์ผ๋ก์จ cost๊ฐ ์ต์ํ ๋๊ฒ๋ ํจ
- ์ฃผ๋ก ์ฒ์ ์์ํ ๋ learning rate๊ฐ์ ํฌ๊ฒ ์ค ํ, ์ผ์ epoch ์ฃผ๊ธฐ๋ก ๊ฐ์ ๊ฐ์์ํด
→ ์ต์ ์ ํ์ต์ ๋๋ฌํ๊ธฐ๊น์ง์ ์๊ฐ ๋จ์ถ ๊ฐ๋ฅ๊ตฌํ ๋ฐฉ์
- Step decay
: N๋ฒ์ epoch ์ฃผ๊ธฐ๋ก learning rate ์กฐ์
์ฆ, ํน์ step(epoch ๊ตฌ๊ฐ)๋ง๋ค ์กฐ์ - Exponential decay
: exponential ํ๊ฒ learning rate ๊ฐ์
- 1/t decays
: ๊ฐ 1/epoch๋ก ์กฐ์
๐ Data preprocessing
- Feature Scaling ๊ธฐ๋ฒ
๋ฐ์ง ๋ถํฌ ์ง์ญ์ ์ ์ธํ ๊ณณ์ ์กด์ฌํ๋ outlier data๋ค์ ์ ๊ฑฐํด์ค → ์ฃผ์ ๋ฐ์ดํฐ์ ์ง์คํด์ ํ์ต ์ฑ๋ฅ ํฅ์
(1) Standardization(ํ์คํ)
: ํ๊ท ์์๋ถํฐ ์ผ๋ง๋ ๋จ์ด์ก๋์ง ํ๋จ
(2) Normalization (์ ๊ทํ)
: 0 ~ 1 ๋ฒ์์์ data ๋ถํฌ๋ฅผ ๋ํ๋ผ ์ ์์
- Noisy Data
- ์ธ๋ชจ ์๋ ๋ฐ์ดํฐ(Noisy Data)๋ค์ ์ ๊ฑฐํด, ํ์ต์ ์ ์ฉํ data๋ง ๋จ๊ธฐ๋ ๊ณผ์ ์ด preprocessing
- Numeric, NLP(์์ฐ์ด ์ฒ๋ฆฌ), Face Image ๋ฑ์์ ์ ํํ ๋ชจ๋ธ์ ๋ง๋ค๊ธฐ ์ํด ํ์
๐ Overfitting
์ผ์ข ์ ๊ณผ์ ํฉ ์ํ. ์ฃผ์ด์ง ํ์ต data์ ๋ํด Validation, accuracy๊ฐ์ด ๋๊ฒ ๋์ด์๋ ๋ถ๊ตฌํ๊ณ , ์ค์ data์ ์ ์ฉํ ๋ ์ธ๋ ค ์ ํ๋ ๊ฐ์
- High bias (underfit) : ํ์ต์ด ๋ ๋ ์ํ
- High variance (overfit) : ์ฃผ์ด์ง ํ์ต data์ ๊ณผํ๊ฒ ์ ํฉํด ๋ค๋ฅธ data์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ ์ด๋ ค์ด ์ํ (๋ณํ๋์ด ๋ง์)
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ํ์ต ์ ๋ ๋ง์ training data ์ ๊ณต
- Set a features
b. feature ์ ์ค์ด๊ธฐ : ์ผ์ข ์ ์ฐจ์ ์ถ์(PCA)
c. feature ์ ์ฆ๊ฐ : fitting์ด ๋ ๋ ๋ชจ๋ธ์ ๊ตฌ์ฒดํ ํ๊ธฐ์ํด ์ฌ์ฉ
→ ์ ์ ํ ์ ๋์ feature๋ก ์กฐ์ ํ์
- Regularization (์ ๊ทํ)
cost ํจ์ ๋ค์ regularization๊ด๋ จ term ์ถ๊ฐํ ํํ
- Regularization strength (λ)
: 0 ~ 1 ์ฌ์ด ์์ ๊ฐ. 0์ ๊ฐ๊น์ธ์๋ก regularization ์ค์๋ ์์
์ค์ต ์ฝ๋
# ์ฌ์ฉํ ํ์ต data ์ ์ธ : 800 ๋ data + ์ผ๋ถ outlier๋ก ๊ตฌ์ฑ
xy = np.array([[828.659973, 833.450012, 908100, 828.349976, 831.659973],
[823.02002, 828.070007, 1828100, 821.655029, 828.070007],
[819.929993, 824.400024, 1438100, 818.97998, 824.159973],
[816, 820.958984, 1008100, 815.48999, 819.23999],
[819.359985, 823, 1188100, 818.469971, 818.97998],
[819, 823, 1198100, 816, 820.450012],
[811.700012, 815.25, 1098100, 809.780029, 813.669983],
[809.51001, 816.659973, 1398100, 804.539978, 809.559998]])
x_train = xy[:, 0:-1]
y_train = xy[:, [-1]]
#์ ๊ทํ ํจ์ - 0 ~ 1 ์ฌ์ด ๊ฐ์ผ๋ก scaling
def normalization(data):
numerator = data - np.min(data, 0)
denominator = np.max(data, 0) - np.min(data, 0)
return numerator / denominator
#ํ์ต data preprocessing (์ ๊ทํ ํจ์ ์ฌ์ฉ) ํด์ xy๋ฐ์ดํฐ ๊ฐฑ์
xy = normalization(xy)
#ํ์ต ๋ฐ์ดํฐ ๊ฐฑ์
x_train = xy[:, 0:-1]
y_train = xy[:, [-1]]
์ ๊ทํํ Data๋ก Linear Regression ๋ชจ๋ธ ์์ฑํ ํจ์ ์ ์
# dataset ์ ์ธ
dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(len(x_train))
# Weight, bias ๊ฐ ์ ์ธ
W = tf.Variable(tf.random.normal((4, 1)), dtype=tf.float32)
b = tf.Variable(tf.random.normal((1,)), dtype=tf.float32)
# hypothesis ์ ์ (y = Wx + b)
def linearReg_fn(features):
hypothesis = tf.matmul(features, W) + b
return hypothesis
# L2 loss ํจ์ - overfitting ํด๊ฒฐ
def l2_loss(loss, beta = 0.01): #beta => ๋๋ค๊ฐ
W_reg = tf.nn.l2_loss(W) # output = sum(t ** 2) / 2
loss = tf.reduce_mean(loss + W_reg * beta) #์ ๊ทํ๋ loss๊ฐ ๊ณ์ฐ
return loss
# hypothesis ๊ฒ์ฆํ Cost ํจ์ ์ ์
def loss_fn(hypothesis, features, labels, flag = False):
cost = tf.reduce_mean(tf.square(hypothesis - labels)) #(๊ฐ์ค-y๊ฐ)์ ์ต์ํ
if(flag): #flag๋ฅผ ํตํด L2 loss ์ ์ฉ ์ฌ๋ถ ํ๋ณ
cost = l2_loss(cost)
return cost
ํ์ต ์งํ์ ์ํด Learning rate ์ค์ - learning decay
is_decay = True # dacay ๊ธฐ๋ฒ ์ ์ฉ ์ ๋ฌด
starter_learning_rate = 0.1
#์ต์ ์ learning rate ์ฐพ๊ธฐ
if(is_decay):
# Exponential decay ๊ธฐ๋ฒ ์ฌ์ฉํค epoch 50๋ฒ๋ง๋ค learning rate ์กฐ์
learning_rate = tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate=starter_learning_rate,
decay_steps=50,
decay_rate=0.96,
staircase=True)
optimizer = tf.keras.optimizers.SGD(learning_rate)
else:
optimizer = tf.keras.optimizers.SGD(learning_rate=starter_learning_rate)
# loss๊ฐ(|๊ฐ์ค - ์ค์ ๊ฐ|)๊ตฌํ๋ฉฐ l2 loss ์ ์ฉ ์ฌ๋ถ ๋ฐ์ ธ์ loss๊ฐ ๋์ถ
def grad(hypothesis, features, labels, l2_flag):
with tf.GradientTape() as tape:
loss_value = loss_fn(linearReg_fn(features),features,labels, l2_flag)
return tape.gradient(loss_value, [W,b]), loss_value #gradient, loss๊ฐ ์ถ๋ ฅ
# ํ์ตํ๊ธฐ
EPOCHS = 101
for step in range(EPOCHS):
for features, labels in dataset:
# type ๋ง์ถ๊ธฐ
features = tf.cast(features, tf.float32)
labels = tf.cast(labels, tf.float32)
#linear regression์ ๋ํ gradient๊ฐ ๊ตฌํจ + loss๊ฐ ํ์ธ
grads, loss_value = grad(linearReg_fn(features), features, labels, False)
optimizer.apply_gradients(grads_and_vars=zip(grads,[W,b]))
if step % 10 == 0:
print("Iter: {}, Loss: {:.4f}".format(step,loss_value))
๐Data sets
- ํ์ต์์ ์ฌ์ฉ๋๋ data ์ข
๋ฅ
- Training data (ํ์ต ๋ฐ์ดํฐ)
- Validation data (ํ๊ฐ ๋ฐ์ดํฐ)
- Testing data (ํ ์คํธ ๋ฐ์ดํฐ)
- Traing , Validation data ๊ตฌ์ฑ์ด ์ค์ํจ
- ๋ชจ๋ธ ์ฑ๋ฅ์ ์ฌ๋ฆฌ๊ธฐ ์ํ ํ์ฒ๋ฆฌ ํ์
- hyperparameter ์ค์ , layer ๊ตฌ์ฑ์ ํตํด ํฅ์ ๊ฐ๋ฅ
- ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋ฐ๋ณต์ ์ผ๋ก ํ ์คํธ ํ ๋ชจ๋ธ ์์ฑ ๊ณผ์ ๋ฐ๋ณต ์ํํ๋ฉฐ ์ฑ๋ฅ ๋์
Evaluating a hypothesis
: ๋ชจ๋ธ์ด ์ ํ ๋ ํ ์๋ก์ด ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ ํ ์คํธ ๊ฐ๋ฅ
- ํ์ต์ฉ ๋ฐ์ดํฐ + ํ ์คํธ์ฉ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ
- x๊ฐ = y๊ฐ ๊ฐ์์ง ํ์ธํ๋ ๊ณผ์ ํ์
Anomaly detection
Healthy Data๋ก ํ์ต ํ ๋ชจ๋ธ ์์ฑ → Unseen Data๋ก model์ ๋๋ฆฌ๋ฉฐ ์ด์ ์ผ์ด์ค ๋ฐ์ ๊ฐ์ง
๐Learning ๋ฐฉ๋ฒ
Online Learning
- ๋ฐ์ดํฐ๊ฐ ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋ ์ํ. ์ง์์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ์ํฉ์์ ํ์ต ์งํ
- ์๋ ์ค์
Batch Learning (Offline)
- ๋ฐ์ดํฐ๊ฐ ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋์ง ์์ ์ํ(static). ๋ฐ์ดํฐ๊ฐ ๋ณํ์ง ์๋ ์ํฉ์์ ํ์ต ์งํ
- ์ ํ๋ ์ค์
Fine Tunning
- ๊ธฐ์กด Data(A)๋ฅผ ๊ฐ์ง๊ณ ํ์ต ์ํจ ๋ชจ๋ธ์ ๋ํด ๊ธฐ์กด weight ๊ฐ ๋ฏธ์ธํ๊ฒ ์กฐ์
→ ์๋ก์ด ๋ค๋ฅธ ์ข ๋ฅ์ Data๋ก ๋ค์ ํ๋ฒ ๊ฐ์ค์น ์ธ๋ฐํ๊ฒ ์กฐ์ ํ๋ฉฐ ํ์ต (๊ธฐ์กด ๋ฐ์ดํฐ๋ ๊ธฐ์กด๋๋ก ๋ถ๋ฅ ์ ์ง)
Feature Extraction
- ๊ธฐ์กด Data(A)๋ฅผ ๊ฐ์ง๊ณ ํ์ต ์ํจ ๋ชจ๋ธ์ ๋ํด, ์๋ก์ด Data (B, C)๋ฅผ ๋ณ๋์ Task ์ทจ๊ธํด ์ด๊ฒ๋ค์ ๋ํด์๋ง ์๋กญ๊ฒ ํ์ต์ํด
(→ ๊ธฐ์กด weight ์กฐ์ X, ์๋ก์ด layer ์ถ๊ฐ ํ ์ด๊ฒ์ ํ์ตํ๊ณ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ด๋๋ก ํจ)
Efficient Models - ํจ๊ณผ์ ์ธ ๋ชจ๋ธ ์์ฑ
๊ฒฐ๊ณผ์ ์ผ๋ก inference time ์์ฒด๋ฅผ ์ต์ํ ํ๋ ๊ฒ์ด ํ์ (๋ง์ ์์ data ์ฒ๋ฆฌ๋ ํ์ฐ์ ์ด๋ฏ๋ก)
→ inference์ ์ํฅ ๋ฏธ์น๋ weight ๊ฐ ์ค์ฌ์ผ ํจ
์ค์ต ์ฝ๋
(1) Fashion MNIST - Image Classification
# keras ์ ๊ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ Fashion MNIST ์ฌ์ฉ
fashion_mnist = tf.keras.datasets.fashion_mnist
# train data, test dat ๊ฐ์ ธ์ set์ผ๋ก ์ ์ฅ
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
#class 10๊ฐ์ง ์กด์ฌ (0 ~ 9์ฌ์ด ๊ฐ๊ณผ ๋งค์นญ)
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# 0 ~ 1์ฌ์ด๋ก ์ ๊ทํ
train_images = train_images / 255.0
test_images = test_images / 255.0
# keras์ ๋ชจ๋ธ ์ ์
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)), #์
๋ ฅ ๋ฐ์ดํฐ ํฌ๊ธฐ ๋ง์ถฐ์ค
keras.layers.Dense(128, activation=tf.nn.relu), #128๊ฐ์ layer๋ก ์ ์ธ
keras.layers.Dense(10, activation=tf.nn.softmax) #10๊ฐ์ class๋ก ๊ตฌ๋ถ
])
#์ ์ํ ๋ชจ๋ธ ์ปดํ์ผ - optimizer์ ์ธ, loss๊ฐ ์ ์, ์ ํ๋ ์ธก์ ๋ฐฉ์ ๊ฒฐ์
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
#๋ชจ๋ธ ํ๋ จ (5๋ฒ)
model.fit(train_images, train_labels, epochs=5)
#test model์ loss, acc ๊ฐ ๊ตฌํจ
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)
(2) IMDB - Text Classification
imdb = keras.datasets.imdb
#ํ์ต ์ํ data ๊ตฌ์ฑ (train, test)
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
word_index = imdb.get_word_index()
# data ์ค ์์ฐ์ฌ ์ ์ฒ๋ฆฌ ๊ณผ์ (๊ธฐ์กด ์ด๋ฏธ์ง๋ 255(ํฌ๊ธฐ)๋ก ๋๋ ์ ๊ทํ)
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0 #๊ณต๋ฐฑ์ ๋ํ ๊ฐ
word_index["<START>"] = 1 #์์ ๊ฐ
word_index["<UNK>"] = 2 # unknown - ๋ชจ๋ฅด๋ ๋จ์ด
word_index["<UNUSED>"] = 3 #์ฌ์ฉ๋์ง ์์ ๊ฐ ์ ์
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
def decode_review(text):
return ' '.join([reverse_word_index.get(i, '?') for i in text])
# train, test data ๊ธธ์ด 256์ผ๋ก ๋ง์ถฐ์ค (๋ค์ 0์ผ๋ก ์ฑ์)
train_data = keras.preprocessing.sequence.pad_sequences(train_data,
value=word_index["<PAD>"],
padding='post',
maxlen=256)
test_data = keras.preprocessing.sequence.pad_sequences(test_data,
value=word_index["<PAD>"],
padding='post',
maxlen=256)
# input shape is the vocabulary count used for the movie reviews (10,000 words)
vocab_size = 10000
#๋ชจ๋ธ ์ ์ธ
model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size, 16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation=tf.nn.relu))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))
#์ ์ํ ๋ชจ๋ธ ์ปดํ์ผ - optimizer์ ์ธ, loss๊ฐ ์ ์, ์ ํ๋ ์ธก์ ๋ฐฉ์ ๊ฒฐ์
model.compile(optimizer='adam',loss='binary_crossentropy', metrics=['accuracy'])
#๋ชจ๋ธ ํ๊ฐํ test ๋ฐ์ดํฐ ์ ์ ๋ฐ ๋ชจ๋ธ ํ๋ จ
x_val = train_data[:10000]
partial_x_train = train_data[10000:]
y_val = train_labels[:10000]
partial_y_train = train_labels[10000:]
history = model.fit(partial_x_train,partial_y_train,
epochs=40, batch_size=512,
validation_data=(x_val, y_val),verbose=1)
results = model.evaluate(test_data, test_labels)
print(results)
'Group Study (2022-2023) > Machine Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Machine Learning] 3์ฃผ์ฐจ ์คํฐ๋ - CNN์ ์ดํด(3) (0) | 2022.11.01 |
---|---|
[Machine Learning] 3์ฃผ์ฐจ ์คํฐ๋ - Softmax Regression (0) | 2022.10.31 |
[Machine Learning] 2์ฃผ์ฐจ ์คํฐ๋ - Multi variable linear regression & Logistic Regression (0) | 2022.10.10 |
[Machine Learning] 2์ฃผ์ฐจ ์คํฐ๋ - CNN์ ์ดํด(2) (0) | 2022.10.10 |
[Machine Learning] 1์ฃผ์ฐจ ์คํฐ๋ - CNN์ ์ดํด(1) (0) | 2022.10.06 |