Làm rõ về trực giác đằng sau backpropagation


7

Tôi đã dành một chút thời gian để thử và hiểu các tính toán và cơ học của các thuật toán học máy mà tôi sử dụng trong cuộc sống hàng ngày.

Nghiên cứu tài liệu truyền bá về khóa học CS231n, tôi muốn chắc chắn rằng tôi đã hiểu đúng quy tắc chuỗi trước khi tiếp tục nghiên cứu.

Nói rằng tôi có chức năng sigmoid:

σ(x)= =11+e-x

trong trường hợp này, x= =w0x0+w1x1+w2

Chúng ta có thể viết hàm này dưới dạng biểu đồ tính toán (Bỏ qua các giá trị màu bây giờ): nhập mô tả hình ảnh ở đây

Chúng ta có thể nhóm các nút được mô đun hóa để tính toán độ dốc của sigmoid w.r.t. đầu vào của nó thành một dẫn xuất duy nhất:

dσ(x)dx= =(1-σ(x))σ(x)

Đầu tiên, chúng tôi thực hiện chuyển tiếp để có được đầu ra tại mỗi đơn vị:

w = [2,-3,-3] 
x = [-1, -2]

# Compute the forward pass 
product = [w[0]*x[0]+w[1]*x[1]+w[2]]
activation = 1 / 1 + math.exp(-product)

Để tính toán độ dốc của kích hoạt, chúng ta có thể sử dụng công thức trên:

grad_product = (1 - activation) * activation 

Nơi tôi cảm thấy mình có thể bị lẫn lộn, hoặc, ít nhất là ít trực quan hơn, đang tính toán độ dốc cho xw:

grad_x = [w[0] * activation + w[2] * activation]
grad_w = [x[0] * activation + x[1] * activation + 1 * activation]

Cụ thể hơn, tôi bối rối về lý do tại sao chúng ta áp dụng 1 * activationkhi tính toán độ dốcw.r.t. w.

Nó có thể giúp người đọc phát hiện ra khó khăn lý thuyết của tôi nếu tôi cố gắng lý giải các tính toán của cả độ dốc của x và w ...

Độ dốc của mỗi xTôi được đưa ra bởi tương ứng wTôi theo quy tắc nhân: if f(x,y)= =f(xy) sau đó fx= =y. Sau đó, bằng cách sử dụng quy tắc chuỗi, chúng tôi nhân các gradient cục bộ này với độ dốc của nút liên tiếp (cho mỗi đường dẫn củax) để thu được gradient của nó, đầu ra hàm. Điều này giải thích tính toán cho máy tínhx.

Độ dốc của wTôiđược đưa ra theo cách chính xác (nghịch đảo) như đã giải thích ở trên với phần bổ sung 1 * activation. Tôi tin rằng biểu hiện bổ sung này đến từw2? Độ dốc cục bộ của một đơn vị bổ sung luôn là 1 cho tất cả các đầu vào và phép nhân với activationkết quả của việc nối chuỗi độ dốc với đầu ra của hàm?

Tôi tự tin một phần với sự hiểu biết hiện tại của mình nhưng sẽ đánh giá cao nếu ai đó có thể làm rõ trực giác hiện tại của tôi về các tính toán liên quan đến độ dốc tính toán.

Câu trả lời:


0

Những gì bạn muốn tính toán, là

σ(x^)x= =[σ(x^)x0,σ(x^)x1]

σ(x^)w= =[σ(x^)w0,σ(x^)w1,σ(x^)w2]

biết rằng x^ thực tế là một hàm của các biến đó, như x^= =w0x0+w1x1+w2.

Bạn có thể sử dụng quy tắc chuỗi để tính toán này như sau:

σ(x^)x0= =σ(x^)x^x^x0

Bạn đã biết rồi σ(x^)x^

như của nó

σ(x^)x^= =(1-σ(x^))σ(x^)

và đạo hàm thứ hai là tầm thường (nó chỉ là một đa thức! x^x0= =w0). Bây giờ bạn chỉ cần tính toán cho 5 đạo hàm riêng. Nói ngắn gọn:

σ(x^)x= =[σ(x^)x^w0,σ(x^)x^w1]

σ(x^^)w= =[σ(x^)x^x0,σ(x)x^x1,σ(x^)x^]

2

Cách tốt nhất để hiểu backpropagation cho một lập trình viên là về mặt quy tắc chuỗi như một đệ quy.

Đây là quy tắc chuỗi. Bạn có một biểu thức hàm lồng nhauy= =f(g(x)). Đầu tiên bạn xem nó như hai chức năng khác nhau:

f(x)g(x)
Khi bạn truyền bá về phía trước, không có gì ngoài mã psudo này:
t= =g(x)y= =f(t)

Bây giờ, nếu bạn muốn lấy đạo hàm, bạn áp dụng quy tắc chuỗi:

y'= =f(g(x))'= =f'g'
Ở đâu
f'= =df(t)/dt
g'= =dg(x)/dx
Đây về cơ bản là một đệ quy trên một cấu trúc lồng nhau. Nếug(x)= =g(h(x)), sau đó bạn chỉ cần áp dụng quy tắc chuỗi một lần nữa và tiếp tục thực hiện cho đến khi bạn chạm đến đáy, tức là lớp đầu vào trong trường hợp NN.

Đây là một ví dụ, một nơron:

một= =STôigmoTôid(Wx+b)
Bạn có hai chức năng ở đây: STôigmoTôid(x)Wx+b.

Nếu bạn có hai lớp tế bào thần kinh thì không khác nhiều:

STôigmoTôid(W1*STôigmoTôid(Wx+b)+b1)
vì vậy bạn đi ngược lại:
z= =Wx+bmột1= =STôigmoTôid(z)z1= =W1*một1+b1một2= =STôigmoTôid(z1)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.