梯度下降

成本函数(Cost function):

J(w,b)=1mi=1mL(y^(i),y(i))=1mi=1m[y(i)log(y^(i))+(1y(i))log(1y^(i))]

衡量的是参数wb在训练集上的效果

成本函数是一个在三维空间上的凹函数,

梯度下降就是,从wb的初始值开始,朝着能使成本函数J(w,b)下降最快的方向移动一步,

J(w,b)下降之后,再让wb向前走一步,即为梯度下降的一次迭代

梯度下降(Gradient descent)

本来J(w,b)wb两位参数决定取值,现在忽略一个参数,使J(w)仅有w为自变量,图解其梯度下降过程如下:

梯度下降的过程:

w:=wαdJ(w)dw

其中:

  • α表示学习率,通过控制学习率的大小可以控制每一次迭代或者梯度下降的步长,以后会提到如何选择学习率
  • dJ(w)dw表示J(w)w的导数,在Python编程过程中用dw表示
  • ":="表示更新前面的w的值

现在回到两个自变量wb的情况,在logstic回归过程中,成本函数J(w,b)wb的函数

在这种情况下,梯度下降过程就由上面的只更新一个参数w变成要更新两个参数wb的情况了,而每一次梯度下降也变成由更新w和更新b的两部分组成,而上面的求导过程也变成了求偏导过程,如下:

w:=wαJ(w,b)w

b:=bαJ(w,b)b

具体编程时,J(w,b)w用dw表示,J(w,b)b用db表示

前缀d表示输出变量对某个参数的导数,用d(var)表示,d(var)=J(w,b)(var)

dv,da,db,dl均表示最终变量对各个自变量的导数,或者说是偏导数

logistic回归的前向传播和反向传播过程

logistic前向传播的输出为a=y^,

z=wTx+b

y^=a=σ(z)

a=y^=[ylog(a)+(1y)log(1a)]

假设样本只有x1和x2两个输入特征,则前向传播和反向传播求导的示意如下:

在logstic回归中我们要做的就是利用梯度下降不断的更新迭代wb的值,来使得损失函数L(a,y)最小

所以我们要做的是,首先计算损失函数对各个参数的导数,或者说是偏导数,然后利用梯度下降不断的更新迭代wb的值:

计算dz:dz=a-y

计算dw1:dw1=x1*dz

计算dw2:dw2=x2*dz

计算db:db=dz

然后是梯度下降迭代过程
更新w1为:w1=w1-α*dw1

更新w2为:w2=w2-α*dw2

更新b为:b=b-α*db

其中α为学习率

上面就是单个样本的一次梯度更新步骤,实现单个训练样本的logistic回归的梯度下降法

全局的梯度下降法

上面提到的是单个样本的梯度下降过程,下面将这个范围拓展到全局

成本函数J(w,b):

J(w,b)=1mi=1mL(a(i),y(i))

其中:

a(i)=y^(i)=σ(z(i))=σ(wTx(i)+b)

J(w,b)w1=1mi=1mL(a(i),y(i))w1

上标(i)表示这是对第i个训练样本的计算,下面的计算过程为 :

上面的计算过程可以计算出成本函数J(w,b)对w1,w2和b的导数

dw1,dw2等于全局成本函数对w1,w2的导数,其中dw1,dw2没有上标(i)这是因为其作为累加器,求取的是整个训练集上的和,而dz则是相对于单个训练样本而言的。

完成上述计算后再进行梯度下降的迭代更新:

w1:=w1αdw1

w2:=w2αdw2

b:=bαdb

而在实际的计算机处理过程中,上面提到的使用两个for循环的方法过于低效,所以我们接下来采用将各个参数向量化的方法来取代for循环