Lưu ý: Tôi không phải là một chuyên gia về backprop, nhưng bây giờ đã đọc một chút, tôi nghĩ rằng cảnh báo sau là phù hợp. Khi đọc bài báo hay cuốn sách trên lưới thần kinh, nó không phải là không phổ biến cho các dẫn xuất phải được viết bằng cách kết hợp các tiêu chuẩn ký hiệu tổng / index , ký hiệu ma trận , và ký hiệu đa-index (bao gồm kết hợp cả hai cuối cùng cho các dẫn xuất tensor-tensor ). Thông thường ý định là điều này nên được "hiểu từ ngữ cảnh", vì vậy bạn phải cẩn thận!
Tôi nhận thấy một vài sự không nhất quán trong dẫn xuất của bạn. Tôi thực sự không làm mạng lưới thần kinh, vì vậy những điều sau đây có thể không chính xác. Tuy nhiên, đây là cách tôi sẽ đi về vấn đề.
Trước tiên, bạn cần tính đến tổng của và bạn không thể giả sử mỗi thuật ngữ chỉ phụ thuộc vào một trọng số. Vì vậy, lấy độ dốc của đối với thành phần của , chúng ta có
E k z E = - ∑ j t j log o jEEkz
E=−∑jtjlogoj⟹∂E∂zk=−∑jtj∂logoj∂zk
Sau đó, biểu thị là
chúng ta có
trong đó là Đồng bằng Kronecker . Sau đó, độ dốc của mẫu số softmax là
cung cấp cho
hoặc, mở rộng nhật ký
Lưu ý rằng đạo hàm tương ứng với , một tùy ýoj
oj=1Ωezj,Ω=∑iezi⟹logoj=zj−logΩ
∂logoj∂zk=δjk−1Ω∂Ω∂zk
δjk∂Ω∂zk=∑ieziδik=ezk
∂logoj∂zk=δjk−ok
∂oj∂zk=oj(δjk−ok)
zkthành phần của , cung cấp thuật ngữ ( chỉ khi ).
zδjk=1k=j
Vì vậy, độ dốc của với là
trong đó là hằng số (đối với một vectơ cho ).Ez
∂E∂zk=∑jtj(ok−δjk)=ok(∑jtj)−tk⟹∂E∂zk=okτ−tk
τ=∑jtjt
Điều này cho thấy sự khác biệt đầu tiên so với kết quả của bạn: không còn nhân . Lưu ý rằng đối với trường hợp điển hình trong đó là "một nóng", chúng tôi có (như đã lưu ý trong liên kết đầu tiên của bạn).tkoktτ=1
Một sự không nhất quán thứ hai, nếu tôi hiểu chính xác, đó là " " được nhập vào dường như không phải là " " được xuất ra từ softmax. Tôi sẽ nghĩ rằng nó có ý nghĩa hơn rằng điều này thực sự "trở lại" trong kiến trúc mạng?ozo
Gọi vectơ này là , sau đó chúng ta có
y
zk=∑iwikyi+bk⟹∂zk∂wpq=∑iyi∂wik∂wpq=∑iyiδipδkq=δkqyp
Cuối cùng, để có được độ dốc của đối với ma trận , chúng tôi sử dụng quy tắc chuỗi
đưa ra biểu thức cuối cùng -hot , tức là )
trong đó là đầu vào ở mức thấp nhất (ví dụ của bạn).Ew
∂E∂wpq=∑k∂E∂zk∂zk∂wpq=∑k(okτ−tk)δkqyp=yp(oqτ−tq)
tτ=1∂E∂wij=yi(oj−tj)
y
Vì vậy, điều này cho thấy sự khác biệt thứ hai so với kết quả của bạn: " " có lẽ nên từ cấp dưới , mà tôi gọi là , thay vì cấp trên (là ).oizyzo
Hy vọng điều này sẽ giúp. Liệu kết quả này có vẻ phù hợp hơn?
Cập nhật: Đáp lại truy vấn từ OP trong các bình luận, đây là phần mở rộng của bước đầu tiên. Đầu tiên, lưu ý rằng quy tắc chuỗi vectơ yêu cầu tổng kết (xem tại đây ). Thứ hai, để chắc chắn nhận được tất cả các thành phần gradient, bạn nên luôn luôn giới thiệu một chữ cái đăng ký mới cho thành phần trong mẫu số của đạo hàm riêng. Vì vậy, để viết đầy đủ gradient với quy tắc chuỗi đầy đủ, chúng ta có
và
vì vậy
∂E∂wpq=∑i∂E∂oi∂oi∂wpq
∂oi∂wpq=∑k∂oi∂zk∂zk∂wpq
∂E∂wpq=∑i[∂E∂oi(∑k∂oi∂zk∂zk∂wpq)]
Trong thực tế, tổng cộng giảm, vì bạn nhận được rất nhiều điều khoản . Mặc dù nó liên quan đến rất nhiều tổng kết và đăng ký có thể "thêm", sử dụng quy tắc chuỗi đầy đủ sẽ đảm bảo bạn luôn nhận được kết quả chính xác.δab