吴恩达深度学习第一课第二周【神经网络基础】笔记2.1-2.4
2.1二分类
logistic回归是一个用于二分分类的算法
一个二分类问题的例子:
有一张图片作为输入,想输出此图的标签,如果是猫,输出1,如果不是,输出0,用y来表示输出结果的标签
图片在计算机中的表示:
计算机保存一张图片,要保存三个独立矩阵,分别对应图中红、绿、蓝三个颜色通道,如果输入的图片是64* 64像素的,就有三个64* 64的矩阵分别对应图片中红绿蓝三种像素的亮度。要把这些像素的亮度值放进一个特征向量中,就要把这些像素值都提出来,放入一个特征向量x。为了把这些像素值取出放入特征向量,需要像如下定义一个特征向量x以表示这张图:把所有的像素值都取出来,如255、231…直到列完所有的红色像素、然后是255、134…,最后得到一个很长的特征向量,把图片中所有的红、绿、蓝像素强度值都列出来。如果图片的像素值是64* 64,那么向量的总维度就是64* 64* 3。
用nx=12288来表示输入的特征向量x的维度,有时为了简洁会直接用n表示输入特征向量的维度。
在二分分类问题中,目标是训练出一个分类器,以图片的特征向量x作为输入,预测输出的结果标签y是1还是0,也就是预测图片中是否有猫。
后续课程需要用到的一些符号
用一对(x,y)来表示一个单独的样本,x为一个nx维的特征向量,标签y值为0或1。训练集由m个训练样本构成(x(1),y(1))表示样本一的输入和输出,(x(2),y(2))表示样本二的输入和输出,…,(x(m),y(m))表示最后一个样本m的输入和输出,由此构成了一个训练集。用m表示训练样本的个数。有时为了强调这是训练集的样本个数,可以写作m=m_train,当说到测试集时,我们会用mtest来表示测试集的样本数。
最后,用更紧凑的符号表示训练集。定义一个矩阵,用大写的X来表示,它由训练集中的x(1)、x(2)等组成
注意:有时矩阵X的定义,训练样本作为行向量堆叠,而不是上图的列向量堆叠。
但是,构建神经网络时,用列向量的约定形式会让构建过程简单的多。
当用Python实现时,会看到Python命令“X.shape”用来输出矩阵的维度,即(nx,m)。
为了方便,构建一个神经网络,y标签也放到列中,如图。
此处Y为一个1*m矩阵。同样的,在Python里Y.shape为(1,m)。
好的惯例符号能够将不同的训练样本的数据联系起来。
2.2logistic回归
logistic回归是一个学习算法,用在监督学习问题中,输出y标签是0或1。
已知的输入特征向量x可能是一张图,我们希望识别出这是不是猫,所以需要一个算法,可以给出一个预测值y^ 。更正式的说,我们希望 y^ 是一个概率,当输入特征x满足条件时,y就是1。所以如果x是一张图片,那么我们希望y^ 可以告诉我们这是一张猫图的概率。
x是一个nx维向量,已知logistic回归的参数w也是一个nx维向量,b为一个实数,所以已知输入x和参数w和b。
如果做线性回归,y^ =wTx+b,但这不是一个非常好的二元分类算法,因为我们希望y^ 是y=1的概率,所以y^应该介于0和1之间。
所以在logistic回归中,我们的输出变成y^ 等于sigmoid函数作用到这个量上。
以下为sigmoid(z)的图形
用z来表示wTx+b。z为实数,σ(z)=1/(1+e-z)。
当z非常大时,e-z就接近为0,所以sigmoid(z)就大约等于1/(1+某个很接近0的量),所以sigmoid(z)接近1。相反,当z为非常大的负值时,sigmoid(z)就接近为0。
所以当实现logistic回归时,要做的就是学习参数w和b,y^ 成了对y=1概率比较好的估计。
一些符号约定
当我们对神经网络编程时,我们通常会把w和参数b分开,这里b对应一个拦截器。
其他表示形式:
定义一个额外的特征向量x0=1,所以此时x就是一个R(nx+1)维向量。然后将y^ 定义为σ(θTx)
θ0代表b,θ1,……,θ2代表w。
但事实上,当实现神经网络时,将b和w看作独立的参数可能更好。
2.3logistic回归损失函数
为了训练logistic回归模型的参数w以及b,需要定义一个成本函数。
回顾上一节,
我们想通过训练集,找到参数w和b,来得到输出。对训练集中的预测值y^ (l) ,我们希望它会接近于在训练集中的y^ (i)值。为了让方程更详细一些,需要说明以上定义的y^ 是对一个训练样本x来说的,对于每个训练样本,使用这些带有圆括号的上标方便引用说明和区分样本。训练样本(i)对应的预测值是y^ (i),是用训练样本通过sigmoid函数作用到wTx(i)+b得到的,可以把z(i)写成wTx(i)+b,这门课中,将使用上标来指明数据,表示x或y或z和第i个训练样本有关。
损失函数(误差函数)
损失函数可以用来衡量算法的运行情况。
可以定义损失为:y^和y的差的平方或差的平方的二分之一,结果表明我们可以这么做,但是通常在logistic回归中,大家都不这么做,因为当我们学习这些参数的时候,我们会发现之后讨论的优化问题会变成非凹凸的,最后会得到很多个局部最优解,梯度下降法可能找不到全局最优值。
通过定义这个损失函数L,来衡量预测输出值y^和y的实际值有多接近。误差平方看起来好用,但是使用误差平方,梯度下降法就不太好用。所以在logistic回归中,我们会定义一个不同的损失函数,起着与误差平方相似的作用。这会给我们一个凸的优化问题。
在logistic回归中,我们用到以下损失函数:
下图举例解释子说明该损失函数为何能起作用
损失函数是在单个训练样本中定义的,它衡量了在单个训练样本上的表现。
成本函数
成本函数衡量的是在全体训练样本上的表现。
成本函数,即所有训练样本的损失函数和。
成本函数基于参数的总成本,所以在logistic回归中,我们要找到合适的参数w和b,让成本函数J尽可能的小。
logistic函数可以被看作一个非常小的神经网络。
2.4梯度下降法
我们想要找到使得成本函数最小的w和b
横轴表示空间参数w和b,在实践中,w可以是更高维的,但是为了方便绘图,我们让w为一个实数,b也为一个实数。成本函数J(w,b)是在水平轴w和b上的曲面,曲面的高度展示了J(w,b)在某一点的值,我们要找到使对应的成本函数J值是最小值的w和b。可见,成本函数J为一个凸函数,而不是如下图的存在许多局部最优的非凸函数
凸函数的这种性质是我们使用logistic回归的这特定成本函数J的重要原因之一。为了找到更好的参数,我们需要用某初始值初始化w和b,
如图中1所示。对于logistic回归而言,几乎任意的初始化方法都有效。通常用0来初始化,但是对于logistic回归我们通常不这么做,因为函数为凸函数,无论在哪里初始化,都应该达到同一点或大致相同的点。梯度下降法所做的就是,从初始点开始,朝最陡的下坡方向走一步。在梯度下降一步后,可能会停在那,因为它在试图沿着梯度下降最快的方向走,也就是尽可能快的往下走,这是梯度下降的一次迭代。两次迭代可能会到达,或者三次……隐藏在图上的曲线很有希望收敛到全局最优解或接近全局最优解。
梯度下降法将重复执行更新操作,以下图为例,重复更新w的值,:=表示一次更新。其中α为学习率,可以控制每一次迭代或梯度下降中的步长。其后为一个导数,是对参数w的更新或者变化量。当我们编写代码去实现梯度下降,我们会使用代码中变量名的约定,dw表示导数的变量名,即w:=w-αdw。
无论初始的点在左边还是右边,梯度下降法都会向着全局最优的方向移动。如图
同理,在成本函数的梯度下降中,参数有w和b,需要根据以下两式更新参数w和b。