AI研习图书馆,发现不一样的世界

炼丹笔记

深度学习炼丹笔记四

一、深度学习建模与调试流程

首先,我们需要查看训练集上的模型表现结果怎么样。当然,一些特殊的机器学习模型没必要这么做,比如决策树、KNN、Adaboost 之类的传统算法,理论上在训练集上一定能做到完全正确,因此没有必要进行检查的。

Deep Learning 里面过拟合并不是首要的问题,或者说想要把神经网络训练得好,至少先在训练集上结果非常好,再考虑那些改善过拟合的技术(BN,Dropout 之类的)。否则的话就要去检查三个 step 哪里有问题,如下图所示。

 

如何使用深度学习训练好的模型做预测 深度模型训练过程_在西瓜数据集上训练

Deep Learning 中的方法一般是为了解决两个主要问题而提出,即:

  • 训练集做得不好;
  • 训练集做得好,测试集做得不好。

实际应用的时候首先要搞清楚自己面对的问题,选择对应的技巧。 二、激活函数 1. sigmoid

梯度消失:网络很深的时候,靠近输入的 hidden layers 的梯度对损失函数影响很小, 参数更新的就很慢;靠近输出的情况反之。前面几层的参数都还没怎么更新的时候就收敛了。

原因也比较简单,反向传播的时候每经过一层,都会乘上小于 1 的数(sigmoid 函数会把输入压到 0~1 之间),结果就越来越衰减。

可以早期用 RBM ,先训练好前面几层。

2. ReLU计算快;有些生物学的来源;相当于无穷多个不同偏置的sigmoid函数叠加;不存在梯度消失。

输出要么是0,要么是输入本身,相当于把原来的网络变成一个 thinner linear network。

这样网络还是非线性的吗?  是。只要输入的变化比较大,跨越函数分段,网络依旧具有非线性。 好像不可微? 

确实。但做浮点运算也几乎不会正好要在原点处计算微分,所以直接忽略这个问题。

一些变种,网上有人亲测过确实会有提升,不过我目前还没有尝试。

如何使用深度学习训练好的模型做预测 深度模型训练过程_训练损失越来越大_02

3. maxout network

每个神经元的激活函数的具体形式,是可以学习来的(不一定非得像 ReLU 那样在原点分段):


如何使用深度学习训练好的模型做预测 深度模型训练过程_深度学习训练损失为none_03

哪些神经元要被 group 起来是事先决定的(比如随机2个或者3个一组之类的,几个一组也可以作为一个参数来学习)。


如何使用深度学习训练好的模型做预测 深度模型训练过程_深度学习训练损失为none_04

ReLU 就是特殊情况下的 maxout ;但 maxout 可以实现更多可能的激活函数(具体是什么样的函数,根本上是由参数 w 决定的)。 怎么训练?

给定一个输入,是能够知道每次取 max,留下的是哪一条路径。训练去掉不作用的神经元之后的“瘦长”的线性网络就行了。

怎么保证参数都能被更新?

训练的时候每次给不同的输入数据,去掉的神经元是不一样的。所以一直给不同的输入,差不多每个参数都会被更新到。

初闻不知曲

中意,再听已是曲中人~

祝你深度学习快乐~~