2.10 m 个样本的梯度下降-深度学习-Stanford吴恩达教授

m 个样本的梯度下降 (Gradient Descent on m mm example)

在之前的视频中,你已经看到如何计算导数,以及应用梯度下降在逻辑回归的一个训练样本上。现在我们想要把它应用在 m个训练样本上。

首先回顾下代价函数(Cost Function)J 的定义,如下图:

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

其中a^{(i)}是对第 i 个训练样本的预测值,即a^{(i)} = \hat{y}^{(i)} = \sigma (z^{(i)}) = \sigma (w^{T}x^{(i)} + b),结合上个视频展示的是单个训练样本,我们也在导数上加上标(i)

其实,总代价函数w_{1} 的偏导数也将是对所有单个样本的损失w_{1} 的偏导求和,再求平均值。即如下:

\frac{\partial }{\partial w_{1}} J(w,b) = \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^{(i)}_{1},这个值dw^{(i)}_{1}我们在上一个视频已经学会如何在单个样本中计算了。然后求平均,这会给你全局梯度值。


所以,我们可以做的是:我们初始化J = 0;dw_{1}=0;dw_{2}=0;db = 0 。我们要做的就是在训练集中使用一个for循环i = 1m(训练样本数),并计算每个训练样本的导数,然后将他们for循环相加起来。最后for循环结束以后,再除以m,计算平均值。

代码流程:(假设只有两个特征,n = 2 )

J=0;dw1=0;dw2=0;db=0;
for i = 1 to m
    z(i) = wx(i)+b;
    a(i) = sigmoid(z(i));
    J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));
    dz(i) = a(i)-y(i);
    dw1 += x1(i)dz(i);
    dw2 += x2(i)dz(i);
    db += dz(i);
J/= m;
dw1/= m;
dw2/= m;
db/= m;
w=w-alpha*dw
b=b-alpha*db

代码中用 dw_{1},dw_{2},db 作累加器,那么dw_{1}等于你所有代价函数对w_{1}的偏导,dw_{1} = \frac{\partial J}{ \partial w_{1}},同理dw_{2},db 也一样。(就是把梯度下降公式里的求和分成对每个样本求导再加一起,即和的导数等于导数的和)

但这种计算中有两个缺点,即如果以这种方式实现逻辑回归,需要写两重循环:第一个for用于在m个训练样本上循环;第二个for用于遍历所有特征(此处特征少,n=2)。

当你应用深度学习算法,你会发现在代码中显式地使用for循环使你的算法很低效,同时在深度学习领域会有越来越大的数据集。所以能够应用你的算法且没有显式的for循环会是重要的,并且会帮助你适用于更大的数据集。所以这里有一些叫做向量化技术(矢量化),它可以允许你的代码摆脱这些显式的for循环。

我想在先于深度学习的时代,也就是深度学习兴起之前,向量化是很棒的。可以使你有时候加速你的运算,但有时候也未必能够。但是在深度学习时代向量化,摆脱for循环已经变得相当重要。因为我们越来越多地训练非常大的数据集,因此你真的需要你的代码变得非常高效。所以在接下来的几个视频中,我们会谈到向量化,以及如何应用向量化而连一个for循环都不使用。所以学习了这些,我希望你有关于如何应用逻辑回归,或是用于逻辑回归的梯度下降,事情会变得更加清晰。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值