深度学习笔记day01
课程是看的吴恩达老师的视频,在此将一些知识点与学习心得记录下来。
一、问题集中
1.假如有m个训练样本,m值可以非常大,那么如何将这些样本数据输入神经网络呢?传统的for循环等的遍历此时在面对大样本数据时显得太过于乏力。
2.神经网络的计算过程,通常有一个正向过程(又叫做正向传播过程)和接着有一个反向步骤(又叫做反向传播步骤),为什么会这样分开两个过程?
二、二分分类问题
1. 在处理二分分类问题时,使用的算法是logistic。二分分类问题可以通过举个例子来说明,比如识别一张图片中是否有人,那么只需要识别的结果是有还是没有,就这两种结果,这就属于一个二分分类问题。
在计算机中保存一张彩色图片,需要保存三个矩阵,分别代表R,G,B三原色矩阵即三个颜色通道(肉眼看到的图片一个像素的颜色,其实是三个颜色通道混合而成的最终颜色)。
作为神经网络的输入,我们需要将这三个颜色通道的像素值放入一个特征向量X,那么如何将像素值提取出来并放入特征向量X中呢?首先需要定义特征向量X来表示图片,例如:
X=[125,25,36,...,12,36,24,...,12,36,54,78,...,12]
其中125到第一个12是R通道所有的像素值,36到第二个12是G通道所有的像素值,54到最后一个12是B通道所有的像素值,而且X是一个列向量,这是一个维度很大的列向量。习惯使用n来表示输入的特征向量的维度。
2.二分分类问题目标是训练出一个分类器,以特征向量X作为输入,预测输出的结果y是0或者1。使用(x,y)来表示一个单独的样本,其中x是n维的特征向量,y的值为0或者1,训练集由m个样本构成,使用(xi,yi)来表示样本i的输入和输出,例如xi可以表示R通道。那么{(x1,y1),(x2,y2),...,(xm,ymx)}就表示了整个训练集。使用m或者m_train来表示训练集样本数,m_test来表示测试集样本数。则训练集所有的输入可以表示为:
X=[x1,x2,...,xm]
这是一个n*m的矩阵,使用X.shape就可以得到X的维度为n*m。定义Y=[y1,y2,...,ym]
这是一个1维的行向量,使用Y.shape就可以得到Y的维度为1*m。
三、logistic使用
logistic是一个学习算法,用于监督性学习输出是0或者1时,这是一个二元分类问题。例如输入的特征向量是一张图片,希望识别出图片里面有没有猫,这时就需要一个算法,可以给出一个预测值y帽(这是数学的一个符号,可是在这里无法打出,就用音译吧),代表对真实y的预测。我们希望y帽是一个条件概率值,即y帽=P(y=1|x),当输入特征x满足条件时,y就是1。举个例子来说,就是当输入特征代表一张图片时,y帽的含义就是这张图片是猫的概率(y=1)是多少。由于y帽是一个概率值,所以y帽的值应在0到1之间,线性回归其实也可以实现二分类问题,线性回归最简单的模型是z=w*x+b,其中w是参数矩阵,这是一个1*n维的向量,b是截距,但是线性回归很难控制其值域处于0到1,而logistic算法刚好具备这一特点。
logistic算法的输出定义为将sigmoid函数作用于线性回归的身上,换句话说,sigmoid函数可以将任何的实数转到0到1的范围上来。所以,y帽=sigmoid(w*x+b)=sigmoid(z)=1/(1+e的负z次方)。显然,我们需要学习得到w和b。
四、如何得到w和b
为了得到w和b,首先需要定义一个成本函数,用来衡量算法的运行情况。损失函数或误差函数L(y帽,y)来衡量预测值y帽和实际值y有多接近,其实在概率论中这就是平方差,我们希望它越小越好。我们可以定义损失函数L为(y帽-y)^2或者为(1/2)*(y帽-y)^2,但是在logistic回归中,一般不这样做,因为当学习这些参数的时候,会涉及到之后需要学习的优化问题,会变成非凸的,即会得到很多个局部最优解,这样使用梯度下降就可能找不到全局最优值了。在logistic算法中,会定义一个和这类似的函数,但是是凸的函数,这就很容易来优化。
在logistic算法中,定义损失函数L(y帽,y)=-(y*log(y帽)+(1-y)*log(1-y帽)),我们希望L尽可能的小,假如y=1,则L=-log(y帽),则希望y帽越大越好,但是y帽是个概率,取值在0到1。假如y=0,则L=-log(1-y帽),则希望y帽越小越好。这样,当y=1时,希望y帽更加接近1,当y=0时,希望y帽更加接近0。
损失函数是在单个训练样本中定义的,它衡量了在单个训练样本上的表现,仅适用于单个样本,而成本函数J(w,b),衡量的是在全体训练样本上的表现。J(w,b)=(1/m)*求和L(y帽^(i),y^(i))即所有训练样本的损失函数和的平均值,J(w,b)=-(1/m)*求和((y^(i)*log(y帽^(i)))+(1-y^(i))*log(1-y帽^(i)))。
我们的任务就是得到一组w和b,使得成本函数尽可能的小。损失函数就是用来训练参数的,成本函数和参数相关。这里的logistic 算法就可以被看做是一个非常小的神经网络。其实就是损失函数来衡量单一训练样例的效果,成本函数在全部训练集上来衡量参数w和b的效果。
五、训练得到训练集上的w和b
我们的目标是要找到一组合适的w和b,使得成本函数J尽可能的小,我们可以看到成本函数J(w,b)是一个两元函数,并且是一个凸函数,只有一个极值点。图像就像一个正放的碗。这里需要使用梯度下降法。
为了找到更好的参数值,首先需要初始化w和b,可以给任意的初始值,梯度下降通常用0来初始化。但是,对于logistic算法通常不使用0来初始化,但是成本函数J是凸的,所以无论从哪里初始化,都可以得到相同或大致相同的最优解。
梯度下降的过程就是从初始点开始,朝着图像下降最陡的方向走一步,在新的点上又开始上面的步骤,直到走到最优的地方停下。新得到的w:=w-a*(aJ/aw),b=a*(aJ/ab)其中第一个a代表步长,第二个和第三个a代表求导因子,这样就实现了对参数w和b的更新。其中通常使用dw来代替aJ/aw,使用db来代替aJ/ab。这样,w:=w-dw b:=b-db。
六、神经网络的计算
一个神经网络的计算,都是按照前向或反向传播过程来实现的。首先计算出神经网络的输出,紧接着进行一个反向传输操作,反向传输用来计算出对应的梯度或者导数。那么为什么这样实现呢?需要使用计算图来解释,对于成本函数J(w,b)来说,正向的计算可以得到成本函数值,而反向的计算导数就用来优化成本函数了,即优化了参数。
在训练参数w和b时,利用的是损失函数,通过前向传播计算得到了损失函数的值,接着通过后向传播计算得到偏导数,接着就可以计算新的参数值了。同样的,对于成本函数而言,也是这样来计算得到参数w和b。
七、向量化
在深度学习中,一般对于数据量很大的情况不使用for循环,可以使用向量化来实现,这样会使得算法非常的高效。那么什么是向量化?在Python中,z=np.dot(w,x)+b这种方法就是使用向量化来计算n维列矩阵w的转置和x的点乘。其中np是自己取的numpy模块的简称。例如:
import numpy as np
a=np.array([1,2.3,4])
这样就定义了一个数组a。import time
a=np.random.rand(1000000)
b=np.random.rand(1000000)
tic=time.time()
c=np.dot(a,b)
toc=time.time()
其中time()获取当前时间。其实dot就是实现了线性代数中矩阵点乘的计算。
向量化计算之所以非常快,就是因为dot方法充分利用了并行化计算。所以尽量不使用for循环来计算矩阵运算。在numpy中,(n,m)代表n*m维的矩阵。
在Python中,假如w代表一个n维列向量,x代表一个n*m维列向量,b是一个实数,则z=np.dot(w.T,x)+b就得到了一个1*m维的z矩阵,其中Python会自动将实数b转换为一个1*m维的矩阵,这在Python中叫做广播。
上一篇: python统计消费kafka数据量
下一篇: python 切换python版本