首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >导论丨图说深度学习丨神经网络和 TensorFlow (附视频中字)

导论丨图说深度学习丨神经网络和 TensorFlow (附视频中字)

作者头像
CDA数据分析师
发布2018-02-26 17:19:23
6590
发布2018-02-26 17:19:23
举报
文章被收录于专栏:CDA数据分析师CDA数据分析师

CDA字幕组 编译整理

本文为 CDA 数据分析师原创作品,转载需授权

Youtube数据科学领域的热门博主sentdex,经常会分享关于Python和机器学习相关的教程,这次他用画图的形式讲解了深度学习、神经网络和TensorFlow。

CDA字幕组对该视频进行了汉化,附有中文字幕的视频如下:

视频内容

导论丨图说深度学习丨神经网络和TensorFlow

针对不方面开视频的小伙伴,CDA字幕组也贴心的整理了文字版本,如下:

大家近况如何,欢迎观看机器学习系列教程。我们将讲解深度学习、神经网络、TensorFlow当然还有Python。

神经网络以任何方式来看都不新奇,但它现在是最先进的。并且它正在取得如今其他机器学习模型无法达到的成就,而且是很新的。

虽然神经网络从20世纪40年代就已经诞生,但直到最近才彰显它的价值。在1940年代它更像是一种概念,掌握它并无用武之地。

随后的19世纪70年代初,1974年Paul Werbos提出一种中和阈值的方法,这个我们待会再讲。这个方法起到了一点作用,但神经网络基本上都没什么价值。

直到2011或2012年左右,出现了深度学习和海量数据集,我们提出的神经网络在做一些不可思议的事。甚至我将提到的第一个例子也是如此。我认为它非常强大,体现了神经网络如何创造出数据模型。

神经网络从生物学的角度获得灵感。

它在1940年代诞生,那时我们对大脑深层所知甚少。如今我们还是几乎一无所知,我们认识很多知识,但并不知道大脑的运作方式。这是由生物学的启发。没有必要去了解一切事物是如何运作的,或者我们是如何思考 学习的,更多的是我们认为我们会怎么想诸如此类。所以不管怎样,历史并不有趣,言归正传让我们开始神经网络的学习吧。

首先我们了解下神经网络的原理,以及它的运作形式。很明显神经网络是神经元的网络,那么基本的神经元长什么样呢?

我现在画的东西叫做树突(dendrite)。然后将树突连接在一起,接着得到了细胞核(nucleus),往下是一个个的轴突(axon)轴突末端(axon terminal)有很多弯弯曲曲的东西。所以蓝色箭头指向的是树突,就是这些。绿色的则是细胞核。接着是轴突最后是轴突末端。

神经网络拥有神经元网络,仅仅一个神经元不算两个才可以。第二个神经元在这儿。这些是树突,然后连接细胞核,再画出轴突和轴突末端。大功告成。现有的知识告诉我们,这两个神经元并不是真正地连结在一起。它们中间留有叫做突触(synapse)的部分,两神经元之间可以传递信息。

现在非常有趣的是,这些术语没有一个出现在神经网络中,即人工神经网络。所以每次我提到生物神经网络时,都会称为生物神经网络。但现在开始,我将人工神经网络称为神经网络。希望在讨论人工神经网络时你能明白。

非常有趣的是,在神经网络模型中不会用到树突、突触、轴突、轴突末端,总之不会用到它们,这真的很有意思。这是建模后的样子,这是我们试着建立的生物神经网络模型。发生了什么呢?

基本上你有了信息输入,在这种情况下看到红色箭头有三个输入。所以你从原始数据开始,可能依次是1 0 0之类的。这些输入进来,通过理论上的神经元,将数据输送到轴突。如果被激活的话则经过突触,传到下一个神经元。基本上就是这样。但有时候神经元没能激活,突触没有沟通等等。这是大脑中神经元工作的原理。

接下来我们来用下这个模型,建立神经元的模型,即我们怎样处理人工神经网络。那么让我们来进行建模。事实上,人工神经网络的神经元模型很相似。基本上一切都是从原始数据输入开始,最终它成为常规输入数据。

输入数据,我们有X1、X2和X3。事实上你可能会有更多的数据,比如刚刚提到的例子你会有784个初始输入值。所以很可能是一个庞大的数字。有了这些输入值之后,这些数据会构成一个总数。它们到时会进行加总,过程中会有权重。所以X1有权重1,X2有权重2,X3有权重3。每个都有独一无二的权重。因此你拿到这些原始数据后,将它们乘以各自的权重,全部相加就得到一个总数。现在,神经元根据输入,它可能激活也可能不激活。

如何决定它是否激活呢?它会经过一个阈值函数,大部分情况下被描绘成这样。有时候你会听到它被称作阶梯函数,因为它外形上很像一个阶梯。有时比如这个是0,一旦你经过了X特定的阈值,Y的返回值是1,正是y轴所在的地方。有时当你经过了特定的阈值会被激活,但若没用经过阈值则不会激活。

如果是人工神经网络则是对应数字0或1,两者中的一个。接着0和1,工神经网络中经过另一个人工神经元。0和1会转换成这些值之一。新的数据值到另一个连接的神经元,这个过程会继续,无论有多少隐蔽层。

现在你可能会有点困惑,这究竟是什么?让我们来看看,这是个单一神经元。通常人们不将阶梯函数作为阈值使用,因为0和1不合适。你宁愿选取那些有范围的等等。

因此通常情况下,人们不会使用阶梯函数,而是用S型函数。它之所以叫做S型函数,因为它的外形像S。这就是阈值函数,但它不再是阈值。实际上它称为激活函数。这是神经元的基本模型,但你构建网络时会分解。

输出Y是X和W的函数,此处这两者是向量 ,仅此而已。可能与S型函数会有一些关联,但在这里仅为X乘以W的函数。输入数据乘以权重。

这是一个神经元。现在让我们来看神经元网络的规模,看到神经元网络你大概会看到这样的内容。有X1、X2和X3,这是输入以及其他神经元。先是四个,再是三个,最后是一个。那接下来会发生什么呢?实际上再加两个,这无所谓。之后我们会讲到这点。

对于最基本的模型,所有输入数据都会经过神经元,这些都是相连的。每个连接都有唯一的相关权重,这些也是相连的。同样有唯一的权重,最后这些也两两相连,也有唯一的权重。这就是你的神经网络。这是你的输入,这是输入层。这个部分是隐蔽层1

这个部分是隐蔽层1,然后是隐蔽层2,最后是输出。

理论上输出会是1 0 1,可能有对应的内容。很多情况下 不会是1 0 1,在我们的例子中可能会是1 0 0或0 1 0等等。我会解释当中的原因。但对于我们的第一个例子这样可能更符合。

这是一个深度神经网络,我们刚刚建模的就是深度神经网络。为什么呢?因为这里有第二层隐蔽层,如果只有一层隐蔽层它就是常规神经网络。如果有两层及以上隐蔽层的话,那太棒了,你会得到一个深度神经网络。就这么简单。这就是为什么我不打算把神经网络和深度神经网络分开讲。因为它们其实是一回事,只是隐藏层的数目不同而已。在代码中你只是添加层数,但对建模来说 一层和十九层其实没什么差别。

那么有什么特别的?为什它过了这么久才渐渐成熟起来,最终成为我们所知最好的机器学习模型。

首先最关键的是,它需要大量的输入数据。

不是输入特征,这些是输入特征。它们不需要有很多,描述越多数量越大。但实际上,最大的问题是你拥有样本的数量。在第一个例子中我们使用训练的样本数量是6万。实际上是很少的,对于大多数做大型任务的商业神经网络来说,可能需要近5亿个样本。之后随着收益减弱不会再看到更好的结果了,但如今基本上需要这么多。

回想一下支持向量机(SVM),我们有一个凸优化(convex optimization)问题,在某种程度上说完美凸性。当你进行优化时,最优化的图像是这样的。所以如果想优化,你可以大步大步地提高,我们产生两大步,然后再小步,再更小。非常简单对吗?但是神经网络中你的优化图像可能像这样,有些奇怪的内容。所以优化问题并没有那么简单。

不仅如此,使用支持向量机时我们一般有两个变量W和B需要优化。然而在这个简单的神经网络中,我不准备计算这些线的数量。有很多连接,每条线都是唯一的权重。所以有很多独特的权重,这就有了很多变量。这是一个非常具有挑战性的优化问题,不仅是数学上的,对于计算的计算需求也是如此。而且你需要很多数据,因此需要很多样本、很多连接,样本数越多权重就越多。

如今我们现在有海量数据可用,以及有能处理和优化大量数据的计算机。所以当这两者结合在一起,使得神经网络得以改进并大放异彩。比方说简单的分类任务,神经网络与其它算法的表现很接近。比如支持向量机,假设在这个样本集上的正确率为97%,神经网络大概能达到98%或99%。就为了这么小小的1%的差别,有很多人在不断努力。人们花费很多年努力去弥补这小小的百分比差异,这非常重要。

但是对于我来说,这不如神经网络做的另一件事更让我感到雀跃。对于简单的分类工作确实做的不错,可以达到几乎相似的正确率,更让人惊叹的是神经网络的建模方面。实际上我们还不能完全理解,神经网络建立的模型到底是怎样运作的,但是它做得确实很好。可以挖掘和分析,启发我们揭示其中一些答案。

但由于我们面对的有很多变量,这还不太可能。比如我们来考虑这个问题: Jack 12岁,Jane 10岁,Kate比Jane大,比Jack小。那么Kate多少岁?你们大多数人可能没有跟上,但是如果你花时间想想,答案是11岁

为了得到这个答案,可能要运到一点逻辑。这是机器学习算法直到最近才能做到的。它们擅长分类之类的任务,但是它们不擅长逻辑建模,或者想出如何对逻辑建模,直到最近。

如果你想构建算法去回答刚才那个问题,你需要以某种方式去构建那个逻辑,你需要了解大量语言学之类的知识。然而有了神经网络,你就不需要如此了。给神经网络提供一堆样本,就像我读取的那些 与答案搭配起来,一直重复几百万次。结果神经网络就能自己弄清楚,弄清楚如何逻辑建模,这一切都可以自己完成。这就是神经网络最出色的地方。

人们可能会问,怎么获取像这样上百万的数据呢?

你有几个选择,至少是免费的。一个是图片数据,比如ImageNet。你可以谷歌搜索一下ImageNet,它类似WordNet,如果你有关注TK series。如果你不熟悉的话,可以随意了解一下NL、TK或者ImageNet,你就能弄明白。总之,对于图像数据你可以使用ImageNet。

接下来对于文本数据,第一站应该是Wikipedia Data Dump。你可以获得维基百科整个转储,这是很酷的。接着神经网络就可以帮你建模了。有了维基百科你可以做很多有趣的事。可以通过聊天日志、爬取reddit网站等等,得到输入和输出。对于语音,我确实想不到还没有听说过关于大型语音转储的东西。不过有一个网站tatoba。

我知道的最大的数据集同时免费的是Common Crawl。你们大多数可能没有能够运行Common Crawl的计算机,除非你的SLI有大量GPU。为了让主板能够承载,你在SLI中必须有更多的GPU。总之可能机构才会有,如果你的雇主有大型服务器或者你很有钱,而且你可以买AWS等等。Common Crawl是不错的选择。它达到千兆字节,你需要硬盘才能存储这么多字节,祝你好运。

在进行机器学习中主要的障碍是数据集的获取。去哪里找大量的数据?你能想象处理几亿个样本吗?比如说字迹。你可以去到reddit的机器学习分类看看,问问有谁熟知数据集。很多情况下谷歌搜索找不到数据集,但是我通过自己的研究我偶然发现了各种数据集。所以你可以在reddit的机器学习分类,或者类似的网站上问一问。其他人可能会知道这些数据集。

总之这是很明显的了,为什么Facebook和Google之类的大公司看重AI,尤其是神经网络领域。他们拥有大量的数据集去做一些有趣的事情。

那么现在抛开这些不谈,我们怎样利用神经网络工作呢?

我们将使用TensorFlow。这是谷歌开发的一个比较新的包,在我录这段视频时还处于测试阶段,还有其他包来进行机器学习。比如Diono和Torch 工作原理基本一致。因为这些都可以归结为,我之前所展示的根本就是关于X和W的函数,仅此而已。

如果学会用TensorFlow做这些,其他的也没问题了。只需学习不同的语法,实际建模部分一样。所以只需挑选一个框架,我选了TensorFlow。因为TensorFlow有一些功能,我如今和之后都会用到,比如说分布式运算之类的。

之后我们将在Ubuntu上安装TensorFlow,可能还要用到Windows的虚拟机。你如果想很好的跟着课程也想在Ubuntu上安装TensorFlow。在什么操作系统上安装其实不重要,我就继续用Ubuntu了,因为我的TensorFlow就在Ubuntu上。如果你的是Mac也可以在Mac上运行TensorFlow,也可以把TensorFlow放在Windows的Docker上。

如果你有问题、评论等请大胆留言。感谢收看,下次见。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CDA数据分析师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档