人体神经细胞工作原理。如下图。树突接受其他神经细胞的刺激。经过细胞核的处理通过轴突进行输出到其他神经细胞或者肌肉。这样传输就会形成一个通路。当我们持续学习一种事物的时候,就会持续的刺激该通路上的所有神经细胞。从而使得通路更加顺畅。形成记忆。从而加深学习。
2 通过模拟上述过程。我们通过计算机模拟构建了一个神经单元。如下图。
该单元也具有输入X(可以有多个)和输出Y(只有一个)。每个输入X都具有一个权重。权重越大,表示该信号越重要。所以权重起到了放大或者衰减X的作用。权重也是后面需要学习的。具体的计算公式如下。其中,sgn代表**函数。1 和 -1 代表最终的输出的y。其实通俗的讲就是。把X乘以权重然后累加起来。如果小于0.最终结果就是-1.如果大于0.最终结果就映射到1.
那么 W是怎么学习的呢。联想到我们人类学习过程,是通过不断的训练,调整而获得的。统一该神经元也可以用类似的方法。假如,该神经元的输出和我们想要的输出一样,那么W就不需要修改。如果不一样,就要修改W,使得输出朝我们想要的方向移动。数学上可以证明,通过下面的公式就可以获得这一的效果(其实就是梯度下降)。
单个神经元的功能非常简单。本质上就是一条直线。如果想要获得更加复杂的功能,我们可以把很多神经元链接起来。如下图。
输入层,负责接受输入。隐藏层有多个神经单元,经过计算汇总最终到输出层。这样就相当于人体多个神经细胞连接最终形成输出的结果。
其通俗的大体过程如下。
1 随机初始化 网络的权重。
2 根据输入 X,计算网络的各层输出。最后计算输出层的输出 Y。
3 对比我们的标注数据 Y1,如果有误差,就会生成误差信号。
4 误差信号会向后传播,用来修正 W(如果 Y和Y1一致,就不用修正,非常类似上面单个神经元学习,只是这里有很多层)
5 这样过程反复迭代,直到终止条件。(W变化很小,或者迭代到了指定次数)
但是BP有下面缺点:
1 梯度消失,层数不能太深。原因是,在计算向后传播的信号的时候,每一层都要乘以**函数的导数,这个导数一般都是小于1的(比如sigmod函数)。所以经过n层传播,信号会以指数级衰减。具体可以参考 BP反向传播的计算公式。
2 容易陷入局部最小。这是因为,我们的损失函数,不是凸函数。有很多局部最小值。单纯的梯度下降,会困到局部最小值出不来。
深层神经网络的解决办法。
为了解决上述两个问题,深度学习的大牛 hinton 2016年在science 发表了 Reducing the Dimensionality of Data with Neural Networks。分享了下面的步骤。
1 Pretraining 步骤 ( DBN 深度置信 网络)。
把原始数据,经过4个受限玻尔兹曼机(从4096维度压缩到30维度),得到四个权重矩阵 W1,W2,W3,W4.
2 Unrolling 步骤
把上面得到 四个权重矩阵 W1,W2,W3,W4 直接应用到,一个自动编码器中,(可以看做两个BP神经网络)
3 Fine-tuning 步骤。
运用BP神经网络的反向传播算法。对该网络进行微调。实验证明,一般只需要很少步骤就可以收敛,获得很好的效果。
一般把这种方式称为 DBN+DNN的学习方式。具体过程如下图。
关于玻尔兹曼机和受限玻尔兹曼机可以参考下面的文章
HopField http://blog.csdn.net/changdejie/article/details/78099410
玻尔兹曼机 http://blog.csdn.net/changdejie/article/details/78102894
受限玻尔兹曼机 http://www.cnblogs.com/kemaswill/p/3203605.html