# torch.optim
# torch.optim
`torch.optim`是一個實現了各種優化算法的庫。大部分常用的方法得到支持,并且接口具備足夠的通用性,使得未來能夠集成更加復雜的方法。
## 如何使用optimizer
為了使用`torch.optim`,你需要構建一個optimizer對象。這個對象能夠保持當前參數狀態并基于計算得到的梯度進行參數更新。
### 構建
為了構建一個`Optimizer`,你需要給它一個包含了需要優化的參數(必須都是`Variable`對象)的iterable。然后,你可以設置optimizer的參 數選項,比如學習率,權重衰減,等等。
例子:
```
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)
```
### 為每個參數單獨設置選項
`Optimizer`也支持為每個參數單獨設置選項。若想這么做,不要直接傳入`Variable`的iterable,而是傳入`dict`的iterable。每一個dict都分別定 義了一組參數,并且包含一個`param`鍵,這個鍵對應參數的列表。其他的鍵應該optimizer所接受的其他參數的關鍵字相匹配,并且會被用于對這組參數的 優化。
**`注意:`**
你仍然能夠傳遞選項作為關鍵字參數。在未重寫這些選項的組中,它們會被用作默認值。當你只想改動一個參數組的選項,但其他參數組的選項不變時,這是 非常有用的。
例如,當我們想指定每一層的學習率時,這是非常有用的:
```
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
```
這意味著`model.base`的參數將會使用`1e-2`的學習率,`model.classifier`的參數將會使用`1e-3`的學習率,并且`0.9`的momentum將會被用于所 有的參數。
### 進行單次優化
所有的optimizer都實現了`step()`方法,這個方法會更新所有的參數。它能按兩種方式來使用:
**`optimizer.step()`**
這是大多數optimizer所支持的簡化版本。一旦梯度被如`backward()`之類的函數計算好后,我們就可以調用這個函數。
例子
```
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
```
**`optimizer.step(closure)`**
一些優化算法例如Conjugate Gradient和LBFGS需要重復多次計算函數,因此你需要傳入一個閉包去允許它們重新計算你的模型。這個閉包應當清空梯度, 計算損失,然后返回。
例子:
```
for input, target in dataset:
def closure():
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
return loss
optimizer.step(closure)
```
## 算法
### class torch.optim.Optimizer(params, defaults) \[source\]
Base class for all optimizers.
**參數:**
- params (iterable) —— `Variable` 或者 `dict`的iterable。指定了什么參數應當被優化。
- defaults —— (dict):包含了優化選項默認值的字典(一個參數組沒有指定的參數選項將會使用默認值)。
#### load\_state\_dict(state\_dict) \[source\]
加載optimizer狀態
**參數:**
state\_dict (`dict`) —— optimizer的狀態。應當是一個調用`state_dict()`所返回的對象。
#### state\_dict() \[source\]
以`dict`返回optimizer的狀態。
它包含兩項。
- state - 一個保存了當前優化狀態的dict。optimizer的類別不同,state的內容也會不同。
- param\_groups - 一個包含了全部參數組的dict。
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
#### zero\_grad() \[source\]
清空所有被優化過的Variable的梯度.
### class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight\_decay=0)\[source\]
實現Adadelta算法。
它在[ADADELTA: An Adaptive Learning Rate Method.](https://arxiv.org/abs/1212.5701)中被提出。
**參數:**
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- rho (`float`, 可選) – 用于計算平方梯度的運行平均值的系數(默認:0.9)
- eps (`float`, 可選) – 為了增加數值計算的穩定性而加到分母里的項(默認:1e-6)
- lr (`float`, 可選) – 在delta被應用到參數更新之前對它縮放的系數(默認:1.0)
- weight\_decay (`float`, 可選) – 權重衰減(L2懲罰)(默認: 0)
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
### class torch.optim.Adagrad(params, lr=0.01, lr\_decay=0, weight\_decay=0)\[source\]
實現Adagrad算法。
它在 [Adaptive Subgradient Methods for Online Learning and Stochastic Optimization](http://jmlr.org/papers/v12/duchi11a.html)中被提出。
**參數:**
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (`float`, 可選) – 學習率(默認: 1e-2)
- lr\_decay (`float`, 可選) – 學習率衰減(默認: 0)
- weight\_decay (`float`, 可選) – 權重衰減(L2懲罰)(默認: 0)
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
### class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight\_decay=0)\[source\]
實現Adam算法。
它在[Adam: A Method for Stochastic Optimization](https://arxiv.org/abs/1412.6980)中被提出。
**參數:**
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (`float`, 可選) – 學習率(默認:1e-3)
- betas (Tuple\[`float`, `float`\], 可選) – 用于計算梯度以及梯度平方的運行平均值的系數(默認:0.9,0.999)
- eps (`float`, 可選) – 為了增加數值計算的穩定性而加到分母里的項(默認:1e-8)
- weight\_decay (`float`, 可選) – 權重衰減(L2懲罰)(默認: 0)
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
### class torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight\_decay=0)\[source\]
實現Adamax算法(Adam的一種基于無窮范數的變種)。
它在[Adam: A Method for Stochastic Optimization](https://arxiv.org/abs/1412.6980)中被提出。
**參數:**
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (`float`, 可選) – 學習率(默認:2e-3)
- betas (Tuple\[`float`, `float`\], 可選) – 用于計算梯度以及梯度平方的運行平均值的系數
- eps (`float`, 可選) – 為了增加數值計算的穩定性而加到分母里的項(默認:1e-8)
- weight\_decay (`float`, 可選) – 權重衰減(L2懲罰)(默認: 0)
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
### class torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight\_decay=0)\[source\]
實現平均隨機梯度下降算法。
它在[Acceleration of stochastic approximation by averaging](http://dl.acm.org/citation.cfm?id=131098)中被提出。
**參數:**
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (`float`, 可選) – 學習率(默認:1e-2)
- lambd (`float`, 可選) – 衰減項(默認:1e-4)
- alpha (`float`, 可選) – eta更新的指數(默認:0.75)
- t0 (`float`, 可選) – 指明在哪一次開始平均化(默認:1e6)
- weight\_decay (`float`, 可選) – 權重衰減(L2懲罰)(默認: 0)
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
### class torch.optim.LBFGS(params, lr=1, max\_iter=20, max\_eval=None, tolerance\_grad=1e-05, tolerance\_change=1e-09, history\_size=100, line\_search\_fn=None)\[source\]
實現L-BFGS算法。
#### 警告
這個optimizer不支持為每個參數單獨設置選項以及不支持參數組(只能有一個)
#### 警告
目前所有的參數不得不都在同一設備上。在將來這會得到改進。
#### 注意
這是一個內存高度密集的optimizer(它要求額外的`param_bytes * (history_size + 1)` 個字節)。如果它不適應內存,嘗試減小history size,或者使用不同的算法。
**參數:**
- lr (`float`) – 學習率(默認:1)
- max\_iter (`int`) – 每一步優化的最大迭代次數(默認:20))
- max\_eval (`int`) – 每一步優化的最大函數評價次數(默認:max \* 1.25)
- tolerance\_grad (`float`) – 一階最優的終止容忍度(默認:1e-5)
- tolerance\_change (`float`) – 在函數值/參數變化量上的終止容忍度(默認:1e-9)
- history\_size (`int`) – 更新歷史的大小(默認:100)
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
### class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight\_decay=0, momentum=0, centered=False)\[source\]
實現RMSprop算法。
由G. H`int`on在他的[課程](http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf)中提出.
中心版本首次出現在[Generating Sequences With Recurrent Neural Networks](https://arxiv.org/pdf/1308.0850v5.pdf).
**參數:**
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (`float`, 可選) – 學習率(默認:1e-2)
- momentum (`float`, 可選) – 動量因子(默認:0)
- alpha (`float`, 可選) – 平滑常數(默認:0.99)
- eps (`float`, 可選) – 為了增加數值計算的穩定性而加到分母里的項(默認:1e-8)
- centered (`bool`, 可選) – 如果為True,計算中心化的RMSProp,并且用它的方差預測值對梯度進行歸一化
- weight\_decay (`float`, 可選) – 權重衰減(L2懲罰)(默認: 0)
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
### class torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step\_sizes=(1e-06, 50))\[source\]
實現彈性反向傳播算法。
**參數:**
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (`float`, 可選) – 學習率(默認:1e-2)
- etas (Tuple\[`float`, `float`\], 可選) – 一對(etaminus,etaplis), 它們分別是乘法的增加和減小的因子(默認:0.5,1.2)
- step\_sizes (Tuple\[`float`, `float`\], 可選) – 允許的一對最小和最大的步長(默認:1e-6,50)
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
### class torch.optim.SGD(params, lr=
實現隨機梯度下降算法(momentum可選)。
Nesterov動量基于[On the importance of initialization and momentum in deep learning](http://www.cs.toronto.edu/~h%60int%60on/absps/momentum.pdf)中的公式.
**參數:**
- params (iterable) – 待優化參數的iterable或者是定義了參數組的dict
- lr (`float`) – 學習率
- momentum (`float`, 可選) – 動量因子(默認:0)
- weight\_decay (`float`, 可選) – 權重衰減(L2懲罰)(默認:0)
- dampening (`float`, 可選) – 動量的抑制因子(默認:0)
- nesterov (`bool`, 可選) – 使用Nesterov動量(默認:False)
**例子:**
```
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()
```
#### Note
帶有動量/Nesterov的SGD的實現稍微不同于Sutskever等人以及其他框架中的實現。
考慮動量的具體情況,更新可以寫成
v=ρ?v+g
p=p?lr?v
其中,p、g、v和ρ分別是參數、梯度、速度和動量。
這跟Sutskever等人以及其他框架的實現是相反的,它們采用這樣的更新
v=ρ?v+lr?g
p=p?v
Nesterov的版本也類似地被修改了。
#### step(closure) \[source\]
進行單次優化 (參數更新).
**參數:**
- closure (`callable`) – 一個重新評價模型并返回loss的閉包,對于大多數參數來說是可選的。
- PyTorch 中文文檔
- 主頁
- 自動求導機制
- CUDA語義
- 擴展PyTorch
- 多進程最佳實踐
- 序列化語義
- torch
- torch.Tensor
- torch.Storage
- torch.nn
- torch.nn.functional
- torch.autograd
- torch.optim
- torch.nn.init
- torch.multiprocessing
- torch.legacy
- torch.cuda
- torch.utils.ffi
- torch.utils.data
- torch.utils.model_zoo
- torchvision
- torchvision.datasets
- torchvision.models
- torchvision.transforms
- torchvision.utils
- 致謝