| | import numpy as np
|
| |
|
| |
|
| | X = np.array([[0, 0],
|
| | [0, 1],
|
| | [1, 0],
|
| | [1, 1]])
|
| | y = np.array([[0], [1], [1], [0]])
|
| |
|
| |
|
| |
|
| | def sigmoid(x):
|
| | return 1 / (1 + np.exp(-x))
|
| |
|
| |
|
| | def sigmoid_derivative(x):
|
| | return x * (1 - x)
|
| |
|
| |
|
| |
|
| | np.random.seed(42)
|
| | input_dim = 2
|
| | hidden_dim = 2
|
| | '''
|
| | Ả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
|
| | '''
|
| | Ả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
|
| | '''
|
| | Ả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
|
| | '''
|
| |
|
| |
|
| | w1 = np.random.randn(input_dim, hidden_dim)
|
| | '''
|
| | 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))
|
| |
|
| |
|
| | w2 = np.random.randn(hidden_dim, output_dim)
|
| | b2 = np.zeros((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)
|
| | '''
|
| |
|
| |
|
| | for epoch in range(epochs):
|
| |
|
| | z1 = np.dot(X, w1) + b1
|
| | h = sigmoid(z1)
|
| | z2 = np.dot(h, w2) + b2
|
| | y_pred = sigmoid(z2)
|
| |
|
| |
|
| | error = y - y_pred
|
| |
|
| |
|
| | d_y_pred = error * sigmoid_derivative(y_pred)
|
| | d_h = d_y_pred.dot(w2.T) * sigmoid_derivative(h)
|
| |
|
| |
|
| | 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
|
| |
|
| |
|
| | 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.
|
| | ''' |