zoukankan      html  css  js  c++  java
  • Theano学习笔记(四)——导数

    导数使用T.grad计算。

    这里使用pp()打印梯度的符号表达式。

    第3行输出是打印了经过优化器简化的符号梯度表达式,与第1个输出相比确实简单多了。

    fill((x** TensorConstant{2}), TensorConstant{1.0})指创建一个x**2大小的矩阵,并填充1。

    importtheano.tensor as T
    fromtheano import pp
    fromtheano import function
    x= T.dscalar('x')
    y= x ** 2
    gy= T.grad(y, x)
    printpp(gy)
    f= function([x], gy)
    printf(4)
    printpp(f.maker.fgraph.outputs[0])
    >>> 
    ((fill((x** TensorConstant{2}), TensorConstant{1.0}) * TensorConstant{2}) * (x **(TensorConstant{2} - TensorConstant{1})))
    8.0
    (TensorConstant{2.0}* x)

    T.grad的第1个參数必须是标量

    比如计算逻辑函数sigmoid的导数:


    importtheano.tensor as T
    fromtheano import function
    x= T.dmatrix('x')
    s= T.sum(1 / (1 + T.exp(-x)))
    gs= T.grad(s, x)
    dlogistic= function([x], gs)
    printdlogistic([[0, 1], [-1, -2]])
    >>> 
    [[0.25        0.19661193]
     [ 0.19661193 0.10499359]]


    计算雅克比(Jacobian)矩阵

    雅克比矩阵是向量的一阶偏导数:


    用T.arrange生成从0到y.shape[0]的序列。循环计算。

    scan能够提高创建符号循环效率。

    lambda~是python内建的magicfunction.

    x= T.dvector('x')
    y = x ** 2
    J, updates = theano.scan(lambdai, y,x : T.grad(y[i], x), sequences=T.arange(y.shape[0]), non_sequences=[y,x])
    f = function([x], J,updates=updates)
    f([4, 4])
    >>> 
    [[ 8.  0.]
     [ 0. 8.]]

     

    计算海森(Hessian)矩阵

    海森矩阵是多元函数的二阶偏导数方阵。


    仅仅要用T.grad(cost,x)替换雅克比矩阵的一些y就可以。

    x= T.dvector('x')
    y = x** 2
    cost= y.sum()
    gy =T.grad(cost, x)
    H,updates = theano.scan(lambda i, gy,x : T.grad(gy[i], x),sequences=T.arange(gy.shape[0]), non_sequences=[gy, x])
    f =function([x], H, updates=updates)
    f([4,4])
    >>> 
    [[2.  0.]
     [ 0. 2.]]

     

    雅克比右乘

    x能够由向量扩展成矩阵。雅克比右乘使用Rop:

    W = T.dmatrix('W')
    V =T.dmatrix('V')
    x =T.dvector('x')
    y =T.dot(x, W)
    JV =T.Rop(y, W, V)
    f =theano.function([W, V, x], JV)
    printf([[1, 1], [1, 1]], [[2, 2], [2, 2]], [0,1])
    >>> 
    [2.  2.]

    雅克比左乘

    雅克比左乘使用Lop:


    import theano
    import theano.tensor as T
    from theano import function
    x = T.dvector('x')
    v =T.dvector('v')
    x =T.dvector('x')
    y =T.dot(x, W)
    VJ =T.Lop(y, W, v)
    f =theano.function([v,x], VJ)
    print f([2, 2], [0, 1])
    >>> 
    [[0.  0.]
     [ 2. 2.]]


     

    海森矩阵乘以向量

    能够使用Rop


    import theano
    import theano.tensor as T
    from theano import function
    x= T.dvector('x')
    v= T.dvector('v')
    y= T.sum(x ** 2)
    gy= T.grad(y, x)
    Hv= T.Rop(gy, x, v)
    f= theano.function([x, v], Hv)
    printf([4, 4], [2, 2])
    >>> 
    [4.  4.]


    欢迎參与讨论并关注本博客微博以及知乎个人主页兴许内容继续更新哦~

    转载请您尊重作者的劳动,完整保留上述文字以及文章链接,谢谢您的支持!



  • 相关阅读:
    Socket基本介绍和实际应用
    自定义流水布局(UICollectionViewFlowLayout的基本使用)
    UIMenuController 简单示例 (Swift)
    继续坚持
    获取手机信息(UIDevice、NSBundle、NSLocale)
    iOS 远程推送 根据后台推送内容的不同跳转指定页面
    定制多样式二维码
    二维码扫描和应用跳转
    iOS开发网络篇—Socket编程
    iOS开发中常用英语单词和句子整理(持续更新)
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6811509.html
Copyright © 2011-2022 走看看