Xây dựng mô hình

Một phần của tài liệu 886 ứng dụng mô hình học sâu LSTM trong bài toán dự báo giá cổ phiếu ở thời điểm đóng cửa cho một số mã cổ phiếu ở thị trường chứng khoán việt nam (Trang 48 - 54)

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.

Một phần của tài liệu 886 ứng dụng mô hình học sâu LSTM trong bài toán dự báo giá cổ phiếu ở thời điểm đóng cửa cho một số mã cổ phiếu ở thị trường chứng khoán việt nam (Trang 48 - 54)