大模型入门


以下是Chaaaaaaaaaaaaaaaat-GPT的发展路线

生成式大模型发展路线

其实关于chatGPT发展路径而言,有个非常有趣的地方,那就是一切都是从向量为起点出发的。
首先我们知道,最初提到向量这个概念,是通过平行四边形法则提出的,很多问题只通过标量无法解决(比如物理学中引入了方向作为新的维度的问题),需要通过新的视角来看待一些问题,而向量相对标量计算符号体系来说,未免有点太过复杂了,为了解决这个问题,后续引入了向量符号,新的符号体系也就此诞生!(大概吧!)

碎碎念一下,物理学(对于直观现实的实践)的探索反而反作用于了数学体系的扩展和进步(否认了过去的简单数学体系),果然做出新的可能性比一味的想更重要

而关于统计学也可以进一步的做一些引导,那就是:自由度的概念。

首先基于现实的问题分析,我们必然无法知道自己是否穷尽了所有样本信息,因此我们需要通过当前我们已经拥有的样本来估计整个系统参数是怎么样的。


数学模型化:现实观察→定性归因→量化定义→模型构建→求解验证。

为了通过样本的统计量来估计总体参数,就需要对问题进行模型化,这时候则需要引入自由度:我们需要得到样本当中能够独立或自由变化的数据的个数,而自由度与维度是同一的东西,由此我们就可以将向量矩阵引入现实问题分析当中。

而对于文本分析,每句话则可以看成是样本,而我们需要解决的问题则是如何通过每个单词构成的句子(样本),寻找能使得让单词组成一句话的通用规律,从而使得计算机能够通过这个通用规律生成一句正常的话(甚至拥有正常的语句逻辑)。


One-hot编码

将一句话进行拆分,通过对每个不同的单词进行单独编码,形式为一个向量,其中一个数位为1,其余数位皆为0(单词组的自由度/维度即为单词总个数)

例如
I have an apple and a banana.
根据One-hot编码,即可得出一组七维向量
矩阵形式为

$$\begin{bmatrix}
1&0&0&{\cdots}&0&→& I\\
0&1&0&{\cdots}&0&→& have\\
0&0&1&{\cdots}&0&→& an\\
{\vdots}&{\vdots}&{\vdots}&{\ddots}&{\vdots}&→& {\vdots}\\
0&0&0&{\cdots}&1&→& banana\
\end{bmatrix}$$

One-hot编码固然可以解决区分每个单词的目的,**但是显而易见的并非所有单词都是可以独立或自由变化的**(单词与单词之间本身就具有关联性),采用余弦相似度计算时就会出现问题。

还记得空间向量夹角计算吗,给他套个余弦符号,同向为1,异向为-1,正交为0.

例如a和an,其余弦相似度为0,说明两者正交,语义无关,这很明显是个错误的结论;并且一个单词一个向量,维度太多了,因此这种编码方式并不适用于解决实际问题。


使用深度学习网络进行词向量的编码

那怎么办呢,通过人类自己的思考,去构建一套体系去获得不同语义下语句的文字组成方式,未免也太难了,这种时候就需要借助深度学习网络作为工具,我们只需要往里面怼句子,让模型自己去拟合出一个参数盲盒,这样就可以节省大量的人力——只要往里怼单词,他就能自己形成我们想要的东西了。

这里首先要提到上游任务和下游任务是什么

上游任务在机器学习中主要指预训练阶段的任务,目的是让模型学习通用特征。比如让语言模型通过完形填空学习语言规律。这类任务通常数据量大但比较通用。下游任务则是用户实际关心的具体应用,比如情感分析或机器翻译,数据量小但专业性强。

上游任务: 通常指预训练阶段的任务。这些任务的目标是让模型从海量、通用的数据中学习基础、通用的知识或表示。这些任务本身可能不是最终的应用目标,但为后续任务奠定了坚实的基础。

下游任务: 指具体的应用目标任务。这些任务通常数据量相对较小、更具体。下游任务利用在上游任务中学习到的通用知识(模型参数或表示),通过微调或特征提取等方式,快速高效地适应到特定问题上。

为什么会有这样的分工?
解决数据稀缺: 很多下游任务缺乏足够的标注数据来从头训练一个强大的模型。利用上游任务在大数据上学到的知识,可以显著减少下游任务对数据量的需求
提升性能: 预训练模型提供的强大通用表示,通常能让模型在下游任务上达到比仅用下游任务数据从头训练高得多的性能。
提高效率: 微调一个预训练模型比从头训练一个模型快得多,计算成本也低得多。
促进通用模型发展: 专注于设计更强大的上游任务和模型(如 BERT, GPT, ViT),可以为无数个下游任务提供强大的基础,推动整个领域的发展。

你已经明白了什么是上游任务和下游任务以及最基本的词向量知识了,现在来进行一个小小的实操吧


如果我们要解决这样一个问题:已知条件:我们提供的很多句话,并把他们合并为了一个数据集;
问题:现在我想要通过这个数据集,获得一个根据输入的提示,最终能够生成一段话的模型,他的最明确的上游任务和下游任务是什么呢?

显然,上游任务和下游任务在实际生产任务当中会有一个相对平均或结构化的工作量划分来取得界限在那里,但是我们毕竟是从零思考,就需要先迈出第一步,即除了第一步是上游任务,其他都是下游任务(暂时不可知的)来考虑

首先,每句话都是以不同的单词作为元素,根据一定的语法逻辑进行“拼好句”构成的,那么作为最基础的元素——单词,要明确每个单词与每个单词间的基本语义的差异和共同点就非常重要了,那么第一步必然要从单词本身进行区分入手。

那么,第一步一定是要根据句子数据集,通过每句话当中的单词与单词的含义的逻辑关系与上下文的连接关系,来确定给单词分配什么样的向量,从而只需要判定向量本身的相似度,就可以判断单词与单词的区分度以及连接关系了。

很棒!这就已经确认了我们的第一个上游任务,即通过深度网络帮助我们人类去完成那些烦人的区分任务!好耶!深度网络万岁!

那么当然从这个维度而言,剩下的就都是下游任务——通过给定的词向量(给定了单词),去构建出一句完整的话

这第一个上游任务,经过了以下几代的迭代

这里还需要一个前置知识:什么是神经网络?神经网络各层的结构和作用是什么?

请看该博客:todo

NNLM(神经网络模型):用该单词前的n-1个单词,来预测第n个单词是什么
参考文献:https://www.cnblogs.com/jyroy/p/14726894.html

↓升级版!

Word2Vec:两种训练方法
CBOW:从一句话里抠出一个词,用该词的上下文去预测被抠掉的这个词 ———— 完形填空
Skip-gram: 输入一个单词的上文,预测这个单词的上下文单词会是什么 ———— 完空填形(什)

基本的好用的词向量就这样出来了~但是W2V无法解决多义词问题(由于词和向量的一对一关s系),由此引出ELMo(基于LSTM进行改良后的)模型,但是ELMO已经被Transformer淘汰了,所以这里只讲到W2V为止(用来表现一些方法论)

由于Transformer是建立在RNN和LSTM改良基础上获得的,所以这里着重要记录一下RNN与LSTM的思路

RNN和LSTM

RNN:简单来说,就是把上一次的输出结果再放进隐藏层里作为上下文数据,和这一次的输入一起进行训练

很显然,这样的上下文掺入方式,会让上文的信息在层层传递后慢慢失去,无法处理长期序列,因此需要有一种新的方式尽量处理更长的输入序列——以人脑思考角度来看,我们对一段话的印象,很大程度只会是那几句全文都在围绕的“核心语句”,并遗忘掉那些被迭代的,不重要的信息;按照这样的思路,我们是否可以使模型也保持注意力在重要的语句上呢?于是,LSTM诞生了!

LSTM:

参考:https://blog.csdn.net/mary19831/article/details/129570030

to be continued...

  TOC