解决二分类问题的算法,二分类模型的例子
本文来自网易云课堂。
两个分类问题:logistic回归中的梯度下降法本节主要使用三个核心公式:
z=wTx b
y^=a=(z)=11 e(z)
L(a,y)=(ylog(a)(1y)log(1a))
本文中使用的符号说明:
Dz=Lz,一般简称dLdz
Da=La,通常被称为dLda
Dw=Lw,通常被称为dLdw
Db=Lb,通常简称为dLdb
从下图可以清楚地看到正向传播过程。现在,计算导数。
该公式推导如下:
dLda=ya 1 y1a
dadz=a(1a)
dz=dLdz=dLdadadz=a y
dw=dLdw=dLdzdzdw=(a y)x=dzx
db=dLdb=dLdzdzdb=a y=dz
m个样品的梯度下降岩心公式:
J(w,b)=1mmi=1L(a(i),y)
a(i)=y^(i)=(z(i))=(wTx(i)
w1j(w,b)=1mmi=1w1l(a(i),y)=1mmi=1dw(i)1
全局代价函数实际上是所有损失函数的平均值,相应地,全局代价函数对w1的导数也是所有损失函数对w1的平均值。所以,我们实际要做的是计算全局梯度导数W1J (W,B),所以我们可以这样表示算法。
但是这种计算方法并不完美,我们可以通过编程来改进。首先这个算法需要写两个for循环,一个遍历M个样本,另一个遍历每个样本中的N个特征(上图只有2个特征)。当使用深度学习算法时,会发现使用for循环会使算法效率低下。同样,深度学习领域的数据集也会越来越多,所以能够在完全不使用display for loop的情况下应用你的算法是有帮助的。矢量化技术的出现可以帮助你的代码摆脱这些显示出来的for循环。
vector import numpy as NP import time a=NP . random . rand(100000)b=NP . random . rand(100000)TIC=time . time()c=NP . dot(a,b)toc=time.time()print 矢量化版本: str(1000 *(TOC-TIC)) ms c=0 TIC=time . time()for I in range(1000000):c=a[I]* b[I]TOC=time
矢量化版本:3.00002098083毫秒
250134.4175349188
对于循环:524.56949毫秒
从时间对比可以看出,向量化比for循环节省了近200倍的时间。对于深度学习算法,通过向量化可以大大提高效率。经验法则是在计算回归时避免使用for循环。
python中的Numpy模块可以实现矢量化运算。
导入numpy为np a=np.zeros((1,10))b=np.exp(a)b数组([[1。 1. 1. 1. 1. 1. 1. 1. 1. 1.]])
m个样本的Logistic回归首先,我们通过向量化消除第一个循环,过程如下:
对于m个样本,我们可以得到这样一个公式:
Z=WTX b,ZR1m,WRn1,XRnm,
其中z代表m个输出,x代表样本矩阵,包含m个样本,每个样本有n个特征值,w代表n个参数,b代表阈值。因为python中的广播机制,可以在矩阵中加入B,实际上就是将B复制扩展到相同维数的矩阵中。
其次,我们通过向量化消除第二个循环,过程如下:
我们可以如下图所示进一步修改算法,从而实现一次迭代。当然,如果要使用多次迭代,恐怕还是要使用for循环。
Z=WTX b=np.dot(W.T,X) b
A=(z)
dZ=A Y
dW=1mXdZT
db=1mnp.sum(dZ)
W=W-dW
b=b-db