十年•杭研技术秀 | 从业务角度理解深度学习及其应用

社区编辑2018-05-15 18:28

2016年对于网易杭州研究院(以下简称“杭研”)而言是重要的 – 成立十周年之际,杭研正式推出了网易云。“十年•杭研技术秀”系列文章,由杭研研发团队倾情奉献,为您展示杭研那些有用、有趣的技术实践经验,涵盖云计算、大前端、信息安全、运维、QA、大数据、人工智能等领域,涉及前沿的分布式、容器、深度学习等技术。正是这些宝贵的实践经验,造就了今天高品质的网易云产品。

 

本文来自网易杭州研究院数据挖掘团队,作者根据项目实战经验,分享了深度学习的应用,包括一个用于图像理解的弱监督学习算法,和一个基于多维度建模的推荐算法。基于业界对深度学习存在误解的现象,作者在进入项目之前也对深度学习的概念、主流算法和关键步骤进行了科普,当然,也业务角度的理解。

 

近几年,深度学习在图像、音频处理等领域得到了广泛的应用并取得了骄人的成绩,本文根据笔者的工作实践,谈谈对深度学习理解,以及我们的应用和经验。文章涉及的很多结论,是笔者个人的理解和不充分实验的结果,所以难免谬误,请读者不吝指正。

 

机器学习就是学习对象的表示

 

“机器学习/深度学习模型依靠左右互搏,可以迅速达到很高的智能水准。”、“人工智能/深度学习能毁灭人类的奇点即将来到!” 网络上经常出现这类观点,让笔者非常惊讶,而让笔者更惊讶的是,很多人居然相信了。那么,什么是机器学习呢?

 

机器学习的对象是我们生活中所接触到的一切事物,这些事物包含自然界的事物,以及人类抽象出来的概念。笔者认为,机器对于这些对象的学习,本质上是使用机器语言对其特征进行表示。例如,对性别的识别,其实就是计算机将样本表达成男/女两种形式。

 

目前的计算机是以CMOS管为基础的冯诺依曼结构,其运算是线性的,数据的表达是0维度的。如何让低维度的计算机处理高维度的对象?这个表示的过程其实就是机器学习的过程。就如同处在二维空间的蚂蚁无法感知三维世界一样(图1),笔者认为目前的计算机0维的运算结构无法真正实现类似人类智能的人工智能,因为这种表示是不充分的。

 

图1  二维空间的蚂蚁无法感知三维世界

 

比如,自然界中的事物的有其独特的属性,同时是相互关联的,这些规律有的被人类发现,有的则依旧未知,同时数字的表达能力是有限的,如图2所示,这个是从英国地图的轮廓,如果使用数字只能够去逼近,永远无法进行准确描述。

 

图2 英国地图的轮廓

 

我们使用计算机对每个事物进行二进制编码可以区别每个事物,但却忽略了事物的属性以及相互之间的关联性。机器学习则是在人为设定的规律前提下,寻找对事物的表示,并在一定程度上保留这种关联性。

 

从宏观上看,笔者认为目前多数的人工智能可以视为一个表示和索引的过程:机器学习完成了表示,人工智能部分就是基于表示的索引。根据目标,我们可以用多种方法,将对象表达成多种数学结构、数字、向量、矩阵等等。下面就是对这些表达式进行存储,这些表达式具有明确的意义,比如男女分类中表达式就是用(0,1)和(1,0)分别表示男女两种模式。针对一幅照片进行预测时,我们首先需要寻找其表达式(0.3,0.7),在存储的模式中索引其表达的意义。

 

深度学习简述

 

简单地说,深度学习就是使用多层神经网络对对象进行表达。当然这里面衍生出了很多的具体技术和方法。下面简要介绍深度学习里面常用的概念和典型的网络,这些会在后续的项目实践中涉及。

 

卷积神经网络(Convolutional Neural Networks, CNN)

CNN是对传统的神经网络的简化。举个例子,1,000×1,000的图像,如果隐含层数目与输入层一样,即也是1,000,000时,那么输入层到隐含层的参数数据为1,000,000×1,000,000=10^12,当隐层不止一层,参数将是一个巨大的量级,现实中我们的硬件资源是有限的,所以引入了卷积神经网络。

 

卷积神经网络使用卷积核实现了两个目的:1,减少参数;2,对空间进行编码。

 

如何减少参数?

 

  • 采用局部连接取代全连接,即全局相关变成局部相关。基于这样一个现实,图片中像素点之间是存在空间相关性的,强度跟间距成负相关。所以笔者认为局部化实质上是相关性较弱的远处像素点,所以存在性能的损失。
  • 共享参数,基于这样的假设,相同距离的像素点之间的相关性相同,当然这也是一种无可奈何的折中。

 

循环神经网络(Recurrent Neural Networks, RNN)

 

RNNs的目的使用来处理序列数据,RNNs会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。

 

RNNs已经被实践证明对NLP是非常成功的,如词向量表达、语句合法性检查、词性标注等。在RNNs中,目前使用最广泛、最成功的模型便是LSTMs(Long Short-Term Memory,长短时记忆)模型。

 

神经网络的反馈算法

 

神经网络依靠反馈算法进行参数调整,实现将对象转化成所预期的数学表示。 ΔC 表示loss函数, 表示网络的权重,那么更新方程为:

 

 

上面是一个标准的偏微分的公式,一层一层地推导,又可以表示为:

 

 

上面是一个标准的链式偏微分公式。

 

损失函数

 

说到了损失函数(loss)函数,简单的讲就是对上面所说的规律的表达。下面简述下几个用过的损失函数和其特性。

 

方差损失函数

 

比如对于一个神经元(单输入单输出,sigmoid激活函数),定义其损失函数为:

 

 

其中 γ 是我们期望的输出, α 为神经元的实际输出。

 

在训练神经网络过程中,我们通过梯度下降算法来更新 ω 和 b,因此需要计算损失函数对 ω 和 b 的导数:

 

 

如何更新 ω 和 b ,才能使 C 减小?

 

即ΔC < 0, 由于 ,所以使时,可以保证 C 始终减小(平方始终大于等于0),所以 ω 和 b 的更新公式为:

 

 

因为Sigmoid函数的性质,导致 σ'(z) 在 z 取大部分值时会很小(如图3标出来的两端,几近于平坦),这样会使得 ω 和 b 更新非常慢(因为 δ*α*σ'(z) 这一项接近于0)。

 

图3 Sigmoid函数

 

交叉熵损失函数(cross-entropy cost function

 

为了克服这个缺点,引入了交叉熵损失函数(下面的公式对应一个神经元,多输入单输出):

 

 

其中 y 为期望的输出, α 为神经元实际输出。

 

 

当真实输出 α 与期望输出 y 接近的时候,损失函数接近于0。另外,它可以克服方差损失函数更新权重过慢的问题。我们同样看看它的导数:

 

 

可以看到,导数中没有 σ'(z) 这一项,权重的更新是受 σ(z)-y  这一项影响,即受误差的影响。所以当误差大的时候,权重更新就快,当误差小的时候,权重的更新就慢。这是一个很好的性质。

 

对数似然函数(log-likelihood cost)

 

深度学习中进行分类普遍的做法是将softmax作为最后一层,此时常用的是损失函数是log-likelihood cost

 

Logistic回归用的就是Sigmoid函数,softmax回归是Logistic回归的多类别推广。log-likelihood损失函数在二类别时就可以化简为交叉熵损失函数的形式,其中 y 可以取 k 个不同的值。因此,对于训练,我们有  。

损失函数为:

 

其中是模型的参数。  这一项对概率分布进行归一化。

 

经过求导,我们得到梯度公式如下:

 

调参技巧

 

网络设计好后,训练网络,进行调参是重头戏了。调参可以调节的参数很多,这里主要讲讲学习速率(η)和正则项系数(λ)和Batch Size。

 

学习速率

 

学习速率太小,则会使收敛过慢,如果学习速率太大,则会导致损失函数振荡。在训练过程中,可变学习率可以取得更好的效果。

 

正则项系数

 

在确定好learning rate后,给λ一个值(比如1.0),然后根据validation accuracy,将λ增大或者减小10倍(增减10倍是粗调节,当你确定了λ的合适的数量级后,比如λ = 0.01,再进一步地细调节,比如调节为0.02,0.03,0.009之类。)

 

Batch size

batch数太小,而类别又比较多的时候,真的可能会导致loss函数震荡而不收敛,尤其是在网络比较复杂的时候。Batch size太大,可以较快的收敛,但学习到的网络精度会比较低。一般根据GPU的内存,选择8的倍数,然后是稍微大一点。

 

本文未结束,敬请期待下篇。