Mạng nơ-ron tích chập (CNN)

Chín trên mười lần khi bạn nghe về việc thuật toán học sâu (deep learning) phá vỡ một rào cản công nghệ mới, thì đều dính dáng tới các Mạng Nơ-ron Tích chập (Convolutional Neural Networks). Còn được gọi là CNNs hay ConvNets, chúng là những hòn đá tảng trong lĩnh vực mạng nơ-ron học sâu. Chúng có thể học được cách phân loại các hình ảnh thậm chí còn tốt hơn con người trong một số trường hợp. Nếu có một phương pháp mà không nói quá lên tí nào, thì đó chính là CNNs.
Cái hay ở đây là nó rất dễ hiểu khi ta chia nó ra thành các thành phần cơ bản. Tôi sẽ hướng dẫn bạn qua về nó.

X và O

cnn1.png
Chúng ta sẽ dùng một ví dụ rất đơn giản: xác định xem hình ảnh là một X hay một O. Ví dụ này là đủ để minh họa các nguyên lý đằng sau CNNs, nhưng vẫn đủ đơn giản để tránh bị sa lầy vào các chi tiết không cần thiết. CNN của chúng ta có một công việc. Mỗi lần chúng ta đưa nó một bức hình, nó phải quyết định xem nó có một X hay một O. Giả sử rằng luôn có một hoặc là cái này hoặc là cái kia.
cnn2.png
Một cách tiếp cận ngây thơ để giải quyết vấn đề này là lưu một hình ảnh của một X và của một O, và so sánh mỗi hình ảnh mới với hai hình mẫu đó để xem nó khớp với bên nào hơn. Điều khiến cho công việc này khó khăn là do máy tính chỉ hiểu các con số. Với máy tính, một hình ảnh trông giống như một mảng hai chiều các điểm ảnh (tưởng tượng nó như một bàn cờ khổng lồ) với một số trong mỗi ô. Trong ví dụ của chúng ta một điểm ảnh có giá trị 1 là trắng, và -1 là đen. Khi so sánh hai hình ảnh, nếu có giá trị điểm ảnh không trùng, thì những ảnh đó đối với máy tính là không khớp. Lý tưởng nhất là chúng ta muốn xem liệu chúng thuộc X hay O ngay cả khi chúng bị tịnh tiến, bị co, xoay hoặc biến dạng. Đây là khi ta cần CNNs.

Feature (Đặc điểm)

cnn3.png
CNNs so sánh hình ảnh theo từng mảnh. Các mảnh mà nó tìm được gọi là các feature. Bằng cách tìm ở mức thô các feature khớp nhau ở cùng vị trí trong hai hình ảnh, CNNs nhìn ra sự tương đồng tốt hơn nhiều so với việc khớp toàn bộ bức ảnh.
cnn4.png
Mỗi feature giống như một hình ảnh mini - một mảng hai chiều nhỏ. Các feature khớp với các khía cạnh chung của các bức ảnh. Trong trường hợp các hình ảnh X, các feature bao gồm các đường chéo và hình chữ thập, sẽ nắm bắt tất cả những đặc điểm quan trọng của hầu hết các hình ảnh X. Những feature này có lẽ sẽ khớp với phần cánh và phần trung tâm của bất kỳ hình ảnh một X nào.

Tích chập (Convolution)

cnn5.png
Khi xem một hình ảnh mới, CNN không biết chính xác nơi các feature này sẽ khớp nên nó sẽ thử chúng khắp mọi nơi, ở mọi vị trí có thể. Khi tính toán sự khớp của một feature trên toàn bộ ảnh, chúng ta làm thành một filter (bộ lọc). Phần toán ta sử dụng để làm điều này được gọi là tích chập, từ đó mà Mạng Nơ-ron Tích chập (Convolutional Neural Networks) có tên là như vậy.
Toán tích chập này học sinh lớp sáu cũng có thể làm. Để tính toán sự khớp của một feature đối với một mảnh của hình ảnh, ta chỉ cần nhân mỗi điểm ảnh trong feature với giá trị của điểm ảnh tương ứng trong mảnh hình ảnh. Sau đó cộng tổng lại và chia cho số lượng điểm ảnh trong feature. Nếu cả hai điểm ảnh màu trắng (giá trị 1) thì 1 x 1 = 1. Nếu cả hai đều là màu đen, thì ( -1 ) x ( -1 ) = 1. Dù bằng cách nào, mỗi điểm ảnh mà khớp thì đều cho ra kết quả 1. Tương tự như vậy, bất kỳ cái nào không khớp đều ra -1. Nếu tất cả các điểm ảnh trong feature đều khớp, thì cộng tổng lại rồi chia cho số điểm ảnh thì sẽ ra là 1. Tương tự, nếu không có điểm ảnh nào trong feature khớp với mảnh hình ảnh, thì kết quả là -1.
cnn6.png
Để hoàn tất tích chập, chúng ta lặp lại quá trình này, xếp các feature với mọi mảnh hình ảnh có thể. Ta có thể lấy kết quả từ mỗi tích chập và tạo một mảng hai chiều mới từ đó, dựa vào vị trí của mỗi mảnh nằm trong hình ảnh. Bản đồ các phần khớp nhau này cũng là một phiên bản đã được lọc từ hình ảnh gốc. Nó là một bản đồ thể hiện nơi tìm thấy feature trong hình ảnh. Các giá trị gần 1 cho thấy sự khớp mạnh, các giá trị gần -1 cho thấy sự khớp mạnh với âm bản của feature, và các giá trị gần bằng 0 cho thấy không khớp với bất kỳ loại nào.
cnn7.png
Bước tiếp theo là lặp lại toàn bộ quá trình chập cho từng feature khác. Kết quả là một tập hợp các hình ảnh đã được lọc, mỗi cái ứng với mỗi filter của chúng ta. Sẽ thuận tiện khi nhìn toàn bộ các thao tác tích chập như là một bước xử lý duy nhất. Trong CNNs cái này được gọi là một layer (lớp) tích chập, cho thấy gián tiếp rằng sẽ sớm có các layer khác được thêm vào.
Dễ hiểu vì sao mà CNNs có cái tiếng là những con lợn tính toán. Mặc dù chúng ta có thể phác họa CNN trên mặt sau của một chiếc khăn ăn, số lượng phép tính cộng, nhân, chia có thể tăng lên nhanh chóng. Toán học mà nói, chúng sẽ scale (phình ra) một cách tuyến tính với số lượng điểm ảnh trong hình ảnh, với số lượng điểm ảnh trong mỗi feature và với số lượng các feature. Với rất nhiều yếu tố, thật dễ để làm cho bài toán này lớn lên nhiều triệu lần. Có thể hiểu vì sao mà các nhà sản xuất vi mạch đang làm các con chip chuyên dụng trong nỗ lực theo kịp với nhu cầu của CNNs.

Pooling (để chung)

cnn8.png
Một công cụ mạnh mẽ khác mà CNNs sử dụng được gọi là poolingPooling là một cách lấy những hình ảnh lớn và làm co chúng lại trong khi vẫn giữ các thông tin quan trọng nhất trong đó. Poolingchỉ dùng kiến thức toán của lớp hai. Nó bao gồm việc duyệt bước một ô vuông cửa sổ nhỏ dọc trên một hình ảnh và lấy giá trị lớn nhất từ cửa sổ ở mỗi bước. Trong thực tế, một cửa sổ có cạnh 2 hoặc 3 điểm ảnh và duyệt bước mỗi 2 điểm ảnh là được.
Sau khi pooling, một hình ảnh sẽ có khoảng một phần tư số điểm ảnh so với lúc bắt đầu. Vì nó giữ các giá trị lớn nhất từ mỗi cửa sổ, nó sẽ bảo toàn tính khớp của mỗi feature bên trong cửa sổ. Nghĩa là nó không quan tâm quá nhiều về vị trí chính xác nơi feature khớp, miễn là nó khớp ở chỗ nào đó trong cửa sổ. Kết quả là CNNs có thể tìm xem liệu một feature có nằm trong hình ảnh mà không cần lo nó nằm ở đâu. Điều này giúp giải quyết vấn đề của máy tính là quá trực nghĩa.
cnn9.png
Một layer pooling là hoạt động thực hiện pooling trên một hình ảnh hoặc một tập các hình ảnh. Đầu ra sẽ có cùng số lượng hình ảnh, nhưng mỗi cái sẽ có điểm ảnh ít hơn. Điều này cũng rất hữu ích trong việc quản lý tải trọng tính toán. Hạ một tấm ảnh 8 megapixel xuống còn 2 megapixel sẽ giúp mọi xử lý tải về trở nên dễ dàng.

Rectified Linear Units (tinh chỉnh các đơn vị tuyến tính)

cnn10.png
Đóng vai trò nhỏ nhưng quan trọng trong quá trình này là Rectified Linear Unit hoặc ReLU. Toán của cái này cũng rất đơn giản -- bất cứ nơi nào có số âm, hoán đổi nó với 0. Điều này giúp CNN giữ vững sự tin cậy toán học bằng cách giữ các giá trị đã được học khỏi bị mắc kẹt gần 0 hoặc bị thổi bay về vô tận. Đó là thứ dầu mỡ bôi trơn CNNs- không hấp dẫn mấy, nhưng nếu không có nó, chúng sẽ không đi xa hơn được.
cnn11.png
Đầu ra của một layer ReLU có kích thước giống với đầu vào, chỉ là tất cả các giá trị âm được loại bỏ.

Học sâu (Deep learning)

cnn12.png
Bạn có thể thấy rằng các đầu vào cho mỗi layer (mảng hai chiều) trông rất giống đầu ra (cũng mảng hai chiều). Vì vậy, chúng ta có thể xếp chồng chúng như những mẩu Lego. Những hình ảnh gốc được filtered (lọc), rectified (tinh chỉnh) và pooled (gộp lại) để tạo ra một tập các hình ảnh đã được lọc và thu gọn. Chúng có thể được lọc và thu gọn lại liên tục. Mỗi lần như vậy, các feature trở nên lớn hơn và phức tạp hơn, và hình ảnh trở nên nhỏ gọn hơn. Điều này giúp các layer thấp hơn đại diện cho các khía cạnh đơn giản của hình ảnh, chẳng hạn như các cạnh và các điểm sáng. Các layer cao hơn có thể đại diện cho các khía cạnh tinh vi hơn của hình ảnh, chẳng hạn như các hình khối (shape) và các hình mẫu (pattern). Dễ thấy được điều này. Ví dụ, trong một CNN được đào tạo nhận diện mặt người, các lớp cao nhất đại diện cho các mẫu giống khuôn mặt người rất rõ ràng.
cnn18.png

Các layer được kết nối đầy đủ (Fully connected layers)

cnn13.png
Các CNN còn có một thứ vũ khí nữa. Các layer được kết nối đầy đủ lấy các hình ảnh đã lọc ở cấp cao và chuyển chúng thành các phiếu bầu (vote). Trường hợp của chúng ta, chỉ phải quyết định giữa hai loại, X và O. Các layer được kết nối đầy đủ là một khối chính của mạng nơ-ron truyền thống. Thay vì coi đầu vào như một mảng hai chiều, chúng được coi như một list đơn và tất cả đều được xử lý giống nhau. Mỗi giá trị bỏ phiếu riêng bầu cho hình ảnh hiện tại là X hay O. Tuy nhiên, quá trình này không hoàn toàn dân chủ. Một số giá trị cho biết hình ảnh là một X tốt hơn nhiều so với những giá trị khác, và một số lại đặc biệt tốt khi cho biết hình ảnh là một O. Chúng có giá trị bỏ phiếu lớn hơn so với những cái khác. Chúng được thể hiện như trọng số (weight), hoặc là mức độ kết nối, giữa mỗi giá trị (trong list) và mỗi loại (X hay O).
Khi một hình ảnh mới được đưa vào CNN, nó sẽ thấm qua các lớp thấp hơn cho đến khi cuối cùng nó đạt đến các layer được kết nối đầy đủ. Sau đó, một cuộc bầu chọn được tổ chức. Câu trả lời có nhiều phiếu nhất sẽ thắng và được tuyên bố là thuộc loại nào (X hay O).
cnn14.png
Các layer được kết nối đầy đủ, giống như các layer khác, có thể được xếp chồng lên nhau vì đầu ra của chúng (một list các vote) trông giống với đầu vào (một list các giá trị). Trong thực tế, một vài các layer được kết nối đầy đủ thường được xếp chồng lên cùng với nhau, với mỗi layer trung gian bỏ phiếu cho các loại "ẩn". Mỗi layer bổ sung sẽ cho phép mạng học các tổ hợp tinh vi hơn của các feature và sẽ giúp nó đưa ra quyết định tốt hơn.

Lan truyền ngược (Backpropagation)

cnn15.png
Câu chuyện của chúng ta đang được lấp đầy, nhưng nó vẫn có một lỗ hổng lớn - Các feature đến từ đâu? và Làm thế nào để tìm trọng số trong các layer được kết nối đầy đủ? Nếu chúng phải chọn bằng tay, CNN hẳn sẽ kém phổ biến hơn giờ. May mắn thay, một chút ma thuật của học máy(machine learning) gọi là lan truyền ngược (backpropagation) làm việc này giúp chúng ta.
Để sử dụng lan truyền ngược, chúng ta cần một tập các hình ảnh mà chúng ta đã biết câu trả lời. Điều này có nghĩa rằng một số thanh niên kiên nhẫn sẽ lật qua hàng ngàn hình ảnh và gán cho chúng một nhãn X hoặc O. Chúng ta sử dụng chúng với một CNN chưa được huấn luyện, nghĩa là mỗi điểm ảnh của mỗi feature và mỗi trọng số trong mỗi các layer được kết nối đầy đủ được đặt một giá trị ngẫu nhiên. Sau đó ta bắt đầu đưa các hình ảnh đi qua nó, từng cái một.
Mỗi hình ảnh CNN xử lý cho kết quả là một phiếu bầu (vote). Số lượng nhầm lẫn trong phiếu bầu, gọi là sai số (error), cho ta biết mức độ tốt của các feature và trọng số chúng ta đang có. Các feature và trọng số sau đó có thể được điều chỉnh để làm cho các sai số ít hơn. Mỗi giá trị được điều chỉnh cao hơn một chút và thấp hơn một chút, và tính toán các sai số mới mỗi lần. Điều chỉnh nào làm cho các sai số ít đi sẽ được giữ lại. Sau khi làm điều này cho mỗi điểm ảnh featuretrong mỗi layer tích chập và mỗi trọng số trong mỗi các layer được kết nối đầy đủ, các trọng số mới sẽ đưa ra câu trả lời tốt hơn một chút cho hình ảnh đó. Điều này sau đó được lặp đi lặp lại với mỗi hình ảnh tiếp theo trong tập các hình ảnh đã được gắn nhãn. Các khuyết tật xảy ra trong một hình ảnh nhanh chóng bị lãng quên, nhưng hình mẫu (pattern) xuất hiện trong rất nhiều hình ảnh được chế biến thành các feature và các trọng số kết nối. Nếu bạn có đủ các hình ảnh đã được gắn nhãn, chúng sẽ hình thành một tập ổn định hoạt động khá tốt trên một loạt các trường hợp.
Có lẽ là rõ ràng, lan truyền ngược lại là một bước tính toán đắt đỏ nữa, và sẽ lại là một động lực để phát triển phần cứng tính toán chuyên dụng.

Siêu tham số (Hyperparameters)

Thật không may, không phải mọi khía cạnh của các CNN có thể học được một cách đơn giản. Hiện vẫn còn một danh sách dài các quyết định mà một nhà thiết kế CNN phải làm.
  • Đối với mỗi layer tích chập, bao nhiêu feature? bao nhiêu điểm ảnh trong mỗi feature?
  • Đối với mỗi layer pooling, kích cỡ ô vuông cửa sổ như thế nào? duyệt mỗi bước bao nhiêu?
  • Đối với mỗi các layer được kết nối đầy đủ thêm vào, bao nhiêu nơron ẩn?
Ngoài ra còn có những quyết định về kiến trúc ở cấp cao hơn cần thực hiện: Số lượng mỗi layerthêm vào là bao nhiêu? Theo thứ tự nào? Một số mạng nơron học sâu có thể có hơn một ngàn layer, mở ra rất nhiều khả năng.
Với rất nhiều tổ hợp và hoán vị, chỉ một phần nhỏ các cấu hình có thể của CNN đã được thử nghiệm. Các thiết kế CNN có xu hướng được dẫn dắt bởi kiến thức tích lũy từ cộng đồng, thỉnh thoảng các biến thể lại cho thấy những bước nhảy đáng ngạc nhiên về hiệu năng. Và trong khi chúng ta bàn về các khối xây dựng nên một CNN thuần, thì có rất nhiều cách tinh chỉnh khác đã được thử và cho thấy hiệu quả, chẳng hạn như các loại layer mới và những cách phức tạp hơn để kết nối các layer với nhau.

Ngoài các hình ảnh

cnn16.png
Trong khi ví dụ X và O liên quan đến hình ảnh, các CNN còn có thể được sử dụng để phân loại các loại dữ liệu khác. Bí quyết là, bất cứ loại dữ liệu nào, hãy biến đổi để làm cho nó trông giống như một hình ảnh. Ví dụ, các tín hiệu âm thanh có thể được cắt nhỏ thành các khối thời gian ngắn, và sau đó mỗi đoạn chia thành âm trầm, âm trung, âm cao, hoặc dải tần số tốt hơn. Cái này có thể được biểu diễn như là một mảng hai chiều trong đó mỗi cột là một đoạn thời gian và mỗi hàng là một băng tần. "Các điểm ảnh" trong hình ảnh giả này mà ở gần nhau có liên quan chặt chẽ. Các CNN hoạt động tốt với cái này. Các nhà nghiên cứu khá sáng tạo. Họ đã dùng dữ liệu văn bản để xử lý ngôn ngữ tự nhiên và ngay cả dữ liệu hóa chất để phát hiện ma túy.
cnn17.png
Một ví dụ về dữ liệu không phù hợp với định dạng này là dữ liệu khách hàng, trong đó mỗi hàng trong một bảng đại diện cho một khách hàng, và mỗi cột thể hiện các thông tin về họ, chẳng hạn như tên, địa chỉ, email, lịch sử duyệt và mua hàng. Trong trường hợp này, vị trí của các hàng và cột không thực sự quan trọng. Hàng có thể được sắp xếp lại và cột có thể được xếp đặt lại mà không bị mất bất kỳ tính hữu dụng của dữ liệu. Ngược lại, sắp xếp lại các hàng và cột của một hình ảnh làm cho nó hầu như vô dụng.
Một nguyên tắc: Nếu dữ liệu của bạn vẫn hữu ích sau khi tráo các cột với nhau, thì bạn không nên sử dụng Mạng nơ-ron tích chập.
Tuy nhiên nếu bạn có thể làm cho vấn đề của bạn giống như bài toán tìm kiếm các hình mẫu trong ảnh, thì các CNN có lẽ là chính xác những gì bạn cần.

Tham khảo

(Sưu tầm)

Nhận xét

Bài đăng phổ biến từ blog này

Cách Paraphrase trong IELTS Writing Task 2

Giới thiệu giải thuật SIFT để nhận dạng ảnh