最新要闻
- 【热闻】马斯克嘲讽人工智能:机器学习本质就是统计学
- 小学生用奶奶手机充值游戏2.9万 法院判决来了 世界视讯
- “龙字辈”成员即将加入!长城发布全新硬派SUV 或命名:“翔龙”
- 河南雷暴大风 半米粗大树连根拔起 外卖小哥伸头躲过一劫
- 世界快播:蔚来宣布重大决定:免费换电权益解绑 全系车型降价3万
- 今日播报!村里种的“软黄金”迎来丰收季
- 两批次食品不符合国家标准上黑榜 全球快资讯
- 俩石柱子被五菱一下子撞飞 附近店家感慨:此乃神车
- 米哈游去年赚了161亿!网友:够再开发十个《原神》了
- 每日快报!时代变了!未来18个月内 传奇瑞等大量国产车企将进入英国市场
- 世界速讯:越南因罕见高温遭遇“停电危机”:佳能等企业轮流停电
- 全球视讯!多种口味:和路雪经典大梦龙多口味雪糕16支88元发车
- 甘肃省加快推进交通项目建设 每日快播
- 《暗黑4》第一件“军帽”在韩服现身 官方证实:最强欧皇诞生 属性无敌
- 苹果回应Mac Pro弃用AMD显卡:压根就不适配_天天微速讯
- VIP体验卡到期!高考后饭菜的反差让人猝不及防:从“吃啥有啥”变“有啥吃啥”
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)_资讯推荐
深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)
1.命名实体识别介绍
命名实体识别(Named Entity Recoginition, NER)旨在将一串文本中的实体识别出来,并标注出它所指代的类型,比如人名、地名等等。具体地,根据MUC会议规定,命名实体识别任务包括三个子任务:
- 实体名:人名、地名、机构名等
- 时间表达式:日期、时间、持续时间等
- 数字表达式:百分比、度量衡、钱、基数等
我们来看这句话,百度于2021年3月23日正式回香港上市,这句话中"百度"是个机构名,"香港"是个地名,"2021年3月23日"是个日期,命名实体识别任务能够通过建模的方式来帮助我们自动地发现这些实体。
(资料图)
命名实体识别是一项比较关键的NLP任务,具有广泛的应用场景,例如在对话意图理解(NLU)中,通过提取出相应的实体词,能够帮助系统更加准确地理解用户的需求,比如根据用户的问题提取出"天气","北京","今天"这样的词汇,大概率就能知道用户在问些什么;在微博场景中,应用命名实体识别提取出微博短文中重要的实体词,也有利于微博信息的汇总,或者事件热度的统计。
NER任务一般会被建模成序列标注任务,也就是说,模型的输入是待识别的一串文本序列,模型的输出就是该文本序列对应的标签序列,不同于文本分类任务,这是一种序列到序列的任务。我们来举个例子:
姚 | 明 | 担 | 任 | 中 | 国 | 篮 | 协 | 主 | 席 |
---|---|---|---|---|---|---|---|---|---|
B-Person | I-Person | O | O | B-Organization | I-Organization | I-Organization | I-Organization | O | O |
这句话中的每个字分别对应着一个标签, 模型的输入就是上边的文本,模型的输出就是下面的标签序列,我们通过这样的标签序列就能识别出原始文本中的实体。具体地,上边这串文本中,"姚明"对应着Person实体,其中"姚"字是"Person"实体的起始字,所以设置标签为"B-person",其中标签前边的B代表Begin这个单词;"明"字是"Person"实体的中间字,所以设置标签为"I-Person",其中标签前边的I代表Intermediate这个单词。 "中国篮协"对应这Organization实体,相应标签"B-Organization"和"I-Organization"的解读和Person实体是一致的。最后的标签"O"代表"other",表示其他实体类型的标签。
看到这里,相信你已经知道,本节的NER任务要建模完成一件什么事情了,即建模一个序列到序列的模型来找出文本中蕴含的实体。
2.BiLSTM+CRF实现命名实体识别
BiLSTM + CRF是一种经典的命名实体识别(NER)模型方案,这在后续很多的模型improvment上都有启发性。如果你有了解NER任务的兴趣或者任务,或者完全出于对CRF的好奇,建议大家静心读一读这篇文章。
本篇文章会将重点放到条件随机场(CRF)上边,因为这是实现NER任务很重要的一个组件,也是本篇文章最想向你推荐的特色。但是如果你 对长短时记忆网络(LSTM)也不是很熟悉,那你也不用担心,笔者会去解释LSTM的用法,它的输入和输出等等内容,以保证你可以顺畅的读下去,领悟到这个模型的精髓。
2.1使用BiLSTM+CRF实现NER
为方便直观地看到BiLSTM+CRF是什么,我们先来贴一下BiLSTM+CRF的模型结构图,如图1所示。
从图1可以看到,在BiLSTM上方我们添加了一个CRF层。具体地,在基于BiLSTM获得各个位置的标签向量之后,这些标签向量将被作为发射分数传入CRF中,发射这个概念是从CRF里面带出来的,后边在介绍CRF部分会更多地提及,这里先不用纠结这一点。
这些发射分数(标签向量)传入CRF之后,CRF会据此解码出一串标签序列。那么问题来了,从图1最上边的解码过程可以看出,这里可能对应着很多条不同的路径,例如:
- B-Person, I-Person, O, ..., I-Organization
- B-Organization, I-Person, O, ..., I-Person
- B-Organization, I-Organization, O, ..., O
CRF的作用就是在所有可能的路径中,找出得出概率最大,效果最优的一条路径,那这个标签序列就是模型的输出。
我们来总结一下,使用BiLSTM+CRF模型架构实现NER任务,大致分为两个阶段:使用BiLSTM生成发射分数(标签向量),基于发射分数使用CRF解码最优的标签路径。
2. 回归CRF建模原理本身
本节将开始聚焦在CRF原理本身进行讲解,力图为读者展现一个清楚明白,基础本质的CRF。那现在开始这趟学习之旅吧,相信你一定会有所收获。
2.1 线性CRF的定义
通常我们会使用线性链CRF来建模NER任务,所以本实验将聚焦在线性链CRF来探讨。那什么是线性链CRF呢,我们来看下李航老师在《统计学习方法》书中的定义:
设$X=[x_1, x_2, ..., x_n],Y=[y_1, y_2, ..., y_n]$ 均为线性链表示的随机变量序列,若在给定随机变量序列的$X$的条件下,随机变量序列$Y$的条件概率分布$P(Y|X)$构成条件随机场,即满足马尔可夫性:
$$\begin{align}P(y_i|X, y_{1},...,y_{i-1},y_{i+1},...,y_n) &= P(y_i|X,y_{i-1},y_{i+1}) \ i &= 1,2,...,n (在i=1和n时只考虑单边)\end{align}$$
则称$P(Y|X)$为线性链条件随机场。
同学们看到这个定义,或许会有些疑惑,但是不用着急,我们来探讨下这个定义。图2展示了一种经典的线性链CRF的结构图,从这张结构图来理解这个定义,主要包含两个点:
- 确保输入序列$X$和输出序列$Y$是线性序列
- 每个标签$y_i$的产生,只与这些因素有关系:当前位置的输入$x_i$,$y_i$直接相连的两个邻居$y_{i-1}$和$y_{i+1}$,与其他的标签和输入没有关系。
这样的定义,其实帮助我们减小了建模CRF的代价。
2.2 发射分数和转移分数
上边我们探讨了线性链CRF的定义以及它的一种经典图结构,接下来我们继续回到我们建模的命名实体任务上来。
在图2中,$x=[x_0, x_1, ... , x_i, ... , x_n]$代表输入变量,对应到我们当前任务就是输入文本序列,$y=[y_0, y_1, ..., y_i, ..., y_n]$代表相应的标签序列,
其中,每个输入$x_i$均对应着一个标签$y_i$,这一步对应的就是发射分数,它指示了当前的输入$x_i$应该对应什么样的标签;在每个标签$y_i$之间也存在连线,它表示当前位置的标签$y_i$向下一个位置的标签${y_{i+1}}$的一种转移。举个例子,假设当前位置的标签是"B-Person",那下一个位置就很有可能是"I-Person"标签,即标签"B-Person"向"I-Person"转移的概率会比较大。
这里我们带出了建模CRF过程中两个重要的概念:发射分数和转移分数,下边我们来看看他们是什么。
2.2.1 发射分数
前边我们在第2节已经提到过发射分数了,即BiLSTM后产生的标签向量。如果大家对这部分内容已经很熟悉,完全可以跳过这部分。图3以矩阵的形式展示了发射分数的生成过程。
当给定的文本序列$x=[x_1, x_2, x_3,..., x_n]$映射为对应词向量之后,将会得到一个shape为$[n, embedding_size]$的词向量矩阵$embs$,其中每对应一个字词(图5样例只使用了4个词),例如$x_0$对应的词向量是$[e_{00}, e_{01}, e_{02}, e_{03}]$。
然后将$embs$传入BiLSTM后,每个词的位置都会产生一个上下文向量,所有的向量组合之后会得到一个向量矩阵$context_vector$,其中每行代表对应单词经过BiLSTM后的上下文向量。
这里的每个位置的上下文向量可以用来指导当前位置应该输出的标签信息,但这里有个问题,这个输出向量的维度并不是标签的数量,它不能直接用来指示应该输出什么标签。一般的做法是在后边加一层线性层,将这个上下文向量的维度映射为标签的数量,这样的话就会生成前边所讲的标签向量,其中的每个元素分别对应着相应标签的分数,根据这个分数可以用来指导最终标签的输出。
具体地,线性层这里只是做了这样的一个线性变换:$y = XW+b$,显然,这里的$X$就是$context_vector$, $y$是相应的$emission_score$,$W和b$是线性层的可学习参数。前边提到,$context_vector$的shape为$[n,context_size]$,那么线性层的$W$的shape应该是$[context_size, tag_size]$,经过以上公式的线性变换,就可以得到发射分数$emission_score$,其中每个字词对应一行的标签分数(图3中只设置了三列,代表一共有3个标签),例如,$x_0$对第一个标签的分数预测为$t_{00}$,对第二个标签的分数预测为$t_{01}$,对第三个标签的分数预测为$t_{02}$,依次类推。
2.2.2 转移分数
下面我们来聊聊转移分数,这个转移分数表示一个标签向另一个标签转移的分数,分数越高,转移概率就越大,反之亦然。图4展示了记录转移分数的矩阵。
让我们从列到行地来看下这个转移矩阵$T$,B-Person向I-Person转移的分数为0.93,B-Person向I-Organization转移的分数为0.02,前者的分数远远大于后者。I-Person向I-Person转移的概率是0.71,I-Organization向I-Organization转移的分数是0.95,因为一个人或者组织的名字往往包含多个字,所以这个概率相对是比较高的,这其实也是很符合我们直观认识的。
假设我们现在有个标签序列:B-Person, I-Person, O, O,B-Organization, I-Organization。那么这个序列的转移分数可按照如下方式计算:
$Seq_t = T_{I-Person,B-Person} + T_{O,I-Person} + T_{O,O} + T_{O,B-Organization} + T_{B-Organization, I-Organization}$
这个转移分数矩阵是CRF中的一个可学习的参数矩阵,它的存在能够帮助我们显示地去建模标签之间的转移关系,提高命名实体识别的准确率。
2.3 CRF建模的损失函数
前边我们讲到,CRF能够帮助我们以一种全局的方式建模,在所有可能的路径中选择效果最优,分数最高的那条路径。那么我们应该怎么去建模这个策略呢,下面我们来具体谈谈。
图5展示了CRF的工作图,现在我们有一串输入$x=[x_0, x_1, x_2, x_n]$(这里的$x$是文本串对应的发射分数,每个字词$x_i$都对应着一个发射分数向量,也就是前边提到的标签向量,该向量的维度就是标签数量),期待解码出相应的标签序列$y=[y_0, y_1,y_2, ..., y_n]$,形式化为对应的条件概率公式如下:
$$(y|x) = P(y_0,y_1,...,y_n|x_0,x_1,...,x_n)$$
在第2节我们提到,CRF的解码策略在所有可能的路径中,找出得出概率最大,效果最优的一条路径,那这个标签序列就是模型的输出,假设标签数量是$k$,文本长度是$n$,显然会有$N=k^n$条路径,若用$S_i$代表第$i$条路径的分数,那我们可以这样去算一个标签序列出现的概率:
$$P(S_i)=\frac{e{S_i}}{\sum_j{N}{e^{S_j}}}$$
现在我们有一条真实的路径$real$,即我们期待CRF解码出来的序列就是这一条。那它的分数可以表示为$s_{real}$,它出现的概率就是:
$$P(S_{real})=\frac{e{S_{real}}}{\sum_j{N}{e^{S_j}}}$$
所以我们建模学习的目的就是为了不断的提高$P(S_{real})$的概率值,这就是我们的目标函数,当目标函数越大时,它对应的损失就应该越小,所以我们可以这样去建模它的损失函数:
$$loss=-P(S_{real})=-\frac{e{S_{real}}}{\sum_j{N}{e^{S_j}}}$$
为方便求解,我们一般将这样的损失放到log空间去求解,因为log函数本身是单调递增的,所以它并不影响我们去迭代优化损失函数。
$$\begin{align}loss &= -log \frac{e{S_{real}}}{\sum_j{N}{e^{S_j}}} \&= -(log(e^{S_{real}}) - log(\sum_j{N}{e{S_j}})) \&= log(\sum_j{N}{e{S_j}}) - log(e^{S_{real}}) \&= log(e{S_1}+e{S_2}+...+e^{S_N}) - S_{real} \\end{align}$$
千呼万唤始出来,这就是我们CRF建模的损失函数了。我们整个BiLSTM+CRF建模的目的就是为了让这个函数越来越小。从这个损失函数可以看出,这个损失函数包含两部分:单条真实路径的分数$S_{real}$,归一化项$log(e{S_1}+e{S_2}+...+e^{S_N})$,即将全部的路径分数进行$log_sum_exp$操作,即先将每条路径分数$S_i$进行$exp(S_i)$,然后再将所有的项加起来,最后取$log$值。
讲到这里,有的同学可能会有疑惑,这里的每条路径分数应该怎么算呢?接下来,我们就来解决这个问题。
2.4 单条路径的分数计算
在开始之前,我们再来做一些约定,前边我们提到了发射分数和转移分数,假设$E$代表发射分数矩阵,$T$代表转移分数矩阵,$n$代表文本序列长度,$tag_size$代表标签的数量。另外为方便书写,我们为每个标签编个id号(参考图5中涉及到的标签),如图6所示。
其中,$E$的shape为$[n, tag_size]$,每行对应着一个文本字词的发射分数,每列代表一个标签,例如,$E_{01}$代表$x_0$取id为1的标签分数,$E_{23}$代表$x_2$取id为3的标签分数。$T$的shape为$[tag_size, tag_size]$,它代表了标签之间相互转移的分数,例如,$T_{03}$代表id为3的标签向id为0的标签转移分数。
每条路径的分数就是由对应的发射分数和转移分数组合而成的,对于图5标记出来的黄色路径来说,$x_0$的标签是B-Person,对应的发射分数是$E_{00}$,$x_1$的标签是I-Person,对应的发射分数是$E_{11}$,由B-Person向I-Person转移的分数是$T_{10}$,因此到这一步的分数就是:$E_{00}+T_{10}+E_{11}$。
接下来$x_2$的标签是$O$,由$x_1$的标签向I-Person向$x_2$的标签O转移的概率是$T_{41}$,因此到这一步的分数是:$E_{00}+T_{10}+E_{11}+T_{41}+E_{24}$,依次类推,我们可以计算完整条路径的分数。假设第$i$个位置对应的标签为$y_i$,则整条路径的分数计算形式化公式为:
$$S_{real}=\sum_{i=0}^{n-1}{E_{i,y_i}} + \sum_{i=0}^{n-2}{T_{y_{i+1}, y_{i}}}$$
2.5 全部路径的分数计算
2.3节中的损失函数包括两项,单条真实路径分数的计算和归一化项(如上所述,全部路径分数的$log_sum_exp$,为方便描述,后续直接将个归一化项描述为全部路径之和)的计算。这里你或许会问,现在知道了单条路径分数的计算方式,遍历一下所有的路径算个分数,不就可以轻松算出全部路径之和吗?是的,这在理论上是可行的。
但是,前边我们提到这个路径的数量是个指数级别的量纲,假设我对串包含50个字的文本串进行实体识别,标签的数量是31,那么这个路径的数量将是$31^{50}$条,这是真的是难以接受的一件事情,它会远远拖慢模型的训练和预测效率。
因此,我们要换一种高效的思路,这里其实用到了一种被称为前向算法的动态规划,它能帮助我们将图5所有路径的和计算,拆解为每个位置的和计算,最终得出所有的路径之和。如果这是你第一次听到这个算法,那也没关系,我会通过示例的方式,为你展现这个算法的工作原理,但是在看这部分内容之前,我们再来回顾一下我们的计算目标,即损失函数中的第1项:
$$log(e{S_1}+e{S_2}+...+e^{S_N})$$
另外,为方便描述这个原理,我们来简化下这个问题,假设我们现在在计算图7所示的所有路径之和。
图7中,共包含2个标签$Tag$ 0 和$Tag$ 1, 文本串有3个单词$x_0, x_1, x_2$。我们再来做些约定如下:
$emission_i=[x_{i0},x_{i1}]$, 代表$x_i$位置的发射分数。
其中,$x_{i0}$代表$x_i$位置输出$Tag$ 0 标签的分数, $x_{i1}$代表$x_i$位置输出$Tag$ 1 标签的分数。
$ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] $, 代表转移矩阵。
其中,$t_{01}$代表从$Tag$ 1 转移到$Tag$ 0的分数,$t_{10}$代表从$Tag$ 0 转移到$Tag$ 1的分数,依次类推。
$alpha_i=[s_{i0},s_{i1}]$, 其中各个数值代表到当前位置$x_i$为止,以$x_i$位置相应标签结尾的路径分数之和。
以$x_2$步为例,$alpha_2=[s_{20},s_{21}]$,其中$s_{20}$代表截止到$x_2$步骤为止,以标签$Tag$ 0 结尾所有的路径分数之和,$s_{21}$代表截止到$x_2$步骤为止,以标签$Tag$ 1结尾的所有路径分数之和。
这里比较抽象,如图7所示,参与$x_2$步的$s_{20}$分数计算的路径包括4条,即$s_{20}$是下边4条路径分数之和,依次如下
- $x_{00},x_{10},x_{20}$
- $x_{00},x_{11},x_{20}$
- $x_{01},x_{10},x_{20}$
- $x_{01},x_{11},x_{20}$
恭喜,我们完成了一些枯燥的定义,下边我们来看看如何计算所有路径的分数和吧,这里我们分成3步走来解释,首先计算截止到$x_0$位置,到各个标签的分数(上边的$alpha$内容)是多少;截止到$x_1$位置,到各个标签的分数是多少;截止到$x_2$位置,到各个标签的分数是多少。
第1步,截止到$x_0$位置
当前位置$x_0$输入的发射分数为:$emission_0=[x_{00},x_{01}]$,因为这是序列的起始,显然截止到$x_0$位置有:$alpha_0=[x_{00},x_{01}]$。
截止到$x_0$这一步,将$x_0$位置的所有标签的分数累计作为所有路径的分数为:
$$total_0 = log(e{x_{00}}+e{x_{01}})$$
第2步,截止到$x_1$位置
当前步骤涉及到$x_0$向$x_1$位置的转移,在这个过程中,$x_1$位置输入的发射分数为:$emission_1=[x_{10}, x_{11}]$, 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] $, 前一个位置$x_0$各标签的路径累计和$alpha_0=[x_{00},x_{01}]$。
接下来我们expand一下$emission_1$ 和 $alpha_0$,力求通过矩阵计算的方式一次完成当前位置$x_1$各个标签的路径累计$alpha_1$,具体如下:
$$emission_1 = \left[ \begin{matrix} x_{10} & x_{10}\ x_{11} & x_{11} \end{matrix} \right] $$
$$alpha_0 = \left[ \begin{matrix} x_{00} & x_{01}\ x_{00} & x_{01} \end{matrix} \right] $$
然后我们来计算截止到$x_1$位置,到不同标签的每条路径的分数:
$$\begin{align}scores &= alpha_0+trans+emission_1 \ &= \left[ \begin{matrix} x_{00} & x_{01}\ x_{00} & x_{01} \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{10} & x_{10}\ x_{11} & x_{11} \end{matrix} \right] \ &= \left[ \begin{matrix} x_{00}+t_{00}+x_{10} & x_{01}+t_{01}+x_{10}\ x_{00}+t_{10}+x_{11} & x_{01}+t_{11}+x_{11} \end{matrix} \right]\end{align}$$
我们来看一条路径分数的计算,例如$ x_{00}+t_{10}+x_{11}$, 它代表在$x_0$的位置标签为$Tag$ 0,在$x_1$的位置标签为$Tag$ 1,然后通过加上$t_{10}$完成了$x_0$位置$Tag$ 0标签 向 $x_1$位置标签$Tag$ 1的转移。
从上边的结果可以看到,第1行代表向当前位置$x_1$标签$Tag$ 0的转移路径,第2行代表向当前位置$x_1$标签$Tag$ 1的转移路径。以第1行为例,将第1行的路径分数相加,就相当于到当前位置$x_1$并且以$Tag$ 0结尾的所有路径之和。
因此,这样我们可以容易地算出当前位置$x_1$的各个标签的路径累计分数$alpha_1$:
$alpha_1 = [log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}}), log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})]$
最后,我们来算下截止到$x_1$位置,所有的路径和:
$$\begin{align}total_1 &= log(e^{alpha_1[0]} + e^{alpha_1[1]}) \ &=log(e{log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}})}+e{log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})}) \ &=log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}} + e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})\end{align}$$
再回顾一下我们的计算目标:$log(e{S_1}+e{S_2}+...+e^{S_N})$,你可以看到如果图7最终只到$x_1$位置,那么上边的这个结果就是我们相求的全部路径之和,或者说是归一化项。
第3步,截止到$x_2$位置
我们再来看下$x_2$位置的一些输入信息,$x_2$位置输入的发射分数为:$emission_2=[x_{20}, x_{21}]$, 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] $, 前一个位置$x_1$各标签的路径累计和$alpha_1=[log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}}), log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})]$。
接下来继续expand一下$emission_2$ 和 $alpha_1$,力求通过矩阵计算的方式一次完成当前位置$x_2$各个标签的路径累计$alpha_2$,具体如下:
$$emission_2 = \left[ \begin{matrix} x_{20} & x_{20}\ x_{21} & x_{21} \end{matrix} \right] $$
$$alpha_1 = \left[ \begin{matrix} log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}}) & log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}}) \ log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}}) & log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}}) \end{matrix} \right] $$
然后我们来计算截止到$x_2$位置,到不同标签的每条路径的分数:
$$\begin{align}scores &= alpha_1+trans+emission_2 \ &= \left[ \begin{matrix} log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}}) & log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}}) \ log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}}) & log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}}) \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{20} & x_{20}\ x_{21} & x_{21} \end{matrix} \right] \ &= \left[ \begin{matrix} log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}})+t_{00}+x_{20} & log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})+t_{01}+x_{20}\ log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}})+t_{10}+x_{21} & log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})+t_{11}+x_{21} \end{matrix} \right]\end{align}$$
继续按行累加,算出到当前位置$x_2$的各个标签的路径累计分数$alpha_2$:
$$\begin{align}alpha_2 &= [log(e^{scores[0,0]} + e^{scores[0,1]}), log(e^{scores[1,0]} + e^{scores[1,1]})] \ &=[log(e{log(e{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})+t_{00}+x_{20}} + e{log(e{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})+t_{01}+x_{20}}), log(e{log(e{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})+t_{10}+x_{21}} + e{log(e{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})+t_{11}+x_{21}})] \ &=[log((e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}})e{t_{00}+x_{20}}+(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})e{t_{01}+x_{20}}), log((e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}})e{t_{10}+x_{21}}+(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})e{t_{11}+x_{21}})]\end{align}$$
最后,我们来算下截止到$x_2$位置,所有的路径和:
$$\begin{align}total_2 &= log(e^{alpha_2[0]} + e^{alpha_2[1]}) \ &=log(e{log((e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}})e{t_{00}+x_{20}}+(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})e{t_{01}+x_{20}})}+e{log((e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}})e{t_{10}+x_{21}}+(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})e{t_{11}+x_{21}})}) \ &=log((e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}})e{t_{00}+x_{20}}+(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})e{t_{01}+x_{20}}+ (e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}})e{t_{10}+x_{21}}+(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})e{t_{11}+x_{21}} ) \ &= log(e^{x_{00}+t_{00}+x_{10}+t_{00}+x_{20}} + e^{x_{01}+t_{01}+x_{10}+t_{00}+x_{20}} + e^{x_{00}+t_{10}+x_{11}+t_{01}+x_{20}} + e^{x_{01}+t_{11}+x_{11}+t_{01}+x_{20}} + e^{x_{00}+t_{00}+x_{10}+t_{10}+x_{21}} + e^{x_{01}+t_{01}+x_{10}+t_{10}+x_{21}} + e^{x_{00}+t_{10}+x_{11}+t_{11}+x_{21}} + e^{x_{01}+t_{11}+x_{11}+t_{11}+x_{21}})\end{align}$$
显然,这个式子的结果就是最终我们想要的计算目标,损失函数中的第1项,共计包含8条路径的分数。
2.6 CRF的Viterbi解码
在前边几节,我们讲过了CRF的损失函数、单条路径分数的计算、全部路径分数的计算,根据这些内容完全可以进行BiLSTM+CRF的训练。但是,我们如何使用CRF从全部的路径中解码出得分最高的那条路径呢?
同2.5节所述,计算全部路径分数后,选择得分最大的那条路径肯定是不行的。其实这里是使用了一种被称为Viterbi的算法,它的思想和2.5节介绍的前向算法有些类似,将从全部路径中查找最优路径的过程,拆解为选择每个位置累计的最大路径。如果这是你第一次接触Viterbi算法,也不用担心,本节依然会通过示例的方式展现这个算法原理。
我们依然以图7为例,解码这全部路径中分数最大的这条(图中橙色显示的这条路径)。在正式介绍之前,我们依然做些约定如下:
$emission_i=[x_{i0},x_{i1}]$, 代表$x_i$位置的发射分数。
其中,$x_{i0}$代表$x_i$位置输出$Tag$ 0 标签的分数, $x_{i1}$代表$x_i$位置输出$Tag$ 1 标签的分数。
$ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] $, 代表转移矩阵。
其中,$t_{01}$代表从$Tag$ 1 转移到$Tag$ 0的分数,$t_{10}$代表从$Tag$ 0 转移到$Tag$ 1的分数,依次类推。
$alpha_i=[s_{i0},s_{i1}]$, 其中各个数值代表到当前位置$x_i$为止,以当前位置$x_i$相应标签结尾的路径中,取得最大分数的路径得分。
以$x_2$位置为例,$alpha_2=[s_{20},s_{21}]$,其中$s_{20}$代表截止到$x_2$步骤为止,以标签$Tag$ 0 结尾所有的路径中得分最大的路径分数,$s_{21}$代表截止到$x_2$步骤为止,以标签$Tag$ 1结尾的所有路径中得分最大的路径分数。
这里比较抽象,如图7所示,参与$x_2$步的$s_{20}$分数计算的路径包括4条,$s_{20}$是这4条路径中得分最大这一条对应的分数,即下边这一条路径:$x_{00},x_{11},x_{20}$。
$beta_i = [p_{i0},p_{i1}]$,其中各个数值代表到当前位置$x_i$为止,以当前位置$x_i$相应标签结尾的路径中,分数最大的那一条路径在前一个位置$x_{i-1}$的标签索引(每个标签对应的id号)。
以$x_2$位置为例,$beta_2 = [p_{20},p_{21}]$,其中$p_{20}$代表代表截止到$x_2$步骤为止,以标签$Tag$ 0 结尾所有的路径中得分最大的那条路径在$x_{i-1}$位置的标签索引,同理$p_{21}$代表截止到$x_2$步骤为止,以标签$Tag$ 1结尾的最大路径在$x_{i-1}$位置的标签索引。
同样,如图7所示,在$x_2$位置,到标签$Tag$ 0的所有路径中,分数最大的路径是:$x_{00},x_{11},x_{20}$,因为前一个位置$x_{i-1}$的标签是$Tag$ 1,因此$p_{20}=1$。
恭喜,我们又一次完成了这些枯燥的定义,下边我们来看看如何选择所有路径中得分最大的这一条吧,这里我们同样分成3步走来解释,首先计算截止到$x_0$位置,到各个标签的最大得分(上边的$alpha$内容)是多少;截止到$x_1$位置,到各个标签的最大得分是多少;截止到$x_2$位置,到各个标签的最大得分是多少。
第1步,截止到$x_0$位置
当前位置$x_0$输入的发射分数为:$emission_0=[x_{00},x_{01}]$,因为这是序列的起始,显然截止到$x_0$位置有:$alpha_0=[x_{00},x_{01}]$
另外因为起始位置前边没有路径,这里我们使用-1来初始化:$beta_0=[-1,-1]$
第2步,截止到$x_1$位置
当前步骤涉及到$x_0$向$x_1$位置的转移,在这个过程中,$x_1$位置输入的发射分数为:$emission_1=[x_{10}, x_{11}]$, 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] $, 到前一个位置$x_0$各标签的最大路径得分为$alpha_0=[x_{00},x_{01}]$。
接下来按照2.5节同样的方式,我们expand一下$emission_1$ 和 $alpha_0$,力求通过矩阵计算的方式一次完成到当前位置$x_1$各个标签的所有路径中得分最大的路径分数$alpha_1$,具体如下:
$$emission_1 = \left[ \begin{matrix} x_{10} & x_{10}\ x_{11} & x_{11} \end{matrix} \right] $$
$$alpha_0 = \left[ \begin{matrix} x_{00} & x_{01}\ x_{00} & x_{01} \end{matrix} \right] $$
然后我们来计算截止到$x_1$位置,到不同标签的每条路径的分数:
$$\begin{align}scores &= alpha_0+trans+emission_1 \ &= \left[ \begin{matrix} x_{00} & x_{01}\ x_{00} & x_{01} \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{10} & x_{10}\ x_{11} & x_{11} \end{matrix} \right] \ &= \left[ \begin{matrix} x_{00}+t_{00}+x_{10} & x_{01}+t_{01}+x_{10}\ x_{00}+t_{10}+x_{11} & x_{01}+t_{11}+x_{11} \end{matrix} \right]\end{align}$$
同样地,以第1行为例,第1行代表到当前位置$x_1$标签$Tag$ 0结尾的所有路径的得分,那么第1行中分数最大这一条路径,就是到当前位置$x_1$并且以$Tag$ 0结尾的所有路径中得分最大的路径。
因此,这样我们可以容易地算出到当前位置$x_1$的各个标签的最大路径分数$alpha_1$:
$$\begin{align}alpha_1 &= [max(scores[0,0], scores[0,1]), max(scores[1,0], scores[1,1])] \ &= [max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}), max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})]\end{align}$$
显然从上边结果中,我们能够分析出到$x_1$位置各个标签的最大路径,例如到$Tag $ 0的路径有$x_{00}+t_{00}+x_{10}$ 和 $ x_{01}+t_{01}+x_{10}$, 其中较大者就是我们想要的到$x_1$位置 $Tag $ 0的最大路径。
这里不妨我们做个假设:
- $x_{00}+t_{00}+x_{10} < x_{01}+t_{01}+x_{10}$
- $x_{00}+t_{10}+x_{11} > x_{01}+t_{11}+x_{11}$
因此,我们可以获得$x_1$位置的索引$beta_1=[1,0]$,这代表在$x_1$位置,到标签$Tag$ 0的最大路径的前一个位置$x_{i-1}$的标签是$Tag$ 1, 到标签$Tag$ 1的最大路径的前一个位置$x_{i-1}$的标签是$Tag$ 0。
第3步,截止到$x_2$位置
我们再来看下$x_2$位置的一些输入信息,$x_2$位置输入的发射分数为:$emission_2=[x_{20}, x_{21}]$, 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] $, 前一个位置$x_1$各标签的路径累计和:$alpha_1=[max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}), max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})]$。
接下来继续expand一下$emission_2$ 和 $alpha_1$,力求通过矩阵计算的方式一次完成当前位置$x_2$各个标签的路径累计$alpha_2$,具体如下:
$$emission_2 = \left[ \begin{matrix} x_{20} & x_{20}\ x_{21} & x_{21} \end{matrix} \right] $$
$$alpha_1 = \left[ \begin{matrix} max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \ max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \end{matrix} \right] $$
然后我们来计算截止到$x_2$位置,到不同标签的每条路径的分数:
$$\begin{align}scores &= alpha_1+trans+emission_2 \ &= \left[ \begin{matrix} max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \ max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{20} & x_{20}\ x_{21} & x_{21} \end{matrix} \right] \ &= \left[ \begin{matrix} max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) +t_{00}+x_{20} & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})+t_{01}+x_{20}\ max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10})+t_{10}+x_{21} & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) +t_{11}+x_{21} \end{matrix} \right]\end{align}$$
因此,这样我们可以容易地算出到当前位置$x_2$的各个标签的最大路径分数$alpha_2$:
$$\begin{align}alpha_1 &= [max(scores[0,0], scores[0,1]), max(scores[1,0], scores[1,1])] \ &= [max(max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) +t_{00}+x_{20}, max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})+t_{01}+x_{20}), max(max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10})+t_{10}+x_{21}, max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) +t_{11}+x_{21} )]\end{align}$$
这里我不妨再假设:
$max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) +t_{00}+x_{20} > max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})+t_{01}+x_{20})$
$max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10})+t_{10}+x_{21} < max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) +t_{11}+x_{21} )$
上一步我们曾假设:
- $x_{00}+t_{00}+x_{10} < x_{01}+t_{01}+x_{10}$
- $x_{00}+t_{10}+x_{11} > x_{01}+t_{11}+x_{11}$
因此有:
- $x_{01}+t_{01}+x_{10}+t_{01}+x_{10} < x_{00}+t_{10}+x_{11}+t_{01}+x_{20}$
- $x_{01}+t_{01}+x_{10}+t_{10}+x_{21} > x_{00}+t_{10}+x_{11}+t_{11}+x_{21}$
所以$x_2$位置的索引:$beta_2 = [1,0]$
此时:$alpha_1=[x_{00}+t_{10}+x_{11}+t_{01}+x_{20}, x_{01}+t_{01}+x_{10}+t_{10}+x_{21} ]$
在图7中橘色路径分数最高,其对应的是$x_{00}+t_{10}+x_{11}+t_{01}+x_{20}$,因此再假设:
$x_{00}+t_{10}+x_{11}+t_{01}+x_{20} > x_{01}+t_{01}+x_{10}+t_{10}+x_{21}$
这其实代表在$x_2$位置的所有标签对应的最大路径中,$Tag$ 0 对应的那条路径是最大的,这条路径也是全局所有路径中分数最大的那一条,是我们要解析出的期望路径。
第4步,开始解码标签序列
到现在位置,我们通过$beta_0$记录下了最大路径上的节点,接下来我们可以通过回溯来找出全局所有路径中的最大路径。
首先,在$x_2$位置所有标签对应的最大路径中,$Tag$ 0 对应的路径分数最大。因此$x_2$位置对应的标签就是$Tag$ 0。
然后,$beta_2 = [1,0]$,因此$x_2$位置解析出的标签$Tag$ 0,对应的上一位置$x_1$的标签是$Tag$ 1。
接下来,$beta_1=[1,0]$,因此$x_1$位置解析出的标签$Tag$ 1,对应的上一位置$x_0$的标签是$Tag$ 0。
最后,$beta_0=[-1,-1]$,当解析到这一步的时候,反回的标签肯定是-1,因此这个回溯过程也就结束了。
当回溯完成之后,将解析出的结果倒序排序,就是我们期望的最大路径。以图7为例,该路径就是$Tag$ 0 -->$Tag$ 1 -->$Tag$ 0。
恭喜,看到这里,相信你已经懂得了CRF的核心原理。江湖虽路远,但总会再见,如对笔者的文章满意,还请多多支持。
- Reference[1] 邱锡鹏. 神经网络与深度学习[M]. 北京:机械工业出版社,2021.[2] 吴飞. 人工智能导论:模型与算法[M]. 北京:高等教育出版社,2020.[3] CRF Layer on the Top of BiLSTM
3. PLM Fine-tuning预训练的模型
3.1 目前前沿方法
Transformer-CRF模型:基于Transformers的神经网络结构和条件随机场模型的联合训练,通过提取输入的上下文信息、全局概率建模,结合现有的BERT和RoBERTa预训练模型,在多语种的命名实体识别任务中有很好的表现。
Pre-trained Language Model Fine-tuning (PLM Fine-tuning):该方法是基于预训练模型和微调技术的思想,利用预训练的模型(如BERT、RoBERTa等)作为初始参数,通过在命名实体识别的数据集上进行微调,来提升NER的性能。它可以在少量标注数据上快速训练,并在各种语言和领域中展现出优良的泛化能力。
Neural Architecture Search (NAS):利用神经网络搜索算法和强化学习,生成NN结构,并进行自动化架构搜索。NAS可以使模型具有更好的鲁棒性和泛化性能,并在不使用任何人工特征编码的情况下提高命名实体识别的准确性。
这些算法常用于实际应用中,并取得了良好的效果。当然,还有很多其他的NER算法,如模板匹配、CRF、SVM等,每种算法都有自己的优缺点,需要根据具体场景进行选择和组合。
3.2 小样本下NER
针对小样本问题,可以使用迁移学习或元学习等技术来解决。迁移学习是指将预先训练好的模型应用于新任务中,从而将新任务的训练时间缩短,但前提是预训练模型和待解决的任务有一定的相关性。元学习则是一种针对小样本学习问题的方法,它能够通过学习如何学习来提高模型在少量样本的情况下的泛化能力。
针对小样本NER问题,下面介绍两种常用的小样本模型:
Few-shot learning模型:该模型是一种基于元学习的模型,它可以用较少的数据进行训练,同时在新领域中进行良好的泛化,具有很强的适应性。Few-shot learning的主要思想是利用少量标注数据来训练一个编码器,通过训练来学习具有较好泛化性能的模型。在NER任务中,通过将少量文本做为一个任务,来进行训练,该模型可以在稀缺标注数据的情况下,识别新类别的命名实体。
Adaptive Span模型:该模型可以自适应地在输入序列中发现实体边界,从而进一步提高命名实体识别的性能。它可以利用现有的NER模型和表示学习方法,在少量数据情况下快速训练,并在大规模未标记的数据上表现优秀。Adaptive Span模型实现了端到端的自适应边界预测,它通过动态地选择每个输入序列中的子区间,来预测给定实体类别的标签。
更多文章请关注公重号:汀丶人工智能
3.3 推荐!实体、关系、属性抽取实战项目合集(含智能标注)
实体、关系、属性抽取实战项目合集(含智能标注)
关键词:
-
深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)_资讯推荐
深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实
来源: 深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)_资讯推荐
环球今日报丨Qt 事件系统总结
Web网页端IM产品RainbowChat-Web的v5.0版已发布
【热闻】马斯克嘲讽人工智能:机器学习本质就是统计学
小学生用奶奶手机充值游戏2.9万 法院判决来了 世界视讯
“龙字辈”成员即将加入!长城发布全新硬派SUV 或命名:“翔龙”
河南雷暴大风 半米粗大树连根拔起 外卖小哥伸头躲过一劫
世界快播:蔚来宣布重大决定:免费换电权益解绑 全系车型降价3万
今日播报!村里种的“软黄金”迎来丰收季
每日速读!windows下如何杀掉Tomcat进程
焦点信息:5分钟学会数据结构中的线性链表
Python工具箱系列(三十五) 全球新消息
vue使用 elementUI中el-upload的遇到的问题总结
【新华解读】可转债退市机制逐步完善 未来或迎来“宽进宽出”市场生态_全球新动态
两批次食品不符合国家标准上黑榜 全球快资讯
俩石柱子被五菱一下子撞飞 附近店家感慨:此乃神车
米哈游去年赚了161亿!网友:够再开发十个《原神》了
每日快报!时代变了!未来18个月内 传奇瑞等大量国产车企将进入英国市场
世界速讯:越南因罕见高温遭遇“停电危机”:佳能等企业轮流停电
全球视讯!多种口味:和路雪经典大梦龙多口味雪糕16支88元发车
物联网开源操作系统简介 天天快资讯
Jenkins + Docker 一键自动化部署 Spring Boot 项目,步骤齐全,少走坑路! 全球微动态
甘肃省加快推进交通项目建设 每日快播
《暗黑4》第一件“军帽”在韩服现身 官方证实:最强欧皇诞生 属性无敌
苹果回应Mac Pro弃用AMD显卡:压根就不适配_天天微速讯
VIP体验卡到期!高考后饭菜的反差让人猝不及防:从“吃啥有啥”变“有啥吃啥”
今日报丨windows图片查看器修复(windows图片查看器)
解读投顾新规(一)| 扭转投顾“产品化”倾向 引导行业回归服务本源
【读财报】基金发行透视:年内发行规模同比下降15% 鹏扬、国融基金产品发行失败_全球快资讯
国家助学贷款累计发放超4000亿元 惠及2000多万名学生
曝苹果开发Vision Pro更便宜版本:屏幕、处理器会缩水|世界看热讯
A卡降价太狠 NVIDIA坐不住:RTX 4060将提前上市 2399买吗?|焦点
汽车人险胜蜘蛛侠
产销两旺 新能源车消费涌热潮
读改变未来的九大算法笔记10_读后总结与感想 播报
动力电池回收赛道不断升温 上市公司积极挖掘新蓝海-环球热推荐
全球速读:女子220斤家人为激励减肥奖6万 已减超20斤:网友鼓励加油
当前速递!显卡不买丐版就亏了?到底该怎么选?
电路中的pnp是什么意思(电路中pn结是什么意思) 世界关注
深度学习应用篇-计算机视觉-OCR光学字符识别[7]:OCR综述、常用CRNN识别方法、DBNet、CTPN检测方法等、评估指标、应用场景
面对英特尔大小核CPU AMD调整CPU供货和价格-每日速递
新华三率先推出私域行业大模型:百业灵犀
大师名团密集来京演出,“演艺之都”绽放国际星光 前沿资讯
白蛋白的功效与作用是什么_白蛋白的功效与作用 世界热点
“双万亿”之城、世界工厂……制造业重镇东莞涌现新动能-全球快看
刀锋战士2迅雷下载链接(刀锋战士2迅雷下载)-当前独家
每日热闻!蓝莓树苗怎么种植盆栽_蓝莓树苗怎么种
如果我是清风我将什么续写句子_如果我是清风我将
ps哪个版本最好用2020(ps哪个版本最好用)_全球时快讯
现在满族人的姓氏汉化 满族人的姓氏都有哪些-全球信息
世界观点:电信营业厅电话费_电信营业厅电话
全球热头条丨珠峰被救女士拒绝支付救人费用引争议 登山公司公布遇险原因
引用《道德经》,谈大国分歧,Sam Altman 最新演讲:AI 安全始于足下_环球报道
天天讯息:英媒:经济学家预测美国需至少加息两次才能平息通胀
热推荐:铃木天语sx4二手车(铃木天语sx4隐藏功能是什么?)
从“国家宝藏”到“何以中国”,总台文博类综艺这样创新实践|文化和自然遗产日
【天天播资讯】【技术积累】Java中的泛型【一】
天天亮点!HBase的数据结构原理与使用
Xilinx GTH 简介 ,CoaXpress FPGA PHY 部分-天天短讯
左偏树-环球观点
世界最新:ChatGPT只讲这25个笑话!有90%重复 网友:幽默是人类最后的尊严
环球速讯:火车站按摩椅现大量虫子 商家:每天都有打扫 很少有这种情况
焦点滚动:福建多地为何纷纷成立这一机构?
聚焦:希捷4TB机械硬盘史低 仅售288元
社交综艺为何能成爆款_世界百事通
芯片的战争
这些年,祝勇的“纸上故宫”都在写些什么?|文化观察 天天讯息
List 接口及其常用方法 全球即时看
文心一言 VS 讯飞星火 VS chatgpt (38)-- 算法导论5.4 2题 全球新要闻
吢丕的另一个情侣网名(吢)
环球短讯!最后一艘潜艇电影国语版百度云(最后一艘潜艇电影国语版)
镁条在空气中燃烧发出耀眼的白光(镁条在空气中燃烧)
女朋友不理你怎么办表情包_女朋友不理你怎么办
南京两大厦间现龙卷风:强风至路面闪现火花 每日视点
当前简讯:14代酷睿要来了 英特尔13代酷睿i9包装简化:独特身份消失
预计2025年突破万亿元规模 产学研各方共议储能大赛道
徐州城下城遗址博物馆“上新”
天天热点!金陵十二钗判词及人物(金陵十二钗判词)
每日消息!散水模板工程量怎么计算(算混凝土工程量散水怎么计算)
今日快讯:口腔材料app(口腔材料网)
焦点热议:好高骛远的读音_好高骛远的意思
今日热议:Hbase安装和shell客户端操作
Web安全-渗透测试-信息收集01|全球热文
世界热消息:杯具!上海一小区电动车爆炸起火 家人惨被烧伤:网友吵翻为何电池拿回家充电
莫扎特的一句话(关于莫扎特的话例如说他天真)
世界热点!莫扎特的一句话(关于莫扎特的话例如说他天真)
清远公用品牌IP形象亮相-全球播报
关于铁路计次票、定期票 如何购买使用 环球聚看点
天天视点!多地高温预警 今年618空调没促销降价:还有经销商趁机涨价
龙爸无双100集电视剧免费观看|当前热门
第二届联合国人居大会闭幕 通过“人人享有可负担住房”等决议_百事通
消息!第二届联合国人居大会闭幕 通过“人人享有可负担住房”等决议
中超综合:中超第一阶段结束 上海海港领跑积分榜
中超积分榜:海港领跑三镇仅第8 大连人倒数第一
第34届中国经济新闻奖:21世纪经济报道获评论一等奖、融合报道一等奖 天天精选
全球讯息:武汉到清江画廊旅游攻略_清江画廊旅游攻略
新动态:最美童星长大后惊艳全网!16岁时因“不够性感”被导演刷掉,她霸气怒怼:恶心的猪!
窒息灭火法是指什么_窒息灭火法
全球快资讯:美国旧金山毒品泛滥、暴力犯罪猖獗 市民称正在目睹西方文明崩溃
每日热门:引导资金支持绿色发展 新华碳科技指数发布