# Báo cáo về Thuật toán Backpropagation
- Tác giả:
- Phù Phương Tuấn
- Nguyễn Việt Tùng
- Trần Thái Vỹ
- Dương Ngọc Thịnh
- Hồ Thị Hồng Lạc
- Trường THPT chuyên Trần Đại Nghĩa - 12CTin
Mục lục
=================
* 1 [Sơ lược về Artificial Neural Network](#1-Sơ-lược-về-Artificial-Neural-Network)
* 1.1 [Giới thiệu](#11-Giới-thiệu)
* 1.2 [Layout của ANN](#12-Layout-của-ANN)
* 2 [Cách hoạt động của ANN](#2-Cách-hoạt-động-của-ANN)
* 2.1 [Khái niệm](#21-Khái-niệm)
* 2.2 [Forward Propagation](#22-Forward-Propagation)
* 2.3 [Back Propagation](#23-Back-Propagation)
* 3 [Chạy code](#3-Chạy-code)
* 3.1 [Vấn đề](#31-Vấn-đề)
* 3.2 [Code thuật toán quan trọng của ANN](#31-Code-thuật-toán-quan-trọng-của-ANN)
* 3.3 [Kết quả](##32-Kết-quả)
## 1. Sơ lược về Artificial Neural Network:
### 1.1. Giới thiệu
#### **Bố cục mạng neuron nhân tạo (ANN): Tổng quan toàn diện**
Mạng neuron nhân tạo (ANN) là một mô hình tính toán mạnh mẽ được lấy cảm hứng từ cấu trúc và chức năng của bộ não người. Nó bao gồm các đơn vị xử lý (neuron) được kết nối với nhau theo từng lớp, mô phỏng cấu trúc thần kinh sinh học. Sự sắp xếp cụ thể của các lớp này, được gọi là bố cục ANN hoặc kiến trúc ANN, đóng vai trò quan trọng trong việc xác định khả năng và hiệu suất của mạng.
### 1.2. Layout của ANN
#### **Các thành phần chính của bố cục ANN:**
***Lớp đầu vào (Input Layer)***: Lớp ban đầu nhận dữ liệu đầu vào từ môi trường bên ngoài. Số lượng neuron trong lớp đầu vào thường khớp với số lượng đặc trưng trong tập dữ liệu.
***Các lớp ẩn (Hidden Layers)***: Các lớp này chịu trách nhiệm biến đổi và trích xuất các mẫu phức tạp từ dữ liệu đầu vào. Chúng là cốt lõi của khả năng học hỏi và biểu diễn của mạng.
Số lượng lớp ẩn và số lượng neuron trong mỗi lớp ẩn là những lựa chọn thiết kế quan trọng ảnh hưởng đáng kể đến khả năng học các mối quan hệ phức tạp của mạng và tránh tình trạng quá khớp (overfitting) hoặc thiếu khớp (underfitting).
***Lớp đầu ra (Output Layer)***: Lớp cuối cùng tạo ra các dự đoán hoặc đầu ra của mạng. Số lượng neuron trong lớp đầu ra phụ thuộc vào bản chất của tác vụ dự đoán:
Đối với các vấn đề hồi quy, nó thường có một neuron để tạo ra giá trị đầu ra liên tục.
Đối với các vấn đề phân loại, nó thường có nhiều neuron, mỗi neuron đại diện cho một lớp riêng biệt.
***Weights (trọng số):*** Biểu diễn mức độ ảnh hưởng của đầu ra từ một neuron đến đầu vào của neuron khác trong cùng một lớp hoặc lớp tiếp theo.
***Biases (ngưỡng kích hoạt):*** Là giá trị hằng số được thêm vào đầu vào tổng của một neuron trước khi được đưa qua hàm kích hoạt.

#### **Các yếu tố ảnh hưởng đến thiết kế bố cục:**
***Loại vấn đề:*** Bản chất của nhiệm vụ (regression, classification, v.v.) và mức độ phức tạp của các mối quan hệ cần học ảnh hưởng đến số lượng lớp ẩn và neuron.
***Đặc điểm dữ liệu:*** Kích thước, chiều, và mức độ nhiễu của tập dữ liệu có thể ảnh hưởng đến dung lượng và khả năng tổng quát hóa của mạng.
***Nguồn lực tính toán:*** Quá trình huấn luyện có thể đòi hỏi tính toán cao, đặc biệt đối với các mạng lớn hơn. Thời gian huấn luyện và hạn chế về phần cứng cần được cân nhắc.
## 2. Cách hoạt động của ANN
### 2.1. Khái niệm
Quá trình này bao gồm hai giai đoạn chính: lan truyền thuận (forward propagation) dữ liệu input qua mạng neuron để tạo kết quả dự đoán và lan truyền ngược (back propagation) lỗi kết quả dự đoán để điều chỉnh trọng số của mạng neuron.
Backpropagation là một thuật toán hiệu quả được sử dụng để huấn luyện các mạng neuron nhiều lớp (Multi-layer Perceptron - MLP) trong lĩnh vực Machine Learning. Thuật toán này tính toán gradient (độ dốc) của hàm mất mát (***loss function***) theo từng tham số (***weight và bias***) của mạng, cho phép cập nhật các tham số theo hướng giảm thiểu ***loss function***.
Trong phần này ta sẽ chú trọng chủ yếu vào **cốt lõi cách hoạt động** của ANN và thuật toán backpropagation, sử dụng **Logistic Regression.**
### 2.2. Forward Propagation
**Forward propagation**, còn được gọi là **lan truyền tiến**, là quá trình **tính toán giá trị đầu ra** của một mạng neuron từ đầu vào. Đây là một phần quan trọng của quá trình học của mạng neuron. Nó không chỉ cho phép mạng tạo ra dự đoán từ đầu vào, mà còn **tạo ra dữ liệu cần thiết cho quá trình lan truyền ngược** ***(backpropagation)***, quá trình mà mạng sử dụng để học từ dữ liệu.
#### **a) Cơ chế hoạt động**
* **Đầu vào**: Quá trình bắt đầu bằng việc cung cấp một vector đầu vào cho mạng. Vector này thường được biểu diễn dưới dạng một ma trận, với mỗi hàng tương ứng với một mẫu đầu vào và mỗi cột tương ứng với một đặc trưng.
* **Tính toán tại các neuron**: Đầu vào được đưa qua mạng, từ lớp đầu vào đến lớp đầu ra. Tại mỗi neuron, một tổng có trọng số của các đầu vào được tính, sau đó một hàm kích hoạt ***(***activation function***)*** được áp dụng để tạo ra đầu ra của neuron đó.
* **Đầu ra**: Kết quả cuối cùng của quá trình ***forward propagation*** là một vector đầu ra, thường được sử dụng như là dự đoán của mạng cho mẫu đầu vào đó.
#### **b) Công thức toán học**
Giả sử ta có một mạng neuron, với $n$ là số input. Ta có thể biểu diễn quá trình ***forward propagation*** bằng các công thức sau:
Tính tổng có trọng số tại mỗi neuron: $z = \sum_{i=1}^{n} w_i x_i + b$
Áp dụng hàm kích hoạt: $a=f(z)$
**Trong đó:**
* $w$ và $b$ là trọng số và bias của lớp.
* $a$ là đầu ra lớp (đầu vào của lớp sau).
* $f(z)$ là hàm kích hoạt giá trị $z$ của lớp.
> Định nghĩa **Activation Function:** là một hàm toán học được áp dụng cho đầu vào của neuron, **biến đổi đầu vào thành đầu ra có thể được sử dụng làm đầu vào cho lớp tiếp theo trong mạng.** Về cơ bản, nó quyết định sự kích hoạt của một neuron, giúp mạng tìm hiểu các mẫu phức tạp trong dữ liệu.
#### **Một số hàm kích hoạt (activation function) thông dụng:**
1. **Hàm Sigmoid**: Hàm Sigmoid được sử dụng rộng rãi trong các mô hình học máy và học sâu. Hàm này chuyển đổi một số thực thành một giá trị trong khoảng từ 0 đến 1, điều này rất hữu ích khi ta muốn biểu diễn xác suất. Công thức của hàm Sigmoid ($σ$) là:
**$$σ(x)=\frac{1}{1+e^{−x}}$$**

2. **Hàm Tanh**: Hàm Tanh cũng tương tự như hàm Sigmoid nhưng giá trị của nó nằm trong khoảng từ -1 đến 1. Điều này có nghĩa là đầu ra sẽ được chuẩn hóa về 0. Công thức của hàm Tanh là:
**$$tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}$$**

3. **Hàm ReLU (Rectified Linear Unit)**: Hàm ReLU là hàm kích hoạt phổ biến nhất được sử dụng trong các mô hình học sâu hiện nay. Hàm này sẽ trả về 0 nếu đầu vào là số âm, và trả về chính giá trị đầu vào nếu nó là số dương. Công thức của hàm ReLU là:
**$$ReLU(x)=max(0,x)$$**

### 2.3. Back Propagation
Thuật toán Back Propagation được sử dụng để liên tục điều chỉnh các giá trị của hệ số weight ($w$) và bias ($b$) của các kết nối trong mạng neuron để giảm thiểu sự khác biệt giữa kết quả đầu ra thực tế của mạng neuron và kết quả đầu ra mong muốn.
Nói cách khác, mục đích của thuật toán là để **giảm thiểu loss function bằng cách điều chỉnh các hệ số $W$ và $b$**. Đó là cốt lõi của việc Machine Learning. Mức độ điều chỉnh được xác định bởi **độ dốc của hàm chi phí đối với các tham số đó**.
Nhưng tại sao lại cần tính toán độ dốc của hàm chi phí (hàm $C$)?
* Độ dốc của hàm $C$ tại một điểm $x$ là vectơ của đạo hàm riêng của $C$ tại $x$.
* Đạo hàm của hàm $C$ cho biết **độ nhạy cảm** đối với sự thay đổi của giá trị hàm đối với sự thay đổi của giá trị $x$ của nó.
Nói cách khác, đạo hàm cho chúng ta biết hướng tăng/giảm của hàm $C$.
* Độ dốc của hàm cho biết tham số $x$ **cần thay đổi bao nhiêu** để giảm thiểu hàm $C$.
#### Để tính toán độ dốc đó ta sử dụng một phương pháp gọi là ***chain rule***.
### 2.3.1. Các công thức **chain rule** được áp dụng:
#### 1. Độ nhạy cảm đối với sự thay đổi giá trị $w$ đối với hàm $C$:
$$
\frac{\partial C}{\partial w} = \frac{\partial C}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial w}
$$
Với:
* $\frac{\partial C}{\partial a}$ là đạo hàm của hàm loss đối với hàm activation.
* $\frac{\partial a}{\partial z}$ là đạo hàm của hàm activation đối với giá trị của trọng số $z$.
* $\frac{\partial z}{\partial w}$ là đạo hàm của trọng số $z$ theo $w$, theo công thức $z = w \cdot x + b$ thì đạo hàm bằng $x$.
Giả sử cho hàm activation là hàm sigmoid ($a=\sigma(z) = \frac{1}{1 + e^{-z}}$)
$$\frac{\partial C}{\partial a} = (\frac12(a - y)^2)' = a - y$$
$$\frac{\partial a}{\partial z} = \sigma'(z) = \sigma(z) \cdot (1 - \sigma(z))$$
Kết hợp lại ta có công thức sau:
$$\frac{\partial C}{\partial w} = (a - y) \cdot (\sigma(z) \cdot (1 - \sigma(z))) \cdot x$$
#### 2. Tương tự với độ nhạy cảm đối với sự thay đổi giá trị $b$ đối với hàm $C$:
$$
\frac{\partial C}{\partial b} = \frac{\partial C}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial b}
$$
Với:
* $\frac{\partial C}{\partial a}$ vẫn như trước.
* $\frac{\partial a}{\partial z}$ vẫn như trước.
* $\frac{\partial z}{\partial b} = 1$ theo công thức $z = w \cdot x + b$ và đạo hàm của $z$ với $b$ $= 1$.
Kết hợp lại ta có công thức sau:
$$\frac{\partial C}{\partial b} = (a - y) \cdot (\sigma(z) \cdot (1 - \sigma(z))) \cdot 1$$
### 2.3.2 Cập nhật Weights and Biases
Khi độ dốc được tính toán, giá trị của $w$ và $b$ sẽ được cập nhật **theo hướng ngược lại với độ dốc** để giảm thiểu ***loss function***.
Công thức cập nhật giá trị $w$:
$$w = w - \eta \frac{\partial C}{\partial w}$$
Công thức cập nhật giá trị $b$:
$$b = b - \eta \frac{\partial C}{\partial b}$$
Trong đó $\eta$ là learning rate, một đại lượng vô hướng dương nhỏ xác định kích thước của bước cập nhật.
Và đấy là toàn bộ quá trình **learning của ANN** trong một epoch. Từ đấy ANN sẽ quay ngược trở lại ban đầu, lặp lại quá trình trong nhiều epochs trên tập dữ liệu huấn luyện, dần dần cải thiện $w$ và $b$ để giảm thiểu *****loss function*****.
#### **Những lưu ý cần thiết:**
* <u>**Underfitting:**</u> Nếu mạng neuron được huấn luyện với số lượng epochs nhỏ, mạng có thể không tìm hiểu đầy đủ quy luật cơ bản trong dữ liệu huấn luyện, dẫn đến hiệu suất kém trên cả dữ liệu huấn luyện và dữ liệu test, dẫn đến bị ***underfitting***. Mô hình không nắm bắt được độ phức tạp của dữ liệu và do đó dự đoán với hiệu suất thấp.
* <u>**Overfitting:**</u> Việc huấn luyện mạng neuron với số lượng epochs quá nhiều có thể dẫn đến tình trạng ***overfitting***, trong đó mô hình học dữ liệu huấn luyện quá tốt, bao gồm cả *noise* và chi tiết ngoại lệ. Mặc dù điều này có thể mang lại độ chính xác rất cao trên dữ liệu huấn luyện, nhưng hiệu suất của mô hình trên dữ liệu mới, chưa được nhìn thấy có thể sẽ giảm do về cơ bản nó đã *học vẹt* dữ liệu huấn luyện thay vì học cách khái quát từ tập dữ liệu đó.

## 3. Code mẫu của ANN
### 3.1 Vấn đề:
> ****Cho một dataset gồm train và test của những con số viết tay của con người, hãy lập ANN phân biệt được những con số ấy.****
Dữ liệu train (không hình nào trong tập dữ liệu giống nhau).
Những hình được **định dạng matrix 28x28**, độ **đậm và nhạt từ 0 đến 1**. Ngoài ra mỗi hình đều gắn tag số của hình đó cho ANN học.

### 3.2 Code thuật toán quan trọng của ANN:
### **Forward Propagation:**

Dưới dạng toán học:
- Từ lớp input $\rightarrow$ lớp hidden:
$$ h_{\text{pre}} = b_{i\_h} + W_{i\_h} \cdot img \\ $$
$$h = \frac{1}{1 + e^{-h_{\text{pre}}}}$$
- Từ lớp hidden $\rightarrow$ lớp output:
$$ o_{\text{pre}} = b_{h\_o} + W_{h\_o} \cdot h \\ $$
$$ o = \frac{1}{1 + e^{-o_{\text{pre}}}} $$
### **Tính loss function:**

Dưới dạng toán học:
$$E = \frac{1}{N} \sum_{i=1}^{N} (o_i - l_i)^2$$
**Lưu ý:**
- Ta sử dụng $\frac{1}{N}$ để tính giá trị trung bình của tổng ***loss function.***
- $o$ là kết quả đự đoán, còn $l$ là kết quả cần đạt.
### **Backpropagation:**
- Chỉnh sửa giá trị từ lớp output $\rightarrow$ lớp hidden

Dưới dạng toán học:
$$\Delta_o = o - l$$
$$W_{h\_o} = W_{h\_o} - \eta \cdot \Delta_o \cdot H^T$$
$$b_{h\_o} = b_{h\_o} - \eta \cdot \Delta_o$$
- Chỉnh sửa giá trị từ lớp hidden $\rightarrow$ lớp input

Dưới dạng toán học:
$$ \Delta h = W_{h\_o}^T \cdot \Delta o \cdot (h \cdot (1 - h))$$
$$W_{i\_h} = W_{i\_h} - \eta \cdot \Delta h \cdot \text{img}^T$$
$$b_{i\_h} = b_{i\_h} - \eta \cdot \Delta h$$
### 3.3 Kết quả
Sau khi cho ANN
Tuy nhiên, nhược điểm là ANN vẫn có đôi khi cho ra kết quả dự đoán sai (~1%), vì thế việc chọn số epoch phù hợp là một yếu tố phải cân nhắc.
