深度学习深度学习(六)实现梯度下降
作者:互联网
这一章节,我们是把上一章节的理论赋予实际的实现。
让我们先回顾一下,我们为了测量一个方程是否是好的,我们就要建立一个cost function,计算每个方程带入所有样本的总偏差E。然后根据梯度下降,找到E的最小值。
上一章也讲过,查找E的最小值,常用的方法就是梯度下降,而计算梯度下降重点就要把E的导数算出来。我们先来计算一下导数:
上一章讲过,cost function有两个一个使用方差,另外一个用交叉熵,方差是比较简单的,所以我们先假定用方差去计算导数:(注意,下面用到的是高等数学里头的复合函数的导数知识,在往下阅读前,建议先掌握这个知识)
额,我们回忆一下基本的方程,h = + + 。其中让=1(设定一个常数)就是b,我们把这个方程就可以变形为
i 从0 到 2
再加上我们的activation function就变成:
方差的函数函数如下:
这里要说明一下这个式子,和之前的式子有一个差别,就是之前的式1/2m,m是样本数量。E最后的结果是要除以m的。但不知道是不是因为在一个固定样本数量的同一次训练来说,m是固定的,相当于是一个常量,所以这个可以省去?也期望其他童鞋给我解惑一下。
注意:上述方程中的μ不是指数,而是表示这是第μ个样本的计算值。
于是,我们计算每一个wi的导数为:
有因为是线性方程:
得出的结果就是:
而我们通常会把-(Y-Ý)f'(h)记为δ所以,公式简化为:dE/d = δ加上梯度下降的步长比例η那么就有:
= + ηδ。
从上面推到可以看出,η实际上是cost function复合了activation function后的导数公式。
这里又有一个说明,上面求导的过程显然是把忽略掉了,即只单独某一个样本的求导。
而这点可以从下面给出的伪代码可以看出,伪代码里面是要把求导的结果,重新累加起来的:
η = 0.1
//随机设置w1,w2,b的初始值
w1 = radom();
w2 = radom();
b = radom();
def sigmod = function(x){
return 1/(1- exp(-x));
}
def sigmod_prim = function(x){
return sigmod 的导数
}
while (true){
//每次迭代前,初始化参数变量
Δw1 = 0;
Δw2 = 0;
Δb = 0;
for (i=0;i<总样本数){
//计算Ý
Ý = sigmod(w1*x1[i] + w2*x2[i] + b);
δ = -(y-Ý) * sigmod_prim(Ý);
Δw1 += δ * x1[i];
Δw2 += δ * x2[i];
Δb += δ * 1;
}
w1 = w1 - η * Δw1;
w2 = w2 - η * Δw2;
b = b - η * Δw2;
if(cost 函数 已经足够小 或者迭代到一定次数){
//退出循环,参数w1,w2,b就是最优的方程参数
}
}
好了,如果有闲的实在蛋痛的朋友,有兴趣的话,可以自己实现一下这个算法,这个是比较有趣的。
这个,就是完整的一个机器学习的雏形。
我们回忆一下:
1。拟定一个模型,即定义以及y。
2。找到样本数据
3。通过梯度下降,找到最优的参数w1,w2...wn,b(学习过程)
4。根据最优的w1,w2.....wn,b就可以开始对新的x进行预测和判断计算出预测的y(应用过程)
标签:function,导数,梯度,样本,学习,w2,w1,深度 来源: https://blog.csdn.net/wwwlgy/article/details/121211387