从函数开始说明TensorFlow是如何求导的

flyfish

函数

定义域是关于输入的

上域是关于输出的

值域实际上是上域的一个子集

上域是可能输出的集合

值域则是实际输出的集合.

[a, b] 这种形式表示的区间我们称作闭区间.

(a, b) 这种形式表示的区间称作开区间.

(a, b] 包括 b, 但不包括 a.像这样的区间称作半开区间.

反函数

如果f(x)=y,那么f−1(y)=x

变换f−1就像是f的撤销按钮。

类似Ctrl+Z的撤销操作

函数的复合(Function composition)

对于函数f(x)=cos(x2),我们令g(x)=x2,h(x)=cos(x),那么f(x)=h(g(x)),也可表示为f=h 。g,这里的圈是复合符号,表示“与……的复合”,即f是g与h的复合。

读法

The notation g ∘ f is read as

“g circle f “,

“g round f “,

“g composed with f “,

“g after f “,

“g following f “,

“g of f”,

“g on f “.

用C++表达类似

有两个函数g和f

float x, y, z;

// ...

y = g(x);

z = f(y);

或者

z=f(g(x));

极限

limx→2f(x)=1

读作“当x趋于2,f(x)的极限等于1”。

平局速率

平均速率是行使距离除以行驶时间

v=s/t

瞬时速度

v=change inschange int=ΔsΔt

Δt=t1−t0

由于t1非常靠近t0,两时刻的差值 h

v=Δf(t)Δt=f(t+h)−f(t)(t+h)−(t)=f(t+h)−f(t)h

v=limΔt→0ΔsΔt=dsdt

解释

Distinction between speed and velocity(速率和速度之间的区别)

Speed describes only how fast an object is moving, whereas velocity gives both how fast it is and in which direction the object is moving.

速率只描述物体运动的快慢,而速度则给出物体运动的快慢和方向。

求导例子 f(a)=a2

f′(a)=limh→0f(a+h)−f(a)h=limh→0(a+h)2−a2h=limh→0a2+2ah+h2−a2h=limh→02ah+h2h=limh→0(2a+h)=2a

链式求导(Chain rule) 复合函数

在函数的复合中描述

(f∘g)′=(f′∘g)⋅g′

当z=f(y), y=g(x)

dzdx=dzdy⋅dydx=f′(y)g′(x)=f′(g(x))g′(x).

利用公式1求导

f′(x)=limh→0f(x+h)−f(x)h

int main()

{

double h = 0.000001;

double x = 10.0;

double v = ((x + h) * (x + h) - x * x) / h;

std::cout << std::setprecision(20) << v << std::endl;

system("pause");

return 0;

}

利用公式2求导

f′(x)=limh→0f(x+h)−f(x−h)2h

int main()

{

double h = 0.000001;

double x = 10.0;

double v = ((x + h) * (x + h) - (x-h) * (x-h)) /(2*h);

std::cout << std::setprecision(20) << v << std::endl;

system("pause");

return 0;

}

dual number

线性代数中dual number是实数的扩展。单位ε,它的平方是0

类似复数

复数(complex number)

x=a+bi(i2=−1)

其中a,b是任意实数,b称为复数x的虚部,i称为虚数单位

dual number

x=x+xε(ε2=0)

以f(x)=x2,x=10 为例求导

f(10) = 100,df/dx(10) = 20

f(10+ε)=(10+ε)2=100+2∗10∗ε+ε2=100+20∗ε

代码如下

typedef struct

{

double real;

double epsilon;

} DualNumber;

DualNumber DerivationPower(DualNumber d, double e)

{

DualNumber dual = { std::pow(d.real, e), d.epsilon * e * std::pow(d.real, e - 1) };

return dual;

}

int main()

{

double x = 10;

DualNumber v = { x,1 };//variable

DualNumber d1 = DerivationPower(v, 2);

std::cout << d1.real <<:endl d1.epsilon>

system("pause");

return 0;

}

⟨u,u′⟩+⟨v,v′⟩=⟨u+v,u′+v′⟩⟨u,u′⟩−⟨v,v′⟩=⟨u−v,u′−v′⟩⟨u,u′⟩∗⟨v,v′⟩=⟨uv,u′v+uv′⟩⟨u,u′⟩/⟨v,v′⟩=⟨uv,u′v−uv′v2⟩(v≠0)sin⟨u,u′⟩=⟨sin(u),u′cos(u)⟩cos⟨u,u′⟩=⟨cos(u),−u′sin(u)⟩exp⟨u,u′⟩=⟨expu,u′expu⟩log⟨u,u′⟩=⟨log(u),u′/u⟩(u>0)⟨u,u′⟩k=⟨uk,kuk−1u′⟩(u≠0)∣∣⟨u,u′⟩∣∣=⟨|u|,u′signu⟩(u≠0)"

根据上述式子一共实现了以下几种函数的一阶导数

Add, Sub, Mul, Div, Sin, Cos, Exp, Log, Power, Abs

real是函数的值,epsilon是函数的一阶导数

typedef struct

{

double real;

double epsilon;

} DualNumber;

DualNumber Dual(double r, double e)

{

DualNumber epsilon = { r, e };

return epsilon;

}

DualNumber SetConstant(double r)

{

return Dual(r, 0);

}

DualNumber SetVariable(double d)

{

return Dual(d, 1);

}

DualNumber Add(DualNumber U, DualNumber V)

{

return Dual(U.real + V.real, U.epsilon + V.epsilon);

}

DualNumber Sub(DualNumber U, DualNumber V)

{

return Dual(U.real - V.real, U.epsilon - V.epsilon);

}

DualNumber Mul(DualNumber U, DualNumber V)

{

return Dual(U.real * V.real, U.real * V.epsilon + U.epsilon * V.real);

}

DualNumber Div(DualNumber U, DualNumber V)

{

if (V.real == 0) return { 0,0 };

return Dual(U.real / V.real, (U.epsilon - (U.real / V.real) * V.epsilon) / V.real);

}

DualNumber Sin(DualNumber U)

{

return Dual(sin(U.real), U.epsilon * cos(U.real));

}

DualNumber Cos(DualNumber U)

{

return Dual(cos(U.real), -U.epsilon * sin(U.real));

}

DualNumber Exp(DualNumber U)

{

return Dual(exp(U.real), U.epsilon * exp(U.real));

}

DualNumber Log(DualNumber U)

{

assert(U.real > 0);

return Dual(log(U.real), U.epsilon / U.real);

}

DualNumber Power(DualNumber U, double e)

{

return Dual(pow(U.real, e), U.epsilon * e * pow(U.real, e - 1));

}

DualNumber Abs(DualNumber U)

{

assert(U.real != 0);

return Dual(abs(U.real), U.epsilon * ((U.real > 0) ? 1 : -1));

}

int main(void) {

double x = 10;

DualNumber v = SetVariable(x);

DualNumber d1 = Power(v, 2);

std::cout << d1.real <<:endl d1.epsilon>

system("pause");

return 0;

}

偏导

偏导数的符号∂

一个多变量函数的偏导数,就是它关于其中一个变量的导数而保持其他变量不变,函数f(x, y, …) 关于变量x的偏导用以下符号表示

f′x,fx,∂xf,Dxf,D1f,∂∂xf,or∂f∂x.

假设

f(x,y)=y3x2.

要计算 ∂f∂x(x,y)

我们只是把y看成是一个固定的数,然后计算对x的普通导数

∂f∂x(x,y)与

g(x)=b3x2类似

dfdx(x)=2b3x

替换字母之后

∂f∂x(x,y)=2y3x

dual number 计算偏导示例

f(x,y)=x2+xy

f(1,3)

计算 dfdx

f(1+e,y)=(1+e)2+3(1+e)

=1+2∗e+3+3∗e

=4+5∗e

结果

dfdx=5

计算 dfdy

f(1,3+e)=12+1∗(3+e)

=1+3+e

=4+e

结果

dfdy=1

tensorflow with求导_TensorFlow - 求导相关推荐

  1. tensorflow with求导_tensorflow求导和梯度计算实例

    1. 函数求一阶导 import tensorflow as tf tf.enable_eager_execution() tfe=tf.contrib.eager from math import ...

  2. 5.2 matlab多项式计算(多项式的四则运算、求导、求值、求根)

    1.多项式的表示 在MATLAB中创建多项式向量时,注意三点: (1)多项式系数向量的顺序是从高到低. (2)多项式系数向量包含0次项系数,所以其长度为多项式最高次数加1. (3)如果有的项没有,系数 ...

  3. 二阶矩阵转置怎么求_矩阵求导术(下)

    本文承接上篇 https://zhuanlan.zhihu.com/p/24709748,来讲矩阵对矩阵的求导术.使用小写字母x表示标量,粗体小写字母 表示列向量,大写字母X表示矩阵.矩阵对矩阵的求导 ...

  4. luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)

    luogu P4725 多项式对数函数 (模板题.FFT.多项式求逆.求导和积分) 手动博客搬家: 本文发表于20181125 13:25:03, 原地址https://blog.csdn.net/s ...

  5. python求函数一二阶导_python:利用多种方式解微分方程(以二阶微分系统零状态响应为例)...

    1.问题:求系统的零状态响应 image.png 2.引入 首先用高数知识求解非齐次常系数微分方程 image.png 再利用信号与系统中冲激响应求解验证 image.png 利用MATLAB求解验证 ...

  6. MATLAB新手简明使用教程(七)——使用matlab建立多项式以及求导,商求导乘积求导等——新手来看,保证看懂。

    前期回顾 上一期中,我们学了下面的知识: 定积分的基本概念和一些简单的几何意义. 使用 int 函数计算不定积分. 使用 int 函数计算定积分. 本期内容 本期我打算给大家介绍一下使用matlab对 ...

  7. 函数求导及求微分的基本公式

    函数求导及求微分的基本公式

  8. 高等数学期末总复习 DAY4. 利用莱布尼茨定理求高阶导 隐函数求导 对数求导法 参数函数求导 用导数求切线、法线 函数的微分

    DAY 4. 这世上总要有个明白人,懂得克制. 文章目录 DAY 4. 1. 利用莱布尼茨定理求高阶导 2.隐函数求导 3.对数求导 4.参数函数求导 5.用导数求切线.法线 6.函数的微分 1. 利 ...

  9. 二元函数对xy同时求导_高等数学期末总复习 DAY4. 利用莱布尼茨定理求高阶导 隐函数求导 对数求导法 参数函数求导等...

    DAY 4. 这世上总要有个明白人,懂得克制. DAY 4. 1. 利用莱布尼茨定理求高阶导 2.隐函数求导 3.对数求导 4.参数函数求导 5.用导数求切线.法线 6.函数的微分 1. 利用莱布尼茨 ...

最新文章

  1. 数据结构与算法(2-1)线性表之顺序存储(顺序表)
  2. 零基础参加java培训哪家机构好
  3. R语言广义线性模型函数GLM、R中有几种logistic回归扩展和变异、robust包中的glmRob函数鲁棒logistic回归、ms包中的lrm函数拟合序数逻辑回归
  4. GridView RowCommand 获取列值
  5. img 隐藏_CSS3界面样式和溢出文字隐藏overflow
  6. devc++调试下一步没反应_某化工厂污水处理站SBR工艺调试方案
  7. Ubuntu系统的安装与使用:[3]搜狗输入法安装
  8. 在Oracle中重编译所有无效的存储过程
  9. linux - python
  10. 商汤科技-数据运维工程师-提前批笔试题目汇总
  11. 哈佛推出这款PyTorch工具包,10行代码训练“AI药神”模型
  12. oracle同机单实例加入集群,将oracle同机单实例加入rac集群的操作步骤
  13. (转载)PHP环境搭建-记录
  14. 期刊论文图片像素要求
  15. 【AP】a pratical guide to robust optimization(2)
  16. 错误 C4996 inet_addr: Use inet_pton() or InetPton() instead or defin
  17. 免费查重可以一直使用吗? ​​
  18. NFC中国-中国第一NFC论坛,NFC中文论坛+NFC技术社区+NFC_电子发烧友网【申明:来源于网络】
  19. 程序员在主动要求涨工资这事上,千万不要学我!从我的第一份工资800开始说起
  20. Anaconda操作手册-添加kernal

热门文章

  1. scss导出颜色变量为空对象
  2. 炉石传说强化机器人_炉石传说复制机器人效果一览
  3. 驰为平板装Android,驰为VX8 3G Win8刷安卓固件教程
  4. 学习机器视觉的参考顺序
  5. php网页图片提取,php正则提取html图片(img)src地址与任意属性的方法
  6. 智能驾驶板块_智能驾驶板块龙头股大盘点
  7. centos打显卡驱动命令_CentOS下显卡驱动安装的相关思考
  8. leetcode python 009
  9. java doevents_txjs(java)
  10. 当下美容销售该如何做?