版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/github_39655029/article/details/99435209
20世纪五、六十年代Frank Rosenblatt发明,受Warren McCulloch和Walter Pitts工作的影响。
一个感知机接收多个二进制作为输入,然后产生一个二进制输出。各个输入加上权重来表示其对于输出的重要性,最终输出在[0,1]之间产生,有分配权重后的总和 ∑jwjxj\sum_jw_jx_j∑jwjxj 和阈值的大小来决定。阈值和权重都是实数,都是神经元的参数,公式表示如下:
output={0,∑jwjxj≤threshold1,∑jwjxj>threshold output = \begin{cases}0, \sum_jw_jx_j \leq threshold \\ 1, \sum_jw_jx_j > threshold \end{cases} output={0,∑jwjxj≤threshold1,∑jwjxj>threshold
为简化其数学描述,对上式进行改写,因而加入偏置,改写后的规则为下式,其中 w和xw和xw和x分别对应权重和输入向量。其中,偏置是一种让感知器更容易输入1而引入的一个参数,是为了进一步引导公式中的符号问题:
output={0,w⋅x+b≤01,w⋅x+b>0 output =\begin{cases}0, w \cdot x+b \leq0\\1, w \cdot x + b > 0\end{cases} output={0,w⋅x+b≤01,w⋅x+b>0
上图所列网络中,除开Input和Output外,主要分为三列。第一列称为第一层感知器,主要是通过权衡输入做出决策;第二层感知器则主要对第一层中做出的决策进行进一步的权衡,做出比第一层中更为复杂抽象的决策;第三层功能同第二层,对第二层的结果进行分析,从而做出决策。就这样,层层递进,下一层对上一层的结果做出权衡,直到做出最终决策输出。
虽然感知器运算具有通用性,但是看上去也只不过是一种新的与非门。不过实际上我们可以设计学习算法,从而实现自动对人工神经元的权重和偏置进行调整。这种调整可以对外部刺激进行响应,而不需要我们的直接干预。学习算法使我们能够一种从根本上不同于传统逻辑门的方式使用人工神经元。
为解决感知器网络中进行学习算法设计时反复改动权重和偏置可能引起后续整个感知器的输出完全反转的问题,于是引入S型神经元。
同感知器类似,但是它对学习算法中的权重和偏置的发生的细微改动,只会引起最终输出的微小变化。
同感知器,也有多个输入,且每个输入都有自己的权重,但只有一个总的偏置,其输入可以是0~1之间的任意值,最后的输出也不再局限于[0,1],而是 σ(w⋅x+b)\sigma(w\cdot x+b)σ(w⋅x+b) 。其中 σ\sigmaσ 被称为S型函数,有时候也叫逻辑函数,而这种新的神经元类型被称为逻辑神经元。定义z≡w⋅x+bz\equiv w \cdot x+bz≡w⋅x+b ,定义如下:
σ(z)≡11+e−z \sigma(z) \equiv \frac{1}{1+e^{-z}} σ(z)≡1+e−z1
即对于一个具有输入 x1,x2,...x_1,x_2,...x1,x2,... ,权重 $w_1,w_2,… $ ,和偏置b的S型神经元的输出是:
11+exp(−∑jwjxj−b) \frac{1}{1+exp(-\sum_jw_jx_j-b)} 1+exp(−∑jwjxj−b)1 利用 σ\sigmaσ 函数,可以得到一个平滑的感知器,σ\sigmaσ函数的平滑特性便是其中的关键因素。 σ\sigmaσ越平滑,说明权重和偏置的细微变化,即 △wj\bigtriangleup w_j△wj和 △b\bigtriangleup b△b,然后从神经元网络中产生一个微小的输出变化△output\bigtriangleup output△output.
Δoutput≈∑j∂output∂wjΔwj+∂output∂bΔ \Delta output \approx \sum_j \frac {\partial output}{\partial w_j} \Delta w_j + \frac {\partial output}{\partial b} \Delta Δoutput≈j∑∂wj∂outputΔwj+∂b∂outputΔ
其中,求和是在所有权重上进行的,∂output/∂wj\partial output/\partial w_j∂output/∂wj和表示outputoutputoutput分别对于wjw_jwj和bbb的偏导数。其中Δoutput\Delta outputΔoutput是反映权重和偏置变化(即Δwj\Delta w_jΔwj和Δb\Delta bΔb)的线性函数,这一线性函数是得选择权重和偏置的微小变化来达到输出的微小变化变容易。
感知器的输出仅限于[0,1],而S型神经元可以输出0~1之间的任意实数。而且由于历史原因,S型神经元虽然不是由感知器构成,但是仍然被称为多层感知器或MLP。
上述网络中,最左边的称为输入层,其中的神经元叫做输入神经元。而最右边的,即输出层包含输出神经元。中间层既非输入也非输出,则被称为隐藏层。
以上一层的输出作为下一层的输入,网络中是不存在回路的,信息总是向前传播,而不会出现反向回馈。
在网络模型中,反馈环路是可行的。其设计思想是因为存在在休眠前保持一段时间激活状态的神经元,这种激活状态会对其他神经元形成刺激,使其随后被激活并同样保持一段有限的时间。这样就会导致更多神经元被激活,我们就能得到一个级联的神经元激活系统。因为一个神经元的输出只会在一段时间后而不是立马影响其输入,在模型回路中不会引起问题。其影响力较前馈神经网络小,一部分原因是因为递归网络中的学习算法不够强大。但只从原理上讲,它比前馈神经网络更加接近于实际人脑工作。
上述网络第一层即输入层包含给输入像素值进行编码的神经元;第二层即隐藏层,用于设置n个不同神经元对输入进行处理;第三层即输出层包含10个神经元代表0~9这10个数字,当其中任一个神经元被激活时,则代表识别出对应输入的数字。
C(w,b)≡12n∑x∣∣y(x)−a∣∣2 C(w,b)\equiv\frac{1}{2n}\sum_x||y(x)-a||^2 C(w,b)≡2n1x∑∣∣y(x)−a∣∣2
其中 www 表示所有网络中的权重的集合,bbb是所有偏置,nnn代表训练输入数据的个数,aaa代表当输入为xxx时输出的向量,求和则是在总的训练输入xxx上进行。其中,输出aaa取决于x,w和bx,w和bx,w和b,∣∣v∣∣||v||∣∣v∣∣表示向量$v 的模。的模。的模。C又称为二次代价函数,有时也被称为均方误差或MSE,其结果都是非负的,且≈0\approx 0≈0。我们训练神经网络的目的是找到能够最小化二次代价(损失/目标)函数C(w,b)C(w,b)C(w,b)的权重和偏置。
对于上图,当我们想要找到$C 的全局最小值时,假设在的全局最小值时,假设在的全局最小值时,假设在v_1,v_2方向分别将球体移动一个很小的量,即方向分别将球体移动一个很小的量,即方向分别将球体移动一个很小的量,即\Delta v_1,\Delta v_2,此时,此时,此时\Delta C \approx \frac {\partial C}{\partial v_1}\Delta v_1 + \frac {\partial C}{\partial v_2}\Delta v_2。用。用。用\triangledown C表示梯度向量,即表示梯度向量,即表示梯度向量,即\triangledown C = (\frac{\partial C}{\partial v_1},\frac{\partial C}{\partial v_2})^T,于是,于是,于是\Delta C \approx \triangledown C \cdot \Delta v。这一式子解释了。这一式子解释了。这一式子解释了\triangledown C为何被称为梯度向量,它将为何被称为梯度向量 ,它将为何被称为梯度向量,它将v$的变化关联为C的变化,正如用梯度表示。选取:
Δv=−η▽C \Delta v = - \eta \triangledown C Δv=−η▽C
其中η\etaη是很小的正数(叫做学习速率),则ΔC≈−η▽C⋅▽C=−η∣∣▽C∣∣2\Delta C \approx -\eta \triangledown C \cdot \triangledown C = - \eta ||\triangledown C||^2ΔC≈−η▽C⋅▽C=−η∣∣▽C∣∣2。若我们按照上述规则去改变vvv,则CCC将一直减小,不会增加。
梯度下降算法的实质就是不断计算梯度▽C\triangledown C▽C,然后沿着相反方向移动,朝着山谷“降落”,如上图所示。为了使梯度下降能够正确运行,需要选取足够小的学习速率 $ \eta ,否则最终将导致,否则最终将导致,否则最终将导致\Delta C > 0。但。但。但\eta也不能太小,否则这将使也不能太小,否则这将使也不能太小,否则这将使\Delta v变化极小,梯度下降算法运行速率将非常缓慢。而且实际上,变化极小,梯度下降算法运行速率将非常缓慢。而且实际上,变化极小,梯度下降算法运行速率将非常缓慢。而且实际上,\eta是不断变化的,以确保是不断变化的,以确保是不断变化的,以确保\Delta C \approx \triangledown C \cdot \Delta v$的近似度。
思想是通过随机选取销量训练输入样本来计算▽Cx\triangledown C_x▽Cx,进而估算梯度▽C\triangledown C▽C。通过计算少量样本的平均值从而快速得到一个对于实际梯度▽C\triangledown C▽C的很好的估算,有助于加速梯度下降,进而加速学习过程。更为准确的说,算法通过随机选取小量的m个训练输入来工作,将其标记为X1,X2,...,XmX_1,X_2,...,X_mX1,X2,...,Xm,并将它们称作一个小批量数据(mini-batch)。
假设样本数量mmm足够大,我们期望▽CXj\triangledown C_{X_j}▽CXj的均值大致等于整个▽Cx\triangledown C_x▽Cx的均值,即
∑j=1m▽CXjm≈∑x▽Cxn=▽C \frac{\sum ^m_{j=1} \triangledown C_{X_j}}{m} \approx \frac{\sum_x \triangledown C_x}{n} = \triangledown C m∑j=1m▽CXj≈n∑x▽Cx=▽C
对左右两边进行交换,则得到下列式子,说明我们可以仅用火计算随机选取的小批量数据的梯度来估算整体的梯度:
▽C≈1m∑j=1m▽CXj \triangledown C \approx \frac{1}{m} \sum ^m_{j=1} \triangledown C_{X_j} ▽C≈m1j=1∑m▽CXj
随机梯度下降通过随机选取并训练输入的小批量数据,然后再挑选另一随机选定的小批量数据去训练,知道用完所有训练样本,此时则成为完成了一个训练迭代期(epoch)。
[代码及数据](https://github.com/mnielsen/neural-networks-and-deep-learning)
当创建一个仅有输入层(784个神经网络)和输出层(10个神经网络)的网络,而没有隐藏层时:
net = network.Network([784, 0, 10])
net.SGD(training_data, 30, 10, 3, test_data = test_data) # epochs:30、mini-batch:10、学习率:3
最终结果如下图: