1,使用tokenizer对用户输入分词。①把单个汉字转为编号id(就是vocab.txt中该字对应的行号)所以说一个汉字会对应一个id②在输入的开头加上[CLS],结尾加上[SEP]。
2,模型的输出:logits。即logistic unit逻辑单元
(1)logits其实就是每个字对应的概率,他还没有经过softmax层处理,所以概率和不是1。Logits里面的值都是tensor类型,通过比较tensor值的大小判断下一个字可能是什么,tensor最大的就是最有可能的字。可以通过“logits.shape或size”查看它的维度。
(2)当用户输入一个字时,torch.Size([1, 3, 13317])。
Ⅰ,其中13317是vocab_size,vocab.txt中正好有有13317行。也就是说字表中的每一个字都有对应的概率。
Ⅱ,logits.shape的第二个数是3,这是因为input有三个数:[CLS]你[SEP]。
Input中有几个tokenizer id,最后的logits就会有几层。
第一层是输入了[CLS]之后,模型预测[CLS]后面可能是什么字对应的概率
第二层是输入了[CLS]与你之后,模型预测你之后可能会是什么字
第三层是输入了[CLS]你[SEP]之后,模型预测这三个字后面可能的字
所以说,我们想要得到输入数据的下一个字是什么?只需要取logits中的最后一层。
(3)因为GPT模型会把新生的字追加到输入中,所以input会越来越长,所以logits的的层数会越来越多(且前几层数据不变,因为input中前几个字没有变,只是追加了输出)。
①在一些要把用户多次输入联系起来的应用场景下【用户输入是有联系的,就像电视连续剧,每一集之间剧情连续】,input可以是n次的用户输入或机器输出句子。N可以自己设置。
比如说,chatbot聊天机器人,若n=3,而聊天轮数为10时,input中存的是第9轮的机器回答,第10轮用户输入,第10轮机器回答。
②有一种情况,2次的用户输入是没有关系的。比如疾病问答GPT,用户输入病名,机器输出详情。这种情况用户2次输入都是独立的,不需要把当前输入和上次输入联系起来(诗词自动生成GPT也是,用户每次输入没有关联)
3,torch.cat(tensor1,tensor2,dim)用来拼接tensor。它的dim正好与softmax一样,0表示最外层(列)。下图是2个2*3的tensor拼接结果。
dim=0时,把它们的列拼在一起了。维度一般是0(最小值)表示最外层,-1表示最里面那层