Để máy tính có thể phân biệt các thứ, chúng cần phải được huấn luyện để học ra các khuôn mẫu, đặc trưng của dữ liệu hay còn gọi là các pattern. Ví dụ như việc phân biệt các hành động như đi bộ, chạy hay đi xe đạp có thể cho máy phân biệt bằng cách nhìn vào dữ liệu của các cảm biến tốc độ, gia tốc, hướng xoay,.. Tất nhiên những đặc trưng này phải được trích chọn một cách tự động.
Để biết cách thức hoạt động của neural network, hãy nhìn vào chuỗi số sau.
X = -1, 0, 1, 2, 3, 4
Y = -3, -1, 1, 3, 5, 7
Nếu để ý hai chuỗi này, ta thấy nễu X tăng 1, Y tăng lên 2 nên có thể Y = 2X, tuy nhên nếu Y = 2X thì giá trị bị lệch 1 giữa Y và 2X. Vậy phải tăng giá trị 2X lên 1. Công thức cuối cùng là Y = 2X + 1. Đây chính là đặc trưng của dữ liệu mà ta cần tìm. Và đây cũng chính là quá trình tìm ra đặc trưng của neural network, chỉ khác là nó chạy trong đầu các bạn thôi. Sau đây mình sẽ hướng dẫn các bạn cách triển khai các bước này trên Tensorflow để tìm ra mối quan hệ giữa X và Y.
Lưu ý: Về việc cài đặt tensorflow, các bạn có thể thực hiện theo hướng dẫn trên trang chủ của
tensorflow. Hoặc bạn có thể sử dụng
Colab đã được cài đặt đầy đủ môi trường bao gồm cả tensorflow.
Import một số thư viện cần thiết.
Tensorflow là thư viện giúp ta triển khai mô hình, còn Numpy giúp đơn giản việc biểu diễn dữ liệu.
import tensorflow as tf
import numpy as np
from tensorflow import keras
Định nghĩa một neural network
Định nghĩa một mạng neural đơn giản chỉ có 1 layer, trong layer chỉ có 1 neuron nhận 1 input.
- tf.keras.Sequential giúp ta định nghĩa một chuỗi của các layer
- keras.layers.Dense định nghĩa một layer.
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
Model trên mới chỉ là khai báo một mạng neural. Để có thể huấn luyện mạng này, ta cần kết hợp nó với hai hàm khác là loss và optimizer.
- Hàm loss sẽ giúp xác định xem đầu ra của mô hình đã tốt so với kết quả chưa.
- Hàm optimizer sẽ sử dụng kết quả hàm loss để tối ưu mô hình để cho ra kết quả tốt hơn.
model.compile(optimizer='sgd', loss='mean_squared_error')
Tạo dữ liệu huấn luyện cho mô hình
Thư viện Numpy cung cấp nhiều cách biểu diễn dữ liệu tiêu chuẩn. Để tạo ra dữ liệu để input vào mô hình đã khai báo bên trên, ta sử dụng hàm np.array[]
X = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
Y = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)
Huấn luyện neural network
Quá trình huấn luyện được thực hiện bởi hàm model.fit. Hàm này sẽ thực hiện duyệt qua tập dữ liệu, thực hiện tính toán ouput từ input, đo đạc lỗi sử dụng hàm loss, tối ưu lại mô hình sử dụng hàm optimizer và sau đó lặp lại quá trình đó. Việc duyệt qua hết một lần dữ liệu được gọi là thực hiện xong một epoch.
model.fit(X, Y, epochs=500)
Sau khi mô hình được huấn luyện xong, nó đã học được đặc trưng của dữ liệu, mối quan hệ giữa X và Y. Giờ ta có thể sử dụng hàm model.predict để tìm ra giá trị Y khi truyền vào một giá trị X.
model.predict([10.0])
# Output: 18.980341
Nhìn vào đây bạn có thể thắc mắc là tại sao giá trị đầu ra không phải là 19 mà chỉ gần với 19. Bạn có thể hiểu đơn giản thế này. Mạng neural học bằng cách đo lương sai khác giữa đầu ra của mô hình và kết quả thực tế. Sự đo lường này có sai số dẫn tới kết quả cuối cùng cũng có sai số. Tất nhiên sai số sẽ được giảm đi rất nhiều nếu bộ dữ liệu đủ lớn. Ở đây bộ dữ liệu chỉ có 6 điểm nên sai số như thế này là chấp nhận được.
Chúc mừng! Bạn vừa triển khai xong một mô hình học máy chỉ với vài dòng code. Nhìn vào đây bạn có thể thấy rõ sự khác biệt giữ mô hình lập trình truyền thống và lập trình học máy như đã giới thiệu ở
bài 1. Có một số khái niệm có thể lạ lẫm với bạn trong bài này như layer, loss, optimizer,... Nhưng đừng lo, qua loạt bài này, các bạn sẽ hiểu chi tiết chúng là gì và cách sử dụng chúng trong các trường hợp ra sao. Toàn bộ code của bài học này bạn có thể truy cập ở
đây. Happy learning!