这是我阅读在线书籍《Neural Networks and Deep Learning》的笔记,这篇博文是第一章的。没什么营养,因为大部分都知道了,于是草草略过。
章节链接: http://neuralnetworksanddeeplearning.com/chap1.html
Introduction
科普。
words
- effortlessly:毫不费力地
- deceptive:欺骗性的
- superbly:雄伟地(文中表程度大)
- astoundingly:令人惊讶地
- stupendously:(同上)
科普。。
words
- morass:沼泽、困境
- caveats:警告
科普。。。讲下NN可以从一堆数据中学习到一些特征,然后去预测一些没见过的数据。并且数据越多效果越好。
介绍第一章要搞什么(手撸一个NN,用来识别手写数字,就74行),随后的章节要搞什么(想一些trick提升NN的acc之类)。
words
- intervention:介入、调停
手写数字识别这个问题简单,非常适合用来举例(大概这样可以把注意力更多地集中到NN本身之类?)。it’s challenging - it’s no small feat to recognize handwritten digits - but it’s not so difficult as to require an extremely complicated solution, or tremendous computational power.
(这是一项具有挑战性的工作——识别手写的数字绝非易事——但是拥有一个极其复杂的解决方案,或者是巨大的计算能力的话就不难了),之后会讲一些扩展。
words
- throughout:自始至终
这章的重点:
两类神经元:感知机(Perceptrons)和sigmoid函数。
神经网络的标准训练方法:随机梯度下降(Stochastic gradient descent, SGD)
Amongst the payoffs, by the end of the chapter we’ll be in position to understand what deep learning is, and why it matters.最后会讨论一下DL为什么会matters。
Perceptrons
感知机(http://books.google.ca/books/about/Principles_of_neurodynamics.html?id=7FhRAAAAMAAJ)是一类人工神经元,由科学家Frank Rosenblatt在上世纪50到60年代间完成。
不过目前非常流行的一类模型是神经网络(Neural Network),最重要的一部分是sigmoid(就个非线性函数)。
上图是个最原始感知机的神经元,嗯。
假设这个perceptron有三个输入x1,x2,x3,中间的圈里一系列权重w1,w2,w3。输入来的时候,我们首先做向量乘法sum=∑iwixi,然后要和一个阈值threshold比较得到output:
output= \left{ \begin{array}{lll} 0, \ \ if\ sum \leq threshold \ 1, \ \ otherwise. \end{array} \right.
举个例子。
words
- transit:公共交通
- adore:崇拜、爱慕
- loathe:讨厌
每一列称之为层(Layer),第一层的三个神经元对输入分别以自己的权重进行处理(每层的处理就是向量乘积,最后获得一个值),得到的输出(可能不用threshold判断)再分别给第二层的每一个神经元,第二层的决策会更加复杂,因为第二层的输入是通过第一层抽象过的结果。
实际上每个神经元的输入可以有很多,但是输出都是一个。这么画是为了说明层与层之间是如何联系起来的。
words
- plausible:可信的
- subtle:微妙的
- engage:从事,参与
- sophisticated:复杂的
- incidentally:顺便,附带地
把上述神经元的计算过程简化下:
output= \left{ \begin{array}{lll} 0, \ \ if\ \omega\cdot x+b \leq 0 \ 1, \ \ otherwise. \end{array} \right.
b就是bias,也是threshold。表示一种“输出1”的测量(the bias as a measure of how easy it is to get the perceptron to output a 1. )。
words
- cumbersome:冗杂的,累赘的
- notation:标志、符号、记号
- reminder:剩下的
举了个简单的例子,说明感知机可以做与、或、非之类的逻辑操作:
上图就是一个与非门,实际上感知机能做任何逻辑操作(因为这东西可以实现一切基本逻辑操作,那么就像连电路一样把那些门都连起来就行了)。
这是为了说明,感知机可以和其他计算设备一样强大。然而并非仅此而已,我们还可以在这个简单的模型上使用学习算法,使这个模型可以自己调整每一个神经元中的weights和bias,这种调节来自外部刺激(external stimuli),而非手动调整。
words
- equivalent:等价物
- notable:值得注意的
Sigmoid Neurons
先介绍更新权重的时候,可以表示成ω+Δω的形式,这样就可以学习了(当然都是向量)。也就是,我们希望每次output反过头过来传个值,然后更新这个网络。
但是上述的naïve perceptron在输出的时候都会经过一个突变函数(非零即一),通过这个门以后后面的神经元就完全没法恒量差别了(就像雅思)。
引出sigmoid:
这里output为σ(z)≡11+e−z=11+exp(−∑jwjxj−b)。
这样做的好处是对之前用的step function做了平滑处理,使得变化看起来不会过于激烈。看看原文是如何解释的:
The smoothness of σ means that small changes Δwj in the weights and Δb in the bias will produce a small change Δoutput in the output from the neuron.
就是说变化后的w和b在处理完输入接着输出到output的时候,使得output的变化不至于太剧烈,output可以近似为下面的值:
Δoutput≈∑j∂output∂wjΔwj+∂output∂bΔb
确实可以用微分来解释,因为output是一个n元一次线性方程,那么对它微分就是各项偏导之和,而微分的几何意义就是表示偏移量(变化量)的。
我们需要有一个平滑函数σ来简化运算,由于指数在微分时的性质(无限可微),所以构造了sigmoid函数作为激活函数(sigmoid还有一个著名性质就是导数可以用自身表达)。
如何解释经过sigmoid的输出?
最大的不同是:经过sigmoid平滑后,输出由原来的0或1变为[0,1]中任意实数(希望变成0 1的话直接设阈值max一下就ok)。
words
- terrific:可怕的
- property:性质、性能
- occasionally:偶尔、偶然地、不定期地
- legitimate:合法的
- convention:约定
Exercises
part I:证明感知机中所有w、b都乘一个大于0的常数c,这个网络的输出不会改变。
证:\mbox{output}= \left{ \begin{array}{lll} 0, \ \ if\ \omega\cdot x+b \leq 0 \ 1, \ \ otherwise. \end{array} \right.,乘一个整数不会影响。
part II:给一个感知机,对于任意输入x,都有ω⋅x+b≠0。现在把所有神经元都替换成sigmoid神经元,再乘一个大于0的常数c,证明假如c趋于无穷大的时候,有sigmoid神经元的模型就会退化成没有sigmoid的网络。假如ω⋅x+b=0的时候又会有什么不同?
(1). 证:c→+∞,c>0时,可以分别将lim带入上述σ函数中求极限,发现分别收敛于0和1。
(2). 结果会输出0,而sigmoid会输出0.5,是不一样的。
The architecture of neural networks
上图是一个网络,从左到右开始,第1层叫输入层(input layer),每个元素叫输入神经元;第2层叫隐层(hidden layer),未必只有一层;第3层叫输出层(output layer)。
有多层的网络有时候也被称作“多层感知机”,这是有历史原因的。所以现在完全可以认为NN=MLP(MLP里的感知层(简单的线性操作)换成sigmoid)。
然后介绍识别手写数字的任务,提到最简单的构建NN的方法就是把一张图片(例如64×64)的灰度信息直接保存(输入直接是4096维,当然要把灰度归一化到[0,1]内),然后走一遍网络取argmax。同时,hidden layer的设计会非常多样。
前馈神经网络:通常定义只允许前面的层向后面的层输出,不允许反过来(不允许有环)。但是现在已经有一些可以带环的网络(RNN)。
words
- terminology:术语
- philosophical:哲学的
- rules of thumb:经验法则(大拇指规则)
- heuristics:启发、尝试(法)
A simple network to classify handwritten digits
本科做过了这段懒得读了。
这个图挺帅,意思就是用一层hidden,然后输入是28×28=784维,然后最后输出10个分类的logits。
这里讨论了一个很有趣的问题:为什么输出是10个而不是4个(因为24=16>10可以表示所有我们希望的数字情况)?
个人认为隐层中每次处理后都会提取图像中的某一部分的特征,预测的时候被激活与否的影响因素为某部分是不是有这个特征,有某种特征对应0-9这十个数是很容易的,然而要对应二进制编码则很难表示。
words
- sake:利益、理由
Exercise懒得做了,只要对应好四个位置给权值就行了。
Learning with gradient descent
介绍mnist数据集,同时设计一些必要的环节:
cost function:C(w,b)≡12n∑x|y(x)−a|2.(均方误差),训练过程中的目标是最小化cost function。
然后讲梯度下降:
ΔC≈∂C∂v1Δv1+∂C∂v2Δv2. 我们的目标是希望使ΔC变负,Δv1,Δv2分别是两个不同方向的偏移量。因此可以说ΔC是两个方向偏移量的叠加。
定义梯度向量:∇C≡(∂C∂v1,∂C∂v2)T.
所以化简后,变化量可以表示成:ΔC≈∇C⋅Δv.
定义Δv=−η∇C,η是一个极小的正数(学习率),ΔC≈−η∇C⋅∇C=−η|∇C|2,ΔC≤0恒成立知,C是一个只减不增的值,于是我们在算出的ΔC(我们希望让ΔC一直是负数,也就是C一直下降)的同时,算出v移动后的位置v′=v−η∇C。
就像这个绿球一直往地势低的地方滚,直到最低点(极低点)为止。
到m维的向量空间,∇C的定义会得到扩展:
∇C≡(∂C∂v1,…,∂C∂vm)T
(对于Δv中的每维变量,都会有一个对应的梯度去更新它。)
通常训练神经网络的工作都是面对这样一个最优化问题,梯度下降算法可以看做是一个采用最少步骤使得C下降的一个方法。
words
- quadratic:二次的
- ah-doc:特别的
- recap:翻造、重申
- distract:转移、分心
- lurk:潜伏、埋伏、隐藏
Exercise
http://neuralnetworksanddeeplearning.com/chap1.html#exercises_647181
Part I. 证明上述的假设,即:当|v|=ϵ,Δv=−η∇C时,其中ϵ>0为很小的一个数,且当η=ϵ|∇C|时,ΔC=∇C⋅Δv可以取到最小值。(也就是要证给定步长,我们沿着梯度的方向总能找到最小值)
证明:当ΔC=∇C⋅Δv且|v|=ϵ时,令Δv=−η∇C=(−ϵ/|ΔC|)∇C,则有:
ΔC=∇C⋅Δv =∇C⋅(−ϵ/|∇C|)∇C =∇C2(−ϵ/|∇C|) =|∇C|2(−ϵ/|∇C|) =−ϵ|∇C| =−|Δv||∇C|
由柯西-施瓦兹不等式,|u||v|≥|u⋅v|得,|Δv||∇C|≥|Δv⋅∇C|,−|Δv||∇C|必为最小值。
Part II. 给出一个在多维和一维情况下梯度下降的几何解释。
答:一维的话就退化成函数求导问题了,就是在一个曲线上找极小值,也就是一个圆点往地势低的地方滚。
接近物理学球下滚模拟的变种算法不可避免地需要求二阶偏微分,十分复杂。因此书中会引出一些方法来避免这个问题(梯度下降)。
梯度下降的目标是最小化cost functionC(w,b)≡12n∑x|y(x)−a|2.
反向更新的时候,这样来更新weights和biases:
wk→w′k=wk−η∂C∂wk bl→b′l=bl−η∂C∂bl.
但是有一个问题,原始的梯度下降里,这个目标函数实际上是在求C在不同x取值时的均值,也就是要把整个dataset都迭代一遍后再去反向传播。
随机梯度下降(Stochastic gradient descent,SGD)每次选取指定规模的mini-batch去做梯度下降,在mini-batch的大小m满足:
∑mj=1∇CXjm≈∑x∇Cxn=∇C,
即m个输入的平均值要接近于全体输入的平均值,SGD才可近似于naïve GD。
带入权值和偏移更新中,公式变成这样:
wk→w′k=wk−ηm∑j∂CXj∂wk bl→b′l=bl−ηm∑j∂CXj∂bl,
在SGD时,称把整个数据集经过mini-batch训练一遍为一个epoch,通常要来好几个epoch。
在算目标函数的时候不要忘记1n(用mini-batch的时候是1m),做一下平均(因为有可能后来添加数据,就是说数据规模不一定的时候会影响到)。
words
- incidentally:顺便地,偶然一提地
- convention:惯例,约定
- omit:省略、疏忽
Exercise
提到了mini-batch size=1的时候的一种极限情况。
Implementing our network to classify digits
介绍数据集,和要实现的神经网络。稍微读下代码,其他没什么好看的。
Toward deep learning
又是一些废话。
v1.5.2