Tại sao trở lại tuyên truyền qua thời gian trong một RNN?


14

Trong một mạng thần kinh tái phát, bạn thường sẽ chuyển tiếp truyền qua một số bước thời gian, "hủy đăng ký" mạng và sau đó truyền lại qua chuỗi các đầu vào.

Tại sao bạn không chỉ cập nhật các trọng số sau mỗi bước riêng lẻ trong chuỗi? . . Tôi đã đào tạo một mô hình theo cách này để tạo văn bản và kết quả dường như tương đương với kết quả mà tôi đã thấy từ các mô hình được đào tạo BPTT. Tôi chỉ bối rối về điều này bởi vì mọi hướng dẫn về RNN mà tôi đã thấy đều nói rằng nên sử dụng BPTT, gần như là nó được yêu cầu cho việc học tập đúng đắn, đó không phải là trường hợp.

Cập nhật: Tôi đã thêm một câu trả lời


Một hướng thú vị để thực hiện nghiên cứu này là so sánh kết quả mà bạn đã đạt được về vấn đề của mình với điểm chuẩn được công bố trong tài liệu về các vấn đề RNN tiêu chuẩn. Điều đó sẽ làm cho một bài viết thực sự mát mẻ.
Sycorax nói Phục hồi lại

"Cập nhật: Tôi đã thêm một câu trả lời" thay thế chỉnh sửa trước đó bằng mô tả kiến ​​trúc của bạn và một minh họa. Có mục đích không?
amip nói rằng Phục hồi lại

Có, tôi đã lấy nó ra vì nó dường như không liên quan đến câu hỏi thực sự và nó chiếm rất nhiều không gian, nhưng tôi có thể thêm lại nếu nó giúp
Frobot

Mọi người dường như có vấn đề lớn với việc hiểu kiến ​​trúc của bạn, vì vậy tôi đoán bất kỳ giải thích bổ sung nào cũng hữu ích. Bạn có thể thêm nó vào câu trả lời của bạn thay vì câu hỏi của bạn, nếu bạn thích.
amip nói rằng Phục hồi Monica

Câu trả lời:


4

Chỉnh sửa: Tôi đã phạm một sai lầm lớn khi so sánh hai phương pháp và phải thay đổi câu trả lời của mình. Hóa ra cách tôi đang làm, chỉ cần tuyên truyền lại về bước thời gian hiện tại, thực sự bắt đầu học nhanh hơn. Các bản cập nhật nhanh chóng tìm hiểu các mẫu cơ bản nhất rất nhanh chóng. Nhưng trên một tập dữ liệu lớn hơn và với thời gian đào tạo dài hơn, BPTT thực tế đã đứng đầu. Tôi đã thử nghiệm một mẫu nhỏ chỉ trong vài kỷ nguyên và cho rằng bất cứ ai bắt đầu chiến thắng cuộc đua sẽ là người chiến thắng. Nhưng điều này đã dẫn tôi đến một phát hiện thú vị. Nếu bạn bắt đầu đào tạo trở lại tuyên truyền chỉ một bước duy nhất, sau đó thay đổi thành BPTT và từ từ tăng khoảng cách bạn tuyên truyền trở lại, bạn sẽ hội tụ nhanh hơn.


Cảm ơn bạn đã cập nhật của bạn. Trong nguồn của hình ảnh đó cuối cùng anh nói điều này về 1-1 thiết lập: "Chế độ Vanilla chế biến mà không RNN, từ kích thước cố định đầu vào để cố định kích thước đầu ra (ví dụ như phân loại hình ảnh)." Vì vậy, đó là những gì chúng ta đã nói. Nếu như bạn mô tả thì nó không có trạng thái và nó không phải là RNN. "lan truyền về phía trước thông qua một đầu vào duy nhất trước khi truyền trở lại" - Tôi gọi đó là ANN. Nhưng những thứ này sẽ không hoạt động tốt với văn bản nên có gì đó không ổn và tôi không biết vì tôi không có mã
ragulpr

Tôi đã không đọc phần đó và bạn đã đúng. Mô hình tôi đang sử dụng thực sự là "nhiều đến nhiều" ở phía bên phải. tôi giả sử trong phần "một kèm một" thực sự có rất nhiều trong số này được kết nối và bản vẽ chỉ để nó ra ngoài. nhưng đó thực sự là một trong những lựa chọn ở phía bên phải mà tôi không nhận thấy (thật kỳ lạ khi có một tùy chọn trong blog về RNNs, vì vậy tôi cho rằng tất cả chúng đều tái phát). Tôi sẽ chỉnh sửa một phần câu trả lời để có ý nghĩa hơn
Frobot

Tôi tưởng tượng đó là trường hợp, đó là lý do tại sao tôi khăng khăng muốn thấy chức năng mất của bạn. Nếu đó là nhiều cho sự mất mát của bạn giống như và nó hệt một RNN và bạn đang tuyên truyền / inputing toàn bộ chuỗi nhưng sau đó chỉ cần cắt bỏ BPTT tức là bạn' d tính phần màu đỏ trong bài viết của tôi nhưng không tái diễn thêm. error=t(yty^t)2
ragulpr

Hàm mất của tôi không tính tổng theo thời gian. Tôi lấy một đầu vào, nhận một đầu ra, sau đó tính toán tổn thất và cập nhật các trọng số, sau đó chuyển sang t + 1, vì vậy không có gì để tính tổng. Tôi sẽ thêm chức năng mất chính xác vào bài đăng gốc
Frobot

Chỉ cần đăng mã của bạn Tôi không làm gì thêm đoán, điều này là ngớ ngẩn.
ragulpr

2

RNN là Mạng nơ-ron sâu (DNN) trong đó mỗi lớp có thể nhận đầu vào mới nhưng có cùng tham số. BPT là một từ ưa thích cho Back Propagation trên một mạng như vậy, bản thân nó là một từ ưa thích cho Gradient Descent.

Nói rằng RNN đầu ra y t trong từng bước và e r r o r t = ( y t - y t ) 2y^t

errort=(yty^t)2

Để tìm hiểu các trọng số, chúng ta cần độ dốc cho hàm để trả lời câu hỏi "thay đổi tham số ảnh hưởng đến hàm mất bao nhiêu?" và di chuyển các tham số theo hướng được đưa ra bởi:

errort=2(yty^t)y^t

Tức là chúng tôi có một DNN nơi chúng tôi nhận được phản hồi về mức độ dự đoán tốt ở mỗi lớp. Vì một thay đổi trong tham số sẽ thay đổi mọi lớp trong DNN (dấu thời gian) và mỗi lớp đóng góp vào các đầu ra sắp tới, điều này cần phải được tính đến.

Lấy một mạng nơ-ron một lớp đơn giản để thấy điều này một cách rõ ràng:

y^t+1=f(a+bxt+cy^t)ay^t+1=f(a+bxt+cy^t)cay^tby^t+1=f(a+bxt+cy^t)(xt+cby^t)cy^t+1=f(a+bxt+cy^t)(y^t+ccy^t)y^t+1=f(a+bxt+cy^t)([0xty^t]+cy^t)

Với tỷ lệ học bước một đào tạo là sau đó: [ ~ một ~ b ~ c ][ một b c ] + δ ( y t - yδ

[a~b~c~][abc]+δ(yty^t)y^t

y^t+1y^tt

error=t(yty^t)2

Có lẽ mỗi bước sau đó sẽ đóng góp một hướng thô mà đủ trong tổng hợp? Điều này có thể giải thích kết quả của bạn nhưng tôi thực sự muốn nghe thêm về chức năng phương pháp / mất của bạn! Cũng sẽ quan tâm đến việc so sánh với hai dấu thời gian ANN.

chỉnh sửa4: Sau khi đọc các bình luận, có vẻ như kiến ​​trúc của bạn không phải là RNN.

ht Statefull

Mô hình của bạn: Không trạng thái - trạng thái ẩn được xây dựng lại trong mỗi bước chỉnh stateless sửa2: thêm nhiều ref hơn vào DNNs edit3: bước tiến cố định và một số ký hiệu chỉnh sửa5: Đã sửa lỗi diễn giải mô hình của bạn sau khi trả lời / làm rõ.


1
Cảm ơn về câu trả lời của bạn. Tôi nghĩ rằng bạn có thể đã hiểu sai những gì tôi đang làm mặc dù. Trong tuyên truyền về phía trước tôi chỉ làm một bước, do đó, trong việc truyền bá ngược lại, nó cũng chỉ là một bước. Tôi không chuyển tiếp tuyên truyền trên nhiều đầu vào trong chuỗi đào tạo. Tôi thấy ý của bạn về một hướng thô đủ để tổng hợp để cho phép học, nhưng tôi đã kiểm tra độ dốc của mình với độ dốc được tính bằng số và chúng khớp với hơn 10 chữ số thập phân. Các prop trở lại hoạt động tốt. Tôi đang sử dụng mất entropy chéo.
Frobot

1
Tôi đang làm việc để lấy mô hình tương tự của tôi và đào tạo lại nó với BPTT khi chúng tôi nói để có một so sánh rõ ràng. Tôi cũng đã đào tạo một mô hình sử dụng thuật toán "một bước" này để dự đoán giá cổ phiếu sẽ tăng hay giảm vào ngày hôm sau, điều này có độ chính xác khá cao, vì vậy tôi sẽ có hai mô hình khác nhau để so sánh BPTT với một bước lùi.
Frobot

Nếu bạn chỉ chuyển tiếp một bước, thì đây có phải là ANN hai lớp với đầu vào tính năng của bước cuối cùng đến lớp đầu tiên, tính năng đầu vào cho bước hiện tại ở lớp thứ hai nhưng có cùng trọng số / tham số cho cả hai lớp không? Tôi mong đợi kết quả tương tự hoặc tốt hơn với ANN có đầu vàoy^t+1= =f(xt,xt-1)tức là sử dụng một cửa sổ thời gian cố định có kích thước 2. Nếu nó chỉ tiến lên một bước, nó có thể học được các phụ thuộc dài hạn không?
ragulpr

1
Tôi đang sử dụng cửa sổ trượt có kích thước 1, nhưng kết quả khác rất nhiều so với việc tạo cửa sổ trượt có kích thước 2 ANN với các đầu vào (xt, xt 1). Tôi có thể cố tình để nó phù hợp khi học một khối văn bản khổng lồ và nó có thể tái tạo toàn bộ văn bản với 0 lỗi, điều này đòi hỏi phải biết phụ thuộc dài hạn sẽ là không thể nếu bạn chỉ có (xt, xt 1) làm đầu vào. câu hỏi duy nhất tôi còn lại là nếu sử dụng BPTT sẽ cho phép các phụ thuộc trở nên dài hơn, nhưng thực sự nó không giống như vậy.
Frobot

Nhìn vào bài viết cập nhật của tôi. Kiến trúc của bạn không phải là RNN, nó không trạng thái lâu dài - không thể học được các phụ thuộc dài hạn vào các tính năng. Dự đoán trước không ảnh hưởng đến dự đoán trong tương lai. Bạn có thể thấy điều này như thểy^t-2y^t= =0cho kiến ​​trúc của bạn. Về lý thuyết, BPTT giống hệt với BP ​​nhưng được thực hiện trên kiến ​​trúc RNN nên bạn không thể hiểu ý của bạn và câu trả lời là không. Sẽ rất thú vị khi xem các thử nghiệm trên RNN có trạng thái nhưng chỉ thực hiện BPTT mặc dù vậy ^^
ragulpr

1

"Mở ra theo thời gian" chỉ đơn giản là một ứng dụng của quy tắc chuỗi,

dF(g(x),h(x),m(x))dx=Fgdgdx+Fhdhdx+Fmdmdx

The output of an RNN at time step t, Ht is a function of the parameters θ, the input xt and the previous state, Ht1 (note that instead Ht may be transformed again at time step t to obtain the output, that is not important here). Remember the goal of gradient descent: given some error function L, let's look at our error for the current example (or examples), and then let's adjust θ in such a way, that given the same example again, our error would be reduced.

How exactly did θ contribute to our current error? We took a weighted sum with our current input, xt, so we'll need to backpropagate through the input to find θa(xt,θ), to work out how to adjust θ. But our error was also the result of some contribution from Ht1, which was also a function of θ, right? So we need to find out θHt1, which was a function of xt1, θ and Ht2. But Ht2 was also a function a function of θ. And so on.


I understand why you back propagate through time in a traditional RNN. I'm trying to find out why a traditional RNN uses multiple inputs at once for training, when using just one at a time is much simpler and also works
Frobot

The only sense in which you can feed in multiple inputs at once into an RNN is feeding in multiple training examples, as part of a batch. The batch size is arbitrary, and convergence is guaranteed for any size, but higher batch sizes may lead to more accurate gradient estimations and faster convergence.
Matthew Hampsey

That's not what I meant by "multiple inputs at once". I didn't word it very well. I meant you usually forward propagate through several inputs in the training sequence, then back propagate back through them all, then update the weights. So the question is, why propagate through a whole sequence when doing just one input at a time is much easier and still works
Frobot

I think some clarification here is required. When you say "inputs", are you referring to multiple training examples, or are you referring to multiple time steps within a single training example?
Matthew Hampsey

1
I will post an answer to this question by the end of today. I finished making a BPTT version, just have to train and compare. After that if you still want to see some code let me know what you want to see and I guess I could still post it
Frobot
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.