一、優化器基類介紹
標注一點,優化器中的學習率可以是tensor,這意味着它可以feed,
learning_rate: A Tensor or a floating point value.
正常使用流程:
創建優化器對象 -> 指定最小化loss & 可優化參數 -> runminimize實際包含兩個操作:首先計算梯度,然后更新可訓練參數。
非標准化操作:
希望計算出梯度之后 - > 人工處理梯度 -> 優化參數,
使用兩個新的函數取代minimize:
1 # 創建一個optimizer. 2 opt = GradientDescentOptimizer(learning_rate=0.1) 3 4 # 計算<list of variables>相關的梯度 5 grads_and_vars = opt.compute_gradients(loss, <list of variables>) 6 7 # grads_and_vars為tuples (gradient, variable)組成的列表。 8 #對梯度進行想要的處理,比如cap處理 9 capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars] 10 11 # 令optimizer運用capped的梯度(gradients) 12 opt.apply_gradients(capped_grads_and_vars)
二、優化器API詳解
操作 | 描述 |
---|---|
class tf.train.Optimizer | 基本的優化類,該類不常常被直接調用,而較多使用其子類, 比如GradientDescentOptimizer, AdagradOptimizer 或者MomentumOptimizer |
tf.train.Optimizer.__init__(use_locking, name) | 創建一個新的優化器, 該優化器必須被其子類(subclasses)的構造函數調用 |
tf.train.Optimizer.minimize(loss, global_step=None, var_list=None, gate_gradients=1, aggregation_method=None, colocate_gradients_with_ops=False, name=None, grad_loss=None) |
添加操作節點,用於最小化loss,並更新var_list 該函數是簡單的合並了compute_gradients()與apply_gradients()函數 返回為一個優化更新后的var_list,如果global_step非None,該操作還會為global_step做自增操作 |
tf.train.Optimizer.compute_gradients(loss,var_list=None, gate_gradients=1, aggregation_method=None, colocate_gradients_with_ops=False, grad_loss=None) |
對var_list中的變量計算loss的梯度 該函數為函數minimize()的第一部分,返回一個以元組(gradient, variable)組成的列表 |
tf.train.Optimizer.apply_gradients(grads_and_vars, global_step=None, name=None) | 將計算出的梯度應用到變量上,是函數minimize()的第二部分,返回一個應用指定的梯度的操作Operation,對global_step做自增操作 |
tf.train.Optimizer.get_name() | 獲取名稱 |
初始化優化器:
最小化loss:
計算梯度並返回:
應用梯度更新參數:
三、並發性參數專欄
minimize()和compute_gradients()的可選參數,
有GATE_NONE,GATE_OP,GATE_GRAPH三個可選選項。
GATE_NONE最高級別並發,會造成結果不可復現;
GATE_OP每一個節點內部不並發,計算完本節點全部梯度才更新;
GATE_GRAPH最低並發,計算好全部梯度才更新參數,如果想在apply梯度(全梯度)前處理一下,使用這個選項。
四、調試函數(高級API)
一些optimizer的子類,比如 MomentumOptimizer 和 AdagradOptimizer 分配和管理着額外的用於訓練的變量。這些變量稱之為’Slots’,Slots有相應的名稱,可以向optimizer訪問的slots名稱。有助於在log debug一個訓練算法以及報告slots狀態。
操作 | 描述 |
---|---|
tf.train.Optimizer.get_slot_names() | 返回一個由Optimizer所創建的slots的名稱列表 |
tf.train.Optimizer.get_slot(var, name) | 返回一個name所對應的slot,name是由Optimizer為var所創建 var為用於傳入 minimize() 或 apply_gradients()的變量 |
五、優化器子類展示
本節不過多區分這些子類的區別,后續章節會對比各個優化器的性能。
操作 | 描述 |
---|---|
class tf.train.GradientDescentOptimizer | 使用梯度下降算法的Optimizer |
tf.train.GradientDescentOptimizer.__init__(learning_rate, use_locking=False, name=’GradientDescent’) |
構建一個新的梯度下降優化器(Optimizer) |
class tf.train.AdadeltaOptimizer | 使用Adadelta算法的Optimizer |
tf.train.AdadeltaOptimizer.__init__(learning_rate=0.001, rho=0.95, epsilon=1e-08, use_locking=False, name=’Adadelta’) |
創建Adadelta優化器 |
class tf.train.AdagradOptimizer | 使用Adagrad算法的Optimizer |
tf.train.AdagradOptimizer.__init__(learning_rate, initial_accumulator_value=0.1, use_locking=False, name=’Adagrad’) |
創建Adagrad優化器 |
class tf.train.MomentumOptimizer | 使用Momentum算法的Optimizer |
tf.train.MomentumOptimizer.__init__(learning_rate, momentum, use_locking=False, name=’Momentum’, use_nesterov=False) |
創建momentum優化器 momentum:動量,一個tensor或者浮點值 |
class tf.train.AdamOptimizer | 使用Adam 算法的Optimizer |
tf.train.AdamOptimizer.__init__(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name=’Adam’) |
創建Adam優化器 |
class tf.train.FtrlOptimizer | 使用FTRL 算法的Optimizer |
tf.train.FtrlOptimizer.__init__(learning_rate, learning_rate_power=-0.5, initial_accumulator_value=0.1, l1_regularization_strength=0.0, l2_regularization_strength=0.0, use_locking=False, name=’Ftrl’) |
創建FTRL算法優化器 |
class tf.train.RMSPropOptimizer | 使用RMSProp算法的Optimizer |
tf.train.RMSPropOptimizer.__init__(learning_rate, decay=0.9, momentum=0.0, epsilon=1e-10, use_locking=False, name=’RMSProp’) |
創建RMSProp算法優化器 |