这道题邀请我就算邀对人啦!
我平时经常用机器学习的理论去思考人类学习和生活中的事情,可以给你举出好多二者相通的例子。
在机器学习中,一个模型会从训练数据中学习知识,然后应用到测试数据上去。
训练数据中的知识可以分为两部分:
第二类知识可能有两种来源:一种是训练数据和测试数据采样于不同的总体;另一种是虽然二者来自于相同的总体,但采样时总是不可避免地有噪声。
如果一个模型没能把真正的知识学到足够的程度,我们就说这个模型是「欠拟合」(underfit)的。相反,如果一个模型把真正的知识学得差不多了,开始学习「假」的知识了,那我们就说模型「过拟合」(overfit)了。一个模型训练得越久,在训练集上的性能应该是越好的,但一旦它开始过拟合了,在测试集上的性能就开始变差了。
现在把「过拟合」的概念迁移到人类学习上去:
「过拟合」的概念不仅体现在考试中,也体现在生活上:
机器学习模型的训练一般是「有监督」的,它的意思就是说训练数据要有标注。比如,我要训练一个识别各种花的模型,那么我就需要很多花的图片,还需要给这些图片做标注,告诉模型这张是梅花,那张是樱花,等等。但是,人工给数据做标注是很费劲的一件事,很多领域的研究开展不了,就是因为没有足够多的带标注的数据。这时候就需要「迁移学习」和「无监督学习」了。
「迁移学习」的意思是,我本来想训练网络来做任务 A,但我先找一个与 A 不同但又相通的任务 B,任务 B 具有足够多的有标注数据。用任务 B 训练的模型,其中就会有一部分含有同样适用于任务 A 的知识。仍以识别各种花为例,虽然我没有足够的带标注的花卉图片,但我有足够的带标注的各种物体(花、树、狗、人等)图片。那我就可以先训练一个识别物体的网络,这个网络的前几层会学习如何从图片中识别点、线、面等基本元素,这种技能对于识别花卉也是有用的。在训练任务 A 时,把这一部分直接挪用过来固定住,仅训练网络的剩余部分,或者用这一部分作为初始化,就可能不需要那么多的训练数据了。训练任务 B 的过程术语叫做「预训练」(pretraining),之后训练任务 A 的过程术语叫做「微调」(finetuning)。
迁移学习在人类的学习过程中也是很常见的。比如:
当然,迁移学习并不总是有效的。有些时候,任务 B 的知识反而会对任务 A 造成干扰(比如开手动挡时总忘记换挡、说西班牙语有英语口音),这在心理学上叫做「负迁移」—— 你看,心理学里也用「迁移」这个词呢!
「负迁移」其实也可以理解成一种「过拟合」:把「预训练」和「微调」的整体过程看作训练,则训练数据中包括任务 B 的数据,而测试数据则只包括任务 A 的数据。训练数据与测试数据来自不同的总体,就可能造成过拟合。
仍然考虑上一节的场景:我想做任务 A 但训练数据不够,但我又找不到合适的任务 B。如果我有足够多的无标注数据,就可以通过「自己出题给自己做」的方法,用这些无标注数据训练一个模型出来,其中也会含有对任务 A 有用的知识。对于图像来说,常见的自己给自己出的题包括:
类比到人类的学习中,我想到了我学英语、考英语的例子。我学英语的时候并没有做多少完形填空、阅读理解之类的试题,但到了考试的时候往往一点儿都不费劲。这归功于我平时大量的泛读。泛读其实就是一种无监督学习 —— 我读的文章就是大量的、无标注的数据。当然,我利用这些数据做的任务,并不是「自编码」(缩写、扩写)或者「补全」(完形填空),而是训练出了一种「语感」。在此基础上,我只要做少量的题熟悉一下考试的题型,就可以拿高分了。
上一节说的「语感」到底是什么呢?其实就是语言模型。用术语来说,语言模型就是要衡量每一句话在一门语言中出现的概率。如果一句话符合语法、常用,则概率就高;如果一句话狗屁不通,则概率就低。这个概率一般会用链式法则分解成很多项的乘积,其中每一项代表了「在已知半句话的情况下,下一个词的概率分布」。用通俗的话来说,语言模型在整体上做的事情是「判断一句话有多么像话」,而这种判断,是通过在局部上「根据半句话猜下一个词」来实现的,越好猜就说明一句话越像话。
怎么评价一个语言模型的好坏呢?一般是拿一段已知很像话的话,用语言模型来求它的概率,这个概率越高,语言模型就越好。假设这一段话有 n 个词,把整段话的总概率开 n 次方根再取倒数,结果叫做这个语言模型在这段话上的「迷惑度」(perplexity)。其通俗理解,就是语言模型在根据半句话猜测每一个词的时候,平均情况下它觉得有几种选择。迷惑度越低,表示语言模型猜起词来越不费力,语言模型也就越好。
语言模型可以用在数据压缩上。迷惑度的对数(以 2 为底),就是存储一个词所需的比特数,语言模型越好,压缩后所占的存储空间就越小。语言模型还用在语音识别中。语音识别的结果,一方面发音需要与输入语音相似,另一方面本身也要「像话」—— 这两方面就分别是由「声学模型」和「语言模型」来衡量的。
我在通过歌词学习日语的过程中,就明显地体会到了我的语言模型变得越来越好的过程。这体现在两个方面:
机器学习模型有两个重要类别:判别式模型与生成式模型。这两种模型的区别,是很多初学者会遇到的一个坎儿。
判别式模型的意思是,给出一条数据,模型要为数据给出一个类别。一般来说,数据是比较复杂的,比如一句话、一张图这样的;类别则比较简单,一般就是「是」或「否」,或者有限的几个类别。用 X 表示数据,Y 表示类别,则判别式模型建模的就是 P(Y|X)。至于 X 本身的分布是怎样的,判别式模型并不关心。
而生成式模型的意思是,模型要具有凭空生成数据和类别的能力,即它要建模 P(X,Y)。这通常是通过建模 P(Y) 和 P(X|Y) 这两步来实现的。P(Y) 就是一个简单的二项或多项分布,没什么意思,所以生成式模型的重点在于 P(X|Y),即建模每个类别下数据的分布。
对比判别式模型和生成式模型,可以发现 P(Y|X) 是「从复杂到简单」,而 P(X|Y) 是「从简单到复杂」。这说明生成式模型里含有的「知识」比判别式模型要多。如果有了一个生成式模型,可以根据贝叶斯公式 得到一个判别式模型;反过来,仅有一个判别式模型,是推不出一个生成式模型的。
这在日常生活中有什么体现呢?比如,你有 100 个朋友,当你看到一张脸时,你能够认出这是谁;但让你凭记忆描述出一个朋友的长相,你可能就有很多细节记不清楚。这是因为,辨认出一个朋友并不一定需要记住他/她长相的所有方面 —— 比如,左脸上有颗痣可能就已经能锁定一个朋友了,你并不需要记住他/她是什么发型、是单眼皮还是双眼皮、戴不戴眼镜等等。一般来讲,我们对朋友们长相的记忆足以构成一个判别式模型,但不足以构成一个生成式模型。在心理学上,上面的判别叫做「再认」,而生成叫做「回忆」,回忆是比再认更困难的任务。
在知乎上,我们经常看到一句话,叫做「评价冰箱好不好,不用自己会制冷」。这里,「评价冰箱好不好」就是判别式模型的任务,而「自己会制冷」则是生成式模型的任务。这句话在机器学习中就很有道理,因为如果目的只是做判别的话,并不需要生成式模型那么多的知识。
判别式模型有一个「缺陷」,就是当输入数据偏离真实分布时,模型不会察觉到异常,而是会像对待正常数据一样输出一个类别。在这种情况下,输出的类别很可能是无意义的。曾经有一则「绿茶验尿」的新闻闹得沸沸扬扬。实际上,这就属于输入数据(茶)偏离真实分布(尿)的情况,而检测尿的仪器只是一个判别式模型,它无从知道输入数据有问题,在这种情况下,它无论给出怎样的输出,都是无意义的。