06_其他机器学习技术

如果你已经学完了 MLP,也就学习了深度学习的基础,进阶也就是深度学习的其他基础模型如 CNN,RNN,注意力机制等,最后可以在一个具体领域钻研下去,如计算机视觉、自然语言处理或者进一步学习强化学习技术,不再是本书具体讨论的范围,本章会对这些领域做一些简单介绍,内容来源于我在学习和实践这些技术的过程中产生的主观认识和部分笔记。我目前的研究内容是强化学习,并不是这些深度学习技术领域的专家,因此描述也可能有错误,欢迎指正。

深度学习

计算机视觉

卷积神经网络

卷积神经网络(CNN)是计算机视觉的开山之作,尽管 MLP 也可以做图像识别,但计算量过于庞大,一张图片的分辨率可能是 1080*1920 的分辨率,而每一个像素有三个参数,即 RGB 值,那么这张图片作为单个样本就会包含 6,220,800 个数据,然而 CNN 通过卷积的方式可以大幅浓缩图像信息,可能最后会转换为不到原图像千分之一大小的最终图像,然而这通常仍然比一般的 MLP 要复杂得多,因此也非常消耗资源,你需要 GPU 或者 TPU 来加速计算,这是比较贵的。

近几年新成熟的注意力机制和 Transformer 架构几乎横扫了全部深度学习领域,成为独立于 CNN 和 RNN 以外的新的基本模型,是当今最前沿领域。

生成对抗神经网络

生成对抗神经网络(GAN)是当非常流行的 AI 绘画技术的基础。它有两个网络构成,一个是生成器,一个是判别器,它不能简单地用类似 现有框架实现神经网络中的 fit() 方法编译,通常需要手写一个训练模块:

生成器和判别器需要在一个框架内进行训练。每一轮都需要抽取一个批量的数据,在每一轮中,我们要先训练判别器,例如我抽到若干衣服的照片,先生成一些等于原来照片大小的噪声图,把这些噪声图和真实图像混合到一起,噪声图标记为 0,真实图像标记为 1,给判别器训练这些图像,使它具备判别不同类别图像的能力,至少能判别衣服和非衣服;再训练生成器,我们输入的 x 是纯噪声图,但是都给它们 1 的标签,因为我们希望让判别器认为生成器生成的图像都是真实图像,此时我们要禁止判别器的权重改变,也就是禁止判别器进行训练,只允许它做判断。

怎么理解生成器设定 y 都是 1(预测真)?因为生成器首先生成图像,第一次输出肯定是比较糟糕的,判别器就认为是伪,输出 0,而真实值是 1,进行反向传播时,这个误差先流到判别器,然而判别器不可训练,就像被打上了小说三体中的思想钢印一样,接着这个误差再往前流动到生成器改变权重,使生成器的权重越来越靠近生成真实图的状态:要使误差变小,生成器就应该调整权重让图像更真实,从而骗过判别器。这就是 GAN 的基本思想,同时,判别器的能力决定了生成器的能力上限,因为生成器只是让判别器满意就好了,不需要做进一步改进,最终的平衡状态也叫纳什均衡。

我训练了一个简单的 GAN,它可以生成图 6.1 ,虽然很多噪点,但能勉强看出是什么样的衣服或者裤子,这些图片是模型自主生成的,并不是来源于真实素材。

图 6.1:GAN 生成图

自然语言处理

循环神经网络

循环神经网络(RNN)把神经网络在时序预测上的能力大大推进了,循环神经网络上一个神经元的输出会和新的输入一起进入下一个神经元,从而有了短期记忆的能力,刚开始输入的特征的一部分会进入下一个神经元,但往后,原始特征就逐渐消失了,比如刚开始输入 100,后来经过 5 个神经元计算输出的是-20,并且跟着新的输入一起进入第 6 个神经元,因此后来改进出了长短期记忆神经网络(LSTM,Long-Short Term Memory)和 GRU (Gate Recurrent Unit)模型,这都是 RNN 的变种,引入了长期记忆机制,从而更好地保留了原始特征,但它们也只是一定程度增加了记忆力。

注意力机制

注意力机制(attention)在大型数据的模型上淘汰了 RNN、LSTM 和 GRU,在注意力机制中引入位置编码概念,使得网络可以保留极长的记忆,基于纯注意力机制的开山之作 Attention Is All You Need 构建的 Transformer 架构最初只是用于机器翻译,但是后来也被扩展到了计算机视觉领域。如前面提到的,注意力机制是当今深度学习领域的最流行的前沿技术之一。

其他模型

自动编码器

自动编码器的原理很巧妙也很简单,对于一个 MLP,我的输入是 x,要拟合的对象也是 x。这也就是 AI 歌手的训练方法,声音数据是可以量化的,假如声音数据是 x,模型是 model,那么训练时就写为 model.fit(x, x),模型要拟合输入的数据,使得输出也很接近原来的数据,当我换其他声音数据输入进去,神经网络会调整这个新声音使得输出数据类似 x 的音色。你可能会担心神经元对原来的 x 不做任何改变——这样输出也是 x,但这几乎不可能,因为每个神经元的参数 wb 是不一样的,激活函数也会调整输出,单个神经元几乎不可能有输入等于输出的情况。

强化学习

机器学习可分为三大类:监督学习、非/半监督学习和强化学习,其中有特征有标签训练处理的模型叫监督学习,因为人们会告诉模型输出应该是什么;只有特征没有标签的是无监督学习,比如聚类算法,通过 K-mean 算法可以把若干散点进行聚类,人们无需事先规定哪些点是同一类。

强化学习,也有称增强学习的。深度学习大多是监督学习,必须有先验的数据进行训练。强化学习通常没有先验的数据(也可能有),想象一个机器人买股票,它可以看到过去一段时间的股票价格,要决定当前是买还是卖,刚开始机器人没有任何经验,它的交易几乎是随机的,但是在多次尝试中,有几次偶然的交易使得机器人获利,大量亏损和获利的案例就可以用来训练机器人,但是训练方法和深度学习是有很大差别的。

上述股票交易机器人,本质上也是一个模型,但是它不做涨跌预测,比如预测下一个 k 线是涨,然后跟着 10 个跌停,那实际上这个预测没什么用,模型要给出买入或者卖出的价值,这个价值会连同后续的收益一起计算,这样模型必须学会对后面的行情负责。比如我喂给一个训练好的模型过去 100 天的 k 线数据,然后模型可能预测买入的潜在价值是-10,那么不买,即便次日是涨,也不买,果然,后面连续跟着几个大跌,模型就避开了这些损失。然而在深度学习中,模型很难对后续的结果负责,通常只是预测明天是涨是跌,并且以此定交易策略。

在强化学习中也可以引入神经网络,此时称为深度强化学习,但网络在模型中只是一个小零件,强化学习模型本身就类似一台汽车,神经网络模型是汽车的发动机,此外还有大量其他的部件需要手动完成,比如模型的环境问题,股票机器人的环境是股市,但是股市软件是给人看的,程序无法理解,还需要人为收集数据整理成程序能够识别的环境,通常把环境封装成一个类,OpenAI 开源了 gym 环境便于简单练习,但是大部分实际场景的环境是要手动构建的,这是困难之处。

在具有良好 GPU 或者 TPU 的设备上,神经网络的训练是比较快的,强化学习训练得慢是因为和环境交互的慢,即便你有一台好设备。

如果读者对强化学习感兴趣,建议先学完深度学习的各个基本模型,然后可以尝试强化学习。