搞懂CRF

文章目录

    • 1 前言
    • 2 Log-linear model
    • 3 MEMM
      • 3.1 模型概述
      • 3.2 label bias问题
    • 4 CRF
      • 4.1 模型概述
      • 4.2 模型训练
      • 4.3 模型解码
      • 4.4 小结
    • 参考资料

1 前言

条件随机场(conditional random field, CRF)是在建立序列模型时的常用模块,它的本质就是描述观测到的序列xˉ\bar{x}xˉ对应的状态序列yˉ\bar{y}yˉ的概率,记作P(yˉ∣xˉ)P(\bar{y}|\bar{x})P(yˉxˉ)。这里字符上的横线表示这是一个序列,下文中所有的序列都会带这个横线,不带横线就不是序列。

它是HMM的升级版,如果不熟悉HMM的话,建议看我的搞懂HMM这篇文章,不看那篇,直接看这篇关系也不大。

提出CRF是为了改进MEMM(maximum-entropy Markov model)的label bias问题,而提出MEMM是为了打破HMM的观测独立性假设。这些在下文中会进一步说明。

本文主要是参考了Log-Linear Models, MEMMs, and CRFs,其中会额外补充一些东西,并加入自己的一些理解。

2 Log-linear model

CRF的源头就是Log-linear model,是由它一点点改进过来的。

我们先假设观测变量为xxx,观测集合为XXX,有x∈Xx \in XxX,比如xxx是一个单词;状态变量为yyy,状态集合为YYY,有y∈Yy \in YyY,比如yyy是某种词性;提取特征的函数向量为ϕˉ(x,y)\bar{\phi}(x, y)ϕˉ(x,y),这里带了横线,表示有多个函数;函数之间的权重为wˉ\bar{w}wˉ。那么在给定xxx的情况下,yyy的概率为(比如单词xxx是词性yyy的概率)

p(y∣x;wˉ)=exp(wˉ⋅ϕˉ(x,y))∑y′∈Yexp(wˉ⋅ϕˉ(x,y′))(2-1)p(y|x;\bar{w}) = \frac{exp(\bar{w} \cdot \bar{\phi}(x, y))}{\sum_{y' \in Y} exp(\bar{w} \cdot \bar{\phi}(x, y'))} \tag{2-1} p(yx;wˉ)=yYexp(wˉϕˉ(x,y))exp(wˉϕˉ(x,y))(2-1)

(2−1)(2-1)(21)的分子表示给定xxx时,yyy取某个值时的指数计算式;分母表示表示给定xxx时,yyy取所有情况的指数计算式之和。说白了就是一个归一化的操作。

使用指数expexpexp是为了保证概率都是正的,wˉ⋅ϕˉ(x,y)\bar{w} \cdot \bar{\phi}(x, y)wˉϕˉ(x,y)可正可负。

显而易见,在这种定义下可以保证

∑y∈Yp(y∣x;wˉ)=1(2-2)\sum_{y \in Y} p(y|x;\bar{w}) = 1 \tag{2-2} yYp(yx;wˉ)=1(2-2)

假设我们有nnn组有标签的数据{(xi,yi)}i=1n\{(x_i, y_i)\}_{i=1}^{n}{(xi,yi)}i=1n,这里还没有涉及到序列,可以理解为一个单词xix_ixi对应一个词性yiy_iyi的数据集。

我们的目的是调整模型的参数wˉ\bar{w}wˉ,使得出现数据集这样的标签对应情况的可能性最大,也就是

wˉ∗=argmax⁡wˉ∏i=1np(yi∣xi;wˉ)(2-3)\bar{w}^* = arg \max_{\bar{w}} \prod_{i=1}^n p(y_i|x_i;\bar{w}) \tag{2-3} wˉ=argwˉmaxi=1np(yixi;wˉ)(2-3)

为了方便计算,通常会取对数,即

wˉ∗=argmax⁡wˉ∑i=1nlog(p(yi∣xi;wˉ))(2-4)\bar{w}^* = arg \max_{\bar{w}} \sum_{i=1}^n log(p(y_i|x_i;\bar{w})) \tag{2-4} wˉ=argwˉmaxi=1nlog(p(yixi;wˉ))(2-4)

通常为了不让模型学偏,把wˉ\bar{w}wˉ学的特别大来糊弄过去,还会加一个正则项

wˉ∗=argmax⁡wˉ∑i=1nlog(p(yi∣xi;wˉ))−λ2∣∣wˉ∣∣2(2-5)\bar{w}^* = arg \max_{\bar{w}} \sum_{i=1}^n log(p(y_i|x_i;\bar{w})) - \frac{\lambda}{2}||\bar{w}||^2\tag{2-5} wˉ=argwˉmaxi=1nlog(p(yixi;wˉ))2λwˉ2(2-5)

这也就是损失函数,有了损失函数之后就可以用梯度下降的方法求参数wˉ∗\bar{w}^*wˉ了。

这只是针对于非序列的数据集。

3 MEMM

3.1 模型概述

MEMM(maximum-entropy Markov model)进一步将问题从p(y∣x)p(y|x)p(yx)转变为p(yˉ∣xˉ)p(\bar{y}|\bar{x})p(yˉxˉ),也可以写成

p(y1,y2,...,ym∣x1,x2,...,xm)(3-1)p(y^1, y^2, ..., y^m|x^1, x^2, ..., x^m) \tag{3-1} p(y1,y2,...,ymx1,x2,...,xm)(3-1)

其中,xjx^jxj表示序列中的第jjj个token,比如一句话中的第jjj个单词;yjy^jyj表示序列中的第jjj个标签,比如一句话中的第jjj个单词的词性;mmm表示序列的长度。

YYY表示所有可能的标签集合,这是一个有限的集合,yj∈Yy^j \in YyjY

将式(3−1)(3-1)(31)用条件概率进行变换就有

p(y1,y2,...,ym∣x1,x2,...,xm)=∏j=1mp(yj∣y1,...,yj−1,x1,...,xm)(3-2)p(y^1, y^2, ..., y^m|x^1, x^2, ..., x^m) = \prod_{j=1}^m p(y^j|y^1, ..., y^{j-1}, x^1, ..., x^m) \tag{3-2} p(y1,y2,...,ymx1,x2,...,xm)=j=1mp(yjy1,...,yj1,x1,...,xm)(3-2)

(3−2)(3-2)(32)仅仅是一堆条件概率,这是必然成立的,没有任何假设。我们如果把HMM中的齐次马尔可夫假设放到这里来,认为yjy^jyj只受yj−1y^{j-1}yj1的影响,那么就有

p(y1,y2,...,ym∣x1,x2,...,xm)=∏j=1mp(yj∣yj−1,x1,...,xm)(3-3)p(y^1, y^2, ..., y^m|x^1, x^2, ..., x^m) = \prod_{j=1}^m p(y^j|y^{j-1}, x^1, ..., x^m) \tag{3-3} p(y1,y2,...,ymx1,x2,...,xm)=j=1mp(yjyj1,x1,...,xm)(3-3)

这里仍旧认为yjy^jyj受所有xjx^jxj的影响,这就打破了HMM中的观测独立假设。这是一个在很多任务中不合理的假设,所以MEMM算是对HMM做了改进。画成概率图就是

MEMM概率图

图3-1 MEMM概率图

有很多的CRF的文章都是从概率图开始讲的,但其实根本没有必要,不是先有了图3-1才有了式(3−3)(3-3)(33),而是先有了式(3−3)(3-3)(33)才有了图3-1,图3-1仅仅只是让式(3−1)(3-1)(31)看起来更方便了。不知道概率图,一点关系都没有。

不过既然画了概率图,也顺嘴说一句,MEMM的概率图和HMM的概率图的区别就在于xxx的箭头方向反了,从生成模型变成了判别式模型;以及MEMM是所有的xxx指向每一个yjy^jyj,而HMM是xjx^jxj指向yjy^jyj,打破了观测独立假设。

好,回到式(3−3)(3-3)(33),利用log-linear model进行建模,就有
p(yj∣yj−1,x1,...,xm)=exp(wˉ⋅ϕˉ(x1,...,xm,j,yj−1,yj))∑y′∈Yexp(wˉ⋅ϕˉ(x1,...,xm,j,yj−1,y′))(3-4)p(y^j|y^{j-1}, x_1, ..., x_m) = \frac{exp(\bar{w} \cdot \bar{\phi}(x^1,...,x^m, j, y^{j-1}, y^{j}))}{\sum_{y' \in Y} exp(\bar{w} \cdot \bar{\phi}(x^1,...,x^m, j, y^{j-1}, y'))} \tag{3-4} p(yjyj1,x1,...,xm)=yYexp(wˉϕˉ(x1,...,xm,j,yj1,y))exp(wˉϕˉ(x1,...,xm,j,yj1,yj))(3-4)

注意对比一下式(3−4)(3-4)(34)和式(2−1)(2-1)(21)的区别,就是条件概率中的条件变了。

将式(3−4)(3-4)(34)代入式(3−3)(3-3)(33)就有

p(y1,y2,...,ym∣x1,x2,...,xm)=∏j=1mexp(wˉ⋅ϕˉ(x1,...,xm,j,yj−1,yj))∑y′∈Yexp(wˉ⋅ϕˉ(x1,...,xm,j,yj−1,y′))(3-5)p(y^1, y^2, ..., y^m|x^1, x^2, ..., x^m) =\\ \prod_{j=1}^m \frac{exp(\bar{w} \cdot \bar{\phi}(x^1,...,x^m, j, y^{j-1}, y^{j}))}{\sum_{y' \in Y} exp(\bar{w} \cdot \bar{\phi}(x^1,...,x^m, j, y^{j-1}, y'))} \tag{3-5} p(y1,y2,...,ymx1,x2,...,xm)=j=1myYexp(wˉϕˉ(x1,...,xm,j,yj1,y))exp(wˉϕˉ(x1,...,xm,j,yj1,yj))(3-5)

这里在训练模型的时候,不是拿式(3−5)(3-5)(35)这个大家伙去训练的,而是训练p(yj∣yj−1,x1,...,xm)p(y^j|y^{j-1}, x_1, ..., x_m)p(yjyj1,x1,...,xm)这个模型。

有了p(yj∣yj−1,x1,...,xm)p(y^j|y^{j-1}, x_1, ..., x_m)p(yjyj1,x1,...,xm)之后,任何的xxxyj−1y^{j-1}yj1yjy^jyj进来都可以输出一个概率值,问题就变成了如何decoding,如何推理,即求

argmax⁡y1,..,ymp(y1,..,ym∣x1,...,xm)(3-6)arg\max_{y^1, .., y^m} p(y_1, .., y^m | x^1, ..., x^m) \tag{3-6} argy1,..,ymmaxp(y1,..,ymx1,...,xm)(3-6)

如果我们假设YYY集合中有kkk个元素的话,那么y1,...,ymy^1, ..., y^my1,...,ym就有kmk^mkm种组合,这样的计算量就太大了。这个时候,就要用动态规划了,这里的动态规划有一个自己的名字,叫做viterbi算法,其实就是动态规划。

我们会建立一个矩阵π[j,y]\pi [j, y]π[j,y]j=1,...,mj=1,...,mj=1,...,m并且y∈Yy \in YyYπ[j,y]\pi [j, y]π[j,y]存储了在第jjj个位置,状态取yyy时的最大概率值和得到该概率值的序列y1,..,yjy^1, .., y^jy1,..,yj。可以表示为

π[j,y]=max⁡y1,...,yj−1(p(y∣yj−1,x1,...,xm)∏k=1j−1p(yk∣yk−1,x1,...,xm))(3-7)\pi[j, y] = \max_{y^1, ..., y^{j-1}}(p(y|y^{j-1}, x^1, ..., x^m) \prod_{k=1}^{j-1}p(y^k|y^{k-1}, x^1, ..., x^m)) \tag{3-7} π[j,y]=y1,...,yj1max(p(yyj1,x1,...,xm)k=1j1p(ykyk1,x1,...,xm))(3-7)

其中,最开始的为初始变量,相当于HMM中的初始概率

π[1,y]=p(y∣y0,x1,...,xm)(3-8)\pi[1, y] = p(y | y^0, x^1, ..., x^m) \tag{3-8} π[1,y]=p(yy0,x1,...,xm)(3-8)

y0y^0y0就是"<START>"这样的起始token。

之后是通过迭代得到的

π[j,y]=max⁡y′∈Y(π[j−1,y′]⋅p(y∣y′,x1,...,xm))(3-9)\pi[j, y] = \max_{y' \in Y}(\pi[j-1, y'] \cdot p(y|y', x^1, ..., x^m)) \tag{3-9} π[j,y]=yYmax(π[j1,y]p(yy,x1,...,xm))(3-9)

π[j,y]\pi[j, y]π[j,y]这个矩阵填满之后,就有

max⁡y1,...,ymp(y1,...,ym∣x1,...,xm)=max⁡yπ[m,y](3-10)\max_{y^1, ..., y^m}p(y^1, ..., y^m | x^1, ..., x^m) = \max_{y} \pi[m, y] \tag{3-10} y1,...,ymmaxp(y1,...,ymx1,...,xm)=ymaxπ[m,y](3-10)

MEMM相比于HMM的优势在于

  • 观测变量不再独立
  • 可以自行设计ϕˉ\bar{\phi}ϕˉ,对结果更可控

3.2 label bias问题

MEMM也存在自身的问题,这个问题被称为label bias问题,故名思义,这是由于训练数据标签的不平衡所导致的,如果训练数据足够大,标签足够平衡,就没有这个问题。出现这个问题的根本原因就是p(yj∣yj−1,x1,...,xm)p(y^j|y^{j-1}, x^1, ..., x^m)p(yjyj1,x1,...,xm)是在每个时间节点都做了一次归一化,丢失了一些信息。

下面举个例子来试着说明一下,只要有一个直观的理解就可以了,不要太纠结例子的合理性。

假设我们通过训练得到了下图3-2这样的一张概率值推理图,我们输入[“the”, “cat”, “sat”],可以发现[“ARTICLE”, “NOUN”, “VERB”]这样的概率是最高的,有1.0∗0.9∗1.0=0.91.0*0.9*1.0=0.91.00.91.0=0.9
概率值推理图

图3-2 概率值推理图

但是,当我们的输入是[“cat”, “sat”]的时候,就会发现[“NOUN”, “VERB”]的概率只有0.1∗1.0=0.10.1*1.0=0.10.11.0=0.1,而[“ARTICLE”, “NOUN”]的概率有0.9∗0.3=0.270.9*0.3=0.270.90.3=0.27。这是因为以"cat"为开头的句子,模型见的很少。如果可以在计算当中把模型见的很少这个信息也带上的,就可以避免这个问题了。

下面来看下图3-2对应的逻辑图,如下图3-3所示,就是没有归一化的图。
逻辑值推理图

图3-3 逻辑值推理图

归一化是exe^xex这样的指数归一化,可以动手算下看,是和图3-2的概率值对应上的。这里[“cat”, “sat”]这个例子的[“NOUN”, “VERB”]就是3+100=1033+100=1033+100=103,而[“ARTICLE”, “NOUN”]就变成了5+21=265+21=265+21=26。用加法是因为这里都是log值。

这里就说这么多,只是给个直观的理解,想要细究的,可以看下The Label Bias Problem,或是自行搜一下其他大佬是怎么说的。

4 CRF

4.1 模型概述

有了前面那么多的铺垫,CRF(conditional random filed)就很容易理解了。MEMM是对式(3−4)(3-4)(34)进行建模,而CRF是对式(4−1)(4-1)(41)进行建模

p(y1,...,ym∣x1,...,xm)=p(yˉ∣xˉ)(4-1)p(y^1, ..., y^m|x^1, ..., x^m) = p(\bar{y}|\bar{x}) \tag{4-1} p(y1,...,ymx1,...,xm)=p(yˉxˉ)(4-1)

注意式(2−1)(2-1)(21),式(3−4)(3-4)(34)和式(4−1)(4-1)(41)的区别。CRF没有局部的归一化了,只有全局的归一化,说白了就是一个考虑序列的log-linear模型。

p(yˉ∣xˉ;wˉ)=exp(wˉ⋅Φˉ(xˉ,yˉ))∑yˉ′∈Ymexp(wˉ⋅Φˉ(xˉ,yˉ′))(4-2)p(\bar{y}|\bar{x};\bar{w}) = \frac{exp(\bar{w} \cdot \bar{\Phi}(\bar{x}, \bar{y}))}{\sum_{\bar{y}' \in Y^m} exp(\bar{w} \cdot \bar{\Phi}(\bar{x}, \bar{y}'))} \tag{4-2} p(yˉxˉ;wˉ)=yˉYmexp(wˉΦˉ(xˉ,yˉ))exp(wˉΦˉ(xˉ,yˉ))(4-2)

其中,YmY^mYm表示用YYY中的元素组成长度为mmm的序列的所有可能的序列集合。

这里还把ϕˉ\bar{\phi}ϕˉ变成了Φˉ\bar{\Phi}ΦˉΦˉ\bar{\Phi}Φˉ的定义为

Φˉ(xˉ,yˉ)=∑j=1mϕˉ(xˉ,j,yj−1,yj)(4-3)\bar{\Phi}(\bar{x}, \bar{y}) = \sum_{j=1}^{m} \bar{\phi}(\bar{x}, j, y^{j-1}, y^{j}) \tag{4-3} Φˉ(xˉ,yˉ)=j=1mϕˉ(xˉ,j,yj1,yj)(4-3)

这里的ϕˉ(xˉ,j,yj−1,yj)\bar{\phi}(\bar{x}, j, y_{j-1}, y^{j})ϕˉ(xˉ,j,yj1,yj)和MEMM中的是一模一样的,都是人为定义的特征函数。只不过是把整个序列的都加到了一起。

CRF的概率图模型如下图4-1所示,它和图3-1的区别是,yjy^jyj之间变成了无向图。还是那句话,不看这个图也没问题。
CRF概率图

图4-1 CRF概率图

4.2 模型训练

CRF的模型训练和log-linear模型的方法基本一致。简而言之,就是我们有nnn条训练样本{(xˉi,yˉi)}i=1n\{(\bar{x}_i, \bar{y}_i)\}_{i=1}^n{(xˉi,yˉi)}i=1n,每个xˉi\bar{x}_ixˉi都是序列xi1,...,ximx_i^{1}, ..., x_i^{m}xi1,...,xim,每个yˉi\bar{y}_iyˉi也都是序列yi1,...,yimy_i^{1}, ..., y_i^{m}yi1,...,yim

其目标函数为

wˉ∗=argmax⁡wˉ∑i=1nlog(p(yˉi∣xˉi;wˉ))−λ2∣∣wˉ∣∣2(4-4)\bar{w}^* = arg \max_{\bar{w}} \sum_{i=1}^n log(p(\bar{y}_i|\bar{x}_i;\bar{w})) - \frac{\lambda}{2}||\bar{w}||^2 \tag{4-4} wˉ=argwˉmaxi=1nlog(p(yˉixˉi;wˉ))2λwˉ2(4-4)

接下来的任务就交给梯度下降就可以了。

4.3 模型解码

CRF进行decoding目标是

argmax⁡yˉ∈Ymp(yˉ∣xˉ;wˉ)=argmax⁡yˉ∈Ymexp(wˉ⋅Φˉ(xˉ,yˉ))∑y′∈Yexp(wˉ⋅Φˉ(xˉ,yˉ′))=argmax⁡yˉ∈Ymexp(wˉ⋅Φˉ(xˉ,yˉ))=argmax⁡yˉ∈Ymwˉ⋅Φˉ(xˉ,yˉ)=argmax⁡yˉ∈Ym∑j=1mwˉ⋅ϕˉ(xˉ,j,yj−1,yj)(4-5)\begin{aligned} arg\max_{\bar{y} \in Y^m} p(\bar{y}|\bar{x};\bar{w}) &= arg\max_{\bar{y} \in Y^m} \frac{exp(\bar{w} \cdot \bar{\Phi}(\bar{x}, \bar{y}))}{\sum_{y' \in Y} exp(\bar{w} \cdot \bar{\Phi}(\bar{x}, \bar{y}'))} \\ &= arg\max_{\bar{y} \in Y^m} exp(\bar{w} \cdot \bar{\Phi}(\bar{x}, \bar{y}))\\ &= arg\max_{\bar{y} \in Y^m} \bar{w} \cdot \bar{\Phi}(\bar{x}, \bar{y}) \\ &= arg\max_{\bar{y} \in Y^m} \sum_{j=1}^{m} \bar{w} \cdot \bar{\phi}(\bar{x}, j, y^{j-1}, y^{j}) \end{aligned} \tag{4-5} argyˉYmmaxp(yˉxˉ;wˉ)=argyˉYmmaxyYexp(wˉΦˉ(xˉ,yˉ))exp(wˉΦˉ(xˉ,yˉ))=argyˉYmmaxexp(wˉΦˉ(xˉ,yˉ))=argyˉYmmaxwˉΦˉ(xˉ,yˉ)=argyˉYmmaxj=1mwˉϕˉ(xˉ,j,yj1,yj)(4-5)

ϕˉ(xˉ,j,yj−1,yj)\bar{\phi}(\bar{x}, j, y^{j-1}, y^{j})ϕˉ(xˉ,j,yj1,yj)有一部分是和yj−1y^{j-1}yj1有关的,称为转移特征;还有一部分是和yj−1y^{j-1}yj1无关的,称为状态特征。这里杂到一起了,可以不用关心。

解码的方法还是用的动态规划,同样定义一个π[j,s]\pi[j, s]π[j,s]

初始概率为

π[1,y]=wˉ⋅ϕˉ(xˉ,1,y0,y)(4-6)\pi[1, y] = \bar{w} \cdot \bar{\phi}(\bar{x}, 1, y^{0}, y) \tag{4-6} π[1,y]=wˉϕˉ(xˉ,1,y0,y)(4-6)

概率的迭代式为

π[j,y]=max⁡y′∈Y(π[j−1,y′]+wˉ⋅ϕˉ(xˉ,j,y′,y))(4-6)\pi[j, y] = \max_{y' \in Y} (\pi [j-1, y'] + \bar{w} \cdot \bar{\phi}(\bar{x}, j, y', y)) \tag{4-6} π[j,y]=yYmax(π[j1,y]+wˉϕˉ(xˉ,j,y,y))(4-6)

求出所有的π[j,y]\pi[j, y]π[j,y]之后,就可以得到概率最大的那条路径

max⁡y1,...,ym∑j=1mwˉ⋅ϕ(xˉ,j,yj−1,yj)=max⁡yπ[m,s](4-7)\max_{y^1, ..., y^m} \sum_{j=1}^{m} \bar{w} \cdot \phi (\bar{x}, j, y^{j-1}, y^j) = \max_{y} \pi[m, s] \tag{4-7} y1,...,ymmaxj=1mwˉϕ(xˉ,j,yj1,yj)=ymaxπ[m,s](4-7)

4.4 小结

CRF既解决了HMM观测独立不合理的问题,也解决的MEMM中label bias的问题,并且可以手动加入特征函数来干预模型的输出,有些不可能的情况,可以手动把转移概率设得很小即可。

一般会把CRF加在Bi-LSTM之后,让序列模型的输出更可控。如果数据够多,且够均衡的话,CRF也是可以不加的。

参考资料

[1] Log-Linear Models, MEMMs, and CRFs
[2] https://anxiang1836.github.io/2019/11/05/NLP_From_HMM_to_CRF/
[3] https://pytorch.org/tutorials/beginner/nlp/advanced_tutorial.html
[4] https://www.bilibili.com/video/BV19t411R7QU?p=4&share_source=copy_web
[5] The Label Bias Problem

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

skywalking 安装_SkyWalking全链路追踪利器

随着目前系统架构的复杂度越来越高(中台、微服务)&#xff0c;并且线上应用的多级监控覆盖到了通讯、应用处理过程监控并且实现端到端的应用监测&#xff0c;线上性能故障的快速定位修复&#xff1b;而传统的监控分析方式已经无法满足我们的需求&#xff0c;因此许多强大的APM工…

二十九、PHP框架Laravel学习笔记——Debugbar 调试器

二&#xff0e;安装使用 通过 composer 在项目中安装 Debugbar&#xff0c;命令如下&#xff1a; composer require barryvdh/laravel-debugbar 生成一个配置文件&#xff0c;给用户配置&#xff0c;可以根据需求进行配置&#xff1b; php artisan vendor:publish --provider…

论文阅读 - Video Swin Transformer

文章目录1 概述2 模型介绍2.1 整体架构2.1.1 backbone2.1.2 head2.2 模块详述2.2.1 Patch Partition2.2.2 3D Patch Merging2.2.3 W-MSA2.2.4 SW-MSA2.2.5 Relative Position Bias3 模型效果参考资料1 概述 Vision Transformer是transformer应用到图像领域的一个里程碑&#x…

rocketmq queue_RocketMQ 实战(三) - 消息的有序性

■ RocketMQ有序消息的使用1 为什么需要消息的有序性比如用户张三终于挣了一百存在在银行卡里存取款,对应两个异步的短信消息,肯定要保证先存后取吧,不然都没钱怎么发了取钱的消息呢! M1 - 存钱 M2 - 取钱而mq默认发消息到不同q显然是行不通的,会乱序 需要发往同一个q,先进先出…

三十、PHP框架Laravel学习笔记——模型的预加载

一&#xff0e;预加载 预加载&#xff0c;就是解决关联查询中产生的 N1 次查询带来的资源消耗我们要获取所有书籍的作者(或拥有者)&#xff0c;普通查询方案如下&#xff1a; //获取所有书籍列表 $books Book::all(); //遍历每一本书 foreach ($books as $book) { //每一本…

论文阅读:Spatial Transformer Networks

文章目录1 概述2 模型说明2.1 Localisation Network2.2 Parameterised Sampling Grid3 模型效果参考资料1 概述 CNN的机理使得CNN在处理图像时可以做到transition invariant&#xff0c;却没法做到scaling invariant和rotation invariant。即使是现在火热的transformer搭建的图…

dataframe 排序_疯狂Spark之DataFrame创建方式详解一(九)

创建DataFrame的几种方式1、读取json格式的文件创建DataFrame注意&#xff1a;1. json文件中的json数据不能嵌套json格式数据。2. DataFrame是一个一个Row类型的RDD&#xff0c;df.rdd()/df.javaRdd()。3. 可以两种方式读取json格式的文件。4. df.show()默认显示前20行数据。5.…

【原】npm 常用命令详解

今年上半年在学习gulp的使用&#xff0c;对npm的掌握是必不可少的&#xff0c;经常到npm官网查询文档让我感到不爽&#xff0c;还不如整理了一些常用的命令到自己博客上&#xff0c;于是根据自己的理解简单翻译过来&#xff0c;终于有点输出&#xff0c;想学习npm这块的朋友不可…

论文阅读 - CRNN

文章目录1 概述2 模型介绍2.1 输入2.2 Feature extraction2.3 Sequence modeling2.4 Transcription2.4.1 训练部分2.4.2 预测部分3 模型效果参考资料1 概述 CRNN(Convolutional Recurrent Neural Network)是2015年华科的白翔老师团队提出的&#xff0c;直至今日&#xff0c;仍…

python easygui_Python里的easygui库

想要用python开发一些简单的图形界面&#xff0c;于是接触了easygui库&#xff0c;由于这是新手教程&#xff0c;我会把它写的尽量简单&#xff0c;希望大家都能看懂。1.msgboxmsgbox( )有一个标题&#xff0c;内容和一个ok键(是可以更改的)。举个例子&#xff1a;import easyg…

recv发送失败 缓冲区太小_从 GFS 失败的架构设计来看一致性的重要性

作者简介 陈东明&#xff0c;饿了么北京技术中心架构组负责人&#xff0c;负责饿了么的产品线架构设计以及饿了么基础架 构研发工作。曾任百度架构师&#xff0c;负责百度即时通讯产品的架构设计。具有丰富的大规模系统构 建和基础架构的研发经验&#xff0c;善于复杂业务需求下…

好用的记事本_分类记事本软件哪个好用?大家推荐一个苹果手机用的分类记事本便签呗...

随着“互联网”的发展&#xff0c;现在都开始在软件上记事备忘了。那么&#xff0c;都有哪些好用的记事本软件可以选择使用呢&#xff1f;大家在选择记事本软件的时候&#xff0c;都有哪些标准呢&#xff1f;不知道大家的标准是什么&#xff0c;小编有一个不能妥协的标准&#…

bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能

本节是建立在上节的基础上&#xff0c;上一节给大家讲了管理后台表格如何展示数据&#xff0c;但是当我们的数据比较多的时候我们就需要做分页处理了。这一节给大家讲解如何实现表格数据的分页显示。准备工作1&#xff0c;项目要引入freemarker和bootstrap&#xff0c;如果不知…

1+X web中级 Laravel学习笔记——查询构造器简介及新增、更新、删除、查询数据

一、新增数据 插入多条数据&#xff1a; 二、更新数据 更新某条数据&#xff1a; 自增某字段的值&#xff1a; 自减某字段的值&#xff1a; 自增的同时改变其他字段的值&#xff1a; 三、删除数据 四、查询 查面构造器查面数据 有以下几种方法 get&#xff08;&…

【HTML5】Canvas画布

什么是 Canvas&#xff1f; HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。 画布是一个矩形区域&#xff0c;您可以控制其每一像素。 canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 * 添加 canvas 元素。规定元素的 id、宽度和高度&#xff1a; &l…

SynthText流程解读 - 不看代码不知道的那些事

文章目录1 概述2 流程解读2.1 生成文字mask2.2 plane2xyz的bug2.3 文字上色2.4 图像融合参考资料1 概述 SynthText是OCR领域生成数据集非常经典&#xff0c;且至今看来无人超越的方法。整体可以分为三个大的步骤&#xff0c;分别是生成文字的mask&#xff0c;这里用到了图像的…