机器学习中Optimizer是什么,优化过程中改变了什么,learning rate是什么?

理解Optimizer在监督学习中的角色
本文探讨了监督学习中Optimizer的重要作用,解释了如何通过调整参数以最小化损失函数,详细介绍了GradientDescentOptimizer和AdamOptimizer等常用优化器的工作原理,并通过一个简单示例展示了学习率对收敛速度的影响。

在线性回归或者监督学习中,我们会计算预测值与真实值之间的差距,也就是loss

在计算得出loss之后,通常会使用Optimizer对所构造的数学模型/网络模型进行参数优化,

通常情况下,优化的最终目的是使得loss趋向于最小。


首先,要了解的是,Optimizer是基类,在实际使用过程中,使用的是它的复写类,有:

  • GradientDescentOptimizer 
  • AdagradOptimizer 
  • AdagradDAOptimizer 
  • MomentumOptimizer 
  • AdamOptimizer 
  • FtrlOptimizer 
  • RMSPropOptimizer

其中GradientDescentOptimizer和AdamOptimizer是最常使用的两个Optimizer。


以下将举一个非常简单的例子,来说明Optimizer的使用方法和其作用过程。

import tensorflow as tf

train_X = 1.0
train_Y = 2.0

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
k = tf.Variable(0.0)
loss = tf.abs(k * X - Y)
train_op = tf.train.GradientDescentOptimizer(learning_rate=0.25).minimize(loss)
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    for epoch in range(10):
        _, _k, _loss = sess.run([train_op, k, loss], feed_dict={X: train_X, Y: train_Y})
        print("Epoch: %d | k = %f | loss = %f" % (epoch+1, _k, _loss))

现在已知X = 1,Y = 2,目的是找出一个参数k,来构建模型Y = kX

程序的基本思想是:

  1. 定义loss = |kX - Y|
  2. 通过Optimizer对参数k进行优化,不断改变参数k的值,最终使得loss趋向最小。
Epoch: 1 | k = 0.000000 | loss = 2.000000
Epoch: 2 | k = 0.250000 | loss = 1.750000
Epoch: 3 | k = 0.500000 | loss = 1.500000
Epoch: 4 | k = 0.750000 | loss = 1.250000
Epoch: 5 | k = 1.000000 | loss = 1.000000
Epoch: 6 | k = 1.250000 | loss = 0.750000
Epoch: 7 | k = 1.500000 | loss = 0.500000
Epoch: 8 | k = 1.750000 | loss = 0.250000
Epoch: 9 | k = 2.000000 | loss = 0.000000
Epoch: 10 | k = 2.000000 | loss = 0.000000

 由此我们可以联想:在一个较复杂的神经网络模型(比如CNN)中,optimizer优化过程中,改变了什么呢?

改变的是网络各层的参数(一般有权重w和偏置b)。


 

在Optimizer中,我们常会定义一个参数learning_rate, 学习率。

learning_rate可以理解为学习步长,在上面可以看出learning_rate=0.25,所以参数k的变化值每一个epoch也是0.25。

(特别的可以看出loss的变化值也是0.25,但这与loss定义有关,与learning_rate无关)

learning_rate的选择也是需要考虑的一件事,

1. learning_rate选择过小会导致收敛过程变长。

eg. 对于上例,learning_rate=0.2时,将会比learning_rate=0.25时多进行两个epoch才能达到loss最小。

2. learning_rate选择过大或者选择不当可能会导致参数无法准确收敛到loss最小的点。

eg. 对于上例,learning_rate=0.3时,将无法收敛到loss最小的点:

Epoch: 1 | k = 0.000000 | loss = 2.000000
Epoch: 2 | k = 0.300000 | loss = 1.700000
Epoch: 3 | k = 0.600000 | loss = 1.400000
Epoch: 4 | k = 0.900000 | loss = 1.100000
Epoch: 5 | k = 1.200000 | loss = 0.800000
Epoch: 6 | k = 1.500000 | loss = 0.500000
Epoch: 7 | k = 1.800000 | loss = 0.200000
Epoch: 8 | k = 2.100000 | loss = 0.100000
Epoch: 9 | k = 1.800000 | loss = 0.200000
Epoch: 10 | k = 2.100000 | loss = 0.100000

 

### 常见的包含 `optim` 的优化模型库 在机器学习和深度学习领域,多个 Python 库实现了名为 `optim` 或类似的模块来支持各种优化算法。以下是几个常见的库及其功能描述: #### PyTorch PyTorch 是一种广泛使用的深度学习框架,其中包含了专门用于优化器的子模块 `torch.optim`。该模块提供了多种经典的优化方法,例如 SGD(随机梯度下降)、Adam、RMSProp 等。通过这些优化器,用户可以轻松配置训练过程中的参数更新策略。 ```python import torch.optim as optim # 创建一个简单的线性层作为示例模型 model = torch.nn.Linear(10, 1) # 使用 Adam 优化器实例化 optimizer 对象 optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 上述代码展示了如何利用 PyTorch 中的 `optim` 子模块定义优化器[^1]。 #### TensorFlow/Keras TensorFlow 及其高级 API Keras 同样具备强大的优化能力,并且可以通过 `tf.keras.optimizers` 访问不同的优化器实现方式。这使得构建高效神经网络变得更加便捷。 ```python from tensorflow.keras.optimizers import Optimizer # 构建基本模型结构... # 初始化 Adam 优化optimizer = tf.keras.optimizers.Adam(learning_rate=0.001) ``` 这里说明了 TensorFlow 提供了一个统一接口去管理各类优化方案[^2]。 #### Scipy Optimize Module 虽然严格意义上不属于典型的 ML/DL 工具范畴,但是 SciPy 的 optimize 模块也能够解决某些特定类型的最优化问题。对于传统数值计算或者小型项目来说可能非常有用。 ```python from scipy.optimize import minimize def func(x): return (x[0]-1)**2 + (x[1]-2.5)**2 res = minimize(func,[0,0],method='nelder-mead',options={'xtol':1e-8,'disp':True}) print(res.x) ``` 此片段体现了当面对非标准形式的目标函数时,SciPy 所扮演的重要角色[^3]。 综上所述,在众多选项里如果目标集中于现代 DL 技术,则推荐优先考虑 **PyTorch** 和 **TensorFlow(Keras)** 这两个平台;而对于通用数学规划任务而言,不妨尝试一下来自科学计算领域的解决方案比如 **SciPy**.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值