什么使(太大)神经网络发散?

时间:2018-03-11 18:08:40

标签: python numpy machine-learning neural-network backpropagation

我构建了一个只有6个输入和8个类的神经网络(NN)(因此它是一个分类器I' m)。

提供更多背景资料: 训练样本的数量是80,000个样本,开发/交叉验证集合大小(我知道这不是一个很好的分割,但是为了将我的输出与我同事的输出进行比较,我必须保持列车/开发设置不变)。输入要素遵循相对明确定义的概率密度函数,尽管不是高斯函数。

由于相对于特征数量的大量输入,数据集实际上是不可能的'过度配合,我还没有成功做到这一点(即使有非常大的网络)。这是直观正确的,因为功能pdf的重叠和密集足以防止曲线循环收集越来越多的样本。

现在,既然我喜欢测试算法的极限以及我的NN,我已经进行了为期一周的蒙特卡洛会议,改变了所有参数,包括层数和数量每层节点作为超参数。

我注意到在很多情况下(当每层的层数和节点数足够大时),NN会在一段时间后收敛(让我们说300次交互),然后达到平衡,但是经过几百次迭代后,它开始发散并变得不稳定(不平滑且显示大跳跃)。

我从基本的NN理论知道,对于我描述(6个输入,8个类)的情况,一个具有大约10个节点的隐藏层应该足够(并且顺便说一下),但我希望NN具有更多层并且每层具有更多节点,至少不发散并且大致保持在最小值附近。

特别是,因为当梯度为零时,步长必须按定义为零,对吧?或者我错过了什么?

现在我的问题有两个:

  1. 是否有一些理论可以预测NN何时分歧? 由于我将尝试通过(卷积)NN更适合解决的问题,我想至少对此事有一些了解。

  2. NN如何分歧?请注意,由于我已经使用渐变检查检查我的反向支持和事实上,较小的NN没有分歧,我对我的NN有信心(尽管我只使用numpy / python而没有像Keras / TensorFlow这样的自动反向框架)。

    2.1我已经感觉这是一个数字实现 thingy 但是,即使在这种情况下,我怎么能够阻止这种情况呢?任何信息,提示和技巧都将受到高度赞赏。

    2.2我的情况与大多数(计算机视觉)案例(猫分类器等)完全不同,因此少量的特征/输入也可能是一个因素。在计算机视觉网络中,功能的数量远远高于节点的数量,这与我的简单情况非常不同。

  3. 亲切的问候并提前感谢任何反馈。

    我的优化器是ADAM优化,我已经在numpy中实现了:

    def update_with_adam(W, b, dW, db, v_dW, v_db, s_dW, s_db, alpha, istep, beta_v=0.9, beta_s=0.999):
      """
      Update the parameters using ADAM optimization
      """
      eps = 1e-8
      nof_layers = len(W)
    
      for l in range(1, nof_layers):
    
        # Momentum
        v_dW[l] = beta_v*v_dW[l] + (1 - beta_v)*dW[l]
        v_db[l] = beta_v*v_db[l] + (1 - beta_v)*db[l]
    
        # rmsprop
        s_dW[l] = beta_s*s_dW[l] + (1 - beta_s)*(dW[l]**2)
        s_db[l] = beta_s*s_db[l] + (1 - beta_s)*(db[l]**2)
    
        # initialization corrections
        v_dW_corr = v_dW[l]/(1 - beta_v**(istep + 1))
        v_db_corr = v_db[l]/(1 - beta_v**(istep + 1))
    
        s_dW_corr = s_dW[l]/(1 - beta_s**(istep + 1))
        s_db_corr = s_db[l]/(1 - beta_s**(istep + 1))
    
        # delta modifiers
        dW_mod = v_dW_corr/(np.sqrt(s_dW_corr) + eps)
        db_mod = v_db_corr/(np.sqrt(s_db_corr) + eps)
    
        # update step
        W[l] = W[l] - alpha*dW_mod
        b[l] = b[l] - alpha*db_mod
    
      return W, b, v_dW, v_db, s_dW, s_db
    

    请注意,所有参数(W,b,v_dW等)都是列表,其中W [l]是第1层的权重(l = 0是输入层)

0 个答案:

没有答案