吴恩达机器学习系列课程笔记——神经网络
该系列笔记内容是楼主在观看课程时记录的,其中图片是视频中ppt的截图,内容仅供参考,有问题欢迎大家指出。
目录
1. 神经元结构
- 神经网络中节点结构是仿照生物中神经元构造的,其中包括多输入单元(input unit)和一个输出(output),参数θ也称为权重
- 上图中假设函数是逻辑回归函数,但是这是以前默认的情况,目前整流函数(ReLu)以及其拓展变形函数(如Leaky ReLu)逐渐成为了主流的深度学习**函数
2. 神经网络结构
- 神经网络结构表示不同神经元连接方式,其中主要包括三大层:第一层是输入层(input layer),第二层是隐藏层(hidden layer),最后一层是输出层(output layer)
- 三层中,只有隐藏层的值在训练集里看不到,且神经网络可能包含多个隐藏层
- 默认情况下,隐藏层仅有1层,若有多层则默认每层神经元数量相等,且隐藏层神经元尽量大于等于输入特征数
- 理论上神经元个数越多效果会越好,但同时计算量也会越大,耗费的资源也越多
- 上图为三层神经网络例子的假设函数,其中假设函数是随着Θ的变化而变化,Θ是一个大小为下一层的神经元个数sj+1 ×(当前层神经元个数sj + 1)的矩阵(+1是因为有x0这个偏差单位(Bias Unit))
3. 前向传播(Forward Propagation)
- 如上图所示,计算神经网络假设函数h(x)的过程称为前向传播,其中表示第 层中的第 个神经元计算的预测值,即设g函数中的式子为,将参数都向量化则(此时没有),第 层整体预测向量为,在计算下一层前将向量加上偏差 ,再进行传递
- 若单独地看每个前一层与下一层某个神经元,其计算公式与逻辑回归模型的假设函数公式一样(除了参数和特征的表示不同以外)
3.1 例子
3.1.1 简单模型(逻辑运算)
- 上图为使用两层(即无隐藏层)神经网络计算 x1and x2 的情况(单输出用0或1表示)
- 上图为使用三层(一层隐藏层)神经网络计算逻辑运算异或操作,其可以拆解为对x1和x2以及x1和x2分别先做与运算,最后再通过或运算得到异或关系
- 通过上面的例子可以发现,在预期得到负结果的变量前设置较大的负权重(Negative Weight),如x1 and x2将x1和x2的权重设为负值
3.1.2 复杂模型(多输出——分类问题)
- 如上图所示,复杂问题一般采用四层(两层隐藏层)的神经网络结构,比如多分类问题有多个输出(用向量表示,如[0,1,0,0]表示第二类),每个输出神经元表示一个类别
4. 反向传播算法(Backpropagation Algorithm)
反向传播算法是神经网络特有的求代价函数偏导的方法,该算法方便最优化算法的计算
- 如上图所示,其中表示第 层中第 j 个节点的误差,即相当于第 层激励值的误差;表示矩阵点乘,注意没有是因为输入(训练集没)有误差
P. S. 对其中原理感兴趣的同学可以看神经网络反向传播算法推导
- 上图是包括了正则化项的代价函数求偏导的简易步骤
- 上图带入了前向传播,更好的解释了每层误差来源以及反向传播算法的推导
4.1 梯度检验(Gradient Checking)
利用梯度检验以保证反向传播(或较为复杂的算法)的正确性
- 如上图所示,可以通过计算差分的形式来检验反向传播求得的偏导值是否准确,正常情况下其中ε的值越小越接近偏导,但计算时太小反而容易出现误差,一般可以取10-4作为阈值
- 在Θ为实数的情况下,双侧差分(Two-side Difference) 比 单侧差分(One-side Difference) 更准确一些
- Θ为向量的情况下,检查的做法与实数情况下相似,即求每个θ的差分情况,如上图所示;通过对比反向传播得到的结果向量D与Θ差分作比较,若两者结果相似则证明反向传播计算正确
- 梯度检验算法实现性能较差,一旦验证某次迭代成功后需及时停止使用,以保持反向传递算法的速度
5. 随机初始化(Random Initialization)
- 当执反向传播算法或最优化算法时,需要为θ取一些初始值;若每个θ值都相同,则会出现对称权重问题(Symmetric Weights),如上图所示,可以通过初始化θ在某个区间内随机取值以避免此类问题
6. 训练神经网络
总结一下神经网络训练过程,包括以下六个步骤
- 随机初始化权重值,常初始化为很小(接近0)的值
- 使用前向传播算法,计算对应特征的预测值
- 根据已知数据集和预测值计算损失函数
- 使用反向传播算法计算损失函数的偏导
- 使用梯度检查算法验证反向传播的正确性
- 使用最优化算法结合反向传播得到的偏导值计算最小损失时的参数值