Kiểm tra Gradient số: Làm thế nào gần đủ?


8

Tôi đã tạo một mạng nơ ron tích chập và tôi muốn kiểm tra xem độ dốc của tôi đang được tính toán chính xác bằng cách sử dụng kiểm tra độ dốc số. Câu hỏi là, gần đến mức nào?

Hàm kiểm tra của tôi chỉ tạo ra đạo hàm được tính toán, đạo hàm gần đúng bằng số, sự khác biệt giữa hai giá trị và liệu hai giá trị có cùng dấu hay không (một giá trị dương và giá trị âm khác là không có) cân nặng.

Mối quan tâm chính mà tôi có là đối với tất cả các lớp được kết nối đầy đủ và tất cả các lớp chập trừ lớp đầu tiên, sự khác biệt trông giống nhau - 9-13 ký tự đầu tiên của hai số sẽ khớp. Điều đó nghe đủ tốt, phải không? Nhưng đối với các trọng số của lớp chập đầu tiên, đôi khi tôi nhận được tới 12 vị trí thập phân để khớp nhưng nó cũng có thể thấp đến mức 3. Điều đó có đủ không, hoặc có thể có lỗi không?

Một điều tốt cần lưu ý là dấu hiệu của hai giá trị luôn khớp nhau, do đó, mạng sẽ luôn thực hiện các bước di chuyển đúng hướng, ngay cả khi cường độ của chuyển động hơi lệch. Nhưng đó là câu hỏi ... có khả năng nó bị tắt không?

Câu trả lời:


9

Lần gần nhất tôi thấy để giải quyết vấn đề này là trong hướng dẫn UFLDL của Stanford trong phần hồi quy softmax . Sao chép câu lệnh chính:

Các chuẩn mực về sự khác biệt giữa gradient số và độ dốc phân tích của bạn nên được nhỏ, vào thứ tự của .109

Trong python, mã sẽ trông giống như thế này:

norm(gradients - numericalGradients)/norm(gradients + numericalGradients)

nơi gradientslà bạn kết quả từ đạo hàm và numericalGradientslà gradient xấp xỉ.


Cảm ơn, nếu gradient của tôi được lưu trữ trong ma trận mảng 2D thì sao? Sau khi tôi trừ 2 ma trận với nhau, tôi nên đánh giá định mức của ma trận "chênh lệch" như thế nào?
Kari

1
@Kari Tôi sẽ làm phẳng chúng thành các vectơ và sử dụng cùng một mã được hiển thị ở trên. Ví dụ, nếu bạn có một mảng numpy, bạn chỉ có thể sử dụng flattenphương thức.
cdeterman

7

Lý thuyết nền tảng hữu ích

Một thực tế nhỏ mà bạn có thể sử dụng để giúp hiểu liệu một đạo hàm số có được tính toán chính xác hay không là phần còn lại Cauchy của bản mở rộng Taylor. Đó là,

ξ[x,x+h]f(x+h)=f(x)+hf(x)+h22f(ξ)ξ[x,x+h]

Điều này rất hữu ích, vì có lẽ bạn đã xấp xỉ đạo hàm đầu tiên của mình bằng

f(x)f(x+h)f(xh)2h

với một số nhỏ (tôi thường sử dụng , nhưng tôi chắc chắn một ngày nào đó tôi sẽ gặp phải trường hợp không phù hợp).10 - 4h104

Sau một chút đại số, chúng ta có thể sử dụng phần còn lại Cauchy để thấy rằng về mặt lý thuyết gần đúng số của chúng ta phải nằm trong của .f ( x )hf(ξ),ξ[xh,x+h]f(x)

Trên thực tế, bạn thực sự có thể ràng buộc nó bằng , trong đó và ... tương đương với , .ξ 1[ x - h , x ] ξ 2[ x , x + h ] h 2 f ( ξ ) ξ [ x - h , x + h ]h(f(ξ1)f(ξ2))ξ1[xh,x]ξ2[x,x+h]h2f(ξ)ξ[xh,x+h]

Vấn đề trong thực tế

Được rồi, chúng tôi có lý thuyết tốt đẹp ràng buộc lỗi của đạo hàm số. Nhưng có hai lỗ hổng khi trực tiếp cố gắng sử dụng các kết quả đó:

1.) Chúng tôi không biết (và có lẽ không muốn dành thời gian xấp xỉ nó)f(x)

2.) vì , bị mất ổn định sốf ( x + h ) - f ( x - h )h0f(x+h)f(xh)2h

Vì vậy, bằng cách sử dụng những gì chúng ta biết từ trước đó, cách tôi kiểm tra các đạo hàm phân tích của mình (có thể không phải là cách tốt nhất) là tôi viết hàm đạo hàm số dưới dạng hàm của . Nếu tôi không thể biết được sự khác biệt giữa các đạo hàm số và phân tích là do lỗi mã hóa hay chỉ là xấp xỉ số, tôi có thể giảm và xem liệu đạo hàm số của mình có tiếp cận đạo hàm phân tích của tôi hay không trước khi mất ổn định số (khi điều này xảy ra, các xấp xỉ số của bạn sẽ trở nên ít nhất quán hơn khi trở nên nhỏ hơn). Lưu ý rằng thuật ngữ sẽ biến mất theo phương trình bậc hai, vì vậy nếu lỗi của tôi là khoảng vớih h f ( ξ ) 0,01 h = 10 - 4 0,0001 h = 10 - 5hhhf(ξ)0.01h=104 , nó sẽ ở khoảng với giả sử không ổn định số chưa được kích hoạt .0.0001h=105

Thật không may, không có hướng dẫn cứng và nhanh để luôn xác định những điều này; nó phụ thuộc rất nhiều vào mức độ ổn định của hàm (và ý tôi là cả về độ ổn định số và đạo hàm cao hơn). Nhưng theo kinh nghiệm của tôi, tôi chưa bao giờ thấy trường hợp lỗi từ không dứt khoát về 0 (tức là sử dụng đã đưa ra câu trả lời gần giống như ) tại thời điểm mất ổn định số từ .h = 10 - 4 h = 10 - 5 h 0h2f(ξ)h=104h=105h0


5

Vui lòng tham khảo hướng dẫn này http://cs231n.github.io/neural-networks-3/#ensemble . Phần "Kiểm tra độ dốc" rất chi tiết và hữu ích.

Theo đề xuất của gung, tôi bao gồm các điểm chính của liên kết này:

  • Sử dụng xấp xỉ , trong đó .f(w+h)f(wh)2hh105

  • Theo dõi tỷ lệ của , trong đó là gradient phân tích và là gradient xấp xỉ bằng số. Thông thường, phạm vi ưa thích của phân số này sẽ . f ' một (w)f ' n (w)<10-2|fa(w)fn(w)|max(|fa(w)|,|fn(w)|)fa(w)fn(w)<102

  • Sử dụng độ chính xác kép thay vì nổi.

  • Tâm trí của kink (s) trong các chức năng kích hoạt, ví dụ: khi một người sử dụng ReLU. Khi có kink (s), người ta cần theo dõi các giá trị của và . Nếu hai giá trị này nằm ở hai phía của một nút xoắn, người ta nên loại trừ kiểm tra độ dốc này.x - h x + hx=0xhx+h

  • Sử dụng một vài datapoint.

  • Không thực hiện kiểm tra độ dốc ở giai đoạn đầu của quá trình đào tạo.

  • Đầu tiên kiểm tra mô hình mà không cần chính quy và sau đó với nó.

  • Tắt bỏ học và bỏ học ngược khi thực hiện kiểm tra độ dốc.

  • Chỉ kiểm tra ngẫu nhiên vài kích thước.

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.