6-1 梯度下降法

1. 梯度下降法简介

特点

  • 不是机器学习算法
  • 是一种基于搜索的最优化方法
  • 作用:最小化一个损失函数
  • 梯度上升法:最大化一个效用函数

图像直观理解

假设只有一个参数,图像如下:

横轴:参数值;纵轴:损失函数值

6-1 梯度下降法_第1张图片

导数(一维)可以代表方向,对应J增大的方向,所以想要找到最小值:

1. 方向:向导数的负方向调整参数值,

2. 步长:乘以学习率\eta

为什么叫梯度?

导数是指只有一个变量, 而对于多元的情况,将损失函数对每一个变量求偏导数, 将每一个偏导数方向组成一个向量称为梯度

问题:

  • \eta太大可能导致模型不收敛
  • 并不是所有函数都有唯一的极值点(这种搜索的方法可能找不到全局最优解, 所以起始点很重要)

解决方案:

  • 选择合适的学习率
  • 多次运行,随机化初始点
  • 梯度下降的初始点也是一个超参数

线性回归法的损失函数具有唯一的最优解,所以使用梯度下降得到的最优解就是全局最优解


2. 模拟实现梯度下降法

 

import numpy as np
import matplotlib.pyplot as plt

plot_x = np.linspace(-1, 6, 141)
print(plot_x)
plot_y = (plot_x - 2.5) ** 2 - 1


def dJ(theta):
    return 2 * (theta - 2.5)

def J(theta):
    #
    try:
        return (theta - 2.5) ** 2 - 1.
    except:
        return float('inf')

eta = 1.1
theta_history = []
initial_theta = 0.0
def gradient_descent(initial_theta, eta, n_iters = 10, epsilon=1e-8):
    theta = initial_theta
    theta_history.append(initial_theta)
    i_iter = 0

    while i_iter < n_iters:
        gradient = dJ(theta)
        last_theta = theta
        theta = theta - eta * gradient
        theta_history.append(theta)
        print(J(theta) - J(last_theta))
        if(abs(J(theta) - J(last_theta)) < epsilon):# inf - inf = nan
            break
        i_iter += 1
    print("+++++++++", i_iter)

def plot_theta_history():
    plt.plot(plot_x, J(plot_x))
    plt.plot(np.array(theta_history), J(np.array(theta_history)), color = "r", marker = "+")
    plt.show()


gradient_descent(initial_theta, eta)
plot_theta_history()

eta = 0.1时,梯度下降的路径如下图:

6-1 梯度下降法_第2张图片

如果学习率eta过大,不收敛(设置了迭代次数为10,蓝色的线是损失函数的图像, 红色的线是梯度下降过程中theta的取值)

6-1 梯度下降法_第3张图片

 

你可能感兴趣的:(6-1 梯度下降法)