Long short-term memory (LSTM)

Short term vs Long term memory

Short term vs Long term memory

Deep learning là một kĩ thuật Machine Learning mạnh mẽ đang được nhiều người trong ngành biết đến và nghiên cứu. Kĩ thuật này nổi trội là do chúng thực hiện được hai việc cùng lúc: biểu diễn thông tin (represent problem/feature engineering) và học (learning). Do đó, kĩ thuật này còn được gọi là representation learning.

Bên cạnh các lĩnh vực đã gặt hái được nhiều thành công như Xử lý ảnh số và video số, hay Xử lý tiếng nói, Deep Learning cũng được áp dụng vào Xử lý ngôn ngữ tự nhiên. Cụ thể trong bài viết này, Long short-term memory (LSTM) là mô hình cải tiến từ RNN cũng thuộc họ Deep Learning mà ta cần quan tâm.

Nhắc lại Recurrent Neural Networks

Để đọc hiểu một câu hay một đoạn văn, con người chúng ta không quên hết những thông tin trước đó mà sẽ xâu chuỗi lại các dữ liệu đã đọc để làm rõ ý nghĩa cho thông tin hiện tại. Tương tự như việc ôn bài, việc làm này giúp các liên kết bên trong não được khắc sâu và tổ chức lại thông tin cho việc truy suất và xử lý thông tin trong tương lai được rõ ràng và nhanh chóng hơn.

Các mô hình Neural Networks truyền thống không thể làm được điều này. Ví dụ, trong bài toán phân lớp sự kiện cho một đoạn video theo từng giây. Thật khó để một mô hình như vậy có thể dựa vào thông tin trước đó để phân lớp.

RNN giải quyết vấn đề này bằng cách tạo ra các mạng vòng lặp bên trong chúng, cho phép thông tin được lưu trữ lại cho các lần phân tích tiếp theo.

Recurrent Neural Networks have loops

Recurrent Neural Networks have loops

Trong biểu đồ trên, A nhận thông tin của x_t tại thời điểm t và phản hồi lại tương ứng kết quả đầu ra h_t tại thời điểm t. Ta có thể rã vòng lặp trên thành một tiến trình để dễ hình dung hơn.

An unrolled recurrent neural network

An unrolled recurrent neural network

Thay vì chỉ nhận một đầu vào là x như các mạng neural truyền thống, RNN hình thành nên một chuỗi các đầu vào A cùng với x_t tại thời điểm t. Mô hình này khá tương tự như Hidden Markov Model trong bài toán gán nhãn từ loại.

Vấn đề phụ thuộc quá dài (Long-Term Dependencies)

Một trong những ý tưởng khởi thuỷ của RNN là kết nối những thông tin trước đó nhằm hỗ trợ cho các xử lý hiện tại. Nhưng đôi khi, ta chỉ cần dựa vào một số thông tin gần nhất để thực hiện tác vụ hiện tại. Ví dụ, trong language modeling, bạn cố gắng dự đoán từ tiếp theo dựa vào các từ trước đó. Nếu chúng ta dự đoán từ cuối cùng trong câu “đám mây bay trên bầu trời”, thì chúng ta không cần truy tìm quá nhiều từ trước đó, ta có thể đoán ngay từ tiếp theo sẽ là “bầu trời”. Trong trường hợp này, khoảng cách tới thông tin liên quan được rút ngắn lại.

RNN short term depdencies

RNN short term depdencies

RNN long term dependencies

RNN long term dependencies

Về lý thuyết, RNN hoàn toàn có khả năng xử lý “long-term dependencies”, nghĩa là thông tin hiện tại có được là nhờ vào chuỗi thông tin trước đó. Thật không may, trong thực tế, RNN dường như không có khả năng này. Vấn đề này đã được Hochreiter (1991) [German] and Bengio, et al. (1994) đưa ra như một thách thức cho mô hình RNN.

Trong những năm 1990, RNN phải đối diện với hai thách thức lớn đó là Vanishing và Exploding Gradients ảnh hưởng lớn đến hiệu suất của mô hình. Vấn đề này phát sinh trong quá trình huấn luyện.

LSTM formula

LSTM formula

Nếu trọng số của ma trận W nhỏ (trị riêng trọng số của ma trận nhỏ hơn 1.0), điều này sẽ dẫn đến trường hợp được gọi là vanishing gradients khi gradient signal ngày càng nhỏ/tan biến theo quá trình huấn luyện, khiến cho quá trình tối tiểu hoá hàm lỗi hội tụ chậm hoặc dừng hẳn.

Ngược lại, nếu trọng số của ma trận W lớn (trị riêng trọng số của ma trận lớn hơn 1.0), điều này sẽ dẫn đến trường hợp được gọi là exploding gradients khi gradient signal ngày càng bị phân tán trong quá trình huấn luyện, khi đó quá trình tổi tiểu hoá hàm lỗi không hội tụ.

Recurrent nets tìm kiếm và hình thành mối liên kết giữa final output và các input event thông qua nhiều bước trước khi kết thúc quá trình huấn luyện. Vấn đề đặt ra là các thông tin input trước đó cần đặt trọng số tương ứng là bao nhiêu. Do vậy, đối với câu huấn luyện càng dài thì thông tin trước đó ngày càng bị nhiễu hoặc bị che lấp. Khi thực hiện quá nhiều phép toán nhân ma trận liên tục xuyên suốt chiều dài của chuỗi thì hiệu ứng vanishing/exploding sẽ xuất hiện.

Hình minh hoạ dưới đây cho ta thấy hiệu ứng khi áp dụng liên tiếp hàm sigmoid. Dữ liệu thu được ngày càng tan biến dần cho đến lúc không còn nhận ra được nữa. Tương tự như gradient vanishing khi ta truyền dữ liệu qua nhiều layer.

Effects of applying a sigmoid function over and over again

Effects of applying a sigmoid function over and over again

LSTM Networks

Long Short Term Memory networks – thường được gọi là “LSTM”, là trường hợp đặc biệt của RNN, có khả năng học long-term dependencies. Mô hình này được giới thiệu bởi Hochreiter & Schmidhuber (1997), và được cải tiến lại. Sau đó, mô hình này dần trở nên phổ biến nhờ vào các công trình nghiên cứu gần đây. Mô hình này có khả năng tương thích với nhiều bài toán nên được sử dụng rộng rãi ở các ngành liên quan.

LSTM được thiết kế nhằm loại bỏ vấn đề long-term dependency. Trước khi đi vào LSTM, ta quan sát lại mô hình RNN bên dưới, các layer đều mắc nối với nhau thành các module neural network. Trong RNN chuẩn, repeating module này có cấu trúc rất đơn giản chỉ gồm một single tanh layer.

The repeating module in a standard RNN contains a single layer

The repeating module in a standard RNN contains a single layer

LSTM cũng có cấu trúc mắc xích tương tự, nhưng các repeating module có cấu trúc khác hẳn. Thay vì chỉ có một layer neural network, ta có tới bốn layer, tương tác với nhau theo một cấu trúc cụ thể.

The repeating module in an LSTM contains four interacting layers

The repeating module in an LSTM contains four interacting layers

Trước tiên, ta hãy làm quen với ký hiệu được sử dụng.

LSTM notation

LSTM notation

Ở biểu đồ trên, hình tròn nền hồng biểu diễn pointwise operations, ví dụ cộng vector. Hình hộp nền vàng là các neural network layers được huấn luyện. Đường kẻ gộp lại nhau biểu thị cho concatenation, trong khi đó đường rẽ nhánh biểu thị cho sự sao chép từ vị trí này sang vị trí khác.

Ý tưởng của LSTMs

Có lẽ sau khi quan sát mô hình thiết kế của LSTM, bạn sẽ nhận ra ngay, đây là một bảng mạch số, gồm các mạch logic và các phép toán logic trên đó. Thông tin, hay nói khác hơn là tần số của dòng điện di chuyển trong mạch sẽ được lưu trữ, lan truyền theo cách mà chúng ta thiết kế bảng mạch.

Mấu chốt của LSTM là cell state (tế bào trạng thái), đường kẻ ngang chạy dọc ở trên top diagram. Cell state giống như băng chuyền. Nó chạy xuyên thẳng toàn bộ mắc xích, chỉ một vài tương tác nhỏ tuyến tính (minor linear interaction) được thực hiện. Điều này giúp cho thông tin ít bị thay đổi xuyên suốt quá trình lan truyền.

LSTM C Line

LSTM C Line

LSTM có khả năng thêm hoặc bớt thông tin vào cell state, được quy định một cách cẩn thận bởi các cấu trúc gọi là cổng (gate).

Các cổng này là một cách (tuỳ chọn) để định nghĩa thông tin băng qua. Chúng được tạo bởi sigmoid neural net layer và một pointwise multiplication operation.

LSTM gate

LSTM gate

Sigmoid layer outputs có giá trị từ 0 – 1, mô tả độ lớn thông tin được phép truyền qua tại mỗi component. Nếu ta thu được zero điều này có nghĩa là “không cho bất kỳ cái gì đi qua”, ngược lại nếu thu được giá trị là một thì có nghĩa là “cho phép mọi thứ đi qua”. Một LSTM có ba cổng như vậy để bảo vệ và điều khiển cell state.

Phân tích mô hình LSTM

Bước đầu tiên của mô hình LSTM là quyết định xem thông tin nào chúng ta cần loại bỏ khỏi cell state. Tiến trình này được thực hiện thông qua một sigmoid layer gọi là “forget gate layer” – cánh cổng quên lãng. Đầu vào là h_{t-1}x_t, đầu ra là một giá trị nằm trong khoảng [0, 1] cho cell state C_{t-1}. 1 tương đương với “giữ lại thông tin”, 0 tương đương với “loại bỏ thông tin”.

LSTM focus f

LSTM focus f

Bước tiếp theo, ta cần quyết định thông tin nào cần được lưu lại tại cell state. Ta có hai phần. Một, single sigmoid layer được gọi là “input gate layer” quyết định các giá trị chúng ta sẽ cập nhật. Tiếp theo, một tanh layer tạo ra một vector ứng viên mới, \tilde{C}_t. được thêm vào trong cell state.

LSTM focus i

LSTM focus i

Ở bước tiếp theo, ta sẽ kết hợp hai thành phần này lại để cập nhật vào cell state. Lúc cập nhật vào cell state cũ, C_{t-1}, vào cell state mới C_t. Ta sẽ đưa state cũ hàm f_t, để quên đi những gì trước đó. Sau đó, ta sẽ thêm (i_t * C~_t). Đây là giá trị ứng viên mới, co giãn (scale) số lượng giá trị mà ta muốn cập nhật cho mỗi state.

LSTM focus c

LSTM focus c

Cuối cùng, ta cần quyết định xem thông tin output là gì. Output này cần dựa trên cell state của chúng ta, nhưng sẽ được lọc bớt thông tin. Đầu tiên, ta sẽ áp dụng single sigmoid layer để quyết định xem phần nào của cell state chúng ta dự định sẽ output. Sau đó, ta sẽ đẩy cell state qua tanh (đẩy giá trị vào khoảng -1 và 1) và nhân với một output sigmoid gate, để giữ lại những phần ta muốn output ra ngoài.

LSTM focus o

LSTM focus o

Các biến thể của LSTM

Trong thực tế, hầu như mọi bài báo liên quan đến LSTM đều là những biến thể của nó. Sự khác biệt này không đáng kể, nhưng đáng được đề cập ở đây.

Một trong những biến thể LSTM nổi tiếng được giới thiệu bởi Gers & Schmidhuber (2000) bằng cách thêm vào “peephole conections” tương tự như lỗ nhìn trộm được liên kết với nhau. Nghĩa là ta cho các gate layer nhìn thẳng vào cell state.

LSTM peepholes

LSTM peepholes

Đồ thị trên thêm vào các peephole ở tất cả các gate, nhưng có một vài bài báo sẽ bỏ bớt các peephole này.

Một biến thể khác sử dụng coupled forget và input gates. Thay vì tách biệt giữa quyết định quên đi và thêm thông tin mới, ta sẽ gộp chung hai quyết định này lại với nhau. Ta chỉ forget khi ta dự định input cái gì đó vào vị trí của nó. Ta chỉ input các giá trị mới vào state khi ta quên các thông tin cũ.

LSTM tied

LSTM tied

Một biến thể ấn tượng hơn là Gated Recurrent Unit – GRU được giới thiệu bởi Cho, et al. (2014). Mô hình này kết hợp forget và input gates thành một single “update gate”. Nó đồng thời gộp cell state và hidden state, và tạo ra một vài thay đổi khác. Kết quả ta thu được mô hình đơn giản hơn mô hình LSTM truyền thống, mô hình này đang ngày càng phát triển và được sử dụng rộng rãi.

LSTM GRU

LSTM GRU

Biến thể nào là tốt nhất? Sự khác biệt này có đáng kể? Greff, et al. (2015) cho ta thấy sự so sánh khá thú vị giữa các biến thể thông dụng hiện nay, và nhận định rằng tất cả chúng đều như nhau. Jozefowicz, et al. (2015) đã kiểm tra hơn 10,000 kiến trúc RNN, và thấy rằng một số bài toán RNN cho ra kết quả tốt hơn nhiều LSTM. Nên tuỳ theo bài toán mà ta sẽ chọn ra mô hình nào phù hợp nhất.

Kết luận

Mô hình LSTM là một bước đột phá mà chúng ta đạt được từ mô hình RNNs. Liệu vẫn còn những bước đột phá nào khác từ mô hình này không? Một ý kiến thông thường của các nhà nghiên cứu đó là “Có! Sẽ có một bước tiến mới”.

Các ứng dụng của mô hình LSTM

LSTM được ứng dụng vào hand writing rất tốt. Đầu vào là (x, y, p) đường đi của bút viết, output là dự đoán ký tự đang được viết ra.

Online hand writting recognition by RNN with LSTM

Online hand writting recognition by RNN with LSTM

Ngoài ra, còn có các ứng dụng khác như:

  • Robot control
  • Time series prediction
  • Speech recognition
  • Rhythm learning
  • Music composition – http://yoavz.com/music_rnn/
  • Grammar learning
  • Human action recognition
  • Protein Homology Detection

Nguồn tham khảo

Advertisements

11 thoughts on “Long short-term memory (LSTM)

  1. Reblogged this on Speak! Go and commented:
    Long Short Term Memory networks – thường được gọi là “LSTM”, là trường hợp đặc biệt của RNN, có khả năng học long-term dependencies. Mô hình này được giới thiệu bởi Hochreiter & Schmidhuber (1997), và được cải tiến lại. Sau đó, mô hình này dần trở nên phổ biến nhờ vào các công trình nghiên cứu gần đây. Mô hình này có khả năng tương thích với nhiều bài toán nên được sử dụng rộng rãi ở các ngành liên quan. LSTM được thiết kế nhằm loại bỏ vấn đề long-term dependency.

    Like

  2. Em chào anh,
    Em hiện là sinh viên Khoa học Máy tính năm 3 và em khá quan tâm đến Machine Learning. Anh cho em hỏi tên cụ thể của lý thuyết toán(tiếng Anh) trong bài viết này và một số keywords liên quan được không ạ? Em đọc nhưng không hiểu gì cả.
    Cảm ơn anh vì nhiều bài viết hay!

    Like

  3. Chào anh,

    Khi tìm hiểu về LSTM em thấy nó có các dạng sau: one-to-many, many-to-one, many-to-many, Synchronized Many-to-Many (dựa vào mối quan hệ giữa input và output). Vậy nếu em có 1 tập data về dòng chảy sông gồm 8 thuộc tính và tốc độ dòng chảy ở mỗi row (1 row là 1 ngày và có nhiều rows). Anh cho em hỏi đây là dạng many-to-one hay many-to-many ạ.

    Cám ơn anh.

    Like

  4. hi anh,
    Em có đầu vào input: [[1,2,3,4][4,5,6,7]…[2,3,4,5]] dim: (240,4) và output y: [[1,0,0],[0,0,1]…[0,1,0]] dim: (240,3) y là category nhưng sử dụng 1 hot encoding để chuyển thành dạng trên, em áp dụng LSTM với input em reshape thành (240,1,4) thì time_step: 1, nhưng kết quả train ko tốt, em chưa hiểu time_step ở đây là gì cho lắm ạ, với lại sequence ở đây là gì. Nếu em chuyển x: (3,80,4) với timestep thành 80 thì tốt hơn không ạ, khi đó em chuyển y(80,3) thì báo lỗi do layer cuối. Em cảm ơn anh.

    Like

    • time_step ở đây là số lần lặp training, là thuật ngữ dùng trong Neural Network.
      sequence có thể hiểu là chuỗi từ vựng, chuỗi phần tử, chuỗi liên kết, hoặc chuỗi tham số, …
      LSTM có nhiều biến thể, không biết em đang dùng loại nào?

      Like

      • Em dùng layer LSTM thuần ở keras anh ạ. anh có thể nói rõ hơn về time_step không ạ, em thấy có khái niệm nb_epochs trong keras( cũng là số lần lặp trainning a), input của em đầu vào không phải là một sequence anh ạ, nó rời rạc và không phải chuỗi, kiểu như vector[1,2,3,4]->1, [2,3,4,5] thì ra 0 cứ như thế, nhưng giờ e muốn coi nó là sequence để train với LSTM ( vì em nghĩ là kết quả của các vector theo thứ tự có thể có liên hệ với nhau) em có đọc thì một bạn có bảo đổi nó thành time_step =80 để train, nhưng em không hiểu làm như thế nào với đầu vào như của em aj. Thực ra em có thể reshape input thành dạng (n_sample/80,80,4) lúc này time_step đưa vào train cho layer lstm là 80, nhưng em khôn ghiểu ý nghĩa của nó, và cái sequence output ra của em y em cũng reshape từ dạng (3) thành (80,3) thì có lỗi. Nên em nghĩ em cần hiểu rõ cái time_step với sequence trong trường hợp của em là như thế nào ạ. Nhưng em đọc thì không hiểu ( em tự tìm hiểu nên nhiều chỗ không rõ lắm a)

        Like

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s