双向lstm-crf源码的问题和细微修改

本文发现并修正了一个开源序列标注项目中的错误,该错误导致损失值异常下降至负数。通过对源代码深入分析,指出在状态转移计算部分的逻辑缺陷,并提出修改方案,使损失值回归合理范围。

别人的源码地址: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以下,符合理论和预期,这个修正对大样本的最终的正确率有没有影响我还没试过,有兴趣的可以试一下

转载于:https://www.cnblogs.com/tomsonsgs/p/7263412.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值