首页 > 编程知识 正文

embedding层,list.toarray有什么用

时间:2023-05-03 06:12:59 阅读:33168 作者:2554

词向量在英语中称为Word Embedding,正如文字所示,应该是词的嵌入。 说到词向量,很多读者应该很快就会想到谷歌制造的Word2Vec,但大牌效应不同。 另外,在Keras等框架中有嵌入式层,也称为将词ID映射到向量。 由于成见,大家把字向量和Word2Vec一样,问:“嵌入式是哪个字向量? ”可能会反过来问。 这样的问题应该是混淆的,特别是对初学者来说。 其实,对老手来说,也未必能说得好。

这必须从one hot开始.

五十步笑百步

one hot,汉语中可译为“独热”,是最原始的表示字、词的方式。 为了简单起见,本文以字为例,语言也很相似。 词表上有“科、学、空、间、不、错”六个字时,one hot是这六个字分别用0-1编码。

$ $begin { array } { c|c }hlinetext {科} [ 1,0,0,0,0 ]

text{学} [ 0,1,0,0,0,0 ]

text{空} [ 0,0,1,0,0,0 ]

text{间} [ 0,0,0,1,0,0 ]

text{否} [ 0,0,0,0,0,1,0 ]

text{错误} [ 0,0,0,0,0,0,1 ]

(hline

end{array}$$

那么,表示“科学”这个词的话,可以使用矩阵

$$begin{pmatrix}1 0 0 0 0 0\

00000 (结束) p矩阵$$

您可能听到了问题,只要有几个字,就需要几个维度的向量。 如果有1万个字符,则各字符的向量为1万维。 (常用的文字可能不多,几千个左右,但从语言的概念来看,常用的语言可能有十几万个。 于是出现连续矢量显示。 例如,如果用100维实数向量表示一个字符,则维将大幅下降,拟合风险将降低。 初学者这样说,很多专家也这样说。

但是,事实是“放屁! 放屁! 放屁! 说三次重要的话。

让我给你看看出道问题。 如果给定两个任意实数型的100次矩阵来计算它们的乘积,可能谁也计算不出来。 顺便说一下,我给你两个1000层的矩阵,其中一个是one hot型(每行只有一个元素为1,其他为0 ) ) )的矩阵。 如果让我乘以的话,我马上就能计算出来。 如果你不相信,你可以试试。

知道问题了吧? 虽然one hot矩阵庞大,但人很容易计算。 你的什么鬼实数矩阵? 虽然维度很小,但是计算很麻烦呢。 (虽然这么多计算量对计算机来说没什么大不了的)当然,更深层次的理由还在下面。

而是#

我们真的要去计算一次

$$begin{pmatrix}1 0 0 0 0 0\

00000end { p matrix }begin { p matrix } w _ { 11 } w _ { 12 } w _ { 13 }

w_{21} w_{22} w_{23}\

w_{31} w_{32} w_{33}\

w_{41} w_{42} w_{43}\

w_{51} w_{52} w_{53}\

w _ { 61 } w _ { 62 } w _ { 63 }end { p matrix }=begin { p matrix } w _ { 11 } w _ { 12 } w _ { 13 } _ }

w _ { 21 } w _ { 22 } w _ { 23 }end { p matrix } $ $

的形式表示。 这是一个以2x6的one hot矩阵的为输入、中间层节点数为3的全连接神经网络层,向右看,相当于在$w_{ij}$矩阵中,取出第1、2行。 这不是和所谓字向量的查找表(从表中找到对应字的向量)相同吗? 其实,是的! 这就是所谓的嵌入式层,嵌入式层是以one hot为输入、中间层节点为字向量维的全连接层! 这个所有连接层的参数是“字向量”! 从这个水平来看,字向量什么都没做! 那是one hot。 不要嘲笑one hot的问题。 字向量是one hot所有连接层的参数。

那么,所谓字向量、字向量,真的没有什么创新吗? 有。 从运算上看,基本上通过研究,将one hot型的矩阵相乘后,就相当于查找表。 因此,通过将直接查找表用作操作而不写入矩阵,可以大幅减少运算量。 再次强调,减少运算量不是因为词向量的出现,而是因为为了查找表操作而简化了one hot型的矩阵运算。 这是计算水平。 从思想上讲,得到了这个全连接层

参数之后,直接用这个全连接层的参数作为特征,或者说,用这个全连接层的参数作为字、词的表示,从而得到了字、词向量,最后还发现了一些有趣的性质,比如向量的夹角余弦能够在某种程度上表示字、词的相似度。

对了,有人诟病,Word2Vec(CBOW)只是一个三层的模型,算不上“深度”学习,事实上,算上one hot的全连接层,就有4层了,也基本说得上小小的深度模型了。

从何而来#

等等,如果把字向量当做全连接层的参数(这位读者,我得纠正,不是“当做”,它本来就是),那么这个参数你还没告诉我怎么得到呢!答案是:我也不知道怎么得来呀。神经网络的参数不是取决你的任务吗?你的任务应该问你自己呀,怎么问我来了?你说Word2Vec是无监督的?那我再来澄清一下。

严格来讲,神经网络都是有监督的,而Word2Vec之类的模型,准确来说应该是“自监督”的,它事实上训练了一个语言模型,通过语言模型来获取词向量。所谓语言模型,就是通过前$n$个字预测下一个字的概率,就是一个多分类器而已,我们输入one hot,然后连接一个全连接层,然后再连接若干个层,最后接一个softmax分类器,就可以得到语言模型了,然后将大批量文本输入训练就行了,最后得到第一个全连接层的参数,就是字、词向量表,当然,Word2Vec还做了大量的简化,但是那都是在语言模型本身做的简化,它的第一层还是全连接层,全连接层的参数就是字、词向量表。

这样看,问题就比较简单了,我也没必要一定要用语言模型来训练向量吧?对呀,你可以用其他任务,比如文本情感分类任务来有监督训练。因为都已经说了,就是一个全连接层而已,后面接什么,当然自己决定。当然,由于标签数据一般不会很多,因此这样容易过拟合,因此一般先用大规模语料无监督训练字、词向量,降低过拟合风险。注意,降低过拟合风险的原因是可以使用无标签语料预训练词向量出来(无标签语料可以很大,语料足够大就不会有过拟合风险),跟词向量无关,词向量就是一层待训练参数,有什么本事降低过拟合风险?

最后,解释一下为什么这些字词向量会有一些性质,比如向量的夹角余弦、向量的寂寞的期待距离都能在一定程度上反应字词之间的相似性?这是因为,我们在用语言模型无监督训练时,是开了窗口的,通过前$n$个字预测下一个字的概率,这个$n$就是窗口的大小,同一个窗口内的词语,会有相似的更新,这些更新会累积,而具有相似模式的词语就会把这些相似更新累积到可观的程度。我举个例子,“忐”、“忑”这两个字,几乎是连在一起用的,更新“忐”的同时,几乎也会更新“忑”,因此它们的更新几乎都是相同的,这样“忐”、“忑”的字向量必然几乎是一样的。“相似的模式”指的是在特定的语言任务中,它们是可替换的,比如在一般的泛化语料中,“我喜欢你”中的“喜欢”,以及一般语境下的“喜欢”,替换为“讨厌”后还是一个成立的句子,因此“喜欢”与“讨厌”必然具有相似的词向量,但如果词向量是通过情感分类任务训练的,那么“喜欢”与“讨厌”就会有差异较大的词向量。

未完不待续#

感觉还没说完,但好像也没有什么好说的了,希望这点文字有助于大家理解字、词向量这些概念,弄清楚one hot和Embedding的本质。有疑问或者有新的见解,欢迎留言提出。

更详细的转载事宜请参考:《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

打赏

微信打赏

支付宝打赏

因为网站后台对打赏并无记录,因此欢迎在打赏时候备注留言。你还可以点击这里或在下方评论区留言来告知你的建议或需求。

如果您需要引用本文,请参考:

gxdxbw. (2016, Dec 03). 《词向量与Embedding究竟是怎么回事? 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/4122

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。