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

本文是【专题“DeepLearning学习笔记”】的第【2】篇
上一篇:【DL笔记1】Logistic回归:最基本的神经网络

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

就一句话:

只要阔能,就不要使用显示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. 初始化W和b
  2. 指定learning rate和迭代次数
  3. 每次迭代,根据当前W和b计算对应的梯度(J对W,b的偏导数),然后更新W和b
  4. 迭代结束,学得W和b,带入模型进行预测,分别测试在训练集合测试集上的准确率,从而评价模型

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

①初始化:
J=0 (这是cost), w_{1},...,w_{n}=0, dw_{1},...,dw_{n}=0(J对w的偏导,即梯度),b=0

②一次迭代:
For i = 1 to m:
{
z^{(i)}=W^{T}x^{(i)}+b
(行向量乘以列向量,就是个数了)
a^{(i)}=\sigma(z^{(i)})
(a就是上一篇文章中的y',就是经过Activation之后的值)
J+=-[y^{(i)}loga^{(i)}+(1-y^{(i)})log(1-a^{(i)})]
(注意这里的+=,说明是个累加,就是要累加每一个样本的loss,最后还要除以 m,就是代价cost)
dz^{(i)}=a^{(i)}-y^{(i)}

For j = 1 to n:
{
dw_{j}+=x_{j}^{(i)}dz^{(i)}
db+=dz^{(i)}
}
(这里一样,都是累加,因为要遍历完m个样本,然后求平均梯度,再更新)
}
③计算平均梯度,并更新:
J/=m,dw_{j}/=m,db/=m
w_j:=w_j-\alpha dw_j
b:=b-\alpha db

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

费了我半天打上面这些公式结果看上去还是跟dog shit一样。。。心累啊(╥╯^╰╥)
刚刚突然发现,电脑端的可以正常显示公式,手机端就不可以了!
这些个平台真的让无力吐槽了,写作体验大打折扣!
我又不舍得删掉上面的辛苦打的公式,因此我在下面粘贴一下上面的公式的图片吧:】



简单看一下:

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

可以设:
X = [x^{(1)},x^{(2)},...,x^{(m)}]_{m\times n}
其中 x^{(i)}是一个列向量:
x^{(i)}=[x_{1}^{(i)},x_{2}^{(i)},...,x_{n}^{(i)}]^{T},包含了n个特征。

对应的,n个权重也可以定义成一个列向量:
W=[w_{1},...,w_{n}]^{T}

于是,我们将上面的算法都转换成矩阵或者向量:
Z=[z^{(1)},...,z^{(m)}]=W^{T}X+[b,...,b]=np.dot(W^{T},X)+b
A=[a^{(1)},...,a^{(m)}]=\sigma(Z), Y=[y^{(1)},...,y^{(m)}]
dZ=[dz^{(1)},...,dz^{(m)}]=A-Y
dW=\frac{1}{m}XdZ^{T}=\frac{1}{m}np.dot(X,dZ.T)
db=\frac{1}{m}\sum_{i=1}^{m}{dz^{(i)}}=\frac{1}{m}np.sum(dZ)
W:=W-\alpha dW
b:=b-\alpha db
(上面出现的np.dot()是numpy包的矩阵乘法,就是点乘,np.sum()就是numpy的矩阵求和)
【上面的公式如果是乱的话,请看下面的图片版:再次骂简书#@%¥……】

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

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

上面就是Logistic regression的算法了,

我们总结一下:

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

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

下一篇会用python详细地实现一下,并记录一些其中编程的要点。
有任何疑问,欢迎留言交流!也希望大家监督我写完“DeepLearning学习笔记”这个专题!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容