Tubi Talent Time:深度学习背后的数学原理

avatar
HR @Tubi

作者:陈强,Tubi Senior Machine Learning Engineer

前言

为了让团队更好地成长,我司 Tubi 中国团队前段时间正式启动了 TTT(Tubi Talent Time)的计划,每两周会有一个分享,可以是业务有关的,也可以是业务无关的,可以是技术相关的,也可以是技术无关的。我们有在各个领域做的非常杰出的工程师,之前的一次 TTT 是关于如何像读写硬盘一样读写内存,称之为 ramdisk,这个代码库,可以将内存当成硬盘用,用来提升读写速度,通过实现硬盘的读写协议可以达到这样的效果。同事还对其进行了优化,可以用 15G 的内存快速处理网络上上百 G 的文件。 我研究生阶段做了一些深度学习的研究,上周有幸被邀请来讲深度学习相关的内容,在这里做一个文字的总结,希望更多的人可以从中受益。

提纲

640.jpg

提纲

此文章目标是希望大家可以明白深度学习如何工作,并会有一些实际的代码让大家理解深度学习是如何实现的,这里代码例子是基于 Lua 语言,以及深度学习框架 Torch 实现的。 深度学习是机器学习当中的一种方法,为了更好地理解深度学习,这里还先准备了一些机器学习当中的重要概念。这里以机器学习或者深度学习当中分类和回归的问题为例,做一些讲解。 最后是介绍深度学习当中基于链式法则的反向传播算法。 另外还列出了一些深度学习的学习资源、书籍、视频和深度学习框架。

什么是深度学习

image.png

什么是深度学习,名字不重要

从维基百科上面来看,机器学习涵盖了非常多的内容:分类、聚类、回归、强化学习、有监督学习、无监督学习等等,其中深度学习是机器学习方法的一种,它也可以用来解决很多问题。除开深度学习,之外我们还会听到很多名词:人工智能、数据挖掘、模式识别、计算机神经网络等等。在很多情况下,这些名词可能都是指的同一个东西,这些名词并不重要,更重要的是我们知道这些东西可以做什么,是怎么工作的。所以更重要的是,你需要知道深度学习是什么工作的。在这之前我们先总结一下机器学习是怎么工作的。

机器学习:四个重要部分

image.png

机器学习四个重要部分:Digital Input、Digital Output、Criterion 和 Mapping

为了让数据可以存储,需要对我们存储的对象进行数字化,比如说眼睛看到的景物可以保存成 RGB 的照片格式,把听到的声音,保存成 MP3 格式,当然对同样的东西可以有各种各样的其它类型的格式,各种各样的格式有各种不同的目的。同样的为了解决分类或者回归的问题,我们需要对分类或者回归的对象进行数字化,对分类或者回归的目标进行数字化,使得我们的映射可以方便地从数字化的输入转换成数字化的输出。在这个过程当中,我们需要有一个标准或者 Criterion,来测量映射的好坏,这样我们可以通过这个标准选择一个最好的映射。

image.png

机器学习四个部分例子:识别图像是否为热狗

比如,对图片进行分类,判断图片是否为热狗。

  • Digital Input:为了让映射可以工作,可以把图片用 RGB 的标准,用 3 x {图片高度} x {图片宽度} 的矩阵表示图片
  • Digital Output:为了表示结果,是否为热狗,可以用二维向量 [0,1] 表示是热狗,用 [1,0] 表示不是热狗,当然也可以用数字 1 表示是热狗,0 表示不是热狗。
  • Criterion:可以简单地通过映射得到的结果和实际的结果,进行同样位置的数字的绝对值的比较,这样结果越小,表明映射的效果越好

image.png

机器学习四个部分例子:拥有智力的人做为映射,则不需要关注Digital Input、Digital Output和Criterion

当然如何选择 Digital Input,Digital Output,以及 Criterion 很大程度上取决于映射的设计。 如果有一个拥有智力的人在充当映射的角色,实际上的确有一些公司有这么干,对于验证码识别的任务,我们其实不需要对验证码作任务特别地数字化处理,只需要将图片打印在屏幕上,让拥有智力的人可以看到即可,另外智能的人可以直接在某个地方记录下看到的字母,不需要对这些输出进行特别的数字化处理。

image.png

房价预测的例子当中如何实现机器学习的四个部分

对于房价预测问题 Digital Input:房子的包括很多信息,这里为了简化,选取了三个重要的信息,用一个三维的向量表示一个房子,beds 表示床的个数,baths 表示洗手间的个数,area 表示房子面积。 Digital Output:用美元的单位来表示房子价格。 Mapping:用各个维度的数字乘以权重的和做为预测的房价,其中权重是未知数,可以通过选定不同的权重,达到不同的映射效果。 Criterion:用映射得到的结果与真实结果的绝对差值来测量映射的好坏。 如果你还是不清楚怎么回事的话, 还可以参考知乎专栏当中的《机器学习当中的4个关键部分》。

image.png

可以将cost表示成权重的函数

这里可以看出,可以将 cost 表示成权重的函数,那么如何对这些权重进行调整,可以达到降低 cost 的目的?为了表示这个过程,我们将对 cost 的函数进行简化以方便说明这个过程。

image.png

简化的cost的表达

这里将 cost 简化成 w1 的函数,单单从图片可以看出很容易可以发现,当w1=-1 时,cost 有最小值。当然可以通过随机尝试不同的 w1 找出可以将 cost 最小的那个 w1,但是如果 w1 的可选范围很大,需要枚举的数字很多,这种暴力枚举的方法将非常消耗时间。要实现计算机自动有效计算的话,因为知道 cost 对 w1 的导数,对于任意给定的一个 w1 的数值时,可以利用这时导数的结果,如果导数为正,这就意味着将 w1 减小一点点,cost 也会跟着减小。那么根据导数可以将 cost 不断变小,示例如下。

image.png

找到合适的数字(权重)

随机选中 w1,这里的例子是以 w1=0.5 _1=0.5 为例子,当 w1=0.5 时,其 cost 对 w1的导数为 6,为正数,这样将 w1 变小一点点,这里取,一点点 = 0.5 ,所以 w1 变成了 0,就这样持续这个过程,可以将 w1 变成想要的 -11 。

image.png

机器学习优化:真实的例子

image.png

机器学习优化:真实的例子,网络细节

这里有一个简单的代码实现的例子。点击阅读原文查看幻灯片,幻灯片当中有代码链接。或者直接打开这个代码链接:t.cn/RgJAQ6B。 Digital Input:一个二维的向量,其中包括 x1,x2x1, x2 Digital Output:一个数值,用 r 表示 Mapping:w1 \times x1 + w2 \times x2 + b图片其中 w1,w2,b 1,w2,b 是可以变化的数字 Criterion:用映射得到的结果与真实结果的差的平方来测量映射的好坏 Torch 当中 forward 方法就是取映射结果的方法,或者取 Criterion 的方法, backward 是用来计算导数的方法,导数的结果会放在特别的地方。 更多的细节可以参考知乎专栏当中的《梯度下降方法与求导》。

image.png

各种深度学习的网络

在之前的例子当中,我们看到为了将各个模块当中的未知数优化,使 cost 变小,需要 cost 对各个模块,各个未知数的导数,因为可以用它来指导我们对这些未知数进行变化,以达到使 cost 变小的目的。深度学习可以将多个映射叠加在一起,对输入进行多个映射处理,理论上多个映射叠加的表达能力将比单一的映射高,对映射其进行优化之后可以使 cost 变得更加得小,当前的很多网络可以达到上百层,甚至上千层。 这里以一个例子来展示求导链式法则是如何用来帮助 cost 对各个映射当中的可变参数进行求导。 image.png

求导链式法则,cost对f当中的变量求导

image.png

求导链式法则,f函数

image.png

求导链式法则,g函数

image.png

求导链式法则,k函数

image.png

求导链式法则,criterion函数

这里包含三个映射 f,g 和 k 在计算cost对图片w的导数时,利用到了 f 模块对自己参数图片的求导结果,g' 对 f' f'的求导结果(也就是 g 模块的输出对输入的求导结果),还有 y' 对 g' 的求导结果(也就是k模块的输出对输入的求导结果),还有 cost 对 y' 的求导结果。

image.png

求导链式法则,cost对g当中的变量求导

另外观察在计算 cost 对图片求导时,也利用类似模块的输出对输入的导数。

总的来说,只要模块(映射)提供了输出对输入的导数,以及输出对模块内的数字(它的名字还可以是未知数、权重、参数等等)的导数,就可以将它安插到我们的模型当中,成为模型的一部分,用链式法则将整个模型优化。点击阅读原文查看幻灯片,幻灯片当中有代码链接。或者打开这个代码链接:t.cn/RgJ2bly. 所谓深度学习炼丹就是设计或者说创造深度学习网络的过程,尝试在网络当中添加不同的映射,这里的映射也可以称之为模块之类的,创造不同的网络,利用梯度下降的方法对网络进行优化,观察哪种结构可以取得最好的效果,就像炼丹一样,用不同的原材料进行组合,看哪一种组合可以得到意想不到的效果,一次大会上有大牛提到炼丹这个词,炼丹一词就在深度学习领域流行开了。

创造网络的过程,也有点像堆积木,这里的小映射就是积木,不同的堆叠方式创造不同的网络结构,也可以自行创造积木,也可以通过组合原有的积木组成新的积木。学习深度学习的过程就像是堆积木的过程,堆的经验多了,就知道什么情况下,怎么设计网络会有效果。

更多学习资料

image.png

深度学习资料
  • 书籍:Deep Learning ,这本书是深度学习领域大牛 Ian Goodfellow 和 Yoshua Bengio 的作品,另还还有一位作者 Aaron Courville
  • 视频教程
    • 机器学习基础,如果你没有机器学习的基础,强烈推荐,cousera 上面Andrew Ng的机器学习的课程,上面的作业设计得非常好。
    • 深度学习,深度学习在计算机视觉方面有巨大的影响。我找到最好的教程是 Stanford 的 cs231n 的课程, Stanford 的课程主页上有很多非常好的作业的资料,此外可以在 youtube.com 上面才找到课程视频。这个课程的作业认真做,你会有很大的收获,如果都独立做完 ,那你对深度学习在计算机视觉上面的应用的理解至少能超过80%做视觉研究的硕士生。
  • 代码练习:如果是做研究的话可以用基于 Lua 语言的 Torch,有些学术作者发布的代码也是基于 Torch 的,如果是工业使用的话,可以用基于 Python 语言的 Pytorch。这两个框架的设计都非常优雅。

参考资料

[Video]Lecture 4 | Introduction to Neural Networks, Backpropagation, and Neural Networks t.cn/RgpLEoW

[Slides]Lecture 4: Backpropagation and Neural Networks t.cn/RdSvvmz

Torch | Developer Documentation, Define your own layer t.cn/RgpyUCd

知乎专栏:机器学习与数学--banana t.cn/RgpyVSZ