带整流线性单元的反向传播

Gui*_*fay 5 python numpy backpropagation neural-network

我已经编写了一些代码来实现具有逻辑激活函数和softmax输出的深度神经网络中的反向传播.

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
Run Code Online (Sandbox Code Playgroud)

代码运行良好,但当我切换到ReLU作为激活功能时,它停止工作.在backprop例程中,我只更改激活函数的导数:

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
Run Code Online (Sandbox Code Playgroud)

然而,网络不再学习,并且权重很快变为零并保持在那里.我完全难过了.

Gui*_*fay 5

虽然我已经确定了问题的根源,但我会留下它,以防它可能对其他人有益.

问题是当我改变激活功能时,我没有调整初始权重的比例.虽然物流网络在节点输入接近零并且逻辑函数近似为线性时非常好地学习,但ReLU网络可以很好地学习到节点的中等大量输入.因此,在物流网络中使用的小权重初始化不是必需的,实际上是有害的.我看到的行为是ReLU网络忽略了这些功能,并试图专门学习训练集的偏见.

我目前正在使用MNIST数据集中从-.5到.5均匀分布的初始权重,并且它正在快速学习.