Site icon Blog Dương Trạng

[RNN] LSTM là gì?

Bài viết này đã được dịch từ trang blog của colah.

LSTM là một phiên bản nâng cao của mạng RNN, được sử dụng để giải quyết vấn đề về việc ghi nhớ các thông tin lâu dài của mạng RNN. Có nhiều bài viết đã giới thiệu về LSTM, nhưng bài viết của Christopher Olah có lẽ là dễ hiểu nhất và được đề cập nhiều nhất. Vì vậy, tôi quyết định dịch lại để có thể hiểu rõ hơn và chia sẻ thông tin này đến các bạn đang tìm hiểu về LSTM.

Con người không bắt đầu suy nghĩ từ đầu trong mỗi khoảng thời gian. Tương tự như việc bạn đọc bài viết này, bạn hiểu từng chữ dựa trên những từ bạn đã hiểu từ trước đó, không phải từ đầu đến cuối. Điều này đồng nghĩa với việc tư duy của chúng ta đã có khả năng lưu giữ những gì đã diễn ra trước đó.

Tuy nhiên, các mạng nơ-ron truyền thống không thể làm điều đó, đây là một điểm yếu của mạng nơ-ron truyền thống. Ví dụ, nếu bạn muốn phân loại các cảnh trong một bộ phim dựa trên tất cả các cảnh trước đó, thì mạng nơ-ron truyền thống không thể hiểu được tình huống hiện tại phụ thuộc vào những tình huống trước đó.

Mạng nơ-ron hồi quy (Recurrent Neural Network – RNN) ra đời để giải quyết vấn đề này. Mạng này có các vòng lặp bên trong cho phép thông tin được lưu giữ.

Bức tranh trên mô tả một phần của mạng nơ-ron hồi quy $ A $ với đầu vào là $ x_t $ và đầu ra là $ h_t $. Các vòng lặp cho phép thông tin được truyền từ bước này sang bước khác của mạng nơ-ron.

Các vòng lặp này làm cho mạng nơ-ron hồi quy trở nên khó hiểu. Tuy nhiên, nếu bạn chú ý một chút, bạn sẽ thấy rằng nó không khác biệt nhiều so với mạng nơ-ron truyền thống. Một mạng nơ-ron hồi quy có thể được xem như nhiều bản sao của cùng một mạng, trong đó mỗi đầu ra của mạng này là đầu vào của một mạng sao chép khác. Điều này có thể hơi khó hiểu, nhưng hãy nhìn vào hình mô tả sau đây:

Chuỗi các mạng sao chép này chính là mạng nơ-ron hồi quy, các vòng lặp kết nối chúng thành một chuỗi danh sách các mạng sao chép. Bạn có thấy chúng khác gì so với mạng nơ-ron truyền thống không? Không khác gì phải không? Các nút của mạng vẫn nhận đầu vào và có đầu ra như mạng nơ-ron truyền thống.

Trong vài năm gần đây, việc áp dụng RNN đã mang lại nhiều kết quả đáng kinh ngạc trong nhiều lĩnh vực: nhận dạng giọng nói, ngôn ngữ tự nhiên, dịch máy, mô tả hình ảnh,… Danh sách này vẫn đang được mở rộng. Andrej Karpathy đã đề cập đến một số kết quả mà RNN mang lại trong bài viết của mình, nên tôi sẽ không nói thêm nữa. Nhưng tôi muốn nhấn mạnh rằng chúng thực sự tuyệt vời.

Đằng sau sự thành công này là đóng góp của LSTM. LSTM là một dạng đặc biệt của mạng nơ-ron hồi quy, trong nhiều tình huống, nó vượt trội hơn mạng hồi quy truyền thống. Hầu hết các kết quả thú vị của RNN đều được thực hiện bằng cách sử dụng LSTM. Trong bài viết này, chúng ta sẽ cùng khám phá LSTM là gì.

Một điểm đặc biệt của RNN là ý tưởng kết nối thông tin trước để dự đoán hiện tại. Nếu RNN có thể làm điều đó, nó sẽ rất hữu ích, tuy nhiên, liệu RNN có thể làm được không? Câu trả lời là tùy thuộc vào từng trường hợp.

Đôi khi chúng ta chỉ cần xem xét thông tin gần đây để biết được tình huống hiện tại. Ví dụ, chúng ta có câu: “các đám mây trên bầu trời”, chúng ta chỉ cần đọc đến “các đám mây trên bầu” để biết từ tiếp theo là “trời”. Trong tình huống này, khoảng cách giữa thông tin cần dùng để dự đoán là nhỏ, nên RNN có thể học được.

Tuy nhiên, trong nhiều tình huống, chúng ta phải sử dụng nhiều thông tin hơn để suy luận. Ví dụ, dự đoán từ cuối cùng trong đoạn văn: “I grew up in France… I speak fluent French.”. Rõ ràng là chỉ từ ngữ gần như “I speak fluent” mới cho chúng ta biết từ tiếp theo là tên của một ngôn ngữ nào đó, chứ không thể biết được đó là tiếng gì. Để biết được là tiếng gì, chúng ta cần có ngữ cảnh “I grew up in France”. Như vậy, khoảng cách thông tin trong trường hợp này có thể đã khá xa.

Điều đáng tiếc là với khoảng cách càng lớn, RNN bắt đầu không thể nhớ và học được nữa.

Lý thuyết cho thấy RNN có khả năng xử lý các phụ thuộc xa (long-term dependencies). Chúng ta có thể điều chỉnh các thông số sao cho có thể giải quyết vấn đề này. Tuy nhiên, thực tế cho thấy RNN có vẻ không thể học được các tham số đó. Vấn đề này đã được phân tích sâu bởi Hochreiter (1991) và Bengio, et al. (1994), trong các bài viết của họ, họ đã tìm ra nguyên nhân cơ bản giải thích tại sao RNN không thể học được.

Tuy nhiên, may mắn là LSTM không gặp vấn đề đó!

Mạng LSTM (Long Short Term Memory) hay còn gọi là mạng bộ nhớ dài-ngắn, là một dạng đặc biệt của RNN, trong nhiều trường hợp, nó có hiệu suất tốt hơn mạng hồi quy truyền thống. Hầu hết các kết quả thú vị của RNN đều được sử dụng với LSTM. Trong bài viết này, chúng ta sẽ khám phá chi tiết về LSTM là gì.

Một điểm đặc trưng của LSTM là trạng thái tế bào (cell state) – đường chạy ngang trên sơ đồ hình vẽ.

Trạng thái tế bào có tính chất giống như một dây truyền. Nó trải qua tất cả các vòng lặp (các nút mạng) và chỉ tương tác một cách tuyến tính nhỏ. Điều này cho phép thông tin có thể truyền qua mà không sợ bị thay đổi.

LSTM có khả năng loại bỏ hoặc thêm thông tin vào trạng thái tế bào, thông tin này được điều chỉnh cẩn thận bởi các cổng (gate).

Cổng là nơi lọc thông tin khi đi qua nó, chúng được kết hợp bởi một tầng mạng sigmoid và một phép nhân.

Tầng sigmoid cho đầu ra là một số trong khoảng $[0, 1]$, miêu tả mức độ thông tin có thể truyền qua. Khi đầu ra là 0, tức là không có thông tin nào được truyền qua, còn khi đầu ra là 1, tức là toàn bộ thông tin truyền qua nó.

Một LSTM gồm có 3 cổng để duy trì và điều hành trạng thái tế bào.

3.1. Ý tưởng cốt lõi của LSTM

Chìa khóa của LSTM là trạng thái tế bào (cell state) – chính đường chạy thông ngang phía trên của sơ đồ hình vẽ.

Trạng thái tế bào là một dạng giống như băng truyền. Nó chạy xuyên suốt tất cả các mắt xích (các nút mạng) và chỉ tương tác tuyến tính đôi chút. Vì vậy mà các thông tin có thể dễ dàng truyền đi thông suốt mà không sợ bị thay đổi.

LSTM có khả năng bỏ đi hoặc thêm vào các thông tin cần thiết cho trạng thái tế bảo, thông tin này được điều chỉnh cẩn thận bởi các cổng (gate).

Các cổng là nơi sàng lọc thông tin đi qua nó, chúng được kết hợp bởi một tầng mạng sigmoid và một phép nhân.

Tầng sigmoid sẽ cho đầu ra là một số trong khoảng $[0, 1]$, mô tả có bao nhiêu thông tin có thể được thông qua. Khi đầu ra là 0, tức là không cho thông tin nào qua cả, còn khi là 1, tức là cho tất cả các thông tin đi qua nó.

Một LSTM gồm có 3 cổng như vậy để duy trì và điều hành trạng thái của tế bào.

3.2. Bên trong LSTM

Bước đầu tiên của LSTM là quyết định thông tin nào sẽ bị bỏ đi từ trạng thái tế bào. Quyết định này được đưa ra bởi tầng sigmoid, gọi là “tầng cổng quên” (forget gate layer). Nó lấy đầu vào là $h_{t-1}$ và $x_t$, sau đó cho ra kết quả là một số trong khoảng $[0, 1]$ cho mỗi số trong trạng thái tế bào $C_{t-1}$. Nếu đầu ra là 1, tức là giữ lại toàn bộ thông tin, còn đầu ra 0 có nghĩa là bỏ đi toàn bộ thông tin.

Quay trở lại với ví dụ về mô hình ngôn ngữ dự đoán từ tiếp theo dựa trên tất cả các từ trước đó, trong trường hợp này, trạng thái tế bào có thể mang thông tin về giới tính của một nhân vật, từ đó giúp sử dụng đại từ nhân xưng chính xác. Tuy nhiên, khi chuyển đến một người khác, chúng ta sẽ không muốn nhớ giới tính của nhân vật trước đó nữa, vì nó không còn liên quan với chủ thể mới.

Bước tiếp theo là quyết định thông tin mới nào sẽ được lưu vào trạng thái tế bào. Quá trình này gồm hai phần. Phần đầu tiên là sử dụng một tầng sigmoid, gọi là “tầng cổng vào” (input gate layer) để quyết định cập nhật giá trị nào. Tiếp theo là một tầng $tanh$ tạo ra một vector cho giá trị mới (tilde{C_t}), nhằm thêm vào cho trạng thái. Qua hai bước này, chúng ta sẽ kết hợp hai giá trị để tạo ra cập nhật cho trạng thái.

Ví dụ với mô hình ngôn ngữ, ta muốn thêm thông tin về giới tính của nhân vật mới vào trạng thái tế bào và thay thế giới tính của nhân vật trước đó.

Kế tiếp, chúng ta cần cập nhật trạng thái tế bào cũ $C_{t-1}$ thành trạng thái mới $C_t$. Đã có quyết định về việc cần làm, giờ chỉ cần thực hiện là xong.

Chúng ta sẽ nhân trạng thái cũ với $f_t$ để loại bỏ những thông tin chúng ta quyết định loại bỏ trước đó. Sau đó, cộng thêm $i_t * tilde{C_t}$. Trạng thái mới thu được phụ thuộc vào việc chúng ta quyết định cập nhật mỗi giá trị trạng thái như thế nào.

Với bài toán mô hình ngôn ngữ, ta chỉ cần xem chủ thể mà ta có thể đưa ra thông tin về một từ tiếp theo. Ví dụ, nếu đầu ra của chủ thể là số ít hoặc số nhiều, ta có thể biết được dạng từ tiếp theo phải như thế nào.

Những gì chúng ta đã mô tả ở trên là một LSTM khá bình thường. Tuy nhiên, không phải tất cả các LSTM đều như vậy. Thực tế, các bài viết về LSTM đã sử dụng một phiên bản hơi khác so với LSTM chuẩn. Sự khác biệt không lớn, nhưng nó giúp giải quyết một phần trong cấu trúc của mạng LSTM.

Một dạng LSTM phổ biến được giới thiệu bởi Gers & Schmidhuber (2000) là việc thêm các kết nối “peephole connections” vào mọi cổng, tuy nhiên, cũng có các nghiên cứu chỉ thêm vào một vài cổng.

Một biến thể khác là kết hợp hai cổng loại trừ và đầu vào với nhau. Thay vì phân tách quyết định loại trừ thông tin và quyết định thêm thông tin, chúng ta sẽ quyết định cả hai cùng một lúc. Chúng ta chỉ loại bỏ thông tin khi thay thế thông tin mới vào. Chúng ta chỉ thêm thông tin mới khi thay thế bất kỳ thông tin cũ nào.

Một biến thể khá thú vị khác của LSTM là Gated Recurrent Unit (GRU) được giới thiệu bởi Cho, et al. (2014). Nó kết hợp các cổng loại trừ và đầu vào thành một cổng “cổng cập nhật” (update gate). Nó cũng kết hợp trạng thái tế bào và trạng thái ẩn với nhau tạo ra một cách thay đổi khác. Kết quả là mô hình của chúng ta sẽ đơn giản hơn mô hình LSTM chuẩn và ngày càng trở nên phổ biến hơn.

Trên đây chỉ là một số biến thể được chú ý nhiều nhất, tuy nhiên thực tế có rất nhiều các biến thể khác nhau của LSTM như Depth Gated RNNs của Yao, et al. (2015). Cũng có các biến thể khác mà cách tiếp cận xử lý phụ thuộc xa hoàn toàn khác như Clockwork RNNs của Koutnik, et al. (2014).

Nếu bạn muốn tìm hiểu xem biến thể nào là tốt nhất và chúng khác nhau thế nào, bạn có thể đọc bài so sánh rất hay của Greff, et al. (2015). Ngoài ra, Jozefowicz, et al. (2015) đã thử hàng chục nghìn kiến trúc RNN khác nhau và tìm ra một số mô hình hoạt động tốt hơn cả LSTM ở một số bài toán.

Như tôi đã đề cập từ đầu, RNN đã mang lại nhiều kết quả tuyệt vời. Đằng sau những thành công đó là sự sử dụng của LSTM. Chúng hoạt động rất tốt cho hầu hết các bài toán!

Viết ra các công thức làm cho LSTM trở nên khó hiểu. Hy vọng rằng thông qua các bước phân tích trong bài viết này, bạn đã có cái nhìn sâu sắc hơn về chiến lược của LSTM.

LSTM là một bước lớn trong việc sử dụng RNN. Ý tưởng của nó là cho phép tất cả các bước của RNN có thể truy cập thông tin từ một tập thông tin lớn hơn. Ví dụ, nếu bạn sử dụng RNN để tạo mô tả cho một bức ảnh, nó có thể lấy một phần ảnh để dự đoán mô tả từ các từ đầu vào. Điều này đã được chứng minh bởi Xu, et al. (2015). Hiện tại, cũng có nhiều kết quả thực sự thú vị khác được chú ý và có vẻ như có nhiều kết quả hơn chúng ta biết.

Sự chú ý không chỉ nằm trong nhóm nghiên cứu RNN. Ví dụ, Grid LSTMs của Kalchbrenner, et al. (2015) cũng có tiềm năng khá lớn. Cũng có những người đã sử dụng RNN trong các mô hình sinh như Gregor, et al. (2015), Chung, et al. (2015), hay Bayer & Osendorfer (2015) cũng rất thú vị. Các năm gần đây đã là một thời kỳ rất sống động của mạng nơ-ron hồi quy và hy vọng chúng sẽ còn được kỳ vọng hơn nữa trong tương lai.

Exit mobile version