我们在平日的生活中所说的话语,如何使用计算机自动构造出来呢?
一.探究我们在说一句话时,无形中做了什么
1.人类语言通俗剖析
我想吃晚饭
通过以上内容,我们可以把句的意思拆分为:我·想·吃·晚饭。
我们通常在说“我”的时候,大脑其实是在思考下一个词,即“想”,然后说了“想”了同时,开始思考下一个词“吃”,以此类推。
也就是说,我们每一次说出下一个词的时候,是基于上一个词说的是什么而定的,这样才能在表达出自己意思的同时能顺利组织成一句话。
这种思想很像条件概率?没有错,这种思想确实可以用条件概率表达出来:
此处的P(S)被称为语言模型,也用来计算一个句子的概率。
通过以上式子可看出,每次新出现的词汇,都和之前已经出现的词汇有很强的关联(条件概率嘛),所以越到后面的词汇,所需要的条件概率越稀疏,并且参数巨大(每个词都是一个参数哟!)
- 数据过于稀疏
- 参数空间太大
2.-N-gram模型的出现
而事实上,当一个句子非常非常长的时候(特别是中文),后面出现的词汇很有可能和前面说的东西,产生的因果关系不大了。那么我们就可以进行如下假设:
我们每个词汇出现的概率,只和前面一个词汇相关:
我们每个词出现概率,只和前面两个词相关:
以此类推,还可以每个词和前面3个相关,4个等等....(对于处女座,这种玩法太难受了,但确实把问题化简了很多!)
这种玩法就是传说中的-N-gram模型,其中N代表的就是和前面N个词条件相关。
假设语料库的规模是N,相关词汇量是n,模型的参数量级为。由此我们可以看到,随着相关n的增长,参数规模增长是十分迅速的。所以在进行模型设计时,要考虑到小伙伴电脑的牛逼程度才行,目前主流计算机能支持到n=10的程度。一般让n=4,5都是ok的。
二.词向量
1.Hierarchical softmax
①CBOW(Continuous Bag-of-Words)
根据上下文预测出某个空的词是的内容
-
根据词频,对语句进行哈夫曼树的构造(由底至上济宁构建),词频即为哈夫曼权值。
构造过程
2.开始进行计算啦!
在计算之前,首先解释一下各个参数含义:
- :从根节点出发到达w对应叶子节点的路径。
- :路径中包含的叶子节点个数。
- :中的各个节点。
- :上的第n个节点上对应的编码
- :非叶子节点对应的参数
哈夫曼树是一种二叉树结构,也就是说,利用二分类可以一步一步找到叶子节点,我们这里使用sigmod进行二分类。所以:
正例:
负例:
通过以上两个公式,我们找到目标的过程,无非可总结为以下两种情况:
- 走向正例时:
- 走向负例时:
程序每次下寻找一次,都会经历上述两个公式其中之一,最终会找到目标词汇,同时会留下一条路径,把路径的每一部都连乘起来就是:
在累乘计算时,计算可能会比较困难,我们把上述等式两边同时取对数:
从公式可知,这里的概率值越大越好!所以此题目为求解梯度上升。
对求导,得:
由梯度上升可知,更新形式为:
同样,对投影层的进行求导:
投影中的并不是单独的词向量,而是由词向量拼接而成的一个大向量,然而,2013年google粗暴的将这个导数更新到各个词向量中:
②Skip-Gram模型
其实就是把CBOW的流程倒过来,回推出各个词向量。
2. 负采样
当语料库非常庞大的时候,将会构造出非常庞大的哈夫曼树,这样仍然会增加计算机的压力,影响计算速度。如何解决呢?那么我们下回分解!
网友评论