Thông thường khi nói về Convolutional Neural Network (CNN) chúng ta thường liên tưởng đến lĩnh vực Xử lý hình ảnh (Computer vision) do những tiến bộ vượt bậc mà kỹ thuật CNN đem lại trong lĩnh vực này. Tuy nhiên, gần đây CNN cũng đang dần được nghiên cứu để áp dụng vào lĩnh vực Xử lý ngôn ngữ tự nhiên (NLP).

Mặc dù, với các bài toán NLP thì việc sử dụng RNN vẫn đem lại kết quả cao hơn so với các kỹ thuật khác nhưng điểm hạn chế lớn nhất của RNN là phải mất nhiều thời gian để huấn luyện mô hình (do phải huấn luyện từng từ một thay vì cả câu văn hay đoạn văn). Do đó, các nhà nghiên cứu hi vọng có thể sử dụng CNN để giảm thời gian huấn luyện mà vẫn đạt kết quả tương tự như RNN.

Trước hết chúng ta sẽ cùng tìm hiểu khái quát về CNN trong Computer vision rồi sau đó sẽ tìm hiểu việc áp dụng CNN trong NLP do việc giải thích kỹ thuật CNN trong Computer vision mang tính trực quan hơn.

1. Tổng quan về CNN

Tương tự như Feed Forward Neural Network thì CNN cũng là một mạng Neuron được hình thành từ nhiều Layers khác nhau. Tuy nhiên các Layers trong CNN được gọi là Convolutional layers vì nó sử dụng thuật toán Convolution thay vì Weighted sum như trong Feed Forward Neural Network. Ở đây, chúng ta có thể hiểu Convolution là việc sử dụng một Sliding window để tính toán giá trị output từ một Matrix đầu vào như mô tả trong hình duới đây [1].Trong hình trên, ta coi Matrix đầu vào là một ảnh đen trắng với 25 pixels. Mỗi một pixel có giá trị là 0 (đen) hoặc 1 (trắng). Tiếp theo, ta sử dụng Sliding window với kích thước 3×3 để tính output bằng cách nhân từng vùng của Matrix với Slice window rồi tính tổng của phép nhân đó. Ở đây, ta dịch chuyển Sliding window theo từng đơn vị một, tuy nhiên ta cũng có thể dịch chuyển 2 đơn vị (Stride = 2) hoặc 3 đơn vị (Stride = 3),… theo cả hai chiều ngang và dọc. Thông thường, trong CNN chúng ta gọi Sliding window là Kernel, Filter hoặc Feature Detector và kích thước của các Sliding window thường là 3×3, 5×5 hoặc 7×7. Mục đích của việc sử dụng Filter (Sliding window) là để phát hiện các patterns trong dữ liệu đầu vào như edge, objects, shape …. Ví dụ như hình dưới đây mô tả cách mà một Filter 3×3 có thể phát hiện Vertical Edge của một image [2].

Chúng ta thấy nửa bên trái của bức ảnh có màu trắng còn nửa bên phải có màu đen. Do đó Vertical edge chính là phần ở giữa, phân tách vùng màu trắng vời vùng màu đen. Filter ta sử dụng ở đây có kích cỡ 3×3 với giá trị 1 là màu trắng, 0 là màu xám còn -1 là màu đen. Khi đó, ở kết quả Output ta có thể phát hiện Vertical edge với màu trắng nổi lên giữa màu xám ở hai bên.

Tương tự như vậy, bằng cách sử dụng một Filter với một giá trị hợp lý, ta có thể phát hiện được một pattern nhất định trong dữ liệu đầu vào. Ở đây, giá trị của Filter được coi là các parameters và được học thông qua quá trình huấn luyện Model.

Tuy nhiên, trong thực tế, các hình ảnh thường có dạng 3-dimension (Height x Width x Chanel) thay vì 2-dimension (Height x Width) như ở trên. Do đó thì các Filter cũng phải ở dạng 3-dimension với số lượng Chanel bằng với số lượng Chanel của dữ liệu đầu vào. Khi đó, việc thực hiện Convolution cũng được tiến hành tương tự nhưng theo từng Chanel rồi sau đó ta cộng tổng kết quả của các Chanel lại với nhau.

Ngoài ra, ta cũng có thể sử dụng nhiều Filter để phát hiện các Patterns khác nhau. Ví dụ như Filter 1 để phát hiện Vertical edge còn Filter 2 để phát hiện Horizontal edge,.. Khi đó, ta cũng thu được kết quả ở dạng 3-dimension. Sau đó, ta thêm giá trị Bias vào kết quả đầu ra của mỗi Filter (mỗi một Filter có thể có giá trị bias khác nhau) rồi sử dụng một activation function để tính toán kết quả cuối cùng. Khi đó, kết quả này cũng chính là Output của một Convolutional Layer [3].

Thông thường, một Model sẽ có nhiều Convolutional Layers và mỗi Convolutional Layer lại có nhiệm vụ phát hiện một Pattern nhất định. Tuy nhiên, Layer sau thường được dùng để phát hiện Pattern ở mức độ cao hơn Layer trước. Ví dụ như Layer 1 để phát hiện các Edge trong một hình ảnh, Layer2 sử dụng các Edge này để phát hiện các Shape của Object và Layer 3 lại sử dụng các Shape này để phát hiện các bộ phận như mắt, mũi, miệng,..

Ngoài ra, chúng ta thường kết hợp các Convolutional Layers với Pooling Layers và Fully Connected Layers để tạo thành một Model với độ chính xác cao hơn. Ở đây, Pooling Layer được sử dụng để giảm kích thước ở từng Layer, từ đó tăng tốc độ xử lý và làm giảm thời gian huấn luyện. Ngoài ra, Pooling Layer còn giúp nâng cao hiệu quả của việc phát hiện các Pattern.

Thông thường, có hai dạng Pooling chính là Max Pooling và Average Pooling. Trong đó, Max Pooling chọn giá trị lớn nhất làm giá trị đầu ra còn Average Pooling thì chọn giá trị trung bình cộng. Trong hình dưới, ta sử dụng Filter với kích thước 2×2 và stride=2 để tính giá trị Pooling.

Như vậy, một Model sử dụng CNN thường có cấu trúc tổng quát như sau:

Lưu ý:

– Đối với Pooling layer, chúng ta chỉ có hyper-parameters do người dùng thiết lập lúc đầu là Filter size, Stride và Filter type (Max hoặc Avg Pooling) mà không có các parameters được học trong quá trình huấn luyện. Do đó, trong nhiều trường hợp chúng ta thường coi Convolutional Layer + Pooling layer là 1 Layer.

– Trước khi kết nối với Fully connected layer, chúng ta cần phải thực hiện Flatten để chuyển dữ liệu từ dạng 3-dimension thành 2-dimension.

– Khi xây dựng một CNN Model, chúng ta nên tham khảo các Model có sẵn để chọn các Hyper-parameters một cách hợp lý. Tuy nhiên, các Convolutional Layer ở Layer tiếp theo thường có giá trị Height và Width giảm dần còn giá trị Chanel thì tăng lên.

2) Áp dụng CNN trong NLP

Khi áp dụng CNN vào NLP, ta coi đoạn text là một 2-dimension matrix với rows là các tokens trong câu và giá trị của row chính là giá trị vector của từng token (xem thêm bài tutorial về Word Embedding). Như vậy kích thước của Input Matrix là: height= len(tokens), width=dimension(WordEmbedding). Khi thực hiện Convolution, chúng ta sử dụng Filter (cũng là 2-dimension matrix) với giá trị width bằng với giá trị width của Input Matrix và giá trị height thường là 3, 4 hoăc 5 (tương tự như 3-grams, 4-grams, 5-grams). Việc áp dụng CNN trong NLP có thể được mô tả như trong hình dưới đây [4].

Trong ví dụ trên, dữ liệu đầu vào là một câu văn gồm có 7 từ và mỗi từ được thể hiện dưới dạng vector có độ dài là 5 (input matrix: 7×5). Để thực hiện Convolution, ta sử dụng 6 filters, trong đó 2 filters đầu có kích thức là 4×5, 2 filters tiếp theo là 3×5 và 2 filters cuối cùng là 2×5. Như vậy Output của Convolutional Layer là 6 vectors với độ dài lần lượt là 4, 4, 5, 5, 6, 6. Tiếp theo, ta thực hiện Max Pooling để chọn giá trị lớn nhất của mỗi vector và kết hợp các giá trị này thành một vector cuối cùng có độ dài là 6. Sau đó, ta sử dụng Softmax activation function để tính kết quả Output.

Lưu ý: các bạn tham khảo phần thực hành trong bài tutorial Phân loại bài viết với CNN để hiểu rõ hơn về cách sử dụng CNN trong NLP

 

[1] http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

[2] https://www.coursera.org/lecture/convolutional-neural-networks/simple-convolutional-network-example-A9lXL

[3] https://indoml.com/2018/03/07/student-notes-convolutional-neural-networks-cnn-introduction/

[4] http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/

Tháng Ba 31, 2019
ITechSeeker