首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

DL笔记2-神经网络编程原则&逻辑回归的算法解析

深度学习敲门砖-系列笔记

从【DL笔记1】到【DL笔记N】,是我学习深度学习一路上的点点滴滴的记录,是从Coursera网课、各大博客、论文的学习以及自己的实践中总结而来。从基本的概念、原理、公式,到用生动形象的例子去理解,到动手做实验去感知,到著名案例的学习,到用所学来实现自己的小而有趣的想法......我相信,一路看下来,我们可以感受到深度学习的无穷的乐趣,并有兴趣和激情继续钻研学习。

正所谓Learning by teaching,写下一篇篇笔记的同时,我也收获了更多深刻的体会,希望大家可以和我一同进步,共同享受AI无穷的乐趣。

在【DL笔记1】中,我们学习了Logistic regression的基本原理,由于后面我们需要编程复现,因此这篇文章,我们一起学习一下神经网络中的一些编程方法,并对Logistic regression的算法进行详细解析。

一、神经网络中的编程指导原则

就一句话:

只要阔能,就不要使用显示for循环(explicit for-loop),而是尽可能采用矢量化技术(Vectorization)

为啥呢,因为深度学习中的数据量往往巨大,用for循环去跑的话效率会非常低下,相比之下,矩阵运算就会快得多。而python的矩阵“传播机制(broadcasting)”和专门用于矩阵计算的numpy包更是给了我们使用矩阵运算的理由。

因此,我们在面对深度学习问题的时候,首先要想一想,如何把数据进行“矢量化”,就是转化成向量或者矩阵,这样可以大大提高我们的效率。

有关python的传播机制、numpy的典型使用以及for-loop和vectorization运算时间的对比,可以参见我的另一篇文章。

具体怎么把我们的数据进行Vectorization呢?我们在Logistic regression的python实现里面去看一看。

二、Logistic regression算法

在写python代码之前,我们先用伪代码来示意一下Logistic regression的过程。

首先回顾一下上一篇文章中对Logistic regression模型的学习和预测的步骤:

初始化W和b

指定learning rate和迭代次数

每次迭代,根据当前W和b计算对应的梯度(J对W,b的偏导数),然后更新W和b

迭代结束,学得W和b,带入模型进行预测,分别测试在训练集合测试集上的准确率,从而评价模型

假设我们的样本数为m,每一个样本的特征数为n,我们设置的迭代次数为2000,那么按照上述步骤,如果使用for循环的话,我们需要几个for,总循环多少次呢?

(由于微信不方便写公式,我这里贴出图片:)

简单看一下:

for iteration=1 to 2000: #梯度下降2000次迭代 for i=1 to m: # 遍历m个样本 for j=1 to n # 求每一个特征对应的w的梯度

3个for循环啊!共循环2000×m×n次!通常情况下,m至少也有大几千吧,特征n更是成千上万,尤其是对于图片识别类的问题。这样for下去简直阔怕!

事实上,我们可以通过Vectorization来消除第二个和第三个for循环,因为一个样本的n个特征可以组成一个向量,m个样本也可以组成一个大矩阵。于是:

(上面出现的np.dot()是numpy包的矩阵乘法,就是点乘,np.sum()就是numpy的矩阵求和)

搞定,一次迭代中,一个for也没有用。(当然,这个迭代的for循环我们没法消除,因为迭代次数是我们人为设定的,这里设为2000次,也可以设为1500次、3000次等等)

(写这样的全都是公式的文章真的好累啊!(╬ ̄皿 ̄))

上面就是Logistic regression的算法了,

我们总结一下:

所谓的Vectorization,就是把我们需要用for-loop来对那些只有上标或者下标变化的变量,放进一个向量或者矩阵中,让他们所有变量同时计算!

因此,Logistic regression算法向量化的过程,就是:

把m个样本,同时计算,同时算出它们的zi,也就是直接算Z这个m维行向量

同时把Z的m维都激活,得到m维行向量A

得到A和Z之后,就可以直接计算J对Z的梯度dZ了,得到dZ之后,也就可以直接算出W和b的梯度了

同时更新所有的wi和b

下一篇会用python亲自动手地实现一下Logistic regression,并记录一些其中编程的要点。

有任何疑问,欢迎留言交流!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181203A0AH5C00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券