别人的源码地址:https://github.com/chilynn/sequence-labeling/
如果你训练就会发现loss降到0以下,按照他设定的目标函数,loss理论上应该是大于0的,仔细详细读源代码后,发现了问题所在(helper.py中):
def getTransition(y_train_batch): transition_batch = [] for m in range(len(y_train_batch)): y = [5] + list(y_train_batch[m]) + [0] for t in range(len(y)): if t + 1 == len(y): continue i = y[t] j = y[t + 1] if i == 0: #改为j==0 break transition_batch.append(i * 6 + j) transition_batch = np.array(transition_batch) return transition_batch
源码中标红的地方应该改成 j==0 ,因为用i==0会让目标路径多加了一个最后一个字母到填充符的转移量,而计算整体路径得分只计算到最后一个字母自身得分没有加之后的转移得分,所以改后的loss最终降到0(int类型显示的其实稍微大于0),没有降到0以下,符合理论和预期,这个修正对大样本的最终的正确率有没有影响我还没试过,有兴趣的可以试一下