logo
BosonNLP Blog

当我们在谈深度学习时,到底在谈论什么(一)

Alt text

深度学习最近两年在音频分析,视频分析,游戏博弈等问题上取得了巨大的成果。由于微软,谷歌等科技巨头的推动及应用上的可见突破,使得深度学习成为目前学术界和工业界的超热门话题。包括国内很多公司也乐见其成,适时宣布自己的产品或算法也拥抱了深度学习。不过对于具体如何使用,达到了什么效果等问题讳莫如深。

事实上,关于深度学习的大量研究成果在上世纪已经完成,包括卷积神经网络(CNN)、长短时记忆网络(LSTM),多层网络的表达能力等。宣称自己在使用某个算法工具其实并不具备天然的正义性,如何能将工具用好,解决关键场景才是我们应该关心的问题。

为提升对非结构化数据的处理,玻森(bosonnlp.com)内部也在开展深度学习的讨论。接下来的一段时间,我们将不定期更新深度学习的讨论notes。

Alt text

我们不谈情怀,不讨论人工智能是否要统治人类,也不论奇点是否临近。我们就谈点落地的深度学习基础数学理论,及背后的几何直观。世界太大,认知有限,这点上我们遵从维特根斯坦的观点,“凡能够说的,都能够说清楚;凡不能谈论的,就应该保持沉默”。

什么是感知机

Alt text

人类大脑的神经系统相当复杂,其具体的工作机制至今仍是前沿的生物课题。在1957年时由 Cornell 大学的学者 Frank Rosenblatt 博士所提出的感知机(Perceptron)模型可以认为是对人类神经系统的一个高度简化概括:

$$ \begin{cases}1 & w\cdot x +b > 0\\0 & w\cdot x+b \leq0\end{cases} $$

其中\(w\)\(b\)作为模型的参数。

Frank Rosenblatt 博士恐怕是史上对人工智能贡献最大的心理学家。他的兴趣不仅停留在从数学上抽象出感知机和提出相应的学习算法,还亲自打造了下面这台被称之为Mark I Perceptron的“实体”感知机,其具备512个隐藏单元哦!

Alt text

当加权求和输入值时,感知器会与0做对比,以确定自己是否处于激发状态。实际的神经元在人脑中数以百亿计。上式中神经元所输出的状态非0即1,而实际在计算机所建立的模型中,往往将其泛化:

$$ y = f(w\cdot x + b)\quad w \in\mathbb{R}^n, b\in\mathbb{R} $$

其中\(f\)为激活函数(activation function)。

神经网络可以看做是感知机的一种泛化形式,通过递归嵌套及选择不同的激活函数,我们可以不断将原始数据x进行变换,或特征抽取。

通过对上述式子的嵌套,我们可以构造具有更为复杂表达能力的函数。如两层嵌套形式:

$$ y = f\left(w_2\cdot f\left(w_1\cdot x + b_1\right)+ b_2\right) $$

注意到感知机实际上相当于采用Step函数作为激活函数。其他常用的激活函数有Sigmoid, Tanh, ReLU等。其中Sigmoid函数

$$ f(w\cdot x+b)= \frac{1}{1 + \mathcal{e}^{-(w\cdot x+b)}} $$

在早期的神经网络研究文献中被广泛使用。目前对于大多非结构化数据,人们发现分段线性(piece-wise linear)函数

$$ \text{ReLU}(x)= \max(0, x) $$

具备更好的鲁棒性,并能够更快收敛。常见的激活函数可以参见下表。

Alt text

常见的神经网络类型

无环结构: 一层神经元的输出作为下一层神经元的输入,信息总是向前反馈。这一类型的神经网络也叫 Feed-forward Nerual Network。卷积网络(Convolutional Nerual Network)也包括在其中。

有环结构: 一层神经元的输出可以作为当前神经元的输入,即产生了反馈循环(feedback loop)。反馈环表示了神经网络的内部状态,使得网络的输出与之前的输入数据相关。如果把时间维度展开的话,有环结构也相当于随着时间走的无环结构。这一类型的神经网络也叫Recurrent Neural Network (RNN)。

Alt text

随机梯度下降

对于给定的网络拓扑结构,具体网络参数的确定其实是一个标准的优化问题。我们通过定义一个损失函数(cost function),来衡量当前神经网络的输出与我们期望的输出之间的距离。

$$ \arg\min_w \sum_x\text{Cost}(\text{Net}(x, w), y(x)) $$

我们构造的\(\text{Net}(x, w)\)\(w\)为参数的,\(x\)为输入的网络的输出值。而对\(w\)参数的寻找,在深度学习中最常用的是随机梯度下降法(Stochastic Gradient Descent)。其基本思想仍然是让变量沿着损失函数在目前参数的尽可能下降的方向进行调整

$$ w = w - \eta\triangledown\text{Cost} $$

其中 \(\eta\)称之为学习率,用以控制修改参数的激进程度。后面的讨论中我们会提到,其实严格按照梯方向更新并无必要,只需要确保更新能够降低损失函数即可。这个观察与Liang Huang etc.在前些年所发表的Structured Perceptron with Inexact Search可以进行类比。

如果我们能够得到参数\(w\)的 Hessian 矩阵,可以规避\(\eta\)选择的问题,但对于只采用梯度这样一阶信息的优化方法,如何选择学习率,是否能利用某个参数的历史更新信息来估算Hessian矩阵等,都是比较有意思的研究问题。有兴趣的朋友可以参考Schaul etc.的No More Pesky Learning Rates


讨论

感知机是 universal 的吗,即感知机是否能近似任意函数?

感知机可以表达与非门 NAND。而我们知道,在逻辑电路中,NAND 是 universal 的,即可以表示任意其他的逻辑门。

NOT(X) = NAND(X, X)

AND(X, Y) = NOT(NAND(X, Y))

OR(X, Y) = NAND(NOT(X), NOT(Y))

XOR(X, Y) = OR(AND(X, NOT(Y)), AND(Y, NOT(X)))

因此,计算机模拟的多层感知器可以模拟任何运算。特别的,XOR 的模拟亦可说明多层感知器在分类任务中可以完成非线性分类。

Alt text

感知机和 Sigmoid 等价吗?

Sigmoid 可以很容易用来模拟感知机或 step function 输出。为验证这一点,Sigmoid 的所有输入值扩大\(c\)倍(\(c \gg 1\)),即\(c(wx+b)\),除\(wx+b=0\)这个输入点,sigmoid的行为处处与感知器的输行为可以任意接近。利用讨论1的结论,可以证明二者等价。

打乱神经网络的输入顺序会影响学习的结果吗?

全连通的神经网络不会。因为这样的神经网络对输入数据没有区分,且输出是当下数据的最优解,即相对应的权重向量和bias。但局部连通的神经网络比如 Convolutional Nerual Network 就会有影响。

为什么不直接采用“有多少被错误分类的数据个数”作为 cost function 来评估神经网络的表现?

“有多少被错误分类的数据个数”虽然常常是我们优化的最终目标,但因为该函数并不属于凸函数(convex function),对其优化较为困难(事实上优化该 cost function 可以被证明是一个NP问题)。所以人们常采用凸函数作为其“代理”。相关资料可以参考 surrogate loss function

为什么梯度下降是朝着下降最快的方向?为什么随机梯度能够收敛?

根据 Cauchy-Schwarz 不等式,我们得知向量的点积\(\triangle\mathcal{C}\approx\triangledown\text{Cost}\cdot\triangle\mathcal{w}\),在\(\triangle\mathcal{w}\)和负梯度的夹角为0°时取得最小值。因此,在负梯度方向上,损失函数降的最快。并且只要变化向量\(\triangle\mathcal{v}\)和负梯度方向的夹角为锐角,\(\triangle\mathcal{C}\)即为负。因此,单个数据的下降方向虽然不是整体最优(下降最快)的方向,但只要是走在收敛的路上,就能使得函数逼近极值,因此可以收敛。

Alt text

下次讨论我们主要会围绕后向传播算法(backpropagation)及背后的直观意义,欢迎关注~