3.1.2.1. Chọn thư viện
Thư viện hay được gọi là modules, chúng bao gồm các hàm (function) hay lớp (class) được viết sẵn với các chức năng khác nhau thay chúng ta tính toán, xử lý dữ liệu. Một số thư viện tiêu biểu được áp dụng hầu hết với các bài bài xây dựng mô hình bằng thuật toán python như numpy để xử lý dữ liệu hay matplotlib để tạo đồ thị. Ngoài ra có những thư viện python chính để xây dựng mô hình học sâu như tensorflow, keras, caffe, theano, ....
tensorflow keras caffe theano torch pytorch Chainer mxnet cntk caffe2
Hình 29. Đồ thị thể hiện tần suất sử dụng các thư viện học sâu
Để xây dựng một mô hình LSTM, thư viện phù hợp rất quan trọng. Trong bài nghiên cứu này, em lựa chọn thư viện Keras vì mức độ phổ biến của nó và những ưu điểm sau:
• Keras là sự lựa chọn hàng đầu với những người lập trình muốn trải nghiệm ngôn ngữ python
• Keras - một thư viện được áp dụng cũng là lựa chọn trong nhiều bài nghiên cứu.
• Keras hỗ trợ huấn luyện trên nhiều GPU phân tán. Tính toán trong GPU là các phép tính được thực hiện song song với nhau. Vì vậy, việc thêm nhiều nhân giúp GPU
có sức mạnh tính toán to lớn để thực hiện và kết hợp ma trận thống kê trong mô hình
máy học.
• Mã nguồn mở, nhanh
3.1.2.2. Lựa chọn các tham số phù hợp
a. Trình tự - Sequential
Sequential (a) có nhiệm vụ giúp các giá trị của các node truyền từ lớp này sang lớp khác theo đúng trình tự được xây dựng. Nó thể hiện sự kết nối từ layer đầu vào tới
input layer
hidden layer 1 hidden layer 2
Hình 30. Hình thể hiện các lớp (layer) trong một mạng nơron
b. Lớp kết nối - Dense:
Lớp kết nối Dense có nhiệm vụ giúp mạng hiểu rằng toàn bộ các node phải được kết nối với nhau theo quy tắc lớp trước nối với lớp kế tiếp hay được gọi là fully connected layer.
Đoạn mã thêm lớp kết nối: model1 = SequentialQ
model1.add(LSTM(256,input_shape=(X_train1.shape[1],1))) model1.add(Dense(25, input_dim=20, activation='relu')) model1.add(Dense( 1, activation-linear'))
model1.compile(optimizer='adam',loss='mean_squared_error',metrics=['mse'])
c. Hàm kích hoạt - Activation:
Hàm kích hoạt (activation function) mô phỏng tỷ lệ truyền xung qua axon của một mạng noron. Hàm kích hoạt trong một mạng noron có nhiệm vụ biến đổi các giá trị truyền vào bằng một số giá trị được quy định với từng hàm. Có các hàm kích hoạt như sigmol, tanh, relu ngoài ra có linear
- Sigmoid: Hàm phi tuyến sigmoid nhận vào là một giá trị thực, sau đó được tính
toán cho ra giá trị nằm trong khoảng [0;1]. Đối với hàm sigmoid giá trị được quy về một khoảng khá nhỏ cho nên kết quả đầu ra của hàm không thay đổi quả nhiều. Nhược điểm gây ra hiện tượng Vanishing Gradient
- Tanh: Tương tự như hàm tuyến tính Sigmoid thì nó cũng xử lý dữ liệu như vậy
tuy nhiên nó cho ra giá trị trong khoảng rộng hơn là từ (-1;1). Điều này giúp tránh
được một khuyết điểm về thay đổi nhỏ trong sigmoid tuy nhiên nó vẫn gây ra hiện
tượng bão hòa ở hai đầu (Vanishing Gradient)
- ReLu: có lẽ là chức năng phổ biến nhất được sử dụng cho các lớp ẩn. Nó phổ
biến vì nó vừa đơn giản để thực hiện vừa có hiệu quả khắc phục những hạn chế của
các chức năng kích hoạt phổ biến khác trước đây, chẳng hạn như Sigmoid và Tanh.
- Linear: Mạng nơron sẽ không thực sự cải thiện lỗi. Mạng sẽ không thể đào tạo
tốt và nắm bắt các mẫu phức tạp từ dữ liệu. Do đó, hàm tuyến tính có thể lý
tưởng cho
các tác vụ đơn giản, nơi mà khả năng diễn giải được mong muốn cao.
Sau nhiều lần thử và chạy các mô hình với các hàm kích hoạt, kiểm tra các giá trị đánh giá, cuối cùng em lựa chọn hai hàm kích hoạt cho mô hình LSTM đó là relu và linear. Hơn hết relu tránh được khuyết điểm trong việc điều chỉnh dữ liệu của sigmoid
d. Thuật toán giải tối ưu - Optimizers
Hình 31. Hình thể hiện các thuật toán tối ưu
Optimizers được coi là thuật toán tối ưu. Về cơ bản, thuật toán tối ưu là nền tảng thiết lập lên một mô hình mạng nơron với mục đích "học " được các thuộc tính của dữ liệu truyền vào, qua đó có thể tạo ra 1 cặp trọng số (weight) và bias phù hợp để tối ưu hóa mô hình.
- GD là gradient descent: Thuật toán gradient descent có ưu điểm cơ bản, dễ
hiểu. Thuật toán đã giải quyết được vấn đề tối ưu của mô hình mạng nơron bằng cách cập nhật trọng số sau mỗi vòng lặp. Tuy nhiên vì đơn giản nên thuật toán Gradient
Descent còn nhiều hạn chế như phụ thuộc vào nghiệm khởi tạo ban đầu và tốc độ học. Tốc độ học quá lớn sẽ khiến cho thuật toán không hội tụ, quanh quẩn bên đích vì bước nhảy quá lớn; hoặc tốc độ học nhỏ ảnh hưởng đến tốc độ training
- Stochastic Gradient Descent (SGD): Ngược lại với GD, thuật toán SGD giải
quyết được đối với cơ sở dữ liệu lớn mà GD không làm được. Thuật toán tối ưu này
hiện nay vẫn hay được sử dụng. Nhưng dù vậy, thuật toán vẫn chưa giải quyết
được 2
nhược điểm lớn của gradient descent đó là tốc độ học nhanh, phụ thuộc nhiều
vào dữ
liệu đầu vào.
- Adam: Adam là sự kết hợp của hàm Momentum và RMSprop. Adam là một
trong những hàm tối ưu phổ biến nhất. Adam đã được đặt làm trình tối ưu hóa mặc
định được sử dụng trong hầu hết các thư viện học sâu. Nó tính tỷ lệ học và ghi
nhớ cho
các tham số. Nó có ưu điểm, có thể điều chỉnh tốc độ học cho mỗi trọng số (weight)
của mạng nơron.
Mô hình này sử dụng adam làm thuật toán tối ưu:
model1.add(Dense(25, input_dim=20, activation='relu')) model1.add(Dense( 1, activation='linear'))
model1.compile(optimizer='adam',loss='mean_squared_error',metrics=['mse'])
Hình 32. Hình thể hiện các hàm mất mát (Loss function)
- Mean_squared_error: Mean Square Error (MSE) hay còn được gọi là L2 Loss
là một loss function cũng được sử dụng cho các mô hình hồi quy, đặc biệt là các mô
hình hồi quy tuyến tính. MSE được ưu tiên dùng cho mô hình có layer đầu ra có 1
node và sử dụng hàm kích hoạt tuyến tính.
- mean_absolute_error : để tính giá trị tuyệt đối của giá trị truyền vào
- binary_crossentropy : dùng cho bài toán 2 lớp ví dụ như bài toán phân biệt
hình ảnh chó mèo, nam nữ
- categorical_crossentropy : dùng cho bài toán nhiều lớp hơn ví dụ như bài toán
phân biệt
- Batch_size: thể hiện số lượng mẫu sử dụng cho mỗi lần cập nhật trọng số.
Epoch là số lần duyệt qua hết số lượng mẫu trong tập huấn luyện. Đoạn mã xây dựng mô hình LSTM:
model1 = Sequential()
model1.add(LSTM(256,input_shape=(X_train1.shape[1],1))) model1.add(Dense(25, input_dim=20, activation='relu')) model1.add(Dense( 1, activation-linear'))
X_test1 = X_test1.reshape((X_test1.shape[0],X_test1.shape[1],1)) #Fit model with history to check for overfitting
history = model1.fit(X_train1,y_train1,epochs=300,validation_data=(X_test 1 ,y_t
est1),shuffle=F alse) model1.summary()
f. Các thước đo đánh giá mô hình
Sai số trung bình MSE là một trong những thước đo lỗi như vậy để đánh giá độ chính xác và tỷ lệ lỗi của bất kỳ thuật toán học máy nào cho một vấn đề hồi quy. Vì vậy, MSE là một hàm rủi ro giúp chúng ta xác định sự khác biệt bình phương trung bình cảu giá trị được dự đoán với giá trị thực của một đối tượng hoặc biến.
RMSE là từ viết tắt của Root Mean Square Error, là căn bậc hai của giá trị thu được từ hàm Mean Square Error. Sử dụng RMSE để vẽ biểu đồ thể hiện sự chênh lệch giữa giá trị dự báo và giá trị thực tế của một tham số của mô hình. Từ biểu đồ, các nhà phân tích, nghiên cứu dễ dàng đánh giá rõ ràng hiệu quả của mô hình. Qua mô hình ta dự báo nhận thấy mô hình phù hợp để dự báo chứng khoán tại Việt Nam.