深度学习其实最成功的应用是在图像上,有了 CNN 可以很好地提取图像上的特征,这些特征经过几层的神经网络结构可以很好地组合成比较抽象的特征。
传统:基于规则(去学习语言之间的语法规则,总结出一套系统,可拓展性不强)
现代:基于统计机器学习
- HMM CRF SVM LDA RNN LSTM CNN
- ”规则“隐含在模型参数里
词向量:在计算机中用一个向量去表示一个词,一段文本,这样可以更高效地进行数学操作
上位词、同义词 (猫和动物、宠物) ()
单词的 one-hot 表示:[1,0,0,0,0,0,0,0,0]
单词到 index,再到 one-hot ,单词的 one-hot 只能表示单独的一个词,不能体现出彼此之间的关系,即没有语义关系
文档向量的表示:[1,2,1,1,1,0,0,1,1]
- 这种表示的每一列指的是一个特征,很重要的一点,放到分类模型如 LR NB SVM 中去学习,完成分类
- 文档向量可以直接将各词的词向量表示加和
缺点:稀疏向量、语序、语义鸿沟(否定词起到的作用不大)、词权重
- 词在文档中的顺序没有被考虑
- 每个词表示的权重相同,有些词属于停用词不重要,有些词表达了文本的主题,所以需要考虑每个词在文本中的重要度
词权重指的是每个词在其对应文本的重要度,表示形式如下:
- TF-IDF:TF-IDF详细介绍
- Binary weighting 短文本相似性,Berboulli Naive Bayes,只考虑出现没出现
和词频的表示方式解决了词序的关系
优点:考虑了词的顺序
缺点:词表的膨胀
- 比如酒店、宾馆、旅社 三者都只在某一个固定的位置为 1 ,所以找不到三者的关系,各种度量(与或非、距离)都不合适,即太稀疏,很难捕捉到文本的含义 ()
稀疏问题和语义鸿沟问题
比如酒店、旅馆、宾馆之间的相似性,词编码下要保证这几个词在空间上是比较相近的
体现在不同语言之间类似的分布:比如英语和西班牙语
国王 - 女王 + 妇女 = 男人 (是一种更高级的表示)
巴黎 - 法国 = 柏林 - 德国
问题:5 和 6 比较接近,还是 5 和 500 比较接近 ?
最终目标:词向量表示作为机器学习、特别是深度学习的输入和表示空间()
用一个词附近的其他词来表示该词,现代统计自然语言处理中最有创建的想法之一。
banking 附近的词将会代表 banking 的含义,讨论银行的时候,你很有可能讨论政府、债务、货币、金融危机,这些词很可能一起出现,具有一定的相似性,可以用周围词表示它,看完一篇报纸你就能学习到一些词之间的关联性。
window length 设为 1 (一般设为 5 - 10 )使用对称的窗函数(左右 window length 都为 1)
用某一列去表示某一个词的词向量,和他同时出现次数越多的词汇所在的位置的数就比较大,同时和他类似的数的表达也比较类似,比如你和我的表达是类似的。
操作:将共现矩阵行(列)作为词向量
缺点:
- 向量维数随着词典大小线性增长
- 存储整个词典的空间消耗非常大
- 一些模型如文本分类模型会面临稀疏性问题,有些单词会非常的密,有些单词会非常的稀疏,如 I 会很密,不常见的可能会很稀疏
- 模型会欠稳定
构造低维稠密向量作为词的分布式表示(25 - 1000 维)
最直接的想法:用 SVD 对共现矩阵向量做降维
X = U * S * V 用 U 这个矩阵去表示 X ,这个方法是把比较重要的特征提取出来表示,不重要的就不要了。
- 计算量随着语料库和词典增长膨胀增长得太快,对 X(n,n) 维的矩阵,计算量为 O(n^3),计算得比较慢
- 难以为词典中新加入的词分配词向量,加入一些词的话就要重新更新共现矩阵。
- 偏向传统基于规则的模型,与其他深度学习模型框架差异大
Skip-Gram模型:分为 3 层,输入层、投射层、输出层
模型的目标是让周围的四个词出现的概率比较高,其他的比较低,所以在这里只展示了周围最有可能的四个
CBOW模型 和 Skip-Gram 模型的大致思想是一致的:在单词训练好的前提下
(或者没有训练也行),输入一个单词去寻找其对应的 300 维的向量在投射层,是根据索引的,假设词典中总共有 5w 个词汇,投射层做的事情是提供了一个 5w * 300 的矩阵,每当输入一个词去投射层找对应的那个 300 维的向量,然后加一个 SoftMax 输出一个 5w 维的概率,这个 5 w 维的向量对应着一个概率,和正确的答案去做比较,然后去做优化。
例子:
输入矩阵,就是准备好一个 5w * 300 的矩阵,每个词对应一个 300 维的向量,当一个词进入时,去词表中找到它对应的词向量,先不考虑这个词向量是怎么训练出来的,输出矩阵:300 * 5w
有一个输入 embedding,有一个输出 embeding ,两个去做点乘,点乘的结果比较小就说明这两个词一起出现的概率比较小,这里之后需要做 softmax ,因为点乘的结果可能为负,
in(I) --> (0.2 1.4 -2.2 -4.5)
out(like) --> (1,2,-2,-1)
out(giraffe) --> (-1,-2,2,5)
模型特点:无隐层(隐藏层肯定是有激活函数的),投影层也可省略,每个词向量作为 log-linear 模型的输入
目标函数:预测周围几个词的概率和真实情况之间的差异,logx 中 x 越接近于 1,目标函数越大;损失函数是 -log ,损失函数越小越好
概率密度由 Softmax 给出,p = e(低维输入矩阵和输出矩阵的点乘) / 总的值
Skip-gram 这个浅层神经网络做的事是输入层去表示中心词的词向量,输出层去表示周围词的词向量,然后去做点乘,点乘的结果越大说明两个词一起出现的概率越大
一个正样本,V-1 个负样本,对负样本做采样
Skip-Gram 的损失函数有两项,一项是预测周围的几个词出现的概率,一项是预测所有词出现的概率,前面的越大越好,后面的越小越好,优化这个函数的时候第二项太大了,优化得会很慢,提出了一个新的观点,预测一个词是中心词周围词的概率的做法,
Skip-gram 这个模型的目的是为了得到比较好的词向量,并不是为了用中心词去预测周围可能出现的词,这是个假的任务。
公司 - CEO、词向、比较级和最高级
词类比任务、作为特征用于 CRF 实体识别(人名、地名)
去了解 gensim 这个工具库
一句话(词组合)出现的概率 P(w1,w2,w3…),或者说其合理性有多高
词序很重要,选词也很重要
P(I love you) > P(I you love)
P(I love you) > P(My love you)
P ( A , B ) = P ( A ) P ( B ∣ A ) P(A,B) = P(A)P(B|A) P(A,B)=P(A)P(B∣A) 条件概率 ,一句话的概率等于每一个词出现的条件概率的乘积,每一个词的概率等于前面若干个词的链式条件概率,两个词同时出现的频率是知道的,你要确定的是针对某一个词他的条件概率,当 n 过大时,计算量太大
每个单词只跟他之前的 n 个单词有关 (n = 1,2,…)
条件概率就是频率,例如:P(爱|我) = “我爱”出现的个数 / “我”出现的个数
用神经网络实现概率 p,循环神经网络(RNN)
每一步的参数 W 是固定的
当前隐状态包含了所有前面出现的单词信息