Trong mô hình mạng Neuron thông thường (Feed forward network), chúng ta coi input data là các dữ liệu độc lập, không có mối liên hệ với nhau. Tuy nhiên, trong ngôn ngữ tự nhiên thì mối liên hệ giữa các từ và ngữ cảnh đóng một vai trò quan trọng, quyết định ý nghĩa của câu văn. Do đó việc áp dụng môt hình mạng Neuron thông thường vào các bài toán NLP thường không đạt kết quả mong muốn.

Để khắc phục nhược điểm này, chúng ta sử dụng mô hình RNN (Recurrent Neural Network). RNN coi dữ liệu đầu vào là một chuỗi (sequence) liên tục, nối tiếp nhau theo thứ tự thời gian. Ví dụ như một đoạn text có thể được coi là một chuỗi các từ vựng(words) hoặc là một chuỗi các ký tự (character). Tại thời điểm t, với dữ liệu đầu vào xt ta có kết quả output là yt. Tuy nhiên, khác với mạng Feed forward network, yt lại được sử dụng là input để tính kết quả output cho thời điểm (t+1). Điều này cho phép RNN có thể lưu trữ và truyền thông tin đến thời điểm tiếp theo. Mô hình hoạt động của RNN có thể được mô tả trong hình dưới đây (thông thường hàm activation function gh được sử dụng là tanh còn gy có thể là sigmoid hoặc softmax function tùy thuộc vào từng bài toán cụ thể).

Hình 1: Mạng Recurrent Neural Network

Để dễ hình dung hơn về RNN, chúng ta có thể chuyển mô hình RNN thành dạng phẳng với xt, xt+1, xt+2 là dữ liệu đầu vào tại thời điểm t, t+1 và t+2 như sau (ở đây t, t+1, t+2,.. được gọi là các timesteps):

Hình 2: Unfolding Recurrent Neural Network

Lưu ý: Trong mạng Feed forward network, kết quả output của một Layer cũng trở thành input để tính toán kết quả cho Layer tiếp theo. Tuy nhiên điểm khác nhau cơ bản giữa RNN và Feed forward network là:

– Feed forward network sử dụng giá trị weights matrix khác nhau tại từng Layer. Ví dụ như hình dưới đây, output của Layer1 được nhân với W1 còn output của Layer2 được nhân với W2

Hình 3: Feed forward network

– RNN chỉ sử dụng một mạng Neural duy nhất (thường là 1 layer) để tính giá trị output của từng timestep. Do đó các outputs khi trở thành input sẽ được nhân với cùng một weights matrix (ở đây là WR như trong Hình 2). Đây cũng chính là lý do tại sao có từ Recurrent trong tên của RNN. Recurrent có nghĩa là mô hình sẽ thực hiện các phép tính toán giống hệt nhau cho từng phần tử của chuỗi dữ liệu đầu vào và kết quả output sẽ phụ thuộc vào kết quả của các tính toán ở phần trước.

Như vậy, chúng ta có thể hiểu một cách đơn giản rằng RNN là một mô hình mạng Neuron có ‘memory’ để lưu trữ thông tin của phần xử lý trước đó. Về mặt lý thuyết thì RNN có thể xử lý và lưu trữ thông tin của một chuỗi dữ liệu với độ dài bất kỳ. Tuy nhiên trong thực tế thì RNN chỉ tỏ ra hiệu quả với chuỗi dữ liệu có độ dài không quá lớn (short-term memory hay còn gọi là long-term dependency problem). Nguyên nhân của vấn đề này là do vanishing gradient problem (gradient được sử dụng để cập nhật giá trị của weight matrix trong RNN và nó có giá trị nhỏ dần theo từng layer khi thực hiện back propagation). Khi gradient trở nên rất nhỏ (có giá trị gần bằng 0) thì giá trị của weight matrix sẽ không được cập nhật thêm và do đó mạng Neuron sẽ dừng việc learning tại layer này. Đây cũng chính là lý do khiến cho RNN không thể lưu trữ thông tin của các timesteps đầu tiên trong một chuỗi dữ liệu có độ dài lớn.

Tháng Ba 26, 2019
ITechSeeker