首页 > 代码库 > Neural Networks and Deep Learning学习笔记ch1 - 神经网络

Neural Networks and Deep Learning学习笔记ch1 - 神经网络

近期開始看一些深度学习的资料。想学习一下深度学习的基础知识。找到了一个比較好的tutorial,Neural Networks and Deep Learning,认真看完了之后觉得收获还是非常多的。从最主要的感知机開始讲起。到后来使用logistic函数作为激活函数的sigmoid neuron,和非常多其它如今深度学习中常使用的trick。

把深度学习的一个发展过程讲得非常清楚,并且还有非常多源代码和实验帮助理解。看完了整个tutorial后打算再又一次梳理一遍,来写点总结。以后再看其它资料了能够来更新,查漏补缺。温故而知新。

  • 感知机
  • Sigmoid神经元
  • 神经网络的结构
  • 用梯度下降法来学习
  • 參考

感知机-Perceptron

在讲神经网络之前,不得不提感知机。感知机在1950s和1960s由Frank Rosenblatt提出。是一种人为设计的neuron, 只是如今在神经网络中通常使用sigmoid neuron,但还是有必要了解一下感知机。

技术分享
在上面这个样例中是一个感知机神经元,有三个输入x1,x2,x3<script id="MathJax-Element-1" type="math/tex">x_1,x_2,x_3</script>,一个输出,output<script id="MathJax-Element-2" type="math/tex">output</script>,另外对于每一输入另一个相应的权重系数。w1,w2,w3<script id="MathJax-Element-3" type="math/tex">w_1,w_2,w_3</script>,神经元的输出仅仅有两个状态,0或者1,公式化地描写叙述为例如以下:

f(x)={01ifjwjxjthresholdifjwjxj>threshold<script id="MathJax-Element-4" type="math/tex">f(x)= \begin{cases} 0& if \sum_{j}w_jx_j \leq threshold\1& if \sum_{j}w_jx_j > threshold \end{cases}</script>

有上面的公式能够非常easy地看出来感知机是怎么工作的。
可是能够看出,感知机的输出仅仅有 0 和 1。导致了感知机有一定的局限性,这让感知机看起来就仅仅是简单的逻辑门,并且还不能通过感知机构造出异或门。

关于感知机很多其它内容请看维基百科。所以就提出来一个新的neuron,能够让它的输出从0到1连续变化。

Sigmoid神经元-Sigmoid neurons

技术分享
如上所看到的为一个神经网络,假设权重的微小变化能够让输出也相应有一个比較小的变化。那么就能够让这个神经网络做一个略微复杂一点的工作了。而之前的感知机的输出是二值的。仅仅有在阈值附近。输入的变化才可能导致神经元的输出变化。并且还是突变,这样一个神经网络就是有点数字化了的感觉。本科学的数字电路就是这样子的。所以就有人提出一个新的神经元,sigmoid neuron,该神经元使用Sigmoid_function作为激活函数。

sigmoid函数也叫logistic函数,在机器学习中非经常见,该函数表达式为 σ(z)=11+e?x<script id="MathJax-Element-5" type="math/tex"> \sigma(z)=\frac{1}{1+e^{-x}}</script>,。该函数曲线例如以下:
技术分享
能够看到sigmoid函数的输出是从 0 到 1 连续变化的,在 0 处函数值为0.5。
令x为神经元的输入jwjxj<script id="MathJax-Element-6" type="math/tex">\sum_{j}w_jx_j</script> ,合起来就是σ(z)=11+e?jwjxj+b<script id="MathJax-Element-7" type="math/tex"> \sigma(z)=\frac{1}{1+e^{-\sum_{j}w_jx_j+b}}</script>
另外,改变wb<script id="MathJax-Element-8" type="math/tex">w。b</script>的值,是能够改变曲线的形状的。具体说来,w<script id="MathJax-Element-9" type="math/tex">w</script>越大。曲线在0处变化越陡,能够想象到当w<script id="MathJax-Element-10" type="math/tex">w</script>足够大时,sigmoid的输出也就仅仅有0 和 1了,就和前面的感知机一样了。

神经网络的结构-The architecture of neural networks

神经网络通常由输入层、隐藏层和输出层组成,输入输出都是仅仅有一层。但隐藏层能够有多层。深度学习中就是通过添加隐藏层的层数来完毕一些比較复杂的功能。例如以下为一个神经网络:
技术分享
通常情况下,神经网络的每两个相邻层之间的神经元都是两两相连接的。

用梯度下降法来学习-Learning with gradient descent

建立一个如上所看到的神经网络之后,须要通过训练来学习权重wb<script id="MathJax-Element-95" type="math/tex">w。b</script>,最经常使用的学习方法就是梯度下降法。

梯度下降是非经常常使用的优化目标函数的方法。给定训练数据,对于给定的输入,能够通过神经网络预測出一个输出。预測的输出假设和真实值不一致,那么就能够通过改变神经网络的系数权重来使系数往正确的方向变化。不断地学习最后就能达到一个比較好的结果。


首先要先定义一个代价函数,当预測的输出和预期的输出不一致时,就惩处该函数:
C(w,b)=12nx||y(x)?a||2<script id="MathJax-Element-96" type="math/tex">C(w,b) = \frac{1}{2n} \sum_x||y(x)-a||^2</script>
这里a<script id="MathJax-Element-97" type="math/tex">a</script>是训练数据中的输出,是预期值,y(x)<script id="MathJax-Element-98" type="math/tex">y(x)</script>是对给定输入x<script id="MathJax-Element-99" type="math/tex">x</script>的预測值,假设两者不一致,那么就让两者相减取平方作为惩处值。神经网络的学习过程即使通过调整权重w,b<script id="MathJax-Element-100" type="math/tex">w,b</script>使得该惩处值最小,这时能够觉得对神经网络学习得比較好了。

下一章中具体介绍神经网络训练用到的经典的反向传播算法。

參考

http://neuralnetworksanddeeplearning.com/chap1.html

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

Neural Networks and Deep Learning学习笔记ch1 - 神经网络