Lúc này, các mạng thần kinh nhân tạo được lấy cảm hứng từ bộ nào sinh họcđã chứng minh được sự hữu ích của mình khi đạt được những kết quả vượt trội, trong cácbài toán cốt lõi của khai p
Tổng quan về bài toán phân loại
Phân loại là một thuật toán dự đoán lớp của các đối tượng dữ liệu, với đầu ra là các giá trị rời rạc, được chia thành phân loại nhị phân (2 lớp) và phân loại nhiều lớp (từ 3 lớp trở lên) Đây là một thuật toán học có giám sát, sử dụng dữ liệu đã được gán nhãn để mô hình hóa mối quan hệ giữa các biến đầu vào và đầu ra Một ví dụ tiêu biểu là nhận dạng chữ số viết tay, trong đó đầu vào là hình ảnh và đầu ra là chữ số tương ứng Thuật toán phân loại rất quan trọng trong khai phá dữ liệu, giúp tự động phân loại dữ liệu lớn mà không cần lập trình cụ thể, từ đó nâng cao hiệu quả trích xuất thông tin Các thuật toán phân loại nổi bật bao gồm K-mean, Naive Bayesian Network, Support Vector Machines, Decision Tree và Neural Network, trong đó Neural Network thường được ưa chuộng nhờ độ chính xác cao hơn so với các thuật toán truyền thống.
Mạng thần kinh nhân tạo
Tổng quan về mạng thần kinh nhân tạo
Mạng thần kinh nhân tạo (ANN), hay còn gọi là mạng neural (NN), là hệ thống tính toán lấy cảm hứng từ cấu trúc của các mạng neuron trong não động vật Như hình 1.1 minh họa, một tế bào thần kinh sinh học có khả năng tiếp nhận nhiều tín hiệu đầu vào và tạo ra một tín hiệu đầu ra duy nhất.
Các neuron thần kinh nhân tạo cũng có cơ chế nhận và truyền thông tin tương tự như vậy, được thể hiện trong hình 1.2
Hình 1.2: Một neuron nhân tạo - hay một perceptron
Mạng nơ-ron nhân tạo (ANN) được xây dựng dựa trên cấu trúc của bộ não, bao gồm các đơn vị kết nối gọi là tế bào thần kinh nhân tạo hay perceptron, mô phỏng mạng lưới thần kinh trong não sinh học Mỗi kết nối, tương tự như khớp thần kinh trong não động vật, cho phép truyền tín hiệu giữa các tế bào thần kinh Tế bào thần kinh nhân tạo nhận tín hiệu, xử lý và phát tín hiệu cho các tế bào kết nối Tín hiệu đầu vào là số thực, và đầu ra được tính bằng hàm phi tuyến của tổng các đầu vào Các kết nối có trọng số để điều chỉnh cường độ tín hiệu, và trọng số này được điều chỉnh trong quá trình học Tế bào thần kinh có thể có ngưỡng, chỉ gửi tín hiệu khi tổng hợp vượt qua mức này Mạng nơ-ron nhân tạo có nhiều biến thể, bao gồm Multi-layer Perceptron và mạng nơ-ron tích chập (Convolutional).
Mạng Neural Tích Chập (CNN) thường được sử dụng cho dữ liệu hình ảnh, trong khi Mạng Neural Hồi Quy (RNN) phù hợp với dữ liệu chuỗi như văn bản, video và âm thanh.
Mạng Multi-layer Perceptron
Multi-layer Perceptron (MLP) là mô hình mạng nơ-ron bao gồm nhiều perceptron được tổ chức thành các lớp, với ít nhất ba loại lớp: lớp đầu vào, lớp ẩn và lớp đầu ra Mỗi neuron trong MLP, ngoại trừ các nút đầu vào, sử dụng hàm kích hoạt phi tuyến, cho phép MLP phân biệt các lớp dữ liệu không thể phân tách tuyến tính Kỹ thuật học tập có giám sát, được gọi là backpropagation, được sử dụng để đào tạo MLP, giúp nó trở thành một công cụ mạnh mẽ trong việc xử lý và phân tích dữ liệu phức tạp Hình 1.3 minh họa cấu trúc của một mạng MLP với một lớp đầu vào, một lớp đầu ra và nhiều lớp ẩn.
Hình 1.3: Một ví dụ về mạng Multi-layer Perceptron
Python hiện đang là ngôn ngữ phổ biến nhất trong lĩnh vực học máy và khai phá dữ liệu nhờ cú pháp đơn giản và nhiều framework hỗ trợ Tuy nhiên, C++ cũng có những ưu điểm nổi bật như tính năng nhập tĩnh, giúp giảm thiểu lỗi trong thời gian chạy, và khả năng tối ưu hóa mã nguồn cho hiệu suất tính toán cao hơn Trong báo cáo này, chúng tôi sẽ xây dựng mô hình mạng Multi-layer Perceptron (MLP) bằng C++ để giải quyết bài toán phân loại trên các bộ dữ liệu khác nhau Các phần tiếp theo sẽ trình bày chi tiết về lý thuyết mạng MLP và quá trình xây dựng mô hình cùng mã nguồn C++.
3, đồng thời cũng sử dụng các phương pháp định lượng để kiểm nghiệm lại các đoạn mã do nhóm lập trình trên dữ liệu trong chương 4.
Trong chương 2, báo cáo sẽ đi vào trình bày chi tiết cơ sở lý thuyết của mạng Multi- layer Perceptron (MLP) [10] qua các phần chính:
•Các ký hiệu và khái niệm
Các kí hiệu và khái niệm
Layer – Lớp
Mạng MLP (Multi-Layer Perceptron) bao gồm một lớp đầu vào, một lớp đầu ra và có thể có nhiều lớp ẩn ở giữa Các lớp ẩn được đánh số từ lớp đầu vào đến lớp đầu ra, lần lượt là lớp ẩn 1, lớp ẩn 2, và tiếp tục Số lượng lớp trong mạng MLP, ký hiệu là L, được tính bằng tổng số lớp ẩn cộng với một, không bao gồm lớp đầu vào Ví dụ trong hình 2.1 minh họa một mạng MLP với một lớp đầu vào, một lớp đầu ra và hai lớp ẩn.
Hình 1.2: Mạng perceptron với nhiều tầng với 2 hidden layer
Unit – Đơn vị
Trong hình 2.2, một node hình tròn màu cam trong một layer được gọi là unit, với các loại unit được phân loại theo layer: input unit ở input layer, hidden unit ở hidden layers, và output unit ở output layer Đầu vào của các hidden layer được ký hiệu là z, trong khi đầu ra của mỗi unit thường được ký hiệu là a, thể hiện giá trị activation sau khi áp dụng activation function Đầu ra của unit thứ i trong layer thứ z được ký hiệu là a^(l) Nếu số unit trong layer thứ l (không tính bias) là d(l), thì vector biểu diễn đầu ra của layer thứ l được ký hiệu là a^(l) ∈ R^d(l).
Hình 2.2: Các kí hiệu được sử dụng trong mạng Multi-layer Perceptron
Weights và Biases
Trong mạng MLP, các ký hiệu cho trọng số (weight) và độ thiên lệch (bias) được thể hiện như hình 2.2 Mỗi MLP có nhiều lớp (layers) và tương ứng với đó là các ma trận trọng số được ký hiệu là L.
W(l) ∈ R^(d(l−1)×d(l)) (với l = 1,2, ,L) thể hiện các kết nối từ lớp thứ (l−1) tới lớp thứ l (nếu coi lớp đầu vào là lớp thứ 0) Cụ thể, phần tử trong W(l) biểu thị kết nối từ nút thứ j của lớp (l−1) tới nút thứ k của lớp l Các bias của lớp thứ l được ký hiệu là b(l) ∈ R^(d(l)) Tập hợp các trọng số và bias lần lượt được ký hiệu là W(l) và b(l).
Activation Function - Hàm kích hoạt
Mỗi output của một layer (trừ input layer) sẽ được tính toán dựa vào công thức 2.1:
Hàm kích hoạt phi tuyến đóng vai trò quan trọng trong mạng nơ-ron, vì nếu một layer sử dụng hàm kích hoạt tuyến tính, nó có thể được rút gọn với layer tiếp theo thành một layer duy nhất Hàm kích hoạt thường được áp dụng theo từng phần tử của ma trận hoặc vector đầu vào, ngoại trừ hàm Softmax Trong báo cáo này, chúng tôi sẽ sử dụng hàm kích hoạt ReLU cho các hidden layers và hàm Softmax cho output layer.
Hình 2.3: Đồ thị hàm ReLU
ReLU (Rectified Linear Unit) là một hàm kích hoạt phổ biến trong nghiên cứu mạng thần kinh nhân tạo nhờ vào tính đơn giản và hiệu quả Đồ thị của hàm ReLU cho thấy rằng đạo hàm của nó bằng 0 tại các điểm âm và bằng 1 tại các điểm dương ReLU giúp tăng tốc độ huấn luyện cho các mạng nơ-ron đa lớp và mạng sâu so với các hàm kích hoạt khác như tanh và sigmoid Sự khác biệt rõ rệt về tốc độ hội tụ giữa ReLU và tanh được minh họa qua hình 2.4, cho thấy ReLU cho kết quả nhanh hơn nhiều lần Điều này có thể lý giải bởi việc tính toán ReLU gần như tức thời và gradient của nó cũng được tính toán nhanh chóng.
0 với các giá trị đầu vào âm, ReLU được chứng minh bằng thực nghiệm rằng có thể khắc phục việc này bằng cách tăng số hidden units
Hình 2.4: So sánh tốc độ hội tụ của ReLU và Tanh sau các Epoch
Để giải quyết các bài toán phân loại, cần một mô hình xác suất cho mỗi đầu vào x, với đầu ra là vector a R M, trong đó M là số lớp và α đại diện cho xác suất của input rơi vào lớp thứ i Các giá trị α phải dương và tổng của chúng phải bằng 1 Đồng thời, cần có mối quan hệ đồng biến giữa z và α, tức là nếu z càng lớn, xác suất để dữ liệu x thuộc lớp thứ i càng cao Hàm Softmax đáp ứng được các điều kiện này và đơn giản trong tính toán.
Lúc này, ta có thể coi xác suất để một điểm dữ liệu x rơi vào lớp thứ nếu biết tham sối mô hình là ma trận trọng số W bằng :
Loss Function - Hàm mất mát
Quan hệ giữa việc đánh giá mô hình và các trọng số của nó được thể hiện qua hàm mất mát, đo lường độ chênh lệch giữa đầu ra dự đoán và đầu ra thực tế Việc tối ưu hóa các trọng số của mạng nhằm giảm thiểu hàm mất mát cho thấy hiệu quả của quá trình huấn luyện Trong báo cáo này, chúng tôi chọn hàm mất mát cross-entropy vì nó có thời gian huấn luyện ngắn hơn và khả năng tổng quát hóa tốt hơn so với sai số tổng bình phương Đối với phân loại nhị phân, hàm mất mát cross-entropy được tính toán dựa trên hai lớp phân loại.
Khi số lớp C lớn hơn 2 (phân loại nhiều lớp), hàm cross-entropy được gọi là categorical cross-entropy Để tính toán độ mất mát, chúng ta sẽ xác định độ mất mát cho từng lớp riêng biệt và sau đó cộng tổng các kết quả lại với nhau.
Học trong MLP
Feedforward – Lan truyền thẳng
Quá trình lan truyền thẳng là bước tính toán output của mạng từ một input sample Trong giai đoạn này, sample đi qua input layer, trở thành input cho mạng, và đầu ra của các hidden layers được tính toán thông qua trọng số và các hàm kích hoạt cho đến khi đạt được output của hidden layer cuối cùng Vector output từ hidden layer cuối sẽ được truyền vào output layer, nơi nó được tính toán lại bằng hàm kích hoạt softmax để tạo ra output cuối cùng Cuối cùng, hàm mất mát sẽ được tính toán để chuẩn bị cho quá trình lan truyền ngược tiếp theo.
- Tính toán đầu ra cho hidden-layer: (2.7)
BackPropagation – Lan truyền ngược
Trong báo cáo này, chúng tôi áp dụng thuật toán gradient descent (GD), cụ thể là mini-batch gradient descent, để tối ưu hóa mạng MLP, vì đây là một trong những phương pháp phổ biến và đơn giản nhất Mini-batch có nghĩa là các trọng số và độ thiên lệch sẽ được cập nhật sau khi xử lý một tập hợp các điểm dữ liệu GD được sử dụng để tính gradient cho các ma trận trọng số và độ thiên lệch dựa trên một cặp điểm dữ liệu huấn luyện x, y, cho phép cập nhật trọng số sau mỗi cặp điểm dữ liệu Để thực hiện thuật toán GD, cần tính đạo hàm của hàm mất mát theo từng ma trận trọng số W (l) và vector bias b (l).
Giả sử J(W, b, X, Y) là hàm mất mát trong bài toán học máy, với W và b đại diện cho các ma trận trọng số và vector bias của các lớp X và Y là cặp dữ liệu huấn luyện, trong đó mỗi cột tương ứng với một điểm dữ liệu Để áp dụng các phương pháp gradient descent, việc tính toán giá trị của J là cần thiết.
Việc tính toán trực tiếp các giá trị đạo hàm trong mạng nơ-ron rất phức tạp do hàm mất mát không phụ thuộc trực tiếp vào các ma trận hệ số và vector bias Phương pháp phổ biến để giải quyết vấn đề này là backpropagation, cho phép tính đạo hàm ngược từ layer cuối cùng đến layer đầu tiên Layer cuối cùng được tính toán trước vì nó gần gũi với đầu ra dự đoán và hàm mất mát Đạo hàm của các ma trận hệ số trong các layer trước được tính dựa trên quy tắc chuỗi cho đạo hàm của hàm hợp.
Hình 2.5: Mô phỏng cách tính lan truyền ngược Đạo hàm của hàm mất mát theo một thành phần của ma trận trọng số của output-layer:
Trong đó thường là một đại lượng không khó để tính toán và vì Tương tự, đạo hàm của hàm mất mát theo bias của layer cuối cùng là:
Dựa vào hình 2.5, chúng ta có thể áp dụng quy nạp ngược để xác định công thức tính đạo hàm của hàm mất mát theo từng trọng số tại lớp thứ l Thuật toán lan truyền ngược sử dụng SGD được tóm tắt qua các bước sau đây.
1 Thực hiện bước feedforward: với một giá trị đầu vào x, tính giá trị đầu ra của mạng, lưu lại các giá trị activation trong quá trình tính toán
2 Với mỗi unit j ở output layer, tính:
4 Cập nhật đạo hàm cho từng hệ số:
LẬP TRÌNH VÀ MÃ NGUỒN
Trong chương 3, chúng tôi sẽ giới thiệu các kỹ thuật lập trình nâng cao để phát triển mạng thần kinh nhân tạo MLP bằng ngôn ngữ lập trình C++ Bên cạnh đó, chúng tôi cũng sẽ cung cấp mã nguồn cho các thành phần trong mạng, giúp người đọc hiểu rõ hơn về cấu trúc và cách hoạt động của nó.
Lập trình
Cấu trúc dự án xây dựng mô hình MLP sử dụng ngôn ngữ C++ bao gồm các phần chính như sau:
Data: folder lưu trữ dữ liệu
lib: folder chứa các module để xây dựng model
train.cpp: chương trình xây dựng và huấn luyện mô hình
Chương trình test.cpp được sử dụng để thử nghiệm và đánh giá mô hình, trong khi mã nguồn Python sử dụng framework Tensorflow 2.0 cùng với các thư viện hỗ trợ để đảm bảo tính linh hoạt trong quá trình xử lý và so sánh.
numpy: thư viện xử lý ma trận và mảng nhiều chiều.
matplotlib: thư viện hỗ trợ minh hoạ dữ liệu
keras: thư viện hỗ trợ xây dựng mô hình
Mã nguồn C++
Định nghĩa các hàm
Trong báo cáo này, chúng tôi sử dụng hai loại hàm kích hoạt: hàm ReLU cho đầu ra của các lớp ẩn và hàm Sigmoid cho đầu ra cuối cùng của mô hình Mỗi hàm này được xem như một lớp riêng biệt và có các hàm xử lý cơ bản riêng.
- Function – tính lan truyền thẳng
Mô hình MLP bao gồm ba loại lớp cơ bản: lớp đầu vào (input-layer), lớp ẩn (hidden-layer) và lớp đầu ra (output-layer) Mỗi lớp được xem như một thành phần riêng biệt và có các hàm cơ bản riêng.
- Lưu layer và file dữ liệu: SaveMode
Các hàm xử lý ma trận
- Matrix: hàm constructor để khởi tạo ma trận
- Toán tử *: nhân hai ma trận
- ElementWise: Nhân hai ma trận theo từng phần tử
Chúng em lập trình hàm mất mát categorical cross-entropy tổng quát cho cả trường hợp phân loại nhị phân và phân loại nhiều lớp.
- getLoss: tính loss cho mô hình trên một điểm dữ liệu
- getDerivative: tính đạo hàm của hàm categorical cross-entropy theo hàm softmax
Trong lớp Model chúng em lập trình các hàm xây dựng và xử lý mô hình như:
- AddRow: Thêm layer vào kiến trúc mô hình
- GetRow: Lấy 1 row trong 1 data
- Initialize: Khởi tạo weight và bias cho mô hình
- SaveMode: lưu checkpoint của mô hình
- LoadModel: load mô hình pretrained
- Feedforward: Hàm tính toán lan truyền thẳng
- Backpropagation: Hàm tính toán lan truyền ngược và cập nhật weight
- Eval: Hàm đánh giá độ chính xác của mô hình trên tập dữ liệu đầu vào
- Valid: tính độ mất mát của mô hình trên tập dữ liệu đầu vào
Mã nguồn Python
Essential libraries for building models in TensorFlow include importing Model, Sequential, and load_model from tensorflow.keras.models Additionally, Input and Dense layers are imported from tensorflow.keras.layers, while SGD is sourced from tensorflow.keras.optimizers For model management, ModelCheckpoint is imported from tensorflow.keras.callbacks.
To build a neural network model using Keras, start by initializing a Sequential model Add an input layer with the shape of your training data, followed by three Dense layers with 512, 128, and 32 neurons, each using the ReLU activation function The output layer should have 10 neurons with a softmax activation for multi-class classification Compile the model using categorical crossentropy as the loss function, SGD optimizer with a learning rate of 0.01, and accuracy as a metric Finally, train the model on your training data for 50 epochs with a batch size of 64.
# class_weight=class_weights, validation_data=(X_valid, y_valid), shuffle= True , callbacks=[ModelCheckpoint( 'check_points/digit.hdf5' , monitor='val_loss', save_best_only= True )])
Chương 4 sẽ tập trung vào việc kiểm nghiệm lại mô hình đã xây dựng bằng cách so sánh với mô hình lập trình sử dụng thư viện TensorFlow Chúng tôi sẽ phân tích và đánh giá các kết quả đạt được một cách chi tiết.
Bộ dữ liệu
Bộ dữ liệu Optical Recognition of Handwritten Digits (ORHD) chứa các ảnh bitmap kích thước 32 x 32 của chữ số viết tay, được thu thập từ 43 người Dữ liệu này được xử lý bằng các chương trình của NIST để tạo ra các ảnh chuẩn hóa ORHD có 10 nhãn phân biệt các chữ số từ 0 đến 9, và các thông số thống kê được trình bày trong bảng 4.1 Hình 4.1 minh họa một điểm dữ liệu trong bộ dữ liệu Để phù hợp với đầu vào của mạng MLP, chúng tôi sử dụng kỹ thuật flattering để chuyển đổi ảnh 2 chiều thành vector một chiều, giúp dễ dàng xử lý dữ liệu nhiều chiều.
32 x 32 trở thành vector có 1024 chiều.
Bảng 4.1: Thống kê bộ dữ liệu ORHD
Hình 4.1: Một ví dụ về ảnh 32 x 32 bit trong bộ dữ liệu ORHD
Kết quả kiểm nghiệm
Kết quả chính
Chúng tôi đã triển khai mô hình mạng MLP với ba lớp ẩn, trong đó số lượng đơn vị của mỗi lớp lần lượt là 512, 128 và 32 Các siêu tham số khác đã được tinh chỉnh thông qua phương pháp grid-search, như được trình bày trong bảng 4.2 Để thuận tiện cho việc trình bày, mô hình MLP được lập trình bằng ngôn ngữ C++ sẽ được gọi tắt là MLP C++, và tương tự cho mô hình MLP bằng Python.
Bảng 4.2: Các siêu tham số sử dụng trong mô hình MLP
Kết quả thu được như sau:
Phân tích kết quả và đánh giá
Mô hình MLP cho thấy độ nhạy cảm cao với dữ liệu đầu vào, điều này giải thích cho kết quả thu được trong nghiên cứu của chúng em.
Chúng em đã trực quan hóa và so sánh quá trình hội tụ hàm loss trên tập train của hai mô hình MLP C++ và MLP Python Kết quả cho thấy cả hai hàm loss đều giảm đều và tương tự nhau, chứng tỏ mô hình MLP C++ mà chúng em phát triển phù hợp với lý thuyết và tương đồng với mô hình sử dụng framework.
Hình 4.2: Sự hội tụ của hàm loss trên tập test qua mô hình MLP C++ và MLPPython
Hình 4.3: Sự hội tụ của hàm loss trên tập validation qua mô hình MLP C++ và MLP Python
Mô hình lập trình C++ cho các đồ thị tương tự như mô hình Python, nhưng sự hội tụ của hàm loss trong MLP C++ không ổn định bằng Nguyên nhân là do thuật toán tối ưu trong C++ chỉ mô phỏng đơn giản thuật toán Gradient Descent, trong khi Python, đặc biệt là trong framework Tensorflow 2.0, đã cải tiến thuật toán này với các phương pháp như decay và momentum Bên cạnh đó, các hàm tính toán trên ma trận trong Python cũng được tối ưu và ổn định hơn so với phiên bản C++ của chúng em.