搞懂这个例子,再也不怕词向量了

大家好啊,我是董董灿。

在学习词嵌入向量的过程中,一个最著名的理解词嵌入向量在高维数学空间的例子,莫过于实现 queen = king - man + women 的数学运算了。

本文将从这个例子出发,解释该例子揭示的词向量背后的隐藏含义,并附上 Python 代码来实现这个高维词向量运算。

Queen = King - man + women

在经过之前文章对于词嵌入向量概念的介绍后,本文来看一下这个有趣的例子。

下面展示的单词“king”的词嵌入向量(该向量是在Wikipedia数据集上使用GolVe训练得到的)。

[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 , -0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 , 0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344 , -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]
该向量共50个数字,单从数字来看,我们并不能看到太多的东西,但是我们用另一种方法来把这些数字进行可视化展示。

方法如下:每个数字如果接近2,则为红色,如果接近0则为白色,如果接近-2则为绿色

有很多方法可以实现类似的可视化,这里略过,直接看将词向量可视化之后的结果。

图片

接下来,我们忽略上图中的数字,仅关注颜色,并且将一些我们认为含义相近的单词的可视化结果一起展示:

从上图,你是不是能发现一些端倪:women和man在颜色分布上,比women和king更加接近。

我们继续分析,继续放一些更加有关联的单词的可视化结果。

图片

上面放了:queen,king,man,women,boy,girl,water(无关)的可视化结果。我们逐个分析一下:

  • 在中间有一条非常明显的红线,从上到下一直贯穿,这条线代表的数字可能代表了一些信息(但是我们不知道是什么信息。)

  • 你可以看到,women和girl在很多地方颜色很相似,这一点在man和boy的对比上也可以看出来。

  • boy和girl也有一些相似的地方,但是和women以及man相比,又有一些不一致的地方,这些不一致或许说明代表的是“成人”信息。

  • 在最下面增加了water单词的可视化,可以看到在上面有一条蓝色的线从上到下贯穿,一直到water则停止消失了,这条蓝色的线或许代表的是“人类”这种信息。

  • queen和king的对比中,有一些相似但与其他不一致的地方,这些有可能代表了“皇室”的信息。

总之,经过上面的分析,我们可以看出,有相似特征的单词在某些数字(可视化后的颜色)上也会存在相似之处,但并非完全一致。

这代表了token与token之间仅仅在某些维度上是相似的,在其他维度上并不一致,比如“性别”、“皇室”等维度。

上面的例子,我们可以用Python代码来加载词向量,并且在高维数学空间中完成运算,甚至还可以完成“Beijing = China - country + capital”的逻辑运算。

关于如何用 Python代码来实现上述词向量的运算,你可以在这里查看详情:我的Transformer专栏


我的Transformer专栏来啦-CSDN博客文章浏览阅读572次,点赞12次,收藏5次。现在很多主流的大语言模型,比如chatGPT都是基于该架构进行的模型设计,可以说Transformer顶起了AI的半壁江山。对于这些有些枯燥的概念,有些乏味的数学表达,我会尽可能说的直白和通俗易懂,打通理解Transformer的最后一公里。我会在本公众号进行文章的首发,相关文章会添加标签“Transformer专栏”,可点击文章左下角的标签查看所有文章。巧的是,下班路上刚手敲完大纲,晚上一个小伙伴来咨询学习LLM的事情,问我之前写的《五一节前吹的牛,五一期间没完成,今天忙里偷闲,给完成了。https://blog.csdn.net/dongtuoc/article/details/138633936?spm=1001.2014.3001.5501

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
向量是一种将单映射到向量空间中的技术,它可以用于自然语言处理中的诸多任务,例如文本分类、机器翻译等。在Go语言中,我们可以使用Gonum库来实现向量。 首先,我们需要定义一个向量类型: ``` type WordVector struct { Words []string Vectors [][]float64 } ``` 其中,`Words`表示汇表,`Vectors`表示单对应的向量。 接下来,我们可以使用Gonum的矩阵运算函数来实现训练向量模型。下面是一个简单的例子: ``` import ( "fmt" "github.com/gonum/matrix/mat64" ) func TrainWordVector(corpus [][]string, dim int) *WordVector { // 构建汇表 words := make([]string, 0) for _, doc := range corpus { for _, word := range doc { if !contains(words, word) { words = append(words, word) } } } // 初始化向量矩阵 V := mat64.NewDense(len(words), dim, nil) for i := 0; i < V.RawMatrix().Rows; i++ { for j := 0; j < V.RawMatrix().Cols; j++ { V.Set(i, j, rand.Float64()) } } // 训练向量模型 for _, doc := range corpus { for i, word := range doc { // 获取当前单向量 x := V.RowVec(wordIndex(words, word)) // 计算上下文单的加权平均向量 var context mat64.Vector for j := i-2; j <= i+2; j++ { if j >= 0 && j < len(doc) && j != i { context.AddVec(context, V.RowVec(wordIndex(words, doc[j]))) } } context.ScaleVec(1.0/3.0, &context) // 更新当前单向量 x.AddScaledVec(x, 0.01, &context) V.SetRow(wordIndex(words, word), x.RawVector().Data) } } return &WordVector{Words: words, Vectors: V.RawMatrix().Data} } // 判断一个字符串是否在一个字符串切片中 func contains(arr []string, str string) bool { for _, a := range arr { if a == str { return true } } return false } // 获取一个单汇表中的索引 func wordIndex(words []string, word string) int { for i, w := range words { if w == word { return i } } return -1 } ``` 在上面的代码中,我们首先构建了汇表 `words`,然后初始化了向量矩阵 `V`。接着,我们遍历语料库 `corpus`,对每个单进行更新。具体地,我们先获取当前单向量 `x`,然后计算上下文单的加权平均向量 `context`,并将其与当前单向量相加,最后更新当前单向量。这个过程可以反复迭代多次,以得到更好的向量模型。 最后,我们可以使用训练好的模型来获取单向量: ``` func (wv *WordVector) GetVector(word string) []float64 { index := wordIndex(wv.Words, word) if index == -1 { return nil } return wv.Vectors[index] } ``` 这个函数可以返回一个单向量,如果该单不在汇表中,则返回 `nil`。 当然,上面的实现仅是一个简单的例子,实际应用中可能需要更复杂的模型和更大规模的语料库。但是,通过这个例子,我们可以看到如何使用Gonum库来实现向量

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值