優化器(optimizer)是神經網絡訓練過程中至關重要的組成部分。Tensorflow作為一個強大的深度學習框架,內置了各種各樣的優化器,如SGD、Adam、Adagrad等。本文將從多個方面深入探討Tensorflow優化器的知識。
一、SGD優化器
1、SGD優化器是一種非常基礎的優化器,在深度學習的早期使用較為普遍。SGD的計算方法是沿着函數梯度的方向在每個迭代步驟中進行更新,具體數學表達式可表示為:
theta = theta - alpha * gradient
其中,theta代表優化的參數,alpha代表學習率,gradient代表代價函數的梯度。普通的SGD容易在函數空間內「抖動」,即每個step的更新幅度很大,使得目標函數難以穩定地到達全局最優。利用SGD的變種算法可以使算法穩定和收斂更快,例如Adam(Adaptive Moment Estimation)和Adagrad(Adaptive Gradient)等。
2、下面是一個使用SGD優化器的樣例代碼:
import tensorflow as tf
def model(x, y):
w = tf.Variable([0.1], dtype=tf.float32)
b = tf.Variable([0.1], dtype=tf.float32)
y_pred = w * x + b
loss = tf.reduce_sum(tf.square(y_pred - y))
return loss
def main():
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
loss = model(x, y)
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for i in range(1000):
sess.run(train, {x: x_train, y: y_train})
print(sess.run([w, b]))
二、Adam優化器
1、Adam是一種廣泛使用的優化算法。和SGD相比,它具有自適應學習率和動態更新的動量。Adam不僅可以跟蹤參數的一階矩(平均值)和二階矩(未中心化)估計,還通過運行平均解決偏差估計問題。Adam有助於解決SGD的不受控制的抖動,因為它使用動量維護歷史梯度,以便能夠在換向時不「突擊」地進行更新。
2、Adam是加速、高效的優化算法,但是對於特定問題還需要進行較多次的調參才能取得較好的結果。下面是一個使用Adam優化器的樣例代碼:
import tensorflow as tf
def model(x, y):
w = tf.Variable([0.1], dtype=tf.float32)
b = tf.Variable([0.1], dtype=tf.float32)
y_pred = w * x + b
loss = tf.reduce_sum(tf.square(y_pred - y))
return loss
def main():
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
loss = model(x, y)
optimizer = tf.train.AdamOptimizer(0.01)
train = optimizer.minimize(loss)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for i in range(1000):
sess.run(train, {x: x_train, y: y_train})
print(sess.run([w, b]))
三、Adagrad優化器
1、Adagrad是一種用於梯度下降算法的自適應學習率優化器。Adagrad將學習率縮放每個權重的梯度的整個歷史信息。具體而言,它使用以前的梯度平方的總和來除以新梯度平方的平方和,並將其除以初始學習率。該算法的優勢在於自適應地對不同參數的更新量進行縮放,參數的縮放量與其梯度平方和的歷史數據有關。
2、Adagrad對每個參數有自適應的學習率,使得有大梯度的參數更新速度較慢,而有小梯度的參數更新速度較快,這使得收斂相對SGD和Adam更加穩定,且可以更快地達到局部最小值。下面是一個使用Adagrad優化器的樣例代碼:
import tensorflow as tf
def model(x, y):
w = tf.Variable([0.1], dtype=tf.float32)
b = tf.Variable([0.1], dtype=tf.float32)
y_pred = w * x + b
loss = tf.reduce_sum(tf.square(y_pred - y))
return loss
def main():
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
loss = model(x, y)
optimizer = tf.train.AdagradOptimizer(0.01)
train = optimizer.minimize(loss)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for i in range(1000):
sess.run(train, {x: x_train, y: y_train})
print(sess.run([w, b]))
四、不同優化器的比較
1、對於不同的深度學習任務和不同的網絡架構,選擇不同的優化器可能會對模型的表現產生很大的影響。下面我們通過一個簡單的實驗來比較上述三種優化器在SGD、Adam、Adagrad三種優化器的運行效果。
2、下面是一個使用不同優化器的比較樣例代碼,我們使用MNIST數據集來訓練分類器:
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step_sgd = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
train_step_adam = tf.train.AdamOptimizer(0.01).minimize(cross_entropy)
train_step_adagrad = tf.train.AdagradOptimizer(0.01).minimize(cross_entropy)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
for i in range(100000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step_sgd, feed_dict={x: batch_xs, y_: batch_ys})
sess.run(train_step_adam, feed_dict={x: batch_xs, y_: batch_ys})
sess.run(train_step_adagrad, feed_dict={x: batch_xs, y_: batch_ys})
if i % 1000 == 0:
print("當前訓練次數:", i)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print("SGD:", sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
print("Adam:", sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
print("Adagrad:", sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
五、結論
1、優化器在神經網絡訓練中至關重要,選擇不同的優化器可以對模型表現產生很大的影響。
2、Tensorflow內置了許多常用的優化器,如SGD、Adam和Adagrad。
3、通過實驗和比較不同優化器的性能,我們可以更好地了解不同優化器的適用場景和特性。
原創文章,作者:QUKS,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/145348.html