今天终于可以开始讲神经网络啦~~
1.一个简单的介绍
我们先把那些关于人脑、神经什么的东西抛到一边,来简单地理解下神经网络。在linear classification那一章,我们是通过计算输入图片属于不同类别的score来判断它到底属于哪个类的,即,其中W是参数矩阵,x是由输入图像的所有pixel组成的一个特征列向量。比如以CIFAR-10为例的话x就是[3072*1]的列向量,W是[10*3072]的矩阵,因此输出是10个类别得分。
那么在神经网络中,计算score的方法有所不同:。其中也是一个参数矩阵,他可以把原始图像特征x转变成比如说100维的中间层向量特征 (则此时W1应为[100*3072]维)。函数max(0,~)是一个非线性函数,对矩阵中小于0的元素置零而保留大于0的元素值不变。这个非线性函数我们有多种选择(后面会讲),不过这一个是比较常用的,简单地通过0阈值来激活元素值。最后,则应该是一个[10*100]的矩阵,这样我们最后还是得到了10个类别得分。其中,就是通过之前所说的随机梯度下降法学习到的,其中用到反向传播算法来计算每一步更新的梯度哦(不了解这部分内容要去戳一下我前面的课程笔记了啊)。注意非线性函数部分(也称为激活函数),是神经网络中很重要的一个部分,但是即使我们把非线性函数部分去掉,把直接和相乘我们也可以得到10个类别得分,但是这样就少了一些扰动(wiggle),影响泛化性能等。
同样的,3层的神经网络会长这个样子:,就是这么简单!其中,,都是学习得到的参数。中间层特征向量的维度是hyperparameter,我们在后面会讲怎么设置他们。
接下来让我们再用人脑神经元之类的东西来解释上面所说的神经网络吧。
如果你觉得这篇文章看起来稍微还有些吃力,或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程。非常棒的大神之作,教程不仅通俗易懂,而且很风趣幽默。
2. 建模神经元
神经网络这一领域最早来源于对生物神经系统的建模,而后慢慢演变成一种工程的方法,并且在机器学习中取得了很好的效果。我们这边只简短地介绍和我们相关的生物学系统的知识。
2.1 神经元的激活和连接
人脑中基本的计算单元叫做神经元(neuron).人的神经系统中大约包含860亿个这样的神经元,并且他们之间通过大约10^14~10^15这么多的突触(synapses)连接。下图就显示了一个神经元和它抽象出的数学模型。每个神经元会从它们的树突(dendrites)获得输入信号,然后再将输出信号传给它唯一的轴突(axon)。轴突再通过突触和其他神经元的树突相连。
在神经元的数学模型中,轴突所携带的信号(例如:)通过突触进行传递,由于突触的强弱不一,假设我们以表示,那么我们传到下一个神经元的树突处的信号就变成了。其中突触强弱(参数w)是可学的,它控制了一个神经元对另一个神经元影响的大小和方向(正负)。然后树突接收到信号后传递到神经元内部(cell body),与其他树突传递过来的信号一起进行加和,如果这个和的值大于某一个固定的阈值的话,神经元就会被激活,然后传递冲激信号给树突。在数学模型中我们假设传递冲激信号的时间长短并不重要,只有神经元被激活的频率用于传递信息。我们将是否激活神经元的函数称为激活函数(activation function f),它代表了轴突接收到冲激信号的频率。以前我们比较常用的一个激活信号是sigmoid function ,因为它接收一个实值的信号(即上面所说的加和的值)然后将它压缩到0-1的范围内。我们在后面会介绍更多的激活函数。
关于上述传播过程(前向传播),代码如下:
<code class="language-python hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Neuron</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(object)</span>:</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># ... </span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">forward</span>