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) – 學習率 (預設:1)
max_iter (int) – 每次最佳化步驟的最大迭代次數 (預設:20)
max_eval (int) – 每次最佳化步驟的最大函數評估次數 (預設:max_iter * 1.25)。
tolerance_grad (float) – 一階最佳化的終止容忍度 (預設:1e-7)。
tolerance_change (float) – 函數值/參數變更的終止容忍度 (預設:1e-9)。
history_size (int) – 更新歷史記錄大小 (預設:100)。
line_search_fn (str) – ‘strong_wolfe’ 或 None (預設:None)。
- add_param_group(param_group)[source]¶
將參數群組新增至
Optimizer
的 param_groups。當對預先訓練的網路進行微調時,這非常有用,因為可以將凍結的層設為可訓練,並在訓練過程中新增至
Optimizer
。- 參數
param_group (dict) – 指定應最佳化的張量以及群組特定的最佳化選項。
- 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
將保持不變。
- 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
呼叫此 hook。註冊的 hook 可用於在load_state_dict
載入state_dict
之後執行後處理。- 參數
hook (Callable) – 要註冊的使用者定義 hook。
prepend (bool) – 如果為 True,則提供的 post
hook
將在load_state_dict
上所有已註冊的 post-hook 之前觸發。否則,提供的hook
將在所有已註冊的 post-hook 之後觸發。(預設值:False)
- 回傳
一個 handle,可用於透過呼叫
handle.remove()
來移除新增的 hook。- 回傳類型
torch.utils.hooks.RemoveableHandle
- register_load_state_dict_pre_hook(hook, prepend=False)[source]¶
註冊一個 load_state_dict pre-hook,它會在呼叫
load_state_dict()
之前被呼叫。它應該具有以下簽章:hook(optimizer, state_dict) -> state_dict or None
optimizer
參數是正在使用的優化器實例,而state_dict
參數是使用者傳遞給load_state_dict
的state_dict
的淺拷貝。Hook 可以就地修改 state_dict,或者選擇性地回傳一個新的 state_dict。如果回傳 state_dict,它將被用於載入到優化器中。在
self
上呼叫load_state_dict
之前,將會使用參數self
和state_dict
呼叫此 hook。註冊的 hook 可用於在呼叫load_state_dict
之前執行預處理。- 參數
hook (Callable) – 要註冊的使用者定義 hook。
prepend (bool) – 如果為 True,則提供的 pre
hook
將在load_state_dict
上所有已註冊的 pre-hook 之前觸發。否則,提供的hook
將在所有已註冊的 pre-hook 之後觸發。(預設值:False)
- 回傳
一個 handle,可用於透過呼叫
handle.remove()
來移除新增的 hook。- 回傳類型
torch.utils.hooks.RemoveableHandle
- register_state_dict_post_hook(hook, prepend=False)[source]¶
註冊一個 state dict post-hook,它會在呼叫
state_dict()
之後被呼叫。它應該具有以下簽章:
hook(optimizer, state_dict) -> state_dict or None
在
self
上產生state_dict
之後,將會使用參數self
和state_dict
呼叫此 hook。Hook 可以就地修改 state_dict,或者選擇性地回傳一個新的 state_dict。註冊的 hook 可用於在回傳state_dict
之前對其執行後處理。- 參數
hook (Callable) – 要註冊的使用者定義 hook。
prepend (bool) – 如果為 True,則提供的 post
hook
將在state_dict
上所有已註冊的 post-hook 之前觸發。否則,提供的hook
將在所有已註冊的 post-hook 之後觸發。(預設值:False)
- 回傳
一個 handle,可用於透過呼叫
handle.remove()
來移除新增的 hook。- 回傳類型
torch.utils.hooks.RemoveableHandle
- register_state_dict_pre_hook(hook, prepend=False)[source]¶
註冊一個 state dict pre-hook,它會在呼叫
state_dict()
之前被呼叫。它應該具有以下簽章:
hook(optimizer) -> None
optimizer
參數是正在使用的優化器實例。在self
上呼叫state_dict
之前,將會使用參數self
呼叫此 hook。註冊的 hook 可用於在呼叫state_dict
之前執行預處理。- 參數
hook (Callable) – 要註冊的使用者定義 hook。
prepend (bool) – 如果為 True,則提供的 pre
hook
將在state_dict
上所有已註冊的 pre-hook 之前觸發。否則,提供的hook
將在所有已註冊的 pre-hook 之後觸發。(預設值:False)
- 回傳
一個 handle,可用於透過呼叫
handle.remove()
來移除新增的 hook。- 回傳類型
torch.utils.hooks.RemoveableHandle
- register_step_post_hook(hook)[source]¶
註冊一個優化器 step post hook,它會在優化器 step 之後被呼叫。
它應該具有以下簽章:
hook(optimizer, args, kwargs) -> None
optimizer
參數是正在使用的最佳化器實例。- 參數
hook (Callable) – 要註冊的使用者定義 hook。
- 回傳
一個 handle,可用於透過呼叫
handle.remove()
來移除新增的 hook。- 回傳類型
torch.utils.hooks.RemovableHandle
- register_step_pre_hook(hook)[source]¶
註冊一個優化器 step pre hook,它會在優化器 step 之前被呼叫。
它應該具有以下簽章:
hook(optimizer, args, kwargs) -> None or modified args and kwargs
optimizer
參數是被使用的優化器實例。如果 args 和 kwargs 被 pre-hook 修改,則轉換後的值會以包含 new_args 和 new_kwargs 的元組形式返回。- 參數
hook (Callable) – 要註冊的使用者定義 hook。
- 回傳
一個 handle,可用於透過呼叫
handle.remove()
來移除新增的 hook。- 回傳類型
torch.utils.hooks.RemovableHandle
- state_dict()[原始碼]¶
將優化器的狀態作為
dict
返回。它包含兩個條目
state
:一個包含當前優化狀態的字典。其內容因優化器類別而異,但一些常見的特徵適用。例如,狀態是按參數儲存的,並且參數本身不會被儲存。
state
是一個將參數 ID 映射到字典的字典,該字典包含與每個參數相對應的狀態。
param_groups
:一個包含所有參數組的列表,其中每個參數組是一個字典。每個參數組都包含特定於優化器的元數據,例如學習率和權重衰減,以及組中參數的參數 ID 列表。如果參數組使用
named_parameters()
初始化,則名稱內容也將儲存在 state dict 中。
注意:參數 ID 可能看起來像索引,但它們只是將狀態與 param_group 關聯的 ID。從 state_dict 加載時,優化器會將 param_group 的
params
(int IDs) 和優化器的param_groups
(實際的nn.Parameter
s) 壓縮在一起,以便在沒有額外驗證的情況下匹配狀態。返回的 state dict 可能看起來像這樣
{ '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)[原始碼]¶
重置所有優化過的
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 執行該步驟,而在另一種情況下,它完全跳過該步驟)。