最后更新于
最后更新于
强烈推荐这篇文章, 非常清楚: .
以句子为单位, 将一个含有个字的句子记作:
代表这这个字对应在字典中的ID. 使用训练好的embedding矩阵将句子中的每个字映射为embedding向量, 假设向量是维的, . 这就是整个网络的第一层, Look-up层. 可以在输入到下一层之前加入dropout
层加强鲁棒性.
模型的第二层就是双向LSTM层, 用来自动提取句子特征. 将一个句子的各个字的char embedding序列作为双向LSTM各个时间步的输入, 再将正向LSTM输出的隐状态序列与反向LSTM的隐状态序列在各个位置进行拼接, 得到完整的隐状态序列:
这个线性层类似于softmax层, 但只是算出了每类的数值, 并没有做softmax函数作用, 也没有判定分类. 而是输入到下一层中继续使用.
CRF层进行句子级的序列标注.
模型在预测过程解码时使用动态规划的Viterbi算法来求解最优路径.
整个模型的结构如下图所示:
论文:
解析:
代码:
传入到dropout
层后, 接入一个线性层, 将隐状态向量从维映射到维, 是标注集的标签数. 这个线性层, 对每个时间片单独作用(Time Distribute), 并且所有时间片使用的参数是一样的, 经过这一步后得到:
可以把中的每一维都视为字对第个标签的得分(非标准概率).
CRF层的参数是一个的矩阵, 记为, 表示的是第个标签到第个标签的转移得分, 进而在为一个位置进行标注的时候可以利用此前已经标注过的标签. 之所以要加2是因为要为句子首部添加一个起始状态以及为句子尾部添加一个终止状态.
标签序列, 模型对于句子的标签的总分数等于各个位置的打分之和:
每个位置的打分由两部分得到一部分是由LSTM输出的决定, 另一部分则由CRF的转移矩阵决定. 进而可以利用Softmax得到归一化后的概率:
模型通过对数似然函数最大化求解得到. 对一个训练样本, 对数似然为:
, 简单的中文NER例子
, 使用BERT进行BER任务, 中文