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.
bạn có chắc chắn rằng bạn có đại diện đúng của đạo hàm không? – Ashalynd
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
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