文章目录
一、是什么、有什么作用?
当我们寻求几个事物之间的联系的时候,比如学习时间和考试成绩、房子尺寸和房价,都需要找到一个对应关系F(x)。逻辑回归函数就是这个对应关系函数,梯度下降算法就是求得逻辑回归函数的过程。
有了逻辑回归与梯度下降算法,我们可以很好地解决二元分类问题(0或1的问题)。例如:对猫训练数据集进行标注并训练模型后,输入一张图片,模型可以得出图片中是否存在猫。
二、逻辑回归
对于二元分类问题来讲,给定一个输入特征向量𝑋,它可能对应一张图片,你想识别这张图片识别看它是否是一只猫或者不是一只猫的图片,你想要一个算法能够输出预测,结果称之为𝑦^,也就是你对实际值 𝑦 的估计或理解为是猫的概率。
为了让模型通过学习调整参数,你需要给予一个𝑚样本的训练集,这会让你在训练集上找到参数𝑤和参数𝑏,,来得到你的输出。
2.1逻辑回归函数
y ^ = σ ( w T x + b ) = σ ( z )其中 σ = 1 1 + e − z \hat{y}=\sigma (w^{T}x+b )=\sigma(z)其中\sigma =\frac{1}{1+e^{-z} } y^=σ(wTx+b)=σ(z)其中σ=1+e−z1
- 𝑦^:预测的结果,界于0-1之间,表示事情发生的概率。
- x:输入,例如输入的是一张64x64的图片,那么x就是64x64x3(RGB)=12288的一维向量(相当于有𝑛𝑥个特征的特征向量)。
- w:所要求的逻辑回归参数,是一个与x同维的向量(12288,1)。因为𝑤实际上是特征权重,维度与特征向量相同
- b:实数,表示偏差。b和w是我们最终要求得的值。
- Sigmoid函数:z=w^{T}x+b是两个向量的乘积+偏差,其大小并不可控。那么自然而然就需要一个函数,将最终结果限制到0-1之间。
2.2损失函数(Logistic Regression Loss Function)
损失函数又叫做误差函数,用来衡量算法的运行情况,Loss function:𝐿(𝑦^ , 𝑦)
L ( y ^ , y ) = − ( y log y ^ + ( 1 − y ) log ( 1 − y ^ ) ) L(\hat{y} ,y)=-(y\log_{}{\hat{y} +(1-y)\log_{}{(1-\hat{y} )} } ) L(y^,y)=−(ylogy^+(1−y)log(1−y^))
2.2.1解析:为什么长这样?
一般我们用预测值和实际值的平方差或者它们平方差的一半,但是通常在逻辑回归中我们不这么做,因为
当我们在学习逻辑回归参数的时候,会发现我们的优化目标不是凸优化,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值,虽然平方差是一个不错的损失函数。
更直观一点:
2.2.2如何理解
最终我们期待y和𝑦^应该尽可能接近。
举个例子:
当𝑦 = 1时损失函数𝐿 = −log(𝑦^ ),如果想要损失函数𝐿尽可能得小,那么𝑦^ 就要尽可能大,因为 sigmoid 函数取值[0,1],所以𝑦^会无限接近于 1。
当𝑦 = 0时损失函数𝐿 = −log(1 − 𝑦^ ),如果想要损失函数𝐿尽可能得小,那么𝑦^就要尽可能小,因为 sigmoid 函数取值[0,1],所以𝑦^会无限接近于 0。
2.3代价函数(Logistic Regression Cost Function)
J
(
w
,
b
)
=
1
m
∑
m
i
=
1
L
(
y
^
,
y
)
=
−
1
m
∑
m
i
=
1
(
y
(
i
)
log
y
^
(
i
)
+
(
1
−
y
(
i
)
)
log
(
1
−
y
^
(
i
)
)
)
J(w,b)=\frac{1}{m}\sum_{m}^{i=1} L(\hat{y} ,y)=-\frac{1}{m}\sum_{m}^{i=1} (y^{(i)} \log_{}{\hat{y}^{(i)} +(1-y^{(i)})\log_{}{(1-\hat{y}^{(i)} )} } )
J(w,b)=m1m∑i=1L(y^,y)=−m1m∑i=1(y(i)logy^(i)+(1−y(i))log(1−y^(i)))
看似复杂,实际就是把损失函数的值求和。
那么最终就是要求:代价函数值最小的情况下w和b的值
三、梯度下降算法
梯度下降就是求w和b的方法
w
=
w
−
α
∂
J
(
w
,
b
)
∂
w
w=w-\alpha \frac{\partial J(w,b)}{\partial w}
w=w−α∂w∂J(w,b)
b
=
b
−
α
∂
J
(
w
,
b
)
∂
b
b=b-\alpha \frac{\partial J(w,b)}{\partial b}
b=b−α∂b∂J(w,b)
- 𝑎: 表示学习率(learning rate),用来控制步长(step),即向下走一步的长度。可以看做一个用于微调的用户可控参数。
- 𝑑𝐽(𝑤)/𝑑𝑤:就是函数𝐽(𝑤)对𝑤 求偏导(derivative)。b同理
3.1如何理解
因为代价函数是一个“碗型",每一次计算w都会更接近最低点,导数(斜率)>0时w减小,导数小于0是w增大。多次迭代后w和b的值使得损失函数的值下降到最低点,就得出了最终结果。
公式理解比较简单,相对困难的是理解这个偏导数的求导过程。 接下来需要一些高数知识:其实就是链式求导法则
对w求偏导过程实际上是三步:
∂
L
(
a
,
y
)
∂
a
=
−
y
a
+
1
−
y
1
−
a
\frac{\partial L(a,y)}{\partial a}=-\frac{y}{a}+\frac{1-y}{1-a}
∂a∂L(a,y)=−ay+1−a1−y
d
a
d
z
=
a
(
1
−
a
)
\frac{\mathrm{d} a}{\mathrm{d} z}=a(1-a)
dzda=a(1−a)
d
z
d
w
(
i
)
=
x
(
i
)
\frac{\mathrm{d} z}{\mathrm{d} w^{(i)} }=x^{(i)}
dw(i)dz=x(i)
得到偏导结果后就可以用梯度下降公式得到一轮迭代后新的w(i)和b,完成一轮迭代。多次迭代后就能得到最终结果。
注意w的脚标代表的是维度,即之前提到的[12288,1]格式中12288的数量,并非图片总数m,对w1求偏导时w2…看做常数。.
四、完整代码
吴恩达视频中m个图片样本一轮迭代的过程:
4.1过程详解
整个过程后序可以用向量优化,但是理解起来for循环更直观
m张图片每张图片需要进行的操作有:
- 计算z(i):w转和x(i)做内积,结果z(i)应该是一个具体数。
- 计算a(i)和J(i):将已知量套层函数,结果同样是具体数。
- 计算dz(i):即
∂ L ( a , y ) ∂ a ∗ ∂ a ∂ z = ( − y a + 1 − y 1 − a ) ∗ a ( 1 − a ) = a − y \frac{\partial L(a,y)}{\partial a}*\frac{\partial a}{\partial z}=(-\frac{y}{a}+\frac{1-y}{1-a}) *a(1-a) =a-y ∂a∂L(a,y)∗∂z∂a=(−ay+1−a1−y)∗a(1−a)=a−y
也是一个具体数。 - 累加dw(i)和db:dw的维度和x相同(12288,1),b是一个具体的数。
- 遍历完m张图片后,本轮结束,得到cost的值并可以利用梯度下降函数计算dw。
清楚每一步计算后的结果是矩阵还是数以及清楚矩阵的形状很重要,在后序向量化优化算法的时候逻辑会清晰很多。