吴恩达Course1《神经网络与深度学习》week2:神经网络基础

1. 二元分类

举例说明

逻辑回归logistic regression是一个用于二分类的算法。

什么是二分类呢?

举一个例子:输入一张图片到逻辑回归模型中,该算法输出得到1(是猫)或0(不是猫)。

更具体来说,应该如何将一张图片转化为输入值呢?

在计算机中,一张图片的存储方式是用三个矩阵分别存储图片中的红、绿、蓝。假设一张图片的大小为64*64px,则一张图片的总数据量为64*64*3=12288。顺序取出红、绿、蓝三个矩阵中的数值组成一个一维列向量 x 作为输入值,该特征向量x的纬度为(n_{x}, 1),其中n_{x} = 12288

一些符号的含义

\left ( x, y \right ):表示一个单独的样本

x\in \mathbb{R}^{n_{x}}:x是n_{x}\times 1维的特征向量,输入值

 y\in\left \{ 0,1 \right \}:输出结果y只能是0或1

\left(x^{\left(i \right )} ,y^{\left(i \right )}\right ):表示第i个样本的输入和输出

m = m_{train}:训练集的样本数量        m_{test}:测试集的样本数量

为了方便之后神经网络的计算,我们通常定义(X, Y)表示输入和输出

 X=\begin{bmatrix} | & |& & |\\ x^{\left(1 \right )}& x^{\left(2 \right )}& ...& x^{\left(m \right )}\\ |& |& &| \end{bmatrix}        X\in\mathbb{R}^{n_{x}\times m}

Y=\begin{bmatrix} y^{\left(1 \right )} & y^{\left(2 \right )}& ...& y^{\left(m \right )} \end{bmatrix}        Y\in\mathbb{R}^{1\times m}

2. logistic 回归

二元分类问题是给定一个输入的特征向量x\in\mathbb{R}^{n_{x}},想要通过算法得到预测值\hat{y}。 

这个预测值可以解释为\hat{y}=P\left(y=1|x \right ),即在给定某一特征向量x的条件下y=1的概率,所以0\leqslant \hat{y}\leqslant 1

那么如何得到预测值,即算法该怎样设计呢?如果尝试让\hat{y}=w^{T}x + b(实际上是线性回归,其中w\in\mathbb{R}^{n_{x}}是特征值的权重,b\in\mathbb{R}是一个实数,表示偏差),则结果可能不在0-1之间。所以在上述式子的基础上加一个sigmoid函数。

逻辑回归模型:\hat{y} = \sigma (w^{T}x + b),其中sigmoid函数表达式为\sigma \left(z \right )=\frac{1}{1+e^{-z}}

sigmoid函数图像为

sigmoid函数特征 :当z \to +\infty 时,\sigma \left(z \right )\to1;当z\to-\infty时,\sigma \left(z \right )\to0;当z=0时,\sigma \left(z \right ) = 0.5

 3. logistic回归损失函数

对于逻辑回归模型\hat{y}=\sigma \left(w^{T}+b \right )得到的预测值\hat{y},我们想要\hat{y}尽可能接近于真实值y。所以需要使用训练集训练参数w,b,使得到的预测值\hat{y}接近于真实值y

为此,引入损失函数Loss function:L\left(\hat{y},y \right ),损失函数用来衡量预测值与真实值之间的差距。一般来说,L\left(\hat{y},y \right )=\frac{1}{2}\left(\hat{y}-y \right )^{2},但是在逻辑回归中不使用这一损失函数。原因是在使用梯度下降算法优化参数时,优化函数是非凸的,梯度下降算法找到的可能是局部最优解而不是全局最优。

所以,逻辑回归中使用另一个损失函数L\left(\hat{y},y \right )=-ylog\hat{y}-\left(1-y \right )log\left(1-\hat{y} \right )

为什么使用这一公式来计算逻辑回归的损失函数?因为能使预测值\hat{y}符合预期,即使预测值\hat{y}接近于真实值y,举例说明:

y=1时,L\left(\hat{y},y \right )=-log\hat{y},我们想要L\left(\hat{y},y \right )的值越小越好,也就是让\hat{y}\to10\leqslant \hat{y} \leqslant 1

y=0时,L\left(\hat{y},y \right )=-log(1-\hat{y}),我们想要L\left(\hat{y},y \right )的值越小越好 ,也就是让\hat{y} \to0

0\leqslant \hat{y} \leqslant 1

注意,损失函数Loss function值针对单个训练样本,即L\left(\hat{y}^{\left(i \right )}, y^{\left(i \right )} \right )

为了衡量算法在全部样本上的表现,引入代价函数Cost function:

J\left(w,b \right )=\frac{1}{m}\sum_{i=1}^{m}L\left(\hat{y}^{\left(i \right )},y^{\left(i \right )} \right )=-\frac{1}{m}\sum_{i=1}^{m}[y^{\left(i \right )}log\hat{y}^{\left(i \right )} + \left(1-y^{\left(i \right )} \right )log\left(1-\hat{y}^{\left(i \right )} \right )]

4. 梯度下降法

梯度下降算法是干什么的?在上一小节,我们学习了代价函数J\left(w,b \right ),它可以衡量算法在全部样本上的表现,J\left(w,b \right )的值越小,算法表现越好。梯度下降算法可以训练出参数w,b,使得J\left(w,b \right )的值全局最小。

根据下图大致说明梯度下降算法的执行过程:

 step1. 初始化参数w,b。对于逻辑回归,几乎所有的初始化方法都有效,通常初始化为0。因为是凸函数,所以无论在哪里初始化,都会到达最低点。

step2. 朝最陡的下坡方向走一步,不断迭代

step3. 直至走到最低点,即全局最优解

更具体来讲,如何朝最陡下坡方向进行不断迭代?

假设代价函数J\left(w \right )只有一个参数w(方便画图)

 \alpha:学习率learning rate,用来控制步长step,\alpha > 0

\frac{\mathrm{d} J\left(w \right )}{\mathrm{d} w}:导数,可形象化理解为该点斜率slope

若初始化点为A,此时\frac{\mathrm{d} J\left(w \right )}{\mathrm{d} w} > 0,故w值不断减小,向左不断逼近最低点

若初始化点为B,此时\frac{\mathrm{d} J\left(w \right )}{\mathrm{d} w}<0,故w值不断增大,向右不断逼近最低点

逻辑回归的梯度下降算法:

Repeat\left \{ w=w-\alpha \frac{\partial J\left(w,b \right )}{\partial w}, b=b-\alpha \frac{\partial J\left(w,b \right )}{\partial b} \right\}

在代码中使用dw代表\frac{\partial J\left(w,b \right )}{\partial w},使用db代表\frac{\partial J\left(w,b \right )}{\partial b}

  7. 计算图

为了方便理解神经网络中的前向传播forward propagation和反向传播back propagation过程,这一小节和下一小节会举一个比逻辑回归更简单的,不那么正式的神经网络的例子。

当我们要计算函数J=3*(a+bc)时,可以添加几个中间变量,分几步进行计算

step1. 假设a=5,b=3,c=2

step2. 计算u=bc=3\times 2=6

step3. 计算v=a+u=5+6=11

step4. 计算J=3v=3\times 11=33

前向传播过程:从左向右计算表达式

8. 计算图的导数计算

继续使用上一小节的例子,计算导数\frac{\mathrm{d} J}{\mathrm{d} v},\frac{\mathrm{d} J}{\mathrm{d} a},\frac{\mathrm{d} J}{\mathrm{d} u},\frac{\mathrm{d} J}{\mathrm{d} b},\frac{\mathrm{d} J}{\mathrm{d} c}

step1. \frac{\mathrm{d} J}{\mathrm{d} v} = 3       

step2. \frac{\mathrm{d} J}{\mathrm{d} a} = \frac{\mathrm{d} J}{\mathrm{d} v}\cdot \frac{\mathrm{d} v}{\mathrm{d} a}=3\times 1=3

step3. \frac{\mathrm{d} J}{\mathrm{d} u}=\frac{\mathrm{d} J}{\mathrm{d} v}\cdot \frac{\mathrm{d} v}{\mathrm{d} u}=3\times 1=3

step4. \frac{\mathrm{d} J}{\mathrm{d} b}=\frac{\mathrm{d} J}{\mathrm{d} u}\cdot \frac{\mathrm{d} u}{\mathrm{d} b}=3\times 2=6

step5. \frac{\mathrm{d} J}{\mathrm{d} c}=\frac{\mathrm{d} J}{\mathrm{d} u}\cdot \frac{\mathrm{d} u}{\mathrm{d} c}=3\times 3=9

反向传播过程:从右向左计算导数

9. logistic回归中的梯度下降算法

本节内容为使用计算图对逻辑回归的损失函数L(\hat{y},y)和梯度下降算法的相关导数进行计算。

逻辑回归模型:\hat{y}=\sigma (z)        z=w^{T}+b

逻辑回归的损失函数:L(\hat{y},y)=-ylog\hat{y}-(1-y)log(1-\hat{y})

举例使用计算图计算L(\hat{y},y),如下图所示:

 上图说明了在单个训练样本上计算损失函数的步骤,接下来讨论通过反向传播计算导数。因为梯度下降算法会用到\frac{\mathrm{d} L}{\mathrm{d} w_{1}},\frac{\mathrm{d} L}{\mathrm{d} w_{2}},\frac{\mathrm{d} L}{\mathrm{d} b}

step1.  \frac{\mathrm{d} L}{\mathrm{d} \hat{y}}=-\frac{y}{\hat{y}}+\frac{1-y}{1-\hat{y}}

step2.  \frac{\mathrm{d} L}{\mathrm{d} z}=\frac{\mathrm{d} L}{\mathrm{d} \hat{y}}\cdot \frac{\mathrm{d} \hat{y}}{\mathrm{d} z}=(-\frac{y}{\hat{y}}+\frac{1-y}{1-\hat{y}})\cdot \hat{y}(1-\hat{y})=\hat{y}-y

step3.  \frac{\mathrm{d} L}{\mathrm{d} w_{1}}=\frac{\mathrm{d} L}{\mathrm{d} z}\cdot \frac{\mathrm{d} z}{\mathrm{d} w_{1}}=(\hat{y}-y)x_{1}        \frac{\mathrm{d} L}{\mathrm{d} w_{2}}=\frac{\mathrm{d} L}{\mathrm{d} z}\cdot \frac{\mathrm{d} z}{\mathrm{d} w_{2}}=(\hat{y}-y)x_{2}                                            \frac{\mathrm{d} L}{\mathrm{d} b}=\frac{\mathrm{d} L}{\mathrm{d} z}\cdot \frac{\mathrm{d} z}{\mathrm{d} b}=\hat{y}-y

之后,即可计算w_{1}=w_{1}-\alpha \frac{\mathrm{d} L}{\mathrm{d} w_{1}},w_{2}=w_{2}-\alpha \frac{\mathrm{d} L}{\mathrm{d} w_{2}},b=b-\alpha \frac{\mathrm{d} L}{\mathrm{d} b}

上述为针对单个训练样本的逻辑回归梯度下降算法,但训练逻辑回归模型的训练集不可能只有1个样本,下一小节将使用整个训练样本集。

 10. m个样本的梯度下降

因为        J(w,b)=\frac{1}{m}\sum_{i=1}^{m}L(\hat{y}^{(i)},y^{(i)})

所以        \frac{\partial J(w,b)}{\partial w_{1}}=\frac{1}{m}\sum_{i=1}^{m}\frac{\partial L(\hat{y}^{(i)},y^{(i)})}{\partial w_{1}},其余参数的导数同理

所以,在m个样本的训练集上,应用梯度下降算法求解参数的代码流程如下:

# 1. 初始化
w1 = w2 = b = 0 # 参数
J = dw1 = dw2 = db = 0 # 累加器

# 2. for循环计算J,dw1,dw2,db
for i in range(1, m+1):
    z[i] = w1*x1[i] + w2*x2[i] + b
    a[i] = sigmoid(z[i]) # a代表预测值y_hat
    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

# 3. 应用梯度下降更新参数
w1 = w1 - alpha*dw1
w2 = w2 - alpha*dw2
b = b- alpha*db

# 4. 重复2、3两步直至J不再减小

上述代码由于显示使用for循环导致算法很低效,下面我们将学习向量化来提高算法效率。

11. 向量化

在逻辑回归中我们需要计算z=w^{T}+b,w,x\in \mathbb{R}^{n_{x}}

如果使用for循环,即非向量化方式,代码如下:

z = 0
for i in range(n_x):
    z += w[i] * z[i]
z += b

如果使用向量化方式,代码如下:

z = np.dot(w, x) + b

 向量化之后运算效率大幅提升。

 

12. 向量化更多例子

1. 如果我们想计算矩阵乘法u=Av,矩阵乘法定义为u_{i}=\sum_{j}^{}A_{ij}v_{j}

使用for循环,即非向量化方式,代码如下:

u = np.zeros((n,1))
for i in range(n):
    for j in range(len(v)):
        u[i] += A[i][j] * v[j]

使用向量化方式,代码如下:

u = np.dot(A,v)

 2. 如果有一列向量v = [v_{1}, ... , v_{n}]^{T},我们想要计算u = [e^{v_{1}}, ..., e^{v_{n}}]^{T}

使用for循环,非向量化方式,代码如下:

u = np.zeros((n, 1))
for i in range(n):
    u[i] = math.exp(v[i])

使用向量化方式,代码如下:

u = np.exp(v)

numpy其他一些计算方法:

np.log(v) # 计算以e为底的对数

np.abs(v) # 计算绝对值

np.maximum(v, 0) # 求取v与0中较大值

v ** 2 # v的平方

1 / v # v的倒数

所以当你想写for循环的时候,检查numpy是否存在类似的内置函数,从而避免使用for循环。

3. 使用上述方法,简化逻辑回归的for循环代码:

# 1. 初始化
w = np.zeros((n, 1)) # 参数
b = 0 
J = db = 0 # 累加器
dw = np.zeros((n, 1))

# 2. for循环计算J,dw,db
for i in range(1, m+1):
    z[i] = np.dot(w.T, x[i]) + b
    a[i] = sigmoid(z[i]) # a代表预测值y_hat
    J += -y[i]*log(a[i])-(1-y[i])log(1-a[i])
    dz[i] = a[i] - y[i]
    dw += x[i]*dz[i]
    db += dz[i]

J /= m
dw /= m
db /= m

# 3. 应用梯度下降更新参数
w = w - alpha*dw
b = b- alpha*db

# 4. 重复2、3两步直至J不再减小

13. 向量化logistic回归

本节将应用向量化方法,不再应用for循环对数据集中的m个样本进行变量。

之前对于m个样本,我们的计算过程是这样的:

对第一个样本进行预测:z^{(1)}=w^{T}x^{(1)}+b,a^{(1)}=\sigma (z^{(1)})

对第二个样本进行预测:z^{(2)}=w^{T}x^{(2)}+b,a^{(2)}=\sigma (z^{(2)})

......以此类推。

如果有m个样本,我们需要重复上述步骤m次。

现在应用向量化方法:

step1. 定义X=\begin{bmatrix} |& |& &| \\ x^{(1)} & x^{(2)}& ...& x^{(m)}\\ |& |& &| \end{bmatrix},(n_{x},m),作为输入

step2. 计算Z = [z^{(1)},z^{(2)},...,z^{(m)}] = [w^{T}x^{(1)}+b,w^{T}x^{(2)}+b,...,w^{T}x^{(m)}+b]

                       = w^{T}X+[b,b,...,b]

step3. 计算A=[a^{(1)},a^{(2)},...,a^{(m)}]=\sigma (Z)

14. 向量化logistic回归的梯度输出

本节将应用向量化方法,实现梯度下降的一次迭代过程。

step1. 定义dZ = [dz^{(1)},dz^{(2)},...,dz^{(m)}]A = [a^{(1)},a^{(2)},...,a^{(m)}]Y = [y^{(1)},y^{(2)},...,y^{(m)}]

step2. 计算dZ = A-Y =[a^{(1)}-y^{(1)},a^{(2)}-y^{(2)},...,a^{(m)}-y^{(m)}]

step3. 计算db = \frac{1}{m}\sum_{i=1}^{m}dz^{(i)}

step4. 计算dw=\frac{1}{m}\cdot X\cdot dZ^{T}=\frac{1}{m}[x^{(1)}dz^{(1)}+x^{(2)}dz^{(2)}+...+x^{(m)}dz^{(m)}]

综上,逻辑回归梯度下降算法中的一次迭代过程如下:

# 1. 初始化
w = np.zeros((n, 1)) # 参数
b = 0 
J = db = 0 # 累加器
dw = np.zeros((n, 1))

# 向量化计算J,dw,db
Z = np.dot(w.T,X) + b
A = sigmoid(Z)     # a代表预测值y_hat
J = 1/m * np.sum(-Y*np.log(A)-(1-Y)np.log(1-A))
dZ = A - Y
dw = 1/m * np.dot(X,dZ.T)
db = 1/m * np.sum(dZ)


# 3. 应用梯度下降更新参数
w = w - alpha*dw
b = b- alpha*db

# 4. 重复2、3两步直至J不再减小
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值