《深入浅出Embedding--原理解析与应用实践》第一章 万物皆可嵌入--读书笔记

嵌入技术的应用:自然语言处理/传统的机器学习/搜索排序/推荐/知识图谱

Word Embedding 

Item Embedding

Graph Embedding

Categorical variables Embedding

单一静态---》动态

Word Embedding   ---》ELMo Transformer GPT BERT XLNet ALBERT 

1.1 处理序列问题的一般步骤

序列问题:自然语言处理、网页浏览、时间序列

如何处理序列问题?如何挖掘序列中隐含的规则和逻辑?

如何用NLP提炼出某新闻报道的语言材料的摘要信息?需要考虑哪些内容?涉及哪些步骤?先从哪一步开始?

清理工作(特殊符号、格式转换、过滤停用词)---》分词---》索引化---》模型/算法 单词、词等标识符向量化---》输出给下游任务

《深入浅出Embedding--原理解析与应用实践》第一章 万物皆可嵌入--读书笔记_第1张图片

 词嵌入或预训练模型很重要,他们的质量好坏直接影响下游任务的效果。

1.2 Word Embedding

机器无法直接接收单词、词语、字符等标识符(token),所以把标识符数值化一直是人们研究的内容。

整数---》独热编码(硬编码、稀疏,高维)---》向量或词嵌入(低维、稠密)通过学习得来

《深入浅出Embedding--原理解析与应用实践》第一章 万物皆可嵌入--读书笔记_第2张图片

词向量学习方法:

1.利用平台的embedding层学习词嵌入

在完成任务的同时学习词嵌入,例如,把embedding作为第一层,先随机初始化这些词向量,然后利用平台(Pytorch/TensorFlow等平台)不断学习(包括正向学习和反向学习),最后得到需要的词向量。

例子:

利用embedding的简单示例:

from torch import nn
import torch
import jieba
import numpy as np
raw_text = """越努力越幸运"""
# 利用jieba进行分词
words = list(jieba.cut(raw_text))
print(words)
# 对标识符去重,生成由索引:标识符构成的字典
word_to_ix = {i:word for i,word in enumerate(set(words))}
# 定义嵌入维度,并用正态分布,初始化词嵌入
# nn.Embedding模块输入的是一个标注的下标列表,输出的是对应的词嵌入
embeds = nn.Embedding(4,3)
print(embeds.weight[0])
# 获取字典的关键值
keys = word_to_ix.keys()
keys_list = list(keys)
# 把所有关键字构成的列表转换为张量
tensor_value = torch.LongTensor(keys_list)
# 把张量输入Embedding层,通过运算得到各标识符的词嵌入
embeds(tensor_value)

2.使用预训练的词嵌入

利用在较大语料上预训练好的词嵌入或预训练模型。把这些词嵌入加载到当前任务或者模型中。预训练模型:word2vec,ELMo,BERT,XLNet,ALBERT

1.2.2 CBOW模型

假设: 今天 下午  2点钟  搜索  引擎  组 开 组会。

方法1:根据上下文预测目标值

对于每一个单词或词(统称为标识符),使用该标识符周围的标识符来预测当前标识符生成的概率。假设目标值是“2点钟”,我们可以使用“2点钟”的上文“今天、下午”和“2点钟”的下文“搜索、引擎、组”来生成或预测目标值。----对应Word2vec中的CBOW模型(Continuous Bag-Of-Words Models)

输入层、映射层、输出层

w(t)目标词,在已知它的上下文w(t-2)、w(t-1)、w(t+1)、w(t+2)的前提下,预测词w(t)出现的概率,即p(w|context(w))

\begin{equation} \mathcal{L}=\sum_{w \in c} \log p(w \mid \operatorname{context}(w)) \end{equation}

多分类

朴素想法:用softmax来分别计算每个词对应的归一化概率。但对于动辄几十万词汇的场景,使用softmax计算量太大,此时可以使用一种称为二分类组合形式的Hierarchical Softmax(输出层为一颗二叉树)来优化。 

方法2:由目标值预测上下文

对于每一个标识符,使用该标识符本身来预测生成其他词汇的概率。如使用“2点钟”来预测其上下文“今天、下午、搜索、引擎、组”中的每个词。----对应Word2vec中的Skip-gram模型。

\begin{equation} \mathcal{L}=\sum_{w \in c} \log p(\operatorname{context}(w) \mid w) \end{equation}

如何生成数据集?首先对一些单词以及它们的上下文环境建立一个数据集。

可以以任何合理的方式定义“上下文”,这里是把目标单词的左右单词视作一个上下文,使用大小为1的窗口(即window_size=1)定义。

也就是说,仅选输入词前后各1词和输入词进行组合,就得到一个由(上下文,目标单词)组成的数据集。

1.2.4 可视化Skip-Gram模型实现过程

(公式没看懂,很生气,先不研究这一节了,之后有空参考:https://zhuanlan.zhihu.com/p/27234078再学习下)

1.2.5 Hierarchical Softmax优化

更新CBOW和Skip-Gram的参数,需要消耗大量资源。

word2vec使用了两种优化策略:Hierarchical Softmax和Negative Sampling。

通过优化,word2vec训练速度大大提升,词向量的质量也几乎没有下降,这也是Word2vec在NLP领域如此流行的原因。

Hierarchical Softmax最早是由Yoshua Bengio在2005年最早提出来的专门用于加速计算神经语言模型中的Softmax的一种方式。

HS的实质是基于哈夫曼树(一种二叉树,有空得研究下其原理)将计算量大的部分变成一种二分类问题。原来的模型在隐藏层之后通过W’连接输出层,经过HS优化后则去掉了W’,由隐藏层h直接与下面二叉树根节点相连:

其中,白色的叶子节点表示词汇表中的所有词(这里有V个),黑色节点表示非叶子节点,每一个叶子节点其实就是一个单词,且都对应唯一一条从根节点出发的路径。我们用n(w,j)表示从根节点到叶子节点w的路径上的第j个非叶子节点,并且每个非叶子节点都对应一个向量v,其维度与h(隐藏层)相同。

1.2.6 Negative Sampling优化

训练一个神经网络意味着要输入训练样本并不断调整神经元的权重,从而不断提高对目标预测的准确性。当训练样本很大时,所有这些权重需要通过数以亿计的训练样本来进行调整,这是非常消耗计算资源的。并且在实际训练过程中,速度会非常慢。

负采样,它可以提高训练速度并改善所得到的词向量的质量。不同于原本需要更新每个训练样本的所有权重的方法,负采样只需要每次更新一个训练样本的一小部分权重,从而在很大程度上降低了梯度过程中的计算量。

1.3 Item Embedding

只要有序列特征的场景应该都适合使用这种Embedding思想。

不同用户在一定时间内查询物品(Item)形成的序列图形,可以看出,物品形成的序列与词想成的序列(语句)有很多相似的地方。因此,人们把Word Embedding这种思想引入物品序列中,推广到推荐、搜索、广告等领域,并学习得到Item Embedding。

1.3.1 微软推荐系统使用Item Embedding

 Barkan O , Koenigstein N . Item2Vec: Neural Item Embedding for Collaborative Filtering[J]. 2016 IEEE 26th International Workshop on Machine Learning for Signal Processing (MLSP), 2016.

论文中:参照word embedding应用到推荐场景的相似度计算中的方法,把Item视为word。把用户的行为序列视为一个集合。通过把Word2vec的Skip-Gram和Negative Sampling(SGNS)的算法思路迁移到基于物品的协同过滤上,以物品的共现性作为自然语言中的上下文关系,构建神经网络并学习出物品在隐空间的向量表示,让使用效果得到较大提升。

你可能感兴趣的:(机器学习&深度学习,知识图谱,自然语言处理,机器学习)