神经网络和深度学习
神经网络:一种可以通过观测数据使计算机学习的仿生语言范例
深度学习:一组强大的神经网络学习技术
神经网络和深度学习目前提供了针对图像识别,语音识别和自然语言处理领域诸多问题的最佳解决方案。传统的编程方法中,我们告诉计算机如何去做,将大问题划分为许多小问题,精确地定义了计算机很容易执行的任务。而神经网络不需要我们告诉计算机如何处理问题,而是通过从观测数据中学习,计算出他自己的解决方案。
神经元和感知机
神经网络是由一个个基本的神经元neurons组合而成的,而这些神经元模拟人脑中神经细胞,拥有若干个输入和输出(对应树突和轴突),通常在学术界我们将其称为感知机。
对于一个神经元细胞,拥有接受信号的树突和输出信号的轴突,根据这种模式,学者设计一个输入输出模式的单元,并命名为感知机:
感知机-perceptrons
2.1 原理阐述
先简单的构思下,你觉得感知机是如何工作的?感知机需要几个二进制输入, X1,X2,…Xn X1,X2,…Xn ,并产生一个二进制输出:
上图所示的 Perceptron Perceptron 有三个输入,但是实际的输入可能远多于三个或是少与三个。 Rosenblatt Rosenblatt 提出了一个简单的规则来计算输出,他首先引入了 weights (权重)概念, ω1,ω2,... ω1,ω2,...。以实数权重 ω 表示输入到输出的重要性,神经元的输出 0 或 1 ,这取决于加权因子(即 weights) 小于或大于某一阈值。就像权重,阈值为一个实数,是一个神经元的参数。
公式表示为:
这就是我们熟知的激活函数的最初形态, 0 状态代表抑制, 1 状态代表激活。这简单的数学公式帮助我们了解 perceptrons 是如何工作的。姑且我们把它理解为: 它是一种通过权衡输入信息的重要性来决定你的输出。
2.2 实例理解
举个简单的例子,假设在这个周末,你听说你的城市将有一个摇滚音乐节,你喜欢摇滚,现在想做决定看是否去音乐节。假设你通过权衡三个因素来做出你的决定:
1)当天的天气好吗?
2)你的男朋友或女朋友是否想陪你一起去?
3)到达目的地的交通是否便利。
下面我们把它公式化,我们以相应的二进制变量来表示这三个因素 x1,x2,x3 x1,x2,x3 。假设我们把天气好表示为 x1=1 x1=1 ,反之 x1=0 x1=0 。相似地假设,有人陪 x2=1 x2=1 , 反之 x2=0 x2=0; 交通便利 x3=1 x3=1 ,反之 x3=0 x3=0 。
现在,假设:
1、你非常喜欢摇滚音乐,所以即使的男、女朋友不去,你也很可能会去参加这个摇滚音乐节。
2、但也许你真的讨厌的坏天气,如果初先坏天气,你很可能就不去了。
你可以使用感知器模型来做这类决策,这时我们设置权重因子 w1=6,w2=2,w3=2. w1=6,w2=2,w3=2. 对 w1 w1值越大,表明天气因素对你有更重要的意义,远不如是否有人陪伴或是交通情况。最后,假设你选择一个 阈值为 5 5 的感知器。有了这些选择,感知机可实现你理想的决策模型,当天气好的时候,输出 1 1; 0 0 表示天气不好。这时,无论你的男朋友或女朋友是否想去,或是交通情况是否便利,这两项将不再影响你的输出。
通过不同的权重和阈值,我们可以得到不同的决策模型。例如,假设我们选择了一个阈值为 3 3。然后,如果天气好,感知器 会判定你应该去参加这个音乐节。亦或是天气不好,但是你的男、女朋友愿意陪你去并且交通便利,感知器 也会判定定你应该去参加这个音乐节。总而言之,权值或是阈值的改变,它将会是一个不同的决策模型。
显然,感知器不是人类的一个完整的决策模型,人的神经网络要复杂得多!但是,例子说明的是一个感知器是如何衡量不同种类的约束条件的重要性,以作出决定。就这方面而言,举例还算是恰当。当然,一个复杂的网络感知器就可以做出非常微妙的决定:
epoch:1个epoch表示过了1遍训练集中的所有样本。
Common Activation Functions激活函数
激活函数是用来加入非线性因素的,因为线性模型的表达能力不够。
以下,同种颜色为同类数据。
某些数据是线性可分的,意思是,可以用一条直线将数据分开。比如下图:
这时候你需要通过一定的机器学习的方法,比如感知机算法(perceptron learning algorithm) 找到一个合适的线性方程。
但是有些数据不是线性可分的。比如如下数据:
第二组数据你就没有办法画出一条直线来将数据区分开。
这时候有两个办法,第一个办法,是做线性变换(linear transformation),比如讲x,y变成x^2,y^2,这样可以画出圆形。如图所示:
如果将坐标轴从x,y变为以x^2,y^2为标准,你会发现数据经过变换后是线性可分的了。大致示意图如下:
另外一种方法是引入非线性函数。我们来看异或问题(xor problem)。以下是xor真值表
这个真值表不是线性可分的,所以不能使用线性模型,如图所示
我们可以设计一种神经网络,通过激活函数来使得这组数据线性可分。
激活函数我们选择阀值函数(threshold function),也就是大于某个值输出1(被激活了),小于等于则输出0(没有激活)。这个函数是非线性函数。
神经网络示意图如下:
其中直线上的数字为权重。圆圈中的数字为阀值。第二层,如果输入大于1.5则输出1,否则0;第三层,如果输入大于0.5,则输出1,否则0.
我们来一步步算。
第一层到第二层(阀值1.5)
第二层到第三层(阀值0.5)
可以看到第三层输出就是我们所要的xor的答案。
经过变换后的数据是线性可分的(n维,比如本例中可以用平面),如图所示:
总而言之,激活函数可以引入非线性因素,解决线性模型所不能解决的问题。
多层前馈神经网络Multi-layer Perceptrons
之前我们已经介绍了单个神经元(感知机),我们仿照人脑神经系统,把这些神经元给全连接起来,便可以得到一个多层感知机 (Multi-layer Perceptron, MLP),也叫做多层神经网络。在多层神经网络中,第一层叫做输入层(input layer),最后一层叫做输出层(output layer),中间的都叫做隐层(hidden layer),下面是一个单隐层神经网络的教材例子
正则化 regularization
如果你怀疑神经网络过度拟合了(即high variance problem),难么最先想到的方法是正则化。正则化通常有助于避免过度拟合或减少网络误差。下面来讲正则化的原理。
L2 regularization是最常见的正则化方法,而你可能也听说过 L1 regularization。
Dropout 正则化
除了L2 regularization,还有一个非常实用的正则化方法——dropout。我们来看看它的工作原理。假设我们训练如图的神经网络,它存在过拟合。
这就是dropout所要处理的。我们复制一下这个网络,dropout会遍历他的每一层,并设置消除神经网络中节点的概率。我们类似掷硬币的设置每个节点得以保留和消除的概率皆为0.5,设置完概率我们会消除一些节点,然后对应的删掉从这些节点进出的连线。最后得到一个如下图所示的节点更少,规模更小的网络。然后对这个网络做back propagation(反向传播)训练。
这只是其中一种情况,我们同样以这种方式设置概率来处理其它样本。对每个样本我们都将采用一个精简后的神经网络来训练它。这个方法单纯遍历结点,编码也是随机的,可它真的有效。
early stopping
还有另外一种常用的方法叫作。当你运行梯度下降时,可以绘制training error曲线(在训练集上用0-1记录分类误差次数),或只绘制呈单调下降趋势的cost function 的优化过程。
在训练过程中,我们希望训练误差代价函数
都在下降。通过early stopping,我们不单可以绘制上面这些内容,还可以绘制dev set error(验证集误差)。
它可以是验证集上的分类误差,或验证集上的代价函数(cost function)、逻辑损失(logistic loss)、对数损失(log loss)等。
你会发现,dev set error会先呈下降趋势,然后在某个节点处开始上升。So,early stopping的作用是“你觉得神经网络在这个迭代过程中表现得很好了,我们在此停止训练吧”,并得到对应的dev set error。
当你还未在神经网络上运行太多迭代的时候,参数w接近0(因为随机初始化w时,它的值可能都是较小的随机值,所以在长时间训练网络之前,w依然很小)。随着迭代的进行,经过训练w的值会变得越来越大。
所以early stopping要做的就是在中间点停止迭代过程,我们得到了一个中等大小的w。与L2 regularization十分相似,(但愿你的神经网络过度拟合不严重)选择w范数较小的神经网络
卷积神经网络(Convolutional Neural Networks)
是一种在空间上共享参数的神经网络。使用数层卷积,而不是数层的矩阵相乘。在图像的处理过程中,每一张图片都可以看成一张“薄饼”,其中包括了图片的高度、宽度和深度(即颜色,用RGB表示)。
Convolutional neural networks (“convnets”) are a staple of deep learning, especially for computer vision applications
Convnets are neural networks made up of the following
layers:
• convolutional layers
• max pooling layers
• fully-connected layers
Convolutions are made up of two components:
(1) a kernel, in the form of a matrix which is overlaid on different sub-regions of the image, and combined through an element-wise product
(2) a stride s ∈ Z+ which defines how many positions in the image to advance the kernel on each iteration
Deep Learning: The Good
• Huge impact on vision and speech recognition tasks in particular, with massive improvements in empirical accuracy over standard datasets
• Possible to model much larger contexts/neighbourhoods than conventional models, due to representation learning/generalisation
• Easy to combine different input modalities
• Easy to play around with using high-level libraries such as TensorFlow, PyTorch and keras
• Lots of vibe/demand for machine learning skills!
Deep Learning: The Bad
• Any savings in terms of feature engineering are outweighed by costs in terms of architecture engineering
• Very expensive to train over large datasets (with implications for hyperparameter tuning, architecture engineering, ...)
• Without code, reproducibility of results can be very low, due to the impact of various engineering tricks that have a big impact on results
• Overblown claims about the capabilities of deep learning (AI Armageddon, anyone?)