推荐文章
强烈推荐这篇文章, 非常清楚: 简明条件随机场CRF介绍(附带纯Keras实现).
BiLSTM-CRF模型
论文参考
原理
Look-up层
以句子为单位, 将一个含有n个字的句子记作:
x=(x1,⋯,xn)
xi代表这这个字对应在字典中的ID. 使用训练好的embedding矩阵将句子中的每个字映射为embedding向量, 假设向量是d维的, xi∈Rd. 这就是整个网络的第一层, Look-up层. 可以在输入到下一层之前加入dropout
层加强鲁棒性.
双向LSTM层
模型的第二层就是双向LSTM层, 用来自动提取句子特征. 将一个句子的各个字的char embedding序列(x1,x2,...,xn)作为双向LSTM各个时间步的输入, 再将正向LSTM输出的隐状态序列(h1⟶,h2⟶,...,hn⟶)与反向LSTM的隐状态序列(h1⟵,h2⟵,...,hn⟵)在各个位置进行拼接ht=[ht⟶;ht⟵]∈Rm, 得到完整的隐状态序列:
(h1,h2,...,hn)∈Rn×m
传入到dropout
层后, 接入一个线性层, 将隐状态向量从m维映射到k维, k是标注集的标签数. 这个线性层, 对每个时间片单独作用(Time Distribute), 并且所有时间片使用的参数是一样的, 经过这一步后得到:
P=(p1,p2,...,pn)∈Rn×k
可以把pi∈Rk中的每一维pij都视为字xi对第j个标签的得分(非标准概率).
这个线性层类似于softmax层, 但只是算出了每类的数值, 并没有做softmax函数作用, 也没有判定分类. 而是输入到下一层中继续使用.
CRF层
CRF层进行句子级的序列标注.
CRF层的参数是一个(k+2)×(k+2)的矩阵, 记为A, Aij表示的是第i个标签到第j个标签的转移得分, 进而在为一个位置进行标注的时候可以利用此前已经标注过的标签. 之所以要加2是因为要为句子首部添加一个起始状态以及为句子尾部添加一个终止状态.
标签序列y=(y1,y2,...,yn), 模型对于句子x的标签y的总分数等于各个位置的打分之和:
score(x,y)=i=1∑nPi,yi+i=1∑n+1Ayi−1,yi
每个位置的打分由两部分得到一部分是由LSTM输出的pi决定, 另一部分则由CRF的转移矩阵A决定. 进而可以利用Softmax得到归一化后的概率:
P(y∣x)=y′∑exp(score(x,y′))exp(score(x,y))
模型通过对数似然函数最大化求解得到. 对一个训练样本(x,yx), 对数似然为:
logP(yx∣x)=score(x,yx)−log(∑y′exp(score(x,y′)))
预测
模型在预测过程解码时使用动态规划的Viterbi算法来求解最优路径.
y∗=argmaxy′score(x,y′)
整体结构
整个模型的结构如下图所示:
参考资料
论文:
解析:
代码: