提高版:做动态决策和Bi-LSTM CRF
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
动态和静态深度学习工具包
--------------------------------------------
Pytorch是一个动态神经网络工具包。动态工具包的另一个例子是' Dynet <https://github.com/clab/dynet> ' (我之所以提到这一点,是因为使用Pytorch和Dynet是类似的。如果您在Dynet中看到一个示例,它可能会帮助您在Pytorch中实现它)。相反的是“静态”工具包,包括Theano、Keras、TensorFlow等。
核心差异如下:
*在静态工具包中,一旦定义一个计算图,编译它,然后将实例流到它。
*在动态工具包中,为每个实例定义一个计算图。它从不编译,而是动态执行
没有丰富的经验,很难理解其中的差别。一个例子是假设我们想要构建一个深层的成分解析器。假设我们的模型大致包括以下步骤:
*我们建立自底向上的树
*标记根节点(句子中的单词)
*然后,使用神经网络和单词的嵌入来找到组成成分的组合。每当您形成一个新的组件时,使用某种技术来获得该组件的嵌入。在这种情况下,我们的网络架构将完全依赖于输入语句。在“the green cat scratch the wall”这句话中,在模型的某个点上,我们想要组合跨度(也就是说,一个NP成分跨越单词1到单词3,在本例中是“the green cat”)。
然而,另一个句子可能是“the big fat cat scratch the wall”。在这句话中,我们想要在某个时刻形成成分:我们想要形成的成分将取决于实例。如果我们像在静态工具包中那样只编译一次计算图,那么编写这个逻辑将异常困难或不可能。然而,在动态工具包中,并不只有一个预定义的计算图。每个实例都可以有一个新的计算图,所以这个问题就没有了。
动态工具包还具有易于调试和代码更接近宿主语言的优点(我的意思是Pytorch和Dynet看起来更像实际的Python代码,而不是Keras或Theano)。
Bi-LSTM 条件随机场的讨论
-------------------------------------------
在本节中,我们将看到一个用于命名实体识别的Bi-LSTM条件随机场的完整而复杂的示例。上面的LSTM标记器对于词性标记来说已经足够了,但是像CRF这样的序列模型对于NER上的强大性能是非常必要的。
假设您熟悉CRF。虽然这个名字听起来很吓人,在LSTM提供了这些特性后,模型都是CRF。不过,这是一个高级模型,比本教程中任何较早的模型都要复杂得多。如果你想跳过,没关系。看看你是否准备好了,看看你是否可以:
-在第i步为标记k写出viterbi变量的递归式。
-修改上面的递归式来计算正向变量。
-再次修改上面的递归式,以计算log-space中的正向变量(提示:log-sum-exp)
如果您能够做到这三件事,您应该能够理解下面的代码。还记得CRF计算条件概率吗?
y是标记序列,x是单词的输入序列。
然后我们计算
分数是通过定义一些对数势来确定的