自动微分及Tensorflow实现

  几乎所有机器学习算法在训练或预测时都可以归结为最优化问题的求解,如果目标函数可导,该问题转换为训练函数驻点求解问题。通常情况下无法得到驻点的解析解,因此只能采用数值优化算法,如梯度下降法,牛顿法,拟牛顿法。这些数值优化算法都依赖于函数的一阶导数值或二阶导数值,包括梯度与Hessian矩阵。因此需要解决如何求一个复杂函数的导数问题,本文讲述的自动微分技术是解决此问题的一种通用方法,目前基本所有主流的深度学习框架都支持自动微分,如Tensorflo,Pytorch等。

  在介绍自动微分之前,先介绍一下目前使用编程计算函数导数值的几种方法:

  • 手动微分

      手动微分,顾名思义就是在使用程序计算导函数值之前,手动计算目标函数的导函数,对于表达式比较复杂的函数,这显然是比较容易出错的,并且通用性和灵活性都较差,现在较少使用。

  • 符号微分

      符号微分(Symbolic Differentiation)属于符号计算的范畴,基于初等函数的求导公式和四则运算法则及链式法则搭建在计算搭建求导系统求出导函数再代入变量,即可求出某点的导数值。显然,只是将人工计算导数的过程进行程序化。符号微分计算出的表达式需要用字符串或其他数据结构存储,如表达式树。常用数学软件Mathematica,Maple,Matlab都使用了这种技术。对于深层复合函数,如神经网络的映射函数,符号微分算法得到的导数计算公式将会非常冗长。称为表达式膨胀(expression swell)。对于机器学习中的应用,不需要得到导数的表达式,而只需计算函数在某一点处的导数值。因此存在计算上的冗余且成本高昂。

      以深度学习中最为常见的Sigmoid激活函数为例:S(x)=\frac{1}{1+e^{-x}},则有S'(x)=\frac{e^{-x}}{(1+e^{-x})^{2}}=S(x)(1-S(x)),神经网络本质上他是一个函数逼近器,理论上可以以任意精度逼近任何函数。对于一个含有三个隐层的网络,假设三个隐层的激活函数都是Sigmoid激活函数,网络的输入为x,输入对应标签为y,输出为y',则有y'=S(S(S(wx+b))),损失函数\zeta(w,b)=F(y-y')=F(y - S(S(S(wx+b)))),将S(x)的函数表达式带入上式由链式法则即可计算出导函数,显然,因为\frac{dy'}{dx}=\frac{dS(S(S(x)))}{dS(S(x))}\frac{dS(S(x))}{d{S(x)}}\frac{dS(x)}{d(wx+b)}可以预见的是,这个导函数一定不是一个形式比较简洁的函数,在此就不展开计算,有兴趣的读者可以自行验证,而这也就是上文所说的表达式膨胀。当然,可能有读者会觉得,因为Sigmoid函数的表达式本身就不太简洁,复合之后的表达式肯定会更为复杂,如果激活函数为三角函数和幂函数这类函数,其导函数还是较为简洁的。那为什么不能使用这类函数作为激活函数呢,原因有二,首先,一般来说三角函数和幂函数这类函数是不能用于网络的激活函数的(这一点目前仍有争议,不过在实际应用中基本不会使用非单调非有界的函数作为单调函数,这里有读者肯定以Google的新型激活函数Swish反驳,但是不可否认的是,Swish目前仍有很大争议并且被使用的较少),这涉及到深度学习激活函数的深入讨论,这里只简单提及一点:三角函数不是单调函数,幂函数不是有界函数。其次,对于一些有成千上万隐层的大型神经网络,因为进行了成千上万次的迭代,其导函数必然会出现表达式膨胀(需要注意的是,隐层的激活函数一般不可能取同一个函数)。

    Swish是谷歌大脑团队提出的一种新型激活方法数:f(x)=x*\sigma(x)=x*\frac{1}{1+e^{-x}},并通过实验表明其在绝大多数环境中可以替代当前比较流行的 ReLU 函数。不过在 Reddit 论坛上,该激活函数的性能与优点还是有些争议的,有的开发者发现该激活函数很多情况下可以比标准的 ReLU 获得更高的性能,而有些开发者则认为 Swish 激活函数并没有什么新意,我们应该关注于更加基础的研究。

  • 数值微分

      符号微分用于求解数学中的公式解(也称解析解),得到解的表达式而非具体的数值。在实际应用中还需进一步代入数值得到数值解,需要经过一次转换。那么,有没有一种方法能直接求出目标函数的导数,而不是求出导函数之后再带入数值得到导数。这种方法就是数值微分,我们先来看一下导数的定义:

    f'(x_0)=\lim_{x \to x_0}\frac{f(x)-f(x_0)}{x-x_0}=lim_{x \to x_0}\frac{f(x+\Delta x)-f(x)}{\Delta x}\Delta x足够小时,可将该点的导数可以近似为f'(x_0)\approx \frac{f(x_0+\Delta x)-f(x_0)}{\Delta x},在实际计算时,一般使用它的变式f(x_0) \approx \frac{f(x_0+\Delta x)-f(x_0-\Delta x)}{2\Delta x},有着更小的误差和更好的稳定性。当然,由于进行了近似操作,得到的导数值肯定是有误差的,所幸误差还在能接受的范围内。按上面推导的式子计算导数,对每个自变量求导时都需要计算两次函数值,因此也会导致计算量的问题。所以,数值微分通常只用于检验其他算法的结果的正确性,例如在实现反向传播算法的时候用数值微分算法检验反向传播算法所求导数的正确性。

  • 自动微分

      自动微分是介于数值微分和符号微分之间的一种折中方案:数值微分直接带入数值得到近似解,符号微分先求出解析式再带入数值得到导数。而自动微分将符号微分应用于最基本的运算(或称原子操作),如常数,幂函数,指数函数,对数函数,三角函数等基本初等函数,代入自变量的值得到其导数值,作为中间结果进行保留。然后再根据这些基本运算单元的求导结果计算出整个函数的导数值。

      自动微分的灵活性强,可实现完全向用户隐藏求导过程,由于它只对基本函数或常数运用符号微分法则,因此可以灵活地结合编程语言的循环、分支等结构,根据链式法则,借助于计算图计算出任意复杂函数的导数值。由于存在上述优点,该方法在现代深度学习库中得到广泛使用。自动微分在实现时有前向模式和反向模式两种实现方案,下面分别进行介绍。

    前向模式(forward model):前向模式从计算图的起点开始,沿着计算图边的方向依次向前计算,直到到达计算图的终点。它根据自变量的值计算出计算图中每个节点的值 以及导数值 ,并保留中间结果。直到得到整个函数的值和其导数值。整个过程对应于一元复合函数求导时从最内层逐步向外层求导。
    反向模式(reverse model):

  • Tensorflow使用自动微分搭建模型

    待续

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

推荐阅读更多精彩内容