ELmo解决单词考虑上下文,词向量的表示,动态调整词向量。目前来说最好的方法
首先我们通过训练集训练已经得到了单词back的词向量,然后在测试集中,如果出现了这个back单词,我们不是直接使用训练好的词向量,
而是将训练好的词向量加上一个根据back在测试集出现位置上下文的一个偏移量, 最终得到back词向量是基于当前测试集上下文的。
Elmo
1、使用了语言模型的训练框架
2、使用了深度学习
理解deep model
deep learning 等价于层次结构学习
从识别汽车的例子看出,在底层特征中,是一些很微小的特征,当在高层次特征中,可以明显看到更加具象的特征,比如车灯,轮胎等。
在底层的特征,我们完全可以把这些特征运用到其他领域,也就是可以进行迁移学习transfer learning
越往高层,学习到的特征越适应于当前领域的研究。
这些底层次的特征训练出来的参数我可以运用到其他领域,作为预训练初始化参数,这样可以减小新模型训练的成本
既然深度学习在CV中可以得到层次结构的特征,那是否也可以用于NLP中提取单词的层次结构特征?
如果应用,我们希望使用深度学习的方式来构建词向量模型,通过深度学习方式,
得到低层次的希望是单词特征,接着是语法特征和单词的语义特征,针对一个单词的不同层次特征。
我们想通过RNN这种模型来得到chain rule这种不经过马尔科夫假设的概率形式,使得概率计算更加准确
我将每个单词训练好的词向量都送入LSTM模型,通过这种层次结构,每一层都能得到一个单词特征,然后我将得出的几个特征向量加权求和来得到最终单词的一个向量embedding,也就是说,这么一个词向量既考虑了单词特征、也考虑了语法语义特征。
权重参数和为1,并且这几个参数要通过训练得到。
以上就是ELmo的一个思路
RNN模型中,因为计算下一个词的向量是考虑到前边所有词的,所以就没有窗口的概念,每次计算词向量我都是把前边所有单词全部考虑的结果。
RNN中的标签就是单词的下一个单词,比如到第三个单词,此时计算出了三个单词的词向量,要预测第四个单词是什么,也就是第三个单词的标签,直接使用交叉熵损失函数计算损失,得出预测结果。
我的理解就是:通过训练集训练出一个Elmo模型,我需要的是模型的参数,而不需要训练集中词向量在每层中的一个特征词向量。在测试集中,输入的单词经过模型是动态生成词向量的。
词向量总结
使用词向量来表示一个单词
整个的词的表示分成两部分:
1、one-hot表示:包含布尔表示,count based representation,tfidf是考虑了单词重要性的文本表示法
2、分布式的表示
按照空间角度划分:
1、非欧式空间:也就是弯曲的空间,有Hypobolic embedding,具备了可解释性
2、欧式空间
1、global:在学习词向量的时候关注整个的语料库,典型的方法:矩阵分解MF(metrix F)
2、local:在学习词向量时只关注当前句子或者段落
(LM:Unigram、Bigram、Ngram,由马尔科夫假设得来,根据前边的词来预测新词 )
1、基于非LM:即不是通过前边的单词推测后边的
包括skip-gram(中心词推出上下文词,工业界用的最多)、CBOW(上下文词推出中心词)、Glove,这三个考虑了置信度。 Gussian Embedding考虑不确定性
2、基于LM:即根据前边的词推测后边的
1、考虑上下文:ELmo(预测的第N个单词是综合考虑了前边所有单词)、BERT
2、不考虑上下文:NNLM(神经网络LM,4-gram,根据前三个单词预测第四个单词)
MF矩阵分解:推荐系统最常用的方法
基于全局语料库来学习词向量
根据语料库得出一个矩阵,统计相邻单词出现的次数。接着通过MF的方式得到单词词向量
Glove
MF的方式好处是考虑到了全局,但是当一个新词出现的时候又需要重新进行MF,
local的方式计算快,但是没有考虑全局
glove综合考虑了MF和skipgram
Gaussian Embedding
每个单词不再是词向量,而是高斯分布的 表示形式
非欧式空间
欧式空间看不出事物的一个树状的关系
当放到非欧式的空间时,比如中心点是fruit,他周围会围绕水果的单词,这就能明显看出一个所属关系
对于word embedding的方法,我们同样可以用在其他方面
句子层面sentence embedding、节点Node embedding、Graph embedding、Knowledge Graph embedding、Code embedding