引入:这课学的是神经网络编程的基础知识,构建神经网络的时候一些技巧尤为重要,比如训练每个样本,我们需要一些技巧,实际上我们并不需要像以往那样用for遍历每个样本,在接下来的内容里我们将学习到这些技巧。
还有在计算过程中,通常有一个正向传播过程,与之对应的就会有一个反向的传播步骤,我们在接下来的学习中将会了解到为什么神经网络的计算可以有想正向传播和反向传播。
用logistic回归来阐述。
2.1 二分类
例子
输入一张图片(x),输入图片的标签(y)
识别图中的是不是猫,是输出1
一张图片在计算机中保存是分成三个矩阵(红绿蓝。RGB),然后将三个像素矩阵转化为一个特征向量(将所有像素列成一列向量),特征向量的维度为所有像素个数和
标注
x是nx维的特征向量;y的标签是0或1;用矩阵表示一个训练集合,一个样本是一列,一列的高度是nx,用列表示一个样本使得后面的计算更加方便。
2.2 logistic回归模型
输入一张图片的一组特征值,想判断这张图片是不是猫图,我们算出一个概率,通过这个概率说明这是不是猫图。
x是一个nx维向量,所以权值w也是nx维的,b是实数,输出一个y hat,构成一个sigmoid函数(如下图),可以看出来当z无穷大的时候,值逼近1。所以实现logistics回归的时候,我们的工作是学习出参数 w 和 b,使得y hat成为对于y=1比较好的估计。
还有一些不同的表现形式(红字)。
2.3 logistics回归损失模型
回顾上节的logistics回归函数:
- 损失函数(误差函数)
用来衡量运行的情况,运用于单个样本。
我们可以定义损失为y hat和y的差的平方的1/2,但是如果直接用误差的平方会出现非凸优化问题(即出现多个最优解),所以在logistics回归中我们用另一种形式去表示这样相似的功能(如下用log)。我们希望损失函数的值越小越好。
- 成本函数
为了训练logistic回归模型的参数w和b,我们需要定义成本函数,训练出参数使y hat(i)接近y(i)。运用于整体样本,在训练模型的时候,我们需要使成本函数越小越好。
所以,logistics回归模型可以看成是一个很小很小的神经网络。
2.4 梯度下降
logistic回归模型梯度下降
回顾logistic回归公式
对公式进行求导,从后往前求
对于多个样本,成本函数是一个均值。对每个输入的变量求导(偏导函数中的分子是我们希望得到的输出(这里是成本函数L))。求出dw1,dw2,db后应用梯度下降,更新(:=的那三个式子)w1,w2,b。在遍历每个特征样本时,用向量化技术帮助代码摆脱显性for循环。
2.5 向量化
在python中,用命令z=np.dot(w,x)+b计算出来的就是Z=W^T X+b,还有一段python例子(比较for循环与向量值操作方法的运行时间)。
import numpy as np
import time
a=np.random.rand(1000000)
b=np.random.rand(1000000)
tic =time.time()
c=np.dot(a,b)
toc=time.time()
print("vectorized version:"+str(1000*(toc-tic))+"ms")
c=0
tic =time.time()
for i in range(1000000)
c += a[i]*b[i]
toc=time.time()
print("for loop:"+str(1000*(toc-tic))+"ms")
运行后可以看出,用向量化方法会比传统for循环快300倍。
更多例子
两个向量相乘 (左边for循环方法,右边向量值操作方法)
向量v作为指数计算出u,以及numpy库里的一些向量值操作。
u = np.zero((n,1)) //新建一个向量u(n行1列)
u=np.exp(v) //以v中的每个元素作为指数
u=np.log(v) //对v中每个元素求log
u=np.abs(v) //对每个元素求绝对值
u=np.max(v,0) //求出v中的最大值,v与0对比
u= v**2 //v中每个元素的平方
u= 1/v //每个元素的倒数
- logistic回归中求导数的程序
2.6 向量化logistics回归
回顾一下logistic回归的正向传播步骤,计算整个训练集的预测值a
假设有m个训练样本,那么对第一个样本进行预测,需要计算出z,激活函数,然后计算在第一个样本的y hat。以此类推,计算m次,所以,为了执行正向传播步骤,需要对m个训练样本都计算出预测结果。
有一个方法可以不需要任何一个显式for循环,首先我们定义输入的样本是一个nx*m的矩阵,计算Z=W^T X+b,w的转置是一个行向量,b是一个实数,但是在python 的矩阵加法中,b回自动扩展成一个行向量,与之相加,所以,可以写成Z=np.dot(W^T , X)+b。同样的,计算a可以写成,
A=sigmoid(Z)
A
=
s
i
g
m
o
i
d
(
Z
)
。
计算m个训练数据的梯度输出
我们计算dz=a-y,在上面的例子中我们已经去掉了一个for循环,接下来我们实现对遍历训练样本的循环进行了向量化操作。
以下右边的代码,实现了神经网络的正向反向传播,以及求导输出,且没有用一个for循环。(其中
b=w−αdw,α是学习率
b
=
w
−
α
d
w
,
α
是
学
习
率
)。
这样,我们实现了logistic回归的梯度下降的一次迭代,但是如果你需要多次梯度下降,仍然是需要用到for循环,比如需要进行1000次梯度下降迭代,可以在外面加一个for循环。
2.7 关于python / numpy
构建向量
第一种既不是行向量也不是列向量
推荐使用(行,列)新建矩阵
python中的广播(broadcasting)
(n,1)与实数加减乘除,会自动将实数复制扩展成(n,1)的形式
(n,m)与(n,1)或(1,m)加减乘除,会自动将单行或者单列的扩展成(n,m)