Nền tảng Deep Learning: từ nơ-ron đến mạng đầu tiên · Bài 2
Một nơ-ron tính một tổng có trọng số
- Nền tảng
- 8 phút đọc
Nội dung do AI tạo và được người duyệt trước khi xuất bản.
Các bài trong khóa
Trong bài này
Tình huống
Bốn vector của bài trước đang nằm trên bàn: thư quảng cáo là [2 1 1 0 0], thư khách hỏi đơn hàng là [0 0 0 1 1]. Chị Hà muốn một quy tắc đơn giản. Cụm "giảm giá" và "miễn phí" làm thư đáng ngờ hơn. Cụm "đơn hàng" và "hóa đơn" kéo về phía thư của khách. Bạn cần một con số cho mỗi thư, và bạn cần biết con số đó đổi chiều nào khi bạn bớt tin một cụm.
Bài này dừng ở tổng. Chưa ép con số về khoảng 0 đến 1. Việc đó là hàm sigmoid ở bài sau.
Mục tiêu
- Tính được cho một thư khi đã có vector, trọng số và độ lệch.
- Đổi một trọng số và nói tăng hay giảm, khi ô tương ứng của thư lớn hơn 0.
- Chỉ ra ô bằng 0 thì đổi trọng số của ô đó không đổi .
Trực giác
Mỗi cụm từ được một phiếu tín nhiệm. Phiếu dương nghĩa là cụm đó kéo thư về phía "nghi rác". Phiếu âm kéo về phía thư khách. Bạn nhân số lần xuất hiện với phiếu của cụm đó, cộng hết lại, rồi cộng thêm một mức nghi ngờ có sẵn khi thư không có cụm nào trong danh sách. Mức có sẵn đó là độ lệch (bias).
Nếu một thư không hề có chữ "miễn phí", thì phiếu của "miễn phí" có lớn đến đâu cũng không góp gì vào tổng của thư đó. Không có gì để nhân.
Kiến thức cốt lõi
Nơ-ron (neuron) ở bài này làm một phép tính. Vector thư là , trọng số (weight) là , cùng thứ tự năm ô với bài trước. Độ lệch là .
Dấu của là chiều kéo. Độ lớn là sức kéo trên mỗi lần cụm xuất hiện. thì số hạng bằng 0, dù đổi.
Bộ số dùng trong mã, theo thứ tự giảm giá, miễn phí, nhấp, đơn hàng, hóa đơn:
âm nghĩa là khi chưa thấy cụm nào, đã nghiêng về phía thư thường. Dòng chữ "nghi rác" trong kết quả chạy chỉ là cách đọc tạm khi . Nó chưa phải xác suất. Bài sau mới biến thành một số trong khoảng .
Ví dụ từng bước
Lấy thư 1, .
- Ô giảm giá: .
- Ô miễn phí: .
- Ô nhấp: .
- Hai ô còn lại nhân với 0, ra 0.
- Cộng độ lệch: .
Hạ trọng số "miễn phí" từ xuống . Thư 1 có đúng một lần "miễn phí", nên tổng giảm : . Thư 2 và thư 4 không có "miễn phí", nên của hai thư đó đứng yên.
Mã ở code/neuron.py dùng đúng bốn vector bài trước.
import numpy as np
VOCAB = ["giảm giá", "miễn phí", "nhấp", "đơn hàng", "hóa đơn"]
# Bốn vector của bài 01, mỗi hàng là một thư.
X = np.array([
[2, 1, 1, 0, 0],
[0, 0, 0, 1, 1],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 1],
])
def neuron(x, w, b):
"""Tổng có trọng số của đầu vào, cộng độ lệch."""
return np.dot(w, x) + b
def report(title, w, b):
print(title)
for i, x in enumerate(X, start=1):
z = neuron(x, w, b)
verdict = "nghi rác" if z > 0 else "thư thường"
print(f" Thư {i}: z = {z:+.1f} -> {verdict}")
w = np.array([1.5, 1.0, 0.8, -1.2, -2.0])
b = -0.5
report("Trọng số ban đầu", w, b)
# Đổi đúng một trọng số: bớt tin vào từ "miễn phí".
w2 = w.copy()
w2[VOCAB.index("miễn phí")] = 0.2
report("Sau khi giảm trọng số của 'miễn phí' từ 1.0 xuống 0.2", w2, b)Chạy file in ra:
Trọng số ban đầu
Thư 1: z = +4.3 -> nghi rác
Thư 2: z = -3.7 -> thư thường
Thư 3: z = +0.1 -> nghi rác
Thư 4: z = -2.5 -> thư thường
Sau khi giảm trọng số của 'miễn phí' từ 1.0 xuống 0.2
Thư 1: z = +3.5 -> nghi rác
Thư 2: z = -3.7 -> thư thường
Thư 3: z = -0.7 -> thư thường
Thư 4: z = -2.5 -> thư thườngThư 3 bắt đầu ở và sau bước đổi trọng số còn . Cùng một thư, đổi chiều từ dương sang âm chỉ vì ô "miễn phí" của nó bằng 1. Dấu + trong dòng in đến từ định dạng {z:+.1f} trong mã, tức số dương , không phải một phép cộng thêm.
Lỗi thường gặp
- Quên độ lệch. Bỏ , thư 4 còn thay vì . Thư không có cụm nào trong danh sách sẽ ra nếu không có , tức không nghiêng về bên nào. là mức nghiêng sẵn về thư thường.
- Đọc như một xác suất. không phải 430%, và không phải một tỉ lệ. Chỉ dấu và độ lớn là có nghĩa ở bài này. Nhãn "nghi rác" khi là một ngưỡng tạm trong mã, để bạn thấy chiều đổi. Nó sẽ bị thay khi có hàm sigmoid.
- Sửa một trọng số rồi tưởng mọi thư đều đổi. Thư 2 giữ sau khi hạ trọng số "miễn phí", vì ô đó của thư 2 bằng 0. Nếu bạn thấy một thư không đổi, hãy nhìn ô tương ứng trước khi kết luận mã hỏng.
Tóm tắt
- Một nơ-ron ở bài này tính , chưa qua hàm kích hoạt.
- Trọng số dương kéo về phía nghi rác, trọng số âm kéo về phía thư khách, mỗi lần cụm xuất hiện.
- Đổi một trọng số làm đổi một lượng bằng độ đổi của trọng số nhân với số ở ô đó.
- Ô bằng 0 thì trọng số của ô đó không góp vào .
- chưa phải xác suất.
Thực hành
Lấy thư bạn đã đếm ở bài trước, , với cùng và trong neuron.py.
- Tính tay . Rồi thêm hàng này vào
Xvà chạy lại để đối chiếu. - Đổi trọng số "hóa đơn" từ thành , giữ nguyên các trọng số khác. của thư này tăng hay giảm, và tăng hoặc giảm bao nhiêu?
Tự kiểm: câu 1 ra . Câu 2 ra , tức tăng , vì ô "hóa đơn" bằng 1 và trọng số của ô đó tăng thêm 1.
Kiểm tra nhanh
Đúng 0/3
Ghi chú của tôi
Đăng nhập để lưu ghi chú riêng cho bài này.