一、什么是 logistic regression
Andrew Ng提供的一个用 logistic regression 识别主子图片的算法结构示意图:
如上,左边的
中间的圆圈,称为神经元,它接收来自左边的输入,并乘以相应的权重,再加上一个偏置项(一个实数),所以最终接收的总输入为:
但是这个并不是最后的输出,和神经元一样,会有一个激活函数(activation function)来对输入进行处理,来决定是否输出或者输出多少。Logistic Regression的激活函数是sigmoid函数,介于0和1之间,中间的斜率较大,两边的斜率很小,并在远处区域0。
用来表示该输出,
函数代表sigmoid,则:
这个可以看做是我们的这个小模型根据输入做出的一个预测,在最开始的图对应的案例中,就是根据图片的像素在预测图片是不是猫。
与对应的,每一个样本
都有自己的一个真实标签
:
代表图是猫;
代表图不是猫。
我们希望模型输出的可以尽可能的接近真实标签
,这样这个模型就可以用来预测一个新图片是不是猫了。所以,我们的任务是要找出一组
,使得我们的模型
可以根据给定的
,正确的预测
。在此,我们可以认为,只要算出的
大于0.5,那么
就更接近1,于是可以预测为“是猫”,否则“不是猫”。
以上就是Logistic Regression的基本结构说明。
二、怎么学习W和b
前面其实提到过了,我们需要学习到的W和b可以让模型的预测值y'与真实标签y尽可能地接近,也就是y'和y的差距尽量地缩小。因此,我们可以定义一个损失函数(Loss function),来衡量y'和y的差距:
如何说明这个式子适合当损失函数:
- 当
时,
,要使
最小,则
要最大,则
;
- 当
时,
,要使
最小,则
要最小,则
。
我们知道,代表一组输入,相当于是一个样本的特征。但是我们训练一个模型会有很多很多的训练样本,也就是有很多很多的
,就是会有
共m个样本,它们可以写成一个大
行向量:
对应的样本的真实标签Y(也是行向量):
通过我们的模型计算出的y'们也可以组成一个行向量:
前面讲的损失函数L,对每个x都有,因此在学习模型的时候,我们需要看所有x的平均损失,因此定义一个代价函数(Cost function)代表所有训练样本的平均损失:
因此,我们的学习任务就可以用一句话来表述:
Find W,b that minimize J(W,b)
在神经网络中,我们一般使用梯度下降法(Gradient Decent):
这个方法通俗一点就是,先随机在曲线上找一个点,然后求出该点的斜率,也称为梯度,然后顺着这个梯度的方向往下走一步,到达一个新的点之后,重复以上步骤,直到到达最低点(或达到我们满足的某个条件)。
如,对w进行梯度下降,则就是重复一下步骤(重复一次称为一个迭代):
:用后面的值更新
:学习率(learning rate)
:J对w求偏导。
回到我们的Logistic Regression问题,就是要初始化(initializing)一组W和b,并给定一个学习率,指定要迭代的次数(就是你想让点往下面走多少步),然后每次迭代中求出W和b的梯度,并更新W和b。最终的W和b就是我们学习到的W和b,把W和b放进我们的模型中,就是我们学习到的模型,就可以用来进行预测了。
总结
Logistic Regression模型:
,使用的激活函数是sigmoid函数。
损失函数:
衡量预测值y'与真实值y的差距,越小越好。
代价函数:损失均值,
,是W和b的函数,学习的过程就是寻找W和b使得J(W,b)最小化的过程。求最小值的方法是用梯度下降法。
-
训练模型的步骤:
- 初始化W和b
- 指定learning rate和迭代次数
- 每次迭代,根据当前W和b计算对应的梯度(J对W,b的偏导数),然后更新W和b
- 迭代结束,学得W和b,带入模型进行预测,分别测试在训练集合测试集上的准确率,从而评价模型
学习地址:Logistic回归:最基础的神经网络