梯度下降3tips

本文介绍了优化算法中的自适应学习率策略Adagrad,解释了如何根据参数梯度调整学习率以平衡更新速度。同时,讨论了随机梯度下降(SGD)在训练效率上的优势。此外,提到了特征缩放在加速收敛过程中的作用。

 

1、adaptive learing rate

最简单的原则:学习率会随着迭代次数的增多而减小;因为在开始的时候,我们离目的地太远,所以需要使用比较大的学习率,经过好几次的参数更新之后,离目标已经很近了

比如常见的例子经过t次之后,\eta ^{^{t}}=\eta /\sqrt{1+t}

另外不同的参数需要不同的学习率

 

Adagrad:每一个参数的学习率都除上之前迭代次数中所计算的该参数的导数的均方根,所以每个参数的学习率都不一样

w^{t+1}=w^{t}-\frac{\eta ^{^{t}}}{\delta ^{^{t}}}g^{t}(1)

\eta ^{^{t}}=\eta /\sqrt{1+t}  (2)

\delta ^{^{t}}=\sqrt{\frac{1}{t+1}\sum (g_{i})^{^{2}}}  (3)i从0开始,所以是t+1

经过上(1-2-3-)式

w^{t+1}=w^{t}-\frac{\eta }{\sqrt{\sum (g^{i})^{2}}} g^{t} (4)

上面(4)有个矛盾的地方,g^{t}越大,代表其梯度越大,参数更新越快,但是前面的系数的分母也含参数,表明,梯度越大,参数更新越慢。这是为了造成反差的效果,以防前几次梯度太大,而这次梯度太小,或者相反,造成一个具有反差的例子。

对于单参数来说,梯度和Loss是可能成正比的,梯度越大,可能Loss越大,比如二次函数型的Loss。但是对跨参数来说,是不成立的,需要引入二次微分,即使用一次微分除以偶尔此微分,可以比较当前不同参数离最低损失的参数的距离,

而Adagrad中,\sqrt{\sum (g^{i})^{2}}中可以放映二次微分的大小(并不是对其求近似),而且在不增加额外计算的情况下

 

2、Stochastic Gradient Descent(随机梯度下降)

每次只计算一个sample的梯度,并更新,虽然不稳定,但是很快

 

3、Feature Scaling 

能够加快收敛速度,一个方法:对所有的sample,求每一个特征的均值及标准差,然后标准化

 

梯度下降,就相当于以当前参数为圆心,以补偿为半径,画一个圆/球,找到圆/球上的Loss最小,而梯度下降,是根据求梯度的反方向作为Loss的最低。

Tarlor级数:h(x)在x=x0可微分,h(x)=h(x0)+h'(x0)(x-x0)

h(x,y)=h(x0,y0)+ah(x0,y0)*(x-x0)/ax+ah(x0,y0)*(y-y0)/ay  

<< 下面是基于您提供的伪代码编写的 Python 实现,利用 NumPy 库完成逻辑回归的梯度下降优化过程。此程序能够从训练数据中估计模型参数 \(w\) 并记录损失值的变化情况。 --- ### **完整实现** ```python import numpy as np def sigmoid(z): """Sigmoid 函数""" return 1 / (1 + np.exp(-z)) def logistic_regression_gradient_descent(X, y, learning_rate=0.01, max_epochs=1000, tolerance=1e-6): """ 使用梯度下降法进行逻辑回归参数估计 参数: X: 特征矩阵 (m x n),形状为 [样本数量, 特征维度] y: 标签向量 (m,),形状为 [样本数量, ] learning_rate: 学习率,默认为 0.01 max_epochs: 最大迭代次数,默认为 1000 tolerance: 收敛条件阈值,默认为 1e-6 返回: w: 最优权重向量 (n+1,) loss_history: 损失值变化历史记录 """ m, n = X.shape # 获取样本数量和特征维度 X = np.hstack((np.ones((m, 1)), X)) # 添加偏置项 (bias term) w = np.zeros(n + 1) # 初始化参数向量 w loss_history = [] # 记录每轮的损失值 for epoch in range(max_epochs): # 循环至最大迭代次数 z = np.dot(X, w) # 预测线性组合结果 y_pred = sigmoid(z) # Sigmoid 输出预测概率 # 计算梯度 gradient = (1/m) * np.dot(X.T, (y_pred - y)) # 更新参数 w -= learning_rate * gradient # 计算当前损失 (交叉熵损失) epsilon = 1e-15 # 防止 log(0) 错误 loss = -(1/m) * np.sum(y * np.log(y_pred.clip(min=epsilon)) + (1-y) * np.log((1-y_pred).clip(min=epsilon))) loss_history.append(loss) # 判断是否收敛 if np.linalg.norm(gradient) < tolerance: print(f"提前终止于第 {epoch} 轮") break return w, loss_history # 测试案例 if __name__ == "__main__": from sklearn.datasets import make_classification from matplotlib import pyplot as plt # 构造模拟二分类数据集 X, y = make_classification(n_samples=100, n_features=2, random_state=42) y = y.astype(np.float64) # 确保标签类型正确 # 执行梯度下降 weights, losses = logistic_regression_gradient_descent(X, y, learning_rate=0.1, max_epochs=1000) # 结果展示 print("最终权重:", weights) plt.plot(range(len(losses)), losses) plt.title(&#39;Loss Curve&#39;) plt.xlabel(&#39;Epochs&#39;) plt.ylabel(&#39;Loss&#39;) plt.show() ``` --- ### **关键点解析** 1. **初始化与添加偏置项** 将输入特征矩阵 \(X\) 增加了一列全为 \(1\) 的偏置项 (\(\mathbf{1}\)),使得我们可以统一处理截距 \(b\) 和系数 \(\mathbf{w}\)。 2. **Sigmoid 函数** 它将任意实数值映射到范围 \([0, 1]\),适合作为概率输出。 3. **梯度公式推导** 对数似然函数关于参数 \(w\) 的偏导数得出了我们使用的梯度表达式: \[ \frac{\partial L}{\partial w_j} = \frac{1}{m} \sum_{i=1}^{m}(h_w(x_i)-y_i)x_{ij} \] 4. **损失计算注意事项** 我们在求解负对数似然时加入了极小正则化因子 `\epsilon` 来避免取对数运算过程中出现零的情况。 5. **停止准则** 当梯度范数小于指定容忍限度,则认为已达到最优近似位置并结束循环;否则到达设定的最大周期上限才强制退出。 --- ### **运行效果描述** 执行后会打印找到的最佳权重并且画出随着迭代次数增加对应的损耗曲线图供观察学习效率高低程度如何影响整体性能表现状态等等信息反馈机制设计合理与否至关重要!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值