文章目录
一、Binary Classificatioin(二分分类)
(一)图像的表示方法
引入:给你一幅图片,识别出是否是猫(1:cat vs 0:non cat)。
原理:将二维图像表示为三原色(即red、green、blue),每一个原色可以用
64
×
64
64 \times 64
64×64的矩阵表示出来,在每一个像素点位置叠加,从而得到每个像素点的颜色。
很容易知道,1或0作为输出
y
y
y,而三原色矩阵中的元素作为输入
x
x
x。
于是便产生了问题:怎样存储这
64
×
64
×
3
64 \times 64 \times 3
64×64×3个数字?
答案很简单,用
(
64
×
64
×
3
)
×
1
(64 \times 64 \times 3) \times 1
(64×64×3)×1的特征向量存储,从红到绿到蓝依此遍历元素,向量维度为
n
x
=
12288.
n_x=12288.
nx=12288.
x = [ 255 231 . . . 255 134 . . . 255 134 . . . ] . x=\left[ \begin{matrix} 255\\231\\ ... \\255\\134\\...\\255\\134\\... \end{matrix} \right]. x=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡255231...255134...255134...⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤.
(二)符号表示方法(Notation)
(
x
,
y
)
(x,y)
(x,y)为单独样本,
x
∈
R
n
x
,
y
∈
{
0
,
1
}
.
x \in R^{n_x},y \in \{0,1\}.
x∈Rnx,y∈{0,1}.
m
m
m个训练样本:
{
(
x
(
1
)
,
y
(
1
)
)
、
(
x
(
2
)
,
y
(
2
)
)
、
.
.
.
、
(
x
(
m
)
,
y
(
m
)
)
}
.
\{(x^{(1)},y^{(1)})、(x^{(2)},y^{(2)})、...、(x^{(m)},y^{(m)})\}.
{(x(1),y(1))、(x(2),y(2))、...、(x(m),y(m))}.
为更紧凑地表示出训练集,用矩阵的形式囊括:
X = [ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x ( 1 ) x ( 2 ) x ( 3 ) . . . x ( m ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] . X=\left[ \begin{matrix} ... & ... & ... & ... & ...\\ ... & ... & ... & ... & ... \\ x^{(1)} & x^{(2)} & x^{(3)} & ... & x^{(m)} \\ ... & ... & ... & ... & ... \\... &...&...&...&...\end{matrix} \right]. X=⎣⎢⎢⎢⎢⎡......x(1)............x(2)............x(3)...........................x(m)......⎦⎥⎥⎥⎥⎤.
其中,列数
m
m
m是样本数量,行数
n
x
n_x
nx是每个输入向量的维度。
注意!在深度学习中,我们通常采用如上列堆叠的方式,该约定方式可以让构建过程更简单。
x
∈
R
n
x
×
m
.
x \in R^{n_x \times m}.
x∈Rnx×m.
在python编程中,X.shape = (n_x, m)
同理,将标签
y
y
y放入列中,定义如下:
Y
=
[
y
(
1
)
y
(
2
)
y
(
3
)
.
.
.
y
(
m
)
]
.
Y=\left[ \begin{matrix} y^{(1)} & y^{(2)} & y^{(3)} & ... & y^{(m)} \end{matrix} \right].
Y=[y(1)y(2)y(3)...y(m)].
y
∈
R
1
×
m
.
y \in R^{1\times m}.
y∈R1×m.
在python编程中,Y.shape = (1, m)
符号表示方法小结:如果用好的惯例符号表示,能够将不同训练样本的数据联系起来。
三、Logistic回归基础知识
引入:以上一篇笔记中“判断是否是猫”的例子中,当给出输入
x
x
x时,我们希望得到一个概率结果,即是“是猫的概率有多大?”
即求解:
y
^
=
P
{
y
=
1
∣
x
}
.
\widehat{y}=P\{y=1|x\}.
y
=P{y=1∣x}.
已知:
x
∈
R
n
x
.
x\in R^{n_x}.
x∈Rnx.
参数:
w
∈
R
n
x
,
b
∈
R
.
w\in R^{n_x},b\in R.
w∈Rnx,b∈R.
从而得到输出结果:
z
=
w
T
+
b
.
z=w^T+b.
z=wT+b.
但是,这个关于
x
x
x的线性函数并不能将结果映射到
[
0
,
1
]
[0,1]
[0,1]区间内,即不能表达概率取值。
所以,在Logistic回归中,我们将
s
i
g
m
o
i
d
sigmoid
sigmoid函数作用到
w
T
+
b
w^T+b
wT+b上,则有,
y
^
=
s
i
g
m
o
i
d
(
z
)
.
\widehat{y}=sigmoid(z).
y
=sigmoid(z).
s i g m o i d ( z ) = 1 1 + e − z . sigmoid(z)=\frac{1}{1+e^{-z}}. sigmoid(z)=1+e−z1.
注:后文的参数
w
/
b
w/b
w/b的表示中,我们将这两个参数分开处理,而不采用将
w
/
b
w/b
w/b写在同一个参数向量中的方法。
四、逻辑回归的cost function(成本/代价函数)
我们需要通过给出的
m
m
m个样本的训练集来学习,找到最适合的参数
w
/
b
w/b
w/b,得到输出:
y
^
(
i
)
≈
y
(
i
)
.
\widehat{y}^{(i)} \approx y^{(i)}.
y
(i)≈y(i).
定义loss(error) function损失/误差函数:
L
(
y
^
,
y
)
=
1
2
(
y
^
−
y
)
2
.
L(\widehat{y},y)=\frac{1}{2}(\widehat{y}-y)^2.
L(y
,y)=21(y
−y)2.
但是,在逻辑回归中,不建议用如上的损失函数,因为学习参数时,讨论问题会变成非凸,那么对于梯度下降法来说就不好用(找到多个局部最优解但是可能找不到全局最优)
所以,我们定义了如下损失函数:
L
(
y
^
,
y
)
=
−
(
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
)
.
L(\widehat{y},y)=-(ylog\widehat{y}+(1-y)log(1-\widehat{y})).
L(y
,y)=−(ylogy
+(1−y)log(1−y
)).
为什么选择这个函数作为损失函数?下面的式子可以解释原因:
简单总结即是:
- y = 1 y=1 y=1时, y ^ ( i ) → 1 \widehat{y}^{(i)} \to 1 y (i)→1使得 L ( y ^ , y ) L(\widehat{y},y) L(y ,y)最小;
- y = 0 y=0 y=0时, y ^ ( i ) → 0 \widehat{y}^{(i)} \to 0 y (i)→0使得 L ( y ^ , y ) L(\widehat{y},y) L(y ,y)最小;
以上的损失函数衡量了单个样本上的表现,现在定义cost function成本函数来衡量在整个样本上的表现:
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
.
J(w,b)=\frac{1}{m}\sum_{i=1}^m L(\widehat{y}^{(i)},y^{(i)}).
J(w,b)=m1i=1∑mL(y
(i),y(i)).
J ( w , b ) = − 1 m ∑ i = 1 m [ y ( i ) l o g y ^ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ] . J(w,b)=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}log\widehat{y}^{(i)}+(1-y^{(i)})log(1-\widehat{y}^{(i)})]. J(w,b)=−m1i=1∑m[y(i)logy (i)+(1−y(i))log(1−y (i))].
- loss损失函数:单个样本的表现
- cost成本函数:整个样本的表现
五、Gradient Descent(梯度下降法)
总体成本函数:
J
(
w
,
b
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
l
o
g
y
^
(
i
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
y
^
(
i
)
)
]
.
J(w,b)=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}log\widehat{y}^{(i)}+(1-y^{(i)})log(1-\widehat{y}^{(i)})].
J(w,b)=−m1i=1∑m[y(i)logy
(i)+(1−y(i))log(1−y
(i))].
将
w
和
b
w和b
w和b放在两个坐标轴上,则
J
(
w
,
b
)
J(w,b)
J(w,b)即是函数图像上的一个点,我们需要找到的点就是图像的最低点,如下:
成本函数是一个凸函数,所以不管怎样初始化参数,最终都应该达到一个大致相同的点。
这里我们采用的方法是“梯度下降法”。
梯度下降法:从初始点开始,朝最陡的下坡方向走一步(尽可能快得往下走),这便是梯度下降的第一次迭代过程。继续迭代,最终希望能收敛到全局最优或接近全局最优。
为了更直观地展示梯度下降法,以
w
w
w和
J
(
w
)
J(w)
J(w)为例画出二维平面坐标系,要做的工作是不断更新
w
w
w使得
J
(
w
)
J(w)
J(w)达到最小值。
w
:
=
w
−
α
d
J
(
w
)
d
w
.
w :=w-\alpha\frac{d J(w)}{dw}.
w:=w−αdwdJ(w).
其中,式子中的:=
符号表示更新变量值,
α
\alpha
α是学习率。在编程中,通常将
d
J
(
w
)
d
w
\frac{d J(w)}{dw}
dwdJ(w)写作
d
w
dw
dw,即上式可简化为:
w
:
=
w
−
α
d
w
.
w :=w-\alpha dw.
w:=w−αdw.
于是接着分析
J
(
w
,
b
)
J(w,b)
J(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).
同样的,编程时
∂
J
(
w
,
b
)
∂
w
\frac{\partial J(w,b)}{\partial w}
∂w∂J(w,b)写作
d
w
dw
dw,
∂
J
(
w
,
b
)
∂
b
\frac{\partial J(w,b)}{\partial b}
∂b∂J(w,b)写作
d
b
.
db.
db.
六、逻辑回归中的梯度下降
z
=
w
T
x
+
b
y
^
=
a
=
σ
(
z
)
=
1
1
+
e
−
z
L
(
a
,
y
)
=
−
(
y
l
o
g
(
a
)
+
(
1
−
y
)
l
o
g
(
1
−
a
)
)
z=w^Tx+b\\\widehat{y}=a=\sigma(z)=\frac{1}{1+e^{-z}}\\L(a,y)=-(ylog(a)+(1-y)log(1-a))
z=wTx+by
=a=σ(z)=1+e−z1L(a,y)=−(ylog(a)+(1−y)log(1−a))
假设样本2个特征
x
1
,
x
2
x_1,x_2
x1,x2,同时存在参数
w
1
,
w
2
,
b
.
w_1,w_2,b.
w1,w2,b.
根据计算图的反向传播算法(链式求导法则),我们得到如下计算结果:
d
a
=
L
(
a
,
y
)
d
a
=
−
y
a
+
1
−
y
1
−
a
d
z
=
d
L
(
a
,
y
)
d
z
=
d
L
(
a
,
y
)
d
a
d
a
d
z
da=\frac{L(a,y)}{da}=-\frac{y}{a}+\frac{1-y}{1-a}\\ dz=\frac{dL(a,y)}{dz}=\frac{dL(a,y)}{da}\frac{da}{dz}
da=daL(a,y)=−ay+1−a1−ydz=dzdL(a,y)=dadL(a,y)dzda
那么问题来了!这个问题也是课程中大家积极讨论的地方——
d
a
d
z
\frac{da}{dz}
dzda怎么求解?
a
=
σ
(
z
)
=
1
1
+
e
−
z
⇒
d
a
d
z
=
e
−
z
(
1
+
e
−
z
)
2
=
a
(
1
−
a
)
a=\sigma(z)=\frac{1}{1+e^{-z}}\\ \Rightarrow \frac{da}{dz}=\frac{e^{-z}}{(1+e^{-z})^2}=a(1-a)
a=σ(z)=1+e−z1⇒dzda=(1+e−z)2e−z=a(1−a)
其实就是涉及到将关于自变量z的分式代换回关于因变量a的分式。
最终计算得到:
d
z
=
a
−
y
.
dz=a-y.
dz=a−y.
紧接着往左计算,
d
w
1
=
x
1
d
z
d
w
2
=
x
2
d
z
d
b
=
d
z
dw_1=x_1dz\\dw_2=x_2dz\\db=dz
dw1=x1dzdw2=x2dzdb=dz
得出上述导数值后,即可实现单个样本实例的一次梯度更新步骤,根据梯度下降法中参数的调整方法使得结果趋近于全局最优。
w
1
:
=
w
1
−
α
d
w
1
w
1
:
=
w
2
−
α
d
w
2
b
:
=
b
−
α
d
b
w_1:=w_1-\alpha dw_1\\w_1:=w_2-\alpha dw_2\\b:=b-\alpha db
w1:=w1−αdw1w1:=w2−αdw2b:=b−αdb
注意:更新参数值用:=
符号表示。
然而我们知道,训练模型时不仅仅只有一个训练样本,当有 m m m个样本的整个训练集时,我们将如何应用逻辑回归的梯度下降法?
七、m个样本的梯度下降
将逻辑回归中的梯度下降应用到
m
m
m个样本中,其实就是用一个大循环对
m
m
m个样本进行参数计算,进而求和求平均得到全局梯度值。
算法伪代码
算法的缺点及改进
- 算法使用两个完全显式的 f o r for for循环可能会使算法低效——1到 m m m个样本的计算过程、遍历所有特征( d w 1 , . . . , d w n , dw_1,...,dw_n, dw1,...,dwn, 维度是 n x n_x nx)
- 完全不用完全显式for循环,能处理更大的数据集。有一门向量化技术,可以摆脱显式 f o r for for循环!