Thuật toán backpropagation


19

Tôi đã có một sự nhầm lẫn nhỏ về thuật toán backpropagation được sử dụng trong perceptionron đa lớp (MLP).

Lỗi được điều chỉnh bởi hàm chi phí. Trong backpropagation, chúng tôi đang cố gắng điều chỉnh trọng lượng của các lớp ẩn. Lỗi đầu ra tôi có thể hiểu, đó là e = d - y[Không có các mục con].

Các câu hỏi là:

  1. Làm thế nào để có được lỗi của lớp ẩn? Làm thế nào để một người tính toán nó?
  2. Nếu tôi sao lưu nó, tôi nên sử dụng nó như một hàm chi phí của bộ lọc thích ứng hay tôi nên sử dụng một con trỏ (theo C / C ++), để cập nhật trọng số?

NN là một công nghệ lạc hậu, vì vậy tôi e rằng bạn sẽ không nhận được câu trả lời vì không có ai ở đây sử dụng chúng ...

@mbq: Tôi không nghi ngờ lời nói của bạn, nhưng làm thế nào để bạn đi đến kết luận rằng NN là "công nghệ lạc hậu"?
steffen

1
@steffen Bằng cách quan sát; Ý tôi là rõ ràng rằng sẽ không có ai đáng kể trong cộng đồng NN xuất hiện và nói "Này các bạn, hãy bỏ cuộc sống của chúng ta và chơi với một cái gì đó tốt hơn!", Nhưng chúng ta có các công cụ đạt được độ chính xác tương tự hoặc tốt hơn mà không cần sự tương đồng này và không bao giờ đào tạo -ending. Và mọi người bỏ NN để ủng hộ họ.

5
Điều này có một số sự thật khi bạn nói nó, @mbq, nhưng không còn nữa.
jerad

1
@jerad Khá dễ dàng - Đơn giản là tôi chưa thấy bất kỳ so sánh công bằng nào với các phương pháp khác (Kaggle không phải là một so sánh công bằng vì thiếu khoảng tin cậy cho độ chính xác - đặc biệt là khi kết quả của tất cả các đội có điểm cao rất gần như trong cuộc thi Merck), không có bất kỳ phân tích nào về sự mạnh mẽ của tối ưu hóa tham số - điều này tệ hơn nhiều.

Câu trả lời:


27

Tôi hình dung tôi sẽ trả lời một bài viết độc lập ở đây cho bất cứ ai quan tâm. Điều này sẽ được sử dụng ký hiệu được mô tả ở đây .

Giới thiệu

Ý tưởng đằng sau việc truyền bá là có một bộ "ví dụ đào tạo" mà chúng tôi sử dụng để đào tạo mạng lưới của mình. Mỗi câu hỏi đều có một câu trả lời đã biết, vì vậy chúng ta có thể cắm chúng vào mạng lưới thần kinh và tìm xem nó sai bao nhiêu.

Ví dụ, với nhận dạng chữ viết, bạn sẽ có rất nhiều ký tự viết tay bên cạnh những gì họ thực sự là. Sau đó, mạng lưới thần kinh có thể được đào tạo thông qua backpropagation để "học" cách nhận biết từng ký hiệu, do đó, sau đó khi nó được trình bày với một ký tự viết tay không xác định, nó có thể xác định chính xác nó là gì.

Cụ thể, chúng tôi nhập một số mẫu đào tạo vào mạng nơ-ron, xem nó đã hoạt động tốt như thế nào, sau đó "đánh ngược" để tìm xem chúng tôi có thể thay đổi trọng số và độ lệch của mỗi nút để có kết quả tốt hơn và sau đó điều chỉnh chúng cho phù hợp. Khi chúng tôi tiếp tục làm điều này, mạng "học".

Ngoài ra còn có các bước khác có thể được bao gồm trong quá trình đào tạo (ví dụ: bỏ học), nhưng tôi sẽ tập trung chủ yếu vào việc truyền bá vì đó là câu hỏi này.

Dẫn một phần

Đạo hàm một phần là đạo hàm của đối với một số biến . fxfxfx

Ví dụ: nếu , , vì đơn giản là hằng số đối với . Tương tự, , vì đơn giản là một hằng số đối với .ff(x,y)=x2+y2y2xffx=2xy2xx2yfy=2yx2y

Độ dốc của hàm, được chỉ định , là hàm chứa đạo hàm riêng cho mọi biến trong f. Đặc biệt:f

f(v1,v2,...,vn)=fv1e1++fvnen
,

Trong đó là một vectơ đơn vị chỉ theo hướng của biến .v 1eiv1

Bây giờ, một khi chúng ta đã tính toán cho một số hàm , nếu chúng ta ở vị trí , chúng ta có thể "trượt xuống" bằng cách đi theo hướng .f ( v 1 , v 2 , . . . , V n ) f - f ( v 1 , v 2 , . . . , V n )ff(v1,v2,...,vn)ff(v1,v2,...,vn)

Với ví dụ của chúng tôi về , các vectơ đơn vị là và , vì và và những vectơ chỉ theo hướng của trục và . Do đó, .e 1 = ( 1 , 0 ) e 2 = ( 0 , 1 ) v 1 = x v 2 = y x y f ( x , y ) = 2 x ( 1 , 0 ) + 2 y ( 0 , 1 )f(x,y)=x2+y2e1=(1,0)e2=(0,1)v1=xv2=yxyf(x,y)=2x(1,0)+2y(0,1)

Bây giờ, để "trượt xuống" hàm của chúng ta , giả sử chúng ta đang ở một điểm . Sau đó, chúng ta sẽ cần di chuyển theo hướng .f- f ( - 2 , - 4 ) = - ( 2 - 2 ( 1 , 0 ) + 2 4 ( 0 , 1 ) ) = - ( ( - 4 , 0 ) + ( 0 , 8 ) ) = ( 4 ,(2,4)f(2,4)=(22(1,0)+24(0,1))=((4,0)+(0,8))=(4,8)

Độ lớn của vectơ này sẽ cho chúng ta độ dốc của ngọn đồi (giá trị cao hơn có nghĩa là ngọn đồi dốc hơn). Trong trường hợp này, chúng tôi có .42+(8)28.944

Xuống dốc

Sản phẩm Hadamard

Sản phẩm Hadamard của hai ma trận , giống như phép cộng ma trận, ngoại trừ thay vì thêm phần tử ma trận, chúng ta nhân chúng thành phần tử khôn ngoan.A,BRn×m

Chính thức, trong khi bổ sung ma trận là , trong đó sao choC R n × mA+B=CCRn×m

Cji=Aji+Bji
,

Sản phẩm Hadamard , trong đó sao choC R n × mAB=CCRn×m

Cji=AjiBji

Tính toán độ dốc

(hầu hết phần này là từ cuốn sách của Neilsen ).

Chúng tôi có một tập các mẫu đào tạo, , trong đó là một mẫu đào tạo đầu vào duy nhất và là giá trị đầu ra dự kiến ​​của mẫu đào tạo đó. Chúng tôi cũng có mạng lưới của chúng tôi thần kinh, bao gồm những thành kiến , và trọng lượng . được sử dụng để ngăn ngừa sự nhầm lẫn từ , và được sử dụng trong định nghĩa của mạng feedforward.(S,E)SrErWBrijk

Tiếp theo, chúng tôi xác định hàm chi phí, có trong mạng lưới thần kinh của chúng tôi và một ví dụ đào tạo duy nhất và đưa ra mức độ tốt của nó.C(W,B,Sr,Er)

Thông thường những gì được sử dụng là chi phí bậc hai, được xác định bởi

C(W,B,Sr,Er)=0.5j(ajLEjr)2

Trong đó là đầu ra cho mạng nơ ron của chúng ta, mẫu đầu vào đã choaLSr

Sau đó, chúng tôi muốn tìm và cho mỗi nút trong mạng thần kinh feedforward của chúng tôi.CwjiCbji

Chúng ta có thể gọi đây là độ dốc của tại mỗi nơ ron vì chúng ta coi và là hằng số, vì chúng ta không thể thay đổi chúng khi chúng ta cố gắng học. Và điều này có ý nghĩa - chúng tôi muốn di chuyển theo hướng tương đối với và để giảm thiểu chi phí và di chuyển theo hướng tiêu cực của gradient đối với và sẽ làm điều này.CSrErWBWB

Để làm điều này, chúng tôi định nghĩa là lỗi của nơron trong lớp .δji=Czjiji

Chúng tôi bắt đầu với việc tính toán bằng cách cắm vào mạng lưới thần kinh của chúng tôi.aLSr

Sau đó, chúng tôi tính toán lỗi của lớp đầu ra, , thông quaδL

δjL=CajLσ(zjL)
.

Mà cũng có thể được viết là

δL=aCσ(zL)
.

Tiếp theo, chúng tôi tìm thấy lỗi về lỗi trong lớp tiếp theo , thông quaδiδi+1

δi=((Wi+1)Tδi+1)σ(zi)

Bây giờ chúng tôi có lỗi của từng nút trong mạng thần kinh của chúng tôi, việc tính toán độ dốc liên quan đến trọng số và thành kiến ​​của chúng tôi rất dễ dàng:

Cwjki=δjiaki1=δi(ai1)T

Cbji=δji

Lưu ý rằng phương trình sai số của lớp đầu ra là phương trình duy nhất phụ thuộc vào hàm chi phí, vì vậy, bất kể hàm chi phí, ba phương trình cuối cùng là như nhau.

Ví dụ, với chi phí bậc hai, chúng tôi nhận được

δL=(aLEr)σ(zL)

cho lỗi của lớp đầu ra. và sau đó phương trình này có thể được cắm vào phương trình thứ hai để nhận lỗi của lớp :L1th

= (

δL1=((WL)TδL)σ(zL1)
=((WL)T((aLEr)σ(zL)))σ(zL1)

mà chúng tôi có thể lặp lại quá trình này để tìm ra lỗi của bất kỳ lớp nào đối với với , sau đó cho phép chúng ta tính toán độ chênh lệch của trọng lượng và thiên vị bất kỳ của nút đối với với .CC

Tôi có thể viết ra một lời giải thích và bằng chứng về các phương trình này nếu muốn, mặc dù người ta cũng có thể tìm thấy bằng chứng về chúng ở đây . Tôi khuyến khích bất cứ ai đang đọc điều này để chứng minh những điều này, bắt đầu với định nghĩa và áp dụng quy tắc chuỗi một cách tự do.δji=Czji

Để biết thêm một số ví dụ, tôi đã lập danh sách một số hàm chi phí cùng với độ dốc của chúng ở đây .

Xuống dốc

Bây giờ chúng ta có các độ dốc này, chúng ta cần sử dụng chúng để học. Trong phần trước, chúng tôi đã tìm thấy cách di chuyển đến "trượt xuống" đường cong đối với một số điểm. Trong trường hợp này, vì đó là độ dốc của một số nút liên quan đến trọng số và độ lệch của nút đó, "tọa độ" của chúng tôi là trọng số và độ lệch hiện tại của nút đó. Vì chúng ta đã tìm thấy các gradient liên quan đến các tọa độ đó, các giá trị đó đã là bao nhiêu chúng ta cần thay đổi.

Chúng tôi không muốn trượt xuống dốc với tốc độ rất nhanh, nếu không, chúng tôi có nguy cơ trượt quá mức tối thiểu. Để ngăn chặn điều này, chúng tôi muốn một số "kích thước bước" .η

Sau đó, tìm xem chúng ta nên sửa đổi bao nhiêu trọng lượng và độ lệch, bởi vì chúng ta đã tính toán độ dốc đối với hiện tại chúng ta có

Δwjki=ηCwjki

Δbji=ηCbji

Do đó, trọng lượng và thành kiến ​​mới của chúng tôi là

b i j =

wjki=wjki+Δwjki
bji=bji+Δbji

Sử dụng quy trình này trên mạng thần kinh chỉ có một lớp đầu vào và một lớp đầu ra được gọi là Quy tắc Delta .

Stochastic Gradient gốc

Bây giờ chúng ta đã biết cách thực hiện backpropagation cho một mẫu duy nhất, chúng ta cần một số cách sử dụng quy trình này để "học" toàn bộ tập huấn luyện của chúng ta.

Một tùy chọn chỉ đơn giản là thực hiện backpropagation cho từng mẫu trong dữ liệu đào tạo của chúng tôi, từng mẫu một. Điều này là khá không hiệu quả mặc dù.

Một cách tiếp cận tốt hơn là Stochastic Gradient Descent . Thay vì thực hiện backpropagation cho từng mẫu, chúng tôi chọn một mẫu ngẫu nhiên nhỏ (được gọi là một đợt ) của tập huấn luyện của chúng tôi, sau đó thực hiện backpropagation cho từng mẫu trong lô đó. Hy vọng là bằng cách này, chúng tôi nắm bắt được "ý định" của tập dữ liệu mà không phải tính toán độ dốc của mỗi mẫu.

Ví dụ: nếu chúng tôi có 1000 mẫu, chúng tôi có thể chọn một lô có kích thước 50, sau đó chạy backpropagation cho từng mẫu trong lô này. Hy vọng là chúng tôi đã được cung cấp một bộ huấn luyện đủ lớn để thể hiện sự phân phối dữ liệu thực tế mà chúng tôi đang cố gắng học đủ tốt để chọn một mẫu ngẫu nhiên nhỏ là đủ để nắm bắt thông tin này.

Tuy nhiên, thực hiện backpropagation cho từng ví dụ đào tạo trong đợt mini của chúng tôi là không lý tưởng, bởi vì chúng tôi có thể kết thúc "lung tung" trong đó các mẫu đào tạo sửa đổi trọng số và sai lệch theo cách mà chúng triệt tiêu lẫn nhau và ngăn chúng khỏi mức tối thiểu chúng tôi đang cố gắng để đạt được.

Để ngăn chặn điều này, chúng tôi muốn đi đến "mức tối thiểu trung bình", vì hy vọng rằng, trung bình, độ dốc của các mẫu được chỉ xuống dốc. Vì vậy, sau khi chọn ngẫu nhiên lô của chúng tôi, chúng tôi tạo một nhỏ là một mẫu ngẫu nhiên nhỏ của lô của chúng tôi. Sau đó, đưa ra một lô nhỏ với mẫu đào tạo và chỉ cập nhật các trọng số và độ lệch sau khi lấy trung bình độ dốc của từng mẫu trong lô nhỏ.n

Chính thức, chúng tôi làm

Δwjki=1nrΔwjkri

Δbji=1nrΔbjri

Trong đó là thay đổi được tính toán về trọng lượng của mẫu và là thay đổi được tính toán theo độ lệch cho mẫu . rΔb r i j rΔwjkrirΔbjrir

Sau đó, giống như trước đây, chúng ta có thể cập nhật các trọng số và thành kiến ​​thông qua:

b i j = b i j + Δ b i j

wjki=wjki+Δwjki
bji=bji+Δbji

Điều này cho chúng tôi một số linh hoạt trong cách chúng tôi muốn thực hiện giảm độ dốc. Nếu chúng ta có một chức năng mà chúng ta đang cố gắng học với rất nhiều cực tiểu cục bộ, thì hành vi "ngọ nguậy" này thực sự đáng mong đợi, bởi vì điều đó có nghĩa là chúng ta ít bị "mắc kẹt" trong một cực tiểu địa phương, và nhiều khả năng là "nhảy ra" khỏi một cực tiểu địa phương và hy vọng rơi vào một cực tiểu gần với cực tiểu toàn cầu. Vì vậy, chúng tôi muốn các lô nhỏ.

Mặt khác, nếu chúng ta biết rằng có rất ít cực tiểu cục bộ và nói chung độ dốc đi về phía cực tiểu toàn cầu, chúng ta muốn các lô nhỏ lớn hơn, bởi vì hành vi "lắc lư xung quanh" này sẽ ngăn chúng ta xuống dốc nhanh như vậy như chúng tôi muốn Xem tại đây .

Một lựa chọn là chọn lô nhỏ lớn nhất có thể, coi toàn bộ lô là một lô nhỏ. Điều này được gọi là Batch Gradient Descent , vì chúng tôi chỉ đơn giản là tính trung bình độ dốc của lô. Điều này gần như không bao giờ được sử dụng trong thực tế, tuy nhiên, vì nó rất không hiệu quả.


6

Tôi đã không giao dịch với Mạng thần kinh trong một số năm nay, nhưng tôi nghĩ bạn sẽ tìm thấy mọi thứ bạn cần ở đây:

Mạng nơ-ron - Giới thiệu có hệ thống, Chương 7: Thuật toán truyền bá

Tôi xin lỗi vì đã không viết câu trả lời trực tiếp ở đây, nhưng vì tôi phải tìm kiếm các chi tiết cần nhớ (như bạn) và cho rằng câu trả lời mà không có một số sao lưu có thể thậm chí là vô ích, tôi hy vọng điều này là ổn. Tuy nhiên, nếu vẫn còn câu hỏi nào, hãy để lại nhận xét và tôi sẽ thấy những gì tôi có thể làm.

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.