【TensorFlow】笔记:基础知识-自动微分

深度学习入门笔记

共 1998字,需浏览 4分钟

 · 2021-02-01

点击上方“公众号”可订阅哦!


本篇文章主要涉及自动微分教程,它是优化机器学习模型的关键技巧之一。


01

自动求导机制


TensorFlow 为自动微分提供了 tf.GradientTape API ,根据某个函数的输入变量来计算它的导数。Tensorflow 会把 'tf.GradientTape' 上下文中执行的所有操作都记录在一个磁带上 ("tape")。然后基于这个磁带和每次操作产生的导数,用反向微分法("reverse mode differentiation")来计算这些被“记录在案”的函数的导数。


以下代码展示了如何使用tf.GradientTape()计算函数  在  时的导数:

import tensorflow as tf
x = tf.Variable(initial_value=3.)with tf.GradientTape() as tape: # 在 tf.GradientTape() 的上下文内,所有计算步骤都会被记录以用于求导 y = tf.square(x)y_grad = tape.gradient(y, x) # 计算y关于x的导数print(y, y_grad)

# outputtf.Tensor(9.0, shape=(), dtype=float32)tf.Tensor(6.0, shape=(), dtype=float32)

这里 x 是一个初始化为 3 的 变量 (Variable),使用 tf.Variable() 声明。与普通张量一样,变量同样具有形状、类型和值三种属性。使用变量需要有一个初始化过程,可以通过在 tf.Variable() 中指定 initial_value 参数来指定初始值。这里将变量 x 初始化为 3. 1。变量与普通张量的一个重要区别是其默认能够被 TensorFlow 的自动求导机制所求导,因此往往被用于定义机器学习模型的参数。


tf.GradientTape() 是一个自动求导的记录器。只要进入了 with tf.GradientTape() as tape 的上下文环境,则在该环境中计算步骤都会被自动记录。比如在上面的示例中,计算步骤 y = tf.square(x) 即被自动记录。离开上下文环境后,记录将停止,但记录器 tape 依然可用,因此可以通过 y_grad = tape.gradient(y, x) 求张量 y 对变量 x 的导数。



在机器学习中,更加常见的是对多元函数求偏导数,以及对向量或矩阵的求导。以下代码展示如何使用tf.GradientTape()计算函数  在  ,  时分别对  的偏导数。

X = tf.constant([[1., 2.], [3., 4.]])y = tf.constant([[1.], [2.]])w = tf.Variable(initial_value=[[1.], [2.]])b = tf.Variable(initial_value=1.)with tf.GradientTape() as tape:    L = tf.reduce_sum(tf.square(tf.matmul(X, w) + b - y))w_grad, b_grad = tape.gradient(L, [w, b])        # 计算L(w, b)关于w, b的偏导数print(L, w_grad, b_grad
# outputtf.Tensor(125.0, shape=(), dtype=float32)tf.Tensor([[ 70.][100.]], shape=(2, 1), dtype=float32)tf.Tensor(30.0, shape=(), dtype=float32)


这里, tf.square() 操作代表对输入张量的每一个元素求平方,不改变张量形状。 tf.reduce_sum() 操作代表对输入张量的所有元素求和,输出一个形状为空的纯量张量(可以通过 axis 参数来指定求和的维度,不指定则默认对所有元素求和)。TensorFlow 中有大量的张量操作 API,包括数学运算、张量形状操作(如 tf.reshape())、切片和连接(如 tf.concat())等多种类型,可以通过查阅 TensorFlow 的官方 API 文档 2 来进一步了解。



参考文献:文档主要参考TensorFlow官网



 END

扫码关注

微信号|sdxx_rmbj


浏览 10
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报