今天主要参考https://blog.csdn.net/jiaowoshouzi/article/details/89073944这篇文章学习。
nlp基本任务
nlp大致可分为三个模块,数据集建立和预处理;文本嵌入;根据嵌入向量训练模型。其中二三点可能在有些场景中比较模糊,如可能文本嵌入后就能得到目标结果。
语言模型:对于文本Si,求P(Si) –> 拆词得到P(Si)=P(x0,x1,…,xn)=P(x0)P(x1|x0)…P(xn|xn-1,xn-2,…,x1) –> 假设只与前k个词相关,若n=1,P(Si)=P(x0)P(x1|x0)…P(xn|xn-1), P(xi+1|xi)=c(xi+1,xi)/c(xi)。 问题:稀疏,n取大将造成维度爆炸
NNLM
2003年提出的方法,将模型第一层参数作为词的分布式表征 输入:长度为n的文本序列
目标: 即用前t-1个词预测第t个词
前向传播过程: 1.通过|V|*m维矩阵C将每个词映射为特征向量,用C(i)表示。然后将C(wt-1)…C(wt-n+1)合并成(n-1)m维的向量,V是词典。 2.该模型有一个隐藏层,上一步得到的向量x进入隐藏层处理得到:tanh(d+Hx),最后再到输出层并用softmax层得到每个词出现的概率:y=b+Utanh(d+Hx) 3.输入层也可直接与输出层连接,更新表达式为y=b+Wx+Utanh(d+Hx)
反向传播过程易得
WORD2VEC
word2vec实际是一个工具包,使用CBOW和skip-gram模型,并加入一些优化方法如Hierarchical softmax,负采样,subsampling。
CBOW: 输入:某一特征层上下文相关的词对应的词向量,通常使用one-hot编码对每个词编码,然后将所有词向量取均值。 输出:这个词的词向量,当然模型实际输出是所有词的softmax概率 向前传播过程: 输入和|V|*m维的矩阵相乘得到m维向量表示,m维向量再与m|V|维矩阵相乘得到每个特征词的概率。输入与中间层之间无激活层,输出要激活为softmax概率。而输入层的权值矩阵每一行即代表每一个词向量。中间层即是输入词语的词向量 反向传播易得
skip-gram:反过程 输入:某一词向量 输出:上下文词语概率排名,根据真正上下文之间误差做反向传播。使用中间层与输出层之间权值作为词向量表示
优化:Hierachical softmax:将词典V编码为哈夫曼树来降低维度,具体过程需要用的时候再看
其他词嵌入方法:GloVe fastText需要用的时候再看
意义:使用word2vec进行预训练,将得到的词向量再放入其他模型中训练,无需标注,且带来效果提升。是一种迁移学习。
RNN与seq2seq
RNN基本思想:每个时间节点可以看成一个MLP,参数共享,按时间顺序滑动处理每个单词。MLP有三层结构:输入层,隐藏层,输出层。输出层可以不要。隐藏层表征当前状态,状态会更新到下一个时间的MLP,从而使模型学习上下文信息 具体更新过程: ht-1是上一个时间的状态,第一个时间默认状态为全0
seq2seq:编码器解码器结构,两者各是一个简单RNN encoder所有输入编码成一个context(最后一个状态),其作为语义向量(作为decoder的输入),由decoder解码(开始状态还是全0)。 但context长度限制性能,导致语义信息不能完全表达,故引入attention机制:利用encoder的隐藏层状态ht代表输入xt的语义信息。decoder时,t=1时,c1=h1w11+h2w12+h3*w13。将c1和状态h0拼接成新的向量输入到隐藏层。w形成了不同输入对应h的注意力。每一个c1,c2,…,cn可以有选择性的吸收不同h的语义信息。
今天看到这里有点晕了,去装joern了,明天继续看attention机制。
|