# tf.compat.v1.train.ProximalGradientDescentOptimizer

<br />

|---|
| [![](https://www.tensorflow.org/images/GitHub-Mark-32px.png) View source on GitHub](https://github.com/tensorflow/tensorflow/blob/v2.13.1/tensorflow/python/training/proximal_gradient_descent.py#L26-L104) |

Optimizer that implements the proximal gradient descent algorithm.

Inherits From: [`Optimizer`](https://www.tensorflow.org/versions/r2.13/api_docs/python/tf/compat/v1/train/Optimizer)

    tf.compat.v1.train.ProximalGradientDescentOptimizer(
        learning_rate,
        l1_regularization_strength=0.0,
        l2_regularization_strength=0.0,
        use_locking=False,
        name='ProximalGradientDescent'
    )

<br />

<br />

<br />

| ## References ||
|---|---|
| Efficient Learning using Forward-Backward Splitting: [Duchi et al., 2009](http://papers.nips.cc/paper/3793-efficient-learning-using-forward-backward-splitting) ([pdf](http://papers.nips.cc/paper/3793-efficient-learning-using-forward-backward-splitting.pdf)) ||

<br />

<br />

<br />

<br />

| ## Args ||
|---|---|
| `learning_rate` | A Tensor or a floating point value. The learning rate to use. |
| `l1_regularization_strength` | A float value, must be greater than or equal to zero. |
| `l2_regularization_strength` | A float value, must be greater than or equal to zero. |
| `use_locking` | If True use locks for update operations. |
| `name` | Optional name prefix for the operations created when applying gradients. Defaults to "GradientDescent". |

<br />

## Methods

### `apply_gradients`

[View source](https://github.com/tensorflow/tensorflow/blob/v2.13.1/tensorflow/python/training/optimizer.py#L621-L748)

    apply_gradients(
        grads_and_vars,
        global_step=None,
        name=None,
        skip_gradients_aggregation=False
    )

Apply gradients to variables.

This is the second part of `minimize()`. It returns an `Operation` that
applies gradients.

@compatibility(TF2)

#### How to Map Arguments

| TF1 Arg Name | TF2 Arg Name | Note |
|---|---|---|
| `grads_and_vars` | `grads_and_vars` | - |
| `global_step` | Not supported. | Use `optimizer.iterations` |
| `name` | `name.` | - |

<br />

<br />

<br />

| Args ||
|---|---|
| `grads_and_vars` | List of (gradient, variable) pairs as returned by `compute_gradients()`. |
| `global_step` | Optional `Variable` to increment by one after the variables have been updated. |
| `name` | Optional name for the returned operation. Default to the name passed to the `Optimizer` constructor. |
| `skip_gradients_aggregation` | If true, gradients aggregation will not be performed inside optimizer. Usually this arg is set to True when you write custom code aggregating gradients outside the optimizer. |

<br />

<br />

<br />

<br />

| Returns ||
|---|---|
| An `Operation` that applies the specified gradients. If `global_step` was not None, that operation also increments `global_step`. ||

<br />

<br />

<br />

<br />

| Raises ||
|---|---|
| `TypeError` | If `grads_and_vars` is malformed. |
| `ValueError` | If none of the variables have gradients. |
| `RuntimeError` | If you should use `_distributed_apply()` instead. |

<br />

### `compute_gradients`

[View source](https://github.com/tensorflow/tensorflow/blob/v2.13.1/tensorflow/python/training/optimizer.py#L488-L609)

    compute_gradients(
        loss,
        var_list=None,
        gate_gradients=GATE_OP,
        aggregation_method=None,
        colocate_gradients_with_ops=False,
        grad_loss=None
    )

Compute gradients of `loss` for the variables in `var_list`.

<br />

#### Migrate to TF2

<br />

> [!CAUTION]
> **Caution:** This API was designed for TensorFlow v1. Continue reading for details on how to migrate from this API to a native TensorFlow v2 equivalent. See the [TensorFlow v1 to TensorFlow v2 migration guide](https://www.tensorflow.org/guide/migrate) for instructions on how to migrate the rest of your code.

[`tf.keras.optimizers.Optimizer`](https://www.tensorflow.org/versions/r2.13/api_docs/python/tf/keras/optimizers/Optimizer) in TF2 does not provide a
`compute_gradients` method, and you should use a [`tf.GradientTape`](https://www.tensorflow.org/versions/r2.13/api_docs/python/tf/GradientTape) to
obtain the gradients:

    @tf.function
    def train step(inputs):
      batch_data, labels = inputs
      with tf.GradientTape() as tape:
        predictions = model(batch_data, training=True)
        loss = tf.keras.losses.CategoricalCrossentropy(
            reduction=tf.keras.losses.Reduction.NONE)(labels, predictions)
      gradients = tape.gradient(loss, model.trainable_variables)
      optimizer.apply_gradients(zip(gradients, model.trainable_variables))

Args:
loss: A Tensor containing the value to minimize or a callable taking
no arguments which returns the value to minimize. When eager execution
is enabled it must be a callable.
var_list: Optional list or tuple of [`tf.Variable`](https://www.tensorflow.org/versions/r2.13/api_docs/python/tf/Variable) to update to minimize
`loss`. Defaults to the list of variables collected in the graph
under the key `GraphKeys.TRAINABLE_VARIABLES`.
gate_gradients: How to gate the computation of gradients. Can be
`GATE_NONE`, `GATE_OP`, or `GATE_GRAPH`.
aggregation_method: Specifies the method used to combine gradient terms.
Valid values are defined in the class `AggregationMethod`.
colocate_gradients_with_ops: If True, try colocating gradients with
the corresponding op.
grad_loss: Optional. A `Tensor` holding the gradient computed for `loss`.

Returns:
A list of (gradient, variable) pairs. Variable is always present, but
gradient can be `None`.

Raises:
TypeError: If `var_list` contains anything else than `Variable` objects.
ValueError: If some arguments are invalid.
RuntimeError: If called with eager execution enabled and `loss` is
not callable.

@compatibility(eager)
When eager execution is enabled, `gate_gradients`, `aggregation_method`,
and `colocate_gradients_with_ops` are ignored.

<br />

<br />

#### Description

This is the first part of `minimize()`. It returns a list
of (gradient, variable) pairs where "gradient" is the gradient
for "variable". Note that "gradient" can be a `Tensor`, an
`IndexedSlices`, or `None` if there is no gradient for the
given variable.

### `get_name`

[View source](https://github.com/tensorflow/tensorflow/blob/v2.13.1/tensorflow/python/training/optimizer.py#L425-L426)

    get_name()

### `get_slot`

[View source](https://github.com/tensorflow/tensorflow/blob/v2.13.1/tensorflow/python/training/optimizer.py#L845-L871)

    get_slot(
        var, name
    )

Return a slot named `name` created for `var` by the Optimizer.

Some `Optimizer` subclasses use additional variables. For example
`Momentum` and `Adagrad` use variables to accumulate updates. This method
gives access to these `Variable` objects if for some reason you need them.

Use `get_slot_names()` to get the list of slot names created by the
`Optimizer`.

<br />

<br />

<br />

| Args ||
|---|---|
| `var` | A variable passed to `minimize()` or `apply_gradients()`. |
| `name` | A string. |

<br />

<br />

<br />

<br />

| Returns ||
|---|---|
| The `Variable` for the slot if it was created, `None` otherwise. ||

<br />

### `get_slot_names`

[View source](https://github.com/tensorflow/tensorflow/blob/v2.13.1/tensorflow/python/training/optimizer.py#L873-L881)

    get_slot_names()

Return a list of the names of slots created by the `Optimizer`.

See `get_slot()`.

<br />

<br />

<br />

| Returns ||
|---|---|
| A list of strings. ||

<br />

### `minimize`

[View source](https://github.com/tensorflow/tensorflow/blob/v2.13.1/tensorflow/python/training/optimizer.py#L428-L486)

    minimize(
        loss,
        global_step=None,
        var_list=None,
        gate_gradients=GATE_OP,
        aggregation_method=None,
        colocate_gradients_with_ops=False,
        name=None,
        grad_loss=None
    )

Add operations to minimize `loss` by updating `var_list`.

This method simply combines calls `compute_gradients()` and
`apply_gradients()`. If you want to process the gradient before applying
them call `compute_gradients()` and `apply_gradients()` explicitly instead
of using this function.

<br />

<br />

<br />

| Args ||
|---|---|
| `loss` | A `Tensor` containing the value to minimize. |
| `global_step` | Optional `Variable` to increment by one after the variables have been updated. |
| `var_list` | Optional list or tuple of `Variable` objects to update to minimize `loss`. Defaults to the list of variables collected in the graph under the key `GraphKeys.TRAINABLE_VARIABLES`. |
| `gate_gradients` | How to gate the computation of gradients. Can be `GATE_NONE`, `GATE_OP`, or `GATE_GRAPH`. |
| `aggregation_method` | Specifies the method used to combine gradient terms. Valid values are defined in the class `AggregationMethod`. |
| `colocate_gradients_with_ops` | If True, try colocating gradients with the corresponding op. |
| `name` | Optional name for the returned operation. |
| `grad_loss` | Optional. A `Tensor` holding the gradient computed for `loss`. |

<br />

<br />

<br />

<br />

| Returns ||
|---|---|
| An Operation that updates the variables in `var_list`. If `global_step` was not `None`, that operation also increments `global_step`. ||

<br />

<br />

<br />

<br />

| Raises ||
|---|---|
| `ValueError` | If some of the variables are not `Variable` objects. |

<br />

<br />

#### eager compatibility

<br />

When eager execution is enabled, `loss` should be a Python function that
takes no arguments and computes the value to be minimized. Minimization (and
gradient computation) is done with respect to the elements of `var_list` if
not None, else with respect to any trainable variables created during the
execution of the `loss` function. `gate_gradients`, `aggregation_method`,
`colocate_gradients_with_ops` and `grad_loss` are ignored when eager
execution is enabled.

<br />

<br />

### `variables`

[View source](https://github.com/tensorflow/tensorflow/blob/v2.13.1/tensorflow/python/training/optimizer.py#L883-L909)

    variables()

A list of variables which encode the current state of `Optimizer`.

Includes slot variables and additional global variables created by the
optimizer in the current default graph.

<br />

<br />

<br />

| Returns ||
|---|---|
| A list of variables. ||

<br />

<br />

<br />

<br />

| ## Class Variables ||
|---|---|
| GATE_GRAPH | `2` |
| GATE_NONE | `0` |
| GATE_OP | `1` |

<br />