Bỏ qua, tới nội dung chính
Luxara Academy

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 z=w⋅x+bz = w \cdot x + b cho một thư khi đã có vector, trọng số và độ lệch.
  • Đổi một trọng số và nói zz 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 zz.

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à xx, trọng số (weight) là ww, cùng thứ tự năm ô với bài trước. Độ lệch là bb.

z=w⋅x+b=w1x1+w2x2+w3x3+w4x4+w5x5+bz = w \cdot x + b = w_1 x_1 + w_2 x_2 + w_3 x_3 + w_4 x_4 + w_5 x_5 + b

Dấu của wiw_i là chiều kéo. Độ lớn là sức kéo trên mỗi lần cụm xuất hiện. xi=0x_i = 0 thì số hạng wixiw_i x_i bằng 0, dù wiw_i đổi.

Bộ số dùng trong mã, theo thứ tự giảm giá, miễn phí, nhấp, đơn hàng, hóa đơn:

w=(1,5; 1,0; 0,8; −1,2; −2,0)b=−0,5w = (1{,}5;\ 1{,}0;\ 0{,}8;\ -1{,}2;\ -2{,}0) \qquad b = -0{,}5

bb âm nghĩa là khi chưa thấy cụm nào, zz đã 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 z>0z > 0. Nó chưa phải xác suất. Bài sau mới biến zz thành một số trong khoảng (0,1)(0, 1).

Ví dụ từng bước

Lấy thư 1, x=(2,1,1,0,0)x = (2, 1, 1, 0, 0).

  1. Ô giảm giá: 1,5×2=31{,}5 \times 2 = 3.
  2. Ô miễn phí: 1,0×1=11{,}0 \times 1 = 1.
  3. Ô nhấp: 0,8×1=0,80{,}8 \times 1 = 0{,}8.
  4. Hai ô còn lại nhân với 0, ra 0.
  5. Cộng độ lệch: z=3+1+0,8−0,5=4,3z = 3 + 1 + 0{,}8 - 0{,}5 = 4{,}3.

Hạ trọng số "miễn phí" từ 1,01{,}0 xuống 0,20{,}2. Thư 1 có đúng một lần "miễn phí", nên tổng giảm 0,80{,}8: z=4,3−0,8=3,5z = 4{,}3 - 0{,}8 = 3{,}5. Thư 2 và thư 4 không có "miễn phí", nên zz của hai thư đó đứng yên.

Mã ở code/neuron.py dùng đúng bốn vector bài trước.

neuron.pyMở trên Colab
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:

text
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ường

Thư 3 bắt đầu ở +0,1+0{,}1 và sau bước đổi trọng số còn −0,7-0{,}7. Cùng một thư, zz đổ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 4,34{,}3, không phải một phép cộng thêm.

Lỗi thường gặp

  • Quên độ lệch. Bỏ bb, thư 4 còn z=−2,0z = -2{,}0 thay vì −2,5-2{,}5. Thư không có cụm nào trong danh sách sẽ ra z=0z = 0 nếu không có bb, tức không nghiêng về bên nào. b=−0,5b = -0{,}5 là mức nghiêng sẵn về thư thường.
  • Đọc zz như một xác suất. +4,3+4{,}3 không phải 430%, và −3,7-3{,}7 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 z>0z > 0 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ữ −3,7-3{,}7 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 z=w⋅x+bz = w \cdot x + b, 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 zz đổ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 zz.
  • zz chưa phải xác suất.

Thực hành

Lấy thư bạn đã đếm ở bài trước, x=(1,1,1,0,1)x = (1, 1, 1, 0, 1), với cùng ww và bb trong neuron.py.

  1. Tính tay zz. Rồi thêm hàng này vào X và chạy lại để đối chiếu.
  2. Đổi trọng số "hóa đơn" từ −2,0-2{,}0 thành −1,0-1{,}0, giữ nguyên các trọng số khác. zz 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 z=0,8z = 0{,}8. Câu 2 ra z=1,8z = 1{,}8, tức tăng 1,01{,}0, vì ô "hóa đơn" bằng 1 và trọng số của ô đó tăng thêm 1.

Kiểm tra nhanh

  • 1. Với w = (1,5; 1,0; 0,8; -1,2; -2,0), b = -0,5 và thư 1 có x = (2, 1, 1, 0, 0), z bằng bao nhiêu?
  • 2. Hạ trọng số "miễn phí" từ 1,0 xuống 0,2. Thư 3 có một lần "miễn phí" và z ban đầu là +0,1. z mới bằng bao nhiêu?
  • 3. Thư 4 có x = (0, 0, 0, 0, 1) và z = -2,5 với bộ trọng số ban đầu. Đổi trọng số "giảm giá" từ 1,5 thành 0. z mới bằng bao nhiêu?

Đúng 0/3

Ghi chú của tôi

Đăng nhập để lưu ghi chú riêng cho bài này.