目录
前言
这是吴恩达机器学习笔记的第四篇,第三篇笔记请见:
完整的课程链接如下:
推荐网站:
P61-P68
激活函数
激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数
sigmoid的替代品-ReLU
对于二进制分类问题,使用sigmoid激活函数或许是最好的选择,输出的刚好是标签为1的概率
在解决一个回归问题的时候,可以选择不同的激活函数,对于股票问题,可以选择普通的线性激活函数,对于其它的结果不为负的问题,可以选用ReLU
使用relu激活函数不仅本身计算快,而且可以使神经网络梯度下降得快一些
结合之前的神经网络例子,给出tensorflow代码:
在神经网络的隐藏层中需要使用非线性激活函数, 这是因为需要在网络中引入非线性来学习复杂的模式。 如果没有非线性激活函数,具有许多隐藏层的神经网络将成为一个巨大的线性回归模型,这对于从现实世界数据中学习复杂模式毫无用处。
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,即W = W3*[W2*(W1*x)]。
如果隐藏层不使用激活函数,仅在输出层使用sigmoid函数,那么效果仅仅和标准Logistic回归一样
Softmax算法
多分类问题:
softmax回归算法是logistics回归的推广
下面展示softmax的成本函数
softmax作为输出的激活函数可以使每个激活值都依赖于z的所有值,还是拿之前那个识别手写数字的例子来看
写成代码的形式:
数字精确度问题:
通过这个例子知道,虽然我们计算softmax成本函数的方法是正确的,还有一种更加准确的计算方法可以去减少误差
对于logistics回归
对于softmax
完整的tensorflow代码为:
多标签输出分类问题**(注意和多分类问题的区别)**
解决这种问题的一种方法是把它看作三个完全独立的机器学习问题,建立神经网络检测是否有车?是否有公交?等
还有一种方法是训练一个可以直接输出三个结果的神经网络
P69-P73
Adam算法
梯度下降是一种最小化成本函数的方法,下面介绍其它的方法
有一种方法叫做Adam algorithm可以自动调整学习率
算法的原理是:如果w和b能够朝着一个大致相同的方向移动,那么就提高学习率,反之,降低学习率,将其应用在MNIST的例子中,代码如下:在compile中增加一个优化器的参数即可,同时包含了初始的学习率
更多类型的层
到目前为止,我们使用的所有神经网络层都是密集层型的,下面给出一个不同类型的神经网络层的例子
密集层
卷积层
卷积神经网络
卷积神经网络(CNN)是一种深度学习模型,主要用于处理具有类似网格结构的数据,如图像。CNN通过使用卷积层自动学习空间层次的特征,无需手动特征提取。卷积层内的卷积操作帮助模型学习图像中的小部分,然后将这些局部特征组合成更高级的形式,以实现复杂任务的学习
核心组件介绍
卷积层:使用一组可学习的滤波器来扫描输入数据,每个滤波器负责提取一种特定的特征。
激活函数:引入非线性,使网络能够学习复杂的模式,常用的激活函数有ReLU。
池化层:降低特征图的空间维度,减少计算量和参数数量,防止过拟合。
全连接层:将前面卷积层和池化层提取到的特征图转换为一维特征向量,进行最终的分类或回归分析。
调试学习算法
模型评估
将数据集分为训练集和测试集
然后分别计算误差
对于分类问题(使用分类的成本函数)
模型选择
此时有一个问题,这里的测试集主要目的是为了挑选在测试集上表现最好的模型,也就是说最后得到模型之后,这个值一定是最小的,但是这个值是被挑选出来的,并不能真正反映模型的性能
还有一种优化的方法是把数据集分为三个部分,除了训练集和测试集,加上一个交叉验证集
此时:三部分数据集的各功能就如下所示:
训练集 (训练阶段)
用于构建我们的模型,我们的模型在训练集上进行学习,通常在这个阶段我们可以有多种方法进行训练
验证集 (模型挑选阶段)用于挑选最优模型超参的样本集合:使用验证集可以得到反向传播什么时候结束以及超参怎么设置最合理。主要目的是为了挑选在验证集上表现最好的模型。
测试集 (验证阶段 评估泛化误差)在我们挑选好验证集上表现最好的模型之后,用于评估该模型泛化能力的数据集。
P74-P79
偏差和方差
这部分我没看太懂网课,因为没字幕,但是有一个博客写得很明白,链接如下:
诊断偏差和方差
欠拟合为高偏差,过拟合为高方差
当 Jtrain(θ) ≈ Jcv(θ),但两者都非常高时,是模型欠拟合导是高偏差引起的,可以适当增加多项式次数解决
当 Jcv(θ) >> Jtrain(θ),是由于模型过拟合导致高方差引起,可以通过增加样本数据量解决
接下来看看正则化参数λ对偏差和方差的影响:
如图所示,当λ很大时,会发生高偏差,另一个极端,当λ很小时,会发生高方差
具体的Jtrain和Jcv与λ的定性关系,如下所示
建立表现基准
误差达到多大算大?达到多大算小?这时需要建立一个对比的标准去判断一个新算法的性能,可以根据下面三个方面去对比
当然也可以结合上述的基准去研究前面学习的偏差和方差
学习曲线
学习曲线是用来帮助理解算法如何工作的一种方法,如下所示,对于二次多项式,当增加训练集的数量时,Jtrain和Jcv的变化
对于高偏差的算法,就算增大数据集的量,也不能明显地改善算法的性能
而对于高方差的曲线,增大数据集数量,有利于改善算法,使学习的效果达到表现基准左右
在debug的时候,下面常见的六个操作对偏差和方差的影响关系如下
偏差和方差与神经网络
神经网络给了我们一种新的方法去解决高偏差和高方差的问题,如下所示:
更大的神经网络导致了更大的计算量,这也就促进了gpu等加速硬件的发展
只要合适的进行规则化,神经网络就不会出现方差过大的问题
规则化的神经网络tensorflow代码如下