梯度下降方法

本文介绍了梯度下降法的基本概念及其在机器学习中的应用场景,包括线性函数拟合和感知机学习。通过两个实例演示了梯度下降法的具体实现过程,并对比了标准梯度下降与随机梯度下降的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天在看《统计学习方法》这本书,发现 梯度下降法 在 感知机 等机器学习算法中有很重要的应用,所以就特别查了些资料。   

 

   一.介绍

      梯度下降法(gradient descent)是求解无约束最优化问题的一种常用方法,有实现简单的优点。梯度下降法是迭代算法,每一步需要求解目标函数的梯度向量。

 

   二.应用场景

     1.给定许多组数据(xi, yi),xi (向量)为输入,yi为输出。设计一个线性函数y=h(x)去拟合这些数据。

     2.感知机:感知机(perceptron)为二类分类的线性分类模型。 输入为实例的特征向量,输出为实例的类别, 取+1 和 -1 二值。

 

     下面分别对这两种应用场景进行分析。

     1.对于第一种场景:

        既然是线性函数,在此不妨设为 h(x) = w0*x0 + w1*x1。

        此时我们遇到的问题就是如何确定w0和w1这两个参数,即w=(w0,w1)这个向量。

        既然是拟合,则拟合效果可以用平方损失函数:E(w)=∑ [ h(x)- y ] ^2 / 2 来衡量。

        其中w是权重二维向量,x是输入二维向量,x和y都是训练集的数据,即已知。

        至于后面除于2只是为了之后的推导过程中对E求导时候可以消除系数,暂时可以不管。

        因此该问题变成了求E(w)最小值的无约束最优化问题

      2.对于第二种场景:

        假设输入空间(特征向量)为x,输出空间为y = {+1, -1},由输入空间到输出空间的如下函数

                        f(x) = sign(w · x + b)       w∈Rn     其中 w 叫做权值或者权值向量, b叫做偏振。w · x 表示向量w和x的点积

         感知机sign(w · x + b)的损失函数为  L(w, b) = -∑yi(w · xi + b)              x ∈M, M为误分类点集合。

        因此该问题变成了求L(w, b)最小值的无约束最优化问题

 

   三.梯度下降方法

       梯度其实就是高数求导方法,对E这个公式针对每个维数(w0,w1)求偏导后的向量▽E(w)=(∂E/∂w0,∂E/∂w1)

       1. 对于第一种场景

          对E这个公式针对每个维数(w0,w1)求偏导后的向量▽E(w)=(∂E/∂w0,∂E/∂w1)

          梯度为最陡峭上升的方向,对应的梯度下降的训练法则为: w=w-η▽E(w)     这里的η代表学习速率,决定梯度下降搜索中的步长 。

          上式的w是向量,即可用将该式写成分量形式为:wi=wi-η*∂E/∂wi

          现在关键就使计算∂E/∂wi:

          推导过程很简单,书上写的很详细,这里只记录结论(其实就是对目标函数求导):

          ∂E/∂wi=∑(h(x)-y)*(xi)

          这里的∑是对样本空间,即训练集进行一次遍历,耗费时间较大,可以使用梯度下降的随机近似:

       2. 对于第二种场景

           感知机学习算法是误分类驱动的,具体采用随机梯度下降方法

           ▽wL(w, b) =   -∑yixi       

           ▽bL(w, b) =   -∑yi

           随机选取一个误分类点(xi,   yi), 对w, b进行更新:

            w  <——   w - η * (-yixi)

            b  <——    b - η * (-yi)                 式中η(0 < η <= 1)是步长,在统计学习中又称为学习率(learning rate)

  

   四.随机梯度下降的随机近似:

      既然是随机近似,则顾名思义,肯定是用近似方法来改善梯度下降时候的时间复杂度问题。

      正如上所说,在∂E/∂wi=∑(h(x)-y)*(xi) 的时候∑耗费了大量的时间,特别是在训练集庞大的时候。

      所以肯定有人会猜想,如果把求和去掉如何,即变为∂E/∂wi=(h(x)-y)*(xi)。

      幸运的是,猜想成立了。

      只是要注意一下标准的梯度下降和随机梯度下降的区别:

    1.标准下降时在权值更新前汇总所有样例得到的标准梯度,随机下降则是通过考察每次训练实例来更新。

    2.对于步长 η的取值,标准梯度下降的η比随机梯度下降的大。

    因为标准梯度下降的是使用准确的梯度,理直气壮地走,随机梯度下降使用的是近似的梯度,就得小心翼翼地走,怕一不小心误入歧途南辕北辙了。

    3.当E(w)有多个局部极小值时,随机梯度反而更可能避免进入局部极小值中。

 四.代码及实例:

  1. 对于第一种场景

         

复制代码
 1 /*
 2  * 随机梯度下降实验:
 3  * 训练集输入为矩阵:
 4  * 1,4
 5  * 2,5
 6  * 5,1
 7  * 4,2
 8  * 输出结果为:
 9  * 19
10  * 26
11  * 19
12  * 20
13  * 需要参数为 w:
14  * ?
15  * ?
16  *
17  * 目标函数:y=w0*x0+w1*x1;
18  *
19  * */
20 #include<stdio.h>
21 #include <stdlib.h>
22 int main()
23 {
24     double matrix[4][2]={{1,4},{2,5},{5,1},{4,2}};
25     double result[4]={19,26,19,20};
26     double w[2]={0,0};//初始为零向量
27     double loss=10.0;
28     const double n = 0.01;        //步长 
29     for(int i=0;i<100&&loss>0.001;i++)
30     {
31         double error_sum=0;
32         int j=i%4;
33         { 
34             double h=0;
35             for(int k=0;k<2;k++)
36             {
37                 h+=matrix[j][k]*w[k];
38             }
39             error_sum = h - result[j];
40             for(int k=0;k<2;k++)
41             {
42                 w[k]-= n * (error_sum) * matrix[j][k];//这里是关键
43             }
44          }
45         printf("%lf,%lf\n",w[0],w[1]);
46         double loss=0;
47         for(int j=0;j<4;j++)
48         {
49             double sum=0;
50             for(int k=0;k<2;k++)
51             {
52                 sum += matrix[j][k] * w[k];
53         }
54         loss += (sum - result[j]) * (sum-result[j]);
55      }
56         printf("%lf\n",loss);
57     }
58 
59     system("pause");
60     return 0;
61 }
复制代码

 结果可以得出  w0=3,w1=4。

 1. 对于第二种场景
复制代码
 1 /*
 2  * 基于感知机的随机梯度下降实验:  《统计学习方法》- p29-例2.1 
 3  * 训练集输入为矩阵:
 4  * 3,3
 5  * 4,3
 6  * 1,1
 7  * 输出结果为(表示实例的分类):
 8  * 1 
 9  * 1
10  * -1 
11  * 需要参数为 w:
12  * ?
13  * ?
14  *
15  * 目标函数:y = w0 * x0 + w1 * x1 + b; 
16  *
17  * */
18 #include<stdio.h>
19 #include <stdlib.h>
20 int main()
21 {
22     double x[3][2]={{3,3},{4,3},{1,1}};
23     double y[4]={1, 1, -1};
24     double w[2]={0,0};//初始为零向量
25     double b = 0;
26     int j;
27     const double n = 1;        //步长 
28  
29     while(1)
30     {
31         for(j=0;j<3;j++)
32         {
33             if(y[j] * (w[0] * x[j][0] + w[1] * x[j][1] + b) <= 0)
34                 break; 
35         }
36         if(j < 3)
37         {
38             for(int k=0;k<2;k++)
39                 w[k] += n * y[j] * x[j][k];//这里是关键
40             b += n * y[j];
41          }
42          else
43             break;
44         printf("%d :%lf,%lf %lf\n", j, w[0], w[1], b);
45         
46     }
47 
48     system("pause");
49     return 0;
50 }
复制代码

 结果可以得出  w0=1,w1=1, b = -3 。

       

 

参考:

 

1.    http://blog.csdn.net/wuyanyi/article/details/8003946

 

2.    李航 统计学习方法

 

 

原文网址:http://www.cnblogs.com/iamccme/archive/2013/05/14/3078418.html

<think>好的,用户想了解如何使用梯度下降方法进行蛋白质结构预测,以及该算法在其中的应用和实现。我需要先整理梯度下降的基本原理,然后结合蛋白质结构预测的具体问题来分析。 首先,梯度下降是一种优化算法,用于寻找函数的极小值。在机器学习中,常用于最小化损失函数。蛋白质结构预测通常涉及找到能量最低的三维结构,这符合梯度下降的应用场景。 接下来,蛋白质结构预测的数学模型可能包括能量函数,比如力场中的各项能量项。梯度下降需要计算这些能量函数的梯度,以更新结构参数。例如,计算原子间距离的梯度,调整坐标使总能量最小化。 然后,实现步骤可能包括初始化结构坐标,定义能量函数和梯度计算,迭代更新坐标直到收敛。需要注意的问题有局部最优、高维空间的优化难度,以及计算效率。可能需要采用随机梯度下降或引入动量来改进。 还要考虑现有的研究,比如AlphaFold是否使用了梯度下降或其变体。引用中的资料提到梯度下降在蛋白质结构预测中的应用,可能需要结合这些引用内容,比如引用[2]提到的梯度下降的缺点,如局部最优和高维问题,所以在实际应用中需要优化算法或结合其他方法。 此外,代码示例部分可能需要展示一个简化的梯度下降实现,比如使用Python计算坐标更新。同时要指出实际中的复杂因素,比如并行计算、大规模数据处理等。 最后,生成相关问题,帮助用户进一步理解,比如梯度下降的挑战、改进方法,以及与其他算法的比较。</think>### 梯度下降算法在蛋白质结构预测中的应用及实现 #### 1. 梯度下降的基本原理 梯度下降是一种通过迭代更新参数以最小化目标函数的优化方法。其数学表达式为: $$ \theta_{t+1} = \theta_t - \eta \nabla_\theta J(\theta) $$ 其中 $\theta$ 是待优化参数(如蛋白质构象的坐标),$\eta$ 是学习率,$\nabla_\theta J(\theta)$ 是目标函数(如能量函数)的梯度[^2]。 #### 2. 蛋白质结构预测的数学模型 蛋白质结构预测通常需要最小化能量函数: $$ E(\mathbf{x}) = E_{\text{bond}} + E_{\text{angle}} + E_{\text{dihedral}} + E_{\text{vdW}} + \dots $$ 其中 $\mathbf{x}$ 表示蛋白质原子坐标,各项分别对应键长、键角、二面角、范德华力等能量项。梯度下降通过计算 $\nabla_{\mathbf{x}} E(\mathbf{x})$ 迭代优化构象[^1]。 #### 3. 实现步骤 1. **初始化构象**:随机生成或基于模板初始化蛋白质坐标 2. **定义能量函数与梯度计算**: ```python def compute_energy(coords): # 计算总能量(包含各项相互作用) return energy def compute_gradient(coords): # 数值梯度或解析梯度计算 return gradient ``` 3. **迭代更新**: ```python learning_rate = 0.01 for _ in range(max_iter): grad = compute_gradient(current_coords) current_coords -= learning_rate * grad ``` 4. **收敛判断**:当能量变化小于阈值或达到最大迭代次数时停止 #### 4. 关键挑战与优化 - **局部最优问题**:通过随机初始化、模拟退火(如增加动量项)缓解 - **高维计算复杂度**:使用随机梯度下降(SGD)或自适应优化器(如Adam) - **物理约束处理**:通过拉格朗日乘数法整合键长/键角约束 #### 5. 实际应用示例 AlphaFold等工具虽未直接使用传统梯度下降,但其神经网络训练依赖基于梯度方法优化损失函数: $$ \mathcal{L} = \| \text{预测结构} - \text{真实结构} \|^2 + \text{正则化项} $$ 通过反向传播计算梯度并更新网络参数[^3][^4]。 #### 6. 性能评估 - **能量收敛曲线**:观察能量随迭代次数的下降趋势 - **RMSD指标**:预测结构与真实结构的均方根偏差 - **计算时间**:与蛋白质长度呈多项式关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值