Xử lý sự cố khi triển khai mạng thần kinh


7

Tôi đã trải qua khóa học về máy học Standford / Coursera ; và nó đã diễn ra khá tốt. Tôi thực sự quan tâm đến sự hiểu biết về chủ đề hơn là đạt điểm từ khóa học và vì thế tôi đang cố gắng viết tất cả các mã bằng ngôn ngữ lập trình mà tôi thông thạo hơn (điều mà tôi có thể dễ dàng tìm hiểu rễ của).

Cách tôi học tốt nhất là làm việc thông qua các vấn đề, vì vậy tôi đã triển khai một mạng lưới thần kinh và nó không hoạt động. Tôi dường như nhận được cùng một xác suất của mỗi lớp không phân biệt ví dụ kiểm tra (ví dụ 0,45 của lớp 0, 0,55 của lớp 1, không phân biệt các giá trị đầu vào). Kỳ lạ thay, đây không phải là trường hợp nếu tôi loại bỏ tất cả các lớp ẩn.

Đây là một bản tóm tắt về những gì tôi làm;

Set all Theta's (weights) to a small random number

for each training example

set activation 0 on layer 0 as 1 (bias)
set layer 1 activations = inputs

forward propagate;
 Z(j+1) = Theta(j) x activation(j)  [matrix operations]
 activation(j+1) = Sigmoid function (Z(j+1)) [element wise sigmoid]

Set Hx = final layer activations

Set bias of each layer (activation 0,0) = 1

[back propagate]
calculate delta;
delta(last layer) = activation(last layer) - Y  [Y is the expected answer from training set]

delta(j) = transpose(Theta(j)) x delta(j+1) .* (activation(j) .*(Ones - activation(j))

[where ones is a matrix of 1's in every cell; and .* is the element wise multiplication]
[Don't calculate delta(0) since there ins't one for input layer]


DeltaCap(j) = DeltaCap(j) + delta(j+1) x transpose(activation(j))

Next [End for]

Calculate D;

D(j) = 1/#Training * DeltaCap(j) (for j = 0)

D(j) = 1/#Training * DeltaCap(j) + Lambda/#Training * Theta(j) (for j = 0)


[calculate cost function]

J(theta) = -1/#training * Y*Log(Hx) + (1-Y)*log(1-Hx) + lambda/ (2 * #training) * theta^2

Recalculate Theta

Theta = Theta - alpha * D

Đó có lẽ không phải là một thỏa thuận tuyệt vời để tiếp tục. Nếu ai đó có thể cho tôi biết nếu có bất kỳ lỗ hổng lớn nào trong mã của tôi thì thật tuyệt vời, nếu không thì một số ý tưởng chung về việc tôi có thể sai ở đâu / làm thế nào để gỡ lỗi một thứ như thế cũng sẽ rất tuyệt.

BIÊN TẬP:

Dưới đây là hình ảnh nhanh về mạng (bao gồm cả trường hợp kiểm tra đầu vào và phản hồi) (đây là sau 1 triệu lần lặp lại độ dốc);

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

Tập dữ liệu tôi đã sử dụng là hai điểm thi là x và thành công / thất bại khi vào trường đại học là y. Rõ ràng hai điểm kiểm tra là 0 có nghĩa là thất bại khi vào đại học, tuy nhiên, mạng cho thấy 56% cơ hội lấy điểm 0 là đầu vào.

Chỉnh sửa # 2;

Tôi đã chạy một thuật toán kiểm tra độ dốc với các loại kết quả sau;

Tính toán số: -0.0074962585205895493 Giá trị từ nhân giống: 0.62021047431540277

Tính toán số: 0,0032635327218463476 Giá trị từ lan truyền: -0.39564819922432665

vv Rõ ràng có điều gì đó sai ở đây; Tôi sẽ làm việc thông qua nó.


1
Làm thế nào để bạn khởi tạo trọng lượng? Bạn đã thử kiểm tra độ dốc được tạo ra bởi thuật toán backprop của bạn (điều này liên quan đến việc chạy mạng chuyển tiếp nguồn cấp dữ liệu nhiều lần, với một biến thể nhỏ trong mỗi trọng lượng và đo lường sự khác biệt ở đầu ra)?
Neil Slater

@NeilSlater Tôi khởi tạo các trọng số như sau: rnd () × 2 × e -e [về cơ bản chọn một số nhỏ giữa -e và e trong đó e chỉ là một giá trị gần bằng 0]. Tôi chưa thực hiện kiểm tra độ dốc, tôi chưa rõ ràng 100% về quy trình đó. Tôi thực hiện âm mưu J (theta) và J (theta) 1-J (theta) 0 [J hiện tại (theta) - cuối cùng].
FraserOfSmeg


Theo như tôi thấy, không có lỗ hổng lớn trong mã của bạn. Tuy nhiên, nhiều điều nhỏ có thể đi sai. Tôi khuyên bạn trước tiên hãy thử triển khai mã bằng cách sử dụng mã bộ xương được cung cấp, ví dụ: ex4.m, v.v. Đặc biệt, sử dụng sigmoidGradient.m có thể giúp bạn kiểm tra xem tính toán độ dốc của bạn có đúng không.
yuqian

Câu trả lời:


1

Là đầu vào của bạn mở rộng ? Không làm như vậy có thể khiến trọng lượng ngay lập tức nổ tung.

Đó là thực tế phổ biến để tiền xử lý đầu vào của bạn nằm trong khoảng -1 đến 1 hoặc ít nhất là trong phạm vi đó. Nếu không, bạn đang có nguy cơ độ dốc của bạn phát nổ hoặc biến mất (được đề cập ở đây ).


Cảm ơn về đầu vào (ý định chơi chữ) nhưng vì cả hai đầu vào đều có điểm số trong số 100 cả hai tính năng có cùng tỷ lệ nên không cần phải chia tỷ lệ (ít nhất đó là sự hiểu biết của tôi?). Tuy nhiên, tôi cũng đã nghĩ về điều này và tôi đã thử nó với mỗi giá trị được chia tỷ lệ từ 0 đến 1 (điểm / 100) nhưng các vấn đề tương tự đã nảy sinh.
FraserOfSmeg

Bạn đã xem kích hoạt của mỗi lớp trong một vài lần lặp chưa?
jamesmf
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.