12/08/2018, 18:15

Machine Learning cho người mới bắt đầu (Part 3)

Xin chào các bạn, trong phần 2 của series Machine Learning cho người mới bắt đầu , mình đã giới thiệu tới các bạn 2 giải thuật Machine Learning cơ bản: Linear Regression cho bài toán hồi quy tuyến tính (regression problem) và Logistic Regression cho bài toán phân loại (classification ...

Xin chào các bạn, trong phần 2 của series Machine Learning cho người mới bắt đầu, mình đã giới thiệu tới các bạn 2 giải thuật Machine Learning cơ bản: Linear Regression cho bài toán hồi quy tuyến tính (regression problem) và Logistic Regression cho bài toán phân loại (classification problem). Trong bài viết số 3 này, mình sẽ tiếp tục giới thiệu tới các bạn về Neural Network, một kiến trúc mạng được lấy cảm hứng từ mạng neuron trong não bộ của con người. Neural network là một giải thuật có thể được áp dụng để giải quyết cả 2 dạng bài toán regression problem và classification problem.

Trong bài viết này, những cơ sở lý thuyết cơ bản về Neural Network sẽ được trình bày một cách chi tiết nhằm giúp các bạn có thể hiểu được nguyên lý hoạt động cũng như biết cách vận dụng Neural Network vào các bài toán trong thực tế. Để có thể nắm được nội dung trong bài viết này, các bạn nên ôn lại các kiến thức về đại số tuyến tính, giải tích cơ bản. Do khối lượng kiến thức khá nhiều nên trong lần này, chúng ta sẽ chỉ bàn về neural network trong bài toán regression để tránh trường hợp các bạn bị quá tải. Neural network cho bài toán classification sẽ được trình bày trong bài viết sau.

Cũng giống như bài viết trước, trong bài viết này có một vài kí hiệu mình sẽ sử dụng nhiều trong suốt bài viết này mình cần các bạn nắm rõ:

  • mmm: số lượng ví dụ training (training exampe) mà ta có
  • nnn: số chiều của dữ liệu training (input feature)
  • qqq: số chiều của dữ liệu đầu ra (output feature)
  • XXX: dữ liệu đầu vào (ma trận có kích thước m×nm imes nm×n)
  • YYY: dữ liệu đầu ra (ma trận có kích thước m×qm imes qm×q)

Để bài viết thêm phần sinh động và trực quan, mình sẽ demo hai ví dụ của ứng với hai dạng bài toán regression và classification với neural network. Ngôn ngữ được sử dụng là Python 3 và các thư viện đi kèm theo là numpy, keras với backend là tensorflow. Nếu chưa quen với các thư viện trên thì mình khuyên các bạn dành thời gian tìm hiểu về chúng trước khi bắt đầu.

Dữ liệu để demo trong bài viết này sẽ được sinh ra hoàn toàn ngẫu nhiên với hàm random của thư viện numpy với các tham số: m=1000,n=4,q=1m = 1000, n = 4, q = 1m=1000,n=4,q=1. Như vậy XXX là một ma trận 1000×4 1000 imes 4 1000×4, YYY là một ma trận 1000×1 1000 imes 1 1000×1. Mỗi 1 training example sẽ là 1 vector 4 chiều: Xi=[Xi1,Xi2,Xi3,Xi4] X_i = [X_i^1, X_i^2, X_i^3, X_i^4]Xi=[Xi1,Xi2,Xi3,Xi4] và output tương ứng YiY_iYi sẽ được tính theo quy luật: Yi=(Xi1)2+(Xi2)2+(Xi3)2+(Xi4)2Y_i =(X_i^1)^2+(X_i^2)^2+(X_i^3)^2+(X_i^4)^2Yi=(Xi1)2+(Xi2)2+(Xi3)2+(Xi4)2. Quy luật mapping từ input sang output mình chọn là tổng bình phương, một quy luật khá đơn giản để các bạn tiện theo dõi.

import numpy as np
# for consistent result when generating random number
np.random.seed(0)
# training input X: a 1000x4 matrix
X = np.random.rand(1000, 4)
# training output Y: a 1000x1 matrix
Y = np.sum(np.square(X), axis = 1, keepdims = True)

Bên cạnh việc chuẩn bị dữ liệu training, chúng ta cũng cần có một tập dữ liệu validation data để theo dõi độ chính xác của thuật toán trong quá trình training. Validation data là một tập dữ liệu rất quan trong, nhằm giúp phát hiện sớm overfitting cũng như giúp ích cho quá trình hyper-parameter tuning. Nếu bạn chưa quen với khái niệm ovefittinghyper-parameter tuning thì cũng không nên quá lo lắng, mình sẽ trình bày các khái niệm trên trong các bài viết tiếp theo.

# create validation data
validation_x = np.random.rand(100, 4)
validation_y = np.sum(np.square(validation_x), axis = 1, keepdims = True)
validation_data = (validation_x, validation_y)

Việc cần làm trước tiên là import các thư viện cần thiết. Optimizer mình sử dụng ở đây là thuật toán Adam, các bạn có thể sử dụng các giải thuật khác tùy thích, hiện tại keras cung cấp rất nhiều optimizer cho người dùng, các bạn có thể tham khảo tại đây

from keras.models import Model
from keras.layers import Input, Dense, Softmax
from keras.optimizers import Adam

Bắt đầu tạo 1 mạng neuron thôi nào. Trong ví dụ này, mình sử dụng 1 mạng có 1 lớp đầu vào (input layer), 5 lớp ẩn (hidden layer) và 1 lớp đầu ra (output layer). Hàm activation của mỗi lớp mình để là hàm relu, tuy nhiêm các bạn có thể lựa chọn các hàm khác tùy theo ý thích. Hiện tại, keras cung cấp cho người dùng rất nhiều activation functions khác nhau, các bạn có thể tham khảo tại đây

# create an optimizer
optimizer = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-8, decay=0.0, amsgrad=True, clipnorm = 5., clipvalue = 0.5)

# create a neural network model
input_layer = Input(shape = (4,), name = 'input_layer')
hidden_1 = Dense(units = 100, activation = 'relu', name = 'first_hidden_layer')(input_layer)
hidden_2 = Dense(units = 100, activation = 'relu', name = 'second_hidden_layer')(hidden_1)
hidden_3 = Dense(units = 100, activation = 'relu', name = 'third_hidden_layer')(hidden_2)
hidden_4 = Dense(units = 100, activation = 'relu', name = 'forth_hidden_layer')(hidden_3)
hidden_5 = Dense(units = 100, activation = 'relu', name = 'fifth_hidden_layer')(hidden_4)
output_layer = Dense(units = 1, activation = 'relu', name = 'output_layer')(hidden_5)

Cấu trúc mạng mà chúng ta vừa mới định nghĩa:

# print a summary of the model we just create above
print (model.summary())
Layer (type)                 Output Shape              Param #
=================================================================
input_layer (InputLayer)     (None, 4)                 0
_________________________________________________________________
first_hidden_layer (Dense)   (None, 100)               500
_________________________________________________________________
second_hidden_layer (Dense)  (None, 100)               10100
_________________________________________________________________
third_hidden_layer (Dense)   (None, 100)               10100
_________________________________________________________________
forth_hidden_layer (Dense)   (None, 100)               10100
_________________________________________________________________
fifth_hidden_layer (Dense)   (None, 100)               10100
_________________________________________________________________
output_layer (Dense)         (None, 1)                 101
=================================================================
Total params: 41,001
Trainable params: 41,001
Non-trainable params: 0

Bước cuối cùng là compile model, cộng việc này giống như tạo 1 session khi dùng tensorflow. OK, mọi thứ đã xong xuôi, bắt đầu train model thôi.

model.compile(loss = 'mean_squared_error', optimizer = optimizer)
model.fit(x = X, y = Y, batch_size = 32, epochs = 100, validation_data = validation_data)
print ("Training complete!")

Kết quả training:

...
Epoch 99/100
1000/1000 [==============================] - 0s 115us/step - loss: 6.3745e-05 - val_loss: 1.0338e-04
Epoch 100/100
1000/1000 [==============================] - 0s 113us/step - loss: 6.4441e-05 - val_loss: 9.6726e-05
Training complete!

Sau khi mạng neuron đã được train từ tập dữ liệu trên, ta có thể dùng nó để dự đoán output cho dữ liệu mới:

test = np.array([[0.11, 0.12, 0.13, 0.14]])
print ('test data:', test)
print ('true output:', np.sum(np.square(test), axis = 1, keepdims = True))
print ('predicted output:', model.predict(test))

WOW! Đầu ra chuẩn tính theo công thức tổng bình phương của X=[0.11,0.12,0.13,0.14]X = [0.11, 0.12, 0.13, 0.14]X=[0.11,0.12,0.13,0.14] là 0.063, và output mà neural network dự đoán là 0.06288736. Sai số giữa output chuẩn và output dự đoán của mạng neuron khá thấp, điều đó chứng tỏ mạng neuron đã học được quy luật một cách khá chính xác từ tập dữ liệu training.

test data: [[ 0.11  0.12  0.13  0.14]]
true output: [[ 0.063]]
predicted output: [[ 0.06288736]]

Như vậy, trong bài viết này mình đã giới thiệu tới các bạn những kiến thức cơ bản về neural network, cũng như có 1 ví dụ demo nho nhỏ nhằm giúp các bạn hiểu rõ hơn về cách thức hoạt động của một mạng neuron trong thực tế khi được áp dụng vào dạng bài toán regression. Trong bài viết sau, mình sẽ tiếp tục giới thiệu tới các bạn về neural network trong bài toán classification. Cảm ơn các bạn đã quan tâm theo dõi, hẹn gặp lại trong bài viết tiếp theo.

0