正文
如果你被这个问题困住了,不用担心。这就是我们为什么要机器学习。
虽然我们不知道怎么告诉机器去把语音信号转成对应的字符串,但我们自己可以。我们可以收集一个巨大的
数据集
里包含了大量语音信号,以及每个语音型号是不是对应我们要的唤醒词。在机器学习里,我们不直接设计一个系统去辨别唤醒词,而是写一个灵活的程序,它的行为可以根据在读取数据集的时候改变。所以我们不是去直接写一个唤醒词辨别器,而是一个程序,当提供一个巨大的有标注的数据集的时候它能辨别唤醒词。你可以认为这种方式是
利用数据编程
。换言之,我们需要用数据训练机器学习模型,其过程通常如下:
-
初始化一个几乎什么也不能做的模型;
-
抓一些有标注的数据集(例如音频段落及其是否为唤醒词的标注);
-
修改模型使得它在抓取的数据集上能够更准确执行任务(例如使得它在判断这些抓取的音频段落是否为唤醒词上判断更准确);
-
重复以上步骤 2 和 3,直到模型看起来不错。
机器学习背后的核心思想是,设计程序使得它可以在执行的时候提升它在某任务上的能力,而不是有着固定行为的程序。机器学习包括多种问题的定义,提供很多不同的算法,能解决不同领域的各种问题。我们之前讲到的是一个讲
监督学习
应用到语言识别的例子。
正因为机器学习提供多种工具可以利用数据来解决简单规则不能或者难以解决的问题,它被广泛应用在了搜索引擎、无人驾驶、机器翻译、医疗诊断、垃圾邮件过滤、玩游戏、人脸识别、数据匹配、信用评级和给图片加滤镜等任务中。
虽然这些问题各式各样,但他们有着共同的模式从而可以被机器学习模型解决。最常见的描述这些问题的方法是通过数学,但不像其他机器学习和神经网络的书那样,我们会主要关注真实数据和代码。下面我们来看点数据和代码。
这个例子灵感来自 Joel Grus 的一次 应聘面试. 面试官让他写个程序来玩 Fizz Buzz. 这是一个小孩子游戏。玩家从 1 数到 100,如果数字被 3 整除,那么喊’fizz’,如果被 5 整除就喊’buzz’,如果两个都满足就喊’fizzbuzz’,不然就直接说数字。这个游戏玩起来就像是:
1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 …
传统的实现是这样的:
1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17 fizz 19 buzz fizz 22 23 fizz buzz 26 fizz 28 29 fizzbuzz 31 32 fizz 34 buzz fizz 37 38 fizz buzz 41 fizz 43 44 fizzbuzz 46 47 fizz 49 buzz fizz 52 53 fizz buzz 56 fizz 58 59 fizzbuzz 61 62 fizz 64 buzz fizz 67 68 fizz buzz 71 fizz 73 74 fizzbuzz 76 77 fizz 79 buzz fizz 82 83 fizz buzz 86 fizz 88 89 fizzbuzz 91 92 fizz 94 buzz fizz 97 98 fizz buzz
对于经验丰富的程序员来说这个太不够一颗赛艇了。所以 Joel 尝试用机器学习来实现这个。为了让程序能学,他需要准备下面这个数据集:
-
数据 X [1, 2, 3, 4, ...] 和标注 Y ['fizz', 'buzz', 'fizzbuzz', identity]
-
训练数据,也就是系统输入输出的实例。例如 [(2, 2), (6, fizz), (15, fizzbuzz), (23, 23), (40, buzz)]
-
从输入数据中抽取的特征,例如 x -> [(x % 3), (x % 5), (x % 15)]
有了这些,Jeol 利用 TensorFlow 写了一个分类器。对于不按常理出牌的 Jeol,面试官一脸黑线。而且这个分类器不是总是对的。
显然,用原子弹杀鸡了。为什么不直接写几行简单而且保证结果正确的 Python 代码呢?当然,这里有很多一个简单 Python 脚本不能分类的例子,即使简单的 3 岁小孩解决起来毫无压力。