深度学习基础(一):图计算理论

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]

经验分享 程序员 微信小程序 职场和发展