【梯度下降算法】Deep Learning .ai(吴恩达)学习笔记(二)

研一零基础菜鸟自学笔记,欢迎大佬们批评、建议、指正。

有什么好的学习建议也欢迎评论私信我。

目录

一、梯度下降法(Gradient Descent,GD)

1.1概述

1.2Implement Gradient Desent

1.3三种梯度下降算法

1.4动量(Moment)随机梯度下降

1.5 学习率

1.6动量&自适应学习Adam算法

二、Logistic Regression Gradient descent

 2.1Logistic regission derivatives

2.2Logistics regression on m examples



一、梯度下降法(Gradient Descent,GD)

1.1概述

Recap: \hat{y}=sigmoid(\hat{y}^{(i)},y^{(i)})

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}\left [ 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 )\right ]

want to find spatial parameters w,b that minimize  J(w,b)

注:In practice w can be much higher dimensional.

This picture illustrate parameters w,b as real number.

1.2Implement Gradient Desent

梯度下降法是一个不断重复的过程,目的是为了求函数的极小值点。

梯度下降算法的思想:

先取任意值(x_{0},f(x_{0})),求 f(x) 在该点 x_{0} 的导数 f'(x_{0}),再用 x_{0} 减去导数值 f'(x_{0}),计算所得的结果就是新的 x_{1},新的值会比初始的损失函数更小,根据新值调整拟合函数的位置,然后继续迭代,再用 x_{1} 减去导数值 f'(x_{1}) 即为 x_{1} ......如此循环往复,将 x值无限接近于极小值点。

通俗地解释:

一个人困在山上的某个位置,想要从有着大雾,能见度很低的山上下山到达最低点(山谷),此时下山的路径无法确定,需要利用周围信息一步一步找到下山的路。这个时候如果利用梯度下降算法来下山,便是,以当前位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,接着又以现在位置为基准,寻找当前位置最陡峭的地方,再走一步,如此循环往复,直到走到最低处(山谷)。

loss function 是用来衡量机器学习模型的精确度的。一般来说,loss function 的值越小,模型的精确度就越高,为了最小化loss function ,我们一般采用梯度下降这个说法。

公式:

w\leftarrow w-\alpha \frac{\partial J(w,b)}{\partial w}

b\leftarrow b-\alpha \frac{\partial J(w,b)}{\partial b}

 在python中,我们通常使用 “dvar” 来表示导数的含义。

1.3三种梯度下降算法

梯度下降算法的问题:

首先,我们需要计算出所有样本的损失函数梯度,然后求平均值来更新参数。

如果将全部样本都保存下来参与计算,这叫做批量梯度下降算法(Batch Gradient Descent,BGD),优点是下降的非常平稳,能够保证算法的精确度,进而找到全局最优解;缺点是需要很大的内存开销,且收敛速度慢。


改进方法:

每次只用少部分的数据更新。

假设从n个随机样本中选择m个样本,且每次都不重复,每下降一步只用一个样本进行计算,这样就可以解决内存开销和迭代速度问题了。这种改进方法被称为随机梯度下降(Stochastic Gradient Descent,SGD)。且当样本较少时,这种方法虽然会引入噪声,但仍然可以按照正确的趋势来收敛函数;缺点是下降非常不平稳,虽然提升了速度,但牺牲了一定的精确度。


改进方法:

结合前两种方法的优点,每次只选用一小批样本进行计算的方法叫小批量梯度下降(Mini-Batch Gradient Descent,MBGD),它的下降过程虽然不如批量梯度下降算法BGD平稳有规律,但是速度较快;虽然没有随机梯度下降算法SGD下降速度快,但是精确性高。

1.4动量(Moment)随机梯度下降

然而深度学习网络训练往往是一个非凸的优化过程,在参数空间里分布着各类的山脊和山谷。

 如图一,面对这样的山脊和初始位置,按照随机下降梯度算法,它的移动轨迹也许会在山谷两侧来回震荡,难以收敛到更低的位置,如果能加上一个运动阻尼,让它的运动更平滑一些,也许可以下降到更低点。

因此,为了改进这个问题,我们引入了一个新的量——动量,在选定下一个位置时,我们除了算出新的梯度,还要保留上一次的一部分梯度,将两个方向叠加在一起,构成新的方向,这样就可以得到一个更加合理的优化效果了,这个方法我们称之为动量随机梯度下降。                                                                

1.5 \alpha学习率

\alpha 学习率在下山的例子中相当于步长,即每一步的长度。步子太大,容易便宜路线;步子太小,所耗费的时间过长,计算量过多。因此,要学会选择合适的 \alpha,这能够帮我们快速找到收敛方向,细致优化防止震荡。

然而,人工调整学习率非常的困难,因为为了能让梯度自动调整,我们引入了一个新的量——r。

r\leftarrow r+J^{2}

r是指梯度大小随时间的累积量,如果让\sqrt{r} 放在学习率 \alpha 的分母上,那么梯度波动很大时,学习率就会快速下降,以达到帮助我们缩小步长,快速找到收敛方向;若梯度波动很小时,学习率就会下降的慢一些,这样就实现了自动调整,如下式。

\alpha\leftarrow \frac{\alpha }{\sqrt{r}+\delta }

 这里的 \delta 是一个小量,用来稳定数值计算,防止\sqrt{r} 为0造成该式无意义。

这就是2011年提出的AdaGrad算法,2012年提出了RMSProp算法,在r中加入了可以手动调节的 \rho ,来控制优化过程。

r\leftarrow \rho r+(1-\rho )J^{2}

\alpha \leftarrow \frac{\alpha }{\sqrt{r+\delta }}

1.6动量&自适应学习Adam算法

在2014年提出的adam算法则兼顾了以上两种优点——动量和自动调节

二、Logistic Regression Gradient descent

Recap:

z=w^{T}+b

\hat{y}=a=\sigma (z)

L(a,y)=-(ylog(a)+(1-y)log(1-a))

 2.1Logistic regission derivatives

假设样本有两个特征 x_{1} 和 x_{2},输入参数 w_{1} 、w_{2} 和 b,从而计算出 z 的偏导数计算公式。

在Logistic回归中我们所需要做的就是变换参数 w 和 b 的值,从而最小化损失函数。

偏导数流程图

反向传播计算偏导数:

在代码中,我们使用“da”来表示 \frac{dL(a,y)}{da} ,

\frac{dL(a,y)}{da}=-\frac{y}{a}+\frac{1-y}{1-a}

在代码中,我们使用“dz”来表示\frac{dL(a,y)}{dz},

\frac{dL(a,y)}{dz}=a-y =\frac{dL}{da}\cdot \frac{da}{dz}

由链式法则可以求出;

特别地,关于 w_{1} 的导数 \frac{dL}{dw_{1}}=x_{1}\cdot dz,变量名为“dw_{1}” ;

同样地,关于 w_{2} 的导数 \frac{dL}{dw_{2}}=x_{2}\cdot dz,变量名为“dw_{2}” ;

其中,db=dz=a-y

则,w_{1}w_{2} 、b更新为

 w_{1}=w_{1}-\alpha \cdot dw_{1}

w_{2}=w_{2}-\alpha \cdot dw_{2}

b=b-\alpha \cdot db

以上,就是单个样本实例的一次梯度更新的步骤,但是训练Logistics回归模型不仅仅只有一个训练样本,下面来看一下有m个训练样本的整个训练集。

2.2Logistics regression on m examples

Recap:

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

a^{(i)}=\hat{y}^{(i)}=sigmoid(z^{(i)})=sigmoid(w^{T}+b)

 那么,

\frac{\partial }{\partial w_{1}}=\frac{1}{m}\sum_{i=1}^{m}\frac{\partial }{\partial w_{1}}L(a^{(i)},y^{(i)})

其中,

\frac{\partial }{\partial w_{1}}L(a^{(i)},y^{(i)})=dw_{1}^{(i)}-(x^{(i)},y^{(i)})

以上为公式分析,下面让我们放入一个具体的算法实例,同时需要一起应用Logistic回归和梯度下降法。


假设J=0dw_{1}=0dw_{2}=0db=0

For i=1 to m

        z^{(i)}=w^{T}\cdot x^{(i)}+b

        a^{(i)}=sigmoid(z^{(i)})

        J+=-[y^{(i)}loga^{(i)}+(1-y^{(i)})log(1-a^{(i)})]

        dz^{(i)}=a^{(i)}-y^{(i)}                                                        #这里的i对应单个样本的dz

        dw_{1}+=w_{1}^{(i)}\cdot dz^{(i)}

        dw_{2}+=w_{2}^{(i)}\cdot dz^{(i)}                                                     # dw_{3}````````dw_{n} 同上

        db+=dz^{(i)}

J/=m

dw_{1}/=m ;dw_{2}/=mdb/=m

dw_{1}=\frac{\partial J}{\partial w_{1}}dw_{2}=\frac{\partial J}{\partial w_{2}}db=\frac{\partial J}{\partial b}

#没有上标是因为看作累加器去求取整个训练集上的和

w_{1}:=w_{1}-\alpha \cdot dw_{1}

w_{2}:=w_{2}-\alpha \cdot dw_{2}

b:=b-\alpha \cdot db

#应用一步梯度下降法


重复以上内容多次以应用多次的梯度下降法。

缺点:

运用了For循环,若应用深度学习算法,在代码中显式地应用For循环会使算法效率变低,因此使用向量化技术能够帮助我们的代码摆脱For循环。

下一周会具体学习正则化。

来源:【梯度下降】3D可视化讲解通俗易懂_哔哩哔哩_bilibili[5分钟深度学习] #01 梯度下降算法_哔哩哔哩_bilibili

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

馥郁x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值