使用BiLSTM-CRF进行NER

推荐文章

强烈推荐这篇文章, 非常清楚: 简明条件随机场CRF介绍(附带纯Keras实现).

BiLSTM-CRF模型

论文参考

原理

Look-up层

以句子为单位, 将一个含有nn个字的句子记作:

x=(x1,,xn)x=(x_1,\cdots,x_n)

xix_i代表这这个字对应在字典中的ID. 使用训练好的embedding矩阵将句子中的每个字映射为embedding向量, 假设向量是dd维的, xiRd\boldsymbol x_{i}\in\mathbb R^{d}. 这就是整个网络的第一层, Look-up层. 可以在输入到下一层之前加入dropout层加强鲁棒性.

双向LSTM层

模型的第二层就是双向LSTM层, 用来自动提取句子特征. 将一个句子的各个字的char embedding序列(x1,x2,...,xn)(\boldsymbol x_{1},\boldsymbol x_{2},...,\boldsymbol x_{n})作为双向LSTM各个时间步的输入, 再将正向LSTM输出的隐状态序列(h1,h2,...,hn)(\overset{\longrightarrow}{\boldsymbol h_1},\overset{\longrightarrow}{\boldsymbol h_2},...,\overset{\longrightarrow}{\boldsymbol h_n})与反向LSTM的隐状态序列(h1,h2,...,hn)(\overset{\longleftarrow}{\boldsymbol h_1},\overset{\longleftarrow}{\boldsymbol h_2},...,\overset{\longleftarrow}{\boldsymbol h_n})在各个位置进行拼接ht=[ht;ht]Rm\boldsymbol h_{t}=[\overset{\longrightarrow}{\boldsymbol h_t};\overset{\longleftarrow}{\boldsymbol h_t}]\in\mathbb R^{m}, 得到完整的隐状态序列:

(h1,h2,...,hn)Rn×m({\boldsymbol h_1},{\boldsymbol h_2},...,{\boldsymbol h_n})\in\mathbb R^{n\times m}

传入到dropout层后, 接入一个线性层, 将隐状态向量从mm维映射到kk维, kk标注集的标签数. 这个线性层, 对每个时间片单独作用(Time Distribute), 并且所有时间片使用的参数是一样的, 经过这一步后得到:

P=(p1,p2,...,pn)Rn×kP=({\boldsymbol p_1},{\boldsymbol p_2},...,{\boldsymbol p_n})\in\mathbb R^{n\times k}

可以把piRk\boldsymbol p_i\in\mathbb R^{k}中的每一维pijp_{ij}都视为字xix_{i}对第jj标签的得分(非标准概率).

这个线性层类似于softmax层, 但只是算出了每类的数值, 并没有做softmax函数作用, 也没有判定分类. 而是输入到下一层中继续使用.

CRF层

CRF层进行句子级的序列标注.

CRF层的参数是一个(k+2)×(k+2)(k+2)\times (k+2)的矩阵, 记为AA, AijA_{ij}表示的是第ii个标签到第jj个标签的转移得分, 进而在为一个位置进行标注的时候可以利用此前已经标注过的标签. 之所以要加2是因为要为句子首部添加一个起始状态以及为句子尾部添加一个终止状态.

标签序列y=(y1,y2,...,yn)y=(y_1,y_2,...,y_n), 模型对于句子xx的标签yy的总分数等于各个位置的打分之和:

score(x,y)=i=1nPi,yi+i=1n+1Ayi1,yiscore(x,y)=\sum\limits_{i=1}^{n}P_{i,y_{i}}+\sum\limits_{i=1}^{n+1}A_{y_{i-1},y_{i}}

每个位置的打分由两部分得到一部分是由LSTM输出的pi\boldsymbol p_i决定, 另一部分则由CRF的转移矩阵AA决定. 进而可以利用Softmax得到归一化后的概率:

P(yx)=exp(score(x,y))yexp(score(x,y))P(y|x)=\frac{\exp(score(x,y))}{\sum\limits_{y'}\exp(score(x,y'))}

模型通过对数似然函数最大化求解得到. 对一个训练样本(x,yx)(x,y_{x}), 对数似然为:

logP(yxx)=score(x,yx)log(yexp(score(x,y)))\log P(y_{x}|x)=score(x,y_{x})-\log(\sum_{y'}\exp(score(x,y')))

预测

模型在预测过程解码时使用动态规划的Viterbi算法来求解最优路径.

y=argmaxyscore(x,y)y^{*}=\arg\max_{y'}score(x,y')

整体结构

整个模型的结构如下图所示:

参考资料

论文:

解析:

代码:

最后更新于