【转载】JoSE:球面上的词向量和句向量

2023-10-31 14:10
文章标签 转载 向量 球面 jose

本文主要是介绍【转载】JoSE:球面上的词向量和句向量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【转载】JoSE:球面上的词向量和句向量

本文转载自科学空间 Blog:

苏剑林. (Nov. 11, 2019). 《JoSE:球面上的词向量和句向量 》[Blog post].

这篇文章介绍一个发表在NeurIPS 2019的做词向量和句向量的模型JoSE(Joint Spherical Embedding),论文名字是《Spherical Text Embedding》。JoSE模型思想上和方法上传承自Doc2Vec,评测结果更加漂亮,但写作有点故弄玄虚之感。不过笔者决定写这篇文章,是因为觉得里边的某些分析过程有点意思,可能会对一般的优化问题都有些参考价值。

优化目标

在思想上,这篇文章基本上跟Doc2Vec是一致的:为了训练句向量,把句子用一个id表示,然后把它也当作一个词,跟句内所有的词都共现,最后训练一个Skip Gram模型,训练的方式都是基于负采样的。跟Doc2Vec不一样的是,JoSE将全体向量的模长都归一化了(也就是只考虑单位球面上的向量),然后训练目标没有用交叉熵,而是用hinge loss:

max ⁡ ( 0 , m − cos ⁡ ( u , v ) − cos ⁡ ( u , d ) + cos ⁡ ( u ′ , v ) + cos ⁡ ( u ′ , d ) ( 1 ) \max(0, m - \cos(\boldsymbol{u}, \boldsymbol{v}) - \cos(\boldsymbol{u}, \boldsymbol{d}) + \cos(\boldsymbol{u}', \boldsymbol{v}) + \cos(\boldsymbol{u}', \boldsymbol{d})\quad(1) max(0,mcos(u,v)cos(u,d)+cos(u,v)+cos(u,d)(1)

其中 u u u是“中心词”的词向量, v v v是“上下文词”的词向量,它们分别来自两套词向量空间, d d d则是当前句的句向量,而 u ′ u^\prime u负采样得到的“中心词”词向量,最后的 m m m是一个常数。以前做相似度模型的读者应该能很轻松读懂这个优化目标的含义,它就是希望句子内的“词-词-句”打分 cos ⁡ ( u , v ) + cos ⁡ ( u , d ) \cos(u,v)+\cos(u,d) cos(u,v)+cos(u,d)要高于“词-随机词-句”打分 cos ⁡ ( u ′ , v ) + cos ⁡ ( u ′ , d ) \cos(u′,v)+\cos(u′,d) cos(u,v)+cos(u,d),但不需要太高,只要高出 m m m就行了。

假定 u , v , d u,v,d u,v,d都已经归一化的情况下,那么目标(1)就是(每个向量被假设为列向):

max ⁡ ( 0 , m − v ⊤ u − d ⊤ u + v ⊤ u ′ + d ⊤ u ′ ) ( 2 ) \max(0, m - \boldsymbol{v}^{\top}\boldsymbol{u} - \boldsymbol{d}^{\top}\boldsymbol{u} + \boldsymbol{v}^{\top} \boldsymbol{u}' + \boldsymbol{d}^{\top} \boldsymbol{u}')\quad(2) max(0,mvudu+vu+du)(2)

梯度下降

目标(1)或(2)其实并没有什么新鲜之处,跟大多数词向量的目标类似,都是用内积衡量词的相关性,只不过这里的向量归一化过,所以内积就是 cos ⁡ \cos cos,至于hinge loss和交叉熵孰优孰劣,我倒觉得不会有什么太大差别。

事实上,笔者觉得文章比较有意思的是它后面对梯度的几何分析,在这里笔者用自己的话重复一下求解过程。设 x x x是全体 u , v , d u,v,d u,v,d向量中的其中一个,然后假设现在固定所有的其他向量,只优化 x x x,设总的loss为 f ( x ) f(x) f(x),那这个优化过程有两种描述方式:

arg ⁡ min ⁡ x , ∥ x ∥ = 1 f ( x ) 或 arg ⁡ min ⁡ θ f ( θ ∥ θ ∥ ) ( 3 ) \mathop{\arg\min}_{\boldsymbol{x},\,\Vert\boldsymbol{x}\Vert=1} f(\boldsymbol{x})\quad\text{或}\quad \mathop{\arg\min}_{\boldsymbol{\theta}} f\left(\frac{\boldsymbol{\theta}}{\Vert \boldsymbol{\theta}\Vert}\right) \quad(3) argminx,x=1f(x)argminθf(θθ)(3)

也就是说,我们可以将这个问题理解为带有约束 ∥ x ∥ = 1 ∥x∥=1 x=1 f ( x ) f(x) f(x)最小化问题,也可以通过设x=θ/∥θ∥x=θ/‖θ‖将它转化为无约束的 f ( θ ‖ θ ‖ ) f(\frac{θ}{‖θ‖}) f(θθ)最小化问题。由于带约束的优化问题我们不熟悉,所以只好按照后一种方式来理解。

复杂模型不同的是,词向量算是一个比较简单的模型,所以我们最好手动求出它的梯度形式,然后编写对应函数进行梯度下降来优化,而不借助于一些自动求导工具。对于 f ( θ ∥ θ ∥ ) f(\frac{θ}{\|θ\|}) f(θθ),我们不难求得:

∇ θ f ( θ ∥ θ ∥ ) = 1 ∥ θ ∥ ( I − x x ⊤ ) ∇ x f ( x ) ( 4 ) \nabla_{\boldsymbol{\theta}}\,f\left(\frac{\boldsymbol{\theta}}{\Vert \boldsymbol{\theta}\Vert}\right) = \frac{1}{\Vert\boldsymbol{\theta}\Vert}\left(\boldsymbol{I} - \boldsymbol{x}\boldsymbol{x}^{\top}\right)\nabla_{\boldsymbol{x}}\,f\left(\boldsymbol{x}\right) \quad(4) θf(θθ)=θ1(Ixx)xf(x)(4)

(详细过程为 ∇ θ f ( θ ∥ θ ∥ ) = ∇ x f ( x ) ⋅ ∇ θ ( θ ∥ θ ∥ ) = ∇ x f ( x ) ⋅ I ⋅ ∥ θ ∥ − θ ∥ θ ∥ ⋅ θ ⊤ ∥ θ ∥ 2 = 1 ∥ θ ∥ ( I − x x ⊤ ) ⋅ ∇ x f ( x ) \nabla_{\boldsymbol{\theta}}\,f\left(\frac{\boldsymbol{\theta}}{\Vert \boldsymbol{\theta}\Vert}\right) =\nabla_{x}f(x)\cdot\nabla_{\theta}({\frac{\theta}{\|\theta\|}})=\nabla_{x}f(x)\cdot\frac{I\cdot\|\theta\|-\frac{\theta}{\|\theta\|}\cdot\theta^{\top}}{\|\theta\|^2}=\frac{1}{\|\theta\|}(I-xx{\top})\cdot \nabla_{x}f(x) θf(θθ)=xf(x)θ(θθ)=xf(x)θ2Iθθθθ=θ1(Ixx)xf(x),其中 ( ∥ θ ∥ ) ′ = θ ∥ θ ∥ (\|\theta\|)^{\prime}=\frac{\theta}{\|\theta\|} (θ)=θθ,看作标量 ( θ 1 2 + θ 2 2 + ⋯ + θ n 2 ) ′ = θ i θ 1 2 + θ 2 2 + ⋯ + θ n 2 (\sqrt{\theta_1^2+\theta_2^2+\cdots+\theta_n^2})^{\prime}=\frac{\theta_i}{\sqrt{\theta_1^2+\theta_2^2+\cdots+\theta_n^2}} (θ12+θ22++θn2 )=θ12+θ22++θn2 θi

根据上述结果,梯度下降的迭代公式为:

θ t + 1 = θ t − η t ( I − x t x t ⊤ ) ∇ x t f ( x t ) ( 5 ) \boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_{t} - \eta_t\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right) \quad(5) θt+1=θtηt(Ixtxt)xtf(xt)(5)

其中 η t \eta_t ηt是当前时刻的学习率,而因 1 ‖ θ ‖ \frac{1}{‖θ‖} θ1由于只是个标量,所以被整合到学习率中了。然后我们也可以写出:

x t + 1 = θ t + 1 ∥ θ t + 1 ∥ = θ t − η t ( I − x t x t ⊤ ) ∇ x t f ( x t ) ∥ θ t − η t ( I − x t x t ⊤ ) ∇ x t f ( x t ) ∥ = x t − η t / ∥ θ ∥ × ( I − x t x t ⊤ ) ∇ x t f ( x t ) ∥ x t − η t / ∥ θ ∥ × ( I − x t x t ⊤ ) ∇ x t f ( x t ) ∥ ( 6 ) \begin{aligned}\boldsymbol{x}_{t+1} = \frac{\boldsymbol{\theta}_{t+1}}{\Vert \boldsymbol{\theta}_{t+1}\Vert} =& \frac{\boldsymbol{\theta}_{t} - \eta_t\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)}{\left\Vert \boldsymbol{\theta}_{t} - \eta_t\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\right\Vert}\\ =& \frac{\boldsymbol{x}_{t} - \eta_t/\Vert\boldsymbol{\theta}\Vert\times\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)}{\left\Vert \boldsymbol{x}_{t} - \eta_t/\Vert\boldsymbol{\theta}\Vert\times\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\right\Vert} \end{aligned}\quad(6) xt+1=θt+1θt+1==θtηt(Ixtxt)xtf(xt)θtηt(Ixtxt)xtf(xt)xtηt/θ×(Ixtxt)xtf(xt)xtηt/θ×(Ixtxt)xtf(xt)(6)

再次将 1 ∥ θ ∥ \frac{1}{\|\theta\|} θ1整合到学习率中,将得到只有 x t x_t xt的更新公式:

x t + 1 = x t − η t ( I − x t x t ⊤ ) ∇ x t f ( x t ) ∥ x t − η t ( I − x t x t ⊤ ) ∇ x t f ( x t ) ∥ ( 7 ) \boldsymbol{x}_{t+1} = \frac{\boldsymbol{x}_{t} - \eta_t\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)}{\left\Vert \boldsymbol{x}_{t} - \eta_t\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\right\Vert}\quad(7) xt+1=xtηt(Ixtxt)xtf(xt)xtηt(Ixtxt)xtf(xt)(7)

更新量的修正

对下降的梯度进行如下变换,首先有:

g = ( I − x t x t ⊤ ) ∇ x t f ( x t ) = ∇ x t f ( x t ) − x t x t ⊤ ∇ x t f ( x t ) = ∇ x t f ( x t ) − x t ∥ ∇ x t f ( x t ) ∥ cos ⁡ ( x t , ∇ x t f ( x t ) ) (由 ∥ x t ∥ = 1 保证) ( 8 ) \begin{aligned}\boldsymbol{g}=&\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\\ =&\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right) - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\\ =&\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right) - \boldsymbol{x}_t\Vert \nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\Vert \cos\left(\boldsymbol{x}_t,\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\right) \text{(由}\|x_t\|=1 \text{保证)} \end{aligned} \quad(8) g===(Ixtxt)xtf(xt)xtf(xt)xtxtxtf(xt)xtf(xt)xtxtf(xt)cos(xt,xtf(xt))(由xt=1保证)(8)

可以看到, x t x t ⊤ ∇ x t f ( x t ) x_tx_t^{\top}\nabla_{x_t}f(x_t) xtxtxtf(xt)实际上就是向量 ∇ x t f ( x t ) \nabla_{x_t}f(x_t) xtf(xt) 在 在 x t x_t xt方向上的投影分量,而整个 g g g其实就是一个与 x t x_t xt垂直的向量,如下图示:

梯度的几何图示

在上图中,红色向量代表 x t x_t xt,蓝色向量代表 ∇ x t f ( x t ) \nabla_{x_t}f(x_t) xtf(xt),如果没有 ∥ x t ∥ = 1 \|x_t\|=1 xt=1的约束的话,更向量将直接由 ∇ x t f ( x t ) \nabla_{x_t}f(x_t) xtf(xt)决定,但是因为有了约束,所以更新量由 g = ( I − x t x t ⊤ ∇ x t f ( x t ) ) g=(I-x_tx_t^{\top}\nabla_{x_t}f(x_t)) g=(Ixtxtxtf(xt))决定。然而,有下面两种不同的 ∇ x t f ( x t ) \nabla_{x_t}f(x_t) xtf(xt),都可能导致同一个 g g g

第一种情况,∇xf(x)跟x的方向很靠近

第二种情况,∇xf(x)跟x的方向几乎相反

第一种情况的 ∇ x t f ( x t ) \nabla_{x_t}f(x_t) xtf(xt)的方向跟 x t x_t xt很靠近,第二种情况则相反,但它们的 g g g是一致的。前面说了,如果没有约束的话, ∇ x t f ( x t ) \nabla_{x_t}f(x_t) xtf(xt)才是梯度,换言之 − ∇ x t f ( x t ) -\nabla_{x_t}f(x_t) xtf(xt)就是合理的更新方向;现在有了约束, − ∇ x t f ( x t ) -\nabla_{x_t}f(x_t) xtf(xt)虽然不能指出最合理的梯度方向,但直觉来看,它应该还是跟更新量有关的。

在第一种情况下, − ∇ x t f ( x t ) -\nabla_{x_t}f(x_t) xtf(xt) x t x_t xt方向差得比较远,意味着这种情况下更新量应该大一些;而第二种情况下, − ∇ x t f ( x t ) -\nabla_{x_t}f(x_t) xtf(xt) x t x_t xt方向比较一致,而我们只关心 x t + 1 x_{t+1} xt+1的方向,不关心它的模长,所以按理说这种情况下更新量应该小一些。

所以,哪怕这两种情况下 g g g都一样,我们还是需要有所区分,一个很自然的想法是:既然 − ∇ x t f ( x t ) -\nabla_{x_t}f(x_t) xtf(xt) x t x_t xt的方向的一致性会对更新量的大小有所影响,所以不妨用

1 − cos ⁡ ( − ∇ x t f ( x t ) , x t ) = 1 + x t ⊤ ∇ x t f ( x t ) ∥ ∇ x t f ( x t ) ∥ ( 9 ) 1-\cos(-\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right),\boldsymbol{x}_t)=1+\frac{\boldsymbol{x}_t^{\top}\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)}{\left\Vert \nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\right\Vert} \quad(9) 1cos(xtf(xt),xt)=1+xtf(xt)xtxtf(xt)(9)

来调节更新量,这个调节因子刚好满足“方向越一致,调节因子越小”的特性。自然就形成了最终的更新公式

方向越一致,cos值越大,-cos值越小,调节因子小

x t + 1 = x t − η t ( 1 + x t ⊤ ∇ x t f ( x t ) ∥ ∇ x t f ( x t ) ∥ ) ( I − x t x t ⊤ ) ∇ x t f ( x t ) ∥ x t − η t ( 1 + x t ⊤ ∇ x t f ( x t ) ∥ ∇ x t f ( x t ) ∥ ) ( I − x t x t ⊤ ) ∇ x t f ( x t ) ∥ ( 10 ) \boldsymbol{x}_{t+1} = \frac{\boldsymbol{x}_{t} - \eta_t\left(1+\frac{\boldsymbol{x}_t^{\top}\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)}{\left\Vert \nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\right\Vert}\right)\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)}{\left\Vert \boldsymbol{x}_{t} - \eta_t\left(1+\frac{\boldsymbol{x}_t^{\top}\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)}{\left\Vert \nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\right\Vert}\right)\left(\boldsymbol{I} - \boldsymbol{x}_t\boldsymbol{x}_t^{\top}\right)\nabla_{\boldsymbol{x}_t}\,f\left(\boldsymbol{x}_t\right)\right\Vert}\quad(10) xt+1=xtηt(1+xtf(xt)xtxtf(xt))(Ixtxt)xtf(xt)xtηt(1+xtf(xt)xtxtf(xt))(Ixtxt)xtf(xt)(10)

故弄玄虚

有意思的地方讲完了,下面讲一下没有意思的地方了。对NLP有稍微深入一点了解的读者(看过Word2Vec的数学原理,推导过常规模型的梯度)应该会觉得,上面前两节内容并没有什么很深奥的内容,第三节的几何解释和学习率调节有点新颖,但也是有迹可循的内容。不过要是去看原论文的话,那感觉可能就完全不一样了,作者用“概率分布”、“黎曼流形上的优化”等语言,把上述本该比较容易理解的内容,描述得让人云里雾里,深有故弄玄虚之感。

首先,我最不理解的一点是,作者在一开始就做了一个不合理的假设(将词向量连续化),然后花了不少篇幅来论证 p ( v ∣ u ) ∼ e cos ⁡ ( v , u ) p(v|u)∼e^{\cos(v,u)} p(vu)ecos(v,u) p ( u ∣ d ) ∼ e cos ⁡ ( u , d ) p(u|d)∼e^{\cos(u,d}) p(ud)ecos(u,d)对应着Von Mises–Fisher分布。然后呢?就没有然后了,后面的所有内容跟这个Von Mises–Fisher分布可以说没有半点关系,所以不理解作者写这部分内容的目的是什么。

接着,在优化那部分,作者说带约束 ‖ x ‖ = 1 ‖x‖=1 x=1 f ( x ) f(x) f(x)最小化问题不能用梯度下降,所以只能用“黎曼梯度下降”,然后就开始“炫技”了:先说说黎曼流形,然后给出一般的指数映射,再然后给出黎曼梯度,一波高端操作下来,最后却只保留了一个大家都能懂的方案: x = θ ‖ θ ‖ x=\frac{θ}{‖θ‖} x=θθ。这时我就很“服气”了,虽然作者的逻辑和推导都没有毛病,但是一波操作下来最后却给看众一个 x = θ ‖ θ ‖ x=\frac{θ}{‖θ‖} x=θθ的朴素结果,那为什么不一开始就直接讨论 f ( x = θ ‖ θ ‖ ) f(x=\frac{θ}{‖θ‖}) f(x=θθ)的优化呢?非得要去黎曼流形上面把普通读者绕晕?

此外,我说的比较有意思的部分,就是更新量的几何解释以及得到的调节因子,作者也说得挺迷糊的。总之,笔者认为,论文的理论推导部分,很多地方都充斥着很多不必要的专业术语,无端加深了普通看众的理解难度。

最后强调一下,笔者从来不反对“一题多解”,也不反对将简单的内容深化、抽象化,因为“深化”、“抽象化”确实也可能获得更全面的认识,或者能显示各个分支之间的联系。但是这种“深化”、“抽象化”应该要建立在一个大多数人都能理解的简单解的基础上进行的,而不是为了“深化”、“抽象化”而特意舍去了大多数人能理解的简单解。

实验结果

吐槽归吐槽,在实验部分,JoSE做得还是很不错的。首先给出了JoSE的高效的C语言实现:

Github:https://github.com/yumeng5/Spherical-Text-Embedding

我试用了一下,训练确实很快速,训练好的词/句向量结果可以用gensim的KeyedVectors加载。另外我还看了一下源代码,很简练清晰,也方便做二次修改。

至于实验结果,论文给出的词/句向量评测上面,JoSE也是比较领先的:

词相似度评测

词相似度评测

文章总结

本文分享了一个发表在NeurIPS 2019的文本向量模型JoSE,着重讲了一下笔者觉得有启发性的部分,并用自己的方法给出了推导过程。JoSE可以认为是Doc2Vec的自然变种,在细微之处做了调整,并且在优化方法上提出了作者自己的见解,除却一些疑似故弄玄虚的地方之外,还不失为一个可圈可点的工作。

这篇关于【转载】JoSE:球面上的词向量和句向量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/315894

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

8. 自然语言处理中的深度学习:从词向量到BERT

引言 深度学习在自然语言处理(NLP)领域的应用极大地推动了语言理解和生成技术的发展。通过从词向量到预训练模型(如BERT)的演进,NLP技术在机器翻译、情感分析、问答系统等任务中取得了显著成果。本篇博文将探讨深度学习在NLP中的核心技术,包括词向量、序列模型(如RNN、LSTM),以及BERT等预训练模型的崛起及其实际应用。 1. 词向量的生成与应用 词向量(Word Embedding)

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

提问的智慧(转载)

此文让我受益良多。值得一读,大家如果也觉得不错就一起来推~~~   ---------------------------------      在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。       首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们

Struts2常用标签总结--转载

Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求。 Struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

利用向量积(叉积)计算三角形的面积和多边形的面积(hdu2036)

开始撸计算几何题目了。。。。。。。 预备知识:叉乘求多边形面积 参考证明资料: 公式证明: http://www.cnblogs.com/xiexinxinlove/p/3708147.html 高中知识: http://wenku.baidu.com/view/867e6edfad51f01dc281f11a.html #include<stdio.h>#inclu

计算几何之向量旋转

实际做题中我们可能会遇到很多有关及计算几何的问题,其中有一类问题就是向量的旋转问题,下面我们来具体探讨一下有关旋转的问题。 首先我们先把问题简化一下,我们先研究一个点绕另一个点旋转一定角度的问题。已知A点坐标(x1,y1),B点坐标(x2,y2),我们需要求得A点绕着B点旋转θ度后的位置。 A点绕B点旋转θ角度后得到的点,问题是我们要如何才能得到A' 点的坐标。(向逆时针方向旋转角度正,

深度学习速通系列:如何生成句向量?

生成句向量(Sentence Embedding)是自然语言处理(NLP)中的一项重要技术,它将文本句子转换为固定长度的数值向量,这些向量能够捕捉句子的语义信息。以下是一些生成句向量的方法: 词袋模型(Bag of Words, BoW): 将句子中的每个词转换为一个特征向量,并将所有词的特征向量平均或求和,以生成句子的向量表示。 TF-IDF: 使用词频-逆文档频率(Term Freque