| 260 | |
| 261 | |
| 262 | class RMSProp(OptimizerBase): |
| 263 | def __init__( |
| 264 | self, lr=0.001, decay=0.9, eps=1e-7, clip_norm=None, lr_scheduler=None, **kwargs |
| 265 | ): |
| 266 | """ |
| 267 | RMSProp optimizer. |
| 268 | |
| 269 | Notes |
| 270 | ----- |
| 271 | RMSProp was proposed as a refinement of :class:`AdaGrad` to reduce its |
| 272 | aggressive, monotonically decreasing learning rate. |
| 273 | |
| 274 | RMSProp uses a *decaying average* of the previous squared gradients |
| 275 | (second moment) rather than just the immediately preceding squared |
| 276 | gradient for its `previous_update` value. |
| 277 | |
| 278 | Equations:: |
| 279 | |
| 280 | cache[t] = decay * cache[t-1] + (1 - decay) * grad[t] ** 2 |
| 281 | update[t] = lr * grad[t] / (np.sqrt(cache[t]) + eps) |
| 282 | param[t+1] = param[t] - update[t] |
| 283 | |
| 284 | Note that the ``**`` and ``/`` operations are elementwise. |
| 285 | |
| 286 | Parameters |
| 287 | ---------- |
| 288 | lr : float |
| 289 | Learning rate for update. Default is 0.001. |
| 290 | decay : float in [0, 1] |
| 291 | Rate of decay for the moving average. Typical values are [0.9, |
| 292 | 0.99, 0.999]. Default is 0.9. |
| 293 | eps : float |
| 294 | Constant term to avoid divide-by-zero errors during the update calc. Default is 1e-7. |
| 295 | clip_norm : float or None |
| 296 | If not None, all param gradients are scaled to have maximum l2 norm of |
| 297 | `clip_norm` before computing update. Default is None. |
| 298 | lr_scheduler : str or :doc:`Scheduler <numpy_ml.neural_nets.schedulers>` object or None |
| 299 | The learning rate scheduler. If None, use a constant learning |
| 300 | rate equal to `lr`. Default is None. |
| 301 | """ |
| 302 | super().__init__(lr, lr_scheduler) |
| 303 | |
| 304 | self.cache = {} |
| 305 | self.hyperparameters = { |
| 306 | "id": "RMSProp", |
| 307 | "lr": lr, |
| 308 | "eps": eps, |
| 309 | "decay": decay, |
| 310 | "clip_norm": clip_norm, |
| 311 | "lr_scheduler": str(self.lr_scheduler), |
| 312 | } |
| 313 | |
| 314 | def __str__(self): |
| 315 | H = self.hyperparameters |
| 316 | sc = H["lr_scheduler"] |
| 317 | lr, eps, dc, cn = H["lr"], H["eps"], H["decay"], H["clip_norm"] |
| 318 | return "RMSProp(lr={}, eps={}, decay={}, clip_norm={}, lr_scheduler={})".format( |
| 319 | lr, eps, dc, cn, sc |
no outgoing calls
no test coverage detected