第二课(1):神经网络的编程基础
2.1 二分类(binary classification)
遍历m个样本的训练集,神经网络通常不进行for循环遍历,神经网络计算中先进行前向传播,后进行反向传播。
逻辑回归是一个用于二分类的算法
例:加入图片大小为64*64像素,保存图片需要分别保存三个矩阵(红、绿、蓝三个颜色通道)
将所有颜色通道保存,得到
x
x
x的总维度为
64
?
64
?
3
64*64*3
64?64?3,因此
n
x
=
12288
n_x=12288
nx?=12288?表示特征向量的纬度,如图所示,用小写
n
n
n表示特征向量
x
x
x?的纬度。因此问题转化为二分类中找到一个分类器输入图片的特征向量,预测输出结果
y
=
1
/
0
y=1/0
y=1/0?,即预测图片中是否有猫。
符号定义:
对于一个单独的样本
(
x
,
y
)
(x,y)
(x,y),
x
x
x:表示一个
n
x
n_x
nx?维数据,为输入数据,纬度为
(
n
x
,
1
)
(n_x,1)
(nx?,1);
y
y
y:表示输出结果,取值为
(
0
,
1
)
(0,1)
(0,1);
(
x
(
i
)
,
y
(
i
)
)
(x^{(i)},y^{(i)})
(x(i),y(i)):表示第
i
i
i组数据,可能是训练数据,也可能是测试数据,此处默认为训练数据;例:
(
x
(
1
)
,
y
(
1
)
)
(x^{(1)},y^{(1)})
(x(1),y(1))表示第一个样本的输入和输出,以此类推。?
X
=
[
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
m
)
]
X=[x^{(1)},x^{(2)},...,x^{(m)}]
X=[x(1),x(2),...,x(m)]:表示所有的训练数据集的输入值,放在一个
n
x
?
m
n_x*m
nx??m的矩阵中,其中
m
m
m表示样本数目,通常在python中用X.shape() 来输出矩阵的纬度,即
n
x
?
m
n_x*m
nx??m?;
Y
=
[
y
(
1
)
,
y
(
2
)
,
.
.
.
,
y
(
m
)
]
Y=[y^{(1)},y^{(2)},...,y^{(m)}]
Y=[y(1),y(2),...,y(m)]?:表示所有训练数据集的输出值,纬度为
1
?
m
1*m
1?m??,Y.shape() 。
m
m
m?:表示样本的个数,对于训练集
m
t
r
a
i
n
m_{train}
mtrain???,对于测试集
m
t
e
s
t
m_{test}
mtest??
2.2 逻辑回归(Logistic Regression)
对一个算法进行预测通常是
y
^
\widehat{y}
y
??,也就是对实际值
y
y
y?的估计,即
y
^
\widehat{y}
y
??表示
y
=
1
y=1
y=1?的可能性或者是机会,前提是给定了输入特征
X
X
X?。用
w
w
w??来表示逻辑回归的参数,即特征权重?,维度与特征向量相同,b为表示偏差的实数(相当于机器学习课程中的偏置项
x
0
=
1
,
b
=
θ
0
x_0=1,b=\theta_0
x0?=1,b=θ0??),
y
^
=
w
T
x
+
b
\widehat{y}=w^Tx+b
y
?=wTx+b?。该线性函数对于二分类问题来说并不是好算法。
希望
y
^
\widehat{y}
y
?介于
0
?
1
0-1
0?1之间,因此引入一个函数,即
s
i
g
m
o
i
d
sigmoid
sigmoid?函数作用在输出上,如上图所示。
下图表示
s
i
g
m
o
i
d
sigmoid
sigmoid函数:
s
i
g
m
o
i
d
sigmoid
sigmoid函数公式如下:
σ
(
z
)
=
1
1
+
e
?
z
\sigma(z)=\frac{1}{1+e^{-z}}
σ(z)=1+e?z1?
z
z
z是实数,
z
z
z?无穷大时
e
?
z
e^{-z}
e?z将会接近0,则
s
i
g
m
o
i
d
sigmoid
sigmoid函数将接近1,相反
z
z
z负无穷小,
s
i
g
m
o
i
d
sigmoid
sigmoid?函数将接近0.
下一步要训练参数
w
w
w和参数
b
b
b?,因此需要定义一个代价函数。
2.3 逻辑回归的代价函数(Logistic Regression Cost Function)
为了训练参数
w
w
w和
b
b
b,需要定义代价函数,下面是逻辑回归的输出函数
上标
(
i
)
(i)
(i)表示数据的第
i
i
i个训练样本。
逻辑回归中的损失函数:
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)=?ylog(y
?)?(1?y)log(1?y
?) 不使用预测值与实际值平方差的原因:采用这种方法找不到全局最优值。
需要保证损失函数尽可能小
当
y
=
1
y=1
y=1时,损失函数
L
=
?
l
o
g
(
y
^
)
L=-log(\widehat{y})
L=?log(y
?),要保证损失函数尽可能小,则
y
^
\widehat{y}
y
?尽可能大。因为
s
i
g
m
o
i
d
sigmoid
sigmoid函数取值为
[
0
,
1
]
[0,1]
[0,1],所以
y
^
\widehat{y}
y
?会无限接近于
1
1
1?。
当
y
=
0
y=0
y=0时同样道理。
课程中很多情况类似,如果
y
=
1
y=1
y=1,我们尽可能让
y
^
\widehat{y}
y
?变大,如果
y
=
0
y=0
y=0,我们尽可能让
y
^
\widehat{y}
y
??变小。
损失函数通常用来衡量单个训练样本的表现,当需要衡量全部训练样本的表现时,我们定义算法的代价函数,代价函数是对
m
m
m个样本的损失函数求和然后除以
m
m
m:
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
=
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}L(\widehat{y}^{(i)},y^{(i)})=\frac{1}{m}\sum_{i=1}^{m}(-y^{(i)}log\widehat{y}^{(i)}-(1-y^{(i)})log(1-\widehat{y}^{(i)}))
J(w,b)=m1?i=1∑m?L(y
?(i),y(i))=m1?i=1∑m?(?y(i)logy
?(i)?(1?y(i))log(1?y
?(i))) 因此,我们需要找到合适的
w
w
w和
b
b
b,使得代价函数
J
J
J?的总代价降到最低。可以认为逻辑回归可以看做是一个非常小的神经网络。
2.4 梯度下降法(Gradient Descent)
在测试集上,通过最小化代价函数(成本函数)
J
(
w
,
b
)
J(w,b)
J(w,b)来训练参数
w
w
w和
b
b
b,
梯度下降形象化:
实际值
w
w
w可以是更高纬度,如图代价函数是一个凸函数,像一个大碗一样,
w
:
=
w
?
α
d
J
(
w
,
b
)
d
w
w:=w-\alpha\frac{dJ(w,b)}{dw}
w:=w?αdwdJ(w,b)?
b
:
=
b
?
a
d
J
(
w
,
b
)
d
b
b:=b-a\frac{dJ(w,b)}{db}
b:=b?adbdJ(w,b)?
梯度下降法:重复迭代如上两个公式
其中
α
\alpha
α??为学习率(Learning rate),用来控制步长,导数也就是斜率,这块没有找到那个希腊字母,用d代替求偏导数符号。
2.5 导数(Derivatives)
PASS
2.6 更多导数例子(More Derivative Examples)
PASS
2.7 计算图(Computation Graph)
2.8 使用计算图求导数
链式求导法则
程序中我们通常用
d
v
a
r
dvar
dvar?来表示导数
2.9 逻辑回归中的梯度下降(Logistic Regression Gradient Descent)
单个样本的梯度下降算法更新:
w
1
=
?
a
d
w
1
,
w
2
=
w
2
?
a
d
w
2
,
b
=
b
?
α
d
b
w_1=-adw_1,w_2=w_2-adw_2,b=b-\alpha db
w1?=?adw1?,w2?=w2??adw2?,b=b?αdb
2.10 m个样本的梯度下降
损失函数的定义:
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
a
(
i
)
,
y
(
i
)
)
=
1
m
∑
i
=
1
m
(
?
y
(
i
)
l
o
g
a
(
i
)
?
(
1
?
y
(
i
)
)
l
o
g
(
1
?
a
(
i
)
)
)
J(w,b)=\frac{1}{m}\sum_{i=1}^{m}L(a^{(i)},y^{(i)})=\frac{1}{m}\sum_{i=1}^{m}(-y^{(i)}loga^{(i)}-(1-y^{(i)})log(1-a^{(i)}))
J(w,b)=m1?i=1∑m?L(a(i),y(i))=m1?i=1∑m?(?y(i)loga(i)?(1?y(i))log(1?a(i)))
上面只进行了一步梯度下降,实际中需要重复该内容很多次。
缺点:需要两个for循环,第二个循环用来遍历所有特征,(通常for循环使得算法效率降低)
处理大量数据通常使用向量化的方法,下节课见
|