程序员入门深度学习

?xml version="1.0" encoding="UTF-8"?

摘要:作为一名软件工程师,我们应该活到老学到老,时刻与不断发展的框架、标准和范式保持同步。同时,还要能活学活用,在工作中使用最合适的工具,以提高工作效率。随着机器学习在越来越多的应用程序中寻得了一席之地,越来越多的程序员加入AI领域,那么,入行AI领域需要哪些技能呢?

人工智能到底有多火

我相信大家之所以能来看这篇文章,也间接说明了人工智能这几年的火爆。自从基于深度学习技术的算法2012年在ImageNet比赛中获得冠军以来,深度学习先是席卷了整个学术界,后又在工业界传播开来,一瞬间各大企业如果没有AI部门都不好意思对外宣传了。BAT中,百度宣布“All In AI”,阿里建立了达摩院及AI实验室,腾讯也在前不久会议上宣布“AI IN ALL”,并具有腾讯优图、AI Lab和微信AI实验室。

7 月 20 日,国务院发布《新一代人工智能发展规划》,为中国人工智能产业做出战略部署,对重点任务做出明确解析,抢抓重大机遇,构筑我国人工智能发展的先发优势。

技术的发展往往遵循一个可预期的模式,即先是萌芽,然后炒作,而后幻灭,接着才是技术成熟后的稳步爬升,最后到达应用高峰。研究分析机构Gartner每年都会推出这样一个分析新兴技术发展趋势的技术炒作周期报告。前段时间,Gartner发布了2017年的新兴技术炒作周期报告,报告聚焦了前端、后端与平台发展的三大趋势,提出了AI将无所不在(人工智能),体验将透明化和沉浸式(AR、VR),以及平台全面数字化(区块链)的观点,建议企业架构师和对技术创新有追求的人员应该积极探索和关注这三大趋势,从而了解掌握这三大趋势对自己公司和自己职业发展的未来影响。简单来说这三大趋势分别对应于括号中我备注的大家平时耳熟能详的词语。从曲线图可以看出,物联网、虚拟助手、深度学习、机器学习、无人车、纳米电子、认知计算以及区块链正处在炒作的高峰。实际上AR、VR属于计算机视觉,也可以归于人工智能范畴,因此总体上来说,未来人工智能将无处不在。

Gartner把深度学习、强化学习、常规人工智能、无人车、认知计算、无人机、会话式用户接口、本体管理(Ontology management)、机器学习、智能微尘、智能机器人、智能工作环境等均列为AI技术范畴。在人机大战等吸引眼球的活动助推下,很多AI技术目前正处在炒作的高峰期。比如深度学习、机器学习、认知计算以及无人车等。

对比2016年的炒作周期曲线可以发现,有些太过超前的概念仍然不愠不火,比如智能微尘。有些概念因为炒作过高已经迅速进入到了幻灭期,比如商用无人机去年还处在触发期,今年就已经接近幻灭期边缘了。相对而言,正处在炒作高峰的深度学习和机器学习技术有望在2到5年内达到技术成熟和模式成熟。

除了人工智能这么火之外,对于软件工程师,尤其是移动端开发工程师,有一点我们更要关注,那就是移动端深度学习逐渐成为新的深度学习研究趋势。未来会有越来越多的基于深度学习的移动端应用出现,作为开发者的我们了解深度学习更有助于我们开发出优秀的应用,同时提升自身能力,积极抓住机会,应对未来各种变化。

移动端深度学习框架开发维护方

NCNN腾讯

MDL百度

CoreMLApple

Tensorflow LiteGoogle

什么是机器学习(Machine Learning, ML)?

深度学习的基础是机器学习,事实上深度学习只是机器学习的一个分支。因此我们要入门深度学习就要先了解一些机器学习的基础知识。

机器学习最基本的做法,是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测。与传统的为解决特定任务、硬编码的软件程序不同,机器学习是用大量的数据来“训练”,通过各种算法从数据中学习如何完成任务。

有人曾举过一个例子,很形象生动,当你使用手机的语音识别进行唤醒时,有没有想过实现这一功能的全部内部流程呢?

我们日常交互的大部分计算机程序,都可以使用最基本的命令来实现,但是基于机器学习的程序却没有那么简单,想象下如何写一个程序来回应唤醒词,例如“Okay, Google”,“Siri”,和“Alexa”。如果在一个只有你自己和代码编辑器的房间里,仅使用最基本的指令编写这个程序,你该怎么做?不妨思考一下……这个问题非常困难。你可能会想像下面的程序:

ifinput_command=='Okey, Google':

run_voice_assistant()

但实际上,你能拿到的只有麦克风里采集到的原始语音信号,可能是每秒44,000个样本点。怎样才能识别出语音内容?或者简单点,判断这些信号中是否包含唤醒词。

如果你被这个问题难住了,不用担心。这就是我们为什么需要机器学习。

虽然我们不知道怎么告诉机器去把语音信号转成对应的字符串,但我们自己可以。换句话说,就算你不清楚怎么编写程序,好让机器识别出唤醒词“Alexa”,你自己完全能够识别出“Alexa”这个词。由此,我们可以收集一个巨大的数据集(data set),里面包含了大量语音信号,以及每个语音型号是否对应我们需要的唤醒词。使用机器学习的解决方式,我们并非直接设计一个系统去准确地辨别唤醒词,而是写一个灵活的程序,并带有大量的参数(parameters)。通过调整这些参数,我们能够改变程序的行为。我们将这样的程序称为模型(models)。总体上看,我们的模型仅仅是一个机器,通过某种方式,将输入转换为输出。在上面的例子中,这个模型的输入(input)是一段语音信号,它的输出则是一个回答{yes,no},告诉我们这段语音信号是否包含了唤醒词。

如果我们选择了正确的模型,必然有一组参数设定,每当它听见“Alexa”时,都能触发yes的回答;也会有另一组参数,针对“Apricot”触发yes。我们希望这个模型既可以辨别“Alexa”,也可以辨别“Apricot”,因为它们是类似的任务。

这时候你大概能猜到了,如果我们随机地设定这些参数,模型可能无法辨别“Alexa”,“Apricot”,甚至任何英文单词。在而大多数的深度学习中,学习(learning)就是指在训练过程(training period)中更新模型的行为(通过调整参数)。

换言之,我们需要用数据训练机器学习模型,其过程通常如下:

初始化一个几乎什么也不能做的模型;

抓一些有标注的数据集(例如音频段落及其是否为唤醒词的标注);

修改模型使得它在抓取的数据集上能够更准确执行任务(例如使得它在判断这些抓取的音频段落是否为唤醒词上判断更准确);

重复以上步骤2和3,直到模型看起来不错。

总而言之,我们并非直接去写一个唤醒词辨别器,而是一个程序,当提供一个巨大的有标注的数据集时,它能学习如何辨别唤醒词。你可以认为这种方式是利用数据编程。

如果给我们的机器学习系统提供足够多猫和狗的图片,我们可以“编写”一个喵星人辨别器:

喵喵汪汪

如果是一只猫,辨别器会给出一个非常大的正数;如果是一只狗,会给出一个非常大的负数;如果不能确定的话,数字则接近于零。这仅仅是一个机器学习应用的粗浅例子。

什么是机器学习算法?从本质上讲,机器学习采用了可以从数据中学习和预测数据的算法。这些算法通常来自于统计学,从简单的回归算法到决策树等等。

想要了解不同机器学习算法及其使用方法方面的内容,可以阅读这篇文章:机器学习算法要点。

什么是机器学习模型?一般来说,它是指在训练机器学习算法后创建的模型构件。一旦有了一个经过训练的机器学习模型,你就可以用它来根据新的输入进行预测。机器学习的目的是正确训练机器学习算法来创建这样的模型。

机器学习已广泛应用于数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、DNA序列测序、语音和手写识别、战略游戏和机器人等领域。虽然深度学习技术的发展,也促进了语音和文本领域的发展,但变化最显著的还是属于计算机视觉领域。而且由于作者是做计算机视觉的,因此这里也没法深入介绍语音和自然语言处理领域的过多细节,就简要介绍下计算机视觉领域的技术发展和相关的应用,后续的实验环节,大部分也会是基于深度学习的图像应用为主。

机器学习最简要素

针对识别唤醒语的任务,我们将语音片段和标注(label)放在一起组成数据集。接着我们训练一个机器学习模型,给定一段语音,预测它的标注。这种给定样例预测标注的方式,仅仅是机器学习的一种,称为监督学习。深度学习包含很多不同的方法,我们会在后面的章节讨论。成功的机器学习有四个要素:数据、转换数据的模型、衡量模型好坏的损失函数和一个调整模型权重来最小化损失函数的算法。

数据

越多越好。事实上,数据是深度学习复兴的核心,因为复杂的非线性模型比其他机器学习需要更多的数据。数据的例子包括:图片:你的手机图片,里面可能包含猫、狗、恐龙、高中同学聚会或者昨天的晚饭;文本:邮件、高中作文、微博、新闻、医嘱、书籍、翻译语料库和微信聊天记录等。

模型(Models)

通常,我们拿到的数据和最终想要的结果相差甚远。例如,想知道照片中的人是不是开心,我们希望有一个模型,能将成千上万的低级特征(像素值),转化为高度抽象的输出(开心程度)。选择正确模型并不简单,不同的模型适合不同的数据集。在这本书中,我们会主要聚焦于深度神经网络模型。这些模型包含了自上而下联结的数据多层连续变换,因此称之为深度学习(deep learning)。在讨论深度神经网络之前,我们也会讨论一些简单、浅显的模型。

损失函数(Loss Functions)

我们需要对比模型的输出和真实值之间的误差。损失函数可以衡量输出结果对比真实数据的好坏。例如,我们训练了一个基于图片预测病人心率的模型。如果模型预测某个病人的心率是100bpm,而实际上仅有60bpm,这时候,我们就需要某个方法来提点一下这个的模型了。

类似的,一个模型通过给电子邮件打分来预测是不是垃圾邮件,我们同样需要某个方法判断模型的结果是否准确。典型的机器学习过程包括将损失函数最小化。通常,模型包含很多参数。我们通过最小化损失函数来“学习”这些参数。可惜,将损失降到最小,并不能保证我们的模型在遇到(未见过的)测试数据时表现良好。由此,我们需要跟踪两项数据:

训练误差(training error):这是模型在用于训练的数据集上的误差。类似于考试前我们在模拟试卷上拿到的分数。有一定的指向性,但不一定保证真实考试分数。

测试误差(test error):这是模型在没见过的新数据上的误差,可能会跟训练误差很不一样(统计上称之为过拟合)。类似于考前模考次次拿高分,但实际考起来却失误了。(笔者之一曾经做GRE真题时次次拿高分,高兴之下背了一遍红宝书就真上阵考试了,结果最终拿了一个刚刚够用的低分。后来意识到这是因为红宝书里包含了大量的真题。)

优化算法(Optimization Algorithms)

最后,我们需要算法来通盘考虑模型本身和损失函数,对参数进行搜索,从而逐渐最小化损失。最常见的神经网络优化使用梯度下降法作为优化算法。简单地说,轻微地改动参数,观察训练集的损失将如何移动。然后将参数向减小损失的方向调整。

什么是深度学习

这是机器学习的一个子领域,近年来表现出了很大的潜力。它涉及到大脑中神经元结构和功能的算法。Andrew Ng曾用下图对比说明传统机器学习算法和深度学习算法的特点。从图中可以看出,随着数据的增多,到达一定量后,深度学习算法的表现会明显优于传统的机器学习算法。

深度学习中最令人激动的特性之一是它在**特征学习**上的表现。该算法在从原始数据中检测特征方面表现地特别好。有一个很好的例子,就是通过深度学习技术来识别汽车图片中的车轮。下图说明了典型机器学习与深度学习之间的区别:

在机器学习中特征选择部分一般需要人的先验知识的介入来设计好的特征提取方法,比如人知道轮子一般是圆的,一般出现在交通工具上,有轮胎、轮毂等部件,基于先验知识,人可以选取适合提取轮子特征的方法,再设计分类器以识别轮子。而深度学习通常由多个层组成。它们通常将更简单的模型组合在一起,通过将数据从一层传递到另一层来构建更复杂的模型。通过大量数据的训练自动得到一个能识别轮子的模型,不需要人工设计特征提取环节。这是深度学习随着数据量的增加而优于其他学习算法的主要原因之一。

随着深度学习的发展,为了方便算法人员训练模型,调整参数等,很多公司开源了优秀的深度学习框架,到目前为止,主要的深度学习框架如下图所示。目前工业界用的比较多的是Caffe和TensorFlow,Caffe主要在计算机视觉上用的较多,TensorFlow由谷歌开源,相关文档较好,适用范围广,基于Python语音,入门简单,建议新手入门可以选择TensorFlow。但是这些只是深度学习的平台框架而已,真正重要的还是学习好深度学习的理论,有了理论各种平台都不是问题。

TensorFlow简介

TensorFlow是专门为机器学习而设计的快速数值计算Python库,它由谷歌开源,旨在让世界各地更多的研究人员和开发人员掌握深度学习。为了加速深度学习领域的发展,2015年11月9日,Google发布深度学习框架TensorFlow并宣布开源。在短短的一年时间内,在GitHub上,TensorFlow就成为了最流行的深度学习项目。

TensorFlow在计算机视觉、语音识别、推荐系统和自然语言处理等场景下都有丰富的应用。虽然Tenforflow开源时间刚满一年,但是它正在以迅猛的速度渗入到我们的寻常生活中。它支持Linux平台,Windows平台,Mac平台,甚至还宣称要发布相应的移动端平台。其次,TensorFlow提供了非常丰富的深度学习相关的API,可以说目前所有深度学习框架里,提供的API最全的,包括基本的向量矩阵计算、各种优化算法、各种卷积神经网络和循环神经网络基本单元的实现、以及可视化的辅助工具、等等。

你可以按照官方的教程安装TensorFlow,安装好之后,你就可以用它提供的多个API来训练机器学习模型了。具体的教程可以参考TensorFlow官网http://www.tensorflow.org/,不想看英文的也可以参考TensorFlow中文社区-首页

虽然TensorFlow是最受欢迎的机器学习库,不过也有其他几个很棒的选择,如Torch(Facebook使用)、Caffe(出自Berkeley AI研究所的深度学习框架)等等。其中Caffe是第一个在工业上得到广泛应用的开源深度学习框架,也是第一代深度学习框架里最受欢迎的框架,目前也有很多企业和科研人员在使用。

学习资源

一旦对基础知识有了一定的了解,你应该知道自己对机器学习的哪些方面比较感兴趣,你想在应用程序中使用机器学习,还是想研究机器学习。下面是一些优秀的参考资料,可以帮助你系统的学习。

书籍:

深度学习技术发展迅速,各种平台框架也迭代很快,推荐相关的书籍其实不太好推荐。在这里我只推荐两本书:

第一本是《白话深度学习与TensorFlow》,这本书写的非常通俗易懂,没有太多理论知识介绍,基本是深度学习的基础知识和TensorFlow的相关例程,适合没有深度学习基础,想入门深度学习的人看。

第二本是美国Ian,Goodfellow 写的《Deep Learning》,这本书有中文翻译版《深度学习》,但是这本书基本是讲深度学习理论的,没有基础的话很难看懂,但是翻译者提供了PDF在GitHub上,想看的可以去下载:https://github.com/exacity/deeplearningbook-chinese

网络资源:

对于新手入门个人觉得很多网上的手册、教程和博客都很不错。这篇文章主要面向零基础的想了解DeepLearning的人员,太复杂专业的暂时就不推荐了,一下是一些基础的入门资源。

莫烦Python:这是一个在澳大利亚读博的中国人,他会讲Python和深度学习的教程,有视频。Python基本是现在做深度学习的必会语言了,喜欢的可以去这里学习。https://morvanzhou.github.io/about/

台湾李宏毅教授的在线课程:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17_2.html,还有一个300多页的ppt,比较系统,也最通俗易懂的,这是slideshare的链接:http://www.slideshare.net/tw_dsconf/ss-62245351?qid=108adce3-2c3d-4758-a830-95d0a57e46bc&v=&b=&from_search=3

TensorFlow中文社区-首页:http://www.tensorfly.cn/

结语

“整个世界就是一个大数据问题” - Andrew McAfee

掌握机器学习就像是驯服一头野兽。但是,如果你已经吃透它,那么它就是你身边一个非常有价值的资源。暂时想到的就这么多,愿大家一同进步……

参考资料:

1.https://udarajay.com/applied-machine-learning-the-less-confusing-guide/?spm=5176.100239.blogcont223187.31.wGjoeK

2.http://zh.gluon.ai/chapter_preface/index.html

你可能感兴趣的:(程序员入门深度学习)