【TensorFlow】筆記:基礎知識-自動微分
點擊上方“公眾號”可訂閱哦!
本篇文章主要涉及自動微分教程,它是優(yōu)化機器學習模型的關鍵技巧之一。
01
自動求導機制
TensorFlow 為自動微分提供了?tf.GradientTape?API ,根據(jù)某個函數(shù)的輸入變量來計算它的導數(shù)。Tensorflow 會把 'tf.GradientTape' 上下文中執(zhí)行的所有操作都記錄在一個磁帶上 ("tape")。然后基于這個磁帶和每次操作產(chǎn)生的導數(shù),用反向微分法("reverse mode differentiation")來計算這些被“記錄在案”的函數(shù)的導數(shù)。
以下代碼展示了如何使用tf.GradientTape()計算函數(shù)?
import tensorflow as tfx = tf.Variable(initial_value=3.)with tf.GradientTape() as tape: # 在 tf.GradientTape() 的上下文內,所有計算步驟都會被記錄以用于求導y = tf.square(x)y_grad = tape.gradient(y, x) # 計算y關于x的導數(shù)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?參數(shù)來指定初始值。這里將變量?x?初始化為?3.?1。變量與普通張量的一個重要區(qū)別是其默認能夠被 TensorFlow 的自動求導機制所求導,因此往往被用于定義機器學習模型的參數(shù)。
tf.GradientTape()?是一個自動求導的記錄器。只要進入了?with?tf.GradientTape()?as?tape?的上下文環(huán)境,則在該環(huán)境中計算步驟都會被自動記錄。比如在上面的示例中,計算步驟?y?=?tf.square(x)?即被自動記錄。離開上下文環(huán)境后,記錄將停止,但記錄器?tape?依然可用,因此可以通過?y_grad?=?tape.gradient(y,?x)?求張量?y?對變量?x?的導數(shù)。
在機器學習中,更加常見的是對多元函數(shù)求偏導數(shù),以及對向量或矩陣的求導。以下代碼展示如何使用tf.GradientTape()計算函數(shù)?
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的偏導數(shù)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?參數(shù)來指定求和的維度,不指定則默認對所有元素求和)。TensorFlow 中有大量的張量操作 API,包括數(shù)學運算、張量形狀操作(如?tf.reshape())、切片和連接(如?tf.concat())等多種類型,可以通過查閱 TensorFlow 的官方 API 文檔?2?來進一步了解。
參考文獻:文檔主要參考TensorFlow官網(wǎng)
?END
掃碼關注
微信號|sdxx_rmbj
