深度学习笔记for qiqi
1.学习笔记-perceptrons&sigmoid neurons
第一章节的学习–手写数字的识别
参考学习链接
我们日常用肉眼去识别数字是非常容易的,
如上图你就可以轻松的知道他是504192,但是如果让你用代码去实现用计算机识别上述数字呢?那恐怕是一个非常难的难题,而且经过你的深思熟虑,你可能发现它几乎是不可能的.
而神经网络就提供了一种与众不同的方法来解决上述问题.
它是先给出这些训练模型.之后,神经网络会利用这些训练的模型自动的推断出一种规则来用于识别手写字体.再之后,通过提升我们训练模型的数目,网络就可以学到更多的有关手写字体的信息,然后能对新的数据做出更准确更快的处理.
例如如果只给我们100个训练样本,我们可能只能普普通通的得到一个不那么准确的结果,但是如果给我们100million个训练样本,我们就能高效快速的得到很多的训练样本.
在本章呢,我们讲写一个计算机程序来具体的实现神经网络手写数字的识别,代码很短,只有70多行,也没有用到特别的神经网络模型.但它能实现高达96%准确率的结果在无人干扰的情况下.而一些更好的模型已经能达到99%的准确率,现在一些手写的银行账单及快递信息都可以通过我们的模型来进行学习,从而大大的减少人工费用.
除了上述的代码之外,我们还将讲解percepreon (感知机)和 sigmoid neuron (s神经) 两种典型的神经网络环节.并且会讲述一下学习神经网络算法的标准学习算法,及随机梯度下降法. stochastic gradient descent.
下面开始我们的讲解
perceptrons
在开始讲解我们的神经网络之前,文中作者先向我们介绍了什么是perceptrons.在当今的神经网络模型中,sigmoid neuron是一种广泛使用的神经网络模型,我们会对其有一个简短的介绍.但是在了解sigmoid neuron的工作原理之前,我们会先对perceptrons做一个详细的介绍.
- Percetrons如何工作的呢?
percetrons会有几个binary inputs(二进制输入),并只产生一个binary output(二进制输出),如图所示
我们可以引入权重法来衡量输入对输出的影响,例如w1,w2,w3,…,然后我们可以定义一个阈值(threshold value),当值大于这个阈值的时候,输出为1;当值小于等于阈值的时候,输出为0
以上就是其工作方式.你可以通过影响权重来影响你之后的输出结果.
举个栗子:
例如你现在想去一个大型演唱会,你正在犹豫不决要不要去.你可能会从下面三个因素来影响你最终的决定: - 当天天气如何?
- 你女朋友(并不存在)和你一起吗?
- 地点远不远?
我们用x1,x2,x3这三个二进制变量来表示这三个因素,例如 if 天气很好,then x1=1 else x1=0;同理,x2,x3也这样来表达.
最后我们通过设置threshold(阈值)来确定输出为0或1.
为了方便标书,我们用代替,及用bias代替了threshold.最终公式为:
但是perceptrons有一个很大的缺点,就是权重很细微的改变就可能引起输出0-1的变化,因此,我们不好对权重进行调控.
因此为了克服上述困难,我们引入 Sigmoid neurons .
Sigmoid neurons
与perceptrons最大的区别是sigmoid neurons 对权重微小的改变,对输出也产生一个微小的改变.
这样方便我们对权重参数进行微调,从而来修正我们的输出的结果.
例如数字识别,机器若将8识别成9,那么就通过细微的修改权重值,来一步一步得到我们想要的结果.通过这样一个重复的过程.这样就实现了神经网络的学习.
而这些是无法通过perceptron来学习的,因为参数的微调可能导致输出从0-1的变化,即你若修改参数后,可能计算机能识别9,但可能会发生将8识别成6这种情况.因此,perceptron很难进行权重值的控制.
Sigmoid原理讲解
与perceptron相同,同样是这些输入x和输出output,以及我们的bias和权重w.
但唯一的不同是输出不是固定的0-1,而是[0,1]范围变化.例如0.368… 我们的输出变为
σ
(
w
⋅
x
+
b
)
\sigma(w \cdot x+b)
σ(w⋅x+b),
σ
\sigma
σ为sigmoid function.
σ
\sigma
σ定义如下:
σ
(
z
)
≡
1
1
+
e
−
z
.
(
3
)
\sigma(z) \equiv \frac{1}{1+e^{-z}}. \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space(3)
σ(z)≡1+e−z1. (3)
且
z
=
w
⋅
x
+
b
z = w \cdot x+b
z=w⋅x+b
则可得到其输出output为:
1
1
+
exp
(
−
∑
j
w
j
x
j
−
b
)
.
(
4
)
\frac{1}{1+\exp(-\sum_j w_j x_j-b)}.\space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space(4)
1+exp(−∑jwjxj−b)1. (4)
可以看到,
e
−
z
→
∞
e^{-z} \rightarrow \infty
e−z→∞和
e
−
z
→
0
e^{-z} \rightarrow 0
e−z→0时即对应成了perceptron.可见sigmoid neuron 为perceptron的衍生.
对比perceptron的函数
对应的权重细微变化导致的输出的改变.
不要被上述的偏导数吓到,它只是表明 △output随着△wj,和△b呈线性变化. 说明其是一个线性函数.因此,通过改变bias和weight来改变output将变得更加容易.
当然,sigmoid function并不是唯一的,为什么要用上述函数是因为这样会简化我们的算法,而且上述函数是作者在本书中多次用到的函数.
无用笔记.batch iteration epoch的代表含义
深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式。
第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。
另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。
为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。
那 batch epoch iteration代表什么呢?
(1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
(2)iteration:1个iteration等于使用batchsize个样本训练一次;
(3)epoch:1个epoch等于使用训练集中的全部样本训练一次,通俗的讲epoch的值就是整个数据集被轮几次。
比如训练集有500个样本,batchsize = 10 ,那么训练完整个样本集:iteration=50,epoch=1.
batch: 深度学习每一次参数的更新所需要损失函数并不是由一个数据获得的,而是由一组数据加权得到的,这一组数据的数量就是batchsize。
batchsize最大是样本总数N,此时就是Full batch learning;最小是1,即每次只训练一个样本,这就是在线学习(Online Learning)。当我们分批学习时,每次使用过全部训练数据完成一次Forword运算以及一次BP运算,成为完成了一次epoch。