2022-08-29  2022-09-01    56983 字  114 分钟

好吧,内容不少,为了后续插入图片之后 ,页面太大,我们这里拆分到两个页面中。

26. 图形用户界面

i.e. Graphical User Interfaces

(。・∀・)ノ゙嗨 我是 Carrie Anne 欢迎收看计算机科学速成课。

我们上集最后 ,谈了苹果在 1984 年发布的 Macintosh ,这是普通人可以买到的 第一台带图形用户界面的计算机,还带一个鼠标。那时的计算机全是命令行, 图形界面是个革命性进展,不必记住或猜正确的命令,图形界面直接显示了,你可以做什么,只要在屏幕上找选项就行了。这是一个"选择并点击"的界面,突然间计算机更直观了。不只是爱好者或科学家能用计算机 ,任何人都可以用计算机解决问题。

人们认为是 Macintosh 把图形用户界面(GUI)变成主流,但实际上图形界面是数十年研究的成果。前几集,我们讨论了早期的交互式图形程序,比如 Sketchpad 和太空战争 都是 1962 年制作的,但都是一次性项目,不是整合良好的体验,现代图形界面的先驱 可以说是 道格拉斯·恩格尔巴特。

让我们进入思想泡泡!

二战期间 恩格尔巴特 驻扎在菲律宾做雷达操作员,他读了 万尼瓦尔·布什 的 Memex 文章,这些文章启发了他。当他海军服役结束时,他回到学校 1955 年在 UCB 取得博士学位,他沉溺于新兴的计算机领域,他在 1962 年一份开创性报告中 汇集了各种想法,报告名为:“增强人类智力”。恩格尔巴特认为,人类面临的问题 比解决问题的能力增长得更快,因此,找到增强智力的方法 似乎是必要且值得一做的目标。他构想计算机不仅做自动化工作,也可以成为未来知识型员工 应对复杂问题的工具。

伊凡·苏泽兰 的"几何画板" 进一步启发了 恩格尔巴特,他决定动手把愿景变为现实 开始招募团队来做 oN-Line System ,他意识到如果只有键盘 ,对他想搭建的程序来说是不够的。用他的话说:“我们设想人们用计算机辅助工作站来增强工作,用户需要和屏幕上的信息互动,用某种设备在屏幕上移动 [光标]"。

1964 年,和同事比尔·英格利希的共同努力下,他创造了第一个计算机鼠标,尾部有一根线,看起来很像老鼠 因此"鼠标"这个名字沿用了下来。

谢了思想泡泡!

1968 年 恩格尔巴特 在"秋季计算机联合会议"展示了他的系统 ,这次演示 被视为如今所有演示的祖先,演示有 90 分钟 展现了现代计算机的许多功能:包括 位图图像、视频会议、文字处理和实时协作编辑文件,还有现代图形界面的原型 - 比如鼠标和多窗口, 不过窗口不能重叠,远远先于那个时代。

就像其它"跨时代"的产品一样,它最终失败了,至少商业上是这样,但它对当时的计算机研究者影响巨大,恩格尔巴特 因此获得 1997 年图灵奖。

政府资金在 1970 年代初开始减少,我们在两集前说过(第 24 集:冷战和消费主义)。那时,恩格尔巴特团队里的许多人,包括比尔·英格利希去了施乐公司新成立的"帕洛阿尔托研究中心”,更为人熟知的名字是 Xerox PARC 。他们在这里开发了第一台带真正 GUI 的计算机:施乐奥托 , 于 1973 年完成。为了让计算机易于使用,需要的不只是花哨的图形,还要借助一些人们已经熟悉的概念,让人们不用培训 就能很快明白如何使用。施乐的答案是将 2D 屏幕当作"桌面",就像桌面上放很多文件一样,用户可以打开多个程序 每个程序都在一个框里,叫"窗口",就像桌上的文件一样。窗口可以重叠,挡住后面的东西,还有桌面配件,比如计算器和时钟。用户可以把配件在屏幕上四处移动,它不是现实桌面的完美复制,而是用桌面这种隐喻,因此叫"桌面隐喻"。有很多方法来设计界面, 但 Alto 团队用窗口,图标,菜单和指针来做 - 因此叫 WIMP 界面。如今大部分图形界面都用这个,它还提供了一套基本部件,可复用的基本元素, 比如按钮,打勾框,滑动条和标签页,这些也来自现实世界,让人们有熟悉感,GUI 程序就是这些小组件组成的。

让我们试着写一个简单例子。

首先,我们必须告诉操作系统 为程序创建一个窗口
我们通过 GUI API 实现 需要指定窗口的名字和大小
假设是 500×500 像素
现在再加一些小组件,一个文本框和一个按钮
创建它们需要一些参数

首先要指定出现在哪个窗口 因为程序可以有多个窗口
还要指定默认文字窗口中的 X,Y 位置  以及宽度和高度

好,现在我们有个 看起来像 GUI 程序的东西
但它还没有功能
如果点 Roll 按钮,什么也不会发生

在之前的例子中,代码是从上到下执行的
但 GUI 是 "事件驱动编程"
代码可以在任意时间执行 以响应事件
这里是用户触发事件 比如点击按钮,选一个菜单项,或滚动窗口
或一只猫踩过键盘
就会一次触发好多事件!

假设当用户点 Roll 按钮
我们产生 1 到 20 之间的随机数
然后在文本框中,显示这个数字
我们可以写一个函数来做
我们还可以让它变有趣些,假设随机数是 20 就把背景颜色变成血红色!
最后,把代码与"事件"相连 每次点按钮时  都触发代码

那么,要设置事件触发时 由哪个函数来处理
我们可以在初始化函数中,加一行代码来实现
我们要处理的,是"点击"事件 然后函数会处理这个事件

现在完成了

可以点按钮点上一整天 每次都会执行 rollD20 函数,这就是程序背后的原理。在编辑器里点 粗体 ,或菜单里选 关机 ,一个处理该事件的函数会触发,希望不会随机到 20,啊!!!

好,现在回到施乐奥托!

大约制作了 2000 台奥托有的在施乐公司内部用,有的送给大学实验室,从来没有商业出售过,然而,PARC 团队不断完善硬件和软件,最终于 1981 年发布了 施乐之星系统,施乐之星扩展了"桌面隐喻"。现在文件看起来就像一张纸 ,还可以存在文件夹里,这些都可以放桌面上,或数字文件柜里,这样来隐喻底层的文件系统。

从用户角度来看,是一层新抽象!

施乐卖的是印刷机 但在文本和图形制作工具领域也有领先,例如,他们首先使用了 “剪切"“复制"“粘贴"这样的术语,这个比喻来自编辑打字机文件,真的是剪刀"剪切” 然后胶水"粘贴” 到另一个文件,然后再复印一次,新文件就是一层了,看不出编辑的痕迹……

感谢计算机的出现!

文字处理软件出现后 这种手工做法就消失了。Apple II 和 Commodore PET 上有文字处理软件,但施乐在这点上走的更远。无论你在计算机上做什么, 文件打印出来应该长得一样,他们叫这个"所见即所得”。不幸的是,就像恩格尔巴特的 oN-Line System ,施乐之星也领先于那个时代,销售量不高,因为在办公室里配一个,相当如今 20 万美元 。IBM 同年推出了 IBM PC ,之后便宜的"IBM 兼容"计算机席卷市场,但 PARC 研究人员花了十几年做的这些 没有被浪费。

1979 年 12 月,施乐之星出货前一年半,有个人去施乐公司参观 你可能听说过这个人:史蒂夫·乔布斯。这次参观有很多传闻,许多人认为乔布斯和苹果偷走了施乐的创意,但那不是事实。事实上是施乐公司主动找苹果,希望合作,最终施乐还买了苹果的一百万美元股份,在苹果备受瞩目的 首次公开募股 (IPO) 前买的,但一个额外条款是: “公布一切施乐研究中心正在进行的酷工作” 。史蒂夫知道他们很厉害,但他完全没预想到这些,其中有个演示是,一个清晰的位图显示器上,运行着施乐公司的图形界面 ,操作全靠鼠标直观进行。史蒂夫后来说:“就像拨开了眼前的一层迷纱,我可以看到计算机产业的未来”。史蒂夫和随行的工程师回到苹果公司,开始开发新功能,比如菜单栏和垃圾桶,垃圾桶存删除文件,满了甚至会膨胀 - 再次使用了隐喻。苹果第一款有图形界面和鼠标的产品,是 1983 年发行的 Apple Lisa ,一台超级先进的机器,标了"超级先进"的价格 - 差不多是如今的 25000 美元。虽然比施乐之星便宜不少,但在市场上同样失败。幸运的是,苹果还有另一个项目: Macintosh,于 1984 年发布,价格大约是如今的 6000 美元 - Lisa 的四分之一。它成功了,开售 100 天就卖了 7 万台,但在最初的狂潮后,销售额开始波动。苹果公司卖的 Apple II 比 Mac 多,一个大问题是:没人给这台新机器做软件,之后情况变得更糟,竞争对手赶上来了。不久,其它价格只有 Mac 几分之一的个人计算机 有了原始但可用的图形界面,消费者认可它们, PC 软件开发者也认可。随着苹果的财务状况日益严峻 以及和苹果新 CEO 约翰·斯卡利 的关系日益紧张,史蒂夫乔布斯被赶出了苹果公司。几个月后,微软发布了 Windows 1.0 ,它也许不如 Mac OS 漂亮,但让微软在市场中站稳脚跟 奠定了统治地位。十年内,95%的个人计算机上都有微软的 Windows。最初,Mac OS 的爱好者还可以说 Mac 有卓越的图形界面和易用性,Windows 早期版本都是基于 DOS 而 DOS 设计时 ,没想过运行图形界面,但 Windows 3.1 之后,微软开始开发新的,面向消费者的 GUI 操作系统,叫 Windows 95,这是一个意义非凡的版本 ,不仅提供精美的界面,还有 Mac OS 没有的高级功能,比如"多任务"和"受保护内存"。Windows 95 引入了许多 如今依然见得到的 GUI 元素,比如开始菜单,任务栏和 Windows 文件管理器。

不过微软也失败过,为了让桌面更简单友好, 微软开发了一个产品叫 Microsoft Bob ,将比喻用到极致。现在屏幕上有了一个虚拟房间,程序是物品,可以放在桌子和书架上,甚至还有噼啪作响的壁炉 和提供帮助的虚拟狗狗,你看到那边的门没?,是的,那些门通往不同房间 房间里有不同程序,你可能猜到了,它没有获得成功。这是一个好例子,说明如今的用户界面是自然选择后的结果。无论你用的是 Windows,Mac,Linux 或其他 GUI,几乎都是施乐奥托 WIMP 的变化版。一路上,人们试了各种做法并失败了。一切都必须发明,测试,改进,适应或抛弃,如今,图形界面无处不在 使用体验一般只是可以接受,而不是非常好,你肯定体验过差劲的设计,比如下载了很烂的 App,用过别人糟糕的手机,或者看到过很差的网站,因此计算机科学家和界面设计师 会继续努力工作,做出更好更强大的界面,朝着恩格尔巴特"增强人类智能"的愿景努力。

我们下周见。

27. 3D 图形

i.e. 3D Graphics

嗨,我是 Carrie Anne 欢迎收看计算机科学速成课!

在过去五集,我们从基于电传打字机的命令行界面讲到图形怎么显示到屏幕上,再到上集的 图形用户界面(GUI),以及图形界面的美味。

之前的例子都是 2D, 但我们生活的世界是 3D 的,我也是个三维 girl~

所以今天,我们讲 3D 图形的基础知识,以及如何渲染 3D 图形到 2D 屏幕上。24 集中说过,可以写一个函数,从 A 到 B 画一条线,通过控制 A 和 B 的 (X,Y) 坐标,可以控制一条线。在 3D 图像中,点的坐标不再是两点,而是三点,X,Y,Z ,或读"Zee",但我之后会读成"Zed" 。当然,2D 的电脑屏幕上、不可能有 XYZ 立体坐标轴,所以有图形算法 负责把 3D 坐标"拍平"显示到 2D 屏幕上,这叫 “3D 投影” 。所有的点都从 3D 转成 2D 后,就可以用画 2D 线段的函数 来连接这些点,这叫 “线框渲染” 。想象用筷子做一个立方体,然后用手电筒照它,墙上的影子就是投射,是平的。如果旋转立方体,投影看起来会像 3D 物体,尽管是投影面是平的,电脑也是这样 3D 转 2D ,只不过用大量数学,而不是筷子。

3D 投影有好几种,你现在看到的,叫 正交投影 。立方体的各个边,在投影中互相平行,在真实 3D 世界中,平行线段会在远处收敛于一点,就像远处的马路汇聚到一点,这叫 透视投射 。过程是类似的,只是数学稍有不同。有时你想要透视投影,有时不想,具体取决于开发人员。

如果想画立方体这种简单图形,直线就够了,但更复杂的图形,三角形更好,在 3D 图形学中 我们叫三角形"多边形"(Polygons),看看这个多边形组成的 漂亮茶壶。一堆多边形的集合叫 网格 。网格越密,表面越光滑,细节越多,但意味着更多计算量。游戏设计者要平衡角色的真实度 和多边形数量,如果数量太多 帧率会下降到肉眼可感知,用户会觉得卡,因此有算法用来简化网格。

之所以三角形更常用 而不是用正方形,或其它更复杂的图形,是因为三角形的简单性。空间中三点定义一个平面,如果给 3 个 3D 点,我能画出一个平面,而且只有这一个答案,4 个或多于 4 个点就不一定了,而 2 个点不够定义平面,只能定义线段,所以 3 是最完美的数字,三角形万岁。

线框渲染 虽然很酷,但 3D 图像需要填充,填充图形的经典算法叫 扫描线渲染 (Scanline Rendering) ,于 1967 年诞生在犹他州大学。为了例子简单,我们只看一个多边形。我们要思考这个多边形如何转成一块填满像素的区域,我们先铺一层像素网格,扫描线算法 先读多边形的 3 个点,找最大和最小的 Y 值,只在这两点间工作,然后算法从上往下,一次处理一行,计算每一行和多边形相交的 2 个点。因为是三角形,如果相交一条边,必然相交另一条,扫描线算法 会填满 2 个相交点之间的像素。

来看个具体例子。第一行 相交于这里和这里,算法把两点间填满颜色,然后下一行,再下一行,所以叫 扫描线渲染,扫到底部就完成了。填充的速度叫 fillrate(填充速率)。当然 这样的三角形比较丑,边缘满是锯齿,当像素较小时 就不那么明显,但尽管如此,你肯定在游戏里见过这种效果,特别是低配电脑。一种减轻锯齿的方法叫 抗锯齿 (Antialiasing),与其每个像素都涂成一样的颜色,可以判断多边形切过像素的程度,来调整颜色,如果像素在多边形内部,就直接涂颜色,如果多边形划过像素,颜色就浅一些,这种边缘羽化的效果看着更舒服些。抗锯齿 被广泛使用,比如字体和图标,如果你把脸贴近屏幕,近点, 再近点,你能看到浏览器里字体是抗锯齿的,超平滑。

在 3D 场景中,多边形到处都是,但只有一部分能看见,因为其它的被挡住了,这叫 遮挡 。最直接的处理办法是用排序算法,从远到近排列,然后从远到近渲染,这叫 画家算法 。因为画家也是先画背景,然后再画更近的东西。

看这个例子,有 3 个重叠的多边形。为了简单,我们画成不同颜色,同时,假设 3 个多边形都和屏幕平行,但在实际应用中,比如游戏里,多边形可能是倾斜的,3 个多边形 A,B,C,距离 20,12,14 。画家算法的第一件事,是从远到近排序,现在有序了,我们可以用 扫描线算法 填充多边形,一次填一个。我们从最远的 A 开始,然后重复这个过程,填充第二远的 C ,然后是 B 。现在完成了,可以看到顺序是对的,近的多边形在前面!

还有一种方法叫 深度缓冲 ,它和之前的算法做的事情一样,但方法不同。我们回到之前的例子,回到排序前的状态。因为这个算法不用排序,所以速度更快。简而言之,Z-buffering 算法会记录场景中每个像素和摄像机的距离,在内存里存一个数字矩阵。首先,每个像素的距离被初始化为"无限大",然后 Z-buffering 从列表里第一个多边形开始处理,也就是 A ,它和扫描线算法逻辑相同,但不是给像素填充颜色,而是把多边形的距离 和 Z-Buffer 里的距离进行对比,它总是记录更低的值 ,A 距离 20,20 小于"无限大",所以缓冲区记录 20 ,算完 A 之后算下一个,以此类推 。因为没对多边形排序,所以后处理的多边形并不总会覆盖前面的,对于多边形 C ,缓冲区里只有一部分值会被多边形 C 的距离值覆盖。Z 缓冲区完成后,会和"扫描线"算法的改进高级版配合使用,不仅可以勘测到线的交叉点,还可以知道某像素是否在最终场景中可见。如果不可见,扫描线算法会跳过那个部分,当两个多边形距离相同时,会出现一个有趣问题,比如多边形 A 和 B 距离都是 20, 哪个画上面?多边形会在内存中移来移去,访问顺序会不断变化。另外,计算浮点数有舍入误差,所以哪一个画在上面,往往是不可预测的,导致出现 Z-fighting 效果 如果你玩过 3D 游戏,肯定见过。

说起 故障,3D 游戏中有个优化叫 背面剔除 。你想想,三角形有两面,正面和背面,游戏角色的头部或地面,只能看到朝外的一面,所以为了节省处理时间,会忽略多边形背面,减了一半多边形面数。这很好,但有个 bug 是 如果进入模型内部往外看,头部和地面会消失。

继续,我们讲灯光,也叫 明暗处理 ,因为 3D 场景中,物体表面应该有明暗变化。我们回到之前的茶壶网格,用"扫描线"算法渲染所有多边形后,茶壶看起来像这样,没什么 3D 感。我们来加点灯光,提高真实感。为了举例,我们从茶壶上挑 3 个不同位置的多边形,和之前的例子不同,这次要考虑这些多边形面对的方向,它们不平行于屏幕,而是面对不同方向,他们面对的方向叫 “表面法线” 。我们可以用一个垂直于表面的小箭头来显示这个方向,现在加个光源,每个多边形被照亮的程度不同,有的更亮,因为面对的角度导致更多光线反射到观察者。举个例子,底部的多边形向下倾斜,远离光源,所以更暗一些。类似的,最右的多边形更背对光源,所以只有部分照亮。最后是左上角的多边形,因为它面对的角度 意味着会把光线反射到我们这里,所以会显得更亮。如果对每个多边形执行同样的步骤,看上去会更真实!这叫 平面着色 ,是最基本的照明算法。不幸的是,这使多边形的边界非常明显,看起来不光滑,因此开发了更多算法,比如 高洛德着色 和 冯氏着色,不只用一种颜色给整个多边形上色,而是以巧妙的方式改变颜色得到更好的效果。

我们还要说下 “纹理” ,纹理在图形学中指外观,而不是手感,就像照明算法一样,纹理也有多种算法,来做各种花哨效果。最简单的是 纹理映射 ,为了理解纹理映射,回到单个多边形,用"扫描线算法"填充时,可以看看内存内的纹理图像,决定像素用什么颜色。为了做到这点,需要把多边形坐标和纹理坐标对应起来,我们来看看"扫描线算法"要填充的第一个像素,纹理算法会查询纹理,从相应区域取平均颜色,并填充多边形,重复这个过程,就可以获得纹理。

如果结合这集提到的所有技巧 会得到一个精美的小茶壶。这个茶壶可以放进更大的场景里,场景由上百万个多边形组成。渲染这样的场景需要大量计算,但重要的是,再大的场景,过程都是一样的,一遍又一遍,处理所有多边形,扫描线填充,抗锯齿,光照,纹理化,然而,有几种方法可以加速渲染:

  • 首先,我们可以为这种特定运算做专门的硬件来加快速度,让运算快如闪电
  • 其次,我们可以把 3D 场景分解成多个小部分,然后并行渲染,而不是按顺序渲染。

CPU 不是为此设计的,因此图形运算不快,所以,计算机工程师为图形做了专门的处理器,叫 GPU “图形处理单元” 。GPU 在显卡上,周围有专用的 RAM ,所有网格和纹理都在里面,让 GPU 的多个核心可以高速访问。现代显卡,如 GeForce GTX 1080 TI 有 3584 个处理核心,提供大规模并行处理,每秒处理上亿个多边形!

好了,本集对 3D 图形的介绍到此结束。下周我们聊全新的主题。

我到时会 ping 你~

28. 计算机网络

i.e. Computer Networks

(。・∀・)ノ゙嗨,我是 Carrie Anne,欢迎收看计算机科学速成课!

互联网太棒啦,键盘敲几下就能在 Youtube 直播–哈喽!在维基百科上阅读文章,在亚马逊买东西,和朋友视频发一条天气推特。毫无疑问,用户在全球网络中发送和接收信息的能力,永远改变了这个世界。150 年前 发一封信件从伦敦到加州 要花 2~3 周,而且还是特快邮件,如今,电子邮件只要几分之一秒。“时延"改善了上百万倍 (时延指传播一条信息所需的时间),振兴了全球经济,帮助现代世界在遍布全球的光纤中快速发展。

你可能觉得计算机和网络密切相关,但事实上,1970 年以前 大多数计算机是独立运行的,然而 ,因为大型计算机开始随处可见,廉价机器开始出现在书桌上,分享数据和资源渐渐变得有用起来,首个计算机网络出现了。

今天起,我们花 3 集视频讲网络是如何发展成现在的样子,以及支撑它们的基础原理和技术。

第一个计算机网络出现在 1950~1960 年代,通常在公司或研究室内部使用,为了方便信息交换,比把纸卡或磁带送到另一栋楼里更快速可靠,这叫 “球鞋网络”

第二个好处是能共享物理资源。举个例子,与其每台电脑配一台打印机,大家可以共享一台联网的打印机。早期网络也会共享存储空间,因为每台电脑都配存储器太贵了。

计算机近距离构成的小型网络叫局域网,简称 LAN(Local Area Networks)。局域网能小到是同一个房间里的两台机器,或大到校园里的上千台机器。尽管开发和部署了很多不同 LAN 技术,其中最著名和成功的是 “以太网”, 开发于 1970 年代 ,在施乐的"帕洛阿尔托研究中心"诞生,今日仍被广泛使用。

以太网的最简单形式是:一条以太网电线连接数台计算机,当一台计算机要传数据给另一台计算机时,它以电信号形式,将数据传入电缆,当然 因为电缆是共享的,连在同一个网络里的其他计算机也看得到数据,但不知道数据是给它们的,还是给其他计算机的。为了解决这个问题,以太网需要每台计算机有唯一的媒体访问控制地址,简称 MAC 地址。这个唯一的地址放在头部,作为数据的前缀发送到网络中,所以,计算机只需要监听以太网电缆,只有看到自己的 MAC 地址,才处理数据。这运作得很好,现在制造的每台计算机都自带唯一的 MAC 地址,用于以太网和无线网络。

多台电脑共享一个传输媒介,这种方法叫 “载波侦听多路访问” ,简称"CSMA” 。载体 (carrier) 指运输数据的共享媒介,以太网的"载体"是铜线,WiFi 的"载体"是传播无线电波的空气。很多计算机同时侦听载体,所以叫"侦听"和"多路访问",而载体传输数据的速度 叫 “带宽” 。不幸的是,使用共享载体有个很大的弊端 - 当网络流量较小时 计算机可以等待载体清空,然后传送数据,但随着网络流量上升,两台计算机想同时写入数据的概率也会上升,这叫冲突,数据全都乱套了、就像两个人同时在电话里讲话,幸运的是,计算机能够通过监听电线中的信号检测这些冲突,最明显的解决办法是停止传输,等待网络空闲,然后再试一遍。问题是 其他计算机也打算这样做,其他等着的计算机可能在任何停顿间隙闯入,导致越来越多冲突。很快,每个人都一个接一个地讲话,而且有一堆事要说,就像在家庭聚餐中和男朋友分手一样,馊主意!

以太网有个超简单有效的解决方法,当计算机检测到冲突,就会在重传之前等待一小段时间,因为要举例,假设是 1 秒好了,当然 如果所有计算机用同样的等待时间 是不行的,它们会在一秒后再次冲突,所以加入一个随机时间 一台计算机可能等 1.3 秒,另一台计算机等待 1.5 秒,要是运气好 等 1.3 秒的计算机会醒来,发现载体是空闲的 然后开始传输,当 1.5 秒的计算机醒来后,会发现载体被占用,会等待其他计算机完成,这有用,但不能完全解决问题,所以要用另一个小技巧。 正如我刚才说的,如果一台计算机在传输数据期间检测到冲突,会等一秒+随机时间,然而 ,如果再次发生冲突 表明有网络拥塞,这次不等 1 秒,而是等 2 秒,如果再次发生冲突 等 4 秒 然后 8 秒 16 秒等等,直到成功传输。因为计算机的退避,冲突次数降低了,数据再次开始流动起来,网络变得顺畅,家庭晚餐有救啦! 这种指数级增长等待时间的方法叫: 指数退避。以太网和 WiFi 都用这种方法,很多其他传输协议也用。但即便有了"指数退避"这种技巧,想用一根网线链接整个大学的计算机还是不可能的,为了减少冲突+提升效率,我们需要减少同一载体中设备的数量。载体和其中的设备总称 “冲突域”

让我们回到之前以太网的例子,一根电缆连 6 台计算机,也叫一个冲突域。为了减少冲突,我们可以用交换机把它拆成两个冲突域,交换机位于两个更小的网络之间,必要时才在两个网络间传数据。交换机会记录一个列表,写着哪个 MAC 地址在哪边网络。如果 A 想传数据给 C ,交换机不会把数据转发给另一边的网络,没必要。如果 E 想同一时间传数据给 F,网络仍然是空的,两个传输可以同时发生,但如果 F 想发数据给 A 数据会通过交换机,两个网络都会被短暂占用。

大的计算机网络也是这样构建的,包括最大的网络 - 互联网,也是多个连在一起的稍小一点网络,使不同网络间可以传递信息。这些大型网络有趣之处是,从一个地点到另一个地点通常有多条路线,这就带出了另一个话题 路由

连接两台相隔遥远的计算机或网路,最简单的办法 是分配一条专用的通信线路,早期电话系统就是这样运作的。假设"印第安纳波利斯"和"米苏拉"之间,有五条电话线,如果在 1910 年代,John 想打电话给 Hank,John 要告诉操作员他想打到什么地方,然后工作人员手动将 John 的电话连到 通往米苏拉的未使用线路。通话期间,这条线就被占用了,如果五条线都被占用了 John 要等待某条线空出来,这叫 “电路交换” ,因为是把电路连接到正确目的地。能用倒是能用 ,但不灵活而且价格昂贵 ,因为总有闲置的线路。好处是 如果有一条专属于自己的线路 你可以最大限度地随意使用,无需共享。因此军队,银行和其他一些机构,依然会购买专用线路来连接数据中心。

传输数据的另一个方法是 “报文交换” ,“报文交换” 就像邮政系统一样,不像之前 A 和 B 有一条专有线路,消息会经过好几个站点。 如果 John 写一封信给 Hank,信件可能从"印第安纳波利斯"到"芝加哥",然后"明尼阿波利斯" ,然后"比林斯" 最后到"米苏拉"。每个站点都知道下一站发哪里 ,因为站点有表格,记录到各个目的地,信件该怎么传。报文交换的好处是 可以用不同路由 ,使通信更可靠更能容错。

回到邮件的例子,如果"明尼阿波利斯"有暴风雪中断了通信 “芝加哥"可以传给"奥马哈”,在这个例子里,城市就像路由器一样,消息沿着路由跳转的次数 叫 “跳数” (hop count)。记录跳数很有用,因为可以分辨出路由问题。举例,假设芝加哥认为 去米苏拉的最快路线是 奥马哈,但奥马哈认为 去米苏拉的最快路线是 芝加哥,这就糟糕了,因为 2 个城市看到目的地是米苏拉,结果报文会在 2 个城市之间 不停传来传去,不仅浪费带宽 ,而且这个路由错误需要修复! 这种错误会被检测到,因为跳数记录在消息中 ,而且传输时会更新跳数。如果看到某条消息的跳数很高 ,就知道路由肯定哪里错了,这叫 “跳数限制”

报文交换的缺点之一是有时候报文比较大,会堵塞网络 ,因为要把整个报文从一站传到下一站后 才能继续传递其他报文。传输一个大文件时,整条路都阻塞了,即便你只有一个 1KB 的电子邮件要传输 ,也只能等大文件传完,或是选另一条效率稍低的路线,这就糟了。

解决方法是 将大报文分成很多小块,叫 “数据包” ,就像报文交换 ,每个数据包都有目标地址 ,因此路由器知道发到哪里。报文具体格式由"互联网协议"定义,简称 IP 。这个标准创建于 1970 年代,每台联网的计算机都需要一个 IP 地址。你可能见过,以点分隔的 4 组数字,例如 172.217.7.238 是 Google 其中一个服务器的 IP 地址。数百万台计算机在网络上不断交换数据 ,瓶颈的出现和消失是毫秒级的,路由器会平衡与其他路由器之间的负载, 以确保传输可以快速可靠,这叫 “阻塞控制”

有时,同一个报文的多个数据包 会经过不同线路,到达顺序可能会不一样,这对一些软件是个问题。幸运的是,在 IP 之上还有其他协议,比如 TCP/IP, 可以解决乱序问题。我们下周会讲。

将数据拆分成多个小数据包,然后通过灵活的路由传递,非常高效且可容错,如今互联网就是这么运行的,这叫 “分组交换” 。有个好处是 它是去中心化的,没有中心权威机构,没有单点失败问题。事实上 ,因为冷战期间有核攻击的威胁,所以创造了分组交换。如今,全球的路由器协同工作,找出最高效的线路,用各种标准协议运输数据,比如 “因特网控制消息协议”(ICMP) 和 “边界网关协议”(BGP)。世界上第一个分组交换网络以及现代互联网的祖先是 ARPANET(Advanced Research Projects Agency),名字来源于赞助这个项目的机构,美国高级研究计划局。

这是 1974 年整个 ARPANET 的样子,每个小圆表示一个地点, 比如大学或实验室,那里运行着一个路由器,并且有一台或多台计算机,能看到 “PDP-1” 和"IBM 360 系统",甚至还有一个伦敦的 ATLAS 是通过卫星连到网络里的。显然 ,互联网在这几十年间发展迅速,如今不再只有几十台计算机联网 据估计 有接近 100 亿台联网设备,而且互联网会继续快速发展,特别是如今各种智能设备层出不穷 ,比如联网冰箱,恒温器,以及其他智能家电,它们组成了"物联网"。

第一部分到此结束 我们对计算机网络进行了概览。

网络是一堆管子组成的吗?额 算是吧。下周我们会讨论一些高级传输协议,然后讲万维网。

到时见啦。

29. 互联网

i.e. The Internet

(。・∀・)ノ゙嗨,我是 Carrie Anne 欢迎收看计算机科学速成课!

上集讲到,你的计算机和一个巨大的分布式网络连在一起,这个网络叫互联网。

你现在就在网上看视频呀。互联网由无数互联设备组成,而且日益增多。计算机为了获取这个视频 ,首先要连到局域网,也叫 LAN ,你家 WIFI 路由器连着的所有设备,组成了局域网。局域网再连到广域网,广域网也叫 WAN (Wide Area Network),WAN 的路由器一般属于你的"互联网服务提供商",简称 ISP(Internet Service Provider),比如 Comcast,AT&T 和 Verizon 这样的公司。

广域网里,先连到一个区域性路由器,这路由器可能覆盖一个街区。然后连到一个更大的 WAN,可能覆盖整个城市。可能再跳几次,但最终会到达互联网主干。互联网主干由一群超大型、带宽超高路由器组成,为了从 YouTube 获得这个视频,数据包(packet)要先到互联网主干,沿着主干到达有对应视频文件的 YouTube 服务器,数据包从你的计算机跳到 Youtube 服务器,可能要跳个 10 次,先跳 4 次到互联网主干,2 次穿过主干,主干出来可能再跳 4 次,然后到 Youtube 服务器。如果你在用 Windows, Mac OS 或 Linux 系统,可以用 traceroute 来看跳了几次,更多详情看视频描述(YouTube 原视频下)。

我们在"印第安纳波利斯"的 Chad&Stacy Emigholz 工作室,访问加州的 DFTBA 服务器,经历了 11 次中转。从 192.168.0.1 出发,这是我的电脑在 局域网(LAN)里的 IP 地址,然后到工作室的 WIFI 路由器,然后穿过一个个地区路由器,到达主干。然后从主干出来,又跳了几次,到达"DFTBA.com”的服务器,IP 地址是 104.24.109.186 。

但数据包到底是怎么过去的 ?如果传输时数据包被弄丢了,会发生什么?如果在浏览器里输 “DFTBA.com”,浏览器怎么知道服务器的地址多少?

我们今天会讨论这些话题。

上集说过,互联网是一个巨型分布式网络 ,会把数据拆成一个个数据包来传输。如果要发的数据很大,比如邮件附件, 数据会被拆成多个小数据包。举例,你现在看的这个视频 ,就是一个个到达你电脑的数据包,而不是一整个大文件发过来。数据包(packet)想在互联网上传输 ,要符合"互联网协议"的标准,简称 IP 。就像邮寄手写信一样,邮寄是有标准的每封信需要一个地址,而且地址必须是独特的,并且大小和重量是有限制的,违反这些规定,信件就无法送达。

IP 数据包也是如此,因为 IP 是一个非常底层的协议,数据包的头部(或者说前面)只有目标地址,头部存 “关于数据的数据” 也叫 元数据 (metadata),这意味着当数据包到达对方电脑 ,对方不知道把包交给哪个程序,是交给 Skype 还是使命召唤?因此需要在 IP 之上,开发更高级的协议。

这些协议里 最简单最常见的叫"用户数据报协议",简称 UDP 。UDP 也有头部,这个头部位于数据前面,头部里包含有用的信息。信息之一是端口号,每个想访问网络的程序 ,都要向操作系统申请一个端口号,比如 Skype 会申请端口 3478 。当一个数据包到达时 ,接收方的操作系统会读 UDP 头部,读里面的端口号,如果看到端口号是 3478,就把数据包交给 Skype。

总结:IP 负责把数据包送到正确的计算机, UDP 负责把数据包送到正确的程序。

UDP 头部里还有"校验和",用于检查数据是否正确,正如"校验和"这个名字所暗示的, 检查方式是把数据求和来对比。

以下是个简单例子。假设 UDP 数据包里 原始数据是 89 111 33 32 58 41 ,在发送数据包前 ,电脑会把所有数据加在一起,算出"校验和" - 89+111+33+… 以此类推,得到 364,这就是"校验和"。 UDP 中,“校验和” 以 16 位形式存储 (就是 16 个 0 或 1),如果算出来的和,超过了 16 位能表示的最大值, 高位数会被扔掉,保留低位。当接收方电脑收到这个数据包,它会重复这个步骤 把所有数据加在一起,89+111+33… 以此类推,如果结果和头部中的校验和一致 ,代表一切正常。如果不一致,数据肯定坏掉了。也许传输时碰到了功率波动,或电缆出故障了。

不幸的是,UDP 不提供数据修复或数据重发的机制,接收方知道数据损坏后,一般只是扔掉。而且,UDP 无法得知数据包是否到达。发送方发了之后,无法知道数据包是否到达目的地,这些特性听起来很糟糕,但是有些程序不在意这些问题,因为 UDP 又简单又快。

拿 Skype 举例 ,它用 UDP 来做视频通话,能处理坏数据或缺失数据,所以网速慢的时候 Skype 卡卡的 因为只有一部分数据包到了你的电脑。但对于其他一些数据,这个方法不适用。 比如发邮件,邮件不能只有开头和结尾 ,没有中间,邮件要完整到达收件方!

如果"所有数据必须到达" ,就用"传输控制协议",简称 TCP(Transmission Control Protocol)。TCP 和 UDP 一样,头部也在存数据前面,因此,人们叫这个组合 TCP/IP 。就像 UDP ,TCP 头部也有"端口号"和"校验和",但 TCP 有更高级的功能,我们这里只介绍重要的几个。

1、 TCP 数据包有序号

15 号之后是 16 号,16 号之后是 17 号,以此类推 发上百万个数据包也是有可能的。序号使接收方可以把数据包排成正确顺序,即使到达时间不同。哪怕到达顺序是乱的,TCP 协议也能把顺序排对。

2、 TCP 要求接收方的电脑收到数据包 并且"校验和"检查无误后(数据没有损坏)给发送方发一个确认码,代表收到了

“确认码” 简称 ACK . 得知上一个数据包成功抵达后,发送方会发下一个数据包。假设这次发出去之后,没收到确认码 ,那么肯定哪里错了。如果过了一定时间还没收到确认码, 发送方会再发一次。注意 ,数据包可能的确到了,只是确认码延误了很久,或传输中丢失了,但这不碍事 ,因为收件方有序列号,如果收到重复的数据包就删掉。

还有,TCP 不是只能一个包一个包发,可以同时发多个数据包,收多个确认码 ,这大大增加了效率,不用浪费时间等确认码。有趣的是,确认码的成功率和来回时间 可以推测网络的拥堵程度,TCP 用这个信息,调整同时发包数量,解决拥堵问题。

简单说,TCP 可以处理乱序和丢失数据包,丢了就重发,还可以根据拥挤情况自动调整传输率。相当厉害!

你可能会奇怪,既然 TCP 那么厉害,还有人用 UDP 吗?TCP 最大的缺点是 ,那些"确认码"数据包把数量翻了一倍,但并没有传输更多信息,有时候这种代价是不值得的 ,特别是对时间要求很高的程序,比如在线射击游戏。如果你玩游戏很卡,你也会觉得这样不值!

当计算机访问一个网站时 需要两个东西:1.IP 地址, 2. 端口号 。

例如 172.217.7.238 的 80 端口 ,这是谷歌的 IP 地址和端口号。事实上,你可以输到浏览器里,然后你会进入谷歌首页。有了这两个东西就能访问正确的网站, 但记一长串数字很讨厌,google.com 比一长串数字好记,所以互联网有个特殊服务 ,负责把域名和 IP 地址一一对应,就像专为互联网的电话簿 它叫 “域名系统” ,简称 DNS 。

它的运作原理你可能猜到了,在浏览器里输 youtube.com ,浏览器会去问 DNS 服务器,它的 IP 地址是多少。一般 DNS 服务器 是互联网供应商提供的,DNS 会查表,如果域名存在,就返回对应 IP 地址。如果你乱敲键盘加个。com, 然后按回车,你很可能会看到 DNS 错误,因为那个网站不存在,所以 DNS 无法返回给你一个地址。如果你输的是有效地址,比如 youtube.com ,DNS 按理会返回一个地址,然后浏览器会给这个 IP 地址 发 TCP 请求。如今有三千万个注册域名,所以为了更好管理,DNS 不是存成一个超长超长的列表,而是存成树状结构。顶级域名(简称 TLD)在最顶部,比如 .com 和 .gov ,下一层是二级域名,比如 .com 下面有 google.com 和 dftba.com ,再下一层叫子域名,比如 images.google.com, store.dftba.com ,这个树超!级!大!

我前面说的"三千万个域名"只是二级域名 ,不是所有子域名,因此,这些数据散布在很多 DNS 服务器上,不同服务器负责树的不同部分。

好了 我知道你肯定在等这个梗:我们到了一层新抽象!

过去两集里 我们讲了线路里的电信号,以及无线网络里的无线信号,这些叫"物理层",而"数据链路层" 负责操控 “物理层”,数据链路层有:媒体访问控制地址(MAC),碰撞检测,指数退避,以及其他一些底层协议。再上一层是"网络层",负责各种报文交换和路由。而今天,我们讲了"传输层"里一大部分, 比如 UDP 和 TCP 这些协议,负责在计算机之间进行点到点的传输,而且还会检测和修复错误。我们还讲了一点点"会话层",“会话层” 会使用 TCP 和 UDP 来创建连接,传递信息,然后关掉连接,这一整套叫"会话"。查询 DNS 或看网页时,就会发生这一套流程。这是 开放式系统互联通信参考模型 (OSI,Open System Interconnection) 的底下 5 层,这个概念性框架 把网络通信划分成多层,每一层处理各自的问题。如果不分层 直接从上到下捏在一起实现网络通信,是完全不可能的!

抽象使得科学家和工程师能分工同时改进多个层 不被整体复杂度难倒。而且惊人的是!我们还没讲完呢!

OSI 模型还有两层,“表示层"和"应用程序层”,其中有浏览器,Skype,HTML 解码,在线看电影等。

我们下周说,到时见。

30. 万维网

i.e. The World Wide Web

(。・∀・)ノ゙嗨,我是 Carrie Anne 欢迎收看计算机科学速成课!

前两集我们深入讨论了电线 信号 交换机 数据包 路由器以及协议,它们共同组成了互联网。今天我们向上再抽象一层,来讨论万维网。

万维网 (World Wide Web) 和互联网 (Internet) 不是一回事,尽管人们经常混用这两个词。万维网在互联网之上运行,互联网之上还有 Skype, Minecraft 和 Instagram 。互联网是传递数据的管道,各种程序都会用,其中传输最多数据的程序是万维网,分布在全球数百万个服务器上,可以用"浏览器"来访问万维网,这集我们会深入讲解万维网。

万维网的最基本单位,是单个页面。页面有内容,也有去往其他页面的链接 ,这些链接叫"超链接"。你们都见过:可以点击的文字或图片,把你送往另一个页面,这些超链接形成巨大的互联网络,这就是"万维网"名字的由来。现在说起来觉得很简单,但在超链接做出来之前,计算机上每次想看另一个信息时,你需要在文件系统中找到它 ,或是把地址输入搜索框,有了超链接,你可以在相关主题间轻松切换。超链接的价值早在 1945 年 就被 Vannevar Bush 意识到了,在第 24 集中我们说过,他发过一篇文章 ,描述一个假想的机器 Memex ,Bush 的形容是"关联式索引 - 选一个物品会引起另一个物品被立即选中"。他解释道:“将两样东西联系在一起的过程十分重要,在任何时候,当其中一件东西进入视线,只需点一下按钮,立马就能回忆起另一件” 。1945 年的时候计算机连显示屏都没有,所以这个想法非常超前!因为文字超链接是如此强大,它得到了一个同样厉害的名字:“超文本”!如今超文本最常指向的,是另一个网页,然后网页由浏览器渲染,我们待会会讲。

为了使网页能相互连接,每个网页需要一个唯一的地址,这个地址叫 “统一资源定位器”,简称 URL(Uniform Resource Locator)。一个网页 URL 的例子是 “thecrashcourse.com/courses” ,就像上集讨论的,当你访问一个网站时,计算机首先会做"DNS 查找",“DNS 查找"的输入是一个域名 比如 thecrashcourse.com ,会输出对应的 IP 地址,现在有了 IP 地址 ,你的浏览器会打开一个 TCP 连接到这个 IP 地址,这个地址运行着"网页服务器”,网页服务器的标准端口是 80 端口,这时,你的计算机连到了 thecrashcourse.com 的服务器。下一步是向服务器请求"courses"这个页面,这里会用"超文本传输协议"(HTTP)。

HTTP 的第一个标准,HTTP 0.9,创建于 1991 年,只有一个指令,“GET” 指令。幸运的是,对当时来说也够用,因为我们想要的是"courses"页面,我们向服务器发送指令:“GET /courses”,该指令以"ASCII 编码"发送到服务器,服务器会返回该地址对应的网页 ,然后浏览器会渲染到屏幕上。如果用户点了另一个链接,计算机会重新发一个 GET 请求。你浏览网站时,这个步骤会不断重复。

在之后的版本,HTTP 添加了状态码,状态码放在请求前面。举例,状态码 200 代表 “网页找到了,给你”。状态码 400~499 代表客户端出错,比如网页不存在,就是可怕的 404 错误。

“超文本"的存储和发送都是以普通文本形式。举个例子,编码可能是 ASCII 或 UTF-16 , 我们在第 4 集和第 20 集讨论过,因为如果只有纯文本 ,无法表明什么是链接,什么不是链接,所以有必要开发一种标记方法,因此开发了 超文本标记语言(HTML)。

HTML 第一版的版本号是 0.8,创建于 1990 年,有 18 种 HTML 指令,仅此而已!

我们来做一个网页吧!

> 首先,给网页一个大标题
> 我们输 h1 代表一级标题,然后用<>括起来
> 这就是一个 HTML 标签
> 
> 然后输入想要的标题
> 我们不想一整页都是标题 所以加 </h1> 作为结束标签
> 
> 现在来加点内容
> 读者可能不知道"克林贡"是什么,所以我们给这个词
> 加一个超链接到"克林贡语言研究院"
> 我们用 <a> 标签来做,它有一个 href 属性
> 说明链接指向哪里,当点击链接时就会进入那个网页
> 最后用 </a> 关闭标签
> 
> 接下来用 <h2> 标签做二级标题
> 
> HTML 也有做列表的标签
> 我们先写<ol> 代表 有序列表(ordered list)
> 然后想加几个列表项目 , 就加几个 用 <li> 包起来就行
> 读者可能不知道 Bat'leth 是什么,那么也加上超链接
> 最后,为了保持良好格式,用</ol>代表列表结束
> 
> 这就完成了 - 一个很简单的网页!

如果把这些文字存入记事本或文本编辑器,然后文件取名 “test.html”,就可以拖入浏览器打开。

当然,如今的网页更复杂一些,最新版的 HTML,HTML5,有 100 多种标签,图片标签,表格标签,表单标签,按钮标签,等等。还有其他相关技术就不说了比如 层叠样式表 (CSS) 和 JavaScript,这俩可以加进网页,做一些更厉害的事。

让我们回到浏览器,网页浏览器可以和网页服务器沟通,浏览器不仅获取网页和媒体,获取后还负责显示。

第一个浏览器和服务器,是 Tim Berners-Lee 在 1990 年写的,一共花了 2 个月。那时候他在瑞士的"欧洲核子研究所"工作,为了做出来,他同时建立了几个最基本的网络标准 - URL, HTML 和 HTTP。两个月能做这些很不错啊!不过公平点说,他研究超文本系统已经有十几年了,和同事在 CERN 内部使用一阵子后,在 1991 年发布了出去,万维网就此诞生。

重要的是,万维网有开放标准,大家都可以开发新服务器和新浏览器,因此"伊利诺伊大学香槟分校"的一个小组在 1993 年做了 Mosaic 浏览器,第一个可以在文字旁边显示图片的浏览器,之前浏览器要单开一个新窗口显示图片,还引进了书签等新功能,界面友好,使它很受欢迎。尽管看上去硬邦邦的,但和如今的浏览器长的差不多。

1990 年代末有许多浏览器面世,Netscape Navigator, Internet Explorer Opera, OmniWeb, Mozilla ,也有很多服务器面世,比如 Apache 和 微软互联网信息服务 (IIS)。每天都有新网站冒出来,如今的网络巨头,比如亚马逊和 eBay,创始于 1990 年代中期,那是个黄金时代!

随着万维网日益繁荣,人们越来越需要搜索。如果你知道网站地址, 比如 ebay.com,直接输入浏览器就行,如果不知道地址呢?比如想找可爱猫咪的图片,现在就要!去哪里找呢?

起初人们会维护一个目录,链接到其他网站,其中最有名的叫"Jerry 和 David 的万维网指南”,1994 年改名为 Yahoo 。随着网络越来越大,人工编辑的目录变得不便利,所以开发了搜索引擎。

让我们进入思想泡泡!

长的最像现代搜索引擎的最早搜素引擎,叫 JumpStation ,由 Jonathon Fletcher 于 1993 年在斯特林大学创建,它有 3 个部分:

第一个是爬虫,一个跟着链接到处跑的软件,每当看到新链接,就加进自己的列表里;第二个部分是不断扩张的索引,记录访问过的网页上,出现过哪些词;最后一个部分,是查询索引的搜索算法,举个例子,如果我在 JumpStation 输入"猫",每个有"猫"这个词的网页都会出现。

早期搜索引擎的排名方式 非常简单,取决于 搜索词在页面上的出现次数。刚开始还行,直到有人开始钻空子,比如在网页上写几百个"猫",把人们吸引过来。谷歌成名的一个很大原因是, 创造了一个聪明的算法来规避这个问题。与其信任网页上的内容 ,搜索引擎会看其他网站 有没有链接到这个网站。如果只是写满"猫"的垃圾网站,没有网站会指向它,如果有关于猫的有用内容,有网站会指向它,所以这些"反向链接"的数量,特别是有信誉的网站,代表了网站质量。

Google 一开始时是 1996 年斯坦福大学 一个叫 BackRub 的研究项目,两年后分离出来,演变成如今的谷歌。

谢谢思想泡泡!

最后 我想讲一个词,你最近可能经常听到 - 网络中立性 。现在你对数据包,路由和万维网,有了个大体概念,足够你理解这个争论的核心点,至少从技术角度。简单说"网络中立性"是应该平等对待所有数据包,不论这个数据包是我的邮件,或者是你在看视频,速度和优先级应该是一样的,但很多公司会乐意让它们的数据优先到达。拿 Comcast 举例,它们不但是大型互联网服务提供商而且拥有多家电视频道,比如 NBC 和 The Weather Channel,可以在线看。我不是特意找 Comcast 麻烦 ,但要是没有网络中立性,Comcast 可以让自己的内容优先到达 ,节流其他线上视频。节流 (Throttled) 意思是故意给更少带宽和更低优先级。再次重申,这只是举例,不是说 Comcast 很坏。支持网络中立性的人说 没有中立性后,服务商可以推出提速的"高级套餐",给剥削性商业模式埋下种子。互联网服务供应商成为信息的"守门人",它们有着强烈的动机去碾压对手,另外,Netflix 和 Google 这样的大公司可以花钱买特权,而小公司,比如刚成立的创业公司,会处于劣势,阻止了创新。另一方面,从技术原因看,也许你会希望不同数据传输速度不同,你希望 Skype 的优先级更高,邮件晚几秒没关系。而反对"网络中立性"的人认为,市场竞争会阻碍不良行为,如果供应商把客户喜欢的网站降速 ,客户会离开供应商。

这场争辩还会持续很久,就像我们在 Crash Course 其他系列中说过,你应该自己主动了解更多信息,因为"网络中立性"的影响十分复杂而且广泛。

我们下周再见

31. 计算机安全

i.e. Cybersecurity

(。・∀・)ノ゙嗨,我是 Carrie Anne ,欢迎收看计算机科学速成课!

过去 3 集 我们讲了计算机如何互连,让我们能瞬时跨全球沟通,但不是每个使用网络的人都会规规矩矩,不损害他人利益。就像现实世界中我们用锁和栅栏保证物理安全,有警察减少犯罪,我们需要网络安全减少虚拟世界中的犯罪 🚨。

计算机没有道德观念。只要给计算机写清具体问题 , 它们很乐意地闪电般算出答案。破坏医院计算机系统的代码 和 保持病人心跳的代码 ,对计算机来说没有区别,就像"原力"一样 ,计算机可以被拉到"光明面"或"黑暗面"。网络安全就像 绝地武士团 ,给网络世界带来和平与正义。

计算机安全的范围,和计算能力的发展速度一样快。我们可以把计算机安全,看成是保护系统和数据的:保密性,完整性和可用性 。我们逐个细说:

“保密性"是只有有权限的人 ,才能读取计算机系统和数据。黑客泄露别人的信用卡信息,就是攻击保密性。

“完整性"是只有有权限的人 ,才能使用和修改系统和数据。黑客知道你的邮箱密码,假冒你发邮件,就是攻击"完整性”。

“可用性"是有权限的人 ,应该随时可以访问系统和数据。拒绝服务攻击 (DDOS) 就是黑客发大量的假请求到服务器,让网站很慢或者挂掉,这就是攻击"可用性”。

为了实现这三个目标,安全专家会从 抽象层面想象"敌人"可能是谁,这叫"威胁模型分析”,模型会对攻击者有个大致描述:能力如何,目标可能是什么,可能用什么手段 。攻击手段又叫"攻击矢量" ,“威胁模型分析"让你能为特定情境做准备,不被可能的攻击手段数量所淹没 ,因为手段实在有太多种了。假设你想确保笔记本计算机的"物理安全” ,你的威胁模型是"好管闲事的室友"。为了保证保密性,完整性和可用性, 你可以藏在脏兮兮的洗衣篮里。但如果威胁模型是调皮的兄弟姐妹,知道你喜欢藏哪里,那么你需要更多保护:比如锁在保险箱里。换句话说,要怎么保护,具体看对抗谁。当然,威胁模型通常比"好管闲事的室友"更正式一些,通常威胁模型分析里 会以能力水平区分,比如"某人可以物理接触到笔记本计算机,而且时间无限"。在给定的威胁模型下,安全架构师要提供解决方案,保持系统安全。只要某些假设不被推翻,比如没人会告诉攻击者密码,保护计算机系统,网络和数据的方法有很多。

很多安全问题可以总结成 2 个问题: 你是谁?你能访问什么?

权限应该给合适的人,拒绝错误的人,比如银行员工可以打开取款机来补充现金。但我不应该有权限打开,因为我会把钱拿走 全拿走!陶瓷猫收藏品可不会从天上掉下来哟!所以,为了区分谁是谁,我们用 “身份认证”(authentication) - 让计算机得知使用者是谁。

身份认证有三种,各有利弊:你知道什么、你有什么、你是什么。

“你知道什么” 是基于某个秘密,只有用户和计算机知道,比如 用户名和密码,这是如今使用最广泛的,因为最容易实现,但如果黑客通过猜测或其他方式,知道你的密码,就惨了。有些密码很容易猜中,比如 12356 或 qwerty 。但有些密码对计算机很容易,比如 PIN 码:2580 ,看起来很难猜中 - 起码对人类来说是这样,但 4 位数字,只有一万种可能。一台计算机可以尝试 0000,然后 0001,然后 0002,然后到 9999,不到一秒内试完,这叫"暴力攻击",因为只是试遍一切可能,这种算法没什么聪明的地方。如果你错误尝试 3 次,有些系统会阻止你继续尝试,或让你等一会儿,这个策略普遍而且合理。对于一般的攻击者确实很难,但假设黑客控制了数以万计的计算机,形成一个僵尸网络,用这么多计算机尝试密码 2580 ,同时尝试很多银行账户,即使每个账户只试一次,也很可能,碰到某个账户刚好用这个 PIN,事实上,看视频的某人可能刚好用这个 PIN 。增加密码长度有帮助,但即使 8 位数字的 PIN 码也很容易破解,这就是为什么现在很多网站 要求大写+小写字母,还有特殊符号等,大大增加可能的密码。8 位数字的 PIN 只有一亿种组合,对计算机轻而易举,但包含各种字符的 8 位长度密码,有超过 600 万亿种组合。当然,这些密码会难以记住,所以更好的方法是 选一些更好记的东西,比如三个单词连在一起:“格林兄弟好厉害"或"披萨尝起来好好吃”。英文大约有 10 万个单词,所以三个单词连一起大概有 1 亿亿种可能,想猜中的话,祝你好运!另外使用不在字典内的单词被猜中的可能性更低,但我们没时间细说这个。Computerphile 频道有个视频讲怎么选择好密码 - 链接请看 Youtube 描述。

“你有什么"这种验证方式,是基于用户有特定物体,比如钥匙和锁。如果你有钥匙,就能开门,这避免了被人"猜中"的问题,而且通常需要人在现场,所以远程攻击就更难了。另一个国家的人,得先来佛罗里达州,才能到你家前门。但如果攻击者离你比较近,那么也不安全,钥匙可以被复制,手机可能被偷,锁可以撬开。

最后,“你是什么"这种验证,是基于你把特征展示给计算机进行验证,生物识别验证器,比如指纹识别器和虹膜扫描仪就是典型例子,这些非常安全,但最好的识别技术仍然很贵,而且,来自传感器的数据每次会不同。

“你知道什么"和"你有什么”。这两种验证是"确定性"的 - 要么正确,要么错误。如果你知道密码,或有钥匙,那么 100%能获得访问权限,如果没有,就绝对进不去,但"生物识别"是概率性的,系统有可能认不出你,可能你戴了帽子,或者光线不好。更糟的是,系统可能把别人错认成你,比如你的邪恶双胞胎。当然,在现实世界中几率很低,但不是零。

生物认证的另一个问题是无法重设。你只有这么多手指,如果攻击者拿到你的指纹数据怎么办,你一辈子都麻烦了。最近还有研究人员表示,拍个照都有可能伪造虹膜,所以也不靠谱。

所有认证方法都有优缺点,它们都可以被攻破,所以,对于重要账户,安全专家建议用两种或两种以上的认证方式,这叫"双因素"或"多因素"认证。攻击者可能猜出你密码,或偷走你的手机:但两个都做到,会比较难。

“身份验证"后,就来到了"访问控制”。一旦系统知道你是谁,它需要知道你能访问什么,因此应该有个规范,说明谁能访问什么,修改什么,使用什么。这可以通过"权限"或"访问控制列表”(ACL)来实现,其中描述了用户对每个文件,文件夹和程序的访问权限。

"读"权限允许用户查看文件内容,
"写"权限允许用户修改内容,
"执行"权限允许用户运行文件,比如程序

有些组织需要不同层级的权限,比如间谍机构,“访问控制列表"的正确配置非常重要,以确保保密性,完整性和可用性。假设我们有三个访问级别:公开,机密,绝密。

第一个普遍的好做法是,用户不能"读上”, 不能读等级更高的信息,如果用户能读"机密"文件那么不应该有权限读"绝密"文件,但能访问"机密"和"公开"文件

第二个法则是用户不能"写下”,如果用户等级是"绝密",那么能写入或修改"绝密"文件,但不能修改"机密"或"公共"文件。听起来好像很奇怪 ,有最高等级也不能改等级更低的文件,但这样确保了"绝密" 不会意外泄露到"机密"文件或"公共"文件里。

这个"不能向上读,不能向下写"的方法叫 Bell-LaPadula 模型,它是为美国国防部"多层安全政策"制定的,还有许多其他的访问控制模型 - 比如"中国墙"模型和"比伯"模型。哪个模型最好,取决于具体情况。

身份验证"和"访问控制"帮助计算机知道"你是谁",以及"你可以访问什么",但做这些事情的软硬件必须是可信的,这个依赖很重要。如果攻击者给计算机装了恶意软件 - 控制了计算机的操作系统。我们怎么确定安全程序没有给攻击者留后门?短回答是 - 无法确定!我们仍然无法保证程序或计算机系统的安全,因为安全软件在理论上可能是"安全的",实现时可能会不小心留下漏洞,但我们有办法减少漏洞出现的可能性,比如一找到就马上修复,以及当程序被攻破时尽可能减少损害。大部分漏洞都是具体实现的时候出错了,为了减少执行错误,减少执行。

系统级安全的圣杯之一是"安全内核",或"可信计算基础":一组尽可能少的操作系统软件。安全性都是接近可验证的,构建安全内核的挑战在于 决定内核应该有什么。记住,代码越少越好!在最小化代码数量之后,要是能"保证"代码是安全的,会非常棒。

正式验证代码的安全性 是一个活跃的研究领域,我们现在最好的手段,叫 “独立安全检查和质量验证” 。让一群安全行业内的软件开发者来审计代码,这就是为什么安全型代码几乎都是开源的,写原始代码的人通常很难找到错误,但外部开发人员有新鲜的眼光和不同领域的专业知识,可以发现问题。 另外还有一些安全大会,安全专家可以相互认识,分享想法。 一年一次在拉斯维加斯举办的 DEF CON 是全球最大的安全大会。

最后,即便尽可能减少代码 ,并进行了安全审计。聪明的攻击者还是会找到方法入侵,因为如此,优秀的开发人员应该计划当程序被攻破后,如何限制损害,控制损害的最大程度,并且不让它危害到计算机上其他东西,这叫 “隔离” 。要实现隔离,我们可以"沙盒"程序,这好比把生气的小孩放在沙箱里,他们只能摧毁自己的沙堡,不会影响到其他孩子。操作系统会把程序放到沙盒里,方法是给每个程序独有的内存块,其他程序不能动。一台计算机可以运行多个虚拟机,虚拟机模拟计算机,每个虚拟机都在自己的沙箱里。如果一个程序出错,最糟糕的情况是它自己崩溃或者搞坏它处于的虚拟机。计算机上其他虚拟机是隔离的,不受影响。

好,一些重要安全概念的概览 我们到此就介绍完了。我都还没讲网络安全,比如防火墙。下集我们会讨论 黑客侵入系统的一些方法,然后我们学加密。在此之前,别忘了加强你的密码,打开两步验证,永远不要点可疑邮件。

我们下周见。

32. 黑客 & 攻击

i.e. Hackers & Cyber Attacks

(。・∀・)ノ゙嗨,我是 Carrie Anne,欢迎收看计算机科学速成课!

上集我们讲了计算机安全的基础知识,包括各种原则和技术,但尽管尽了最大努力,新闻上还是各种 个人,公司,政府被黑客攻击的故事。那些黑客凭技术知识闯入计算机系统,不是所有黑客都是坏人,有些黑客会寻找并修复软件漏洞 ,让系统更安全,他们经常被公司和政府雇来做安全评估,这些黑客叫"白帽子",他们是好人。另一方面,也有"黑帽"黑客,他们窃取,利用和销售计算机漏洞和数据。黑客的动机有很多种,有些是好玩和好奇,而网络罪犯一般是为了钱。还有的叫"黑客行动主义者",通过黑客手段影响社会或达到政治目的,这只是冰山一角。

一般对黑客的刻板印象是某个不受欢迎的小孩在黑暗的房间里,到处都是吃完的比萨盒,这个印象是错的,形容约翰·格林的宿舍还更贴切些。

今天,我们不会教你如何成为黑客,而是讨论一些入侵原理,给你一个大概概念。

黑客入侵最常见的方式,不是通过技术,而是欺骗别人,这叫"社会工程学",欺骗别人让人泄密信息,或让别人配置电脑系统,变得易于攻击。

最常见的攻击是网络钓鱼,你可能见过,银行发邮件叫你点邮件里的链接,登陆账号,然后你会进入一个像官网的网站,但实际上是个假网站,当你输入用户名和密码时,信息会发给黑客,然后黑客就可以假扮你登陆网站,坏消息!即使成功率只有 1/1000,发一百万封钓鱼邮件,也有一千个帐户中招。

另一种方法叫 假托 (Pretexting),攻击者给某个公司打电话,假装是 IT 部门的人,攻击者的第一通电话一般会叫人转接,这样另一个人接的时候,电话看起来像内部的,然后让别人把电脑配置得容易入侵,或让他们泄露机密信息,比如密码或网络配置。

> 不好意思,等一下。
> 嘿,我是 IT 部门的苏珊
> 我们遇到一些网络问题,你能帮我检查一个配置吗?
> 然后就开始了……

只要预先做一点研究,攻击者可以装得很像真的,比如关键员工的名字。也许要 10 通电话才能找到一个受害者,但只要一个人上当就够了。

邮件里带"木马"也是常见手段,木马会伪装成无害的东西,比如照片或发票,但实际上是恶意软件。恶意软件有很多种,有的会偷数据,比如银行凭证,有的会加密文件,交赎金才解密,也就是"勒索软件"。如果攻击者无法用木马或电话欺骗,攻击者只能被迫用其他手段,方法之一是暴力尝试,我们上集讨论过,尝试所有可能的密码,直到进入系统。大多数现代系统会加长等待时间,来抵御这种攻击,每次失败就加长等待时间,甚至失败超过一定次数后,完全锁住。

最近出现一种攻破方法叫 “NAND 镜像”,如果能物理接触到电脑,可以往内存上接几根线,复制整个内存,复制之后,暴力尝试密码,直到设备让你等待,这时只要把复制的内容覆盖掉内存,本质上重置了内存,就不用等待,可以继续尝试密码了,这项方法在 iPhone 5C 上管用,更新的设备有机制阻止这种攻击。

如果你无法物理接触到设备,就必须远程攻击,比如通过互联网。 远程攻击一般需要攻击者利用系统漏洞,来获得某些能力或访问权限,这叫"漏洞利用"(Exploit)。一种常见的漏洞利用叫"缓冲区溢出",“缓冲区"是一种概称,指预留的一块内存空间。

我们在第 23 集,讨论过存像素数据的视频缓冲区。举个简单例子,假设我们在系统登陆界面,要输入用户名和密码。在幕后,系统用缓冲区存输入的值,假设缓冲区大小是 10 ,两个文本缓冲区看起来会像这样:

当然,操作系统记录的远不止用户名和密码,所以缓冲区前后 肯定有其他数据。当用户输入用户名和密码时,这些值会复制到缓冲区,然后验证是否正确。缓冲区溢出"正如名字所暗示的:它会溢出缓冲区。在这个例子中,超过十个字符的密码会覆盖掉相邻的数据,有时只会让程序或系统崩溃,因为重要值被垃圾数据覆盖了。系统崩溃是坏事,但也许恶作剧黑客就只是想系统崩溃,当个讨厌鬼。但攻击者可以更巧妙地利用这个漏洞 (bug),注入有意义的新值到程序的内存中,比如把"is_admin"的值改成 true。有了任意修改内存的能力,黑客可以绕过"登录"之类的东西,甚至使用那个程序劫持整个系统。有很多方法阻止缓冲区溢出,最简单的方法是,复制之前先检查长度,这叫 “边界检查”。 许多现代编程语言自带了边界检查,程序也会随机存放变量在内存中的位置, 比如我们之前假设的"is_admin”,这样黑客就不知道应该覆盖内存的哪里,导致更容易让程序崩溃,而不是获得访问权限。程序也可以在缓冲区后,留一些不用的空间,然后跟踪里面的值,看是否发生变化,如果发生了变化,说明有攻击者在乱来,这些不用的内存空间叫"金丝雀",因为以前矿工会带金丝雀下矿,金丝雀会警告危险。

另一种经典手段叫"代码注入",最常用于攻击用数据库的网站,几乎所有大网站都用数据库。我们这个系列中不会讲解数据库,所以以下是个简单例子。

我们会用"结构化查询语言",也叫 SQL,一种流行的数据库 API。假设网页上有登录提示,当用户点击"登录"时,值会发到服务器,服务器会运行代码,检查用户名是否存在,如果存在,看密码是否匹配。 为了做检查,服务器会执行一段叫 “SQL 查询” 的代码,看起来像这样。

首先,语句要指定从数据库里查什么数据。在这个例子中,我们想查的是密码 (password) (SELECT password),还要指定从哪张表查数据 (FROM users)。在这个例子里,我们假设所有用户数据都存在 “users” 表里,最后,服务器不想每次取出一个巨大密码列表,包含所有用户密码,所以用 username = ‘用户名’代表只要这个用户,用户输的值会复制到"SQL 查询",所以实际发到 SQL 数据库的命令,是这样的 - Where username=‘philbin’ 。还要注意,SQL 命令以分号结尾,那怎么破解这个? 做法是把"SQL 命令"输入到用户名里! 比如我们可以发这个奇怪的用户名:

当服务器把值复制到 SQL 查询中,会变成这样:

正如之前提的,分号用于分隔命令,所以第一条被执行的命令是:

如果有个用户叫"whateer",数据库将返回密码。当然,我们不知道密码是什么,所以会出错,服务器会拒绝我们。如果没有一个用户叫"whatever",数据库会返回 空密码或直接错误,服务器也会拒绝我们。总之 ,我们不在乎,我们感兴趣的是下一个 SQL 命令: “drop table users” - 我们注入的命令。这条命令的意思是删掉 users 这张表,全删干净!这会造成很多麻烦,不管是银行或什么其他地方,注意,我们甚至不需要侵入系统,我们没有猜到正确的用户名和密码,即使没有正式访问权限,还是可以利用 bug 来制造混乱,这是代码注入的一个简单例子。如今几乎所有服务器都会防御这种手段,如果指令更复杂一些,也许可以添加新记录到数据库 - 比如一个新管理员帐户 - 甚至可以让数据库泄露数据,使得黑客窃取信用卡号码,社会安全号码,以及各种其他信息,但我们不会教你具体怎么做 。

就像缓冲区溢出攻击一样,应该总是假设外部数据是危险的,应该好好检查。

很多用户名和密码表单,不让你输入特殊字符,比如分号或者括号,作为第一道防御。好的服务器也会清理输入,比如修改或删除特殊字符,然后才放到数据库查询语句里。管用的漏洞利用 (Exploits) 一般会在网上贩卖或分享,如果漏洞很流行,或造成的危害很大,价格会越高,或者名气越大,有时甚至政府也会买漏洞利用,让他们侵入系统做间谍工作。当软件制造者不知道软件有新漏洞被发现了,那么这个漏洞叫 “零日漏洞”。黑帽黑客经常赶时间,抢在白帽程序员做出补丁之前,尽可能利用漏洞,所以保持系统更新非常重要,很多更新都是安全性补丁。如果有足够多的电脑有漏洞,让恶意程序可以在电脑间互相传播,那么叫"蠕虫"。如果黑客拿下大量电脑,这些电脑可以组成"僵尸网络",可以用于很多目的,比如发大量垃圾邮件,用别人电脑的计算能力和电费挖 Bitcoin,或发起"拒绝服务攻击"简称 DDoS,攻击服务器。DDoS 就是僵尸网络里的所有电脑发一大堆垃圾信息,堵塞服务器,要么迫使别人交钱消灾,或纯粹为了作恶。

尽管白帽黑客非常努力工作,漏洞利用的文档都在网上,编写软件有很多"最佳实践",网络攻击每天都在发生,每年损害全球经济差不多 5000 亿,并且随着我们越来越依赖计算机系统,这个数字只会增加。 这使得政府非常担心,因为基础设施越来越电脑化,比如电力厂,电网,交通灯,水处理厂,炼油厂,空管,还有很多其他关键系统。

很多专家预测下一次大战会主要是网络战争。国家不是被物理攻击打败,而是因为网络战争导致经济和基础设施崩溃。也许不会发射一颗子弹,但是人员伤亡的可能性依然很高,甚至可能高于传统战争,所以大家都应该知道一些方法保证网络安全。

全球社区因为互联网而互相连接,我们应该确保自己的电脑安全,抵御其他想做坏事的人,也许不要再忽略更新提示?

我们下周见。

33. 加密

i.e. Cryptography

(。・∀・)ノ゙嗨,我是 Carrie Anne,欢迎收看计算机科学速成课!

在过去两集,我们聊了很多计算机安全话题,但事实是 ,世上不存在 100%安全的系统,总会有漏洞存在,而且安全专家知道这一点,所以系统架构师会部署"多层防御",用多层不同的安全机制来阻碍攻击者。有点像城堡的设计一样,首先要避开弓箭手,穿过护城河,翻过城墙,避开热油,打败守卫,才能达到王座。不过我们这里要说的是,计算机安全中最常见的防御形式 - 密码学!

密码学 (cryptography) 一词 来自 crypto 和 graphy,大致翻译成"秘密写作"。为了加密信息,要用加密算法 (Cipher) 把明文转为密文,除非你知道如何解密,不然密文看起来只是一堆乱码。把明文转成密文叫"加密",把密文恢复回明文叫"解密"(decryption),加密算法早在计算机出现前就有了。

朱利叶斯·凯撒 用如今我们叫"凯撒加密"的方法 来加密私人信件,他会把信件中的字母 向前移动三个位置,所以 A 会变成 D,brutus 变成 euxwxv。为了解密,接收者要知道 1. 用了什么算法 2. 要偏移的字母位数。

有一大类算法叫"替换加密",凯撒密码是其中一种,算法把每个字母替换成其他字母。但有个巨大的缺点是,字母的出现频率是一样的,举个例子,E 在英语中是最常见的字母,如果把 E 加密成 X ,那么密文中 X 的出现频率会很高,熟练的密码破译师可以从统计数据中发现规律,进而破译密码。 1587 年,正因为一个"替换加密"的密文被破译,导致杀伊丽莎白女王的阴谋暴露,使得玛丽女王被处决。

另一类加密算法叫 “移位加密”。我们来看一个简单例子叫 “列移位加密”,我们把明文填入网格,网格大小我们这里选择 5x5,为了加密信息,我们换个顺序来读,比如从左边开始,从下往上,一次一列。加密后字母的排列不同了,解密的关键是,知道读取方向和网格大小是 5x5 。就像之前,如果接收者知道密文和加密方法 才能解密得到原始消息。

到了 1900 年代,人们用密码学做了加密机器,其中最有名的是德国的英格玛(Enigma)纳粹在战时用英格玛加密通讯信息。正如第 15 集中说过,Enigma 是一台像打字机的机器,有键盘和灯板,两者都有完整的字母表,而且它有一系列"转子"(rotros) ,是加密的关键。首先,我们只看一个转子,它一面有 26 个接触点,代表 26 个字母,然后线会连到另一面,替换字母,如果输入’H’,‘K’会从另一边出来,如果输入’K’,‘F’会从另一边出来,以此类推,这个字母替换过程你应该听起来很熟悉:它是"替换加密"! 但英格玛 (Enigma) 更复杂一些,因为它有 3 个或更多转子,一个转子的输出作为下一个转子的输入。 转子还有 26 个起始位置,还可以按不同顺序放入转子,提供更多字母替换映射。转子之后是一个叫"反射器"的特殊电路,它每个引脚会连到另一个引脚,并把信号发回给转子。最后,机器前方有一个插板,可以把输入键盘的字母预先进行替换,又加了一层复杂度。

让我们用这里的简化版电路,加密一些字母。如果我们按下"H"键,电流会先通过插板,然后通过转子,到达反射器,然后回来转子,回来插板,并照亮键盘灯板的字母"L",H 就加密成了 L 。注意,电路是双向的,所以如果我们按下 L,H 会亮起来。换句话说,加密和解密的步骤是一样的,你只需要确保 发送机和接收机的初始配置一样就行。如果你有仔细观察,会注意到字母加密后一定会变成另一个字母,之后这成为最大的弱点。最后,为了让英格玛不只是简单的"替换加密",每输入一个字母,转子会转一格,有点像汽车里程表。如果你输入 A-A-A,可能会变成 B-D-K,映射会随着每次按键而改变。英格玛当然是一块难啃的骨头,但正如我们第 15 集中说的,艾伦·图灵和同事破解了英格玛加密,并把大部分破解流程做成了自动化。

但随着计算机出现,加密从硬件转往软件,早期加密算法中,应用最广泛的是 IBM 和 NSA 于 1977 年开发的"数据加密标准"(Data Encryption Standard)。DES 最初用的是 56 bit 长度的二进制密钥,意味着有 2 的 56 次方,或大约 72 千万亿个不同密钥。在 1977 年时,也许 NSA 有这能力,但没有其他人有足够计算能力 来暴力破解所有可能密钥。但到 1999 年,一台 25 万美元的计算机能在两天内 把 DES 的所有可能密钥都试一遍,让 DES 算法不再安全。因此 2001 年出了:高级加密标准(AES,Advanced Encryption Standard)。

AES 用更长的密钥 - 128 位/192 位/256 位 - 让暴力破解更加困难。128 位的密钥,哪怕用现在地球上的所有计算机也要上万亿年才能试遍所有组合。你最好赶紧开始!AES 将数据切成一块一块,每块 16 个字节,然后用密钥进行一系列替换加密和移位加密,再加上一些其他操作,进一步加密信息,每一块数据,会重复这个过程 10 次或以上。你可能想知道:为什么只重复 10 次?为什么用 128 位密钥,而不是 10000 位?这其实是基于性能的权衡。如果要花几小时加密和发邮件,或几分钟载入网站,没人愿意用。AES 在性能和安全性间取得平衡,如今 AES 被广泛使用,比如 iPhone 上加密文件,用 WPA2 协议在 WiFi 中访问 HTTPS 网站。

到目前为止 ,我们讨论过的加密技术依赖于发送者和接收者都知道密钥,发件人用密钥加密,收件人用相同的密钥解密。以前,密钥可以口头约定,或依靠物品,比如德国人给英格玛配了密码本,上面有每天的配置,但互联网时代没法这样做,你能想象 要打开密码本才能访问 YouTube 吗?我们需要某种方法 在公开的互联网上传递密钥给对方,这看起来好像不安全,如果密钥被黑客拦截了,黑客不就能解密通信了吗?解决方案是 “密钥交换”!

密钥交换是一种不发送密钥,但依然让两台计算机在密钥上达成共识的算法,我们可以用"单向函数"来做。单项函数是一种数学操作,很容易算出结果,但想从结果逆向推算出输入非常困难。为了让你明白单项函数,我们拿颜色作比喻,将颜色混合在一起很容易,但想知道混了什么颜色很难,要试很多种可能才知道,用这个比喻,那么我们的密钥是一种独特的颜色。首先,有一个公开的颜色,所有人都可以看到,然后,约翰和我各自选一个秘密颜色,只有自己知道。为了交换密钥,我把我的 秘密颜色 和 公开颜色 混在一起,然后发给约翰,可以写信发,用信鸽发,什么方式都行。约翰也这样做,把他的秘密颜色和公开颜色混在一起,然后发我。我收到约翰的颜色之后,把我的秘密颜色加进去, 现在 3 种颜色混合在一起。John 也一样做。瞧!我们有了一样的颜色,我们可以把这个颜色当密钥,尽管我们从来没有给对方发过这颜色。外部窥探者可以知道部分信息,但无法知道最终颜色,当然,计算机要传输数据时,混合颜料和发颜料不太合适,但幸运的是,数学单向函数是完美的,我们可以用 “迪菲-赫尔曼密钥交换”。在 Diffie-Hellman 中,单向函数是模幂运算,意思是先做幂运算,拿一个数字当底数,拿一个数字当指数,比如 A

b

然后除以第三个数字,最后拿到我们想要的余数。

举个例子,假设我们想算 3 的 5 次方,模 31 ,我们先算 3 的 5 次方,得到 243,然后除 31,取余数,得到 26 。重点是如果只给余数和基数,很难得知指数是多少。如果我告诉你,3 的某次方 模 31,余数是 7 。你要试很多次,才能知道次方是多少。如果把数字变长一些,比如几百位长,想找到秘密指数是多少,几乎是不可能的。

现在我们来讨论 Diffie-Hellman 是怎么,用模幂运算 算出双方共享的密钥。首先,我们有公开的值 - 基数和模数,就像公开的油漆颜色,所有人都看的到,甚至坏人!为了安全向 John 发信息,我选一个秘密指数:X ,然后算 B^X mod M 的结果,然后把这个大数字发给 John 。John 也一样做,选一个秘密指数 Y,然后把 B^Y mod M 的结果发我,为了算出 双方共用的密钥,我把 John 给我的数,用我的秘密指数 X,进行模幂运算 (看上图),数学上相等于 B 的 XY 次方 模 M 。John 也一样做,拿我给他的数 进行模幂运算,最终得到一样的数。双方有一样的密钥,即使我们从来没给对方发过各自的秘密指数。我们可以用这个大数字当密钥,用 AES 之类的加密技术来加密通信,“Diffie-Hellman 密钥交换"是建立共享密钥的一种方法。

双方用一样的密钥加密和解密消息,这叫"对称加密”, 因为密钥一样,凯撒加密,英格玛,AES 都是"对称加密",还有"非对称加密",有两个不同的密钥,一个是公开的,另一个是私有的。人们用公钥加密消息 ,只有有私钥的人能解密。换句话说,知道公钥只能加密但不能解密 - 它是"不对称"的!

想象一个可以锁上的盒子,为了收到安全的信息,我们可以给别人箱子和锁,别人把信息放箱子,然后锁起来,把盒子寄回给我,只有我的钥匙能打开。上锁后,如果发件人或其他人想打开盒子 除了暴力尝试没有其他办法。和盒子例子一样,公钥加密后只能私钥来解密。反过来也是可以的:私钥加密后 ,用公钥解密。这种做法用于签名,服务器可以用私钥加密,任何人都可以用服务器的公钥解密,就像一个不可伪造的签名,因为只有私钥的持有人 能加密,这能证明数据来自正确的服务器或个人,而不是某个假冒者。

目前最流行的"非对称加密"技术是 RSA ,名字来自发明者: Rivest, Shamir, Adleman 。

现在你学会了现代密码学的所有"关键"部分: 对称加密,密钥交换,公钥密码学。

当你访问一个安全的网站,比如银行官网,绿色锁图标代表 用了公钥密码学,验证服务器的密钥,然后建立临时密钥,然后用对称加密保证通信安全。不管你是网上购物,发邮件给朋友,还是看猫咪视频,不管你是网上购物,发邮件给朋友,还是看猫咪视频,密码学都在保护你的隐私和安全。

谢啦密码学!

34. 机器学习 & 人工智能

i.e. Machine Learning & Artificial Intelligence

(。・∀・)ノ゙嗨,我是 Carrie Anne,欢迎收看计算机科学速成课!

我们之前说过 计算机很擅长存放,整理,获取和处理大量数据,很适合有上百万商品的电商网站,或是存几十亿条健康记录,方便医生看,但如果想根据数据做决定呢?这是机器学习的本质,机器学习算法让计算机可以从数据中学习,然后自行做出预测和决定,能自我学习的程序很有用 。比如判断是不是垃圾邮件?这人有心律失常吗?YouTube 的下一个视频该推荐哪个?虽然有用,但我们不会说它有人类一般的智能,虽然 AI 和 ML 这两词经常混着用。

大多数计算机科学家会说 ,机器学习是为了实现人工智能这个更宏大目标的技术之一,人工智能简称 AI(Artificial Intelligence)。机器学习和人工智能算法一般都很复杂,所以我们不讲具体细节,重点讲概念。

我们从简单例子开始:判断飞蛾是"月蛾"还是"帝蛾",这叫"分类",做分类的算法叫 “分类器”。虽然我们可以用 照片和声音 来训练算法,很多算法会减少复杂性,把数据简化成 “特征”,“特征"是用来帮助"分类"的值。对于之前的飞蛾分类例子我们用两个特征:“翼展"和"重量”,为了训练"分类器"做出好的预测,我们需要"训练数据”,为了得到数据,我们派昆虫学家到森林里 收集"月蛾"和"帝蛾"的数据。专家可以认出不同飞蛾,所以专家不只记录特征值,还会把种类也写上,这叫 “标记数据”。因为只有两个特征,很容易用散点图把数据视觉化。红色标了 100 个帝蛾蓝色标了 100 个月蛾,可以看到大致分成了两组,但中间有一定重叠,所以想完全区分两个组比较困难,所以机器学习算法登场 - 找出最佳区分。我用肉眼大致估算下,然后判断 翼展小于 45 毫米的 很可能是帝蛾,可以再加一个条件,重量必须小于 75 ,才算是帝蛾。这些线叫 “决策边界”,如果仔细看数据,86 只帝蛾在正确的区域,但剩下 14 只在错误的区域。另一方面,82 只月蛾在正确的区域,18 个在错误的区域。这里有个表 记录正确数和错误数,这表叫"混淆矩阵"。“黑客帝国三部曲"的后两部也许该用这个标题。注意我们没法画出 100% 正确分类的线,降低翼展的决策边界,会把更多"帝蛾"误分类成"月蛾”。如果提高,会把更多月蛾分错类。

机器学习算法的目的,是最大化正确分类 + 最小化错误分类。在训练数据中,有 168 个正确,32 个错误,平均准确率 84% 。用这些决策边界,如果我们进入森林,碰到一只不认识的飞蛾,我们可以测量它的特征,并绘制到决策空间上,这叫 “未标签数据”。决策边界可以猜测飞蛾种类,这里我们预测是"月蛾",这个把决策空间 切成几个盒子的简单方法,可以用"决策树"来表示。画成图像,会像左侧 用 if 语句写代码,会像右侧。生成决策树的 机器学习算法需要选择用什么特征来分类,每个特征用什么值。“决策树"只是机器学习的一个简单例子,如今有数百种算法,而且新算法不断出现,一些算法甚至用多个"决策树"来预测,计算机科学家叫这个"森林”,因为有多颗树嘛。也有不用树的方法,比如"支持向量机",本质上是用任意线段来切分"决策空间",不一定是直线,可以是多项式或其他数学函数。就像之前,机器学习算法负责找出最好的线,最准的决策边界。之前的例子只有两个特征,人类也可以轻松做到,如果加第 3 个特征,比如"触角长度",那么 2D 线段,会变成 3D 平面,在三个维度上做决策边界,这些平面不必是直的,而且 真正有用的分类器 会有很多飞蛾种类。你可能会同意 现在变得太复杂了,但这也只是个简单例子 - 只有 3 个特征和 5 个品种,我们依然可以用 3D 散点图 画出来。不幸的是,一次性看 4 个或 20 个特征,没有好的方法,更别说成百上千的特征了,但这正是机器学习要面临的问题。你能想象靠手工 在一个上千维度的决策空间里给超平面 (Hyperplane) 找出一个方程吗?大概不行。但聪明的机器学习算法可以做到, Google,Facebook,微软和亚马逊的计算机里整天都在跑这些算法。

“决策树"和"支持向量机"这样的技术 发源自统计学,统计学早在计算机出现前,就在用数据做决定。

有一大类机器学习算法用了统计学,但也有不用统计学的算法,其中最值得注意的是 人工神经网络,灵感来自大脑里的神经元,想学习神经元知识的人,可以看这 3 集。神经元是细胞,用电信号和化学信号 来处理和传输消息,它从其他细胞 得到一个或多个输入,然后处理信号并发出信号,形成巨大的互联网络,能处理复杂的信息。就像你的大脑 在看这个视频,人造神经元很类似,可以接收多个输入,然后整合并发出一个信号,它不用电信号或化学信号,而是吃数字进去,吐数字出来。它们被放成一层层,形成神经元网络,因此得名神经网络。

回到飞蛾例子,看如何用神经网络分类。

> 我们的第一层 - 输入层 -
> 提供需要被分类的单个飞蛾数据
> 同样,这次也用重量和翼展
> 
> 另一边是输出层,有两个神经元:
> 一个是帝蛾,一个是月蛾
> 2 个神经元里最兴奋的 就是分类结果
> 
> 中间有一个隐藏层
> 负责把输入变成输出,负责干分类这个重活
> 为了看看它是如何分类的
> 我们放大"隐藏层"里的一个神经元
> 神经元做的第一件事  是把每个输入乘以一个权重
> 
> 假设 2.8 是第一个输入,0.1 是第二个输入。
> 然后它会相加输入
> 总共是 9.74
> 
> 然后对这个结果,用一个偏差值处理
> 意思是 加或减一个固定值
> 比如-6,得到 3.74
> 
> 做神经网络时,这些偏差和权重,一开始会设置成随机值
> 然后算法会调整这些值 来训练神经网络
> 使用"标记数据"来训练和测试
> 逐渐提高准确性
> - 很像人类学习的过程
> 
> 最后,神经元有激活函数,它也叫传递函数,
> 会应用于输出,对结果执行最后一次数学修改
> 例如,把值限制在-1 和+1 之间
> 或把负数改成 0
> 我们用线性传递函数,它不会改变值
> 所以 3.74 还是 3.74
> 
> 所以这里的例子
> 输入 0.55 和 82,输出 3.74
> 这只是一个神经元,
> 但加权,求和,偏置,激活函数
> 会应用于一层里的每个神经元
> 并向前传播,一次一层
> 
> 数字最高的就是结果:
> 月蛾

重要的是,隐藏层不是只能有一层,可以有很多层,“深度学习"因此得名。训练更复杂的网络, 需要更多的计算量和数据。尽管神经网络 50 多年前就发明了,深层神经网络直到最近才成为可能,感谢强大的处理器和超快的 GPU,感谢游戏玩家对帧率的苛刻要求!

几年前,Google 和 Facebook 展示了深度神经网络 在照片中识别人脸的准确率,和人一样高 - 人类可是很擅长这个的! 这是个巨大的里程碑! 现在有深层神经网络开车,翻译,诊断医疗状况等等,这些算法非常复杂,但还不够"聪明”,它们只能做一件事,分类飞蛾,找人脸,翻译,这种 AI 叫"弱 AI"或"窄 AI”,只能做特定任务。但这不意味着它没用,能自动做出诊断的医疗设备,和自动驾驶的汽车真是太棒了!但我们是否需要这些计算机来创作音乐,在空闲时间找美味食谱呢?也许不要! 如果有的话 还挺酷的,真正通用的,像人一样聪明的 AI,叫 “强 AI”,目前没人能做出来 接近人类智能的 AI,有人认为不可能做出来,但许多人说 数字化知识的爆炸性增长 - 比如维基百科,网页和 Youtube 视频 - 是"强 AI"的完美引燃物。你一天最多只能看 24 小时的 YouTube ,计算机可以看上百万小时,比如,IBM 的沃森吸收了 2 亿个网页的内容,包括维基百科的全文。虽然不是"强 AI", 但沃森也很聪明 。在 2011 年的知识竞答中碾压了人类,AI 不仅可以吸收大量信息 也可以不断学习进步,而且一般比人类快得多。2016 年 Google 推出 AlphaGo - 一个会玩围棋的窄 AI ,它和自己的克隆版下无数次围棋 ,从而打败最好的人类围棋选手。

学习什么管用,什么不管用 自己发现成功的策略,这叫 “强化学习” ,是一种很强大的方法,和人类的学习方式非常类似。人类不是天生就会走路,是上千小时的试错学会的,计算机现在才刚学会反复试错来学习,对于很多狭窄的问题,强化学习已被广​​泛使用,有趣的是,如果这类技术可以更广泛地应用,创造出类似人类的"强 AI" 能像人类小孩一样学习,但学习速度超快。 如果这发生了,对人类可能有相当大的影响 - 我们以后会讨论。

感谢收看。我们下周见。

35. 计算机视觉

i.e. Computer Vision

(。・∀・)ノ゙嗨 我是 Carrie Anne,欢迎收看计算机科学速成课

今天, 我们来思考视觉的重要性,大部分人靠视觉来做饭,越过障碍,读路牌,看视频,以及无数其它任务。视觉是信息最多的感官 ,比如周围的世界是怎样的,如何和世界交互,因此半个世纪来计算机科学家一直在想办法让计算机有视觉,因此诞生了"计算机视觉"这个领域,目标是让计算机理解图像和视频。用过相机或手机的都知道 ,可以拍出有惊人保真度和细节的照片 - 比人类强得多,但正如计算机视觉教授 李飞飞 最近说的,“听到"不等于"听懂”,“看到"不等于"看懂”。

复习一下,图像是像素网格,每个像素的颜色通过三种基色定义:红,绿,蓝,通过组合三种颜色的强度 ,可以得到任何颜色, 也叫 RGB 值。

最简单的计算机视觉算法,最合适拿来入门的,是跟踪一个颜色物体,比如一个粉色的球。首先,我们记下球的颜色,保存最中心像素的 RGB 值,然后给程序喂入图像,让它找最接近这个颜色的像素。算法可以从左上角开始,逐个检查像素,计算和目标颜色的差异,检查了每个像素后,最贴近的像素,很可能就是球。不只是这张图片, 我们可以在视频的每一帧图片跑这个算法,跟踪球的位置。当然,因为光线,阴影和其它影响,球的颜色会有变化,不会和存的 RGB 值完全一样,但会很接近。如果情况更极端一些 比如比赛是在晚上,追踪效果可能会很差。如果球衣的颜色和球一样,算法就完全晕了,因此很少用这类颜色跟踪算法,除非环境可以严格控制。

颜色跟踪算法是一个个像素搜索, 因为颜色是在一个像素里,但这种方法 不适合占多个像素的特征,比如物体的边缘,是多个像素组成的。为了识别这些特征,算法要一块块像素来处理,每一块都叫"块"。举个例子,找垂直边缘的算法,假设用来帮无人机躲避障碍。为了简单,我们把图片转成灰度 ,不过大部分算法可以处理颜色,放大其中一个杆子,看看边缘是怎样的,可以很容易地看到 杆子的左边缘从哪里开始,因为有垂直的颜色变化。我们可以弄个规则说,某像素是垂直边缘的可能性 取决于左右两边像素的颜色差异程度,左右像素的区别越大,这个像素越可能是边缘,如果色差很小,就不是边缘,这个操作的数学符号 看起来像这样,这叫"核"或"过滤器",里面的数字用来做像素乘法,总和 存到中心像素里。

我们来看个实际例子。我已经把所有像素转成了灰度值,现在把"核"的中心,对准感兴趣的像素,这指定了每个像素要乘的值,然后把所有数字加起来。在这里,最后结果是 147,成为新像素值,把 核 应用于像素块,这种操作叫"卷积"。现在我们把"核"应用到另一个像素,结果是 1,色差很小,不是边缘。如果把"核"用于照片中每个像素,结果会像这样,垂直边缘的像素值很高,注意,水平边缘(比如背景里的平台),几乎看不见。如果要突出那些特征,要用不同的"核",用对水平边缘敏感的"核",这两个边缘增强的核叫 “Prewitt 算子”,以发明者命名,这只是众多"核"的两个例子。

“核"能做很多种图像转换,比如这个"核"能锐化图像,这个"核"能模糊图像。“核"也可以像饼干模具一样,匹配特定形状,之前做边缘检测的"核”,会检查左右或上下的差异,但我们也可以做出 擅长找线段的"核”,或者包了一圈对比色的区域,这类"核"可以描述简单的形状,比如鼻梁往往比鼻子两侧更亮,所以线段敏感的"核"对这里的值更高,眼睛也很独特 - 一个黑色圆圈被外层更亮的一层像素包着,有其它"核"对这种模式敏感。

当计算机扫描图像时,最常见的是用一个窗口来扫,可以找出人脸的特征组合,虽然每个"核"单独找出脸的能力很弱 ,但组合在一起会相当准确,不是脸但又有一堆脸的特征在正确的位置,这种情况不太可能。这是一个早期很有影响力的算法的基础,叫 维奥拉·琼斯 人脸检测算法,如今的热门算法是 “卷积神经网络”。

我们上集谈了神经网络,如果需要可以去看看,总之,神经网络的最基本单位,是神经元,它有多个输入,然后会把每个输入 乘一个权重值,然后求总和。听起来好像挺耳熟,因为它很像"卷积"。实际上,如果我们给神经元输入二维像素,完全就像"卷积",输入权重等于"核"的值,但和预定义"核"不同,神经网络可以学习对自己有用的"核",来识别图像中的特征。“卷积神经网络"用一堆神经元处理图像数据,每个都会输出一个新图像,本质上是被不同的"核"处理了,输出会被后面一层神经元处理,卷积卷积再卷积,第一层可能会发现"边缘"这样的特征,单次卷积可以识别出这样的东西,之前说过,下一层可以在这些基础上识别,比如由"边缘"组成的角落,然后下一层可以在"角落"上继续卷积,下一些可能有识别简单物体的神经元,比如嘴和眉毛,然后不断重复,逐渐增加复杂度,直到某一层把所有特征放到一起: 眼睛,耳朵,嘴巴,鼻子,然后说:“啊哈,这是脸!”

“卷积神经网络"不是非要很多很多层,但一般会有很多层,来识别复杂物体和场景,所以算是"深度学习” 。“维奥拉·琼斯"和"卷积神经网络"不只是认人脸,还可以识别手写文字,在 CT 扫描中发现肿瘤,监测马路是否拥堵,但我们这里接着用人脸举例。

不管用什么算法,识别出脸之后,可以用更专用的计算机视觉算法 来定位面部标志,比如鼻尖和嘴角,有了标志点,判断眼睛有没有张开就很容易了,只是点之间的距离罢了,也可以跟踪眉毛的位置,眉毛相对眼睛的位置 可以代表惊喜或喜悦,根据嘴巴的标志点,检测出微笑也很简单,这些信息可以用"情感识别算法"来识别。让电脑知道你是开心,忧伤,沮丧,困惑等等,然后计算机可以做出合适的行为。比如当你不明白时 给你提示,你心情不好时,就不弹更新提示了,这只是计算机通过视觉感知周围的一个例子。不只是物理环境 - 比如是不是在上班,或是在火车上,还有社交环境 - 比如是朋友的生日派对,还是正式商务会议。你在不同环境会有不同行为,计算机也应如此,如果它们够聪明的话。..

面部标记点 也可以捕捉脸的形状,比如两只眼睛之间的距离,以及前额有多高,做生物识别,让有摄像头的计算机能认出你。不管是手机解锁, 还是政府用摄像头跟踪人,人脸识别有无限应用场景。另外,跟踪手臂和全身的标记点,最近也有一些突破,让计算机理解用户的身体语言,比如用户给联网微波炉的手势。

正如系列中常说的,抽象是构建复杂系统的关键。

计算机视觉也是一样。硬件层面,有工程师在造更好的摄像头 ,让计算机有越来越好的视力,我自己的视力却不能这样。用来自摄像头的数据 ,可以用视觉算法找出脸和手,然后可以用其他算法接着处理,解释图片中的东西,比如用户的表情和手势。有了这些,人们可以做出新的交互体验,比如智能电视和智能辅导系统 会根据用户的手势和表情来回应。

这里的每一层都是活跃的研究领域,每年都有突破,这只是冰山一角。如今, 计算机视觉无处不在 - 商店里扫条形码, 等红灯的自动驾驶汽车,或是 Snapchat 里添加胡子的滤镜。令人兴奋的是,一切才刚刚开始。最近的技术发展,比如超快的 GPU,会开启越来越多可能性。视觉能力达到人类水平的计算机 会彻底改变交互方式,当然,如果计算机能听懂我们然后回话,就更好了。

我们下周讨论,到时见。

36. 自然语言处理

i.e. Natural Language Processing

(。・∀・)ノ゙嗨 我是 Carrie Anne,欢迎收看计算机科学速成课

上集我们讨论了计算机视觉 - 让电脑能看到并理解,今天我们讨论怎么让计算机理解语言。你可能会说:计算机已经有这个能力了,在第 9 和第 12 集,我们聊了机器语言和更高层次的编程语言。虽然从定义来说 ,它们也算语言,但词汇量一般很少,而且非常结构化,代码只能在拼写和语法完全正确时,编译和运行。

当然,这和人类语言完全不同 - 人类语言叫"自然语言”。自然语言有大量词汇,有些词有多种含义,不同口音,以及各种有趣的文字游戏。人们在写作和说话时也会犯错,比如单词拼在一起发音,关键细节没说 ,导致意思模糊两可,以及发错音。但大部分情况下,另一方能理解,人类有强大的语言能力,因此,让计算机拥有语音对话的能力,这个想法从构思计算机时就有了。

“自然语言处理"因此诞生,简称 NLP(Natural Language Processing),结合了计算机科学和语言学的 一个跨学科领域。单词组成句子的方式有无限种,我们没法给计算机一个字典,包含所有可能句子,让计算机理解人类在嘟囔什么,所以 NLP 早期的一个基本问题是 怎么把句子切成一块块,这样更容易处理。

上学时,老师教你 英语单词有九种基本类型:名词,代词,冠词,动词,形容词,副词,介词,连词和感叹词,这叫"词性”。还有各种子类,比如单数名词 vs 复数名词 ,副词最高级 vs 副词比较级,但我们不会深入那些。

了解单词类型有用,但不幸的是,很多词有多重含义 比如 rose 和 leaves ,可以用作名词或动词。仅靠字典,不能解决这种模糊问题,所以电脑也要知道语法,因此开发了 “短语结构规则” 来代表语法规则。例如,英语中有一条规则,句子可以由一个名词短语和一个动词短语组成,名词短语可以是冠词,如 the ,然后一个名词,或一个形容词后面跟一个名词。你可以给一门语言制定出一堆规则,用这些规则,可以做出"分析树”,它给每个单词标了可能是什么词性,也标明了句子的结构。数据块更小 ,更容易处理,每次语音搜索,都有这样的流程,比如 “最近的披萨在哪里”,计算机能明白这是"哪里"(where)的问题,知道你想要名词"披萨"(pizza),而且你关心的维度是"最近的"(nearest)。“最大的长颈鹿是什么?“或"Thriller 是谁唱的?” 也是这样处理。

把语言像乐高一样拆分,方便计算机处理,计算机可以回答问题 ,以及处理命令,比如"设 2:20 的闹钟”,或"用 Spotify 播放 T-Swizzle",但你可能体验过,如果句子复杂一点,计算机就没法理解了。

嘿 Siri ...... 俺觉得蒙古人走得太远了
在这个最温柔的夏日的日子里,你觉得怎么样?

Siri:我没明白

还有,“短语结构规则"和其他把语言结构化的方法,可以用来生成句子。数据存在语义信息网络时,这种方法特别有效,实体互相连在一起,提供构造句子的所有成分。Siri:Thriller 于 1983 年发行,由迈克尔杰克逊演唱,Google 版的叫"知识图谱”。

在 2016 年底,包含大概七百亿个事实,以及不同实体间的关系,处理, 分析, 生成文字 ,是聊天机器人的最基本部件 - 聊天机器人就是能和你聊天的程序。早期聊天机器人大多用的是规则,专家把用户可能会说的话,和机器人应该回复什么,写成上百个规则,显然,这很难维护,而且对话不能太复杂。

一个著名早期例子叫 Eliza ,1960 年代中期 诞生于麻省理工学院,一个治疗师聊天机器人。它用基本句法规则 来理解用户打的文字,然后向用户提问,有时候会感觉像和人类沟通一样,但有时会犯简单甚至很搞笑的错误。

聊天机器人和对话系统,在过去五十年发展了很多,如今可以和真人很像!如今大多用机器学习,用上 GB 的真人聊天数据 来训练机器人,现在聊天机器人已经用于客服回答,客服有很多对话可以参考,人们也让聊天机器人互相聊天。在 Facebook 的一个实验里,聊天机器人甚至发展出自己的语言,很多新闻把这个实验 报导的很吓人,但实际上只是计算机 在制定简单协议来帮助沟通,这些语言不是邪恶的,而是为了效率。

但如果听到一个句子 - 计算机怎么从声音中提取词汇?这个领域叫"语音识别"。这个领域已经重点研究了几十年,贝尔实验室在 1952 年推出了第一个语音识别系统,绰号 Audrey,自动数字识别器。如果你说得够慢,它可以识别全部十位数字,这个项目没有实际应用,因为手输快得多。十年后,1962 年的世界博览会上,IBM 展示了一个鞋盒大小的机器,能识别 16 个单词,为了推进"语音识别"领域的研究,DARPA 在 1971 年启动了一项雄心勃勃的五年筹资计划,之后诞生了卡内基梅隆大学的 Harpy。Harpy 是第一个可以识别 1000 个单词以上的系统,但那时的电脑,语音转文字,经常比实时说话要慢十倍或以上。幸运的是,1980,1990 年代 计算机性能的大幅提升,实时语音识别变得可行,同时也出现了处理自然语言的新算法,不再是手工定规则,而是用机器学习,从语言数据库中学习。

如今准确度最高的语音识别系统 用深度神经网络,我们在第 34 集讲过。为了理解原理,我们来看一些对话声音,先看元音,比如 a 和 e ,这是两个声音的波形,我们在第 21 集(文件格式)说过。

这个信号来自 麦克风内部隔膜震动的频率,在这个视图中,横轴是时间,竖轴是隔膜移动的幅度,或者说振幅,虽然可以看到 2 个波形有区别,但不能看出,“啊!这个声音肯定是 e”。为了更容易识别,我们换个方式看:

谱图

这里横轴还是时间,但竖轴不是振幅,而是不同频率的振幅,颜色越亮,那个频率的声音越大,这种波形到频率的转换 是用一种很酷的算法做的 - 快速傅立叶变换(FFT)。如果你盯过立体声系统的 EQ 可视化器,它们差不多是一回事,谱图是随着时间变化的,你可能注意到,信号有种螺纹图案,那是我声道的回声。为了发出不同声音,我要把声带,嘴巴和舌头变成不同形状,放大或减少不同的共振,可以看到有些区域更亮,有些更暗。如果从底向上看,标出高峰 - 叫"共振峰" - 可以看到有很大不同,所有元音都是如此,这让计算机可以识别元音,然后识别出整个词。

让我们看一个更复杂的例子,当我说"她很开心"的时候,可以看到 e 声,和 a 声,以及其它不同声音,比如 she 中的 shh 声,was 中的 wah 和 sss,等等,这些构成单词的声音片段叫"音素"。语音识别软件 知道这些音素,英语有大概 44 种音素,所以本质上变成了音素识别,还要把不同的词分开,弄清句子的开始和结束点,最后把语音转成文字,使这集视频开头里讨论的那些技术成为可能。因为口音和发音错误等原因,人们说单词的方式略有不同,所以结合语言模型后,语音转文字的准确度会大大提高。里面有单词顺序的统计信息,比如:“她"后面很可能跟一个形容词,比如"很开心”,“她"后面很少是名词,如果不确定是 happy 还是 harpy,会选 happy,因为语言模型认为可能性更高。

最后,我们来谈谈 “语音合成”,让计算机输出语音,它很像语音识别,不过反过来。把一段文字,分解成多个声音,然后播放这些声音。早期语音合成技术,可以清楚听到音素是拼在一起的,比如这个 1937 年贝尔实验室的手动操作机器,不带感情的说 “她看见了我”。

到了 1980 年代,技术改进了很多,但音素混合依然不够好,产生明显的机器人声。如今,电脑合成的声音,比如 Siri, Cortana, Alexa 好了很多,但还不够像人,但我们非常非常接近了,这个问题很快会被解决。

现在语音界面到处都是,手机里,汽车里,家里,也许不久之后耳机也会有。这创造一个正反馈循环,人们用语音交互的频率会提高,这又给了谷歌,亚马逊,微软等公司更多数据来训练语音系统,提高准确性。准确度高了,人们更愿意用语音交互,越用越好,越好越用。很多人预测,语音交互会越来越常见,就像如今的屏幕,键盘,触控板等设备,这对机器人发展是个好消息。

机器人就不用走来走去时带个键盘和人类沟通。

下周我们讲机器人。到时见。

37. 机器人

i.e. Robots

嗨,我是 Carrie Anne,欢迎收看计算机速成课。

今天 我们要讨论机器人,你脑中冒出来的第一个印象估计是 类人机器人,经常在电视剧和电影里看到。有时候它们是朋友和同事,但更常见的是阴险无情,身经百战。我们经常把机器人看成未来科技,但事实是:机器人时代已经来临了 - 它们是同事,帮我们把困难的工作,做得更快更好。机器人的定义有很多种,但总的来说,机器人由计算机控制,可以自动执行一系列动作的机器,外观并不重要,可以是给汽车喷漆的机械臂,无人机,或辅助外科医生的蛇状机器人,以及人形机器人。

有时我们叫虚拟人物"机器人”,但叫 bot 甚至 agent 会更合适,因为"机器人"的潜在含义是存在于现实世界中的机器。robot (机器人) 一词 ,首次出现在 1920 年的一部捷克戏剧,代表人造的类人角色。robot 源于斯拉夫语词汇 robota 代表强迫劳动,代表农民在十九世纪 欧洲封建社会的强迫劳动,戏剧没讲太多技术细节。但即使一个世纪后,这种描述依然很普遍:机器人都是大规模生产,高效不知疲倦,看起来像人的东西,但毫无情感,不会保护自己,没有创造力。

更广义的自动运行机器,早在 1920 年代前就有了。很多古代发明家 发明了能自动运行的机械装置,比如计时和定时敲钟。有很多装置 ,有动物和人类的形象 ,能跳舞,唱歌,打鼓等。这些不用电,而且肯定没有电子部件的机器,叫"自动机"。

举个例子 1739 年法国人 Jacques de Vaucans 做了个自动机,法语叫 Canard Digerateur,翻译过来是 “吃饭鸭”,一个像鸭子的机器,能吃东西然后排便。伏尔泰在 1739 年写,“如果没有吃饭鸭的声音,还有什么能提醒你法国的荣光呢?”

一个名声很臭的例子是"土耳其行棋傀儡",一个能下国际象棋的人形机器人,在 1770 年建造完成后,就在欧洲各地展览。好棋艺惊叹观众,像某种机械人工智能,不幸的是,这是个骗局 - 机器里有人控制。

第一台计算机控制的机器,出现在 1940 年代晚期,这些计算机数控的机器,简称 CNC (Computer Numerical Control)机器,可以执行一连串 程序指定的操作,精细的控制 ,让我们能生产之前很难做的物品,比如从一整块铝 加工出复杂的螺旋桨 - 这用普通机械工具很难做到,并且误差容忍度很小,无法手工加工。CNC 机器大大推进了制造业,不仅提高了制造能力和精确度 ,还降低了生产成本 - 我们之后会深入讨论这个(第 40 集)。

第一个商业贩卖的 可编程工业机器人 叫 Unimate,于 1960 年卖给通用汽车公司,它可以把压铸机做出来的热金属成品提起来,然后堆起来,机器人行业由此开始。很快,机器人开始堆叠货盘,焊接,给汽车喷漆等等。对于简单运动 - 比如机器爪子 在轨道上来回移动,可以指示它移动到特定位置,它会一直朝那个方向移动,直到到达 然后停下来,这种行为 可以用简单控制回路做。

首先,判断机器人的位置,我们到了吗?
没有
那么继续前进

再次判断位置

我们到了吗?
没有,所以继续前进

我们到了吗?
是的!

现在可以停下来了,别问了!

因为我们在不断缩小 当前位置和目标位置的距离,这个控制回路 更准确的叫 “负反馈回路”。负反馈回路 有三个重要部分:

首先是一个传感器,可以测量现实中的东西,比如水压,马达位置,气温,或任何你想控制的东西,根据传感器,计算和目标值相差多大,得到一个"错误",然后"控制器"会处理这个"错误",决定怎么减小错误,然后用泵,电机,加热元件,或其他物理组件来做出动作。在严格控制的环境中,这种简单控制回路也够用了,但在很多现实应用中,情况复杂得多,假设爪子很重,哪怕控制回路叫停了,惯性让爪子超过了预期位置,然后控制回路又开始运行,叫爪子移动回去。一个糟糕的控制回路 可能会让爪子不断来回移动,甚至永远循环。更糟糕的是,现实世界中,机器人会受到各种外力影响,比如摩擦力,风,等等。为了处理这些外力,我们需要更复杂的控制逻辑。

一个使用广泛的机制,有控制回路和反馈机制,叫 “比例-积分-微分控制器”。这个有点绕口,所以一般简称 “PID 控制器”,它以前是机械设备,现在全是纯软件了。想象有一个机器人,端咖啡给客人,设计目标是 每秒两米的速度在顾客间穿行,这个速度是理想速度,安全又合适。当然,环境是会变化的,有时候有风,有时候有上坡下坡,以及其他影响机器人速度的因素,所以,给马达的动力要加大或减少,以保持目标速度。用机器人的速度传感器,我们可以把当前速度和目标速度画张图,PID 控制器根据这些数据,算出 3 个值,首先是 “比例值” ,就是"实际值"和"理想值"差多少,“实际值"可能有一定滞后,或者是实时的。之前的简单控制回路,用的就是这个值,“实际值"和"理想值"的差距越大,就越用力。换句话说,它是"比例控制"的。接下来,算 “积分值” ,就是一段时间内 误差的总和,比如最近几秒,帮助弥补误差,比如上坡时可能就会产生误差。如果这个值很大,说明比例控制不够,要继续用力前进。最后有 “导数值” ,是期望值与实际值之间的变化率,有助于解决 未来可能出现的错误, 有时也叫"预期控制”,比如前进的太快,要稍微放松一点,避免冲过头。

这三个值会一起使用,它们有不同权重,然后用来控制系统。PID 控制器到处都是,比如汽车里的巡航控制,无人机调整螺旋桨速度,以保持水平,以及一些更奇怪的机器人,比如这个用球来平衡和移动的机器人。更高级的机器人一般需要多个控制回路同时运行,来保持机器人平衡,调整肢体位置,等等。

之前说过,控制回路负责把机器人的属性(比如当前位置)变成期望值,你可能好奇这些值 是哪里来的,这是更高层软件的责任。软件负责做出计划 并让机器人执行动作,比如制定一条路线来绕过障碍物,或者把任务分成一步步,比如把拿起一个球,分解成一个个简单连续动作。用这些技术,机器人已经取得不少令人印象深刻的成就 - 它们潜到了海洋最深处,在火星上跑了十几年。

但有趣的是,许多对人类来说很简单的任务,对机器人很困难: 比如两条腿走路,开门,拿东西时不要捏碎了,或是穿 T 恤,或是摸狗,这些你可能想都不用想,但有超级计算机能力的机器人却做不到。机器人研究领域在全力解决这些问题,我们前几集聊过的 人工智能,最有可能解决这些问题。例如,谷歌在进行一项实验,让一堆机器人手臂把各种东西,从一个盒子拿到另一个盒子,不断试错学习。经过数千小时的练习,机器人把错误率降低了一半。不像人类,机器人可以 24 小时全天运行,而且多个手臂同时练习,所以机器人擅长抓东西只是时间问题,但现在,小婴儿都比机器人更会抓东西。

近年最大的突破之一,是无人驾驶汽车。如果你仔细想想,汽车没几个输入 - 只是加速减速,左转右转,难的问题是 判断车道,理解路标,预测车流,车流中穿行,留心行人和骑自行车的,以及各种障碍。车上布满了传感器,无人驾驶汽车非常依赖计算机视觉算法,我们在第 35 集讨论过。

现在也开始出现类人机器人 - 外貌和行为像人类的机器人,不过现在两个目标都没接近(外貌和行为),因为看起来一般怪怪的,行为也怪怪的。但至少有《西部世界》可以看看。无论如何,对机器人研究者来说,把各种技术结合起来,比如人工智能,计算机视觉和自然语言处理,来让机器人越来越像人,是个诱人的目标。至于人类为什么如此着迷 做出和我们一样的机器人,你得去看《哲学速成课》。在未来好一段时间里,和人类一样的机器人 依然只能存在科幻小说里。军队也对机器人很有兴趣 - 因为机器人可以替换, 而且力量,耐力,注意力,准确性可以远超人类。拆弹机器人和无人侦察机如今很常见,但完全自主决定,全副武装的机器人也在慢慢出现,比如韩国的三星 SGR-A1 哨兵炮,有智力并且可以杀人的机器人,叫 “致命自主武器”,这种武器是复杂又棘手的问题。毫无疑问,它们可以把士兵从战场带离 挽救生命,甚至阻止战争的发生。值得注意的是 人们对炸药和核弹也说过一样的话。另一方面,我们可能会不小心创造出 无情又高效的杀人机器,没有人类般的判断力和同情心,战争的硝烟会变得更加黑暗和复杂。机器人会接受命令并高效执行,但有时人类的命令是错的。

这场辩论会持续很长时间,而且随着机器人技术的进步,两边的辩论会越来越激烈,这也是个老话题了。

科幻作家 艾萨克·阿西莫夫 早预见了这种危险,他在 1942 年短篇小说 Runaround 中写了"机器人三定律”,之后又加了"定律 0"。简单说 这些定律指导机器人的行为准则 或者说道德指南,让机器人不要伤害,特别是不要伤害人类,这些规则实践起来相当不足,并且有很多模糊的地方,但阿西莫夫三定律 激发了大量科幻小说讨论和学术讨论, 如今有专门讨论机器人伦理的会议。重要的是,阿西莫夫写这些虚构规则,是为了反对 “机器人都很邪恶” 这种常见描述。他童年读的小说里,这样的场景很常见,机器人脱离控制,然后伤害甚至毁灭创造者。阿西莫夫认为 机器人有用,可靠,甚至可以让人喜爱。

我想让你思考这种两面性。我们讨论过的许多技术,有好的一面也有坏的一面,我们要认真思考计算机的潜力和危害,来改善这个世界,而机器人最能提醒我们这一点了。

我 们 下 周 见。

38. 计算机心理学

i.e. Psychology of Computing

(。・∀・)ノ゙嗨,我是 Carrie Anne 欢迎收看计算机科学速成课!

在这个系列中,我们聊的话题几乎全是计算机-比如电路和算法,毕竟这是计算机速成课,但归根结底,计算机只是给人用的工具,而人类有点。.. 乱。

人类不是被工程师设计的,没有具体性能规格。我们一会儿是理性的,一会儿是不理性的。你有没有对导航生过气?或是漫无目的的刷维基百科?求浏览器加载快点?给扫地机器人取名?这些是人类行为!

为了做出使用愉快的计算机,我们需要了解计算机和人类的优缺点。优秀的系统设计师在创造软件时,会运用社会心理学,认知心理学,行为心理学,感知心理学的原理。你肯定见过难用的物理界面/计算机界面 阻碍你做事,甚至糟糕到放弃使用,那个界面的"易用度"很差。“易用度"指的是人造物体,比如软件 达到目的的效率有多高。为了帮助人类工作,我们需要了解人类 - 怎么看,思考,反应和互动。

举个例子,心理学家已经对 人类的视觉系统做了全面的研究,我们知道人类擅长给颜色强度排序,这里有三个颜色,你能从浅色到深色排序吗?你可以轻易做到,所以颜色强度很适合显示连续值。另一方面,人类很不擅长排序颜色,这是另一个例子,把橙色放到蓝色前面还是后面?绿色放哪里?你可能想通过光的波长排序 ,就像彩虹一样,但这样太累了。大部分人会很慢而且容易出错,由于视觉系统天生是这样,所以用不同颜色显示连续性数据,是个糟糕的选择,你得经常看表格来对比数据。 然而,如果数据没有顺序,用不同颜色就很合适,比如分类数据,也许这些看起来很明显 ,但你会惊讶有多少设计把这些基本事情搞错。

除了视觉 ,理解人类的认知系统能帮我们设计更好的界面,比如,如果信息分块了 ,会更容易读,更容易记。分块是指把信息分成更小,更有意义的块,人类的短期记忆能记住 5 到 9 个东西,保守一点,分组一般是 5 个或更少,所以电话号码一般分块,比如 317-555-3897 。10 个连续数可能会忘,分成 3 块更好记。从计算机的角度来看,分块更费时费空间,效率更低,但这对人类更有效率 - 碰到这种抉择时,我们总是以人类优先。现在我们还是老大,暂时啦。

界面设计用了分块, 比如下拉菜单 和带按钮的菜单栏,对电脑来说,全部挤在一起更有效率,分块浪费内存 浪费屏幕,但这样设计更容易扫视,记住和访问。界面设计中另一个重点概念是"直观功能”,Don Norman 让这个词在计算机界流行起来,根据他的说法,“直观功能 为如何操作物体提供线索,平板用来推,旋钮用来转,插槽用来插东西,[…] 直观功能做的好,用户只需要看一眼就知道怎么做: 不需要图片,标签或指南来说明”。

如果你拉过门把手打不开,然后意识到要推开才对,那么你发现了一个坏掉的"直观功能"。平板是更好的设计,因为只能推开,门是简单的东西,如果你要贴指示让人们明白怎么用,那么也许你应该重新设计。

“直观功能"广泛用于图形界面,我们在第 26 集讨论过,这是图形界面比命令行更容易用的原因之一。你不用猜测屏幕上什么东西是可点的,可点的会看起来像按钮,他们弹出来,只是等着你压他们!

我最喜欢的"直观功能"之一,是向用户表明元素是可拖动的,“滚花” - 一种视觉纹理,告诉用户哪里可以拖动,这个点子来自现实世界中的工具,和"直观功能"相关的一个心理学概念是 “认出与回想”。如果你考过试,肯定感受过这个,这就是为什么选择题比填空题容易。一般来说,用感觉来触发记忆会容易得多,比如文字,图片或声音,所以我们用图标代表功能 - 比如"垃圾桶"图标 代表里面放着被删除的文件。我们不用去回想图标的功能是什么,只要能认出来就行了,比命令行好得多,命令行得依靠记忆来输命令,到底是输入"删除"“移除"“垃圾"还是"射出”?可能是任何命令! 顺带一说,在 Linux 里删除文件的命令是 “rm” 。

回到正题,让所有菜单选项好找好记,有时候意味着用的时候会慢一些,这与另一个心理学概念冲突:“专业知识”。当你用界面熟悉之后,速度会更快一些,建立如何高效完成事情的"心理模型”,所以 好的界面应该提供多种方法来实现目标。一个好例子是复制粘贴,可以在"编辑"的下拉菜单中找到,也可以用快捷键,一种适合新手,一种适合专家,两者都不耽误,鱼和熊掌兼得!

除了让人类做事更高效,我们也希望电脑能有一点情商,能根据用户的状态做出合适地反应,能根据用户的状态做出合适地反应,让使用电脑更加愉快。Rosalind Picard 在 1995 年关于"情感计算"的论文中,阐述了这一愿景,这篇论文开创了心理学,社会科学和计算机科学的跨学科结合,促进了让计算机理解人类情感的研究,这很重要,因为情绪会影响日常活动,比如学习,沟通和决策。情感系统会用传感器,录声音,录像(你的脸)以及生物指标,比如出汗和心率,得到的数据和计算模型结合使用。模型会写明人类如何表达情感,怎么是快乐 ,怎么是沮丧,以及社交状态,比如友谊和信任。模型会估算用户的情绪,以及怎样以最好的回应用户,以达到目标,比如让用户冷静下来,建立信任,或帮忙完成作业。

Facebook 在 2012 年进行了一项"影响用户"的研究,数据科学家在一个星期内,修改了很多用户 时间线上显示的内容,有些人会看到更多积极向上的内容,有些人会看到更多负面消极的内容。研究人员分析了那一周内人们的发帖,发现看到积极向上内容的用户,发的帖子往往更正面。另一方面,看到负面内容的用户,发的内容也更负面。显然,Facebook 和其他网站向你展示的内容,绝对会对你有影响。作为信息的守门人,这是巨大的机会 ,同时也是责任,研究结果相当有争议性。而且它还产生了一个有趣的问题: 计算机程序如何回应人类?

如果用户的情绪比较负面,也许电脑不应该以一种烦人的 “你要振作起来呀” 的态度回答问题。或者,也许电脑应该试着积极正面的回应用户,即使这有点尴尬。什么行为是"正确的”,是个开放性的研究问题。

既然说到 Facebook,这是一个"以计算机为媒介沟通"的好例子,简称 “CMC”(computer-mediated communication),也是一个很大的研究领域。这包括同步通信 - 所有参与者同时在线进行视频通话,以及异步通信 - 比如推特,邮件,短信,人们可以随时随地回复信息。研究人员还研究用户怎么用表情包,怎么轮换发言,以及用不同沟通渠道时,用词有什么区别。

一个有趣的发现是,比起面对面沟通,人们更愿意在网上透露自己的信息。所以如果想知道用户 真正花了多少小时看"大英烘培大赛"(电视节目),比起做个带脸的虚拟助理 做 聊天机器人 是个更好的选择。心理学研究也表明,如果想说服,讲课,或引起注意 眼神注视非常重要。在谈话时看着别人叫 相互凝视,这被证明可以促进参与感 帮助实现谈话目标,不管是学习,交朋友,还是谈生意。在录像讲座中,老师很少直视相机, 一般是看在场学生,对他们没问题,但这会让在线看视频的人没什么参与感,为此,研究人员开发了计算机视觉和图形软件 来纠正头部和眼睛,视频时会觉得对方在直视摄像头,看着他们,这叫"增强凝视"。类似技术也用于视频会议,纠正摄像头位置,因为摄像头几乎总在屏幕上方,因为你一般会盯着屏幕上的另一方 ,而不是盯着摄像头,所以视频里看起来像在向下看。没有相互凝视 - 这会导致各种不幸的副作用,比如权力不平衡,幸运的是,可以用软件修正,看起来像在凝视着对方的眼睛。人类也喜欢"拟人化"的物体,对计算机也不例外,特别是会动的计算机,比如上集说的机器人。

在过去一个世纪,除了工业用途机器人,有越来越多机器人用于医疗,教育和娱乐 。它们经常和人类互动 - 人机交互,简称 HRI(Human-Robot Interaction) - 是一个研究人类和机器人交互的领域,比如人类如何感受 机器人的不同形式和不同行为,或是机器人如何明白人类暗示来社交,而不是尴尬的互动。

正如上集说的,我们有追求。把机器人的外表和行为,做得尽可能像人一样。

工程师在 1940 1950 年代刚开始做机器人时,看起来完全不像人,是完完全全的工业机器。随着时间的推移,工程师越来越擅长做类人机器人,它们有头,而且用两条腿走路,但它们做不到伪装成人类去餐馆点餐。随着机器人可以做得越来越像人类,用人造眼球代替摄像头,用人工肌肉盖住金属骨架,事情会开始变得有些奇怪,引起一种怪异不安的感觉,这个"几乎像人类"和"真的人类"之间的小曲线,叫 “恐怖谷”。

对于机器人是否应该有人类一样的行为,也存在争议。很多证据表明,即使机器人的行为不像人类,人类也会用社交习俗对待它们,而当机器人违反习俗时 - 比如插队或踩了脚不道歉 人们会很生气!毫无疑问,心理学+计算机科学是强大的组合,可以影响日常生活的巨大潜力,这也带来了很多开放式问题,比如你可能会对计算机撒谎,但计算机应不应该对你撒谎?如果撒谎能让你更高效更快乐呢?或社交媒体公司 是否应该精心挑选展示给你的内容,让你在网站上多待一会儿,买更多东西?

顺带一说,他们的确有这样做!!!

这类道德问题不容易回答,但心理学至少可以帮助我们理解不同选择 带来的影响和意义。但从积极的方面来说,了解设计背后的心理学,能增加易用性,让更多人可以明白和使用电脑,如今计算机比以往更加直观,线上会议和虚拟教室的体验越来越好。随着机器人技术不断提高,互动也会越来越舒适。另外,感谢心理学,让我们能分享对"滚花"的热爱。

我们下周见。

39. 教育科技

i.e. Educational Technology

(。・∀・)ノ゙嗨,我是 Carrie Anne ,欢迎收看计算机科学速成课!\N

计算机带来的最大改变之一 , 是信息的创造和传播能力。目前有 13 亿个网站在互联网上,仅维基百科就有 500 万篇英文文章,涵盖从"1518 年的舞蹈瘟疫",到"正确的纸卷方向"。每天,Google 提供 40 亿次搜索来访问这些信息,Youtube 上每分钟有 350 万个视频被观看,每分钟用户上传 400 小时的新视频,很多观看量都是 Gangnam Style 和 Despacito,但剩下的 大部分是教育型内容,就像你现在看的这个。

如今只要手机上点几下 就能访问到这些宝藏,任何时间,任何地点,但能获取到信息和学习不是一回事。

先说清楚,我们 Crash Course 喜欢互动式课堂学习,课上提问,以及上手实践,它们是很棒的学习途径,但我们也相信教育型技术在课内课外带来的帮助。今天我们要在这个教育型视频里 聊教育型科技,具体讲解计算机怎么帮助我们学习。从纸和笔 到用机器学习的智能系统,科技几千年来一直在辅助教育,甚至早期人类 在洞穴里画狩猎场景也是为了后代。远距离教育一直推动着教育科技的发展,例如公元 50 年左右,圣保罗就发书信 给亚洲设立的新教堂提供宗教课程,从那以后,有几大技术浪潮,自称要改变教育,从广播和电视,到 DVD 和光碟。事实上,在 1913 年 托马斯·爱迪生 预测说,“书籍很快会过时,用影片来教授所有知识是可能的,学校体系将在未来十年彻底改变”。当然,他的预测没有成真,但发布教育视频变得越来越流行。在讨论教育技术可以帮你做什么之前,有研究表明 - 有些简单事情 ,可以显著提高学习效率:

  1. 把速度调整到适合你,YouTube 的速度设置在右下角,让你能理解视频 有足够的时间思考;
  2. 暂停!在困难的部分暂停,问自己一些问题,看能不能回答,或想想视频接下来可能讲什么 然后继续播放,看猜对没有;
  3. 做视频中的提供的练习。

即使不是程序员,你也可以在纸上写伪代码,或试试学编程,这些主动学习的技巧已被证明 ,可以把学习效率提升 10 倍或以上。如果想学学习技巧,有整个系列专门讲这个。

把高质量教育内容做成视频传播 ,在过去一个世纪吸引了很多人,这个老想法的新化身,以"大型开放式在线课程"(MOOC,Massive Open Online Courses)的形式出现,纽约时报宣称 2012 年是 MOOC 年!很多早期视频 直接录制著名教授上课,有段时间,有些人以为大学要终结了。不管你是担心还是开心,这暂时还没成为现实,现在热度也淡去了,这可能是因为加大规模时, 同时教百万名学生,但老师数量很少,甚至完全没有老师 - 会遇到很多问题。幸运的是,这引起了计算机科学家,或具体一点 “教育科技家"的兴趣,他们在想办法解决这些问题,比如,为了有效学习,学生要及时获得反馈。但如果有几百万学生,只有一名老师,怎么提供好的反馈?一个老师怎么给一百万份作业打成绩?为了解决问题,很多时候需要把科技和人类都用上,一种有用 但有些争议的做法是学生互相之间提供反馈。不幸的是,学生一般做不好,他们既不是专家也不是老师,但我们可以用技术来帮助他们,比如通过算法,从数百万个选择里 匹配出最完美的学习伙伴,另外,有些部分可以机器打分,剩下的让人类打分,例如,给 SAT 写作部分打分的电脑算法,已被证实和人工打分一样准确,还有些算法提供个性化学习体验,类似于 Netflix 的电影推荐 或 Google 的个性化搜索结果,为了个性化推荐,软件需要了解用户知道什么,不知道什么,在正确的时间提供正确的资料。

让用户练习没理解的难的部分,而不是给出用户已经学会的内容,这种系统一般用 AI 实现,泛称叫法是"智能辅导系统”。我们现在讲一个假想的辅导系统,假设学生在这个假想的辅导系统中,研究一个代数问题,正确的下一步是两边-7,我们可以用 “判断规则” 来表示这一步,用 IF-THEN 语句来描述,伪代码是:

*如果* 变量和常数在同一边
*那么* 两侧都减去这个常数
"判断规则" 酷的地方是也可以用来代表学生的常犯错误
这些"判断规则"叫"错误规则"
例如,学生可能不去减常数,而是去减系数
这不行!

学生做完一个步骤后可能触发多个"判断规则",系统不能完全弄清 是什么原因让学生选了那个答案,所以"判断规则"会和算法结合使用,判断可能原因,让学生得到有用反馈。

“判断规则”+选择算法,组合在一起成为 “域模型”,它给知识,解决步骤和一门学科 ,比如代数,用一种"正式写法"来表示。域模型可以用来 帮助学习者解决特定问题,但它无法带着学习者 以正确顺序搞定整个学科该上的所有课程,因为域模型不记录进度,因此智能辅导系统 负责创建和维护学生模型 - 记录学生已经掌握的判断规则,以及还需练习的生疏部分,这正是个性化辅导系统需要的。

听起来好像不难,但只靠学生对一些问题的回答,来弄清学生知道什么,不知道什么,是很大的挑战。“贝叶斯知识追踪” 常用来解决这个问题,这个算法把学生的知识 当成一组隐藏变量,这些变量的值,对外部是不可见的,比如我们的软件。

这在现实中也是一样的,老师无法知道 学生是否完全掌握了某个知识点,老师会出考题,测试学生能否答对,同样,“贝叶斯知识追踪” 会看学生答题的正确度,更新学生掌握程度的估算值,它会记录四个概率:首先是 “学生已经学会的概率”,比如从代数方程的两边减去常数,假设学生正确将两边-7,做对了,我们可以假设她知道怎么做,但也有可能她是瞎蒙的,没有真的学会怎么解决问题,这叫 “瞎猜的概率”。类似的,如果学生答错了,你可能会假设她不会做,但她可能知道答案,只是不小心犯了个错,这叫 “失误的概率”。最后一个概率,是学生一开始不会做,但是在解决问题的过程中,学会了怎么做,这叫 “做题过程中学会的概率”。有一组方程,会用这四个概率,更新学生模型,对学生应该学会的每项技能进行持续评估。

第一个等式问:学生已经知道某技能的概率是多少?等式里有 “之前已经学会的概率"和"做题过程中学会的概率”,就像老师一样,“之前已经学会的概率”,取决于学生回答问题正确与否,回答正确和错误分别有 2 个公式,算出结果之后,我们把结果放到第一个方程,更新"之前已经学会的概率",然后存到学生模型里。

虽然存在其他方法,但"智能辅导系统"通常用 贝叶斯知识追踪,让学生练习技能,直到掌握。为了高效做到这点,软件要选择合适的问题呈现给学生,让学生学,这叫:自适应式程序,个性化算法的形式之一,但我们的例子只是一个学生的数据。

现在有 App 或网站,让教师和研究人员 收集上百万学习者的数据,从数据中可以发现常见错误一般哪里难倒学生,除了学生的回答,还可以看回答前暂停了多久,哪个部分加速视频,以及学生如何在论坛和其他人互动,这个领域叫 “教育数据挖掘”,它能用上学生所有的"捂脸"和"啊哈"时刻,帮助改善未来的个性化学习。

谈到未来,教育技术人员经常从科幻小说中获得灵感,具体来说,Neal Stephenson 的"钻石时代"这本书激励了很多研究人员,里面说一个年轻女孩从书中学习,书中有一些虚拟助手会和她互动,教她知识,这些助手和她一起成长,直到她学会了什么,以及感觉如何,给她正确的反馈和支持,帮助她学习。如今 有非科幻小说研究者,比如 贾斯汀卡塞尔,在制作虚拟教学助手,助手可以"像人类一样沟通, 有人类一样的行为,在陪伴过程中和学习者建立信任,相处融洽,甚至和人类学生成为朋友"。

2040 年的"速成课" 可能会有一个 John Green AI,活在你的 iPhone 30 上,教育科技和设备如今在逐渐扩展到笔记本和台式电脑之外,比如巨大桌面设备,让学生可以团队合作,以及小型移动设备,让学生路上也能学习。

“虚拟现实"和"增强现实"也让人们兴奋不已,它们可以为学习者提供全新的体验 - 深潜海洋,探索太空,漫游人体,或是和现实中难以遇见的生物互动。如果猜想遥远的未来,教育可能会完全消失,直接在大脑层面进行,把新技能直接下载到大脑,这看起来可能很遥远,但科学家们已经在摸索 - 比如,仅仅通过检测大脑信号,得知某人是否知道什么。

这带来了一个有趣的问题:如果我们可以把东西下载到大脑里,我们能不能上传大脑里的东西?

下周的最后一集,我们会讨论计算的未来。

到时见。

40. 奇点,天网,计算机的未来

i.e. The Singularity, Skynet, and the Future of Computing

(。・∀・)ノ゙嗨,我是 Carrie Anne 欢迎收看计算机科学速成课!

我们到了 最后一集!

如果你看了整个系列,希望你对计算机影响的深度和广度 有全新的认知和欣赏。难以相信 我们从简单的晶体管和逻辑门开始,一直到计算机视觉,机器学习,机器人以及更多。

我们站在巨人的肩膀上 - Charles 、Babbage 、Ada 、Lovelac 、Herman 、Hollerith 、Alan Turing 、J. Presper Eckert、 Grace Hopper 、 Ivan Sutherland Douglas 、Engelbart 、Vannevar 、Bush (Memex) 、Berners-Lee (万维网) 、Bill Gates (微软)、Steve Wozniak (苹果),和许多其他先驱。

我最大的希望是 这些视频能激励你 去了解这些东西如何影响你的人生,甚至开始学编程,或找一份计算机职业,这很棒!这是未来的技能!

我在第一集说过,计算机科学不是魔法但它有点像魔法,学习使用电脑和编程,是 21 世纪的巫术,只不过用的不是咒语 ,而是代码。懂得运用的人,能创造出伟大的东西,不仅改善自己的生活,还有当地社区乃至整体人类。计算机会随处可见 - 不仅是放在桌上 ,带在包里,而是在所有可想象的东西里 - 厨房用具里,墙里,食物里,编织进衣服里,在你的血液里,这是"普适计算"的愿景。

从某种角度来讲, 它已经来临了而换一个角度 , 还要几十年。有些人把这种未来看成 反乌托邦,到处都有监视器,有无数东西想吸引我们的注意力,但 1990 年代提出这个想法的 马克·维泽尔,看到了非常不同的潜力:"[五十] 年来,大多数界面和计算机设计,都是朝"戏剧性"方向前进,想把计算机做得超好,让人一刻也不想离开。另一条少有人走的路 是"无形"的,把计算机整合到所有东西里 ,用的时候很自然完全注意不到。最厉害的科技是看不见的科技,它们融入到日常生活的每一部分 ,直到无法区分”。

如今我们还没达到这样 - 人们在电脑前连续坐好几小时,吃晚餐被手机推送通知打扰,但它可以描述计算的未来本系列最后一个主题,人们思考计算机的未来时,经常会直接想到人工智能。毫无疑问,接下来几十年人工智能会有巨大进步,但不是所有东西都要做成 AI ,或需要 AI,车有自动驾驶 AI,但门锁依然会很简单。人工智能可能只是增强现有设备,比如汽车,AI 带来了一个全新的产品种类,刚出现电力时也是这样,灯泡取代了蜡烛。但电气化也导致上百种新的电动小工具诞生。当然 我们如今仍然有蜡烛。最可能的情况是 AI 变成 计算机科学家手中的另一门新工具,但真正让人深思和担忧的是,人工智能是否会超越人类智能?

这个问题很难 有多方面原因,比如 “智能的准确定义是什么?” 一方面,有会开车的计算机,几秒就能识别歌的 App 。翻译几十种语言,还称霸了一些游戏,比如象棋,知识竞答和围棋,听起来很聪明!但另一方面,计算机连一些简单事情都做不了,比如走楼梯,叠衣服,在鸡尾酒派对和人聊天,喂饱自己。人工智能成长到和人类一样通用,还有很长的路,因为"智能"是难以量化的指标,人们更喜欢用处理能力来区分,但这种衡量智能的方法比较"以计算为中心",但如果把视频中出现过的电脑和处理器 画张图,可以看到 如今的计算能力粗略等同于一只老鼠。公平点说,老鼠也不会叠衣服,但如果真的会叠 ,就太可爱了。

人类的计算能力在这儿,多 10 的 5 次方,也就是比如今电脑强 10 万倍。听起来差距很大,但按如今的发展速度,也许十几年就可以赶上了。虽然现在处理器的速度不再按摩尔定律增长了,我们在第 17 集讨论过,假设趋势继续保持下去,在本世纪结束前,计算机的处理能力/智能 会比全人类加起来还多。然后人的参与会越来越少,人工超级智能会开始改造自己,智能科技的失控性发展叫 “奇点”。

第 10 集 约翰·冯·诺伊曼 最早用这个词,他说:“越来越快的技术发展速度和人类生活方式的改变,看起来会接近人类历史中某些重要的奇点,这个势头不会永远继续下去”。冯诺依曼在 1950 年代说的这话,那时计算机比现在慢得多,六十年后的今天,奇点仍然在遥远的地平线上。一些专家认为 发展趋势会更平缓一些,更像是 S 型,而不是指数型,而随着复杂度增加,进步会越来越难。微软联合创始人 保罗·艾伦 叫这个"复杂度刹车",但当作思维练习,我们假设 超智能计算机会出现。这对人类意味着什么,是个讨论激烈的话题,有些人迫不及待,有些人则努力阻止它,最直接的影响可能是"技术性失业"。很多工作被计算机,比如 AI 和机器人,给代替掉了,它们的效率更高,成本更低。虽然计算机出现没多久,但"技术性失业"不是新事,还记得第 10 集里 雅卡尔的织布机 吗?它让 1800 年代的纺织工人失业,导致了骚乱,当时美国和欧洲 大部分人都是农民,如今农民占人口比例 <5%,因为有合成肥料和拖拉机等等技术。时间更近一些的例子是"电话接线员",在 1960 年被自动接线板代替了,还有 1980 年代的"机器喷漆臂"替代了人工喷漆,这样的例子还有很多。一方面,因为自动化失去了工作,另一方面,我们有大量产品,衣服,食物,自行车,玩具等,因为可以廉价生产,但专家认为人工智能,机器人 以及更广义的计算,比之前更有破坏性。

工作可以用两个维度概括,首先,手工型工作,比如组装玩具,或思维型工作 - 比如选股票,还有重复性工作,一遍遍做相同的事,或非重复性,需要创造性的解决问题。我们知道 重复性手工工作,可以让机器自动化,现在有些已经替代了,剩下的在逐渐替代。让人担心的是"非重复性手工型工作",比如厨师,服务员,保安。思维型工作也一样,比如客服,收银员,银行柜员和办公室助理。剩下一个暂时比较安全的象限,非重复性思维型工作,包括教师和艺术家,小说家和律师,医生和科学家。这类工作占美国劳动力大概 40% ,意味着剩下 60%工作容易受自动化影响。有人认为这种规模的技术失业是前所未有的,会导致灾难性的后果,大部分人会失业,其他人则认为很好,让人们从无聊工作解脱,去做更好的工作,同时享受更高生活水平,有更多食物和物品,都是计算机和机器人生产的。

没人知道未来到底会怎样,但如果历史有指导意义,长远看 一切会归于平静。毕竟,现在没人嚷嚷着让 90%的人 回归耕田和纺织,政界在讨论的棘手问题是怎么处理数百万人突然失业 造成的短期经济混乱。

除了工作,计算机很可能会改变我们的身体,举个例子,未来学家 Ray Kurzweil 认为,“奇点会让我们超越 肉体和大脑的局限性,我们能掌控自己的命运,可以想活多久活多久 。 我们能完全理解并扩展大脑思维,超人类主义者认为会出现"改造人”,人类和科技融合在一起,增强智力和身体。如今已经有脑电接口了,而 Google Glass 和 微软 Hololens 这样的穿戴式计算机 也在模糊这条界线,也有人预见到"数字永生"。Jaron Lanier 的说法是,“人类的肉体死去,意识上传到计算机”,从生物体变成数字体 可能是下一次进化跨越。

一层新的抽象!

其他人则预测,人类大体会保持原样,但超智能电脑会照顾我们,帮我们管农场,治病,指挥机器人收垃圾,建房子以及很多其他事情,让我们在这个可爱蓝点上(地球)好好享受。另一些人对 AI 持怀疑态度 - 为什么超级人工智能 会费时间照顾我们?人类不也没照顾蚂蚁吗?也许会像许多科幻电影一样,和计算机开战。我们无法知道未来到底会怎样,但现在已经有相关讨论了,这非常好。所以等这些技术出现后,我们可以更好地计划,不论你把计算机视为未来的朋友或敌人,更有可能的是,它们的存在时间会超过人类。许多未来学家和科幻作家猜测,机器人会去太空殖民,无视时间,辐射 以及一些其他让人类难以长时间太空旅行的因素。亿万年后太阳燃尽 ,地球成为星尘 ,也许我们的机器人孩子会继续努力探索宇宙每一个角落,以纪念它们的父母,同时让宇宙变得更好,大胆探索无人深空。

与此同时,计算机还有很长的路要走,计算机科学家们在努力推进过去 40 集谈到的话题。在接下来的十几年,VR 和 AR,无人驾驶车,无人机,可穿戴计算机,和服务型机器人 会变得主流。互联网会继续诞生新服务,在线看新媒体,用新方式连接人们,会出现新的编程语言和范例,帮助创造令人惊叹的新软件,而新硬件能让复杂运算快如闪电 ,比如神经网络和 3D 图形。个人电脑也会创新,不像过去 40 年着重宣传 “桌面” 电脑,而是变成无处不在的虚拟助手。

这个系列,我们还有很多话题没谈,比如加密货币,无线通讯,3D 打印,生物信息学和量子计算,我们正处于计算机的黄金时代,有很多事情在发生,全部总结是不可能的,但最重要的是 你可以学习计算机 成为这个惊人转型的一部分,把世界变得更好!

感谢收看!

结语

真的好长,也很有趣。知其先后,以预未来。