NLP [P2] - Long Short-Term Memory

NLP [P2] - Long Short-Term Memory

2019, May 12    

TIếp túc series về NLP, hôm nay mình xin giới thiệu tới các bạn một cấu trúc mạng mới - Long Short-Term Memory (LSTM) được giới thiệu bởi Hochreiter & Schmidhuber (1997). Cấu trúc mạng này có thể khắc phục vấn đề phụ thuộc xa của mạng RNN. Nếu chưa theo dõi về RNN - Recurrent Neural Network ở phần trước thì bạn có thể tham khảo thêm bài viết NLP - Sequence Models và Recurrent Neural Network [P1]

Vấn đề phụ thuộc xa

Trong bài viết trước về RNN, mình có nhắc tới vấn đề Vanishing GradientExploding Gradient mà mạng RNN gặp phải trong quá trình học tập khi độ dài của câu quá dài. Ví dụ:

  • Con mèo thích ăn

Ở trong câu này, việc dự đoán từ tiếp theo không quá khó, chúng ta không cần quá phụ thuộc vào ngữ cảnh nhiều mà có thể xác định từ ở đây. RNN có thể dễ dàng học và xử lí được trường hợp này. Tuy nhiên hãy xét ví dụ tiếp theo:

  • Tôi sinh ra và lớn lên ở Việt Nam…… Tôi nói rất tốt tiếng Việt

Vấn đề bắt đầu xuất hiện, để có thể dự đoán được từ “loại ngôn ngữ” ở đây, RNN cần quay ngược và tìm kiếm thông tin “Việt Nam” để có thể trả lời được. Tuy nhiên lúc này, khoảng cách đã trở nên quá xa và RNN trở nên không thể nhớ được những gì ở vị trí xa nữa.

Long Short-Term Memory

LSTM được thiết kế để giải quyết vấn đề nêu trên, nó có khả năng ghi nhớ được thông tin ở xa nhờ có các tầng cổng quên, cổng vào, cổng ra. Cùng đi sâu vào kiến trúc của LSTM để có thể hiểu rõ hơn về chức năng của các cổng này.

Cấu trúc mạng

Thay vì việc tính toán và truyền state đơn thuần như RNN, LSTM có khả năng chọn lọc những thông tin phù hợp cần ghi nhớ dựa vào ngữ cảnh. Nó có thể thêm mới, bỏ bớt thông tin vào cell bằng các gate.

Cổng quên - Forget Gate

Cổng đầu tiên của LSTM giúp nó quyết định thông tin nào sẽ được rút ra từ cell. Bằng việc sử dụng sigmoid layer sẽ đưa ra kết quả trong khoảng từ 0 đến 1. Điều này có nghĩa rằng nếu kết quả càng gần 0 thì có nghĩa là đừng nhớ gì và ngược lại nhớ hoàn toàn kết quả trạng thái phía trước. Đầu vào của cổng là kết quả đầu ra trước đó ht-1 và dữ liệu vào xt

Cổng vào - Input Gate

Cổng tiếp theo của LSTM giúp nó quyết định thông tin nào sẽ được lưu trữ vào trong cell. Việc này được thực hiện nhờ 2 phần chính.

  1. Input gate layer: Dùng hàm sigmoid để quyết định thông tin nào chúng ta sẽ cập nhật, thêm mới.
  2. Cell candidate: Dùng hàm tanh để quyết định xem sẽ cập nhật như thế nào, bao nhiêu thông tin.

Sau khi đã tính toán, việc tiếp theo cần làm là cập nhật giá trị của cell - C

Cổng ra - Output gate

Cuối cùng, LSTM tính toán xem kết quả đầu ra là gì. Kết quả sẽ được tính toán dựa trên trạng thái tế bào đã được lọc.

Đầu tiên, tính toán để xem phần nào của tế bào được tính toán để đữa ra kết quả bằng việc sử dụng hàm sigmoid giống ở Input gate layer. Sau đó nhân với tín hiệu đã đưa qua hàm Tanh của cell để trả về vector đầu ra ht.

LSTM with Keras

Keras cung cấp cho ta layer LSTM để có thể triển khai mô hình giải quyết các bài toán NLP nhanh chóng.

keras.layers.LSTM(units, 
		  activation='tanh',
                  recurrent_activation='hard_sigmoid',
                  use_bias=True, 
                  kernel_initializer='glorot_uniform',
                  recurrent_initializer='orthogonal',
                  bias_initializer='zeros', 
                  unit_forget_bias=True, 
                  kernel_regularizer=None, 
                  recurrent_regularizer=None, 
                  bias_regularizer=None, 
                  activity_regularizer=None, 
                  kernel_constraint=None, 
                  recurrent_constraint=None, 
                  bias_constraint=None, 
                  dropout=0.0,
                  recurrent_dropout=0.0,
                  implementation=1, 
                  return_sequences=False,
                  return_state=False, 
                  go_backwards=False, 
                  stateful=False,
                  unroll=False)

Một số param cơ bản:

  • units: Số chiều của output - Chính là độ lớn của vector ht đầu ra, gần giống với lớp fully-connected
  • keras.layers.Dense gần cuối của CNN.
  • activation: Hàm kích hoạt sử dụng ở cell candidate layer và cổng ra sử dụng để tính toán đầu ra từ giá trị của cell. Như ở trong mô hình cơ bản thì mặc định của nó là hàm Tanh.
  • recurrent_activation: Hàm kích hoạt ở các cổng quên, vào, ra - ở đây mặc định là hàm sigmoid
  • return_sequences: Boolean - Quyết định xem sẽ trả về đầu ra cuối cùng của mạng hoặc tất cả các đầu ra.
  • unroll: Boolean - Nếu True thì mạng sẽ không duỗi, vòng lặp sẽ được sử dụng để tính toán các giá trị, Unroll có thể tăng tốc độ xử lí của RNN tuy nhiên sẽ chiếm dụng bộ nhớ lớn, nên option này chỉ phù hợp với các dữ liệu ngắn.

Một vài kiến trúc khác của LSTM

Ngoài kiến trúc cơ bản ở trên, LSTM đã được nhiều tổ chức phát triển và đưa ra các phiên bản cái tiến khác nhau.

Tuy kiến trúc, cách tính toán có vẻ khác nhau nhưng ý tưởng về việc sử dụng các cổng vẫn được giữ nguyên. Vừa rồi là những chia sẽ của mình về kiến trúc mạng LSTM - Long Short-Term Memory, có gì cần chia sẻ hãy để lại comment nhé :D

Bài viết được sử dụng hình ảnh và tham khảo từ: