LBFGS¶
- class torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100, line_search_fn=None)[source][source]¶
實現 L-BFGS 演算法。
主要受 minFunc 啟發。
警告
該最佳化器不支援按引數設定選項和引數組(只能有一個引數組)。
警告
目前,所有引數必須位於同一裝置上。未來將改進此限制。
注意
這是一個記憶體密集型最佳化器(需要額外的
param_bytes * (history_size + 1)位元組)。如果記憶體不足,請嘗試減小歷史大小,或使用其他演算法。- 引數
params (iterable) – 要最佳化的引數的可迭代物件。引數必須是實數。
lr (float, optional) – 學習率(預設值:1)
max_iter (int, optional) – 每個最佳化步驟的最大迭代次數(預設值:20)
max_eval (int, optional) – 每個最佳化步驟的最大函式評估次數(預設值:max_iter * 1.25)。
tolerance_grad (float, optional) – 一階最優性的終止容差(預設值:1e-7)。
tolerance_change (float, optional) – 函式值/引數變化的終止容差(預設值:1e-9)。
history_size (int, optional) – 更新歷史大小(預設值:100)。
line_search_fn (str, optional) – 可以是 ‘strong_wolfe’ 或 None(預設值:None)。
- add_param_group(param_group)[source]¶
向
Optimizer的 param_groups 新增一個引數組。這在微調預訓練網路時非常有用,因為可以使凍結的層可訓練,並在訓練過程中新增到
Optimizer中。- 引數
param_group (dict) – 指定應最佳化哪些 Tensor 以及組特定的最佳化選項。
- load_state_dict(state_dict)[source]¶
載入最佳化器狀態。
- 引數
state_dict (dict) – 最佳化器狀態。應為呼叫
state_dict()返回的物件。
注意
引數的名稱(如果它們在
state_dict()的每個引數組的 “param_names” 鍵下存在)不會影響載入過程。對於自定義情況(例如載入的狀態字典中的引數與最佳化器中初始化的引數不同),應實現自定義的register_load_state_dict_pre_hook以相應地調整載入的字典。如果在載入的狀態字典param_groups中存在param_names,它們將被儲存並覆蓋最佳化器狀態中當前存在的名稱。如果載入的狀態字典中不存在param_names,則最佳化器的param_names將保持不變。
- register_load_state_dict_post_hook(hook, prepend=False)[source]¶
註冊一個 load_state_dict 後置鉤子,該鉤子將在呼叫
load_state_dict()後被呼叫。其簽名應如下所示hook(optimizer) -> None
引數
optimizer是正在使用的最佳化器例項。該鉤子將在對
self呼叫load_state_dict後使用引數self呼叫。註冊的鉤子可用於在load_state_dict載入state_dict後執行後處理。- 引數
hook (Callable) – 要註冊的使用者定義鉤子。
prepend (bool) – 如果為 True,提供的後置
hook將在所有已註冊的 load_state_dict 後置鉤子之前觸發。否則,提供的hook將在所有已註冊的後置鉤子之後觸發。(預設值:False)
- 返回
一個控制代碼,可以透過呼叫
handle.remove()來移除新增的鉤子- 返回型別
torch.utils.hooks.RemoveableHandle
- register_load_state_dict_pre_hook(hook, prepend=False)[source]¶
註冊一個 load_state_dict 前置鉤子,該鉤子將在呼叫
load_state_dict()前被呼叫。其簽名應如下所示hook(optimizer, state_dict) -> state_dict or None
引數
optimizer是正在使用的最佳化器例項,引數state_dict是使用者傳遞給load_state_dict的state_dict的淺複製。該鉤子可以原地修改state_dict,也可以選擇返回一個新的state_dict。如果返回了一個state_dict,它將被用於載入到最佳化器中。該鉤子將在對
self呼叫load_state_dict前使用引數self和state_dict呼叫。註冊的鉤子可用於在呼叫load_state_dict之前執行預處理。- 引數
hook (Callable) – 要註冊的使用者定義鉤子。
prepend (bool) – 如果為 True,提供的前置
hook將在所有已註冊的 load_state_dict 前置鉤子之前觸發。否則,提供的前置hook將在所有已註冊的前置鉤子之後觸發。(預設值:False)
- 返回
一個控制代碼,可以透過呼叫
handle.remove()來移除新增的鉤子- 返回型別
torch.utils.hooks.RemoveableHandle
- register_state_dict_post_hook(hook, prepend=False)[source]¶
註冊一個 state dict 後置鉤子,該鉤子將在呼叫
state_dict()後被呼叫。其簽名應如下所示
hook(optimizer, state_dict) -> state_dict or None
該鉤子將在對
self生成一個state_dict後使用引數self和state_dict呼叫。該鉤子可以原地修改state_dict,也可以選擇返回一個新的state_dict。註冊的鉤子可用於在state_dict返回之前對其執行後處理。- 引數
hook (Callable) – 要註冊的使用者定義鉤子。
prepend (bool) – 如果為 True,提供的後置
hook將在所有已註冊的 state_dict 後置鉤子之前觸發。否則,提供的hook將在所有已註冊的後置鉤子之後觸發。(預設值:False)
- 返回
一個控制代碼,可以透過呼叫
handle.remove()來移除新增的鉤子- 返回型別
torch.utils.hooks.RemoveableHandle
- register_state_dict_pre_hook(hook, prepend=False)[source]¶
註冊一個 state dict 前置鉤子,該鉤子將在呼叫
state_dict()前被呼叫。其簽名應如下所示
hook(optimizer) -> None
引數
optimizer是正在使用的最佳化器例項。該鉤子將在對self呼叫state_dict前使用引數self呼叫。註冊的鉤子可用於在呼叫state_dict之前執行預處理。- 引數
hook (Callable) – 要註冊的使用者定義鉤子。
prepend (bool) – 如果為 True,提供的前置
hook將在所有已註冊的 state_dict 前置鉤子之前觸發。否則,提供的前置hook將在所有已註冊的前置鉤子之後觸發。(預設值:False)
- 返回
一個控制代碼,可以透過呼叫
handle.remove()來移除新增的鉤子- 返回型別
torch.utils.hooks.RemoveableHandle
- register_step_post_hook(hook)[source]¶
註冊一個最佳化器步進後置鉤子,該鉤子將在最佳化器步進後被呼叫。
其簽名應如下所示
hook(optimizer, args, kwargs) -> None
引數
optimizer是正在使用的最佳化器例項。- 引數
hook (Callable) – 要註冊的使用者定義鉤子。
- 返回
一個控制代碼,可以透過呼叫
handle.remove()來移除新增的鉤子- 返回型別
torch.utils.hooks.RemovableHandle
- register_step_pre_hook(hook)[source]¶
註冊一個最佳化器步進前置鉤子,該鉤子將在最佳化器步進前被呼叫。
其簽名應如下所示
hook(optimizer, args, kwargs) -> None or modified args and kwargs
引數
optimizer是正在使用的最佳化器例項。如果 args 和 kwargs 被前置鉤子修改,則轉換後的值將作為包含 new_args 和 new_kwargs 的元組返回。- 引數
hook (Callable) – 要註冊的使用者定義鉤子。
- 返回
一個控制代碼,可以透過呼叫
handle.remove()來移除新增的鉤子- 返回型別
torch.utils.hooks.RemovableHandle
- state_dict()[source]¶
以
dict形式返回最佳化器狀態。它包含兩個條目
state: 一個 Dict,包含當前的最佳化狀態。其內容在不同的最佳化器類之間有所不同,但具有一些共同特徵。例如,狀態按引數儲存,而引數本身不儲存。
state是一個字典,將引數 ID 對映到包含每個引數對應狀態的 Dict。
param_groups: 一個 List,包含所有引數組,其中每個引數組都是一個 Dict。每個引數組包含最佳化器特定的元資料,例如學習率和權重衰減,以及組中引數的引數 ID 列表。如果引數組使用
named_parameters()初始化,則名稱內容也會儲存在狀態字典中。
注意:引數 ID 可能看起來像索引,但它們只是將狀態與引數組關聯的 ID。從 state_dict 載入時,最佳化器將壓縮引數組的
params(int ID)和最佳化器的param_groups(實際的nn.Parameter),以便在沒有額外驗證的情況下匹配狀態。返回的狀態字典可能看起來像這樣
{ 'state': { 0: {'momentum_buffer': tensor(...), ...}, 1: {'momentum_buffer': tensor(...), ...}, 2: {'momentum_buffer': tensor(...), ...}, 3: {'momentum_buffer': tensor(...), ...} }, 'param_groups': [ { 'lr': 0.01, 'weight_decay': 0, ... 'params': [0] 'param_names' ['param0'] (optional) }, { 'lr': 0.001, 'weight_decay': 0.5, ... 'params': [1, 2, 3] 'param_names': ['param1', 'layer.weight', 'layer.bias'] (optional) } ] }
- zero_grad(set_to_none=True)[source]¶
重置所有最佳化過的
torch.Tensor的梯度。- 引數
set_to_none (bool) – 與其設定為零,不如將梯度設定為 None。這通常會降低記憶體佔用,並可適度提升效能。但是,它會改變某些行為。例如:1. 當用戶嘗試訪問梯度並對其執行手動操作時,None 屬性或一個充滿 0 的 Tensor 會表現不同。2. 如果使用者呼叫
zero_grad(set_to_none=True)後緊跟著執行反向傳播,則對於未接收到梯度的引數,它們的.grad保證為 None。3. 如果梯度為 0 或 None,torch.optim最佳化器的行為會有所不同(一種情況下它會使用梯度 0 執行步進,另一種情況下它會完全跳過該步)。