炼丹小结

  2019-1-20 


  1. 40层网络的参数比4层网络多10倍 因为每层都有参数
    所以batch size也要相应的减小!不然太大了

  2. train loss 一直处于一个摇摆(震荡)状态可能是学习率设置过大导致的

  3. 如何选择神经网络的自适应优化算法:

    SGD:随机梯度下降
    SGD+Momentum: 基于动量的SGD(在SGD基础上做过优化)
    SGD+Nesterov+Momentum:基于动量,两步更新的SGD(在SGD+Momentum基础上做过优化)
    Adagrad:自适应地为各个参数分配不同学习速率
    Adadelta: 针对Adagrad问题,优化过的算法(在Adagrad基础上做过优化)
    RMSprop:对于循环神经网络(RNNs)是最好的优化器(在Adadelta基础上做过优化)
    Adam:对每个权值都计算自适应的学习速率(在RMSprop基础上做过优化)

    如果数据输入量很小,那就选一种自适应学习速率的方法(如Adam)。这样你就不用对学习速率进行调优,因为你的数据本来就小,NN学习耗时也小。这种情况你更应该关心网络分类的准确率;
    对于稀疏数据集,应该使用某种自适应学习率的方法(如Adam),且另一好处为不需要人为调整学习率,使用默认参数就可能获得最优值;
    如果想使训练深层网络模型快速收敛或所构建的神经网络较为复杂,则应该使用自适应学习速率的方法(如Adam),通常它们收敛起来比较快,实际效果更优;

    Adam在不同超参数下的鲁棒性较好,不过有时可能需要调整下η值。Adam算法中的超参数β1和β2以及learning-rate也会显著影响模型,有时需要调试

    RMSprop, Adadelta, 和 Adam 非常相似,在相同的情况下表现都很好,但偏置校验让Adam的效果稍微比RMSprop好一点;

    如果不知道为你的神经网络选择哪种优化算法,就直接选Adam

    [Insofar, Adam might be the best overall choice.]

    上面的结论都未必正确,重在自己的实践

    (本段总结自 神经网络优化算法的选择

  4. 超参数搜索

    python有超参数自动搜索模块

    sklearn.model_selection

    Python超参数自动搜索模块GridSearchCV上手
    ML模型超参数调节:网格搜索、随机搜索与贝叶斯优化

  5. 基于要解决的问题类别,神经网络的最后一层通常是确定的.

    • 回归问题: 最后使用一个有输出的线性层,输出的值是连续的.
    • 二分类问题:最后使用sigmoid激活函数, 因为它的输出值不是接近1就是接近0
    • 对于多分类问题,网络最后使用softmax层. 它从前一先行层获取输入,并输出给定数量样例上的概率. (所有概率相加的总和必然为1)
      (当然如果二分类问题想要输出概率也可以用softmax)
  6. BN(Batch Normalization)是个好文明

  7. 损失函数选择
    对于回归问题,通常使用MSE(均方误差)
    对于分类问题,通常使用交叉熵
    (MSE对于每一个输出的结果都非常看重,而交叉熵只对正确分类的结果看重。)
    其他的

    | 损失函数 | 通常用法 |
    | —- | —- |
    | L1 loss | 通常作为正则化器使用 |
    | MSE loss | 均方误差损失,用于回归问题的损失函数 |
    | Cross-entropy loss | 交叉熵损失,用于二分类和多分类问题 |
    | NLL Loss | 用于分类问题,允许用户使用特定的权重处理不平衡数据集 |
    | NLL Loss2d | 用于像素级分类,通常和图像分割问题有关|
    注意
    若使用了nn.CrossEntropyLoss() 函数,则最后一层就不应该使用softmax函数!
    这个函数包含了log_softmax,其操作为“使用对数似然损失函数和log_softmax激活函数进行DNN分类输出” CrossEntropyLoss()=log_softmax() + NLLLoss()
    但是,使用log_softmax运算是在output输出进入损失函数的时候。如果要获取输出概率,那就得在得到outputs后,在网络外面单独求一个F.softmax(outputs.data,dim=1)(但若使用log_softmax() + NLLLoss(), log_softmax函数是在网络里的(获得网络输出之前),所以不需要在网络外面单独求softmax)
    ②损失函数 CrossEntropyLoss() 与 NLLLoss() 类似
    损失函数NLLLoss() 的 输入 是一个对数概率向量和一个目标标签. 它不会为我们计算对数概率,适合最后一层是log_softmax()的网络.

  8. log_softmax和softmax的选择
    损失函数NLLLoss() 的 输入 是一个对数概率向量和一个目标标签. 它不会为我们计算对数概率,适合最后一层是log_softmax()的网络.
    用了log_softmax得到的结果是对softmax求次对数(并非采用直接求 ,而是一种较快的方式)

  9. 一般用loader加载的时候,num_workers使用少于机器内核数量的woker是一个通用的实践

  10. 权值增速比 0.01比较好

  11. 网络结构中的参数计算
    O=输出图像的尺寸 output
    I=输入图像的尺寸 input
    K=卷积层的核尺寸 kernal
    N=核数量 number of kernal
    S=移动步长 strike
    P =填充数 padding
    ①想要con2d卷积出来的图片尺寸没有变化,

    每层连接的参数计算:详细解释CNN卷积神经网络各层的参数和链接个数的计算
    ②输出图像的大小计算
    输出图像尺寸的计算公式如下:

  12. Softmax 是神经网络中另一种输出层函数,计算输出层的值。主要用于神经网络最后一层,作为输出层进行多分类,是Logistic二分类的推广。也可以单独使用。

  13. batch size的选择
    训练神经网络时如何确定batch size

  14. 学习率变更策略
    如何选择最适合你的学习率变更策略

  15. 神经网络权值初始化

    神经网络初始权值不能全部设置一样,否则学不到
    深度学习中神经网络的几种权重初始化方法

  16. 常见学习率选择策略

    | 策略 | 解释 |
    | —- | —-|
    | StepLR | 步长规则,学习率倍数变化(步长内变gamma倍) |
    | MultiStepLR | 步长不规则,学习率倍数变化 |
    | ExponentialLR | 步长为1,学习率乘数变化 |
    | ReduceLROnPlateau | 常用。当特定的度量指标,如训练损失、验证损失或准确率不再变化时,学习率就会改变。通用实践是降为原来的1/2~1/10 |

  17. 池化/卷积 与 ReLU的顺序
    在最大池化之后或者在应用卷积之后使用非线性层是通用的最佳实践

  18. FC, dropput都是可以有多层,不是只能用一层

  19. 深度学习的11个常见陷阱应对方法总结

    神经网络 11 大常见陷阱及应对方法


且听风吟