【DL笔记2】神经网络编程原则&Logistic Regression的算法解析

本文阐述深度学习中矢量化的重要性,特别是在神经网络编程时避免显式for循环,以提高效率。通过Logistic回归算法实例,展示如何将数据转化为向量或矩阵形式,以加速计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章系转载,尊重原创,请移步原文:

https://www.jianshu.com/p/c67548909e99

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

就一句话:

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

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

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

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

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

二、Logistic regression算法

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

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

  1. 初始化Wb
  2. 指定learning rate和迭代次数
  3. 每次迭代,根据当前W和b计算对应的梯度(JWb的偏导数),然后更新Wb
  4. 迭代结束,学得Wb,带入模型进行预测,分别测试在训练集合测试集上的准确率,从而评价模型

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

更新完之后别忘了,这只是一次迭代,接着把上面过程重复2000次! 

简单看一下:

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个样本也可以组成一个大矩阵。于是:
 

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

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

上面就是Logistic regression的算法了,

我们总结一下:

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

  1. 把m个样本,同时计算,同时算出它们的Z^{(i)},也就是直接算Z这个m维行向量
  2. 同时把Z的m维都激活,得到m维行向量A
  3. 得到AZ之后,就可以直接计算JZ的梯度dZ了,得到dZ之后,也就可以直接算出Wb的梯度了
  4. 同时更新所有的W^{(i)}b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值