人工智能-深度学习笔记2 猫和非猫引起的二分类

在学习神经网络基础知识时,需要注意的是,去实现一个神经网络时,是需要知道一些非常重要的技术和技巧的:例如数据集,该如何表示和处理呢?;选用什么的算法方式呢,激活函数的确定;成本函数和代价函数怎么确定?;多少也得知道前向传播和反向传播的过程以及会产生怎样的结果吧。

在学习什么是神经网络时拿线性回归做了示例,此次将以猫和非猫的二分类问题来传达以上的这些想法,逻辑回归是解决二分类(binary classification)的经典算法。将学习如何使用逻辑回归(logistic regression)的算法来描述这些非常重要的技术和技巧。

 

1、猫和非猫二分类问题的数据

猫和非猫,很明显的二分类问题,比如这只猫,如果识别这张图片为猫,则输出标签1作为结果;如果识别出不是猫,那么输出标签0作为结果(这就是著名的cat和non cat问题)。现在可以用字母y来表示输出的结果标签,如下图所示:

先来看看一张图片在计算机中是如何表示的,为了保存一张图片,需要保存三个矩阵,它们分别对应图片中的红、绿、蓝三种颜色通道,如果图片大小为64x64像素,那么你就有三个规模为64x64的矩阵,分别对应图片中红、绿、蓝三种像素值。为了便于表示,这里画了三个很小的矩阵,注意它们的规模为5x4 而不是64x64,如下图所示:

为了把这些像素值放到一个特征向量(特征向量!这个是很多神经网络的核心思维!)中,需要把这些像素值提取出来,然后放入一个特征向量x。为了把这些像素值转换为特征向量 x,需要像下面这样定义一个特征向量 x 来表示这张图片,假设把所有的像素都取出来,例如255、231等等,直到取完所有的红色像素,接着最后是255、134、…、255、134等等,直到得到一个特征向量,把图片中所有的红、绿、蓝像素值都列出来。(可以想象成把所有像素值并成一列或者一排),如果图片的大小为64x64像素,那么向量 x 的总维度,将是64乘以64乘以3,这是三个像素矩阵中像素的总量。结果为12,288。现在用n_x=12,288,来表示输入特征向量的维度,有时候为了简洁,会直接用小写的n来表示输入特征向量x的维度。所以在二分类问题中,最终目标就是习得一个分类器,它以图片的特征向量作为输入,然后预测输出结果y为1还是0,也就是预测图片中是否有猫:

好了,至此数据表示的基本形式就有了,接下来将说明一些需要用到的符号,相信大家对向量和矩阵不陌生了吧,上面两段文字中都有加粗啊。

x:表示一个n_x维数据,为输入数据,维度为(n_x,1);

y:表示输出结果,取值为(0,1)

(x^(i),y^(i))(代表x的(i)上标,y的(i)上标):表示第i组数据,可能是训练数据,也可能是测试数据;

X=[x^(1),x^(2),...,x^(m)]:表示所有的训练数据集的输入值,放在一个 n_x×m的矩阵中,其中m表示样本数目;

Y=[y^(1),y^(2),...,y^(m)]:对应表示所有训练数据集的输出值,维度为1×m。

用一对(x,y)来表示一个单独的样本,x代表n_x维的特征向量,y 表示标签(输出结果)只能为0或1。 而训练集将由m个训练样本组成,其中(x^(1),y^(1))表示第一个样本的输入和输出,(x^(2),y^(2))表示第二个样本的输入和输出,直到最后一个样本(x^(m),y^(m)),然后所有的这些一起表示整个训练集。有时候为了强调这是训练样本的个数,会写作M_train,当涉及到测试集的时候,会使用M_test来表示测试集的样本数,所以这是测试集的样本数:

最后为了能把训练集表示得更紧凑一点,定义一个矩阵用大写X的表示,它由输入向量x^(1)、x^(2)等组成,如下图放在矩阵的列中,把x^(1)作为第一列放在矩阵中,x^(2)作为第二列,x^(m)放到第m列,然后就得到了训练集矩阵X。所以这个矩阵有m列,m是训练集的样本数量,然后这个矩阵的高度记为n_x,注意有时候可能因为其他某些原因,矩阵X会由训练样本按照行堆叠起来而不是列,如下图所示:x^(1)的转置直到x^(m)的转置,打了个大X的图示。

X是一个规模为n_x乘以m的矩阵,当用Python实现的时候,会看到X.shape,这是一条Python命令,用于显示矩阵的规模,即X.shape等于(n_x,m),X是一个规模为n_x乘以m的矩阵。到此,就描述完了如何将训练样本(输入向量X的集合)表示成为了一个矩阵。

那么输出标签y呢?同样的道理,为了能更加容易地实现一个神经网络,如上将标签y放在列中将会使得后续计算非常方便,所以定义大写的Y等于y^(1),y^(m),...,y^(m),在这里就是一个规模为1乘以m的矩阵,同样地使用Python将表示为Y.shape等于(1,m),表示这是一个规模为1乘以m的矩阵。

将不同的训练样本的数据提取出来,然后就像刚刚对 x 或者 y 所做的那样,将他们堆叠在矩阵的列中,形成之后会在逻辑回归和神经网络上要用到的符号表示。一个好的符号约定能够将不同训练样本的数据很好地组织起来。

 

2、逻辑回归(Logistic Regression)

适用于二分类问题,可用来计算“事件=Success”和“事件=Failure”的概率。因变量的类型属于二元(1 / 0,真/假,是/否)变量。先来看看下面的这个函数:

Sigmoid函数可以将变量映射到0,1之间,当x趋近于负无穷时,y趋近于0;当x趋近于正无穷时,y趋近于1;当x= 0时,y=0.5。优点:输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层;求导容易。缺点:由于其软饱和性,容易产生梯度消失,导致训练出现问题;其输出并不是以0为中心的。应用最广泛的就是逻辑回归的分类问题。至于缺点后面再慢慢学习,修正之。

对于1中的二元分类问题来讲,给定一个输入特征向量X,它可能对应一张图片,想要识别这张图片看它是否是一只猫或者不是一只猫的图片,想要一个算法能够输出预测,这里称之为y^(也就是预测值),也就是对实际值 y 的估计。更正式地来说,想让 y^ 表示 y 等于1的一种可能性或者是机会,前提条件是给定了输入特征X。换句话来说,如果X是上面猫的图片,就是想让 y ^来说明这是一只猫的图片的机率有多大。X是一个n_x维的向量(相当于有n_x个特征的特征向量)。这里用w来表示逻辑回归的参数,这也是一个n_x维向量(因为w实际上是特征权重,维度与特征向量相同),参数里面还有b,这是一个实数(表示偏差)。所以给出输入x以及参数w和b之后,怎样产生输出预测值y^,学习笔记1里面可能得到这个式子y^=(w^T) x+b。

这里得到的是一个关于输入x的线性函数,实际上这是上节学习笔记中做线性回归时所用到的,但是这对于二元分类问题来讲不是一个非常好的算法,因为想让y^表示实际值y等于1的机率的话,y ^应该在0到1之间。这是一个需要解决的问题,因为(w^T)x+b可能比1要大得多,或者甚至为一个负值。对于想要的在0和1之间的概率来说它是没有意义的,因此在逻辑回归中,输出应该是^y等于由上面得到的线性函数式子作为自变量的某个函数中,公式如上图最下面output所示,将线性函数转换为非线性函数(线性变成非线性函数,这个技巧要记得!)。正巧刚刚学习一个这样的函数Sigmoid函数。想想这个激活函数,此时的作用是啥呢?

下面将Sigmoid函数和特征向量结合起来并说明一些需要用到的符号:

如果把上图左水平轴作为z轴,那么关于z的sigmoid函数是这样的,它是平滑地从0走向1,这里标记纵轴,这是0,曲线与纵轴相交的截距是0.5,这就是关于z的sigmoid函数的图像。这里使用z来表示(w^T) x+b的值。关于sigmoid函数的公式就变成了这样σ(z)=1/(1+e^(-z) ),在这里z是一个实数,如果z非常大那么e^(-z)将会接近于0,关于z的sigmoid函数将会近似等于1除以1加上某个非常接近于0的项,因为e 的指数如果是个绝对值很大的负数的话,这项将会接近于0,所以如果z很大的话那么关于z的sigmoid函数会非常接近1。相反地,如果z非常小或者说是一个绝对值很大的负数,那么关于e^(-z)这项会变成一个很大的数,可以认为这是1除以1加上一个非常非常大的数,所以这个就接近于0。实际上当z变成一个绝对值很大的负数,关于z的sigmoid函数就会非常接近于0,因此在实现逻辑回归时,最终的工作就是去让机器学习参数w以及b使得y^成为对y=1|0这一情况的概率的一个很好的估计。

这里介绍一种符号惯例,可以让参数w和参数b分开。在符号上要注意的一点是当对神经网络进行编程时经常会让参数w和参数b分开,在这里参数b对应的是一种偏置,在某些例子里,可以定义一个额外的特征称之为x_0,并且使它等于1,那么现在X就是一个n_x加1维的变量,然后定义y^=σ(θ^T x)的sigmoid函数。在这样的符号惯例里中,有一个参数向量θ_0,θ_1,θ_2,...,θ_(n_x ),这样θ_0就充当了b,这是一个实数向量,而剩下的θ_1 直到θ_(n_x )充当了w,结果就是当实现神经网络时,有一个比较简单的方法保持b和w分开。

现在已经知道逻辑回归模型是什么样子了,下一步要做的就是训练参数w和参数b,上节笔记中有个线性回归的例子里面有个最小二乘的损失函数,这里依然需要定义一个类似的函数。

 

3、逻辑回归的代价函数(Cost Function)

为什么需要代价函数?与损失函数又有什么区别?

为了训练逻辑回归模型的参数 w和参数b,需要一个这样的(代价)函数,通过训练这个(代价)函数来得到参数w和参数b 。

为了让模型通过学习调整参数,需要给予一个m样本的训练集,在训练集上找到参数w和参数b,来得到对应的输出。对训练集的预测值,这里将它写成y^,此时是更希望它会接近于训练集中的y值,为了对上面的公式更详细的介绍,上面的定义是对一个训练样本来说的,这种形式也使用于每个训练样本,使用这些带有圆括号的上标来区分索引和样本,训练样本 所对应的预测值是 y(i),是用训练样本的 (w^T) (x^(i))+b 然后通过sigmoid函数来得到,也可以把z定义为。使用这个符号(i)做 注解,上标(i) 指明数据表示x或者y 或者z或者其他数据的第i个训练样本,这就是上标(i) 的含义。

损失函数又叫做误差函数,用来衡量算法的运行情况,后续的网络判定与评估性能就是要找到一个合适的loss,Loss function:还记得线性回归中的最小二乘法么,来看看下面的这个函数:

通过这个 称为L的损失函数,来衡量预测输出值和实际值有多接近。线性回归中采用了预测值和实际值的平方差或者它们平方差的一半,但是通常在逻辑回归中不这么做,因为当在学习逻辑回归参数的时候,会发现此时的优化目标不是凸优化,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值,虽然平方差是一个不错的损失函数,但是在逻辑回归模型中会定义如上的损失函数。

为什么要用这个函数作为逻辑损失函数?

当使用平方误差作为损失函数的时候,会想着要让这个误差尽可能地小,对于这个逻辑回归损失函数,也是想让它尽可能地小,为了更好地理解这个损失函数怎么起作用,举两个例子(y^代表预测值):大家自由搜索下log函数的图形是啥?

当y = 1时损失函数L = -log(y^),如果想要损失函数L尽可能得小,那么y^就要尽可能大,因为sigmoid函数取值 [0,1],所以 y^会无限接近于1。

当y = 0 时损失函数L = -log(1 - y^) ,如果想要损失函数L尽可能得小,那么y^ 就要尽可能小,因为sigmoid函数取值 ,所以y^会无限接近于0。

神经网络中有很多用到的函数效果和这个类似,就是如果y等于1,就尽可能让y^变大,如果y 等于0,就尽可能让y^变小。 损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何,为了衡量算法在全部训练样本上的表现如何,这时就需要定义一个算法的代价函数(代价函数用J表达),算法的代价函数是对m个样本的损失函数求和然后除以 m(因为要均值化) :

损失函数只适用于单个训练样本,而代价函数是参数的总代价,所以在训练逻辑回归模型时候,需要找到合适的w和b ,来让代价函数 J 的总代价降到最低

根据对逻辑回归算法的推导及对单个样本的损失函数的推导和针对算法所选用参数的总代价函数的推导,结果表明逻辑回归可以看做是一个小的神经网络,接下来看看这个神经网络会做些什么。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值