sp5.2 NLP
之前用词库然后一直one-hot表示单词
这样会使得算法泛化性不强 即使知道第一空怎么填了 第二个空还是不知道
因为从one-hot这种编码方式还是不知道橘子和苹果的关系 任何两个内积都是0 这些词向量距离都一样
换种方式表示词
词嵌入(Word Embedding)嵌入就是把每个词变成一个点 嵌入到高维空间了
是NLP中语言模型与表征学习技术的统称,概念上而言,它是指把一个维数为所有词的数量的高维空间(one-hot形式表示的词)“嵌入”到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。
理想情况下面这样的
如果学习到了上面的表达了话 原本300维 降低维度到二维的话 会发现 相似的距离很近
使用2008年van der Maaten和Hinton在论文[Visualizing Data using t-SNE]中提出的t-SNE数据可视化算法,将词嵌入后获得的一些词向量进行非线性降维,可到下面的映射结果:
在NLP中使用词嵌入
对大量词汇进行词嵌入后获得的词向量,可用来完成命名实体识别(Named Entity Recognition)等任务。其中可充分结合迁移学习,以降低学习成本,提高效率。
对于人名识别 下面这个例子 我们之所以知道这是个人名不是公司名
前提都是知道了这些词汇的关系 比如知道了farmer是个和人接近的词
如果是个生词 比如durian榴莲 甚至没有这个词在训练集里 可以提前使用公开的词库 提前训练好词向量
比如上面的榴莲问题 可以先学大量的词库 从网上
把他们迁移到你的训练集中 比如300维特征表示一个词 比以前1万维的one-hot还好算
可选 自己可以微调词向量 通过新数据
和人脸识别有点像 之前卷积也是想如何给一个图编码 然后算两者之间的差别
区别是卷积会识别不同人脸 对新的没见过图像也进行编码 用最后一个向量 表示这个图片
学习词嵌入 因为是固定的比如1W词 学习固定的编码 对于新的词我们只能标记没见过
词嵌入的应用 实现词之间的类比
让两个词向量进行相减 如果两个词汇接近 每一项都接近0
man - woman 和 queen - king 接近 都只在性别这一特征差别大
算法实现:实现单词类比
t-sne是非线性的 构不成平行四边形
别忘了左图是300维的 不是平面的 woman和queen实际不再一个面上
把式子移项 最大化这个式子 就可以找到与king最接近的点ew
就好比人家问女人对于男人 那么国王对应 什么
t-sne方法就是把高维映射平面上
对于上面相似度函数 并不是两者直接减 uv内积 其实是uv夹角的
余弦值cos 来判断相似度 偶尔也用欧氏距离 差的平方
注意看第三个 他们两组是相反的 一个是 法国巴黎 一个是罗马意大利
而且他们两组 是先 每组做个减法 然后 再做个cosine
注意是这样算的 两两之间 A对于B 相当于C对于谁:
不是直接cosinAB和cosineC X相比较
是先A-B C-X 然后两者做个cosine
学习词嵌入:下面几种算法
词嵌入的方法包括人工神经网络、对词语同现矩阵降维、概率模型以及单词所在上下文的显式表示等。
词汇以one-hot形式作为输入,不同的词嵌入方法能以不同的方式学习到一个嵌入矩阵(Embedding Matrix),最后输出某个词的词向量。
将字典中位置为i的词以one-hot形式表示为oi,嵌入矩阵用E表示,词嵌入后生成的词向量用ei表示,则三者存在数学关系:
嵌入矩阵E * One-hot编码的这个词= ei 把这个词从嵌入阵中这列取出来
假设词典按列的 像学习一个300维度的词嵌入矩阵 o_num表示单词的one-hot
假设嵌入阵称为E 那么 E * O6257‘橘子’这个one-hot向量 乘完之后 其实就是个查表过程 因为 一列只有一个1
E 300*10000 * O 10000*1 =300*1 其实就是相当于在嵌入阵中查表 把第6257这一列取出来了 用矩阵乘法效率太慢 用一个专门的函数 取这一列
用小e6257表示E嵌入阵 6257这个词的词向量
如何学习词嵌入矩阵:
采用神经网络建立语言模型是学习词嵌入的有效方法之一。2003年Bengio等人的经典之作[A Neural Probabilistic Language Model]中,提出的神经概率语言模型,是早期最成功的词嵌入方法之一。
模型中,构建了了一个能够通过上下文来预测未知词的神经网络,在训练这个语言模型的同时学习词嵌入。
一句话来说就是 通过训练好一个预测上下文单词的模型
最终目的是要中间的隐藏层充当词向量
对于句子预测缺失单词
一句话每个单词 one-hot表示 然后乘上嵌入阵 这里嵌入阵是个随机生成参数矩阵
取出来 词向量 一起放入神经网络做个运算 然后softmax 看哪个词概率最大
300* 10000 * 10000*1=300*1 的 6个单词 竖着放 当神经网络的输入 6*300维=1800维
这里取一句话中的几个单词 也是一个参数
嵌入阵E与w、b一样,都是参数啊,目标就是要这个嵌入阵 通过不断迭代。训练过程中取语料库中的某些词作为目标词,以目标词的部分上下文作为输入,训练网络输出的预测结果为目标词。得到了嵌入矩阵,就能通过前面所述的数学关系式求得词嵌入后的词向量。
通过上下文预测目标单词 这里上下文如何选 决定模型复杂度
word2vec方法 最后一步 用哈夫曼树
我们要做的是抽取上下文 目标词 进行配对
随机选一个词作为上下文 比如orange 然后一定范围内 选取 目标词 这样就有了几对 监督学习
模型细节: (contest,target)正好属性与标签 监督学习
softmax 原本就是概率 e的指数 这里多了个Θ当参数而已
这里之前的pair对 target词 当做真实标签 来算loss 交叉熵
最大的问题在于从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值
缺点softmax算概率 分母在词汇表很大的时候 每次迭代一万个数求和 很可怕
利用用右边的hierarchical softmax分类器算概率 但一般不会是平衡的树
常用词在上层 不常用的词在下层
如何对上下文C采样 随机采样的话 会发现很多 the of a的无用词 用不同的启发式函数来
负采样 也是skip的一种方式 更加快速一点:可以更大的词汇表
从句子中采样完这是真实的1 再从整个词典中随机取样0 负采样
构造一个新的监督学习问题
给定一对单词 在句子里上下文 这是否是一对正样本 输出1正样本 0负样本 这个01就是标签了现在
在词库里随便选目标词 这一对就是负样本 比如在词库里选了K个 形成K对 负样本 即使选到的词 出现在上下文里 也无所谓 K一般5-20
之前是softmax 输出预测 每个词的概率 计算成本太高
现在逻辑回归 二元分类的 sigmoid 也就是1:k正负样本比例
还是one-hot 从嵌入阵 取出词向量 e 输出还是一万维的 01
每次迭代等于就算了5个 只算k+1个单元 因为是sigmoid来算概率相当于 而之前softmax每次要1万个 才知道他的概率
如何选取负采样样本 根据在语料库中的频率 会导致of a the 这类出现次数多
用下面的函数从语料库中选词比较好 词频的3/4次方 除以 所有词频3/4次方之和
GloVe模型
Xij 就是单词 i 出现在单词J 上下文中的频率 比如遍历数据集 求出来
这里 i有点像target j就是上下文c
因为是一对的所以两个for循环 相当应与一个矩阵 横竖都是词库
分析下式子:
Xij 要是0的话 就是无穷大啊 要是1 就是0 我们 最小化这个数 f(xij)是个加权项 不想干就0
Θi * ej就是这俩词的词向量相乘吧 减去 Xij这俩词一同出现的频率 这里不是概率啊 是次数
这俩词接近Θ*e就大 俩词出现次数Xij 注意是次数啊 log次数
log0是负无穷大 前面乘个f(xij) 0就是0 0*log0=0方便算 防止这种情况发生 bi bj就是偏置项
————————————————————————————————
句子情感分类:问题是没有那么多有标注的J句子 但是可以应用词嵌入
但是这样有标签的的太少了 当少的时候用词嵌入
用学习过的词向量 把他们求和平均 因为都是300维的假设 然后送到神经网络 softmax一到五星
缺点没考虑词序 像是把整个句子的单词给平均了 忽略了词序会误判
比如good出现很多次 其实是lack good
直接求个平均 丢到模型
更复杂的模型:比如用RNN LSTM等 这里就考虑顺序了 这是个多对一的例子
还是词向量输入进去 一直传 然后softmax 输出一到五星
minibatch的话这里需要填充的 每句话得长度一样
————————————————————————————
消除偏见 :比如性别 种族 歧视
假设已经学完了词嵌入
1 识别想要消除偏见的趋势:比如对于性别 找出一对相反的 求平均 SVU奇异值分解
2中和步 对于不明确的词 doctor babysister 种族啊性别啊 不明确的次与 在轴上减少他们水平轴上距离
3均衡步 原本祖父母和babysiste距离是不一样的 但是人为把这俩词移动一些

浙公网安备 33010602011771号