CRF和LSTM 模型在序列标注上的优劣?

点击上方,选择星标置顶,每天给你送干货

阅读大概需要7分钟

跟随小博主,每天进步一丢丢

编辑:忆臻

https://www.zhihu.com/question/46688107

本文仅作为学术分享,如果侵权,会删文处理

CRF和LSTM 模型在序列标注上的优劣?

作者:谢志宁
https://www.zhihu.com/question/46688107/answer/117448674

两者各有优缺点:

LSTM:像RNN、LSTM、BILSTM这些模型,它们在序列建模上很强大,它们能够capture长远的上下文信息,此外还具备神经网络拟合非线性的能力,这些都是crf无法超越的地方,对于t时刻来说,输出层y_t受到隐层h_t(包含上下文信息)和输入层x_t(当前的输入)的影响,但是y_t和其他时刻的y_t`是相互独立的,感觉像是一种point wise,对当前t时刻来说,我们希望找到一个概率最大的y_t,但其他时刻的y_t`对当前y_t没有影响,如果y_t之间存在较强的依赖关系的话(例如,形容词后面一般接名词,存在一定的约束),LSTM无法对这些约束进行建模,LSTM模型的性能将受到限制。

CRF:它不像LSTM等模型,能够考虑长远的上下文信息,它更多考虑的是整个句子的局部特征的线性加权组合(通过特征模版去扫描整个句子)。关键的一点是,CRF的模型为p(y | x, w),注意这里y和x都是序列,它有点像list wise,优化的是一个序列y = (y1, y2, …, yn),而不是某个时刻的y_t,即找到一个概率最高的序列y = (y1, y2, …, yn)使得p(y1, y2, …, yn| x, w)最高,它计算的是一种联合概率,优化的是整个序列(最终目标),而不是将每个时刻的最优拼接起来,在这一点上CRF要优于LSTM。

HMM:CRF不管是在实践还是理论上都要优于HMM,HMM模型的参数主要是“初始的状态分布”,“状态之间的概率转移矩阵”,“状态到观测的概率转移矩阵”,这些信息在CRF中都可以有,例如:在特征模版中考虑h(y1), f(y_i-1, y_i), g(y_i, x_i)等特征。

CRF与LSTM:从数据规模来说,在数据规模较小时,CRF的试验效果要略优于BILSTM,当数据规模较大时,BILSTM的效果应该会超过CRF。从场景来说,如果需要识别的任务不需要太依赖长久的信息,此时RNN等模型只会增加额外的复杂度,此时可以考虑类似科大讯飞FSMN(一种基于窗口考虑上下文信息的“前馈”网络)。

CNN+BILSTM+CRF:这是目前学术界比较流行的做法,BILSTM+CRF是为了结合以上两个模型的优点,CNN主要是处理英文的情况,英文单词是由更细粒度的字母组成,这些字母潜藏着一些特征(例如:前缀后缀特征),通过CNN的卷积操作提取这些特征,在中文中可能并不适用(中文单字无法分解,除非是基于分词后),这里简单举一个例子,例如词性标注场景,单词football与basketball被标为名词的概率较高, 这里后缀ball就是类似这种特征。

BILSTM+CRF的Tensorflow版本:https://github.com/chilynn/sequence-labeling,主要参考了GitHub - glample/tagger: Named Entity Recognition Tool的实现,tagger是基于theano实现的,每一轮的参数更新是基于一个样本的sgd,训练速度比较慢。sequence-labeling是基于tensorflow实现的,将sgd改成mini-batch sgd,由于batch中每个样本的长度不一,训练前需要padding,最后的loss是通过mask进行计算(根据每个样本的真实长度进行计算)。

作者:愚蠢队长
https://www.zhihu.com/question/46688107/answer/120114053

一、
做为一种概率图模型,CRF在理论上更完美一些,一步一步都有比较坚实的理论基础。不过CRF的假设也比较明确,然而问题不总是能match其假设的。
LSTM理论上是能拟合任意函数的,对问题的假设明显放宽了很多。不过深度学习类模型的理论原理和可解释性一般。

二、
CRF比较难扩展,想在图模型上加边加圈,得重新推导公式和写代码。
LSTM想stack起来、改双向、换激活函数等,只不过左手右手一个慢动作的事儿。

三、
CRF针对大数据不好做。
LSTM有各种GPU加速,多机异步SGD等标准大数据训练套路。但同样的问题,训练数据不够的话过拟合会很严重,效果堪忧。

四、
LSTM可以当做对序列的一种『中间状态』的建模,建模结果还可以当做特征,扔给其他模型继续用。

作者:万广鲁
https://www.zhihu.com/question/46688107/answer/136928113

LSTM和crf是两个层面的东西。


crf的核心概念,是计算序列全局的似然概率,其更像一个loss的选择方式。与其相对应的应该是cross entropy。crf把一个序列当作一个整体来计算似然概率,而不是计算单点的似然概率。这样使得其在序列标注问题中效果比较好。


即使现在主流使用LSTM模型的,也会在loss层使用crf,基本验证是更好的。而与LSTM相对应的应该是原来crf模型中特征层面的东东。比如在传统的crf模型中,需要人工选择各种特征,但是目前主流的解决方案中倾向于,embedding层+bilstm层,直接机器学习到特征。也就是end-to-end的思路。

方便交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

推荐阅读:

【ACL 2019】腾讯AI Lab解读三大前沿方向及20篇入选论文

【一分钟论文】IJCAI2019 | Self-attentive Biaffine Dependency Parsing

【一分钟论文】 NAACL2019-使用感知句法词表示的句法增强神经机器翻译

【一分钟论文】Semi-supervised Sequence Learning半监督序列学习

【一分钟论文】Deep Biaffine Attention for Neural Dependency Parsing

详解Transition-based Dependency parser基于转移的依存句法解析器

经验 | 初入NLP领域的一些小建议

学术 | 如何写一篇合格的NLP论文

干货 | 那些高产的学者都是怎样工作的?

一个简单有效的联合模型

近年来NLP在法律领域的相关研究工作


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用TensorFlow实现基于LSTM-CRF序列标注模型代码示例: ``` import tensorflow as tf from tensorflow.contrib.crf import crf_log_likelihood, viterbi_decode class BiLSTM_CRF(object): def __init__(self, num_chars, num_tags, embedding_dim, hidden_dim, batch_size=64, learning_rate=0.001): self.num_chars = num_chars self.num_tags = num_tags self.embedding_dim = embedding_dim self.hidden_dim = hidden_dim self.batch_size = batch_size self.learning_rate = learning_rate self.inputs = tf.placeholder(tf.int32, shape=[None, None], name='inputs') self.targets = tf.placeholder(tf.int32, shape=[None, None], name='targets') self.seq_length = tf.placeholder(tf.int32, shape=[None], name='seq_length') self._build_model() self._build_loss() self._build_optimizer() self.sess = tf.Session() self.sess.run(tf.global_variables_initializer()) def _build_model(self): # 定义词嵌入层 self.word_embeddings = tf.Variable(tf.random_uniform([self.num_chars, self.embedding_dim], -1.0, 1.0), name='word_embeddings') embeddings = tf.nn.embedding_lookup(self.word_embeddings, self.inputs) # 定义双向LSTM层 cell_fw = tf.contrib.rnn.LSTMCell(self.hidden_dim) cell_bw = tf.contrib.rnn.LSTMCell(self.hidden_dim) (output_fw, output_bw), _ = tf.nn.bidirectional_dynamic_rnn(cell_fw, cell_bw, embeddings, dtype=tf.float32, sequence_length=self.seq_length) output = tf.concat([output_fw, output_bw], axis=-1) # 定义全连接层 W = tf.get_variable('W', shape=[2*self.hidden_dim, self.num_tags], initializer=tf.contrib.layers.xavier_initializer()) b = tf.get_variable('b', shape=[self.num_tags], initializer=tf.zeros_initializer()) output = tf.reshape(output, [-1, 2*self.hidden_dim]) logits = tf.matmul(output, W) + b self.logits = tf.reshape(logits, [-1, tf.shape(self.inputs)[1], self.num_tags]) # 定义CRF层 self.transition_params = tf.get_variable('transition_params', shape=[self.num_tags, self.num_tags], initializer=tf.contrib.layers.xavier_initializer()) def _build_loss(self): log_likelihood, self.transition_params = crf_log_likelihood(inputs=self.logits, tag_indices=self.targets, sequence_lengths=self.seq_length, transition_params=self.transition_params) self.loss = tf.reduce_mean(-log_likelihood) def _build_optimizer(self): self.optimizer = tf.train.AdamOptimizer(self.learning_rate).minimize(self.loss) def train(self, inputs, targets, seq_length): feed_dict = {self.inputs: inputs, self.targets: targets, self.seq_length: seq_length} _, loss = self.sess.run([self.optimizer, self.loss], feed_dict=feed_dict) return loss def predict(self, inputs, seq_length): feed_dict = {self.inputs: inputs, self.seq_length: seq_length} logits, transition_params = self.sess.run([self.logits, self.transition_params], feed_dict=feed_dict) viterbi_sequences = [] for logit, length in zip(logits, seq_length): logit = logit[:length] viterbi_seq, _ = viterbi_decode(logit, transition_params) viterbi_sequences.append(viterbi_seq) return viterbi_sequences ``` 这里实现了一个包含词嵌入、双向LSTM、全连接和CRF层的模型,并使用Adam优化器进行训练。在训练过程中,需要传入输入序列、目标序列序列长度;在预测过程中,只需要传入输入序列序列长度即可得到预测的标注序列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值