为什么大语言模型做不好数学题?这个要从大语言模型的原理来讲。
这里是这篇文字的视频讲解,可能视频讲得更清楚一些:
写代码彻底搞懂attention注意力机制 – LLM transformer系列,附:在线编程地址
现代大语言模型都源自于2017年谷歌的一篇文章《Attention is all you need》 里面引入了一个非常有用的模型叫transformer。
这个模型首先对输入的句子进行编码, 这个编码并不是我们平常所说的文字编码,比如大家常听到过的 AscII编码,UTF8编码等等;
以前的计算机编码针对字或者词 主要是为了保证对每一个字或者词唯一的编码,让计算机好存储和使用;
但是transformer的编码叫Embedding,中文叫“内嵌”;每一个内嵌可能需要很多位表示 比如一个常见的编码可能是768位或者是2048位 这么多位的数据来表示一个词 是因为一个词里面包含了它的语义信息。
马这个词 就包含了 动物 食草 非洲 四蹄 池塘 等等 他甚至还包括了一些人不太能理解的信息 这些词的 Embedding是由专门的神经网络训练出来的。
我们可以拿这些词的embedding来计算不同词组之间的关联程度 比如河马与斑马之间的距离 就要比盒马与汽车之间的距离要近 在计算机里面可以用一个叫 Product点积的方法来计算。
那么问题来了,对几乎所有的词都会有一个Embedding, 但是对数字来说可能性就太多了 – 计算机是无法对所有数字的可能都进行编码,实际上它会对数字进行拆分。一个很大的数字它会拆分成几个小的Embedding,这样即使是大语言模型有一定的数学能力, 它也无法理解被拆分成的多个Embedding的数字组合起来的意义,更别提用他们来进行计算了。
我给大家准备了一个在线编码的网页,大家可以直接在上面写代码,试验上面讲的内容
https://chn.ai/embedding.html
import { AutoModel, AutoTokenizer, dot } from 'https://res.chn.ai/module/transformers@2.15.1/transformers@2.15.1.js'
let tokenizer = await AutoTokenizer.from_pretrained('Xenova/jina-embeddings-v2-base-zh')
let model = await AutoModel.from_pretrained('Xenova/jina-embeddings-v2-base-zh')
function stringify(obj) {
return JSON.stringify(obj, (key, value) => {
return typeof value === 'bigint'
? value.toString()
: value
}, null, 2)
}
var tokens = await tokenizer(['56873.254 * 12.312', '879237 / 09182', '1235'], {padding: true})
var tokenIds = Array.from(tokens.input_ids.data)
var words = await tokenizer.decode(tokenIds).split(' ')
console.log(words)
var embeddings = await model(tokens)
console.log(stringify(embeddings))