0


人工智能(pytorch)搭建模型8-利用pytorch搭建一个BiLSTM+CRF模型,实现简单的命名实体识别

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型8-利用pytorch搭建一个BiLSTM+CRF模型,实现简单的命名实体识别,BiLSTM+CRF 模型是一种常用的序列标注算法,可用于词性标注、分词、命名实体识别等任务。本文利用pytorch搭建一个BiLSTM+CRF模型,并给出数据样例,通过一个简单的命名实体识别(NER)任务来演示模型的训练和预测过程。文章将分为以下几个部分:

1. BiLSTM+CRF模型的介绍
2. BiLSTM+CRF模型的数学原理
3. 数据准备
4. 模型搭建
5. 训练与评估
6. 预测
7. 总结

1. BiLSTM+CRF模型的介绍

BiLSTM+CRF模型结合了双向长短时记忆网络(BiLSTM)和条件随机场(CRF)两种技术。BiLSTM用于捕捉序列中的上下文信息,而CRF用于解决标签之间的依赖关系。实际上,BiLSTM用于为每个输入序列生成一个特征向量,然后将这些特征向量输入到CRF层,以便为序列中的每个元素分配一个标签。BiLSTM 和 CRF 结合在一起,使模型即可以像 CRF 一样考虑序列前后之间的关联性,又可以拥有 LSTM 的特征抽取及拟合能力。

2.BiLSTM+CRF模型的数学原理

假设我们有一个序列

  1. x
  2. =
  3. (
  4. x
  5. 1
  6. ,
  7. x
  8. 2
  9. ,
  10. .
  11. .
  12. .
  13. ,
  14. x
  15. n
  16. )
  17. \boldsymbol{x} = (x_1, x_2, ..., x_n)
  18. x=(x1​,x2​,...,xn​),其中
  19. x
  20. i
  21. x_i
  22. xi 是第
  23. i
  24. i
  25. i 个位置的输入特征。我们要对每个位置进行标注,即为每个位置
  26. i
  27. i
  28. i 预测一个标签
  29. y
  30. i
  31. y_i
  32. yi​。标签集合为
  33. Y
  34. =
  35. y
  36. 1
  37. ,
  38. y
  39. 2
  40. ,
  41. .
  42. .
  43. .
  44. ,
  45. y
  46. n
  47. \mathcal{Y}={y_1, y_2, ..., y_n}
  48. Y=y1​,y2​,...,yn​,其中
  49. y
  50. i
  51. L
  52. y_i \in \mathcal{L}
  53. yi​∈L
  54. L
  55. \mathcal{L}
  56. L 表示标签的类别集合。

BiLSTM用于从输入序列中提取特征,它由两个方向的LSTM组成,分别从前向后和从后向前处理输入序列。在时间步

  1. t
  2. t
  3. tBiLSTM的输出为
  4. h
  5. t
  6. R
  7. 2
  8. d
  9. h_t \in \mathbb{R}^{2d}
  10. ht​∈R2d,其中
  11. d
  12. d
  13. d LSTM的隐藏状态维度。具体来说,前向LSTM从左至右处理输入序列
  14. x
  15. \boldsymbol{x}
  16. x,输出隐状态序列
  17. h
  18. =
  19. (
  20. h
  21. 1
  22. ,
  23. h
  24. 2
  25. ,
  26. .
  27. .
  28. .
  29. ,
  30. h
  31. n
  32. )
  33. \overrightarrow{h}=(\overrightarrow{h_1},\overrightarrow{h_2},...,\overrightarrow{h_n})
  34. h=(h1​​,h2​​,...,hn​​),其中
  35. h
  36. t
  37. \overrightarrow{h_t}
  38. ht​​ 表示在时间步
  39. t
  40. t
  41. t 时前向LSTM的隐藏状态;后向LSTM从右至左处理输入序列
  42. x
  43. \boldsymbol{x}
  44. x,输出隐状态序列
  45. h
  46. =
  47. (
  48. h
  49. 1
  50. ,
  51. h
  52. 2
  53. ,
  54. .
  55. .
  56. .
  57. ,
  58. h
  59. n
  60. )
  61. \overleftarrow{h}=(\overleftarrow{h_1},\overleftarrow{h_2},...,\overleftarrow{h_n})
  62. h=(h1​​,h2​​,...,hn​​),其中
  63. h
  64. t
  65. \overleftarrow{h_t}
  66. ht​​ 表示在时间步
  67. t
  68. t
  69. t 时后向LSTM的隐藏状态。则每个位置
  70. i
  71. i
  72. i 的特征表示为
  73. h
  74. i
  75. =
  76. [
  77. h
  78. i
  79. ;
  80. h
  81. i
  82. ]
  83. h_i=[\overrightarrow{h_i};\overleftarrow{h_i}]
  84. hi​=[hi​​;hi​​],其中
  85. [
  86. ;
  87. ]
  88. [\cdot;\cdot]
  89. [⋅;⋅] 表示向量拼接操作。

CRF用于建模标签之间的关系,并进行全局优化。CRF模型定义了一个由

  1. Y
  2. \mathcal{Y}
  3. Y 构成的联合分布
  4. P
  5. (
  6. y
  7. x
  8. )
  9. P(\boldsymbol{y}|\boldsymbol{x})
  10. P(yx),其中
  11. y
  12. =
  13. (
  14. y
  15. 1
  16. ,
  17. y
  18. 2
  19. ,
  20. .
  21. .
  22. .
  23. ,
  24. y
  25. n
  26. )
  27. \boldsymbol{y} = (y_1, y_2, ..., y_n)
  28. y=(y1​,y2​,...,yn​) 表示标签序列。具体来说,CRF模型将标签序列的概率分解为多个位置的条件概率的乘积,即
  29. P
  30. (
  31. y
  32. x
  33. )
  34. =
  35. i
  36. =
  37. 1
  38. n
  39. ψ
  40. i
  41. (
  42. y
  43. i
  44. x
  45. )
  46. i
  47. =
  48. 1
  49. n
  50. 1
  51. ψ
  52. i
  53. ,
  54. i
  55. +
  56. 1
  57. (
  58. y
  59. i
  60. ,
  61. y
  62. i
  63. +
  64. 1
  65. x
  66. )
  67. P(\boldsymbol{y}|\boldsymbol{x})=\prod_{i=1}^{n}\psi_i(y_i|\boldsymbol{x}) \prod_{i=1}^{n-1}\psi_{i,i+1}(y_i,y_{i+1}|\boldsymbol{x})
  68. P(yx)=i=1n​ψi​(yi​∣x)i=1n1​ψi,i+1​(yi​,yi+1​∣x)

其中

  1. ψ
  2. i
  3. (
  4. y
  5. i
  6. x
  7. )
  8. \psi_i(y_i|\boldsymbol{x})
  9. ψi​(yi​∣x) 表示在位置
  10. i
  11. i
  12. i 时预测标签为
  13. y
  14. i
  15. y_i
  16. yi 的条件概率,
  17. ψ
  18. i
  19. ,
  20. i
  21. +
  22. 1
  23. (
  24. y
  25. i
  26. ,
  27. y
  28. i
  29. +
  30. 1
  31. x
  32. )
  33. \psi_{i,i+1}(y_i,y_{i+1}|\boldsymbol{x})
  34. ψi,i+1​(yi​,yi+1​∣x) 表示预测标签为
  35. y
  36. i
  37. y_i
  38. yi
  39. y
  40. i
  41. +
  42. 1
  43. y_{i+1}
  44. yi+1 的联合概率。这些条件概率和联合概率可以用神经网络来建模,其中输入为位置
  45. i
  46. i
  47. i 的特征表示
  48. h
  49. i
  50. h_i
  51. hi​。

CRF模型的全局优化问题可以通过对数似然函数最大化来实现,即

  1. max
  2. y
  3. log
  4. P
  5. (
  6. y
  7. x
  8. )
  9. =
  10. i
  11. =
  12. 1
  13. n
  14. log
  15. ψ
  16. i
  17. (
  18. y
  19. i
  20. x
  21. )
  22. i
  23. =
  24. 1
  25. n
  26. 1
  27. log
  28. ψ
  29. i
  30. ,
  31. i
  32. +
  33. 1
  34. (
  35. y
  36. i
  37. ,
  38. y
  39. i
  40. +
  41. 1
  42. x
  43. )
  44. \max_{\boldsymbol{y}}\log P(\boldsymbol{y}|\boldsymbol{x}) = \sum_{i=1}^{n}\log\psi_i(y_i|\boldsymbol{x}) \sum_{i=1}^{n-1}\log\psi_{i,i+1}(y_i,y_{i+1}|\boldsymbol{x})
  45. ymaxlogP(yx)=i=1nlogψi​(yi​∣x)i=1n1logψi,i+1​(yi​,yi+1​∣x)

其中

  1. y
  2. \boldsymbol{y}
  3. y 是所有可能的标签序列。可以使用动态规划算法(如维特比算法)来求解全局最优标签序列。

综上所述,BiLSTM+CRF模型的数学原理可以表示为:

  1. P
  2. (
  3. y
  4. x
  5. )
  6. =
  7. i
  8. =
  9. 1
  10. n
  11. ψ
  12. i
  13. (
  14. y
  15. i
  16. x
  17. )
  18. i
  19. =
  20. 1
  21. n
  22. 1
  23. ψ
  24. i
  25. ,
  26. i
  27. +
  28. 1
  29. (
  30. y
  31. i
  32. ,
  33. y
  34. i
  35. +
  36. 1
  37. x
  38. )
  39. P(\boldsymbol{y}|\boldsymbol{x}) = \prod_{i=1}^{n}\psi_i(y_i|\boldsymbol{x}) \prod_{i=1}^{n-1}\psi_{i,i+1}(y_i,y_{i+1}|\boldsymbol{x})
  40. P(yx)=i=1n​ψi​(yi​∣x)i=1n1​ψi,i+1​(yi​,yi+1​∣x)

其中

  1. ψ
  2. i
  3. (
  4. y
  5. i
  6. x
  7. )
  8. =
  9. exp
  10. (
  11. W
  12. o
  13. T
  14. h
  15. i
  16. +
  17. b
  18. o
  19. T
  20. y
  21. i
  22. )
  23. y
  24. i
  25. L
  26. exp
  27. (
  28. W
  29. o
  30. T
  31. h
  32. i
  33. +
  34. b
  35. o
  36. T
  37. y
  38. i
  39. )
  40. \psi_i(y_i|\boldsymbol{x}) = \frac{\exp(\boldsymbol{W}_o^{T}\boldsymbol{h}_i + \boldsymbol{b}_o^{T}\boldsymbol{y}i)}{\sum{y_i'\in\mathcal{L}}\exp(\boldsymbol{W}_o^{T}\boldsymbol{h}_i + \boldsymbol{b}_o^{T}\boldsymbol{y}_i')}
  41. ψi​(yi​∣x)=∑yi′​∈Lexp(WoThi​+boTyi′​)exp(WoThi​+boTyi)​
  42. ψ
  43. i
  44. ,
  45. i
  46. +
  47. 1
  48. (
  49. y
  50. i
  51. ,
  52. y
  53. i
  54. +
  55. 1
  56. x
  57. )
  58. =
  59. exp
  60. (
  61. W
  62. t
  63. T
  64. y
  65. i
  66. ,
  67. i
  68. +
  69. 1
  70. )
  71. y
  72. i
  73. L
  74. y
  75. i
  76. +
  77. 1
  78. L
  79. exp
  80. (
  81. W
  82. t
  83. T
  84. y
  85. i
  86. ,
  87. i
  88. +
  89. 1
  90. )
  91. \psi_{i,i+1}(y_i,y_{i+1}|\boldsymbol{x}) = \frac{\exp(\boldsymbol{W}t^{T}\boldsymbol{y}{i,i+1})}{\sum_{y_i'\in\mathcal{L}}\sum_{y_{i+1}'\in\mathcal{L}}\exp(\boldsymbol{W}t^{T}\boldsymbol{y}{i',i+1}')}
  92. ψi,i+1​(yi​,yi+1​∣x)=∑yi′​∈L​∑yi+1′​∈Lexp(WtTyi′,i+1′)exp(WtTyi,i+1)​

其中

  1. W
  2. o
  3. \boldsymbol{W}_o
  4. Wo
  5. b
  6. o
  7. \boldsymbol{b}_o
  8. bo 是输出层的参数,
  9. W
  10. t
  11. \boldsymbol{W}_t
  12. Wt 是转移矩阵,
  13. h
  14. i
  15. \boldsymbol{h}_i
  16. hi 是位置
  17. i
  18. i
  19. i 的特征表示,
  20. y
  21. i
  22. \boldsymbol{y}i
  23. yi 是位置
  24. i
  25. i
  26. i 的标签表示,
  27. y
  28. i
  29. ,
  30. i
  31. +
  32. 1
  33. \boldsymbol{y}{i,i+1}
  34. yi,i+1 是位置
  35. i
  36. i
  37. i
  38. i
  39. +
  40. 1
  41. i+1
  42. i+1 的标签联合表示。

在这里插入图片描述

3. 数据准备

下面我将使用一个简单的命名实体识别(NER)任务来演示模型的训练和预测过程。数据集包含了一些句子,每个句子中的单词都被标记为“B-PER”(人名开始)、“I-PER”(人名中间)、“B-LOC”(地名开始)、“I-LOC”(地名中间)或“O”(其他)。

数据样例:

  1. John B-PER
  2. lives O
  3. in O
  4. New B-LOC
  5. York I-LOC
  6. . O

4. 模型搭建

首先,我们需要安装PyTorch库:

  1. pip install torch

接下来,我们将使用PyTorch搭建BiLSTM+CRF模型。完整的模型代码如下:

  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. from TorchCRF import CRF
  5. classBiLSTM_CRF(nn.Module):def__init__(self, vocab_size, tag_to_ix, embedding_dim, hidden_dim):super(BiLSTM_CRF, self).__init__()
  6. self.embedding_dim = embedding_dim
  7. self.hidden_dim = hidden_dim
  8. self.vocab_size = vocab_size
  9. self.tag_to_ix = tag_to_ix
  10. self.tagset_size =len(tag_to_ix)
  11. self.word_embeds = nn.Embedding(vocab_size, embedding_dim)
  12. self.lstm = nn.LSTM(embedding_dim, hidden_dim //2,
  13. num_layers=1, bidirectional=True)
  14. self.hidden2tag = nn.Linear(hidden_dim, self.tagset_size)
  15. self.crf = CRF(self.tagset_size)defforward(self, sentence):
  16. embeds = self.word_embeds(sentence).view(len(sentence),1,-1)
  17. lstm_out, _ = self.lstm(embeds)
  18. lstm_out = lstm_out.view(len(sentence), self.hidden_dim)
  19. lstm_feats = self.hidden2tag(lstm_out)return lstm_feats
  20. defloss(self, sentence, tags):
  21. feats = self.forward(sentence)return-self.crf(torch.unsqueeze(feats,0), tags)defpredict(self, sentence):
  22. feats = self.forward(sentence)return self.crf.decode(torch.unsqueeze(feats,0))

5. 训练与评估

接下来,我们将使用训练数据对模型进行训练,并在每个epoch后打印损失值和准确率。

  1. deftrain(model, optimizer, data):for epoch inrange(10):
  2. total_loss =0
  3. total_correct =0
  4. total_count =0for sentence, tags in data:
  5. model.zero_grad()
  6. loss = model.loss(sentence, tags)
  7. loss.backward()
  8. optimizer.step()
  9. total_loss += loss.item()
  10. prediction = model.predict(sentence)
  11. total_correct +=sum([1for p, t inzip(prediction, tags)if p == t])
  12. total_count +=len(tags)print(f"Epoch {epoch +1}: Loss = {total_loss /len(data)}, Accuracy = {total_correct / total_count}")

6. 预测

最后,我们将使用训练好的模型对新的句子进行预测。

  1. defpredict(model, sentence):
  2. prediction = model.predict(sentence)return[p for p in prediction]

7. 总结

用训练好的模型对新的句子进行预测。

  1. defpredict(model, sentence):
  2. prediction = model.predict(sentence)return[p for p in prediction]

7. 总结

本文介绍了如何使用PyTorch搭建一个BiLSTM+CRF模型,并通过一个简单的命名实体识别(NER)任务来演示模型的训练和预测过程。希望这篇文章能帮助你理解BiLSTM+CRF模型的原理,并为你的实际项目提供参考作用哦。

更新精彩的模型搭建与应用请持续关注哦!


本文转载自: https://blog.csdn.net/weixin_42878111/article/details/131007449
版权归原作者 微学AI 所有, 如有侵权,请联系我们删除。

“人工智能(pytorch)搭建模型8-利用pytorch搭建一个BiLSTM+CRF模型,实现简单的命名实体识别”的评论:

还没有评论