【进阶】梯度下降与优化算法概述
发布时间: 2024-06-26 20:20:12 阅读量: 63 订阅数: 111
![python深度学习合集](https://img-blog.csdnimg.cn/813f75f8ea684745a251cdea0a03ca8f.png)
# 1. 梯度下降算法概述**
梯度下降算法是一种迭代优化算法,用于最小化目标函数。其基本原理是沿着目标函数梯度的负方向迭代更新参数,使得目标函数值逐渐减小。梯度下降算法在机器学习、深度学习等领域有着广泛的应用,是优化问题的核心算法之一。
# 2.1 梯度和方向导数
**梯度**
对于一个多元函数 \(f(x_1, x_2, ..., x_n)\),其梯度是一个向量,表示函数在该点各方向上的变化率。梯度记为:
```
∇f(x) = [∂f/∂x_1, ∂f/∂x_2, ..., ∂f/∂x_n]
```
其中,\(∂f/∂x_i\) 表示函数 \(f(x)\) 对变量 \(x_i\) 的偏导数。
**方向导数**
方向导数表示函数沿特定方向的变化率。对于一个函数 \(f(x)\) 和一个单位向量 \(u\),函数沿 \(u\) 方向的方向导数定义为:
```
D_uf(x) = lim_{h→0} [f(x + hu) - f(x)]/h
```
其中,\(h\) 是一个实数。
方向导数与梯度之间的关系为:
```
D_uf(x) = ∇f(x) · u
```
这表明方向导数是梯度在该方向上的投影。
**例:**
考虑函数 \(f(x, y) = x^2 + y^2\)。
- 梯度:∇f(x, y) = [2x, 2y]
- 沿单位向量 \(u = [1/√2, 1/√2]\) 的方向导数:
```
D_uf(x, y) = ∇f(x, y) · u = [2x, 2y] · [1/√2, 1/√2] = √2(x + y)
```
# 3. 梯度下降算法的实践应用
### 3.1 线性回归中的梯度下降法
**简介**
线性回归是一种广泛用于预测和建模的监督学习算法。它假设目标变量与输入变量之间存在线性关系。梯度下降法可以用来优化线性回归模型的参数,以最小化预测误差。
**步骤**
1. **初始化参数:**设置模型参数(权重和偏置)的初始值。
2. **计算梯度:**计算损失函数关于每个参数的梯度。
3. **更新参数:**使用梯度下降公式更新参数,即:
```python
参数 = 参数 - 学习率 * 梯度
```
4. **重复步骤 2-3:**直到满足收敛条件(例如,损失函数变化小于某个阈值)。
**代码示例**
```python
import numpy as np
def linear_regression_gd(X, y, learning_rate=0.01, max_iter=1000):
"""
使用梯度下降法训练线性回归模型。
参数:
X: 特征矩阵。
y: 目标变量。
learning_rate: 学习率。
max_iter: 最大迭代次数。
返回:
权重和偏置。
"""
# 初始化参数
w = np.zeros(X.shape[1])
b = 0
# 损失函数
def loss(w, b):
return np.mean((np.dot(X, w) + b - y) ** 2)
# 梯度
def gradient(w, b):
return 2 * np.mean(X * (np.dot(X, w) + b - y)[:, np.newaxis], axis=0), 2 * np.mean(np.dot(X, w) + b - y)
# 迭代
for i in range(max_iter):
# 计算梯度
grad_w, grad_b = gradient(w, b)
# 更新参数
w -= learning_rate * grad_w
b -= learning_rate * grad_b
# 计算损失函数
loss_val = loss(w, b)
# 打印损失函数
if i % 100 == 0:
print("迭代次数:", i, "损失函数:", loss_val)
return w, b
```
### 3.2 逻辑回归中的梯度下降法
**简介**
逻辑回归是一种用于二分类问题的监督学习算法。它假设目标变量服从伯努利分布,并使用 sigmoid 函数将输入变量映射到概率值。梯度下降法可以用来优化逻辑回归模型的参数,以最大化似然函数。
**步骤**
1. **初始化参数:**设置模型参数(权重和偏置)的初始值。
2. **计算梯度:**计算损失函数关于每个参数的梯度。
3. **更新参数:**使用梯度下降公式更新参数,即:
```python
参数 = 参数 - 学习率 * 梯度
```
4. **重复步骤 2-3:**直到满足收敛条件(例如,损失函数变化小于某个阈值)。
**代码示例**
```python
import numpy as np
def logistic_regression_gd(X, y, learning_rate=0.01, max_iter=1000):
"""
使用梯度下降法训练逻辑回归模型。
参数:
X: 特征矩阵。
y: 目标变量。
learning_rate: 学习率。
max_iter: 最大迭代次数。
返回:
权重和偏置。
"""
# 初始化参数
w = np.zeros(X.shape[1])
b = 0
# 损失函数
def loss(w, b):
return -np.mean(y * np.log(sigmoid(np.dot(X, w) + b)) + (1 - y) * np.log(1 - sigmoid(np.dot(X, w) + b)))
# 梯度
def gradient(w, b):
return
```
0
0