1.2 logistic 回归
视频:第二周 神经网络基础
整理:飞龙
logistic 回归属于广义线性回归。所谓广义线性回归,就是在线性回归的模型上加一些东西,使其适应不同的任务。
logitic 回归虽然名字里有回归,但是它解决的是二元分类问题。二元分类问题中,标签只有两个值。一个典型的二元分类是输入一张图片,判断是不是猫。
首先来看假设,我们的假设是这样的:
某个样本
sigmoid 函数用
注:
我的习惯是,把
w (权重)和b (偏置)打包在一起,称为θ ,因为这样节省很多计算。而且易于扩展,如果你需要偏置项,给w 多加一项,给x 添加一个1 ,如果不需要,保持原样即可。
为了找出最优的
这个函数为什么能用,需要解释一下。当
当
无论如何,我们都使
我们需要一个大的损失函数,衡量模型在所有样本上的表现。我们用
然后我们需要求
注:
(1)如果你拆成了
w 和b ,那么dJdb 就是∑idJdz(i) ,dJdw 和dJdθ 一样。(2)所有导数以及
J 都需要除以ndata ,但为了简洁我省略了,下同。(3)在机器学习(以及数值计算)中,没有必要区分导数和偏导数,导数可以看出偏导数的一元特例。所以这里我都使用了导数的符号。
我们可以看到最终的导数和线性回归一样,仍然是损失乘以特征再求和。
向量化
我的习惯是,将
由于
接下来是损失函数
其中
接下来是导数:
这个还是比较好求的。
这里有一个方法,就是核对矩阵的维数。我们已经知道
n_data x 1
的矩阵,
n_data x x_feature
的矩阵,
n_feature x 1
的矩阵。根据矩阵乘法,它只能是
注:
严格来讲,向量化的导数应该称为梯度。这个笔记中不区分这两个术语。
梯度下降法
在代数中,如果我们需要求出一个凸函数的最值,我们可能会使导数等于 0,然后解出方程。但在机器学习中,我们使用梯度下降法来求凸函数的最值。
梯度下降法是,对于每个自变量
其中
下面直观地解释一下。这是一个一元函数,它的形状是一个碗,或者山谷。
我们可以随便选一个点作为初始值。你可以选0
,也可以选1
或者随机值。这个无所谓,因为函数是凸的,沿任意路径下降都会达到全局最优值。
如果你的初始值在右侧,那么导数为正,减去它的一部分相当于向左移动了一小步。如果你的初始值在左侧,导数为负,减去它的一部分相当于向右移动了一小步。总之,这样会使
多元的凸函数是这样。如果你的每个自变量都减去它的导数(梯度)的一部分,那么所有自变量就相当于向着最陡的方向移动了一小步。如果你在一个山谷中,沿着最陡的方向向下走,就会到达谷底。
代码
向量化的公式很容易用 NumPy 代码来表示。
theta = np.random.rand(n_features, 1)
for _ in range(max_iter):
Z = np.dot(X, theta)
A = sigmoid(Z)
dJ_dZ = (A - Y) / n_data
dJ_dtheta = np.dot(X.T, dJ_dZ)
theta -= alpha * dJ_dtheta