杜宝坤
2022/10/31阅读:25主题:全栈蓝
深度学习框架TensorFlow系列之(六)Backpropagation
一 背景
❝梯度下降算法是目前最流行的优化算法之一,并且被用来优化神经网络的模型。业界知名的深度学习框架TensorFlow、Caffe等均包含了各种关于梯度下降优化算法的实现。然而这些优化算法(优化器)经常被用作黑盒优化器,并且深度学习模型的参数巨大,这些优化器是如何高效进行梯度计算的呢?下面我就一起了解下Backpropagation。
❞

下面简单介绍下神经网络的计算过程,包括正向传播与反向传播的过程。
-
首先,构建模型结构(假设最简单的全连接DNN网络),并且初始化神经网路参数: (weight and bias); -
然后,设置模型的代价函数:Loss Function; -
然后,进行正向计算传播,传播过程就是简单的加法与激活函数的运算,这里不再赘述; -
然后,进行反向计算传播,根据模型的输入值与损失函数计算梯度向量; -
最后,进行梯度的更新。
上面的流程中,由于这块不是本章的重点,所以流程介绍的比较简洁,但是仔细思考梯度更新,即整个反向传输的过程还是有如下的难点的。
-
参数量过于巨大:神经网络模型动辄百万参数,更有甚者如GPT3等SOTA模型具备千亿参数的规模; -
计算过程效率:如何在如此庞大的参数规模下高效的进行梯度的计算;
二 链式法则
❝链式法则是微积分中的求导法则,用于求一个复合函数的导数,是在微积分的求导运算中一种常用的方法。复合函数的导数将是构成复合这有限个函数在相应点的导数的乘积,就像锁链一样一环套一环,故称链式法则。
❞
如下图所示,主要包含两种类型
-
复合函数,例如下图的Case 1 -
组合函数,例如下图的Case 2

三 Backpropagation
3.1 损失函数
-
「损失函数(Loss Function)」:是定义在单个训练样本上的,也就是就算一个样本的误差,比如我们想要分类,就是预测的类别和实际类别的区别,是一个样本的,用L表示。 -
「代价函数(Cost Function)」:是定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均,有没有这个平均其实不会影响最后的参数的求解结果。 -
「总体损失函数(Total loss function)」:是定义在整个训练集上面的,也就是所有样本的误差的总和。也就是平时我们反向传播需要最小化的值。

❝对于 来说就是所有的 的损失之和,所以如果要计算所有样本 的偏微分,我们只要计算每个样本 的偏微分,再把所有的 偏微分的结果加起来就是 的偏微分,所以下面的例子中我们以计算一个样本 的偏微分。
❞
3.2 反向传播分析
❝我们先在整个神经网络(Neural network)中抽取出一小部分的神经(Neuron)去看(也就是红色标注的地方)。
❞

取一个Neuron进行分析

从这个Neuron我们可以看出,计算梯度可分为两个部分
-
Forward Pass: ,基本可以秒算,计算结果就是上个神经元的输出,比如对于如上的图就是 ; -
Backward Pass: ,需要结合损失函数进行计算。
这样整个后向传输的复杂的计算过程就被分为了两个部分,其中Forward Pass是可以秒算的。
3.3 Forward Pass
Forward Pass部分用于计算 ,是一个最基本的计算单元。

根据微分定理,Forward Pass的运算规律就是:
这里计算得到的 和 恰好就是输入层的神经元的值 和 ,也就是说是上个神经元的输出值,如下图所示

3.4 Backward Pass
Backward Pass的部分相对于Forward Pass的部分较为复杂,主要是以下的两点:
-
激活函数需要如何处理,前面的Forward Pass部分比较简单就是简单的乘法与加法。 -
如何计算 这就比较复杂,因为 是最后一层;
3.4.1 激活函数的常数效应

计算所有激活函数的偏微分,激活函数有很多,这里使用Sigmoid函数为例,使用链式法则(Chain Rule)的case1,计算过程如下

关于激活函数,可以如下理解:现在有另外一个神经元,把forward的过程逆向过来,其中 是常数,因为它在向前传播的时候就已经确定了,如下所示

3.4.2 Output Layer的反向效应
-
情况一:假设 和 是最后一层的隐藏层也就是就是y1与y2是输出值,那么直接计算就能得出结果

-
情况二:但是如果 和 是不最后一层(输出层),那么我们就继续向后一直的通过链式法则算下去直到输出层;

对于这个问题,我们要继续计算后面绿色的 和 ,然后通过继续乘 和 得到 ,但是要是 和 都不知道,那么我们就继续往后面层计算,一直到碰到Output Layer层,「到Output Layer层之后再反向往Input Layer前进。」
举例如下:

对于上图来说,我们从Output Layer层来看首先计算 和 的值,因为 和 非常容易通过Output Layer层计算出来,然后继续往前求 和 ,再继续求 和 ,同时根据激活函数的常数效应,最后我们就得到下图的结果

四 总结
Backpropagation整体流程分为:
-
计算 (Forward pass的部分) -
计算 ( Backward pass的部分 )
然后把 和 相乘,我们就可以得到 ,进而我们就可以得到神经网络中所有的参数的梯度值,然后使用用梯度下降算法就可以不断更新模型参数,最小化损失函数。
五 参考资料
六 公众号文章导读
❝公众号里面已经积累了不少的文章,并且根据隐私计算的「五大基座、三大方向」进行分类阐述,下面对公众号文章进行导航总结,方便大家阅读,共同推进隐私计算行业的发展,为隐私计算发展略尽绵薄之力。
❞
-
基座一:数学基座:数学与密码学相关知识
-
基座二:安全基座:传统的安全相关
-
基座三:工程基座:工程架构相关
-
-
基座四:隐私组件基座:隐私计算基础组件相关
-
基座五:算法基座:机器学习算法与框架
-
机器学习算法
-
机器学习框架
-
-
-
方向一:安全多方计算
-
联邦学习-样本对齐之隐私PSI算法 - 联邦学习与安全多方计算里面都涉及到隐私集合求交PSI -
安全多方计算-匿踪查询
-
-
方向三:联邦学习
七 番外篇
❝个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。 框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。 业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。 个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:「baokun06@163.com」
❞
八 公众号导读
自己撰写博客已经很长一段时间了,由于个人涉猎的技术领域比较多,所以对高并发与高性能、分布式、传统机器学习算法与框架、深度学习算法与框架、密码安全、隐私计算、联邦学习、大数据等都有涉及。主导过多个大项目包括零售的联邦学习,社区做过多次分享,另外自己坚持写原创博客,多篇文章有过万的阅读。公众号「秃顶的码农」大家可以按照话题进行连续阅读,里面的章节我都做过按照学习路线的排序,话题就是公众号里面下面的标红的这个,大家点击去就可以看本话题下的多篇文章了,比如下图(话题分为:一、隐私计算 二、联邦学习 三、机器学习框架 四、机器学习算法 五、高性能计算 六、广告算法 七、程序人生),知乎号同理关注专利即可。

一切有为法,如梦幻泡影,如露亦如电,应作如是观。
作者介绍