一、概念
神经网络是已知自变量x
和真实结果y
,要求拟合出F(x)
。
神经网络的架构可以看做是黑箱测试,但你不知道黑箱指代的F(x)
到底是什么,不过没关系,我们知道其中的参数(是随机初始化的),即神经元之间做连接的那些个边指代的权值。一个神经网络的参数是非常庞大的,自变量一般是非常多个,以至于参数也是有很多,且神经网络一般会有很多个隐藏层,所以一个神经网络是一个多元复合函数。
我们向黑箱中输入你的自变量x后得到一个预测值y拔,和真实值y做对比,怎么比呢?答:通过损失函数G(y拔,y)
。
我们假设一个比较简单的损失函数如下:
可见,我们希望的是预测值y拔
与y
相差不大,所以整个架构的优化目标是让G(y拔,y)
达到最小值。
二、人话版
我们以最简单的一元函数举例。
由于黑箱指代的F(x)
是随机初始化的,即F(x)
的参数wi
,bi
是随机初始化的。
因为我们这里假设神经网络是最简单的一元函数y = wx + b
,所以有一个参数w
和b
。
假设w和b被分别随机初始化成5和1,即目前黑箱指代的F(x)=5x +1
。
假设我们现在有自变量x = 2
, 真实值y =14
。
把x = 2
传入黑箱F(x)得到一个预测值y拔 = 5*2+1 = 11
。
调用上面的损失函数G,得到一个损失loss = (11-14)² = 9
。
我们有x
和y
,优化w
,所以神经网络指代的函数可看是F(w)=w*2 +b
。
因为x=2
是已知的,参数w是变化的。
这里引入梯度的带概念,一个参数梯度是函数对这个参数的导数。
由此链式求导可以求得损失函数G对w的导数是(22-28)x2= -12
所以w
的梯度r = -12
.
参数更新一般是:参数=参数 - 学习率*梯度
。我们假设学习率lr=0.1
.
所以w = 5 - [0.1x(-12)] = 6.2
。
可见,通过优化w
,我们的w
由之前的5
变为了更新后的6.2
。此时黑箱指代函数变为F(x)=6.2x +1
我们再来看一下现在的loss,传入参数x=2
,得到预测值y拔=13.4
。
带入损失函数G求得loss = (13.4-14)² = 0.36
。
可见 ,loss已经由刚才的9降低到0.36。
可见我们的参数更新是很有用的,当然我们这里只对w更新,b其实也要更新,但为了简单举例,咱们只考虑w。
question:
至于为什么参数更新公式是:参数=参数 - 学习率*梯度
为什么要减去梯度(导数)?
假设我们现在的参数w
导致的损失loss
在橙色点。
我们计算的loss
对w
的导数(梯度),我可以直观的发现,w顺着导数的方向减小一定的步长,才能够离loss的最小值点更接近。
所以公式是用参数=参数 - 学习率*梯度
,说白了就是为了更接近min
。
我们这里只举例最简单的一元函数,实际上庞大的神经网络是一个多元复合函数,我们对一个参数w求梯度就是在求G
对wi
的偏导数,换汤不换药~
over~我可真是是大聪明。
补充: 想要理解透彻神经网络的梯度下降,要明白我们的条件:已经有了许多个x和y,但不知道F(x),所以我们调整的是那些个参数wi,所以wi可以看成是函数的自变量,拟合的函数可以看成是F(w),即神经网络关于参数wi的函数。 和一般数学上的已知x求y是反着的。
上面的举例是根据一个样本进行的计算,当然在实际应用中我们采用的mini-batch策略,即每次想模型中投入一批数据,计算的loss是这个batch的均方误差(误差的均值),这样更有利于提高模型计算效率和更快速的找到最优wi。