一. 为什么需要激励函数首先,为什么需要激励函数(Activation Function)呢? 因为现实并没有我们想象的美好,激励函数是为了解决我们日常生活中不能用线性概括的问题而提出,如二分类问题。假设女生越漂亮,喜欢的男生人数越多,这是一个线性方程(Linear)问题,但假设场景发生在校园里,校园里男生人数有限,这就变成了一个非线性问题,并且女生不可能是无线漂亮的。 神经网络中的每个节点接受输入值,并将输入值传递给下一层,输入节点会将输入属性值直接传递给下一层(隐层或输出层)。在神经网络中,隐层和输出层节点的输入和输出之间具有函数关系,这个函数称为激励函数。
非线性方程:y = AF( W · x )
二. 什么是过拟合实际生活中,机器学习过于自信,甚至自负,在自己的小圈子里非凡,但在大圈子里却处处碰壁。机器学习中的自负表现在哪些方面呢?
这条直线是希望机器学习学到的直线。假设蓝色直线与所有黄色点的总误差为10,有时机器过于追求误差小,它学到的可能是红色这条虚曲线,它经过了所有的数据点,误差为1。 可是,误差小真的好吗?当我们拿这个模型预测实际值时,如下图所示“+”号;这时,蓝色误差几乎不变,而红色误差突然升高,而红线不能表达除训练数据以外的数据,这就叫做过拟合。
那么,怎么解决过拟合呢? L2:cost = (Wx - real y)^2 + (W)^2 =>L2正规化是预测值与真实值平方,加上W的平方 方法三:Droput Regularization 该方法是训练时,随机忽略一些神经元和连接,神经网络会变得不完整,用不完整的神经网络训练一次,紧接着第二次再随机训练,忽略另一部分的神经元和连接,让每次结果不依赖特定的神经元,Droput从根本上解决过拟合。
三. 加速神经网络Speed Up neural network training process 越复杂的神经网络,越多的数据,我们需要花费在神经网络上的时间就越多,其原因是计算量太大了,可是往往为了解决复杂的问题、复杂的结构和大数据,又是不可避免的。所以我们需要找一些方法,让神经网络变得聪明起来、快起来。
最简单方法:SGD(Stochastic Gradient Descent) 假设红色方块是我们要训练的数据Data,如果使用普通的训练方法,需要重复的将整套数据放入神经网络NN中训练,这样消耗的计算资源会很大。我们需要换一种思路,将数据拆分成小批小批的,然后再分批不断放入NN中计算,这就是SGD的正确打开方式。 SGD每次使用批量数据,虽然不能反映整体数据的情况,但在很大程度上加速神经网络的训练过程,而且不会丢失太多准确率。
如果还是嫌SGD训练速度太慢,怎么办呢? 方法二:Momentum 大多数其他方法是在更新神经网络参数时动手脚,如下所示: W += - Learning rate * dx 参数W的更新,是将原始W累加上一个负的学习效率(Learning rate)乘以校正值(dx),这种方法可能会让学习过程曲折无比,看起来就像一个喝醉酒的人回家时摇摇晃晃走了很多弯路,所以我们把这个人从平地上放到斜坡上,只要他往下坡的方向走一点点,由于向下的惯性,他走的弯路也会不自觉的变小 ,称为Momentum的方法,它的数学形式如下所示。m = b1*m - Learning rate * dx W += m 方法三:AdaGrad v += dx^2 W += -Learning rate * dx / √v 方法四:RMSProp 如果把下坡和不好走的鞋子结合起来,是不是就更好呢?我们这就有了RMSProp方法,通过Momentum的惯性原则,加上AdaGrad对错误发生了阻力,就合并成如下所示的RMSProp,同时具有两则优点。 不过细心的同学可能发现了RMSProp中少了些什么?原来我们是没有完全合并Momentum,少了Momentum中的“-Learning rate * dx”部分,所以我们会在Adam中补上这种想法。 计算m时有Momentum的下坡属性,计算v时有AdaGrad的阻力属性 ,然后再更新参数时,把m和v都考虑进去。实验证明,大多数使用Adam都能又快又好的达到目标,迅速收敛,所以在加速神经网络训练时,一个下坡,一双破鞋,就能实现。 |
|
来自: LibraryPKU > 《机器学习》