当前位置: 首页 > 编程日记 > 正文

用高中数学理解AI “深度学习”的基本原理

本文作者尚俊霖,全职产品经理,业余自学机器学习。最近开始写硬核科普,欢迎关注公众号欠拟合(ID:Underfit)。


Google 研发了十年自动驾驶后,终于在本月上线了自动驾驶出租车服务。感谢“深度学习”技术,人工智能近年来在自动驾驶、疾病诊断、机器翻译等领域取得史无前例的突破,甚至还搞出了些让人惊艳的“艺术创作”:

640?wx_fmt=jpeg

Prisma 把你的照片变成艺术作品


640?wx_fmt=gif

AI 生成的奥巴马讲话视频,看得出谁是本尊吗?


640?wx_fmt=jpeg

开源软件 style2paints 能自动给漫画人物上色


如果不了解其中的原理,你可能会觉得这是黑魔法。


640?wx_fmt=jpeg


就像爱情,“深度学习”虽然深奥,本质却很简单。无论是图像识别还是语义分析,机器的“学习”能力都来源于同一个算法 — 梯度下降法 (Gradient Descent)。要理解这个算法,你所需要的仅仅是高中数学。在读完这篇文章后,你看待 AI 的眼光会被永远改变。


一个例子

我们从一个具体的例子出发:如何训练机器学会预测书价。在现实中,书的价格由很多因素决定。但为了让问题简单点,我们只考虑书的页数这一个因素。

在机器学习领域,这样的问题被称为“监督学习 (Supervised Learning)”。意思是,如果我们想让机器学会一件事(比如预测书的价格),那就给它看很多例子,让它学会举一反三(预测一本从未见过的书多少钱)。其实跟人类的学习方法差不多,对吧?

现在假设我们收集了 100 本书的价格,作为给机器学习的例子。大致情况如下:

640?wx_fmt=png

接下来我们要做两件事:

  1. 告诉机器该学习什么;

  2. 等机器学习。


告诉机器该学什么

为了让机器听懂问题,我们不能说普通话,得用数学语言向它描述问题,这就是所谓的“建模”。为了让接下来的分析更直观,我们把收集回来的例子画在数轴上:

640?wx_fmt=png

我们希望机器通过这些样本,学会举一反三,当看到一本从未见过的书时,也能预测价格。比如说,预测一本480页的书多少钱:

640?wx_fmt=png

480页的书多少钱?

观察图表,我们能看出页数和书价大致上是线性关系,也就是说,我们可以画一根贯穿样本的直线,作为预测模型。

640?wx_fmt=png

如果我们把页数看作 X 轴,书价看作 Y 轴,这根直线就可以表示为:

640?wx_fmt=png

w 决定直线的倾斜程度,b 决定这根直线和 Y 轴相交的位置。问题是,看起来有很多条线都是不错的选择,该选哪条?换句话说 w 和 b 该等于多少呢?

640?wx_fmt=gif

每根直线都是一个候选的模型,该选哪个?

显然,我们希望找到一根直线,它所预测的书价,跟已知样本的误差最小。换句话说,我们希望下图中的所有红线,平均来说越短越好。

640?wx_fmt=png

红线的长度,就是模型(蓝色虚线)预测的书价,和样本书价(蓝点)之间的误差。

红线的长度等于预测书价和样本书价的差。以第一个样本为例,55 页的书,价格 69 元,所以第一根红线的长度等于:

640?wx_fmt=png

因为绝对值不便于后面的数学推导,我们加个平方,一样能衡量红线的长度。

640?wx_fmt=png

因为我们的预测模型是:

640?wx_fmt=png

所以

640?wx_fmt=png

这个样本是一本 55 页,69 元的书。

算式开始变得越来越长了,但记住,这都是初中数学而已!前面提到,我们希望所有红线平均来说越短越好,假设我们有 100 个样本,用数学来表达就是:

640?wx_fmt=png

至此,我们把“预测书价”这个问题翻译成数学语言:“找出 w 和 b 的值,使得以上算式的值最小。”坚持住,第一步马上结束了!

我们现在有 2 个未知数:w 和 b。为了让问题简单一点,我们假设 b 的最佳答案是 0 好了,现在,我们只需要关注 w 这一个未知数:

640?wx_fmt=png

把括号打开:

640?wx_fmt=png

在机器学习领域,这个方程被称为“代价 (cost) 函数”,用于衡量模型的预测值和实际情况的误差。我们把括号全打开:

640?wx_fmt=png

不用在意方程中的数字,都是我瞎掰的。

至此,我们把“预测书价”这个问题翻译成数学语言:“w 等于多少时,代价函数最小?”第一步完成!到目前为止,我们只用上了初中数学。


机器是怎么学习的

代价函数是个一元二次方程,画成图表的话,大概会是这样:

640?wx_fmt=png

不用在意坐标轴上的具体数字,都是我瞎掰的。

前面讲到,机器要找到一个 w 值,把代价降到最低:

640?wx_fmt=png

机器采取的策略很简单,先瞎猜一个答案(比如说 w 等于 20 ,下图红点),虽然对应的代价很高,但没关系,机器会用“梯度下降法”不断改进猜测。

640?wx_fmt=png

如果你微积分学得很好,此时可能会问:求出导数函数为 0 的解不就完事了吗?在实际问题中,模型往往包含上百万个参数,它们之间也并非简单的线性关系。针对它们求解,在算力上是不现实的。

现在,我们得用上高中数学的求导函数了。针对这个瞎猜的点求导,导数值会告诉机器它猜得怎么样,小了还是大了。

640?wx_fmt=png

如果你不记得导数是什么,那就理解为我们要找到一根直线,它和这条曲线只在这一个点上擦肩而过,此前以后,都无交集(就像你和大部分朋友的关系一样)。所谓的导数就是这根线的斜率。

我们可以看得出,在代价函数的最小值处(即曲线的底部)导数等于 0。如果机器猜测的点,导数大于 0,说明猜太大了,下次得猜小一点,反之亦然。根据导数给出的反馈,机器不断优化对 w 的猜测。因为机器一开始预测的点导数大于 0 ,所以接下来机器会猜测一个小一点的数:

640?wx_fmt=png

机器接着对新猜测的点求导,导数不等于 0 ,说明还没到达曲线底部。

640?wx_fmt=png

那就接着猜!机器孜孜不倦地循环着“求导 - 改进猜测 - 求导 - 改进猜测”的自我优化逻辑 —— 没错,这就是机器的“学习”方式。顺便说一句,看看下图你就明白它为什么叫做“梯度下降法”了。

640?wx_fmt=png

终于,皇天不负有心机,机器猜到了最佳答案:

640?wx_fmt=png

就这样,头脑简单一根筋的机器靠着“梯度下降”这一招鲜找到了最佳的 w 值,把代价函数降到最低值,找到了最接近现实的完美拟合点。

总结一下,我们刚刚谈论了三件事:

  1. 通过观察数据,我们发现页数与书价是线性关系——选定模型;

  2. 于是我们设计出代价函数,用来衡量模型的预测书价和已知样本之间的差距——告诉计算机该学习什么;

  3. 机器用“梯度下降法”,找到了把代价函数降到最低的参数 w ——机器的学习方法。

机器“深度学习”的基本原理就是这么简单。现在,我想请你思考一个问题:机器通过这种方法学到的“知识”是什么?


现实问题中的深度学习

为了让数学推演简单点,我用了一个极度简化的例子。现实中的问题可没那么简单,主要的差别在于:

现实问题中,数据的维度非常多。

今天在预测书价时,我们只考虑了页数这一个维度,在机器学习领域,这叫做一个“特征 (feature)”。

但假设我们要训练机器识别猫狗。一张 200 * 200 的图片就有 4 万个像素,每个像素又由 RGB 三个数值来决定颜色,所以一张图片就有 12 万个特征。换句话说,这个数据有 12 万个维度,这可比页数这一个维度复杂多了。好在,无论有多少个维度,数学逻辑是不变的。

现实问题中,数据之间不是线性关系。

在今天的例子中,页数和书价之间是线性关系。但你可以想象得到,猫照片的 4 万个像素和“猫”这个概念之间,可不会是简单的线性关系。事实上两者之间的关系是如此复杂,只有用多层神经网络的上百万个参数(上百万个不同的 w:w1, w2, ..., w1000000)才足以表达。所谓“深度”学习指的就是这种多层网络的结构。


说到这里,我们可以回答前面的问题了:机器所学到的“知识”到底是什么?

就是这些 w。

在今天的例子中,机器找到了正确的 w 值,所以当我们输入一本书的页数时,它能预测书价。同样的,如果机器找到一百万个正确的 w 值,你给它看一张照片,它就能告诉你这是猫还是狗。

正因为现实问题如此复杂,为了提高机器学习的速度和效果,在实际的开发中,大家用的都是梯度下降的各种强化版本,但原理都是一样的。

(*本文仅代表作者独立观点,转载请联系原作者)


公开课预告

强化学习


本课程是一次理论+实战的结合,将重点介绍强化学习的模型原理以及A3C模型原理,最后通过实践落实强化学习在游戏中的应用。


640?wx_fmt=jpeg


推荐阅读:

  • 刘铁岩谈机器学习:随波逐流的太多,我们需要反思

  • 清华首批7门标杆课程,到底有多牛?

  • 老程序员肺腑忠告:千万别一辈子靠技术生存!

  • Java JDK 收费,Android 也坐不住了,程序员们该咋办?

  • 程序员有话说|外包程序员,混得最差劲

  • IPFS 深入浅出:从《黑镜》说起

  • 云计算的概念 - 初识云计算知识专栏(1)

  • 这个用Python编写的PDF神器你值得拥有!

  • 春运抢票靠加速包?试试这个Python开源项目吧

相关文章:

Linux I2C工具查看配置I2C设备【转】

转自:http://blog.chinaunix.net/uid-26895763-id-3478882.html 在處理音訊相關的問題時,我通常會找個方法來讀寫codec中register的值。幸好linux上也有這樣的工具 – i2c tools。先到lm-sensors下載soure code,然後cross compile成arm的執行…

Ruby之类定义

介绍几种不常见的类定义方法: 1. Struct PersonStruct.new(:name,:age,:sex)pPerson.new("liyuchun")puts p Struct生成一个仅仅包含数据属性的类。但是你可以在这个类的基础上扩展: PersonStruct.new(:name,:age,:sex)class Persondef …

引用 引用 引用 学会求知 学会共处 学会做人 学会做事

◆学历不等于能力和水平,学校学到的在社会能用上的只有15%,而在社会能学到85%。◆世上很多发生的事必有其原因,必有其结果,必有其收获。◆心态归零,天道酬勤。◆老板是私营企业家,赚了小钱是自己的&#xf…

python写一个通讯录step by step V3.0

python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数、字典、模块调用 注意问题: 1、更优美的格式化输出 2、把日期换算成年龄 3、更新操作做的更优雅 准备工作 db准备…

#每天一种设计模式# 模板方法

《松本行弘的程序世界》对模板方法(Template method)的说明非常清晰: 在父类的一个方法中定义算法的框架,其中几个步骤的具体内容则留给子类来实现。 比如一个用于公司欢迎同事的程序: class Adef initializename "jinbin"word …

如何更好地玩转GitHub?

本文作者黄昱俊,国资企业投资部总经理,主要负责投资部门建设、投资流程管理、投后资源管理。历经10年,从医疗器械研发工程师到投资管理的蜕变,业余尝试ETF量化投资。 本文介绍如何在GitHub上更新Fork以及PullRequest给源项目。 在…

System Center Data Protection Manager 2007补助说明

在 DPM 服务器上配置 Windows 防火墙 1. 在 Control Panel(控制面板)中,单击 Windows Firewall(Windows 防火墙)。2. 在 General(常规)选项卡中,验证是否已开启 Windows 防火墙&am…

可伸缩系统的设计模式(译)

Ricky Ho在他的博客中分享了该文章,该文章是一个简单的概括分享,详细的可以参见他博客的其它详细文章。下面主要是意译。 1、Load Balancer:负载均衡 – 由分发者来决定哪个工作者处理下一个请求,这种决定可以基于不同的策略。 “…

Boson_Netsim_6使用方法

使用说明: netsim6.0只有在英文操作系统下才能释放出正确的pdf文件,大家可以到文档中心下载以下3个pdf文件: SequentialLabs.pdf:解压后复制到安装目录下的\MyLabs\ccna_sequential\Sequential Labs (CCNA)\common中覆盖相应的文件…

Ruby之Enumerator类

今天发现了Ruby1.8.6和 Ruby1.9.2的一个不同之处,试运行以下代码: require findputs Find.find("./data").class 在Ruby1.9.2中,最后的结果是Enumerator,而在Ruby1.8.6中,结果则是find: no block given (L…

澎思科技获IDG资本数千万元Pre-A轮融资  推出AI安防全场景软硬件解决方案

1月8日,人工智能安防公司澎思科技宣布完成数千万元 Pre-A 轮融资,该轮融资由 IDG 资本领投,高捷资本、上古资本、洪泰基金跟投。澎思科技表示,此轮融资会更多用来“修炼内功”,进一步夯实公司的技术研发和产品落地能力…

看linux书籍做的一些重要笔记(2011.07.03更新)

(1)制作启动盘 •用户可以用dd,cat,cp等命令自行将这些image文件制作成启动盘。 •例如: •ddif/mnt/cdrom/RedHat/images/bootdisk.img of/dev/fd0 •cp /mnt/cdrom/RedHat/images/bootdisk.img /dev/fd0 •cat /mnt…

C++ Primer 读书笔记 (1)

我的《C Primer》扉页记着购书的日期和地点:C Primer 2009.11.28购于西区求索。那时对于这本厚书一直心怀敬畏,仿佛是眼前的一座大山。那时,虽然已经大四,但是对于面向对象的理解还很肤浅(相当肤浅),只能用C编写一些简…

招聘:兼职ASP 高级工程师

工作职责:1、负责ASP网站设计和页面制作;2、配合运营团队做客户服务支持;3、参与海洋工作室其他相关设计工作。 职位描述: 1. 要求有很强大ASP开发功底;2. SQL Server使用经验;3. 有与策划者和美工合作的习惯;4. 可独立开发&…

GitHub重大好消息:私有仓库可无限制免费创建

作者 | 一一 出品 | AI科技大本营 GitHub 被微软收购之后,第一次公布了有利于广大程序员的好消息。 1 月 8 日,GitHub 宣布无限制的免费为普通用户提供私有仓库服务,这给程序员每年省下了 84 美元。此前,企业要创建私有仓库进行代…

“AI下乡”:华为和袁隆平一起种海水稻,欲改造1亿亩良田

作者| 琥珀 出品| AI科技大本营我们总是无法忘怀“杂交水稻之父”袁隆平的名字,即便后来很多学者对他的成就有所争议。距今,三系杂交水稻的发现已经过去了 50 多年,袁隆平也近 90 岁高龄,但他依然活跃在农业生产一线。想必近日不少…

finecms设置伪静态后分享到微信不能访问怎么处理

finecms设置伪静态后分享到微信不能访问,分享的链接自动增加了一串参数,类似这样的***.html?fromsinglemessage&isappinstalled0,刚开始ytkah没注意,以为是微信屏蔽了不安全网址,后面在论坛上问了一下&#xff0c…

Access和SQL server开启表间关系,并实现更新或删除母表数据自动更新或删除子表数据...

1.Access开启表间关系,并实现删除母表数据自动删除子表数据: 在Tables等界面 - > 右键 - > Relationships... -> 弹出Relationships窗口 -> 选择需要关联的表 -> 双击Relationships窗口空白位置 -> 弹出 Edit Relationships 窗口 -> 就可以看到Enforce Re…

推荐并简要分析一个silverlight的相册DEMO--ImageSnipper(V2)

下面就是它的一些演示截图。 首先是缩放,旋转和透明处理:然后是文字水印处理:然后是使用Ink的涂鸭:相信做为一个相册(图片浏览)的基本功能已经没什么问题了。下面来看一下这个DEMO的类图&#xff…

Ruby之Tempfile

今天又机会尝试了下Ruby的Tempfile库,相比于自己创建临时文件再删除的方法简便了很多。 require tempfiletmp Tempfile.new("tmp")tmp.path # > /tmp/tmp20110928-12389-8yyc6w 不唯一tmp.write("This is a tempfile") tmp.rewind tmp.read…

快车 FlashGet 3.1 修正版(1057)

快车 FlashGet 3.1 修正版(1057) SM发布于 2009-06-25 23:43:23| 2326 次阅读 字体:大 小 打印预览感谢VxuE的投递快车(FlashGet)是互联网上最流行,使用人数最多的一款下载软件.采用多服务器超线程技术、全面支持多种协议,具有优秀的文件管理功能.快车是绿色软件,无…

Python模拟微博登陆,亲测有效!

作者 l 上海小胖 来源 l Python专栏(ID:xpchuiit)转载请联系授权(微信ID:pythonzhuanlan)今天想做一个微博爬个人页面的工具,满足一些不可告人的秘密。那么首先就要做那件必做之事&#xff01…

Ruby调用shell命令

原来发在diandian的几篇旧闻,也一并转到iteye上来吧。 1. exec exec echo "hello $HOSTNAME" 用echo命令来取代当前进程,无法知道命令是否成功 2. system system(echo "hello $HOSTNAME") 运行一个子shell来避免覆盖当前进程&a…

mac os下valgrind的安装

valgrind是一款性能分析工具,功能强大。 在mac os下的安装略有不同,特写此文以记之。 现在最新的版本是3.8.1 tar jxvf valgrind-3.8.1.tar.bz2 cd valgrind-3.8.1 ./configure sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer m…

Google Voice开始发送邀请函

今天收到了Google Voice的邀请函,标题为“Youve been invited to Google Voice”。最近关于Google Voice 的新闻不少,出于好奇登录http://www.google.com/voice 递交了申请,没有想到这么快得到了邀请函。邮件特别强调“ Please note that Goo…

Python开发(基础):字符串

字符串常用方法说明 #!/usr/bin/env python # -*- coding:utf-8 -*- # class str(basestring): # """ # str(object) -> string # # Return a nice string representation of the object. # If the argument is a string, the return value …

Linux与Windows文件共享命令 rz,sz

一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地; 与ssh有关的两个命令可以提供很方便的…

Python爬虫小偏方:如何用robots.txt快速抓取网站?

作者 | 王平,一个IT老码农,写Python十年有余,喜欢分享通过爬虫技术挣钱和Python开发经验。来源 | 猿人学Python在我抓取网站遇到瓶颈,想剑走偏锋去解决时,常常会先去看下该网站的robots.txt文件,有时会给你…

八百客与51CTO结了梁子?

转载于:https://blog.51cto.com/simon/171348

特斯拉“撞死”机器人,是炒作还是事故?

作者 | 若名出品 | AI科技大本营科幻片里机器人大战的剧情可能离人类还很遥远,但设想一下,现实中机器人不受控制的打起架来...1 月 6 日,一辆处于自动驾驶模式的特斯拉 Model S “撞死”了一辆掉队 Promobot 的机器人。本次撞击事件发生在当地…