深度学习基础(一):图计算理论
1. 图计算理论
计算图是应用图理论表示数学公式的一种方法,由节点和边组成。在计算图中,节点可以式输入值,也可以是一些函数。 边表示这个数据在图中流向的权重值。一般的规则是对从一个节点到另一个节点的所有可能路径求和,将路径每条边上的导数相乘。
对公式 e = ( a + b ) ∗ ( b + 1 ) e=(a+b)*(b+1) e=(a+b)∗(b+1),令 c = a + b , d = b + 1 c=a+b,d=b+1 c=a+b,d=b+1,则 e = c ∗ d e=c*d e=c∗d 因此, ∂ e ∂ b = ∂ e ∂ c ∂ c ∂ b + ∂ e ∂ d ∂ d ∂ b = 2 ∗ 1 + 3 ∗ 1 = 5 frac{partial e}{partial b}=frac{partial e}{partial c}frac{partial c}{partial b}+frac{partial e}{partial d}frac{partial d}{partial b}=2*1+3*1=5 ∂b∂e=∂c∂e∂b∂c+∂d∂e∂b∂d=2∗1+3∗1=5
2.前向微分(forward-mode differentiation)
forward: ∂ ∂ x frac{partial}{partial x} ∂x∂。构建一次图只能求一个参数的导数,对a和b计算偏导数时,需要进行两次操作。
下图从输入b对每个节点求导,最终计算 ∂ e ∂ b frac{partial e}{partial b} ∂b∂e。
3.反向微分(reverse-mode differentiation)
reverse: ∂ z ∂ frac{partial z}{partial} ∂∂z
构建图时可以一次求出所有参数的导数,可同时对a和b进行求导计算。Tensorflow和Pytorch均采用反向微分构建图。
4.动态图和静态图
静态图计算分为两步:
第一步,定义图的结构,例如输入、多少层网络、loss定义、结果预测
第二步,执行图的计算,通过不断的计算,利用反向传播来计算loss
优点: 因为静态图是只用定义一次图结构,所以在训练和测试速度上会更快一些
缺点:
1)如果输入的尺寸并不是固定的,就很难定义;
2)输入输出的结构包括文本、图像等多种格式;
因为静态图的这些特性,给debug带来很大的困难
动态图兼容python的各种逻辑控制语法,每次都会重新构建一个新的计算图,我们在选择框架时优先考虑程序员编程的便捷性(能更方便地进行调试和更直观地设计),而不是框架所能带来的模型加速能力
# 计算导数 import tensorflow as tf x = tf.ones((2, 2)) with tf.GradientTape() as t: t.watch(x) y = tf.reduce_sum(x) z = tf.multiply(y, tf.multiply(y,y)) dz_dx = t.gradient(z, x) print(dz_dx) #输出 tf.Tensor( [[48. 48.] [48. 48.]], shape=(2, 2), dtype=float32)
在函数上增加@tf.function将普通函数转变化动态图
@tf.function def simple_nn_layer(x, y): return tf.nn.relu(tf.matmul(x, y)) simple_nn_layer(x, y): #输出 <tensorflow.python.eager.def_function.Function at 0x1266e8a5048>
参考资料 [1]