第二周
- 2.1 二分类(Binary Classification)
- 2.2 逻辑回归 (Logistic Regression)
- 2.3 逻辑回归的代价函数( Logistic Regression Cost Function
- 2.4 梯度下降法 ( Gradient Descent )
- 2.5 导数( Derivatives)
- 2.6 更多的导数例子( More Derivative Examples)
- 2.7 计算图( Computation Graph)
- 2.8 使用计算图求导数 Derivatives with a Computation Graph)
- 2.9 逻辑回归中的梯度下降( Logistic Regression Gradient Descent)
- 2.10 m 个样本的梯度下降 (Gradient Descent on m Examples)
- 2.11 向量化 (Vectorization)
- 2.12 向量化的更多例子( More Examples of Vectorization)
2.1 二分类(Binary Classification)
符号定义
𝑥:表示一个
n
x
n_{x}
nx维数据,为输入数据,维度为
(
n
x
,
1
)
(n_{x},1)
(nx,1)
𝑦:表示输出结果,取值为 (0,1)
(
x
(
i
)
,
y
(
i
)
)
(x^{(i)},y^{(i)})
(x(i),y(i)):表示第 𝑖组数据,可能是训练 数据,也可能是测试数据,此处默认为训练数据;
X由输入向量组成,是一个规模为 n x n_{x} nx乘以 𝑚的矩阵,Y为训练的输出值,是一个规模为 1乘以 𝑚的矩阵。在使用python实现时,一般使用X.shape = ( n x n_{x} nx,m),Y.shape = (1,m)
2.2 逻辑回归 (Logistic Regression)
我们用 𝑤来表示逻辑回归的参数,这也是一个 𝑛𝑥维向量(因为 𝑤实际上是特征权重,维度与特征向量相同),参数里面还有 𝑏,这是一个实数(表示偏差)。所以给出输入 𝑥以及参数 𝑤和 𝑏之后,我们让
y
^
=
w
T
x
+
b
\hat{y}=w^{T}x+b
y^=wTx+b。
为了将线性函数转为非线性,输出应该是
y
^
=
σ
(
w
T
+
b
)
\hat{y}=\sigma (w^{T}+b)
y^=σ(wT+b)
下图是 sigmoid 函数的图像
2.3 逻辑回归的代价函数( Logistic Regression Cost Function
为了训练逻辑回归模型的参数参数𝑤和参数 𝑏我们,需要一个代价函数,通过训练代价函数来得到参数 𝑤和参数 𝑏。先看一下逻辑回归的输出函数:
为了让模型通过学习调整参数,你需要给予一个𝑚样本的训练集,这会让你在训练集上找到参数 𝑤和参数 𝑏,,来得到你的输出。
损失函数:
损失函数又叫做误差函数,用来衡量算法的运行情况,Loss function:𝐿(
y
^
,
y
\hat{y},y
y^,y).
我们在逻辑回归中用到的损失函数是:
L
(
y
^
,
y
)
=
−
y
l
o
g
(
y
^
)
−
(
1
−
y
)
l
o
g
(
1
−
y
^
)
L(\hat{y},y)=-ylog(\hat{y})-(1-y)log(1-\hat{y})
L(y^,y)=−ylog(y^)−(1−y)log(1−y^)
在这门课中有很多的函数效果和现在这个类似,就是如果𝑦等于 1,我们就尽可能让
y
^
\hat{y}
y^大,如果 𝑦等于 0,我们就尽可能让
y
^
\hat{y}
y^ 变小。
需要定义一个算法的代价函数,算法的代价函数是对 𝑚个样本的损失函数求和然后除以 𝑚:
2.4 梯度下降法 ( Gradient Descent )
梯度下降法可以在测试集上,通过最小化代价函数(成本函数) 𝐽(𝑤,𝑏)来训练的参数 𝑤和 𝑏,形象化说明如图所示:
由于逻辑回归的代价函数(成本函数) 𝐽(𝑤,𝑏)特性,我们必须定义代价函数(成本函数) 𝐽(𝑤,𝑏)为凸函数。初始化 𝑤和 𝑏,然后朝最陡的下坡方向走一步,不断地迭代,直到走到全局最优解或者接近全局最优解的地方。
即:
其中,𝑎 表示学习率( learning rate),用来控制步长 step),即向下走一步的长度。
2.5 导数( Derivatives)
略
2.6 更多的导数例子( More Derivative Examples)
略
2.7 计算图( Computation Graph)
可以说,一个神经网络的计算,都是按照前向或反向传播过程组织的。首先我们计算出一个新的网络的输出(前向过程),紧接着进行一个反向传输操作。后者我们用来计算出对应的梯度或导数。计算图解释了为什么我们用这种方式组织这些计算过程。
下面是一个比逻辑回归更加简单的例子,用于计算函数J(从左向右):
2.8 使用计算图求导数 Derivatives with a Computation Graph)
流程图为:
我们要从右向左计算其导数:
其中用到的公式:
2.9 逻辑回归中的梯度下降( Logistic Regression Gradient Descent)
关于单个样本实例的梯度下降算法中参数更新一次的步骤:
2.10 m 个样本的梯度下降 (Gradient Descent on m Examples)
我们要把上一节中的方法扩展到m个样本中。
此时各公式变为:
应用逻辑回归和梯度下降:
代码流程如下:
J=0;dw1=0;dw2=0;db=0;
for i = 1 to m
z(i) = wx(i)+b;
a(i) = sigmoid(z(i));
J += --[y(i)log(a(i))+(1 y(i) log(1 a(i));
dz(i) = a(i) y(i);
dw1 += x1(i)dz(i);
dw2 += x2(i)dz(i);
db += dz(i);
J/= m;
dw1/= m;
dw2/= m;
db/= m;
w=w-alpha*dw
b=b-alpha*db
但是这种计算中出现了两个for循环,第一个 for循环是一个小循环遍历 𝑚个训练样本,第二个 for循环是一个遍历所有特征的 for循环。这会使算法效率很低,因此,我们要使用向量化技术
2.11 向量化 (Vectorization)
向量化是非常基础的去除代码中for循环的艺术。
使用非向量化方法去计算 w T x w^{T}x wTx,需要用如下方式 (python):
z=0
for i in range(n_x)
z+=w[i]*x[i]
z+=b
而如果使用向量化直接计算:
z=np.dot(w,x)+b
向量化相比于for循环,运行时间大大降低。
2.12 向量化的更多例子( More Examples of Vectorization)
2.11中我们已经向量化了2.10中第一个for循环,本节中可以尝试将2.10中的第二个for循环向量化。
首先,定义 𝑑𝑤 为一个向量,设置 𝑢=𝑛𝑝.𝑧𝑒𝑟𝑜𝑠(𝑛(𝑥),1),然后使用一个向量操作 d w = d w + x ( i ) d z ( i ) dw=dw+x^{(i)}dz^{(i)} dw=dw+x(i)dz(i),最后得到 𝑑𝑤=𝑑𝑤/𝑚。