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

flyfish

函数
定义域是关于输入的

上域是关于输出的

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

上域是可能输出的集合

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

[a, b] 这种形式表示的区间我们称作闭区间.
(a, b) 这种形式表示的区间称作开区间.
(a, b] 包括 b, 但不包括 a.像这样的区间称作半开区间.

反函数
如果f(x)=y,那么f−1(y)=xf^{-1}(y)=x
变换f−1就像是f的撤销按钮。
类似Ctrl+Z的撤销操作

函数的复合(Function composition)

对于函数f(x)=cos(x2)f(x)=cos(x^2),我们令g(x)=x2g(x)=x^2,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\lim _{x\to 2}{f(x)}=1

读作“当x趋于2,f(x)的极限等于1”。
平局速率
平均速率是行使距离除以行驶时间
v=s/t

瞬时速度

v=change in schange in t=ΔsΔtv={\frac {{\text{change in }}s}{{\text{change in }}t}}={\frac {\Delta s}{\Delta t}}

Δt=t1−t0\Delta t=t_{1}-t_{0}
由于t1非常靠近t0,两时刻的差值 h

v=Δf(t)Δt=f(t+h)−f(t)(t+h)−(t)=f(t+h)−f(t)hv={\frac {\Delta f(t)}{\Delta t}}={\frac {f(t+h)-f(t)}{(t+h)-(t)}}={\frac {f(t+h)-f(t)}{h}}

v=limΔt→0ΔsΔt=dsdt{ {v}}=\lim _{{\Delta t}\to 0}{\frac {\Delta { {s}}}{\Delta t}}={\frac {d{ {s}}}{d{\mathit {t}}}}

解释
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)=a2f(a) = a^2

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

{\displaystyle {\begin{aligned}f'(a) =\lim _{h\to 0}{\frac {f(a+h)-f(a)}{h}}\\\\ =\lim _{h\to 0}{\frac {(a+h)^{2}-a^{2}}{h}}\\\\[0.3em] =\lim _{h\to 0}{\frac {a^{2}+2ah+h^{2}-a^{2}}{h}}\\\\ =\lim _{h\to 0}{\frac {2ah+h^{2}}{h}}\\\\[0.3em] =\lim _{h\to 0}{(2a+h)}=2a\end{aligned}}}

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

在函数的复合中描述
(f∘g)′=(f′∘g)⋅g′(f\circ g)'=(f'\circ g)\cdot g'

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

dzdx=dzdy⋅dydx=f′(y)g′(x)=f′(g(x))g′(x).{\displaystyle {\frac {dz}{dx}}={\frac {dz}{dy}}\cdot {\frac {dy}{dx}}=f'(y)g'(x)=f'(g(x))g'(x).}

利用公式1求导

f′(x)=limh→0f(x+h)−f(x)h f'(x) = \lim_{h\to0} \frac{f(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)2hf'(x) = \lim_{h\to0} \frac{f(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是实数的扩展。单位ε\varepsilon,它的平方是0

类似复数

复数(complex number)

x=a+bi(i2=−1)x = a + bi \quad (i^2 = -1)
其中a,b是任意实数,b称为复数x的虚部,i称为虚数单位

dual number
x=x+xε(ε2=0)x = x + x\varepsilon \quad (\varepsilon^2=0)

以f(x)=x2f(x) = x^2,x=10 为例求导

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

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

f(10 + \varepsilon) = (10 + \varepsilon)^2 = 100 + 2 * 10 * \varepsilon + \varepsilon^2 = 100 + 20 * \varepsilon

代码如下

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 };//variableDualNumber d1 = DerivationPower(v, 2);std::cout << d1.real <<std::endl << d1.epsilon<<std::endl;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)"{\begin{aligned}\left\langle u,u'\right\rangle +\left\langle v,v'\right\rangle =\left\langle u+v,u'+v'\right\rangle \\\\\left\langle u,u'\right\rangle -\left\langle v,v'\right\rangle =\left\langle u-v,u'-v'\right\rangle \\\\\left\langle u,u'\right\rangle *\left\langle v,v'\right\rangle =\left\langle uv,u'v+uv'\right\rangle \\\\\left\langle u,u'\right\rangle /\left\langle v,v'\right\rangle =\left\langle {\frac {u}{v}},{\frac {u'v-uv'}{v^{2}}}\right\rangle \quad (v\neq 0)\\\\\sin \left\langle u,u'\right\rangle =\left\langle \sin(u),u'\cos(u)\right\rangle \\\\\cos \left\langle u,u'\right\rangle =\left\langle \cos(u),-u'\sin(u)\right\rangle \\\\\exp \left\langle u,u'\right\rangle =\left\langle \exp u,u'\exp u\right\rangle \\\\\log \left\langle u,u'\right\rangle =\left\langle \log(u),u'/u\right\rangle \quad (u>0)\\\\\left\langle u,u'\right\rangle ^{k}=\left\langle u^{k},ku^{{k-1}}u'\right\rangle \quad (u\neq 0)\\\\\left|\left\langle u,u'\right\rangle \right|=\left\langle \left|u\right|,u'{ {sign}}u\right\rangle \quad (u\neq 0)\end{aligned}}"

根据上述式子一共实现了以下几种函数的一阶导数
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 <<std::endl << d1.epsilon<<std::endl;system("pause");return 0;
}

偏导

偏导数的符号∂

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

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

{\displaystyle f_{x}^{\prime },\ f_{x},\ \partial _{x}f,\ D_{x}f,\ D_{1}f,\ {\frac {\partial }{\partial x}}f,{\text{ or }}{\frac {\partial f}{\partial x}}.}

假设
f(x,y)=y3x2f(x,y) = y^3x^2.

要计算 ∂f∂x(x,y)\displaystyle \frac {\partial f}{\partial x}(x,y)
我们只是把y看成是一个固定的数,然后计算对x的普通导数

∂f∂x(x,y)\displaystyle \frac {\partial f}{\partial x}(x,y)与
g(x)=b3x2g(x)=b^3x^2类似

dfdx(x)=2b3x\displaystyle \frac {d f}{d x}(x)=2b^3x

替换字母之后
∂f∂x(x,y)=2y3x\displaystyle \frac {\partial f}{\partial x}(x,y)=2y^3x

dual number 计算偏导示例

f(x,y)=x2+xyf(x, y) = x^2 + xy
f(1,3)

计算 dfdx\frac{df}{dx}

f(1+e,y)=(1+e)2+3(1+e)f(1 + e, y) = (1 + e) ^ 2 + 3(1 + e)
=1+2∗e+3+3∗e= 1 + 2 * e + 3 + 3 * e
=4+5∗e= 4 + 5 * e

结果
dfdx=5\frac{df}{dx} = 5

计算 dfdy\frac{df}{dy}

f(1,3+e)=12+1∗(3+e)f(1, 3 + e) = 1^2 + 1 * (3 + e)

=1+3+e= 1 + 3 + e

=4+e= 4 + e
结果
dfdy=1\frac{df}{dy} = 1

TensorFlow - 求导相关推荐

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

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

  2. tensorflow with求导_3.4tensorflow2.x自动求导原理函数详解

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: 1.1  tensorflow2.x自动求导 1.1.1         自动求导GradientTape类 GradientT ...

  3. TensorFlow基础5-可训练变量和自动求导机制

    记录TensorFlow听课笔记 文章目录 记录TensorFlow听课笔记 一,可训练变量 二,TensorFlow的自动求导 一,可训练变量 Variable对象 : 对Tensor对象的进一步封 ...

  4. TensorFlow的可训练变量和自动求导机制

    文章目录 一些概念.函数.用法 TensorFlow实现一元线性回归 TensorFlow实现多元线性回归 一些概念.函数.用法 对象Variable 创建对象Variable: tf.Variabl ...

  5. TensorFlow 2.0 - 张量/自动求导/梯度下降

    文章目录 1. 张量 2. 自动求导.梯度下降 学习于:简单粗暴 TensorFlow 2 1. 张量 import tensorflow as tf print(tf.__version__) # ...

  6. tensorflow with求导_TensorFlow - 求导

    从函数开始说明TensorFlow是如何求导的 flyfish 函数 定义域是关于输入的 上域是关于输出的 值域实际上是上域的一个子集 上域是可能输出的集合 值域则是实际输出的集合. [a, b] 这 ...

  7. tensorflow基础之——自定义求导

    目录 1. 导数/梯度的理论知识 2. 手撕求导函数 2.1 一元方程 2.2 二元方程 3. 用tensorflow中的库函数完成求导 3.1 一阶函数求导/梯度 3.2 二阶函数求导 4. 梯度下 ...

  8. 深度学习框架 TensorFlow:张量、自动求导机制、tf.keras模块(Model、layers、losses、optimizer、metrics)、多层感知机(即多层全连接神经网络 MLP)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 安装 TensorFlow2.CUDA10.cuDNN7.6. ...

  9. 【小白学PyTorch】扩展之Tensorflow2.0 | 20 TF2的eager模式与求导

    [机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 扩展之Tensorflow2.0 | 19 TF2模型的存储与载入 扩展之Tensorflow2.0 | 18 ...

最新文章

  1. SQL学习笔记-嵌套查询
  2. html生成缩略图来预览解决方案
  3. 实践 Network Policy - 每天5分钟玩转 Docker 容器技术(172)
  4. 【机器视觉】 dev_close_tool算子
  5. HttpClient中异步方法的同步调用
  6. 李迟2021年12月知识总结
  7. LuaForUnity7.1:Lua“类与对象”
  8. 每个人都应该知道的Android Studio快捷方式
  9. 制作Camtasia 2020击键标记动画
  10. Cadence Allegro智能创建PCB封装库
  11. php在线售卡系统,云尚在线发卡系统PHP源码|专门为个人或小型企业提供在线售卡,订单处理系统...
  12. 数字藏品的价值是什么?
  13. Jmeter读取CSV文件
  14. 网络不断电系统服务器ip,IP网络控制主机 T-7700N
  15. java飘落的雪花_[Java教程]实现雪花飘落效果
  16. conda安装cv2库
  17. [数据结构][Python][经典题目]明星问题
  18. win10java卸载有残留_win10打开方式仍残留已卸载软件如何解决
  19. 卫星通信2卫星的定位
  20. 19、交换机基本命令

热门文章

  1. 广西大学计算机专业分流,《广西大学中加国际学院学生专业分流管理办法》的翻译项目报告.pdf...
  2. MMX,SSE,SSE2扫盲
  3. 3-5年的电子工程师最容易遇到的4个瓶颈是什么?
  4. JAVA实现微信公众号支付
  5. 第三届全国大学生算法设计与编程挑战赛个人银首——>金奖
  6. 算法:算法概述【时间复杂度、空间复杂度】
  7. Hadoop伪分布模式安装
  8. 微信支付、支付宝支付回调处理总结
  9. selenium-识别验证码
  10. linux查看erlang安装目录,Linux 安装Erlang