Lstm model là gì
Chào mọi người, như đã đề cập trong bài viết trước, hôm nay mình sẽ giới thiệu đến mọi người một mạng RNN đặc biệt - mạng LSTM. Đã có rất nhiều bài viết về LSTM và RNN, tuy nhiên mình muốn trình bày lại các kiến thức này với cách tiếp cận từ một người mới, vừa học vừa ứng dụng. Sau khi nắm được các đặc điểm và cấu trúc LSTM, chúng ta sẽ thử xây dựng ứng dụng dự đoán giá cổ phiếu đơn giản. Show Mạng thần kinh hồi quyMỗi suy đoán hoặc quyết định của chúng ta được liên kết từ các thông tin phức tạp được tìm hiểu trước. Vấn đề càng phức tạp, lượng thông tin được tổng hợp để giải quyết càng lớn. Mạng thần kinh hồi quy (RNN) ưu việt hơn các mạng thần kinh truyền thống ở đặc điểm này, chúng đưa ra các dự đoán dựa trên các thông tin đã được ghi nhận trong các vòng lặp chứa thông tin phía trước. Trong mô hình trên, có thể thấy rõ kết quả của đầu ra H1 nhận dữ liệu từ đầu vào X1 và kết quả của nút phía trước hay nói cách khác đầu ra của nút này chính là đầu vào của nút ngay phía sau. Điều này đã mang lại sự thành công cho mạng thần kinh hồi quy nhờ vào khả năng suy luận có cơ sở của nó. Tuy nhiên, khả năng này tỏ ra không hiệu quả đối với các trường hợp phức tạp, đòi hỏi lượng thông tin cần tổng hợp cho suy đoán nhiều hơn. Vấn đề ở đây là gì? Ngữ cảnh và phụ thuộc xaTrong quá trình tiếp nhận thông tin, đôi khi chúng ta không hoàn toàn tiếp nhận hết tất cả lượng thông tin được gửi đến. Dù vậy, chúng ta có thể dự đoán nội dung thông tin một cách chính xác. Mình lấy một ví dụ khi nghe câu "Tôi đang học trí tuệ nhân ..." thì chúng ta dễ dàng dự đoán từ tiếp theo là "tạo" dựa vào thông tin từ "trí tuệ nhân" phía trước, chỉ có thể dùng một lượng thông tin cố định. Nhưng trong một số trường hợp ví dụ như "Tôi là người Việt Nam. Tôi nói tiếng ..." thì việc xác định được từ còn thiếu phụ thuộc vào lượng thông tin nhiều hơn. Giữa nội dung cần đưa ra dự đoán và nội dung cần cho quá trình này đã có khoảng cách nhất định, vì thế mạng RNN khó có thể đưa ra dự đoán chính xác. Để giải quyết được vấn đề này, cần một mạng RNN có khả năng học được các ngữ cảnh hoặc nói chính xác hơn là kiểm soát được các phụ thuộc xa (long-term dependency). LSTM và khả năng dự đoán dựa vào ngữ cảnhĐể giải quyết vấn đề nêu trên, một mạng thần kinh mới hơn được công bố với khả năng học các phụ thuộc xa - LSTM (Long Short Term Memory networks). Kiến trúc dạng chuỗi các module của LSTM tương tự RNN tuy nhiên trong các module LSTM có cấu trúc phức tạp hơn, bao gồm 4 tầng với các cổng Forget Gate (ft), Input Gate (it), Output Gate (ot). Các cổng này quyết định việc thông tin nào sẽ được lưu trữ, xoá, chỉnh sửa và truyền đi. Các bạn có thể tìm hiểu thêm về cấu trúc này tại blog của blogger Colah. Trong các module này, có 2 output là Cell state (Ct) và Hidden state (ht), với t là thời điểm đang xét. Cell state (Ct) đóng vai trò như một băng tải đưa thông tin đi xuyên suốt qua các module, nhờ vậy thông tin được lưu trữ cho các quá trình xử lý phía sau mà không mất đi. Đồng thời, các khối xử lý khác có thể tác động vào nội dung của ct để quyết định thông tin cần truyền tại các thời điểm. Các phép biến đổi trong modlue bao gồm sigma, tanh (chuyển về giá trị trong khoảng [0;1]), phép nhân và phép cộng. Theo đó, giả sử hàm kích hoạt là hàm tanh, theo sơ đồ dễ thấy có 2 đầu vào qua hàm tanh: Với các cổng ft, it, ot qua các sigma: Khi đó, ct sẽ trở thành: Nhận xét: ct chịu tác động bởi Forget gate nhằm loại bỏ các thông tin không cần thiết, đồng thời thêm các thông tin mới từ Input gate và từ Hidden layer của module trước, việc chọn lọc thông tin đưa vào hidden layer dựa vào kinh nghiệm qua các epochs. Trong khi đó, ht thừa hưởng thông tin từ Output gate và ct. Do tính kế thừa này, mà LSTM phù hợp với các bài toán xử lý thông tin dạng chuỗi (Timeseries), ứng dụng trong các mô hình dự đoán giá trị liền kề (Forecast), phân loại thông tin, ... Ứng dụng dự đoán cổ phiếuMình sẽ dùng LSTM để thử dự đoán giá trị cổ phiếu trong ngày tiếp theo, bộ dữ liệu mình tải về từ Yahoo! Finance. Trong bài viết này, mình đơn giản chỉ hướng dẫn cách để ứng dụng LSTM vào một bài toán dự đoán và không cố gắng để cải thiện tính chính xác của mô hình. Mình sử dụng giá đóng cửa phiên giao dịch để làm cơ sở dự đoán. Chuẩn bị dữ liệuGiá cổ phiếu là một chuỗi các giá trị thay đổi theo thời gian N, gọi P là giá đóng cửa trong ngày i thì 0 < i < N. Mình sẽ tạo ra một cửa sổ trượt w và cho trượt theo trục thời gian, kích thước của w là cố định và step mỗi lần trượt đúng bằng kích thước này để không xảy ra sự chồng chéo dữ liệu. Ý tưởng là dùng dữ liệu trong cửa sổ w(t) để dự đoán cho w(t+1). Dữ liệu sẽ được nhóm lại trong 7 ngày liên tiếp. Một vòng lặp sẽ chạy từ điểm đầu đến điểm cuối của chiều dài bộ dữ liệu. Biến được truyền vào sẽ là bộ dữ liệu (data) và bước nhảy look back (lb) của cửa sổ trượt, cửa sổ trượt ở đây chính là từng khoảng dữ liệu chúng ta trích ra làm mẫu học tập. Các giá trị này được lưu vào các list. #Function to process the data into 7 day look back slices Biến data và lb sẽ được truyền vào khi function processdata() được gọi trong stockpredict phía dưới. Data sẽ có dạng .csv, các bạn có thể tải xuống bộ data trong 5 năm (từ 2013 đến 2018) đã chuẩn bị sẵn tại link này. Xử lý và dự đoánMình sẽ chia bộ dữ liệu thành 2 tệp: 80% cho tệp train và 20% cho tệp test. Sau đó, dùng tệp train để huấn luyện và mang tệp test ra để dự đoán, nếu kết quả dự đoán bám tốt trên tệp test thì cơ bản thành công. Đây là function xử lý chính. Trong function phía dưới, mình thực hiện các bước xử lý dữ liệu, chia dữ liệu thành các tệp train - dùng để huấn luyện mô hình và tệp test - dùng để kiểm thử mức độ chính xác trong các dự đoán, huấn luyện và đánh giá mô hình qua các biểu đồ. Tổng quan thì nếu biểu đồ predicted (màu xanh) bám và trùng với biểu đồ real (màu cam) thì mô hình dự đoán khá chính xác. def stockpredict(stockName): |