有时候,当你能够抽取问题,困惑就已经解决一半。因为,Google能帮你解决另一半。
最近总会想到这样的问题:
- 别人预训练好的词向量比如Glove或是Bert给出的Finetuning作用在哪里?
- 它们和我自己手里的语料库之间的关系是什么?既然有了Finetuning,还要自己的语料库做什么呢?
很白痴的问题。
1. 词向量
自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。
- 最直接的就是one-hot。但是问题是词与词之间没有关系
- 另一种就是分布式表示Distributed representation
- 基于矩阵的分布表示(n-gram、Glove)
- 基于聚类的分布表示(根据两个词的聚类类别判断相似度,布朗聚类(Brown clustering))
- 基于神经网络的分布表示,分布式表示、词向量、词嵌入(word embedding)
核心依然是上下文的表示以及上下文与目标词之间的关系的建模。
到目前为止所有词向量训练方法都是在训练语言模型的同时,顺便得到词向量的,这样就引入了语言模型概念。
2. 语言模型
语言模型包括文法语言模型和统计语言模型。一般我们指的是统计语言模型。其实就是看一句话是不是正常人说出来的。比如机器翻译、语音识别得到若干候选之后,可以利用语言模型挑一个尽量靠谱的结果。在 NLP 的其它任务里也都能用到。
OK,现在回到最开始的问题,语料库、词向量、词嵌入、语言模型之间的关系是什么?
- 语料库训练了语言模型,顺带生成了词向量,而词向量是包含有词嵌入这样的表示方式。
使用自己的语料库,配合Finetuning可以生成自己的语言模型?