一、Binary Classificatioin(二分分类算法)
(一)图像的表示方法
引入:给你一幅图片,识别出是否是猫(1:cat vs 0:non cat)。

原理:将二维图像表示为三原色(即red、green、blue),每一个原色可以用64×64的矩阵表示出来,在每一个像素点位置叠加,从而得到每个像素点的颜色。

很容易知道,1或0作为输出y,而三原色矩阵中的元素作为输入x。
于是便产生了问题:怎样存储这64×64×3个数字?
答案很简单,用(64×64×3)×1的特征向量存储,从红到绿到蓝依此遍历元素,向量维度为nx=12288.
x=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡255231...255134...255134...⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤.
(二)符号表示方法(Notation)
(x,y)为单独样本,x∈Rnx,y∈{0,1}.
m个训练样本:{(x(1),y(1))、(x(2),y(2))、...、(x(m),y(m))}.
为更紧凑地表示出训练集,用矩阵的形式囊括:
X=⎣⎢⎢⎢⎢⎢⎡......x(1)............x(2)............x(3)...........................x(m)......⎦⎥⎥⎥⎥⎥⎤.
其中,列数m是样本数量,行数nx是每个输入向量的维度。
注意!在深度学习中,我们通常采用如上列堆叠的方式,该约定方式可以让构建过程更简单。
x∈Rnx×m.
在python编程中,X.shape = (n_x, m)
同理,将标签y放入列中,定义如下:
Y=[y(1)y(2)y(3)...y(m)].
y∈R1×m.
在python编程中,Y.shape = (1, m)
符号表示方法小结:如果用好的惯例符号表示,能够将不同训练样本的数据联系起来。
三、Logistic回归基础知识
引入:以上一篇笔记中“判断是否是猫”的例子中,当给出输入x时,我们希望得到一个概率结果,即是“是猫的概率有多大?”
即求解: y=P{y=1∣x}.
已知: x∈Rnx.
参数: w∈Rnx,b∈R.
从而得到输出结果:z=wT+b.
但是,这个关于x的线性函数并不能将结果映射到[0,1]区间内,即不能表达概率取值。
所以,在Logistic回归中,我们将sigmoid函数作用到wT+b上,则有,
y=sigmoid(z).
sigmoid(z)=1+e−z1.

注:后文的参数w/b的表示中,我们将这两个参数分开处理,而不采用将w/b写在同一个参数向量中的方法。
四、逻辑回归的cost function(成本/代价函数)
我们需要通过给出的m个样本的训练集来学习,找到最适合的参数w/b,得到输出:y(i)≈y(i).
定义loss(error) function损失/误差函数:
L(y,y)=21(y−y)2.
但是,在逻辑回归中,不建议用如上的损失函数,因为学习参数时,讨论问题会变成非凸,那么对于梯度下降法来说就不好用(找到多个局部最优解但是可能找不到全局最优)
所以,我们定义了如下损失函数:
L(y,y)=−(ylogy+(1−y)log(1−y)).
为什么选择这个函数作为损失函数?下面的式子可以解释原因:

简单总结即是:
- y=1时,y(i)→1使得L(y,y)最小;
- y=0时,y(i)→0使得L(y,y)最小;
以上的损失函数衡量了单个样本上的表现,现在定义cost function成本函数来衡量在整个样本上的表现:
J(w,b)=m1∑i=1mL(y(i),y(i)).
J(w,b)=−m1∑i=1m[y(i)logy(i)+(1−y(i))log(1−y(i))].
- loss损失函数:单个样本的表现
- cost成本函数:整个样本的表现
五、Gradient Descent(梯度下降法)
总体成本函数:
J(w,b)=−m1∑i=1m[y(i)logy(i)+(1−y(i))log(1−y(i))].
将w和b放在两个坐标轴上,则J(w,b)即是函数图像上的一个点,我们需要找到的点就是图像的最低点,如下:

成本函数是一个凸函数,所以不管怎样初始化参数,最终都应该达到一个大致相同的点。
这里我们采用的方法是“梯度下降法”。
梯度下降法:从初始点开始,朝最陡的下坡方向走一步(尽可能快得往下走),这便是梯度下降的第一次迭代过程。继续迭代,最终希望能收敛到全局最优或接近全局最优。

为了更直观地展示梯度下降法,以w和J(w)为例画出二维平面坐标系,要做的工作是不断更新w使得J(w)达到最小值。

w:=w−αdwdJ(w).
其中,式子中的:=
符号表示更新变量值,α是学习率。在编程中,通常将dwdJ(w)写作dw,即上式可简化为:
w:=w−αdw.
于是接着分析J(w,b)中的参数更新,有如下式子:
w:=w−α∂w∂J(w,b).
b:=b−α∂b∂J(w,b).
同样的,编程时∂w∂J(w,b)写作dw,∂b∂J(w,b)写作db.
六、逻辑回归中的梯度下降
z=wTx+by=a=σ(z)=1+e−z1L(a,y)=−(ylog(a)+(1−y)log(1−a))
假设样本2个特征x1,x2,同时存在参数w1,w2,b.

根据计算图的反向传播算法(链式求导法则),我们得到如下计算结果:
da=daL(a,y)=−ay+1−a1−ydz=dzdL(a,y)=dadL(a,y)dzda
那么问题来了!这个问题也是课程中大家积极讨论的地方——dzda怎么求解?
a=σ(z)=1+e−z1⇒dzda=(1+e−z)2e−z=a(1−a)
其实就是涉及到将关于自变量z的分式代换回关于因变量a的分式。
最终计算得到:
dz=a−y.
紧接着往左计算,
dw1=x1dzdw2=x2dzdb=dz
得出上述导数值后,即可实现单个样本实例的一次梯度更新步骤,根据梯度下降法中参数的调整方法使得结果趋近于全局最优。
w1:=w1−αdw1w1:=w2−αdw2b:=b−αdb
注意:更新参数值用:=
符号表示。
然而我们知道,训练模型时不仅仅只有一个训练样本,当有m个样本的整个训练集时,我们将如何应用逻辑回归的梯度下降法?
七、m个样本的梯度下降
将逻辑回归中的梯度下降应用到m个样本中,其实就是用一个大循环对m个样本进行参数计算,进而求和求平均得到全局梯度值。

算法伪代码

算法的缺点及改进
- 算法使用两个完全显式的for循环可能会使算法低效——1到m个样本的计算过程、遍历所有特征(dw1,...,dwn, 维度是nx)
- 完全不用完全显式for循环,能处理更大的数据集。有一门向量化技术,可以摆脱显式for循环!