ARTICLE · 1032693
《神经网络与深度学习通识版》第八章习题选1
这一章是真的完全从通识的角度,写得非常通俗,作者也建议没有耐心的读者完全可以直接看这一章,确实是对读者考虑到位了。而且说是从这一章开始看起,不知道后面是否都是这个样子的。
第一题:
“‘下一个词预测’看似只是一个填空游戏,却能训练出会写作、会推理、会编程的通用能力.请用你自己的话解释这个悖论:为什么如此简单的目标能走出如此远?提示:考虑‘要猜对下一个词,模型到底必须知道哪些东西’.”
首先作者论证了一下人类的语言本身就是对世界知识和智能的一种压缩,因而大模型采用对语言文本数据的几乎全量的学习,确实是找对了方向,挖到了富矿。并且大模型的预训练采用的‘下一词预测’模式如果加以深入分析,其实并不简单。
之所以第一眼看上去,这个训练方式似乎很简单,是它对应的数学模型的表现形式,总是在优化计算以前面出现词为条件的下一词的最大出现概率。但实际上,在这一表现形式背后,优化的结果是凝聚在语言中的全部的人类文化的积累,这个分布是非常复杂的。
在预训练过程中,要正确完成预测任务,模型不得不学习语言中内含的语法、语义、物理世界的各种常识、人类世界的各种规范、各种事物的因果联系、逻辑关系、以及各种文字表达的方式、风格、情感,等等各种潜在因素,最终的分布是所有潜在因素的联合函数,因而在完成学习过程中,模型确实压缩了题目中提到的写作、推理、编程等各种通用能力。
也正因为其背后的数学模型非常简单,就是对应着下一词的分布,因此模型学到的是统计关联和隐式模型,并不直接等同于精确的规则、逻辑等人们所需要的最终表现,所以即便是在巨大的参数和数据规模下完成了训练之后,还是会出现输出幻觉等各种问题。
第二题:
“从‘输入文字’到‘输出回答’,中间经历了分词、词元编号、词向量、Transformer、logits、Softmax概率和解码.请用自己的话画出这条链路,并说明:为什么模型看到的不是我们眼里的文字,而是一串可以计算的编号和向量?”
题目中提到的模型实际指的是大语言模型,这是一种深度神经网络,其对应的数学运算是线性的矩阵乘加映射以及非线性的函数映射的组合,所有运算都是针对整数和浮点数进行的。而平时所见的文字,一般都编码为没有语义关联的字节序列,可能是等长的ASCII码序列,也可能是不等长的UTF-8编码序列,这些都是不能直接拿来进行神经网络数学运算的。
为了要对齐输入和输出向量的编码空间,需要首先确定完整的词表,每个词元在词表中都有唯一编号,包括各种特定的辅助词元,这样在输入端才可以将字符映射为one-hot的向量,在输出端将向量映射回字符,也只有使用这种one-hot向量,才能够进行正确的损失函数计算,否则不同向量之间的差异是没法相互比较的。
另外,词表的确定是在语料全部准备完成之间进行的,并且很难做到迭代更新,而语料数据可能会逐步增加,因此词表不能只考虑静态的初始数据,通常采用面向字节的BPE,实际上将字符序列拆分为词元,而不是直接使用文本中的词。
但是这种词表的尺寸是非常巨大的,因为要覆盖全部数据中可能的词元,这样对应的输入向量维度太大,直接进行矩阵运算也是不行的。并且这种词表中也没有包含词元之间语义上的关联关系,对于Transformer的学习过程没有好的辅助作用,因此再利用曾经训练好的编码模型,将词元映射为浮点表示的维度更低的向量表示。这不仅可以减少Transformer输入维度,降低计算量,并且这些向量之间自带了语义信息,使得Transformer的关联计算效果更好。也有可能是通过可学习的参数在训练过程中得到大模型自己的嵌入映射层。
最后,在网络的输出端,首先得到的是词表维度的实数向量,被称为logits(可能是正数也可能是负数),相当于每个词元的原始得分,这还不是词元对应的概率值,还需要通过Softmax归一化为真正分布,每个分量大于0,和为1。这样才能够利用Top-p等算法一步步选取下一词元,完成解码过程。
第三题:
“温度(Temperature)控制着采样的随机性:稳定还是多样,这是生成类任务永恒的张力.请分析在创意写作、代码生成、事实问答三种场景下你会如何选择温度,并思考:有没有办法让模型自己判断当前该‘稳’还是该‘活’?”
标准的Softmax计算公式为
,带温度的Softmax计算公式为
,实际上是在进行Softmax计算之前,对logits进行了缩放。如果T取低温,比如0.1~0.5,logits整体差距都被放大,因而最终的概率值更加尖锐,而如果T取高温,比如大于1,那么logits整体差距是被压缩,最终的概率值分布变得平坦。
在采用了带有温度的Softmax计算后,解码过程中对高概率Token的选择范围就会随之产生变化,温度低的时候,选择范围变小,模型输出变得稳定,相反,温度变高,原来低概率的Token被选中的概率就变大了,因此模型输出变得更加多样。
对应到几种不同的业务场景,很容易可以看出,创意写作自然需要较高的温度参数,因为不希望模型总是产生固定的输出,但是在代码生成时,尽量应该调低温度,使得模型输出严格按照语法规范来生成,而在事实问答场景下,温度参数的选择是介于前面两种场景之间的,因为温度过低,回答会显得比较机械,而温度过高就容易产生幻觉。尤其是在有非常明确的参数事实的情况下,更应该选择较稳定的方案。
从这些业务场景出发分析,确实存在让模型自己判断温度参数大小的实际需求,并且这些需求的粒度可能是随着业务场景的改变而动态变化的,因此具体的方法确实需要仔细考虑。
根据网上提示,在这方面已经有了不少研究,实现思路有很多。
首先是根据logits计算出的Top-1的token的概率,看这个概率和其他概率之间的分布情况,可以根据相互之间的差异计算置信度,甚至计算熵,从中判断模型对此次输出是非常确信,还是比较犹豫。对于很确信的情况,可以适当降低温度,反之,升高温度。
另外,有一种退火策略,就是在输出的初始部分,采用较高的温度,随之时间步的前进逐步将其衰减,这样在开头鼓励创意,结尾保证逻辑合理。这种方法还有对应的信息论的理论支持:随着生成的进行系统的不确定性会降低。
还有考虑对不同温度的输出进行对比,根据差异大小进行选择。
还有判断任务对话的关键词和多轮对话的语义复杂度,判断业务场景的稳定性需求,再据此对温度参数进行选择。
还有一种思路看起来层次更高。首先温度参数是解码采样阶段的超参数,不是模型权重,不能通过梯度反向传播来学习,同时还可以将其动态选择过程视为一种序列决策问题,因此就想到通过强化学习的方式来对其建模。具体实现方案也是有不少。
总之,这是一个和具体业务相关的很开放的设计,应该不是单一的方法所能够解决的。