2015-04-04 13 views
5

Tôi đã viết một số mã để thực hiện backpropagation trong mạng thần kinh sâu với chức năng kích hoạt hậu cần và đầu ra softmax.Backpropagation với các đơn vị tuyến tính được chỉnh sửa

def backprop_deep(node_values, targets, weight_matrices): 
    delta_nodes = node_values[-1] - targets 
    delta_weights = delta_nodes.T.dot(node_values[-2]) 
    weight_updates = [delta_weights] 
    for i in xrange(-2, -len(weight_matrices)- 1, -1): 
     delta_nodes = dsigmoid(node_values[i][:,:-1]) * delta_nodes.dot(weight_matrices[i+1])[:,:-1] 
     delta_weights = delta_nodes.T.dot(node_values[i-1]) 
     weight_updates.insert(0, delta_weights) 
    return weight_updates 

Mã hoạt động tốt, nhưng khi tôi chuyển sang ReLU làm chức năng kích hoạt nó ngừng hoạt động. Trong thói quen backprop Tôi chỉ thay đổi đạo hàm của hàm kích hoạt:

def backprop_relu(node_values, targets, weight_matrices): 
    delta_nodes = node_values[-1] - targets 
    delta_weights = delta_nodes.T.dot(node_values[-2]) 
    weight_updates = [delta_weights] 
    for i in xrange(-2, -len(weight_matrices)- 1, -1): 
     delta_nodes = (node_values[i]>0)[:,:-1] * delta_nodes.dot(weight_matrices[i+1])[:,:-1] 
     delta_weights = delta_nodes.T.dot(node_values[i-1]) 
     weight_updates.insert(0, delta_weights) 
    return weight_updates 

Tuy nhiên, mạng không còn học được, và trọng lượng một cách nhanh chóng đi đến số không và ở lại đó. Tôi hoàn toàn bối rối.

+0

bạn có chắc chắn rằng bạn có đại diện đúng của đạo hàm không? – Ashalynd

+0

Tôi chắc chắn là tôi chắc chắn. Đạo hàm phải là 0 khi đầu vào là âm, 1 khi đầu vào là dương. ReLU không phải là khác biệt ở số không, vì vậy ở đây tôi giả định đạo hàm chỉ bằng 0. – GuillaumeDufay

+0

Nếu giá trị weight_matrices là <1, thì việc đặt đạo hàm thành 0 hoặc 1 có nghĩa là bạn đang giảm delta_node/delta_weights một cách có hệ thống trên mọi bước tiếp theo. Có thể bạn nên chuẩn hóa lại chúng không? – Ashalynd

Trả lời

4

Mặc dù tôi đã xác định nguồn gốc của sự cố, tôi sẽ bỏ qua vấn đề này trong trường hợp có thể có lợi cho người khác.

Vấn đề là tôi không điều chỉnh tỷ lệ của trọng số ban đầu khi tôi thay đổi chức năng kích hoạt. Trong khi các mạng logistic tìm hiểu rất tốt khi các đầu vào của nút gần bằng 0 và hàm logistic là xấp xỉ tuyến tính, các mạng ReLU tìm hiểu tốt cho các đầu vào lớn vừa phải cho các nút. Do đó, việc khởi tạo trọng lượng nhỏ được sử dụng trong các mạng logistic là không cần thiết và thực tế là có hại. Hành vi tôi thấy là mạng ReLU bỏ qua các tính năng và cố gắng tìm hiểu sự thiên vị của tập huấn luyện độc quyền.

Tôi hiện đang sử dụng trọng số ban đầu được phân phối thống nhất từ ​​-5 đến .5 trên bộ dữ liệu MNIST và đang học rất nhanh.

Các vấn đề liên quan