杜宝坤

V1

2022/10/31阅读:10主题:全栈蓝

深度学习框架TensorFlow系列之(六)Backpropagation

一 背景

梯度下降算法是目前最流行的优化算法之一,并且被用来优化神经网络的模型。业界知名的深度学习框架TensorFlow、Caffe等均包含了各种关于梯度下降优化算法的实现。然而这些优化算法(优化器)经常被用作黑盒优化器,并且深度学习模型的参数巨大,这些优化器是如何高效进行梯度计算的呢?下面我就一起了解下Backpropagation。

下面简单介绍下神经网络的计算过程,包括正向传播与反向传播的过程。

  • 首先,构建模型结构(假设最简单的全连接DNN网络),并且初始化神经网路参数: (weight and bias);
  • 然后,设置模型的代价函数:Loss Function;
  • 然后,进行正向计算传播,传播过程就是简单的加法与激活函数的运算,这里不再赘述;
  • 然后,进行反向计算传播,根据模型的输入值与损失函数计算梯度向量;
  • 最后,进行梯度的更新。

上面的流程中,由于这块不是本章的重点,所以流程介绍的比较简洁,但是仔细思考梯度更新,即整个反向传输的过程还是有如下的难点的。

  1. 参数量过于巨大:神经网络模型动辄百万参数,更有甚者如GPT3等SOTA模型具备千亿参数的规模;
  2. 计算过程效率:如何在如此庞大的参数规模下高效的进行梯度的计算;

二 链式法则

链式法则是微积分中的求导法则,用于求一个复合函数的导数,是在微积分的求导运算中一种常用的方法。复合函数的导数将是构成复合这有限个函数在相应点的导数的乘积,就像锁链一样一环套一环,故称链式法则。

如下图所示,主要包含两种类型

  • 复合函数,例如下图的Case 1
  • 组合函数,例如下图的Case 2

三 Backpropagation

3.1 损失函数

  1. 损失函数(Loss Function):是定义在单个训练样本上的,也就是就算一个样本的误差,比如我们想要分类,就是预测的类别和实际类别的区别,是一个样本的,用L表示。
  2. 代价函数(Cost Function):是定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均,有没有这个平均其实不会影响最后的参数的求解结果。
  3. 总体损失函数(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的部分 )

然后把 相乘,我们就可以得到 ,进而我们就可以得到神经网络中所有的参数的梯度值,然后使用用梯度下降算法就可以不断更新模型参数,最小化损失函数。

五 参考资料

六 公众号文章导读

公众号里面已经积累了不少的文章,并且根据隐私计算的五大基座、三大方向进行分类阐述,下面对公众号文章进行导航总结,方便大家阅读,共同推进隐私计算行业的发展,为隐私计算发展略尽绵薄之力。

七 番外篇

个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。 框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。 业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。 个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:baokun06@163.com

八 公众号导读

自己撰写博客已经很长一段时间了,由于个人涉猎的技术领域比较多,所以对高并发与高性能、分布式、传统机器学习算法与框架、深度学习算法与框架、密码安全、隐私计算、联邦学习、大数据等都有涉及。主导过多个大项目包括零售的联邦学习,社区做过多次分享,另外自己坚持写原创博客,多篇文章有过万的阅读。公众号秃顶的码农大家可以按照话题进行连续阅读,里面的章节我都做过按照学习路线的排序,话题就是公众号里面下面的标红的这个,大家点击去就可以看本话题下的多篇文章了,比如下图(话题分为:一、隐私计算 二、联邦学习 三、机器学习框架 四、机器学习算法 五、高性能计算 六、广告算法 七、程序人生),知乎号同理关注专利即可。

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

分类:

后端

标签:

后端

作者介绍

杜宝坤
V1