机器学习基础复习
都是好久之前学的了,都快忘光了,还需要加强理解,再复习一下。
一、梯度消失与梯度爆炸?
产生原因
- 梯度消失的原因:一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。在误差反向传播的过程中,神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新,这就是梯度消失。
梯度爆炸的原因:梯度爆炸就是由于初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。
解决方法
- 使用ReLu修正非线性函数。ReLu函数其求偏导是1,所以不会发生梯度消失、梯度爆炸。
- 采用权重正则化。比较常见的是L2正则化。
- 重新设计网络模型。在深度神经网络中,梯度爆炸可以通过重新设计层数更少的网络来解决。使用更小的批尺寸对网络训练也有好处。另外也许是学习率的原因,学习率过大导致的问题,减小学习率。
二、为什么一定要用激活函数
- 执行数据的归一化,将输入数据映射到某个范围内,再往下传递,这样做的好处是可以限制数据的扩张,防止数据过大导致的溢出风险。
- 激活函数的主要作用是完成数据的非线性变换,如果网络中全部是线性变换,则多层网络可以通过矩阵变换,直接转换成一层神经网络。所以激活函数的存在,使得神经网络的“多层”有了实际的意义,使网络更加强大,增加网络的能力,使它可以学习复杂的事物,复杂的数据,以及表示输入输出之间非线性的复杂的任意函数映射。
- 那么如果不进行非线性变换不可以吗???当然不可以呀。如果用线性激活函数,或者叫恒等激活函数,那么神经网络只是把输入的线性组合再输出,这样“多层”不就没有了意义嘛。。
三、Relu
- Relu公式 f(x)=max(0,x)。由公式可以看出,Relu其实就是个取最大值的函数。其实呢,Relu是“单侧抑制”,即在输入是负值的情况下,它会输出0,那么神经元就不会被激活。这意味着同一时间只有部分神经元会被激活,从而使得网络很稀疏,进而对计算来说是非常有效率的。
- Relu好处很多,例如没有饱和区,不存在梯度消失问题。没有复杂的指数运算,计算简单、效率提高。实际收敛速度较快,比 Sigmoid/tanh 快很多。
- Relu也有缺点的。就是训练的时候很”脆弱”,很容易就”die”了. 举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这个情况发生了,那么这个神经元的梯度就永远都会是0.实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
四、过拟合与欠拟合
我们在“一”讲解梯度消失与梯度爆炸问题解决中,使用了正则化,其实,正则化在过拟合与欠拟合中也有一定的作用。
- 过拟合。当学习器把训练样本学习的“太好”了的时候,很有可能已经把训练样本自身所具有的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化能力下降。其实也就是指模型很好的拟合了训练集,而在验证集上结果较差,泛化能力弱。
- 过拟合产生原因。学习能力过于强大、特征太多、模型过于复杂、训练数据太少、数据中存在噪音
- 欠拟合。可能训练样本被提取的特征比较少,导致训练出的模型不能很好的匹配,表现的很差,甚至样本本身都无法高度识别。模型在训练集和验证集上结果都比较差,不能很好地拟合数据。
- 欠拟合产生原因。模型复杂度太低、数据特征太少
解决欠拟合与过拟合方法
- 过拟合解决方法。使用正则化;(1)数据集扩增;(2)限制训练时间;(3)使用Dropout。
- 欠拟合解决方法。(1)添加其他特征项;(2)添加多项式特征,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强;(3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数;(4)增加模型复杂度
五、L1,L2正则化
正则化方法是在原目标(代价)函数 中添加惩罚项,对复杂度高的模型进行“惩罚”。
- 通过降低模型的复杂性, 达到避免过拟合的问题。L1将很多权重变成0,这样起到作用的因素就会减少。L2使权重都趋于0,这样就不会有某个权重占比特别大。
- 公式原理。L1和L2都是在求loss的时候,加入到loss的求解过程中,得到被惩罚后的loss,再让loss对权重求导,得到更新值,最后原权重减去学习率和更新值的乘积,最终得到权重的更新值,完成反向传播过程,进行新一轮的训练。
六、Dropout
- Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征
- 工作流程。(1)首先以一定的概率p随机删除掉网络隐藏层中的神经元(暂时死亡),输入输出神经元保持不变。(2)然后把输入x通过修改后的网络前向传播,把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。(3)然后继续重复这一过程:恢复被删掉的神经元;从隐藏层神经元中随机选择一个一半大小的子集临时删除掉;没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果
七、梯度下降(网络优化)
- 梯度下降法是最重要的一种方法,也是很多其他优化算法的基础。这里的损失函数 J(θ) 是在整个数据集上进行计算得到的。因为这里的损失函数是在整个数据集上进行计算得到的均值,所以每更新一次模型参数,就要对整个数据集进行一个计算,可想而知这样非常的慢,并且当数据集变得非常大的时候,如此多的数据没法都 load 到内存中。对于凸目标函数,肯定可以找到全局最优,对于非凸目标函数,可以找到局部最优,每次更新都对整个数据集进行计算,计算量大。
- 随机梯度下降法和梯度下降法其实是走的两个极端,梯度下降法是每次更新都计算整个数据集的 loss,而随机梯度下降法每次更新都只用了一对样本,由于每个样本都会对模型进行更新,所以模型更新的特别频繁,参数就会变成高方差,损失函数的波动也会有很大强度的变化。有时候,这是好事,因为这样的可以帮助我们探索新的更新方向,找到更加好的局部极值点。但是,由于频繁的更新和波动,会导致模型的损失收敛的非常不稳定。
- Mini-Batch 梯度下降法(小批量梯度下降法)每次同时处理固定大小的数据集。mini batch 梯度下降法是梯度下降法和随机梯度下降法的折衷,即在计算 loss 的时候,既不是直接计算整个数据集的 loss,也不是只计算一个样本的 loss,而是计算一个 batch 的 loss,batch 的大小自己设定。综合上述两种方法,面对大数据情况,每次使用一部分数据来计算,并且优化网络,而不是只用一个数据或者全部数据。这样,计算速度得到了大大提高,同时又一定程度上避免了噪声干扰问题(还有有一些)。考虑到计算机储存方式问题,每个小批量的 size 一般取 64、128、512、1024 等,这样计算会更快(未验证)
- Adam优化器是一种可以替代传统随机梯度下降过程的一阶优化算法,他能基于训练数据迭代的更新神经网络权重。
总结
下一章会介绍神经网络与计算机基础相关知识。
|