Recurrent Neural Network (RNN) là một thuật toán học sâu mạnh mẽ, được sử dụng rộng rãi trong các bài toán xử lý dữ liệu tuần tự như ngôn ngữ tự nhiên, dự báo chuỗi thời gian và nhận dạng giọng nói. Trong bài viết này, FPT.AI sẽ trình bày chi tiết về khái niệm RNN, cách thức hoạt động của nó, các loại RNN phổ biến, cùng với những ưu điểm và hạn chế mà RNN mang lại trong các ứng dụng thực tiễn.
Recurrent Neural Network là gì?
Recurrent Neural Network hay RNN là một Deep Neural Network được huấn luyện trên dữ liệu tuần tự hoặc dữ liệu chuỗi thời gian để tạo ra một mô hình Machine Learning (ML) có thể đưa ra dự đoán hoặc kết luận tuần tự dựa trên các đầu vào tuần tự.
Một RNN có thể được sử dụng để dự đoán mức lũ hàng ngày dựa trên dữ liệu lũ, thủy triều và khí tượng hàng ngày trong quá khứ. Nhưng RNN cũng có thể được sử dụng để giải quyết các vấn đề trật tự hoặc thời gian như dịch ngôn ngữ, xử lý ngôn ngữ tự nhiên Natural Language Processing (NLP), phân tích cảm xúc (Sentiment Analysis), nhận dạng giọng nói và tạo chú thích cho hình ảnh.

Cơ chế hoạt động của Recurrent Neural Networks
Recurrent Neural Networks (RNN) khác biệt với mạng thần kinh truyền thống (như Feedforward và Convolutional Neural Networks) ở khả năng “ghi nhớ” thông tin. Thay vì giả định rằng đầu vào và đầu ra độc lập với nhau, RNN sử dụng thông tin từ các đầu vào trước đó để ảnh hưởng đến kết quả hiện tại.
RNN duy trì một “bộ nhớ” gọi là trạng thái ẩn (hidden state) để lưu thông tin từ các bước trước. Tại mỗi bước, RNN tạo ra một vòng lặp phản hồi: nhận đầu vào hiện tại, kết hợp với trạng thái ẩn từ bước trước, rồi tạo ra kết quả đầu ra và cập nhật trạng thái ẩn mới. Một điểm đặc biệt nữa là RNN sử dụng cùng một bộ trọng số cho mọi bước trong chuỗi, giúp mạng nhỏ gọn hơn dù xử lý dữ liệu dài.
Hãy xem cách RNN hiểu thành ngữ “feeling under the weather” (cảm thấy không khỏe): Khi đọc từ “feeling”, RNN lưu thông tin này vào trạng thái ẩn. Khi đến từ “under”, RNN kết hợp nó với thông tin về “feeling” đã lưu trước đó. Khi đến từ “the”, RNN đã có ngữ cảnh của “feeling under”. Cuối cùng khi đến từ “weather”, RNN hiểu đầy đủ rằng đây là một thành ngữ có nghĩa “không khỏe” chứ không phải nói về thời tiết theo nghĩa đen.
RNN học thông qua một phiên bản đặc biệt của Backpropagation gọi là “Backpropagation Through Time” (BPTT). Thuật toán này tính toán lỗi ở mỗi bước thời gian, tổng hợp lỗi qua các bước thời gian (Mạng feedforward không làm điều này vì chúng không chia sẻ tham số giữa các tầng), rồi điều chỉnh các trọng số để giảm lỗi thông qua quá trình gradient descent. Điều này khác với mạng thần kinh thông thường vì RNN phải tính đến ảnh hưởng của mỗi bước đến tất cả các bước sau đó, tạo nên khả năng “ghi nhớ” độc đáo.

Các hàm kích hoạt phổ biến trong Recurrent Neural Networks
Hàm kích hoạt (Activation Function) là một hàm toán học áp dụng cho đầu ra của mỗi tầng neuron trong Recurrent Neural Networks để đưa vào tính phi tuyến tính vào mạng và cho phép mạng học các mẫu phức tạp hơn trong dữ liệu. Nếu không có hàm kích hoạt, RNN sẽ chỉ thực hiện các phép biến đổi tuyến tính đơn giản trên dữ liệu đầu vào mà không thể giải quyết các bài toán phi tuyến tính phức tạp. Tính phi tuyến tính này đặc biệt quan trọng trong các lĩnh vực như xử lý ngôn ngữ tự nhiên (NLP), phân tích chuỗi thời gian và dự đoán dữ liệu tuần tự.
Hàm kích hoạt kiểm soát độ lớn của đầu ra của neuron, giữ giá trị trong một phạm vi cụ thể (ví dụ: giữa 0 và 1 hoặc -1 và 1). Việc giới hạn này giúp ngăn chặn hiện tượng giá trị trở nên quá lớn hoặc quá nhỏ trong quá trình lan truyền thuận và lan truyền ngược của mạng. Trong RNN, các hàm kích hoạt được áp dụng tại mỗi bước thời gian cho trạng thái ẩn, kiểm soát cách mạng cập nhật bộ nhớ nội bộ (trạng thái ẩn) dựa trên đầu vào hiện tại và các trạng thái ẩn trong quá khứ.
Các hàm kích hoạt phổ biến bao gồm:
- Sigmoid Function: Được sử dụng để diễn giải đầu ra dưới dạng xác suất hoặc để kiểm soát các cổng quyết định lượng thông tin cần giữ lại hoặc loại. Tuy nhiên, hàm Sigmoid dễ gặp phải Vanishing Gradient, làm cho nó kém lý tưởng hơn cho các Neural Network có cấu trúc sâu hơn.
- Hàm Tanh (Hyperbolic Tangent): Được ưa chuộng hơn Sigmoid Function vì tạo ra các giá trị tập trung quanh 0, giúp dòng gradient chảy tốt hơn và hỗ trợ việc học các phụ thuộc dài hạn
- ReLU (Rectified Linear Unit): Có thể gây ra vấn đề với exploding gradients do tính chất không bị giới hạn của nó. Tuy nhiên, các biến thể như Leaky ReLU và Parametric ReLU đã được sử dụng để giảm thiểu một số vấn đề này.

Các loại mạng thần kinh hồi quy (RNN)
Không giống với mạng Feedforward tạo ra mối quan hệ đầu vào – đầu ra một – một, các Recurrent Neural Networks (RNN) linh hoạt hơn về độ dài của đầu vào và đầu ra. Điều này giúp chúng phù hợp với nhiều ứng dụng khác nhau như tạo nhạc, phân tích cảm xúc và dịch thuật máy. Dưới đây là các biến thể phổ biến của RNN:
Standard Recurrent Neural Networks
Phiên bản cơ bản nhất của RNN, trong đó đầu ra tại mỗi bước thời gian phụ thuộc vào cả đầu vào hiện tại và trạng thái ẩn từ bước thời gian trước đó. Tuy nhiên, Standard Recurrent Neural Networks thường gặp phải Vanishing Gradients, khiến chúng khó học được các mối quan hệ dài hạn trong dữ liệu. Chúng hoạt động tốt nhất với các nhiệm vụ đơn giản có phụ thuộc ngắn hạn, như dự đoán từ tiếp theo trong câu ngắn hoặc giá trị tiếp theo trong chuỗi thời gian đơn giản.
RNN phù hợp cho các nhiệm vụ xử lý dữ liệu tuần tự theo thời gian thực, chẳng hạn như xử lý dữ liệu cảm biến để phát hiện các bất thường trong khung thời gian ngắn, trong đó đầu vào đến từng cái một và cần dự đoán ngay lập tức dựa trên thông tin gần đây.

Bidirectional Recurrent Neural Networks (BRNNs)
Trong khi RNN tiêu chuẩn chỉ có thể sử dụng thông tin từ quá khứ để dự đoán hiện tại, Bidirectional RNNs hoặc BRNNs, kéo vào dữ liệu tương lai để cải thiện độ chính xác của nó. Ví dụ, với cụm từ “feeling under the weather”, một mô hình BRNN có thể dự đoán tốt hơn rằng từ thứ hai là “under” nếu nó biết từ cuối cùng trong chuỗi là “weather”.

Long short-term memory (LSTM)
LSTM là một kiến trúc RNN phổ biến, được giới thiệu bởi Sepp Hochreiter và Juergen Schmidhuber như một giải pháp cho vấn đề về các phụ thuộc dài hạn (thông tin từ quá khứ xa ảnh hưởng đến dự đoán hiện tại) và vanishing gradient.
Ví dụ, với câu “Alice bị dị ứng với các loại hạt. Cô ấy không thể ăn bơ đậu phộng.” – thông tin về dị ứng hạt giúp dự đoán rằng thức ăn không thể ăn chứa hạt. Tuy nhiên, nếu thông tin này xuất hiện cách đó vài câu, Standard Recurrent Neural Networks sẽ khó kết nối được.
LSTM giải quyết vấn đề này bằng cách sử dụng các “tế bào” (cells) trong tầng ẩn với ba loại cổng: input gate, output gate và forget gate. Những cổng này kiểm soát luồng thông tin cần thiết để dự đoán đầu ra trong mạng. Ví dụ, nếu đại từ giới tính, chẳng hạn như “Cô ấy”, được lặp lại nhiều lần trong các câu trước đó, bạn có thể loại trừ điều đó khỏi trạng thái tế bào.

Gated recurrent units (GRUs)
Tương tự như LSTM, GRU cũng hướng đến giải quyết vấn đề bộ nhớ ngắn hạn của các mô hình RNN nhưng đơn gian hơn. Thay vì sử dụng “cell state” để điều chỉnh thông tin, nó sử dụng hidden states, và thay vì 3 cổng, nó có 2: reset gate và update gate. Tương tự như các cổng trong LSTM, các cổng reset và update kiểm soát lượng và loại thông tin nào để giữ lại.
Do kiến trúc đơn giản hơn, GRU hiệu quả hơn về mặt tính toán và yêu cầu ít tham số hơn so với LSTM. Điều này làm cho chúng có quá trình đào tạo ngắn hơn và thường phù hợp hơn cho một số ứng dụng thời gian thực hoặc bị hạn chế về tài nguyên.

Encoder-decoder RNNs
Encoder-decoder RNNs thường được sử dụng cho các nhiệm vụ sequence-to-sequence, chẳng hạn như dịch máy (Machine Translation). Phần mã hóa (encoder) xử lý chuỗi đầu vào thành một vector có độ dài cố định (gọi là ngữ cảnh), và phần giải mã (decoder) sử dụng ngữ cảnh đó để tạo ra chuỗi đầu ra. Tuy nhiên, vector ngữ cảnh cố định có thể trở thành điểm nghẽn, đặc biệt với các chuỗi đầu vào dài.

Hạn chế của Recurrent Neural Networks
Với sự xuất hiện của các Transformer Models như BERT và GPT, mức độ phổ biến của RNN đã giảm trong lĩnh vực trí tuệ nhân tạo hiện đại do điểm yếu đối với các vấn đề vanishing và exploding gradient. Các mô hình transformer có thể nắm bắt các mối quan hệ phụ thuộc khoảng cách xa một cách hiệu quả hơn nhiều, dễ dàng song song hóa trong quá trình huấn luyện, và thường cho kết quả vượt trội trong các nhiệm vụ như xử lý ngôn ngữ tự nhiên, nhận diện giọng nói và dự báo chuỗi thời gian.
Mặc dù vậy, RNN vẫn tiếp tục được sử dụng trong các tình huống nơi mà tính chất tuần tự tự nhiên và cơ chế bộ nhớ của chúng mang lại lợi thế. RNN đặc biệt hữu ích trong các môi trường nhỏ, bị hạn chế về tài nguyên hoặc cho các nhiệm vụ mà việc xử lý dữ liệu được hưởng lợi từ sự tái diễn từng bước. Trong những tình huống này, cấu trúc đơn giản và hiệu quả của RNN có thể là một lựa chọn tốt hơn so với các mô hình transformer phức tạp và nặng về tài nguyên.
Đối với những người muốn thử nghiệm với các trường hợp sử dụng như vậy, Keras là một thư viện mã nguồn mở phổ biến đã được tích hợp vào TensorFlow, cung cấp giao diện Python dễ sử dụng cho việc phát triển các mô hình RNN. API của Keras được thiết kế để dễ tiếp cận và linh hoạt, cho phép người dùng không chỉ sử dụng các lớp RNN có sẵn mà còn có thể định nghĩa các lớp cell RNN tùy chỉnh với hành vi riêng biệt theo nhu cầu.

Tóm lại, Recurrent Neural Network (RNN) là một công nghệ mạnh mẽ trong lĩnh vực học máy, đặc biệt hữu ích trong các nhiệm vụ xử lý dữ liệu tuần tự. Tuy sự xuất hiện của các mô hình transformer như BERT và GPT đang dần chiếm ưu thế trong một số bài toán nhưng RNN vẫn giữ được vị trí quan trọng trong các nhiệm vụ yêu cầu bộ nhớ và xử lý tuần tự.