File size: 5,363 Bytes
32333f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import numpy as np

# --- 1. Dữ liệu XOR gate ---
X = np.array([[0, 0],
              [0, 1],
              [1, 0],
              [1, 1]])
y = np.array([[0], [1], [1], [0]])  # output XOR


# --- 2. Hàm sigmoid & derivative ---
def sigmoid(x):
    return 1 / (1 + np.exp(-x))


def sigmoid_derivative(x):
    return x * (1 - x)


# --- 3. Khởi tạo weights & bias ---
np.random.seed(42)
input_dim = 2
hidden_dim = 2 # thử đổi thành 3, 4, 5...
'''

Ảnh hưởng:

2 neurons: học XOR ổn

1 neuron: không học được

2 neurons: học nhanh hơn, loss giảm mạnh 👉 Đây là chỗ dễ thấy sự thay đổi nhất. 

'''
output_dim = 1
lr = 0.5 # thử 0.1, 1.0, 2.0
'''

Ảnh hưởng:

lr nhỏ → học chậm, mượt

lr lớn → lúc học rất nhanh, lúc bị “nhảy loạn”, dễ diverge 👉 Thay đổi learning rate luôn thấy kết quả khác.

'''
epochs = 10000 # thử 3000, 50000
'''

Ảnh hưởng:

ít epoch → chưa học hết, dự đoán sai

nhiều epoch → XOR học hoàn hảo hơn

'''

# weights: input -> hidden
w1 = np.random.randn(input_dim, hidden_dim) # Có thể thử nhân thêm weight với 0.1 hoặc 0.001
'''

Hiệu ứng: khi nhân với 0.1

Train rất mượt

Loss giảm đều

Tốc độ học nhanh

Đây là “sweet spot”.



Hiệu ứng: khi nhân với 0.001

Activation gần 0 → mô hình học chậm

Loss giảm nhưng rất từ từ

'''
b1 = np.zeros((1, hidden_dim))

# weights: hidden -> output
w2 = np.random.randn(hidden_dim, output_dim)
b2 = np.zeros((1, output_dim)) # Có thể thử Bias random:  b1 = np.random.randn((1, output_dim))
'''

Hiệu ứng CÓ THỂ THẤY RÕ:

Decision boundary bắt đầu lệch → học XOR nhanh hơn

Loss giảm nhanh từ những bước đầu tiên

Output có thể ra đúng từ rất sớm (epoch 10–20)

'''

# --- 4. Huấn luyện bằng Backpropagation ---
for epoch in range(epochs):
    # Forward pass
    z1 = np.dot(X, w1) + b1
    h = sigmoid(z1)
    z2 = np.dot(h, w2) + b2
    y_pred = sigmoid(z2)

    # Tính lỗi
    error = y - y_pred

    # Backward pass
    d_y_pred = error * sigmoid_derivative(y_pred)
    d_h = d_y_pred.dot(w2.T) * sigmoid_derivative(h)

    # Cập nhật weights & bias
    w2 += h.T.dot(d_y_pred) * lr
    b2 += np.sum(d_y_pred, axis=0, keepdims=True) * lr
    w1 += X.T.dot(d_h) * lr
    b1 += np.sum(d_h, axis=0, keepdims=True) * lr

# --- 5. Test MLP ---
print("Testing trained MLP:")
z1 = np.dot(X, w1) + b1
h = sigmoid(z1)
z2 = np.dot(h, w2) + b2
y_pred = sigmoid(z2)
print(np.round(y_pred))

'''

✅ Tóm tắt học thuật:

| Tiêu chí                  | Single Layer Perceptron (SLP)         | Multi-Layer Perceptron (MLP)                                           |

| ------------------------- | ------------------------------------- | ---------------------------------------------------------------------- |

| **Số lớp**                | 1 lớp (input → output)                | Nhiều lớp (input → hidden → output)                                    |

| **Hàm học**               | Tuyến tính                            | Phi tuyến tính (nhờ lớp ẩn và activation)                              |

| **Hàm kích hoạt**         | Step function                         | Sigmoid, ReLU, Tanh hoặc các hàm phi tuyến khác                        |

| **Khả năng học XOR**      | Không                                 | Có                                                                     |

| **Thuật toán huấn luyện** | Perceptron learning rule              | Backpropagation + gradient descent                                     |

| **Ứng dụng**              | Phân loại tuyến tính cơ bản (AND, OR) | Classification, regression, nhận dạng hình ảnh, NLP, dữ liệu phi tuyến |

| **Ưu điểm**               | Đơn giản, dễ hiểu                     | Học được phi tuyến, khả năng biểu diễn cao                             |

| **Hạn chế**               | Chỉ học tuyến tính                    | Dễ overfitting, cần tuning hyperparameters, tốn tài nguyên             |

'''

'''

Epoch không phải là weight hay bias, nhưng về thuật toán học, nó được coi là hyperparameter.

Hyperparameter = tham số do người đặt trước khi huấn luyện (khác với parameter là giá trị học được từ dữ liệu).

Các hyperparameters phổ biến:

  Learning rate (𝜂)

  Batch size

  Số epoch

  Số lớp ẩn, số neuron

  Hàm kích hoạt

Như vậy: Epoch → hyperparameter, ảnh hưởng trực tiếp đến quá trình huấn luyện.

3. Epoch ảnh hưởng đến quá trình học như thế nào

Quá ít epoch → underfitting, model chưa học đủ.

Quá nhiều epoch → overfitting, model nhớ dữ liệu training quá mức, generalization kém.

Kết hợp với learning rate → số epoch quyết định model có hội tụ hay không.

4. Kết luận

Epoch là hyperparameter, nhưng nó không phải parameter học được từ dữ liệu.

Chọn epoch phù hợp = một phần quan trọng trong tuning hyperparameters để đạt hiệu quả tối ưu.

'''