学习思路
BiLSTM + CRF
本文建立在读者已有一定深度学习知识的基础上,可以看看pytorch实现验证码图片识别,基本的反向传播思想,以及机器学习的相关概念(损失函数、随机梯度下降、训练集测试集等等)。
LSTM看这一篇就够了。
接下来给出我学习CRF的思路
- 看这篇的Section1,2,3,了解基本的朴素贝叶斯和最大熵模型,我个人觉得这篇CRF的部分讲得不清楚
- 看这篇全部,了解CRF的特征向量、CRF建模的对象、对数极大似然函数以及CRF的损失函数、以及viterbi解码(decode)和迭代计算所有路径分数的思想
- 再对照这篇博客看pytorch官网BiLSTM+CRF教程中对CRF的路径分数等的定义,初步实现模型
- 最后,基于这篇博客实现简化版模型,但我觉得这篇博客没搞清楚特征向量和分数的关系,所以只要看迭代计算那里就行
Requirements
- python==3.7.6,
- torch==1.4.0+cu92
- 安装环境可以参考这篇博客
运行结果
随便编了3个句子,用前两句训练100轮后预测第三句,结果如下:
可以看到效果还是不错的。
源代码
import torch
import torch.autograd as autograd
import torch.nn as nn
import torch.optim as optim
from utils import prepare_sequence
def prepare_sequence(seq, to_ix):
idxs = [to_ix[w] for w in seq]
return torch.tensor(idxs, dtype=torch.long)
class BiLSTM_CRF(nn.Module):
def __init__(self, vocab_size, tag_to_ix, embedding_dim, hidden_dim):
super().__init__()
self.embedding_dim = embedding_dim
self.hidden_dim = hidden_dim
self.vocab_size = vocab_size
self.tag_to_ix = tag_to_ix
self.tagset_size = len(tag_to_ix)
self.word_embeds = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim // 2,
num_layers=1, bidirectional=True)
self.hidden2tag = nn.Linear(hidden_dim, self.tagset_size)
self.transitions = nn.Parameter(
torch.randn(self.tagset_size, self.tagset_size))
# never transfer to the start tag and never transfer from stop tag
self.transitions.data[tag_to_ix[START_TAG], :]