所有由benben发布的文章

卷积网络 CNN 学习笔记之三:卷积像卷地毯

学习笔记之一:我们是怎么认识0的

学习笔记之二:细节消失,抽象生成

总算可以正式开始讲卷积网络的工作原理了。

过滤器像卷地毯一样卷过去

上面的白纸就像图像,而我们现在拿一个红颜色的格子,这个格子是 3 x 3 ,里面写着9个数字。这 9 个数字开始是随机数,经过大量的训练以后开始不断的变得有意义。

这个红色的小纸片,会先从图像的左上角开始,和最左上角的 3 x 3 的那一小片重合,就得到了九对数字,就是每一个位置的红纸片上 和 它压住的那个位置的白纸片上的数字 形成了一对。

我们把这九对数字两两相乘,然后把乘积相加,最后形成 1 个数。把这个数填写在另外一个空白的格子的最左上角。

然后这个小红方块向右移动一格,再做同样的操作,然后接着向右移一格。到头了再回到最左边,再向下移动一行,再如此移动。就这样用一个小红纸片把这个白纸上的所有的位置都扫描一遍,从而把这张大白纸的数字变成另外一张大白纸的数字。

这个操作,就跟卷地毯一样,数学上成为卷积。

这有什么用呢?

这是个好问题。大家留意一下这个红格子里面的数字,我用了左侧都是 1 , 中间一列是 0 ,右侧都是 -1 的矩阵。大家想象这个矩阵放在什么样的数字上面产生的值会最大呢?

如果它放在纯色上面卷积出来的数字一定是0,比如放在纯黑色的部分。因为左边的数字和右边的数字相等而且一个为正一个为负。所以这个小方块滑过纯色的地方就是0。

如果它放在一个和它很类似的模式上,得到的数字会变的异常的大。比如说它放到了一个也是和它一样左边都是 1 ,右面都是 -1 的地方,这个卷积的结果将会是 6  ( 1 x 1 + 1 x 1 + 1 x 1 + -1 x -1 + -1 x -1 + -1 x -1)。

其实,这个图像就是一个竖线的检测器。它本身代表着一个竖线(左侧白色,右侧黑色),它在滑过图像的格子的时候,只有发现和它类似的模式的时候,就会点亮(返回很大的数字),而遇到其他的模式的时候就会暗淡(接近零或者负数),这样以来,经过滑动,我们就可以检测边沿了。这个叫做边沿检测(Edge Detection)。

多个Filter,来检测同一个图像

我们例子里面的这个红方块仅仅检测竖线,甚至它仅仅检测左边是白色,右边是黑色的竖线,而反过来的左黑右白的竖线它都不感兴趣。那如何把其他的模式也检测出来呢?

没关系,我们可以使用大量的检测模块。比如可以有另外一个。在我昨天的例子里面,我用了 32 个这样的小红方块,分别独立负责检测 32 种不同的模式。比如下面我又找了一个检测左上白色,右下黑色的从右上到左下45度的斜线的检测模块。

经过 32 个不同的检测模块,我们叫做 filter ,我们会把一副图片拆解成成 32 张新的图片。

但这里注意,如果原图的每一个像素里面的数据是代表了在灰度这个维度的 黑白程度 的话,那么生成的32张新的图像里面的每个像素代表的是在对应的 filter 下的和 filter 的程度。

这种 32 层的图像我们其实应该很熟悉。所有的彩色图像都是三层表示的,分别是RGB,代表着这个像素在三个不同维度的值,如果把这三层分别叫做 Red-ness, Green-ness, Blue-ness,这 32 个可能应该分别叫做 垂线度 (vertical-ness),横线度( horizontal-ness), 斜线度(diagnal-ness),叉度( cross-ness) 等等等等。不用去查了,这些词,无论中文还是英文都是我瞎编的。

第一层抽象完成

下面就是真实的实验结果了。如下就是 MNIST 数据集里面随机的一个数字,我目测是个 2 。

如下的上面四行就是训练以后生成的 32 个 filter 的样子,其中黑色代表接近 0 ,白色代表接近 1 。

这些 filter 已经很复杂,不仅仅是检测纯粹的横线或者竖线,但我们知道经过训练以后的这些 filter 一定是最有利于下一步计算机做决策的。

下面的后四行是上面的这个 2 分别经过 32 个 filter 以后形成的图像。你看到这些图像有点像被肢解了的 2 ,因为他们都分别关心 2 这个数字的不同的方面。 

下一篇文章我们将继续了解接下来的步骤,一步步深入下去。

后台回复 “ AI ” 可以获得全系列文章和代码

卷积网络 CNN 学习笔记之四:最终形成判断

题图:思南路别墅

绘于:2020年4月17日

学习笔记之一:我们是怎么认识 0 的

学习笔记之二:细节消失,抽象生成

学习笔记之三:卷积像卷地毯

上一次走到了卷积网络的第一步,就是用一个 3×3 的小矩阵就像探照灯一样,把图像扫一遍,就得到了第二层的网络。

第一层对于黑白的图像只有一个深度(depth),就是灰度值,对于第二层网络已经增加到了 32 层深,分别对应于在 32 个不同的 filter 上的匹配程度。我们这次接着深入。

ReLU (灯泡亮了!)

不知道是谁用灯泡💡来表示脑子里面的一个新主意,真是一个非常好的比喻,就是当一个想法诞生的时候,就觉得是脑子里面什么地方的一个小灯泡忽然亮起来了。

前面的卷积,生成的结果就算再复杂,也是按照线性函数来推倒的,就是 y = a * x + b ,再怎么变化多端,都还是一个线性函数。有人就提出来了,大脑的神经网络应该不是这么工作的。应该引入一些非线性的东西。这就是 ReLu 激活。(ReLU = Rectified Linear Unit)

这个函数简单得很,就是:当输入小于 0 的时候,输出为零。但输入大于 0 的时候,输出是这个数。用代码表示就是:

y = max( 0 , x )

这个就有效的把无关的信息给简化和屏蔽了。对于竖线的检测函数,如果我没有检测到竖线,我就输出为 0 , 而不再输出负向的信息了。也就是说,如果我看到了有人做好事,我就叫出来;如果有人做坏事,我就当没看见,也不会去举报你。

这就很像脑子里面的那个灯泡 💡,当几个输入的结果合并起来使得输出高过一个阈值的时候,下一层相应的神经元就被点亮(激活),如果没有超过的话,就继续暗淡下去。这个很简单的函数给整个系统带来了难得的非线性,就可以有一些逻辑运算的感觉在里面了。

我们构建的四层神经网络

model = Sequential()model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))

上面的代码,就是建设了一个 Conv2D 的模型,这个模型的 filter 数量是 32, kernel_size,就是这个 filter 的大小,是 3 x 3 , 激活函数使用了 relu ,并且接受一个输入为 28 x 28 x 1 的矩阵(就是那个图像),输出一个 26  x 26 x 32 的矩阵。宽和高从 28×28 变成了 26×26 是因为用一个 3×3 的矩阵向右挪的时候自然会失去最左和最右的两列,就像一个 4×4 的矩阵用一个 3×3 的矩阵去滑动的话只能滑动一格,结果变成 2×2 的矩阵一样。

model.add(MaxPooling2D(pool_size=(22)))

我们继续解释代码。下一个就是 MaxPooling2D 的功能。这个更简单的了。就是拿一个(2,2)的区域,找到其中最大的那个数,输出出来,把原来四个像素的位置合并成一个像素,并且把这个数字填进去。这个就是简单粗暴的把一个 26×26 的矩阵缩成了一个 13×13 的矩阵。

从逻辑上讲,这就是忽略细节的过程。我们看一个数字的时候,隐隐约约的觉得左上角有辆车,至于它精确的在什么位置,长什么样子,不重要,重要的是, 左上角有一辆车。他就是把得出的 32 个图像的大小都缩小一半,但是信息都保留(就是最大的,已经找到的那个模式)。

Flattern

model.add(Flatten())

这个一个比一个简单,就是把所有的数字从矩阵排成一个一维数组。前面的输出是一个 13 x 13 x 32 的一个矩阵,通过这一层,变成了一个 5408 个数字数组。就像把麻将桌中间的一堆麻将在自己面前一字排开那样。

全联接层

model.add(Dense(10, activation='softmax'))

最后的这一个层叫做全联接层,就是把前面的5408个数字和最终结果的10个数字做一个每一个节点和另外一层的每一个都连接起来,找到一个系数,找到 y = a * x + b 这样的关系。

就是说,对于结果的第一个数字,是前面5408个数字和5408个系数(a1, a2, a3, …, a5048) 相乘并且把结果相加,再加上一个数字(b)得来。这一层的参数最多,需要(5408 + 1)* 10 = 54090 个参数才可以完成。相比之下,前面的 (3 x 3 + 1)x 32 =  320个参数算是精简得不得了。

这一层最终是10个数字,对应着答案的十个数字,作为这个模型的第四层,也是最后一层,经过一个叫做 softmax 的激活函数,它的输出是一个十个数的数组,这十个数字分别都是0-1之间的一个数字,他们的加和等于 1 , 每个数字都对应相应位置的可能性。比如上一篇的结果,就会是 2 对应的数字非常高(就是电脑认为很有可能是 2 ),而其他的都很小。

训练函数

model.compile(optimizer='adam', metrics=['accuracy'], loss='sparse_categorical_crossentropy')

现在我们就到了核心的7行代码的最后三行了。前四行分别构建了四层网络,最后就开始训练这个网络了。

compile 那一行给出了优化器,loss函数还有如何衡量好坏的函数。这些对于初学者可以暂时不考虑,就先照猫画虎就好了。

model.summary()

接下来,我们把现在构建的这个网络的摘要打印出来

Model: "sequential"_________________________________________________________________Layer (type)                 Output Shape              Param #   =================================================================conv2d (Conv2D)              (None, 26, 26, 32)        320       _________________________________________________________________max_pooling2d (MaxPooling2D) (None, 13, 13, 32)        0         _________________________________________________________________flatten (Flatten)            (None, 5408)              0         _________________________________________________________________dense (Dense)                (None, 10)                54090     =================================================================Total params: 54,410Trainable params: 54,410Non-trainable params: 

从这里我们可以清晰的看到,第一层,输入一个 28x28x1 的图像,输出一个26x26x32 的图像。而深度从1变到32就是从灰度这一个维度变成了32不同的问题的答案(比如有没有竖线这样的问题)。

接下来的 MaxPooling 层,如我们刚才所说,在深度 32 不变的情况下把每一层都从 26×26 简化成了 13×13 。

在下面的 Flattern 层,把13x13x32压扁成一个长度为 5408 的数组。

最后一层再把这个数组变成长度为 10 的数组,分别对应于结果的 0 – 9 。

开始训练

到了现在,网络已经搭好了,但唯一的问题是,里面所有的参数都是 0 – 1 之间的随机数,用一个随机数构成的网络肯定准确率差得一塌糊涂了。用一个随机数作为参数的网络,当你输入一个图像,它一定也可以输出一个数字,但这个数字 10 次有 9 次是错的,对的一次也是瞎猫碰到死耗子。

为了避免随机数,接下来这一句话,才是最重要的一句话,就是开始“训练”了。

model.fit(x_train, y_train, epochs=20)

这个函数把60000个 x_train 包含的图像,还有 60000 个 y_train 代表的正确答案交给网络。刚开始的时候,答案肯定是错的。但是神经网络通过错的方向(结果太大了还是太小了)去反过去调整上一层网络的参数,然后再进一步调整再上一层的参数,直到用6000组数据把这 54,410 个参数调整到精确度最高的程度。到了训练的末期,基本上上一次训练的这些参数已经可以让下一次输入的参数以极大的可能性(99%以上)和正确答案相同了,这个训练就完成了。

下一次,我们会再把上面说的这个过程用图像可视化出来,然后再继续用比喻的方法来宏观的理解,计算机到底是怎么认识数字的。

后台回复 AI 可以获得没有发表的AI相关的文章和代码。

卷积网络 CNN 学习笔记之五:就像医生看化验单

学习笔记之一:我们是怎么认识0的

学习笔记之二:细节消失,抽象生成

学习笔记之三:卷积像卷地毯

学习笔记之四:最终形成判断

今天,我们看上一次的代码跑起来是什么样子的。

输入图像

这个是输入图像,维度是 28x28x1 。 这是 MNIST 图像集里面的第1002号数字。我用我的人脑处理了一下,觉得似乎是一个  1 。我们看看电脑如何处理。

卷积层

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))

经过训练,得到如下 32 个卷积核:

输入的图像经过32个过滤器(filter)之后,输出是如下的 32 个 26×26 的图像。如果你还记得的话,是拿左上角的 0 号过滤器,从输入图像的左上角开始,9 个点对应的 9 个点分别相乘,然后把这一个像素的数据输出到下面的图的最左上角的那个像素。如此 26 x 26 次以后形成左上角的图像。再如此用第二个过滤器来制作第二个图像,如此 32 次以后,下面的 32 个图像就完成了。

池化层

这些看不太清的图像继续经过一个池化,每4个像素合并成一个像素,直观感觉就是在一个不是很清楚的图像上面继续打了马赛克。

打马赛克的作用就是为了减小下一层的负担。实践证明,打了马赛克和不打马赛克,对于准确率几乎没有影响。

model.add(MaxPooling2D(pool_size=(22)))

大家可以试验一下,就算是把pool_size增加到(8,8),也就是八八六十四个点缩成一个点,下一层也基本上可以达到98%的准确率。这就好比给你 4K 高清大图,还是这种 28 x 28 的模模糊糊的图,你对数字的识别率都差不多。

压平层

model.add(Flatten())

经过这个简单的压平,如下就是最终准备给分类器看的数据了。这是一个 在5408 个维度的特征值的柱状图。这个像不像一个化学分析报告?

我觉得这个结果特别像我拿到的验血报告。这个报告指出了我在一些指标上异常,至于这些异常代表着什么,我一脸迷茫,但是对于经验丰富的医生来说,他们可能一眼就可以看出来,我得的是什么病。比如他看到如果白血球水平偏高,同时D-二聚体升高,在随便看几个相关的指标,立刻就知道这是血栓的特征。而这些知识,是医生看了几千个病例,计算机看了60000多个病例,以后慢慢学会的。

全连接层

model.add(Dense(10, activation='softmax'))

终于到了揭晓谜底的时候了。经过一个全连接层,如上的验血报告就得出了确定的答案。在 0 – 9 的 10 种可能里面,计算机毫不犹豫的给了 1 几乎100% 的投票,而其他的可能性它认为接近为 0 。

如下是打印出来的计算机认为的可能性。和它最接近的第二名 4 的可能性已经骤降到了 1.69 x 10 的-26次方,也就是

0.0000000000000000000000000169 

其他的选项比这更低。看起来计算机还挺自信的呢。

[0.0000000e+001.0000000e+00 0.0000000e+00 3.3420391e-30 1.6909421e-267.0893234e-33 0.0000000e+00 0.0000000e+00 5.1055432e-27 3.4242518e-33]

医生的比喻

或许用比喻是最好理解一样事物(虽然必然会有一些偏差)。我们就用一个医生来比喻人工智能的算法好了。

原来人工智能发展缓慢的原因,就好像抽了一管血,然后交给医生说:帮我看看,我得了什么病。医生只能通过血的颜色,黏稠度等表面的信息去判断,当然准确度非常低。

当有了卷积神经网络的想法以后,问题一下子就变得简单了。医生手里面出现了几十种不同的“filter”,可以对血液进行分析了。

比如一个 filter 叫做“红细胞数量”。医生拿出一个显微镜,再把一滴血滴在血细胞计数器(Haemocytometer)上,然后认真的数一下,就得到了一个指标:后细胞数量。在数红细胞的时候,他对白细胞以及其他各种细胞都直接忽略。

然后他开始数白细胞。在数白细胞数量的时候,他对红细胞彻底忽略,然后就有了检测报告的第二行。卷积网络每一个过滤器都有自己特定的关注点,比如检测竖线的过滤器,对纯色卷积结果为0,对横线卷机结果为0,哪怕是颜色反过来的竖线(比如检测黑到白的边缘的,对于白到黑的边缘),因为ReLU函数的原因,结果也是0。这样子使得每个过滤器就跟医学上分别数细胞和白细胞的操作一样,绝对不会混在一起。正因为分离了,对下一步才更有帮助。

当他把所有的实验都做完了,就形成了一个完整的检测报告。从一滴血看出来病人得了什么病不太可能,但是经过了拆解,得到的中间数据就容易多了。

计算机的学习过程

那么问题来了,医生是通过多年的理论才学会的,计算机开始什么都不懂,怎么最后好似有了智能一样呢?到现在为止,我们大约的知道了计算机是如何通过分了四层一层一层的把复杂问题变成简单无比的问题的。但学习过程依然是个黑盒。工程师无法忍受黑盒,所以接下来我们会去了解这个黑盒。

但现在有一点是肯定的,以前的程序都是一行一行的,现在大家看到了,未来的人工智能的程序都是一堆一堆的数。比如我们这个数字识别程序,就是54,410个数字。如果你拿笔把这些数都抄在在你的本子上,你就拥有了这个程序。

后台回复 AI 可以获得没有发表的 AI 相关的文章和代码。

边疆战事和烽火台的比喻

题图:金泽古镇 绘于:2020年4月12日

对于一个崭新的领域,比喻是一种容易的入门的方法,尤其对于牵涉大量的技术细节的领域。当我们既想尽量详细的了解它,有没有时间和勇气去深入进去的时候,比喻是最好的方式。不同的人对于不同的比喻的亲近和理解程度不一样,于是我试着用几种不同的比喻,描述同一个事物,总有一种能让某一个人心有戚戚焉。

北疆的战事

第一个我能想到的比喻,是这样一幅画面:

在辽阔的中国大地上面,长城修建好的时候,坐在北京的皇帝是如何知道边疆有战事的。

大家当然知道这个信号就是烽火台的浓烟。那就让我们仔细去思考一下,从成千上万的边疆战士的死亡和最终离北京最近的那一个烽火台点燃之间发生的一连串事件。

上帝视角还是平民视角

我们人脑识别一张图片里面有什么的时候,我们最终的意识其实是上帝视角,可以把所有的信息放在自己的大脑里面,但大脑里面的神经元并不是上帝视角。它们每一个都只有非常有限的信息,就是和它连接的几个神经元,然后通过它们的激活或者未激活来决定自己是否激活。对于每个神经元来说,它们都是被蒙在鼓里的。

历史学家也是站在上帝视角讲述边疆的战事。但我们以这个世界上的每一个人的个体来看,没有一个人可以如上帝一样,从塞北的荒漠一眼看到北京的紫禁城。每个人只能接受到和自己最近的几公里的信息,然后做一些决定。这样,我们就拿每个个体去模拟神经网络的神经元。

原始信息输入

最前方的,是伤亡层。被敌人忽然攻击的个体忽然流血了,疼痛,惨叫,死去。这些细节就像进入卷积网络的第一层的那些像素的灰度值。

这些信息对于个体很重要,但是对于上一层神经网络,就是校尉这一层来说,并不那么重要。他关心的,和被杀死的士兵,有相同也有不同。

相同的是,他们都关心这个士兵死了。但是这个死去的士兵到底是头部中箭,还是胸部受伤而死,这些细节对于士兵来说是无比残忍的全部世界,对于校尉来说,是需要忽略的细节。而且他关心的不仅仅是一个士兵,而是要用一个“过滤器”去获取死亡的士兵的总数,就知道了死亡率。

校尉的决定

校尉需要做一个决定,就是用 ReLU (注一)函数来判断,自己要不要向上一级(就是下一层神经网络)汇报。当死亡率低于一定阈值的时候,他最好什么都不做,输出为 0 ,以免干扰上级。如果无论什么地方死一两个士兵都把这个信息一层层上传,然后由北京来做决定的话,这个效率太低了。但一旦高于一个阈值,警报就要拉响,而且比阈值高得越多,警报就拉得越响。

校尉就是神经网络里面的第一层,卷积层。他们通过把士兵的疼痛,哀嚎,所有战场的混乱等等信息进行处理,丢失细节,形成在死伤率这个最重要的维度的值,然后往上一级传递。

将军的决定

在上一级可能是驻守边关的大将军。他和他手下的全部校尉都保持联系。坐在大帐里面的将军已经听不到厮杀声和惨叫声了,因为已经有校尉这层把个人的疼痛信息转化为死伤率这个维度的强烈程度。这就模拟了数字识别系统中,后面几层的神经网络得到的信息已经不是最初的图像的灰度信息,而是“竖线度”,“斜线度” 等等边缘检测信息。

细节的丢失虽然让大将军没有办法对战士的死亡从情感上感同身受,但是抽象一层的信息可以帮助他从理性上推断下一步要不要向北京报告。

将军这一层的处理也是一个技术活。肯定不是一个逻辑的“或”操作,不是简单的只要有任何一个校尉报告就点烽火台,也肯定不是一个一句话能说明白的算法。他可能需要根据手下的十几个的校尉报来的死伤信息,和多年战争经验得来的经验信息相结合。

结合的方法可能是一个复杂的线性函数。他对不同的重要度的关卡给予不同的权重。有些要塞就算死了10%的士兵也需要立刻采取行动,而有些不重要的,就算100%的死亡也不用担心。要塞之间或许还有些相互关联。如此这些都在将军的脑子里面,他不需要把脑子里面的这几万个参数写出来,就足以果断的做一个决定:现在的军情,有没有触发他的 ReLU 函数的那个临界值。

如果将军做出判断,事情危机,ReLU 函数输出为正,一个时辰以后,在北疆的大漠里,一柱浓烟腾空而起,十几里外都看得清清楚楚。

信息的传递

在此之后的神经网络比较简单,直接看到上一层激活,下一层就跟着激活,如此传递上千公里,直到北京附近的那些烽火台浓烟滚滚。作为这个国家的神经中枢,北京的皇帝就知道了一件事情:北疆起战事了。

整个形成概念的过程

从成千上万的士兵身体被长矛利剑刺穿,到校尉分析在伤亡率这个关键维度的输出值,到将军分析来自各个不同的军队的数据,用学习得来的参数对数据加权相加,最终到从北疆到首都的一系列烽火台被点亮,直到最终形成一一比特的信息:有还是没有战事(0 还是 1),这是一个组织的信息形成机制,也很类似于神经网络的学习方式。

我们看到一个数字 0 ,当大脑形成 0 的印象的时候,其实就是如北京的皇帝知道了边疆的战事一样,或许根本没有想到,在这 0 个结论前面,已经有视神经的刺激,电信号的形成,边缘识别,再从边缘形成形状,最终结合经验得出数字的过程。

所以所以如果你需要向别人简单的解释人工智能里的神经网络是怎么工作的,你可以用这个例子。在这个例子中需要注意的是,经过一层层的神经网络,信息的细节越来越少,而维度越来越多。大多数的维度是第一层不具备的。比如死亡率这个维度,就不是任何一个士兵通过个体可以感知得到的信息。但信息的密度越来越高。一个人的身上上亿的神经元感受的疼痛,浓缩到一个人的生死,上千人的生死,浓缩到校尉的报告还是不报告;十几个校尉的类似信息才最后形成烽火台的浓烟燃起还是保持安静。

最终,每一个士兵的每一点疼痛,最终集体的决定了,北京附近的那一柱浓烟。这一柱浓烟丢失了所有士兵感受到的细节,却浓缩了所有人共同的感受,从而让一个帝国像一个人一样,可以对入侵的敌人作出反应。

神经网络也是一摸一样的。

注一:ReLU (Rectified Linear Unit)就是输入小于零,输出为零,输入大于零,输出这个数的几位简单的函数。代码是 max(0, x) 。

我们是怎么认识0的

细节消失,抽象生成

卷积像卷地毯

最终形成判断

就像医生看化验单

血常规检测和医生看病的比喻

嘉定图书馆 绘于 2020年4月14日

这是为了让大家了解神经网络的另一个比喻,希望通过用几个不同的比喻,描述同一个原理,或许可以更容易让人出现 “a-ha” 时刻,就是不知道怎的,忽然一根筋搭上了,就懂了。

现代医生看病

现代医学,医生已经不仅仅通过望闻问切来看病了,他们有了更多的工具,每个工具都是像一个特定的神经元一样,把一个维度的输入转化为多个其他维度的输出。比如验血呀,心电图了,超声波啦,核磁共振啦。。。这些检测方法多了去了。我们以最简单的验血里面的血常规做例子,来看一看医生如何通过一系列工具把一个一眼无法确定的问题解决的。

显微镜就是卷机层

化验员拿到一管血液,把它制作成血涂片。这个时候,就算再有经验的医生,凭着肉眼凡胎,也没法从这一个大拇指大小的血涂片上看什么名堂。顶多看看红不红,是不是粘稠什么的。这就像如果给计算机输入一个图片,它看到这么多的信息在一起,也没法得出什么结论。

这个时候卷积层出现了。这个工具,就是显微镜!显微镜先把整个图像放大几百倍,然后忽略所有的其他的部分,仅仅关心它看到的很小很小的一个局部。这就像卷机层里面的那个小小的卷积核,先分析大的图像中间这一小块,得出结论以后再往右移一小格,然后再分析。我们来看一下这个小小窗口是怎么工作的。

红细胞计数

即便是显微镜下针尖大的那一小部分,也有各种不同的细胞在里面游动。化验员这个时候需要决定,要把注意力集中在哪一种细胞上。比如她可以选择,我现在要关注红血球!

之后她就认真的在一个计数池里面用自己脑子里面的那个过滤器,去寻找长得像红细胞的影像。

在她数红细胞的时候,白细胞是彻底被忽略的,血小板,还有各种其他的杂质都是直接忽略的。

这个过程就跟卷积网络里面每一个过滤器都有专门的检测对象很像,比如检测垂直边界的,如果放在纯色上面,输出就是 0 ;放在横线上面,输出也是 0 ;甚至对于检测左黑右白这样的垂直边界的过滤器,放在反过来的左白右黑的边界上面输出也是 0 。只有和它想要检测的那个模式一样的时候,才会忽然亮起,输出一个很大的值。

血检的例子中,输入是显微镜下彩色的画面,经过化验员一番认真的数数,输出为单位面积中出现的红细胞的数量。这里注意,输入和输出完全不是同一个维度。成千上万个红细胞的影像的明暗信息,就这样经过化验员这个处理,变成了一个红血球数量这个更抽象维度的上的数字。

白细胞和血小板计数

红细胞检查完了以后,我们的化验员换了一个过滤器,你可以想象她把头脑里面那个能看到红细胞的眼镜摘掉,换上一副看到白细胞的眼镜,然后再数数。和红细胞过滤器相反,这个过滤器只检测白细胞,反而把红细胞忽略了。

同样的方法,化验员还需要去数血小板的数量。这样子,化验员要做的事情,就是把眼睛看到的一个个像素的各种颜色的点,转换成了三个维度(红细胞,白细胞,血小板)的三个数字。

这个过程是一个原始信息大量丢失的过程。如果要储存显微镜下看到的图像信息的话,估计得用几百兆的硬盘空间才够,但经过卷机层输出的信息,只要三个数字,几个字节就够用了。但这几个数字里面其实是从成千上万的像素的信息中转化而来的。

其他的检测

除了计数以外,还有血糖呀,胰岛素呀,各种肿瘤标志物呀,这些指标或许有几千种,每一种都有专门的仪器,专门的测量方法,最终把一管血液这一个认知的对象,变成了几千个不同维度的数字。这里面的没有一个数字包含了全部血液的信息,但又没有一个数字不是被整管血液里的每一个物质集体的影响着。

医生层

刚才讲的所有的事情,其实仅仅是化验员层,她们从同一个输入(无论是医院里的一管血液,还是计算机里的一副图像)得出了几十个维度的输出。这些输出以检验报告的形式,递交到到了医生的桌前。

医生需要迅速的通过这些已经抽象过一层的信息进行下一层抽象,回答这些化验单上天书一样的数据,到底说明这个病人得了什么病?

这个过程和化验员那层很像,也是一个模型,就是拿一个代表已有知识的过滤器,去扫描所有数据。

医生脑子里面内置了大量的过滤器。比如,其中有一个叫做肝炎的过滤器。他知道,如果指标A, B,C 偏高,指标 D,E,F 偏低,大概率就是肝炎。

这个知识是怎么来的呢?就是医生经过多年的医学学习和临床经验,训练出来的一个模型。他拿这个模型作为一个模版,和化验单对照,发现,咦,对不上,这个过滤器输出结果是 0,结论:不是肝炎 。

那就再换一个叫做 “糖尿病” 的过滤器,再扫描一遍,发现对上了!医生脑子里面某处的一个神经元 “叮” 的一下点亮,结果出来了,这位病人患的是糖尿病!

整个过程

这个过程,就是从血液开始,一个个红血球白血球的信息经过化验员变成了红血球数量,白血球数量等抽象一层的信息,然后再和其他的类似信息在医生那一层继续转换为疾病的信息。这样的多层的网络就完成了以前医生用一层网络(通过看血液的颜色)无法完成的认知。

类似的比喻可以举出很多来,基本上都希望描述同一个本质的东西:一个巨大的网络,这些网络里面没有人有上帝视角,都是蒙在鼓里面的独立单元。他们仅仅能够通过他能看到的那一部分输入,加上自己多年训练出来的一些参数组成的过滤器,产生更加抽象的,更高层次的输出。

然后下一层的独立单元,根据已经剥离了原始信息的高抽象度的信息,再加上自己的特定的学习到的知识,再加工成更高抽象度的信息,如此一层一层传导上去,让整个系统有了每个单独的单元都没有的智能。

只要仔细观察,生活中这样的集体智慧高于单个智慧的例子比比皆是。希望这些例子可以帮助大家大概的了解,一个人工智能的神经网络是如何工作的。

人工智能是如何学习的?

上一次(就像医生看化验单)我们问了一个问题但是没有回答,那就是:人工智能到底是怎么学习的?

在前面的这一系列的文章里面,我们都假设了,所有的参数都是已经学好的,就好像上帝创造了人一样,被人类创造了出来。有了第一层这几百个数字,后面几层的几万个数字,机器就如同有了灵魂一样,能够先识别边缘,再从边缘学习线,从线学习圆圈,从圆圈学习数字0,或者继续学习圆圈的组合,从而认识猫,认识人脸。

但最重要的问题还是没有回答,这些数字是怎么确定的呢?作为这个系列的最后一篇文章,希望把这个最重要的问题来回答。

淋浴调节水温的例子

举一个例子:

假设你去洗淋浴。有一个水龙头,还有一个花洒。你想洗一个温度适中的热水澡。但你也不知道这个龙头的物理结构,甚至不知道哪边是冷哪边是热。你唯一知道的是,现在的水温你不满意,比如说太热了。好在这个系统你需要训练的参数只有一个,就是那个水龙头的位置。

你往右搬了一点点,感觉一下水龙头和自己希望的水温是更近了还是更远了。比如,你觉得水更烫了,这不对。你就知道了,接下来应该往左一点。然后发现水温真的更低了。好兆头,说明我们现在的前进方向是往最终误差减少的方向前进着。那下一步,再小一点点,然后再感觉,直到到了一个地方,你继续往右,发现水温已经低于你的舒适温度了,往左,水温就会高于你的舒适温度, 那我们就在这个位置停下来了。

到了这个时候,你依然对于水龙头的工作原理一窍不通,对于流体力学和热力学更是一窍不通,但通过尝试,你好似已经物理博士毕业一样,可以精确的控制水温了。

对于简单的学习,机器基本上就靠一个字 “蒙”,当然更好听一点叫做 “试”。但试也是试的有章法的,就是机器每试一下,就把它影响的后面每一层的输出的变化记下来,来帮助自己决定,下一次尝试朝哪个方向前进。

人工智能领域的段子

有一个人工智能领域的段子,是一个人去面试一个人工智能工程师的职位,面试官和他的对话是这样的:

面试官:7 + 2 等于几?

工程师:3?

面试官:太小了

工程师:8?

面试官:还是小了

工程师:10?

面试官:大了

工程师:9.5?

面试官:大了

工程师:9.2?

面试官:你被录取了

现在估计你能看懂这个段子了。

复杂的系统

但如果要调整的不止一个水龙头,你面前放着5万个水龙头,这怎么搞?

这就是典型的训练神经网络,决定那几万个参数的时候面对的问题(几万个参数算啥呢,最近的GPT-3训练需要调整1750亿个参数呢)

继续类比,用炒股的例子来说明

我们继续举例子。假设你和一群人组成一个公司炒股。再假设这个股市完全靠消息,消息灵通的就就能赚钱。而且你们只做短线,买完以后当天就卖。

然后我们搭出来了一个金字塔结构。你是最终做决定的那个人,是金字塔的最高的一级。

在你前面,你安排了10个眼线。分别是老赵,老钱,老孙。。。。。他们每个人也有几十个眼线,分别是大周,大吴,大郑。。。。,他们每个人下面还分别有了大量的眼线,叫做小冯,小陈,小楚。。。。。只有小字辈的,能够接触到第一线的情报。

就跟任何组织一样,每个人都对自己手下的几个小弟有不同的信任程度。这个信任程度我们不妨叫做权重 w (这就是神经网络里面的那个参数)。每个人都把自己的所有的小弟报告的数字,乘以对他的信任程度(权重),相加以后把这个值再报给上一级。

开始训练

于是,这个组织成立的第一天,所有人各就各位,但是信任度还没有建立,所以所有的人都随机的选择到底多信任自己的小弟(有的根据好看程度,有的根据高矮胖廋,有的根据年纪),总之,这个信任度没有任何事实依据。你们约定,你们就想知道一支股票要不要买。如果一个人认为是 0,就是不要买,1 就是买,在这中间的一个数字,就是你要买的建议程度。

这天上午,第一次消息传过来了,经过了小字辈,大字辈,老字辈三层的不靠谱的随机信任度,最终你收到了一个数字,是 0.2 。低于0.5,你决定不买。

当天过去了,结果出来了,股票涨了!

说明正确答案是 1 ,就是该买。好。这个时候你会怎么做?

你会秋后算账。你看一下,刚才让我买的是那几个人?让我不买的又是哪几个?哦。老张当时给我的情报是 0.8,他的贡献是朝向正确的方向的。你就在心里面悄悄地把老张的信任度调高了一点点:下回还得听他的。然后看其他的老钱,老孙,给的是 0.01, 0.1,不靠谱,你把对他们的信任度稍微调低了一点点。这样,你最后一层的连接老字辈的人和你之间的参数就都发生了变动。(就像上面图上的向上和向下箭头)

人间一秒,计算机中1年。我们训练了几分钟,计算机里面已经经过了几十年。这几十年里一起炒股票,最终老张等人在你心中的可信程度已经被训练得炉火纯青了:最终你最信任老张,老张怎么说,你就乘以0.99,直接就巨大的影响你的决策。老钱差了点,但还算靠谱,乘以0.2吧。至于老孙,那是相当的不靠谱,不过你也摸到规律了,只要他让买你就卖,他让卖你就买,一直反着听,倒也效果不错,信任值稳定到了 -0.8

同样的,对于老张,因为他的权重最高,而且结果和正确结果在一个方向上,我们希望,在同样的情况下,老张应该输出的数字再大一点,因为他说话管用。但老张自己是不会输出数字的,他唯一能够调整的,是他对他的小弟们的信任程度。于是,老张干了一件和你一模一样的事情,看看他的小弟们,是谁说要买的,往上调整信任值,说错的,往下调整。这样子他下一层也会做同样操作。一直到最前面的小冯,小陈,小楚。

也是经过了几十年的训练以后,每一层的权重(就是他的上级对他的信任程度)都调得差不多了。这也就是一个训练有素的炒股团队了。每一天,无数的小弟勤勤恳恳的把自己的第一手资料传给他们的上级,而他的直接上级心里面自然有一个算盘,根据过去几十年的经验,信任一些人,不信任一些人,甚至反向信任一些人(他们说涨那是肯定会跌的),如此再往上传,一层一层传递到你这里来,你一看,你得到了0.8,赶紧买!这个准确度是多少呢?一般来说一个搭建完好的神经网络对于认数字这样的问题,做到97%以上问题不大。

总结

现在可以总结一下这个过程。

  1. 开始的时候所有的参数都是随机数

  2. 从第一次训练开始,把数据输入,然后得到一个不靠谱的输出

  3. 把这个输出和正确答案比一比,从最后一层开始把这个误差向前传播,微调一下信任值。

  4. 再进行一次训练,再调整。直到训练完成,所有参数稳定下来。

到此,这一个系列的关于人工智能的八篇文章也暂时告一段落。如下是以前的文章:

我们是怎么认识0的

细节消失,抽象生成

卷积像卷地毯

最终形成判断

就像医生看化验单

边疆战事和烽火台的比喻

血常规检测和医生看病的比喻

物业公司的困境

题图:M50园区

当我看到保安的工资这么低,物业费又还算高的时候,第一反应和所有的业主一样,那钱一定是被物业公司给拿去了,甚至被物业公司的领导个人偷偷放在自己的口袋里了的说法也颇受听众欢迎。因为除此以外想不出什么合理的解释。而当我了解了以后,最没有想到的,竟然是物业管理公司面临着这么大的困境。一句话说,如此low的物业公司,居然演绎的是一个港资公司在大陆水土不服的故事。

虽然物业公司的管理,服务,硬件,财务状况等方方面面都是很低的水平,但这个公司是一家香港著名开发商的全资子公司,此物业的管理需要从香港总部做决策。有很多匪夷所思的,不适应现状的决定,导致了本地物业经理完全没有发挥余地,员工怨声载道,内部矛盾重重,业委会和业主极度不满的现状。

四班做二休二的保安排班

以保安为例,现在的保安个人低工资,和业主认为物业费不值这个价钱的矛盾,根结在于过时的保安 “四班做二休二”制度,就是小区共设有 6 个保安岗。保安两天工作,每天工作 12 个小时,然后休息两天,一个岗位需要四个人。六个 24 小时的岗位,总共聘请了 24 位保安。

这个制度的来源是基于 20 年前港资物业公司进入大陆,严格按照 1994 的劳动法规定【第三十六条 国家实行劳动者每日工作时间不超过八小时、平均每周工作时间不超过四十四小时的工时制度。】,也就是这个制度是为了保证一个保安一周平均工作时间不超过44小时。而每个岗位都是24小时需要在岗,一周需要 24 * 7 = 168 个小时的工作时间,所以需要四个人分摊,每个人工作 42 小时,刚刚好满足劳动法规定。所以每个人都是连上两个12小时班,再休息两天。

但这是不符合现在的社会现状的。为了在上海这样的大城市,尤其是最市中心的地带生存下去,延长工作时间换取加班工资是常态。正常的保安公司是 “两班做六休一制度”,也就是每个人一周工作六天,每天12个小时,共72小时,但加班部分按照劳动法规定给予加班工资。这样就多劳多得,通过辛勤的劳动换取更高的工资。

如果保安进行制度改革,从四班做二休二,改为两班做六休一,在完全一样的岗位设置的情况下,在完全一样的预算情况下,可以用14个人完成6个岗位的24小时工作,在小区安保投入预算不变的情况下,平均每人工资可以达到6480元。这个在保安行业一定是一个体面的工资,有人离职也容易招到新人加入。

强制休假制度

类似班次这样的制度,还有强制休假制度等。香港公司要求底层工作者在每年必须把法定的年假休完,也就是说进一步的增加了保安的个人闲置时间,同时减少了收入。

香港公司的初衷是好的,提供足够好的福利给到员工,包括限制工作时间和保证休假,但这和20年以后激烈的竞争,劳动者真实的诉求是背道而驰的。保安怨声载道,只能纷纷在外面偷着兼职,而上海公司却没有能力改变总部在 20 年前定下来的这个制度。

我们几个业主还好心的提议,要不然我们自愿给服务好的保安发放小费,刚刚提出来,港资公司的严谨的作风立刻挡在了面前:私自收业主的小费是明令禁止的。结果发现,任何的创新和变通都被20年前的细致入微,“深思熟虑” 的管理规范毫无变通可能的禁止。

汇报制度

类似保安制度的不合理,在一个这么30人左右的小的物业里面,还设有专职的人事一名,财务一名,文员一名,行政主管 一名 等等各类不和业主打交道的文员。每一个岗位都有长久的历史原因。比如,财务设置的原因是为了每天向总部结账,报告所有的明细,并且接受总部审计等等等等。这些都是在上海的员工无法改变的 “公司制度”。

跨国公司的窘境是不分大小的

在一个小小的物业公司身上,我居然看到了当年 eBay,Google 这些外企在中国水土不服的通病。每一项外人看起来匪夷所思的人员设置后面,都有一套用心良苦的制度设置。这些制度曾经帮助过企业成功,却又因为僵化而阻碍了进步。

制度里面,又缺少有能力打破这个制度的人。毕竟,能够在制度的淤泥中白衣飘飘的脱离其中,并且对其进行改变的人,凤毛菱角。就连 eBay 和 Google 里面月薪过十万的名校毕业生,这样的人都不多,又如何期待物业公司的执行的员工来做这件事情呢?死锁的结果,是这艘船上所有的乘客都知道它的归宿,却没有任何人有任何办法。这对于还在船上的人来说,非常残忍。

解决之道

这个困局,最终只有通过市场的力量才可以解决。只有从源头,就是从业委会层面,在全市场范围寻求物业公司,在成本服务等的要求下,从客户方反逼,香港公司在市场的压力下,才有可能有所改变。

在市场的力量下面,要么该港资物业公司在直面竞争的时候,被迫改进,从上到下的适应市场,成为一家更有竞争力的物业公司,要么有其他的物业公司进入,降低成本,提高劳动者报酬。无论哪一种,都将打破现在的多输局面。

也只有市场的力量才可以救保安,还有这个物业公司里面的员工。

AI会让我失业吗?

在写了一点 AI 领域的 Hello World 级别介绍 以后,周末么和成远,明月还有李享几个好朋友聊天。在静安寺的咖啡馆里,我们几个思维离开了地心引力,开始畅想美好或者恐怖的未来。大家探讨的第一问题就是,未来 AI 会让我失业吗?我说,那当然。大家失去现在的职业是肯定的事儿呀,但有什么担心的呢?

农业人口

人类历史上像 AI 一样的技术进步有很多,每次都导致大量的人类失业,但人们过得却越来越好。就拿最近的农业做个例子吧。

200年前,全球的人口超过一半是农业人口,中国这样的国家在 1949 年接近 90% 的人口是农业人口。 农民朴素的认知是,如果不面朝黄土背朝天的劳作,就会饿死。因为当时人类除了手工劳动以外没有什么更好的办法批量生产粮食。

然后随着农用机械基因技术等的普及,农民的生产效率不断提高,现在发达国家的农业从业人口平均已经低于3%,甚至很多欧洲国家都低到了 1% 以下。中国从事农业的人口也降低到了20%以下。

从这个角度来来看,我们能不能说全球 90% 以上的农业人口都失业了呢?是的。他们都失去了农民这个业。他们现在工作吗?八成还是工作的,但是找到了其他的工作。

我们会失去现在的工作吗?那是当然。我们还会有工作吗?那也是当然。

生产效率提高

我认为生产效率提高肯定是好事儿。随便进入一个公司,原来看起来乌央乌央的一屋子人才能做的事情,有了更好的技术,一下子全都不需要了。这对于人类作为整体是个好事儿,但对于这一屋子人来说,是不是一件好事儿呢?

不见得是坏事。从根本上讲,大家担心的不是“失业”,而是“失薪”。

如果有人告诉你,你的工作不用做了,但是薪水照发。我想大多数人都会开心的接受。

不工作,但是有钱拿,这其实是最近这几百年的社会的整体趋势。我们这些写字儿的人,这些拿着手机傻笑的人,其实都已经受益于生产力的不断上涨,否则还看什么手机,赶紧去种地去。

现在哪怕再微薄的失业保险和养老保险,都已经让人可以吃馒头管饱。只有馒头吃,虽然在现在的社会最低级的生活,但比起我们祖辈来说,已经超过了大多数地主的生活,至少不担心挨饿。这些福利都来自于生产力的提高。

关键是分配问题

所以技术取代人力不是问题,真正的问题是,谁将得到收益。如果一屋子的人都被机器代替了,如果不加干涉的话,立刻发生的时候就是,这一屋子的人的工资都不用发了,他们挨饿,而使用 AI 技术的公司省下了工资,获利。在 AI 把蛋糕做大的好事情里面,如果分配不改变,这个蛋糕的利润将由大公司独占,这可不是什么好事儿。(注二)

经济的链条

但继续思考,这样的情形不太会发生。

一家公司的利润因为使用了AI技术大幅增加的话,市场竞争不会允许这一家公司持续保持这种超高利润,会有新的公司进入,逼迫这家公司把最终产品降价,把因为技术进步获得的利润吐出来。

一旦产品因为生产率提升而大幅降价,获得同样的商品的价格就会降低,这个降下来的价格可以说是给所有的客户发了红包。这一屋子被裁员的人的工资就变相转移到了所有的客户的口袋里。

那么这些消费者会干什么呢?原来1000块钱才能买到的基本服务,现在扣除通货膨胀因素以后变成了可比的800块,那剩余的200块干什么?他们会存起来吗?不会,他们会消费。

消费什么呢?比如看直播是可能是一个好主意,还要打赏主播100快呢。这些主播是谁呢?说不定就是最早被裁员的那一屋子人中的一些,他们找到了新工作。生产率提升而导致的失去的工资,就这样流了回了自己的口袋里。他们失去了每天朝九晚五枯燥的生活,或许得到了更加轻松的工作。

劳动鄙视链

如果我们冷静的看这个世界,按照劳动的直接程度,只有农业从业者才是真正养活了人类的。人类作为一个物种,只要吃得饱,其实并不需要什么。而除了吃得饱的所有的一切需求,都是因为生产力提高了而产生的。

农民会对工人会说:“你们又不种粮食,就在那里按几个按钮,为什么挣得比我还多?你们那不叫劳动” 。

工人会对服务员说:“你们又不生产东西,就天天空调房里面,端个咖啡就能挣得比我还多?”

服务员甚至可以对网红说 “我至少还对社会做出点有形贡献,你们就在一个直播间里面唱唱歌跳跳舞,没有丝毫的贡献,为啥挣得比我多?”

至于大多数文职人员,尤其是CEO们,不就那个PPT写写说说吗?产生了什么呢?是不是我们都被那 3% 的农业人口养活了呢?

在这个假象的鄙视链里面,你有没有发现,其实我们从最需要付出劳动却没有什么创造力的工作中不断的升级,不断的进化到了需要大量的创造力,却不需要付出原来那么多劳动的工作?

那么原来那些需要劳动的工作哪里去了呢?都是由技术代替了,由不断提升的生产力代替了。

高级劳动

什么是高抽象劳动(不用搜索,这是我刚刚造出来的一个词)?

在模拟城市的电子游戏里面,决定哪一块应该开发农业,哪一块地应该开发工业,只需要鼠标一点就完成了,系统自然会派出农民和工人把这些劳动做完。这些相比汗滴禾下土的工作来说就是高抽象度的劳动。如果没有科技发展,我们只能由大量的人(比如几千人)从事低抽象度劳动,而几个人从事高抽象度劳动。

随着科技的发展,农民的工作被机器取代,而这些农民的一部分,升级成了更抽象的劳动,就如同打电子游戏一样指点一下江山,机器就帮你把田种了。现在连这种抽象工作,就计算机都可以做了,那么人类可以做更加抽象的工作。

人还是会工作的,只不过升级了。

AI 统治下的未来

AI 统治之下,低抽象度的工作悉数被取代,这个命运只是时间问题,而以前没有可能发生的高抽象度工作将会诞生。现在上一代人看不惯的网红经济,电竞产业,这些都是只有在低抽象度工作的生产力不断提升的前提下才有可能。你能想象在饥荒年代有网红经济吗?

未来我们的现有的工作都会被取代,就跟200年前的农民的工作会被取代一样,但不必担心,自然有更高级的工作诞生。我们现在看起来毫不创造价值的那些工作,很有可能都会成为主流。

综上所述,我对于 AI 的发展是抱有极大的乐观态度的。我们终将失去现有的工作,而这是我们拥有更好的工作和更高的社会福利的前提。

注一:我得出这个结论其实是违背科幻小说家Douglas Adam的科学三定律的。他说:“1)任何在我出生时已经有的科技都是稀松平常的世界本来秩序的一部分。2)任何在我15-35岁之间诞生的科技都是将会改变世界的革命性产物。3)任何在我35岁之后诞生的科技都是违反自然规律要遭天谴的。” 而我,已经超过35岁了。但只要经过一些努力,还可以像15岁一样,对科技保持乐观。

注二:政府需要关注的事情是,如果完全不加干预,在 AI 领域,有可能一家公司获得的巨大的优势在自由市场上也能够阻止其他厂家的进入。因为AI的核心是数据,当有了足够多的数据可以帮助他们改进算法和服务而获得更多的数据。这种近似于数据垄断的情形是需要被控制的。

答案公布:船是怎么起锚的

对于这个问题《船是怎么控制抛锚还是起锚呢?》,当教练跟我说了这一句话的时候我就豁然开朗了。

“ 把锚放入水中的时候,放进去的绳索要是水深的 5 – 7 倍 ”

哦。那就全懂了。

原来船锚不是垂直放下去的,而是拉着长长的线,以至于由于绳子的重力,到了最后基本上贴在海底,成为水平的状态了。

帆船的锚绳是麻绳,而靠近锚的那一段故意使用很重的铁链子,更加确保最后的一段是完全水平的放在海底。

如果是横向的拉锚的话,锚的尖尖的爪子,就会深深的扎入海底的沙石里面,拉力越大,埋得越深。有一些犁式的锚甚至会整个锚都埋入沙子中,只留铁链子在外面。

起锚的时候就容易了,慢慢的收锚绳,锚就从水平变成垂直。沙石对于垂直的锚就跟浮云一样,没有一点钩力,很轻松的就拉起来了。

当然这里也就顺便知道了另外一个冷知识,就是船的锚都在船头,而不是船尾。因为锚并不在船的下方,而有可能是很远的地方,而船被稳定的洋流/水流朝一个方向飘去,直到被锚钩住。

几个在船上才知道的冷知识

几年前在学帆船的时候发现了几个冷知识,很有趣,分享一下。

第一个是海里。既然已经有公里,英里,为啥还要有海里这么个计量单位?仅仅是因为历史原因不愿意改了吗?并不是。海里在导航上有天生的优势。

海里的定义是根据地球来定的。人们把地球的经度线上每一度的1/60,也就是一分,定为一海里。如果把地球当作一个西瓜,一切两半,那个刀口的边缘就是360度的一个圆。这个圆的每一度(Degree)的 1/60 是一分 (Minute),这一分在地球上的距离,就被定义为一海里。

在海上,一片茫茫,啥都啥都看不到。唯一能够导航的就是星星。各种导航最终都是一个角度问题,而角度直接就可以换算成海里。同时,时间在航海的维度也是一个角度问题,海里把时间,距离,星空等等方便的统一在了一起。

顺便了解了一下古代航海家是怎么导航的。

得知自己的纬度其实很容易。只要看一下北极星在哪里就可以。北极星在地面上的角度就是自己的纬度。如果你发现北极星在正头顶,你就是在北极无疑了。我在上海,那么北极星一定在地平面以上 31 度左右,亘古不变。

难的是经度。怎么知道自己的经度呢?太阳,星空,所有的东西每天都在变化一个周期,了解自己的经度在历史上都是难题。

后来最简单的方法就是借助时钟。在18世纪的时候,总算有了精确的表,这样大家就可以在出发前把表校准到格林威治时间。然后只需要观察当天太阳最高的时候自己手表的格林威治时间,通过这个时间就知道自己的经度了。也就是每往西经度的1度(也就是60海里),时间就会差15分钟。一个小时就是4度。

比如,如果当地正午的时候是格林威治时间的下午3点,你就知道自己在西经 12 度 (4 * 3)。

这也就是为什么那么多经典的瑞士手表都有航海款的原因,因为时间,就是位置。准确的时间就是航海时代的生命。

船的速度单位是节(Knot),一节等于 1海里/小时。叫节的原因还真的是因为绳结。在海上,水手有没有什么参照物,船上也没有速度表,水手只好把一块系着打好均匀的节的绳子的大木头扔到水里面去,然后数数记时间。过了一定的时间以后,看放下去的绳子上总共有多少个绳结,就知道自己的速度是多少节了。

有了海里还有节做单位,海上航行就很容易。

比如我现在在东经 120 度,我要到东经 125 度, 那就是5度的差异,换算到海里就是 300 海里 (60 * 5)。如果我现在船速是 15 节,需要 12 小时(300 / 12)。多容易!如果用公里的话,从经度换算到纬度虽然不困难,但很麻烦。

用海里,地球的周长就是 360 * 60 海里 = 21600 海里

说到这里不得不提另外一个冷知识,地球的周长用公里来衡量是40,000公里 (最小 39,940 公里,最大 40075 公里),这个数字不是巧合,因为最早的一公里是定位为北极到赤道的距离的万分之一为一公里。现代科技怎么都离不开我们在的这个球。

除了用海里,还有几个有趣的观察,比如东西方的差异。我发现在船上有个术语,叫 Shipshape。教练总会要求大家保持 shipshape,就是把所有的东西放到该放的地方,保持整洁。这个词如果在中文里面找到对应的话应该是“井井有条”。一个井田制的农耕文明对于整齐的定义和一个大航海时代的海洋文明在用词上面就很不一样。

另外一个观察,就是船上很少用左右,比如不叫左舷,右舷,而有专门的名字,面向船头的时候左边一侧叫做 Port,另外一侧叫做 Starboard。

这个用意是很明显的,因为在船上,尤其是紧急的情况,左右很容易搞混,因为会随着观察者的方向变化,而 Port, Starboard 永远不变。Port 用红色灯,Starboard侧用绿色灯,远远的就可以知道远处的船的航行方向。

说到这里又牵出来更多的一个冷知识,就是飞机在机场为什么都是从左侧上下客的。飞机两边都有门,但右边的门很少使用。这个也跟大航海时代有关。早期的船是拿船桨当舵在船尾控制方向的,而大多数船员都是惯用右手,所以右边就叫  steer board,现在叫做starboard了。而如果舵在右边,船从左边靠岸容易很多,而左边就叫做Port,上下货物用的一边。而飞机也沿用了这个传统,从port边上下飞机。

船上能够学的东西很多,但最有趣的就是了解一个航海文明的很多的思维方式。一艘船就像一片土地一样的在西方的文化的深处。

而我,脑子里面总是喜欢装满这些有趣却无用的知识。把这些知识吃进脑子里里面再传播出去让我觉得很快乐。有的人呢,就是这样,属于天生的喜好,被根植在基因里面的吧。