Mạng lưới thần kinh sâu - Backpropogation với ReLU


17

Tôi gặp một số khó khăn trong việc thu hút sự lan truyền trở lại với ReLU và tôi đã thực hiện một số công việc, nhưng tôi không chắc liệu mình có đi đúng hướng hay không.

Hàm chi phí: trong đó là giá trị thực và là giá trị dự đoán. Cũng giả sử rằng > 0 luôn.12(yy^)2 y xyy^x


ReLU 1 lớp, trong đó trọng lượng ở lớp 1 làw1

nhập mô tả hình ảnh ở đây

dCdw1=dCdRdRdw1

dCw1=(yReLU(w1x))(x)


ReLU 2 lớp, trong đó các trọng số ở lớp 1 là và lớp thứ 2 là Và tôi muốn cập nhật lớp 1w2w1w2

nhập mô tả hình ảnh ở đây

dCdw2=dCdRdRdw2

dCw2=(yReLU(w1ReLU(w2x))(w1x)

ReLU(w1ReLU(w2x))=w1w2x


3 lớp ReLU, trong đó các trọng số ở lớp 1 là , lớp 2 và lớp 3w 2 w 1w3w2w1

nhập mô tả hình ảnh ở đây

dCdw3=dCdRdRdw3

dCw3=(yReLU(w1ReLU(w2(ReLU(w3)))(w1w2x)

ReLU(w1ReLU(w2(ReLU(w3))=w1w2w3x

Vì quy tắc chuỗi chỉ tồn tại với 2 dẫn xuất, so với sigmoid, có thể dài bằng số lớp.n


Giả sử tôi muốn cập nhật tất cả các trọng số 3 lớp, trong đó là lớp thứ 3, là lớp thứ 2, là lớp thứ 3w 2 w 1w1w2w1

dCw1=(yReLU(w1x))(x)

dCw2= =(y-ReLBạn(w1*ReLBạn(w2x))(w1x)

dCw3= =(y-ReLBạn(w1*ReLBạn(w2(*ReLBạn(w3)))(w1w2x)

Nếu đạo hàm này là chính xác, làm thế nào điều này ngăn chặn sự biến mất? So với sigmoid, nơi chúng ta có rất nhiều phép nhân với 0,25 trong phương trình, trong khi ReLU không có bất kỳ phép nhân giá trị không đổi nào. Nếu có hàng ngàn lớp, sẽ có rất nhiều phép nhân do trọng lượng, vậy điều này có gây ra sự biến mất hoặc nổ tung gradient không?


@NeilSlater Cảm ơn bạn đã trả lời! Bạn có thể giải thích, tôi không chắc ý của bạn là gì?
dùng1157751

Ah, tôi nghĩ tôi biết ý của bạn. Chà, lý do tôi đưa ra câu hỏi này là tôi chắc chắn rằng đạo hàm là chính xác? Tôi đã tìm kiếm xung quanh và không tìm thấy một ví dụ nào về ReLU có nguồn gốc hoàn toàn từ đầu?
dùng1157751

Câu trả lời:


15

Các định nghĩa làm việc của hàm ReLU và đạo hàm của nó:

ReLU(x)={0,if x<0,x,otherwise.

ddxReLU(x)={0,if x<0,1,otherwise.

Đạo hàm là hàm bước đơn vị . Điều này không bỏ qua một vấn đề tại , trong đó độ dốc không được xác định nghiêm ngặt, nhưng đó không phải là mối quan tâm thực tế cho các mạng thần kinh. Với công thức trên, đạo hàm tại 0 là 1, nhưng bạn có thể coi nó là 0 hoặc 0,5 mà không có tác động thực sự đến hiệu suất mạng thần kinh.x=0


Mạng đơn giản

Với những định nghĩa đó, chúng ta hãy xem các mạng mẫu của bạn.

Bạn đang chạy hồi quy với hàm chi phí . Bạn đã định nghĩa là đầu ra của nơ ron nhân tạo, nhưng bạn chưa xác định giá trị đầu vào. Tôi sẽ thêm nó cho đầy đủ - gọi nó là , thêm một số chỉ mục theo lớp và tôi thích chữ thường cho vectơ và chữ hoa cho ma trận, vì vậy đầu ra của lớp đầu tiên, cho đầu vào của nó và cho trọng lượng kết nối nơron với đầu vào của nó (trong một mạng lớn hơn, có thể kết nối với sâu hơnC=12(yy^)2Rzr(1)z(1)W(0)xrgiá trị thay thế). Tôi cũng đã điều chỉnh số chỉ mục cho ma trận trọng số - tại sao điều đó sẽ trở nên rõ ràng hơn đối với mạng lớn hơn. NB Tôi đang bỏ qua việc có nhiều hơn nơ ron trong mỗi lớp.

Nhìn vào mạng 1 lớp, 1 nơ ron đơn giản của bạn, các phương trình chuyển tiếp là:

z(1)=W(0)x

y^=r(1)=ReLU(z(1))

Đạo hàm của hàm chi phí viết một ước tính ví dụ là:

Cy^=Cr(1)=r(1)12(yr(1))2=12r(1)(y22yr(1)+(r(1))2)=r(1)y

Sử dụng quy tắc chuỗi để truyền ngược trở lại giá trị trước biến đổi ( ):z

Cz(1)=Cr(1)r(1)z(1)=(r(1)y)Step(z(1))=(ReLU(z(1))y)Step(z(1))

Đây là một giai đoạn tạm thời và một phần quan trọng của backprop nối bước nhau. Các công cụ phái sinh thường bỏ qua phần này vì sự kết hợp thông minh của hàm chi phí và lớp đầu ra có nghĩa là nó được đơn giản hóa. Ở đây không có.Cz(1)

Để có được độ dốc tương ứng với trọng số , thì đó là một bước lặp khác của quy tắc chuỗi:W(0)

CW(0)=Cz(1)z(1)W(0)=(ReLU(z(1))y)Step(z(1))x=(ReLU(W(0)x)y)Step(W(0)x)x

. . . bởi vì do đóz(1)=W(0)xz(1)W(0)=x

Đó là giải pháp đầy đủ cho mạng đơn giản nhất của bạn.

Tuy nhiên, trong một mạng lớp, bạn cũng cần mang logic tương tự xuống lớp tiếp theo. Ngoài ra, bạn thường có nhiều hơn một nơron trong một lớp.


Mạng ReLU tổng quát hơn

Nếu chúng ta thêm các thuật ngữ chung chung hơn, thì chúng ta có thể làm việc với hai lớp tùy ý. Gọi chúng là Layer được lập chỉ mục bởi và Layer được lập chỉ mục bởi . Các trọng lượng bây giờ là một ma trận. Vì vậy, các phương trình chuyển tiếp thức ăn của chúng tôi trông như thế này:(k)i(k+1)j

zj(k+1)=iWij(k)ri(k)

rj(k+1)=ReLU(zj(k+1))

Trong lớp đầu ra, sau đó độ dốc ban đầu wrt vẫn là . Tuy nhiên, bây giờ hãy bỏ qua điều đó và xem cách chung để truyền lại, giả sử chúng ta đã tìm thấy - chỉ cần lưu ý rằng điều này cuối cùng nơi chúng tôi nhận được các gradient chức năng chi phí đầu ra từ. Sau đó, có 3 phương trình chúng ta có thể viết ra theo quy tắc chuỗi:rjoutputrjoutputyjCrj(k+1)

Đầu tiên chúng ta cần đến đầu vào nơ ron trước khi áp dụng ReLU:

  1. Czj(k+1)=Crj(k+1)rj(k+1)zj(k+1)=Crj(k+1)Step(zj(k+1))

Chúng ta cũng cần truyền bá gradient tới các lớp trước đó, bao gồm tổng hợp tất cả các ảnh hưởng được kết nối đến từng nơron:

  1. Cri(k)=jCzj(k+1)zj(k+1)ri(k)=jCzj(k+1)Wij(k)

Và chúng ta cần kết nối điều này với ma trận trọng số để điều chỉnh sau:

  1. CWij(k)=Czj(k+1)zj(k+1)Wij(k)=Czj(k+1)ri(k)

Bạn có thể giải quyết những vấn đề này hơn nữa (bằng cách thay thế các giá trị trước đó) hoặc kết hợp chúng (thường là các bước 1 và 2 được kết hợp để liên kết lớp chuyển đổi trước lớp theo từng lớp). Tuy nhiên, trên đây là hình thức chung nhất. Bạn cũng có thể thay thế trong phương trình 1 cho bất kỳ hàm đạo hàm nào là hàm kích hoạt hiện tại của bạn - đây là nơi duy nhất ảnh hưởng đến các phép tính.Step(zj(k+1))


Quay lại câu hỏi của bạn:

Nếu đạo hàm này là chính xác, làm thế nào điều này ngăn chặn sự biến mất?

Đạo hàm của bạn không đúng Tuy nhiên, điều đó không hoàn toàn giải quyết mối quan tâm của bạn.

Sự khác biệt giữa việc sử dụng sigmoid so với ReLU chỉ nằm ở chức năng bước so với ví dụ của sigmoid , được áp dụng một lần cho mỗi lớp. Như bạn có thể thấy từ các phương trình từng lớp ở trên, độ dốc của hàm truyền chỉ xuất hiện ở một nơi. Đạo hàm trường hợp tốt nhất của sigmoid thêm hệ số 0,25 (khi ), và nó trở nên tồi tệ hơn thế và bão hòa nhanh chóng đến gần đạo hàm 0 từ . Độ dốc của ReLU là 0 hoặc 1, và trong một mạng khỏe sẽ thường là 1 đủ để có ít mất độ dốc hơn trong quá trình truyền ngược. Điều này không được đảm bảo, nhưng các thí nghiệm cho thấy ReLU có hiệu suất tốt trong các mạng sâu.y(1y)x=0,y=0.5x=0

Nếu có hàng ngàn lớp, sẽ có rất nhiều phép nhân do trọng lượng, vậy điều này có gây ra sự biến mất hoặc nổ tung gradient không?

Vâng, điều này có thể có một tác động quá. Đây có thể là một vấn đề bất kể sự lựa chọn chức năng chuyển. Trong một số kết hợp, ReLU cũng có thể giúp kiểm soát độ dốc phát nổ, bởi vì nó không bão hòa (vì vậy các chỉ tiêu trọng lượng lớn sẽ có xu hướng là giải pháp trực tiếp kém và trình tối ưu hóa không có khả năng di chuyển về phía chúng). Tuy nhiên, điều này không được đảm bảo.


Là một quy tắc chuỗi được thực hiện trên ? dCdy^
dùng1157751

@ user1157751: Không, part part vì . Hàm chi phí C đủ đơn giản để bạn có thể lấy đạo hàm của nó ngay lập tức. Điều duy nhất tôi chưa thể hiện ở đó là sự mở rộng của hình vuông - bạn có muốn tôi thêm nó không? Cy^=Cr(1)y^=r(1)
Neil Slater

Nhưng là , chúng ta không cần thực hiện quy tắc chuỗi để có thể thực hiện đạo hàm trên ? , trong đó . Xin lỗi vì đã hỏi những câu hỏi thực sự đơn giản, khả năng toán học của tôi có thể gây rắc rối cho bạn: (C12(yy^)2y^dCdy^=dCdUdUdy^U=yy^
user1157751

Nếu bạn có thể làm cho mọi thứ đơn giản hơn bằng cách mở rộng. Sau đó, xin vui lòng mở rộng hình vuông.
dùng1157751

@ user1157751: Có, bạn có thể sử dụng quy tắc chuỗi theo cách đó và nó sẽ cho câu trả lời giống như tôi hiển thị. Tôi vừa mở rộng quảng trường - Tôi sẽ chỉ cho nó.
Neil Slater
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.