Trong bài Recurrent Neural Network, chúng ta đã tìm hiểu một cách khái quát về nguyên tắc hoạt động cũng như cách thức mà RNN có thể lưu trữ và truyền thông tin từ timestep này đến timestep khác. Trong bài này, chúng ta sẽ tiếp tục tìm hiểu một số biến thể của RNN. Thông thường các biến thể này được phân chia thành 3 loại chính là:

– Type: Vanilla RNN, LSTM hoặc GRU

– Direction: Uni-directional RNN hoặc Bi-directional RNN

– Depth: Single-layer hoặc Multi-layer

Như đã trình bày ở cuối bài Recurrent Neural Network, điểm hạn chế của mạng RNN thông thường (thường được gọi là Vanilla RNN, ‘Vanilla’ ở đây mang nghĩa ‘basic’, ‘simple’ hoặc ‘regular’) là nó không thể lưu thông tin của chuỗi dữ liệu có độ dài lớn (short-term memory). Do đó, để khắc phục nhược điểm này, có hai biến thể của RNN là LSTM (Long Short-Term Memory) và GRU (Gated Recurrent Units) với việc sử dụng cơ chế ‘Gates’ nhằm bổ sung thông tin mới và loại bỏ thông tin không cần thiết từ ‘memory’, từ giúp tăng khả năng lưu trữ thông tin quan trọng của RNN .

LSTM và GRU đều có nguyên tắc hoạt động giống như Vanilla RNN, tuy nhiên điểm khác nhau cơ bản giữa chúng là về cấu trúc của các Cell. Cấu trúc này được mô tả như hình dưới đây [1] :

  

       Vanilla RNN                                LSTM                                         GRU

Trong Vanilla RNN, chúng ta chỉ sử dụng tanh function với dữ liệu đầu vào là Current input (xt) và thông tin lưu trữ từ timestep trước (Hidden state ht-1). Tuy nhiên trong LSTM và GRU, ta sử dụng kết hợp tanh và sigmoid function cùng với các thuật toán để quyết định thông tin nào nên được lưu trữ và thông tin nào nên được loại bỏ.

1) LSTM

Ngoài việc sử dụng hai dữ liệu đầu vào là Current input (xt) và Hidden state ht-1 như mạng RNN thông thường, LSTM còn sử dụng thêm một đầu vào nữa là Cell state (c t-1). Ở đây chúng ta có thể coi Cell state là ‘memory’ của mạng LSTM và nó có thể lưu trữ thông tin của các timestep đầu tiên, do đó hạn chế ảnh hưởng của short-term memory như trong Vanilla RNN

Cấu trúc Cell của LSTM được hình thành từ 3 gates: Forget gate, Input gate và Output gate như sau:a) Forget gate: có nhiệm vụ quyết định liệu thông tin của Cell state ở timestep t-1 có cần được lưu trữ hay không. Thông tin từ Current input và Hidden state được chuyển qua Sigmoid function với output nằm trong khoảng [0, 1]. Do đó nếu giá trị output gần bằng 1, tức là thông tin cần được giữ lại còn nếu output gần bằng 0 thì phải loại bỏ thông tin.

b) Input gate: có nhiệm vụ cập nhật thông tin vào Cell state. Ở đây ta nhân output của Sigmoid với output của Tanh để quyết định thông tin của Current input và Hidden state có nên được cập nhật vào Cell state hay không.

c) Output gate: có nhiệm vụ tính giá trị của Hidden state cho timestep tiếp theo. Với việc sử dụng Forget gate và Input gate, ta có thể tính được giá trị mới của Cell state và từ đó kết hợp với Current input và Hidden state để tính giá trị của Hidden state tiếp theo. Ở đây giá trị của Hidden state mới này cũng chính là giá trị Prediction.

Như vậy, trong LSTM chúng ta có 3 input và 2 output là Cell state và Hidden state.

2) GRU

Chúng ta có thể coi GRU là một phiên bản của LSTM với nguyên tắc hoạt động tương tự như LSTM nhưng có cấu tạo đơn giản hơn. GRU kết hợp Cell state và Hidden state thành 1, do đó nó chỉ có 2 input và 1 output. Ngoài ra, trong GRU chúng ta sử dụng 2 gate là Reset gate và Update gate để quyết định việc lưu trữ và loại bỏ thông tin.Cả LSTM và GRU đều có những ưu nhược điểm của riêng mình. Thông thường LSTM có thể lưu trữ thông tin với dữ liệu dài hơn so với GRU. Tuy nhiên do cấu tạo đơn giản của mình, GRU thường xử lý nhanh hơn LSTM và có thể dễ dàng sử dụng để xây dựng các mạng có cấu trúc phức tạp. Do đó, việc sử dụng LSTM và GRU tùy thuộc vào từng yêu cầu bài toán cụ thể và thông thường chúng ta nên thử cả 2 mô hình này.

Ngoài ra, một đặc điểm chung của 3 loại RNN (Vanilla RNN, LSTM, GRU) là chúng đều hoạt động theo một chiều nhất định (forward direction). Hay nói một cách khác, các mạng này chỉ mang thông tin tính tới thời điểm hiện tại. Tuy nhiên, trong nhiều bài toán NLP thì việc biết thông tin của các timesteps tiếp theo giúp cải thiện rất nhiều kết quả output (Translation, Speech recognition, Handwritten recognition,..). Trong trường hợp này chúng ta có thể sử dụng Bi-directional RNN với việc xử lý thông tin theo cả hai chiều (forward và backward) [2]. Mô hình hoạt động của Bi-directional RNN có thể được mô tả như hình dưới đây: Ở đây,chúng ta có thể sử dụng Vanilla RNN, LSTM hoặc GRU làm các Cell cho Bi-directional RNN và kết quả output được tính bằng cách kết hợp cả hai Hidden state từ forward và backward direction.

Ngoài ra, chúng ta cũng có thể kết hợp nhiều mạng RNN để tạo thành một Multi-layer RNN network với output của layer này trở thành input của layer tiếp theo như sau:

[1] https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21

[2] https://www.coursera.org/lecture/nlp-sequence-models/bidirectional-rnn-fyXnn

Tháng Ba 27, 2019
ITechSeeker