xinmeng_wit 发表于 2024-7-15 22:03

《机器学习算法与实现》4、梯度下降法

<p><strong>一、梯度下降法</strong></p>

<p>上一篇分享中使用了求解方程组的方法求得了最小二乘法的解析解,但是当数据较多或者模型是非线性模型时,求解解析解会变得相当困难,甚至不可能。</p>

<p>因此,衍生出来了新的方法,就是梯度下降法。</p>

<p>梯度下降法的优点是在求解过程中只需损失函数的一阶导数,计算相对简单,这就是梯度下降法适用于大规模数据的原因。</p>

<p>梯度下降法的核心思想是,通过当前点的梯度方向寻找新的迭代点,不断迭代,直到找到最优参数。</p>

<p>&nbsp;</p>

<p><strong>二、梯度下降法的基本原理</strong></p>

<ul>
        <li><strong>初始点</strong>:选择一个初始点 x(0) 作为算法的起始点。</li>
        <li><strong>梯度计算</strong>:计算当前点的梯度,即损失函数对参数的偏导数。梯度指向函数增长最快的方向。</li>
        <li><strong>参数更新</strong>:将当前点的参数向梯度的相反方向更新,以减小损失函数的值。更新公式通常为:</li>
</ul>

<div style="text-align: center;"></div>

<div>其中, x(k) 是第&nbsp;k 次迭代的参数, &nabla;f(x(k)) 是损失函数在x(k) 处的梯度,而&nbsp;&eta; 是学习率,决定了步长的大小</div>

<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 迭代</strong>:重复步骤2和3,直到满足停止条件,如梯度足够小、达到预定的迭代次数或损失函数值不再显著减小。</p>

<p>&nbsp;</p>

<p><strong>三、梯度下降法的算法实现</strong></p>

<p>下面将使用剃度下降法来求解a和b,实现最小二乘法的拟合</p>

<pre>
<code class="language-python"># 最小二乘的梯度下降法求解

import matplotlib.pyplot as plt
import numpy as np
import sklearn

# 生成数据
data_num = 50
X = np.random.rand(data_num, 1)*10
Y = X * 3 + 4 + 4*np.random.randn(data_num, 1)

N= X.shape

# 设置参数
n_epoch = 500    # 迭代次数
a, b = 1, 1      # 初始模型参数
epsilon = 0.001# 学习率

# 对每次迭代
for i in range(n_epoch):
    data_idx = list(range(N))
    np.random.shuffle(data_idx)

    # 对每个数据
    for j in data_idx:
      a = a + 2 * epsilon * (Y - a * X - b) * X
      b = b + 2 * epsilon * (Y - a * X - b)

    # 计算损失函数
    L = 0
    for j in range(N):
      L = L + (Y - a * X - b) ** 2

    if i % 100 == 0:
      print("代 %4d: loss = %f, a = %f, b = %f" % (i, L, a, b))

# 画出结果
x_min = np.min(X)
x_max = np.max(X)
y_min = a * x_min + b
y_max = a * x_max + b

plt.scatter(X, Y, label='original data')
plt.plot(, , 'r', label='model')
plt.legend()
plt.show()


</code></pre>

<p>拟合结果:</p>

<div style="text-align: left;"></div>

<p>效果也还不错。</p>

<p>由此可以看出,不管是用求解析解的方法还是用梯度下降法最终都能较好的求出a和b,从而拟合出一个比较好的结果。</p>

<p>在模型复杂和数据量较大的情况下一般求解解析解非常困难,梯度下降法很好的作了一个补充,事实上,在神经网络等机器学习中常用的方法是梯度下降法。</p>

<p>所以这是一个非常重要的概念,一定要掌握,后面会经常用用到。</p>

吾妻思萌 发表于 2024-7-16 06:42

我记得是求一阶导和二阶导,还有个旋度,不晓得啥意思?

scare 发表于 2024-7-16 10:51

<table cellpadding="0" cellspacing="0">
        <tbody>
                <tr>
                        <td id="postmessage_3345783">我记得是求一阶导和二阶导,还有个旋度,不晓得啥意思?</td>
                </tr>
        </tbody>
</table>

xinmeng_wit 发表于 2024-7-16 12:19

吾妻思萌 发表于 2024-7-16 06:42
我记得是求一阶导和二阶导,还有个旋度,不晓得啥意思?

<p>根据书中的讲解,梯度只需要用到一阶偏导数。正是因为只需要求一阶偏导数,所以使用非常广泛。</p><br/>

xinmeng_wit 发表于 2024-7-16 12:20

scare 发表于 2024-7-16 10:51
我记得是求一阶导和二阶导,还有个旋度,不晓得啥意思?

<p>根据书中的讲解,梯度只需要用到一阶偏导数。正是因为只需要求一阶偏导数,所以使用非常广泛。</p><br/><p></p><br/><p></p><br/>

freebsder 发表于 2024-7-16 15:18

<p>回归分析哇</p>

xinmeng_wit 发表于 2024-7-17 12:55

freebsder 发表于 2024-7-16 15:18
回归分析哇

<p>一看就是大佬:congratulate:</p><br/>
页: [1]
查看完整版本: 《机器学习算法与实现》4、梯度下降法