1.我们可以假设有300个不同的特征,这样的话就会有一列数字,新的特征表示的东西肯定比较难搞清楚,通常我们可以把这300维的数据嵌入到一个二维空间,这样就可以可视化了。常用的可视化算法是t-SNE算法,把这个空间映射到低维空间,可以画出一个2维图像然后观察,这就是术语嵌入的来源。
2.使用词嵌入做迁移学习:
从大量的文本集中学习词嵌入(大量的文本集,或者下载网上预训练好的词嵌入模型)
用这些词嵌入模型迁移到你的只有少量标注训练集的任务重,比如用这个300维的词嵌入来表示你的单词。
在新任务上训练模型时,可以选择要不要继续微调,用新的数据调整词嵌入(只有你标记的数据集很大你才会这样做)
3.词嵌入的特性:类比推理
当算法被问及man对woman相当于king对什么时,算法做的就是计算:
𝐹𝑖𝑛𝑑 𝑤𝑜𝑟𝑑 𝑤: 𝑎𝑟𝑔𝑚𝑎𝑥 𝑆𝑖𝑚(𝑒𝑤, 𝑒king − 𝑒man + 𝑒woman)
在使用t-SNE对300维数据进行降维到2维时,这个降维算法是以一种非常复杂的非线性方式进行映射,所以在2维空间中平行四边形的类比会失效。
余弦相似度:
其实就是计算向量U和向量V之间夹角的余弦,我们通过cos的图像可以知道,当两向量夹角为0时,余弦相似度是1,夹角是90度时,余弦相似度是0。所以,两向量之间的角度越小,这两个向量越相似
4.嵌入矩阵
假设词汇表有10000个单词,我们要做的就是学习一个嵌入矩阵E,这个嵌入矩阵是30010000的维度。假设其中一个词a是这个单词表中的第100个单词,那么它的one hot表示就是除了第100个位置为1其余都是0,拿这个嵌入矩阵E和这个One-hot表示相乘,我们得到的就是3001的一个向量,也就是嵌入矩阵E中第100个单词的向量表示,它就表示了这个词a(词嵌入的表示方法)
如果目标是要建立一个语言模型,那么一般选取目标词之前的几个词作为上下文,如果目标不是学习语言模型本身,那么可以选择其他的上下文。见下图:
学习语言模型-可以用这个target词前面的四个词
学习嵌入矩阵-可以用target词的前后四个词,可以用target前一个词,可以用target词附近的一个词
Word2vec
skip-gram:
抽取上下文和目标词配对,来构造一个监督学习问题。这个监督学习问题是:给定一个词作为上下文词,要求预测在这个词的一个正负窗口内选择目标词词。
给定一个词(上下文词),可以获取到它的one-hot表示Oorange,我们用嵌入矩阵E与这个Oorange相乘,得到向量Ec ,然后把它喂给softMax单元:
这个softmax的损失函数使用交叉熵表示。所以在这个问题中,嵌入矩阵E包含所有嵌入向量Ec的参数,softmax也有thelta的参数,优化这个损失函数会得到一个比较好的嵌入向量集。
问题:如果使用上面的softmax的计算方式,代价太大速度太慢,需要对词汇表的词进行求和运算。因此有一些解决方案:
①分级softmax(hierarchical softmax)这是一个树形的分类器,树上的每个节点都是一个二分类器。这种分类树的计算成本和词汇表大小的对数成正比。这种分类树并不是左右分支词数对称的树,而是把常用词放在顶部,不常用的词在树的更深处。
②负采样(negative sampling)
一旦选择了上下文c,问题就变成了在c的一个正负窗口内对目标词进行采样。那么怎么选择上下文c?如果对语料库进行均匀且随机的采样,会出现大量无意义的词,如:the,a,and等等。这会使得在上下文到目标词的映射会频繁的得到这些词,进而导致较为频繁的更新softmax中的e_c 。所以词p(c)的分布并不是在语料库上均匀且随机的采样得到的,而是采用了不同的分级来平衡更常见的词和不那么常见的词。
生成训练数据的方法:选择一个上下文词,在此基础上选择一个目标词,给这个pair一个标签1,然后再选择K次其他的词,将(上下文,其他词)的标签设置为0。(其中的K,小数据集中选择5-20,大数据中选择2-5)
这就变成了一个监督学习的模型,给定(c,t),预测输出的y是0还是1。可以定义一个逻辑回归模型。每一个正样本都有K个对应的负样本来训练一个类似于逻辑回归的模型。
假设输入词是orange(词6257),我们要做的就是输入one-hot向量,传递给嵌入矩阵E,两者相乘得到嵌入向量e_6257,就得到了10000个可能的逻辑回归的分类问题,但并不是每次迭代都训练全部的10000个,我们只训练其中的一个正样本和K个负样本,所以这个成本相比于开始的会变的很低。
那么如何选取负样本?根据论文作者Mikolov的经验,它们发现使用一下方式采样最好:
F(wi)是观测到的在语料库中的某个英文词的词频。通过3/4次方的计算,使其处于完全独立的分布和训练集的观测分布两个极端之间。
GloVe ????
CBOW适用于小型语料库,skip-gram适用于大型语料
5.情感分析
One-hot===>词嵌入===>对这一句的词嵌入取和或平均
取和或者平均实际上会把所有单词的意思平均起来,并未考虑词语出现的顺序,如果有not good这种表示,更不能理解真实的情感。解决方法可以用一个RNN:
6.序列模型和注意力机制
decoder网络和之前的那个语言模型非常相似,区别就是语言模型是从0向量开始预测输出的句子,而decoder是会在encoder网络计算出的表示输入的句子的条件下输出句子的翻译。
在机器翻译中,我们并不想得到的是随机的输出,也就是说并不是从得到的分布中进行随机取样,二是要找到一个y,使得p(y1,y2,….yt|x)的概率最大,解决这个问题最常用的就是beam search。为什么不用greedy search呢,因为贪心搜索是在选中第一个最有可能的词的基础上再去选择最有可能的第二个词,再去选最有可能的第三个词,但在机器翻译中,这种做法并不好。比如我们现在要翻译成的句子有两种方法:
he is visiting Africa in September
he is going to be visting Africa in September.
假设现在贪心搜索选中了前两个词"he is",那么在语料中,is going to 更常见,所以第二个句子可能概率会更高,但这个翻译并不好;此外,如果翻译有10个词这么长,词典中有10000个词,那么就要考虑10000的10次方这么多。
7.Beam Search
1.概念
集束搜索算法有一个参数B叫做集束宽,假设我们把B设为3。
第一步,将法语句子输入到encoder,然后进入decoder,softmax层会输出10000个概率值,得到这10000个概率值,取前三个存起来。
第二步,已经知道了作为第一个单词的最有可能的三个选择,然后针对这三个选择,把词汇中的所有单词列出来,按下图的式子列出来,再取最大的前三个。也就是说这一步就是评估3*10000个可能的结果。
重复执行,直到出现句尾终止符号。
2.改进集束搜索(长度归一化)
优化目标:
概率值都是小于1的,概率乘积连乘会造成数值下溢,因此在实践中,我们不会最大化这个连乘的形式,而是会对齐取个log,最大化这个取log之后的值。对于这个目标函数,如果有一个很长的句子,那么这个句子的概率会很低,就会倾向于选择一个比较短的句子作为最红的结果,因此我们可以把它归一化,通过除以翻译结果的单词数量,就是取每个单词的概率对数值的平均了,这样能减少对输出长的结果的惩罚。在实践中,相比于直接除以句子的单词总数,还可以在这个总数上加一个指数α。这个叫做归一化的对数似然目标函数。
3.B的选择:工业上常把束宽设到10,科研上经常设到1000或3000。
4.Beam search的误差分析
假设在dev集中,人工翻译和已完成的学习的翻译模型运行束搜索算法不一致时,怎么判断是模型的问题,还是beam search的问题?
人工翻译:jane visits Africa in September. *
模型翻译:jane visted Africa last September. ^
我们的seq2seq模型会计算P(y|x),所以我们用这个模型计算P(y|x)的概率和p(y^|x)的概率。
如果P(y|x)>p(y^|x) 那么就意味着y应该是可能的结果,但是beam search输出了y^,所以是beam search的问题。
如果P(y|x)<p(y^|x) 那么就意味着seq2seq模型出了问题。
8.BLEU得分
//www.greatytc.com/p/15c22fadcba5 这篇写的不错