本笔记是吴恩达(Andrew Ng) 的【微专业】深度学习工程师系列课程笔记。
01.神经网络和深度学习之第二周——笔记1神经网络基础
本周学习内容
本周,学习神经网络编程的基础知识。当要构建一个神经网络,有些技巧是相当重要的。例如,如果有m个样本的训练集,可能会习惯性地去用一个
for循环
来遍历这m
个样本。但事实上实现一个神经网络,如果要遍历整个训练集,不需要直接使用for
循环。在本周的课程,你会学到如何做到。在神经网络的计算过程中,通常有一个
正向过程
或者叫正向传播步骤
,接着会有一个反向步骤
也叫做反向传播步骤
。在本周的课程中会讲解为什么神经网络的计算过程可以分为正向传播
和反向传播
两个分开的过程。
【2.1 二分分类(Binary Classification)】
Logistic
回归是一个用于二分分类的算法,可以从一个问题开始。这里有一个二分分类问题的例子,例如你有一张图片作为输入,就像这样,如果想输出识别此图的标签,且猫输出 1,如果不是则输出 0,我们用来
y
y
表示输出的结果标签:
先看看一张照片在计算机中是如何表示的。计算机保存一张图片,要保存三个独立矩阵分别对应图中红蓝绿三个颜色通道。如果图片是 像素的,就有三个
64×64
64
×
64
矩阵对应图片中的红绿蓝三种像素的亮度。为了方便展示,这里的示例用三个小矩阵:
要把这些像素的亮度值放入一个特征向量中,就要把这些像素值都提取出来,放入一个特征向量 x x ,为了把这些像素值取出放入特征向量中需要定义一个特征向量 以表示这张图片。
颜色通道
把图片中所有像素强度值都列出来,如果图片是 64×64 64 × 64 的,那么向量 x x 的总维度就是 ,因为这是三个矩阵的元素数量。我们用 nx=12288 n x = 12288 来表示输入特征向量 x x 的维度,有时候为了简洁,会直接用小写的n表示输入特征向量的维度。
在二分类问题中目标是训练出一个分类器,它以图片的特征向量 x
作为输入,预测输出的结果是标签 y
(0或1),也就是说预测图片中是否有猫。
现在看看在后面课程中需要用到的一些符号。用一对 (x, y)
表示一个单独的样本,其中 是
nx
n
x
维的向量,标签 y
值为 0 或 1 。
训练集由m个训练样本构成, (x(1),y(1)) ( x ( 1 ) , y ( 1 ) ) 表示第一个样本, (x(2),y(2)) ( x ( 2 ) , y ( 2 ) ) 表示第二个样本… (x(m),y(m)) ( x ( m ) , y ( m ) ) 表示最后一个样本,这些一起就表示整个训练集。
用小写字母
m
m
表示训练集的个数,有时为了强调这个字母是训练集的个数可以写作 ,用,用
mtest
m
t
e
s
t
表示测试集的样本数量。最后,用更紧凑的符号表示训练集,我们定义一个矩阵,用大写的表示测试集的样本数量。最后,用更紧凑的符号表示训练集,我们定义一个矩阵,用大写的 X
表示,它由训练集中的表示,它由训练集中的
x(1),x(2),…x(m)
x
(
1
)
,
x
(
2
)
,
…
x
(
m
)
组成:
这个矩阵由 m
列组成,高度为
nx
n
x
,
注意:有时候矩阵XX的定义是训练样本作为行向量堆叠,而不是这样列向量堆叠。在构建神经网络时,用上述这种约定形式,会让构建过程列简单。
当用 Python 实现的时候你会看到 X.shape=(nx,m) X . s h a p e = ( n x , m ) ,这条 Python 命令用来输出矩阵的维度 。
这就是如何将训练样本,即输入xx用矩阵表示,对于输出标签 y y 同样为了方便构一个建神经网络将 标签也放到列中,所以我们定义
在后面的课程中,要实现神经网络,你会发现好的惯例符号能够将不同训练样本的数据联系起来,这里说的数据不仅有 x x , ,还会有之后其他变量,将不同的训练样本数据取出来,放到不同的列上,就像刚刚我们处理 x x , 那样。
这门课程中在 logistic
回归和神经网络要用到的符号就这些了。
【2.2 logistic 回归(Logistic Regression)】
本节将会讲解 logistic
回归,logistic
是一个学习算法,用在监督学习问题中输出标签
y^
y
^
是 0 或 1 的时候,这是一个二元分类问题。
已知的输入特征向量x
可能是一张图,你希望识别出这个图里是不是一只猫。你需要一个算法可以给出一个预测值我们说预测值
y^
y
^
,就是你对 y
的预测。更正式的说,你希望
y^
y
^
是一个概率,当输入特征 x
满足条件时 y
就是 1。所以换句话说,如果 x
是图片,正如我们在上一节中看到,你希望
y^
y
^
能告诉你这个图里是猫的概率。所以 x
正如我们之前课程里所说的是一个
nx
n
x
维向量:
已知 logistic
回归的参数是 w
(也是
nx
n
x
维向量,
w∈Rnx
w
∈
R
n
x
) 而 b
就是一个实数,所以已知输入 x
、参数 w
和 b
,我们如何计算输出预测
y^
y
^
?你可以试试(但其实并不靠谱)
y^=σ(wTx+b)
y
^
=
σ
(
w
T
x
+
b
)
,输入 x
的线性函数,事实上,如果你做线性回归就是这么算的。但这并不是一个非常好的二元分类算法,因为你希望
y^=1
y
^
=
1
,所以
y^
y
^
应该在 0 和 1 之间,但事实上这很难实现,因为
wTx+b
w
T
x
+
b
可能比 1 大的多或者甚至是负值,这样的概率是没有意义的,你希望
y^
y
^
在 0 和 1 之间。所以在 logisticl
回归中我们的输出变成:
y^=σ(wTx+b)
y
^
=
σ
(
w
T
x
+
b
)
,加上一个 sigmoid
函数,
sigmoid(x)
s
i
g
m
o
i
d
(
x
)
函数的图形如下图所示:
sigmoid(x) s i g m o i d ( x ) 公式为:
要注意一些事项,如果 z
非常大,那么
e−z
e
−
z
就很接近 0 那么
sigmoid(z)
s
i
g
m
o
i
d
(
z
)
无限接近 1,事实上可以看看左图,z 很大时 sigmoid(z) 就很接近 1 。相反如果 z
很小 或是非常大的负数,
sigmoid(z)
s
i
g
m
o
i
d
(
z
)
就会无限接近 0。所以当你实现 logistic
函数时,你要做的是学习参数 w
和 b
,所以
y^
y
^
变成了对
y=1
y
=
1
比较好的估计。
在继续之前,再讲讲符号约定当我们对神经网络编程时,通常会把 w
和参数 b
分开(这里 b
对应一个拦截器)。在其他课程是你可能看过其他不同的表示,在一些符号约定中,定义一个额外的特征向量
x0=1
x
0
=
1
所以出现 x
是
Rnx+1
R
n
x
+
1
维向量;将
y^
y
^
定义为
σ(θTx)
σ
(
θ
T
x
)
在这种符号约定中,你有一个向量参数
θ=[θ0θ1⋯θnx]T
θ
=
[
θ
0
θ
1
⋯
θ
n
x
]
T
,所以,所以
θ0
θ
0
扮演是的 b
的角色,这是一个实数而扮演是的 b
的角色,这是一个实数而
θ1
θ
1
到
θnx
θ
n
x
的作用和 w
一样。事实上,当你实现神经网络时,将 b
和 w
看成单独的参数可能更好,所以对于这门课,不会使用这种符号约定。