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 . fx∂f∂xfx
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+y2y2x∂f∂f∂x=2xy2xx2y∂f∂y=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)=∂f∂v1e1+⋯+∂f∂vnen
,
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)f- ∇ f( 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= yxy∇ f( x , y) = 2 x ( 1 , 0 ) + 2 y( 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 ) = - ( 2 ⋅ - 2 ⋅ ( 1 , 0 ) + 2 ⋅ 4 ⋅ ( 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 )2---------√≈ 8,944
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.Một , B ∈ Rn × m
Chính thức, trong khi bổ sung ma trận là , trong đó sao choC ∈ R n × mA + B = CC∈ Rn × m
CTôij= ATôij+ BTôij
,
Sản phẩm Hadamard , trong đó sao choC ∈ R n × mA ⊙ B = CC∈ Rn× m
CTôij= ATôij⋅ BTôij
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)SrErWBrTôijk
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,5 Σj( mộtLj- Erj)2
Trong đó là đầu ra cho mạng nơ ron của chúng ta, mẫu đầu vào đã chomộtLSr
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.∂C∂wTôij∂C∂bTôij
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 .δij=∂C∂zijji
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
δLj=∂C∂aLjσ′(zLj)
.
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:
∂C∂wijk=δijai−1k=δi(ai−1)T
∂C∂bij=δij
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=(aL−Er)⊙σ′(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 :L−1th
= (
δL−1=((WL)TδL)⊙σ′(zL−1)
=((WL)T((aL−Er)⊙σ′(zL)))⊙σ′(zL−1)
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.δij=∂C∂zij
Để 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ó
Δwijk=−η∂C∂wijk
Δbij=−η∂C∂bij
Do đó, trọng lượng và thành kiến mới của chúng tôi là
b i j =
wijk=wijk+Δwijk
bij=bij+Δbij
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 lô 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
Δwijk=1n∑rΔwrijk
và
Δbij=1n∑rΔbrij
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ΔwrijkrΔbrijr
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
wijk=wijk+Δwijk
bij=bij+Δbij
Đ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ả.