请教一个DL/NLP问题

s
sanwadie
楼主 (未名空间)

我不熟DL,而且开发语言只能是Java。现在有个问题:

我已经可以在Java里使用谷歌PreTrained BERT embedding,获取句子的向量。但是
BERT 好像不能直接用来做 Sentence Similarity。有没有简单的数学介绍,如何使用 BERT 返回的数据,获取两个句子的相似度。我目前用java做了DOT 和NORM的算法。

另外,运行环境的内存和性能都不是很友好。

谢谢

c
cotx

得看你是不是有label好得数据,有的话直接训练;没有的话没什么好办法,搜一下
sentence embedding吧
t
timetodo

try:
cosine distance
KL distance

should be enough
s
sanwadie


【 在 timetodo (time2do) 的大作中提到: 】
: try:
: cosine distance
: KL distance
: should be enough

感谢 timetodo 和 cotx 的回复。我一并回答你们提到的内容。

我这个不是 classification,是Similarity。Embedding 已经有了,但是 BERT 的
embedding 直接用来做 sentence similarity 效果很差。有文档提到需要一些转换,
甚至都有代码,但是我本身对 DL 和 TF 都不熟,居然没看懂,也没有时间去深入,
也就没有办法翻译成java。

我已经实现了 cosine 和 KL,效果不好。这里有介绍:https://www.reddit.com/r/LanguageTechnology/comments/ax6o41/how_to_compute_
sentence_similarity_using_bert/

我使用的环境必须是java,而且资源有限,无法使用很多现成的库,必须自己实现某些矩阵算法。

希望懂DL大法的高手帮忙看一下 BERT 的一些代码,这个对 similarity 的 额外处理
到底执行了哪些运算,如果是 cosine distance 之类简单矩阵运算组合,我打算自己
实现。

s
sanwadie

我在网上找到相关例子,需要对模型进行fine tuning,然后才能用来产生可用的
sentence embedding。

【 在 sanwadie (三娃爹) 的大作中提到: 】
: 感谢 timetodo 和 cotx 的回复。我一并回答你们提到的内容。
: 我这个不是 classification,是Similarity。Embedding 已经有了,但是 BERT 的 : embedding 直接用来做 sentence similarity 效果很差。有文档提到需要一些转换,
: 甚至都有代码,但是我本身对 DL 和 TF 都不熟,居然没看懂,也没有时间去深入,
: 也就没有办法翻译成java。
: 我已经实现了 cosine 和 KL,效果不好。这里有介绍:
: https://www.reddit.com/r/LanguageTechnology/comments/ax6o41/how_to_compute_
: sentence_similarity_using_bert/
: 我使用的环境必须是java,而且资源有限,无法使用很多现成的库,必须自己实现某些
: 矩阵算法。
: ...................

c
cotx

不是,我得意思是你有没有一些数据用来训练similarity的?如果直接拿CLS token来
算similarity的话结果会很差,不管用什么距离都一样。原因是BERT的cls token只用
来算下一个句子是不是临街的,所以这个向量基本只有两个方向,你算一下的话会发现相似度都很高。

具体你可以参考这里的结果https://www.zhihu.com/question/354129879

总结一下就是没有数据训练,只做无监督的话,直接用glove就行了,bert没用。
【 在 sanwadie (三娃爹) 的大作中提到: 】
: 感谢 timetodo 和 cotx 的回复。我一并回答你们提到的内容。
: 我这个不是 classification,是Similarity。Embedding 已经有了,但是 BERT 的 : embedding 直接用来做 sentence similarity 效果很差。有文档提到需要一些转换,
: 甚至都有代码,但是我本身对 DL 和 TF 都不熟,居然没看懂,也没有时间去深入,
: 也就没有办法翻译成java。
: 我已经实现了 cosine 和 KL,效果不好。这里有介绍:
: https://www.reddit.com/r/LanguageTechnology/comments/ax6o41/how_to_compute_
: sentence_similarity_using_bert/
: 我使用的环境必须是java,而且资源有限,无法使用很多现成的库,必须自己实现某些
: 矩阵算法。
: ...................

s
sanwadie


【 在 cotx (Inter Milan!) 的大作中提到: 】
: 不是,我得意思是你有没有一些数据用来训练similarity的?如果直接拿CLS token来
: 算similarity的话结果会很差,不管用什么距离都一样。原因是BERT的cls token只用
: 来算下一个句子是不是临街的,所以这个向量基本只有两个方向,你算一下的话会发现
: 相似度都很高。
: 具体你可以参考这里的结果
: https://www.zhihu.com/question/354129879
: 总结一下就是没有数据训练,只做无监督的话,直接用glove就行了,bert没用。

再次感谢指点。我暂时没有训练数据。word2vec/glove模型太大,我这里不适合使用。我在想是否有通用的fine tuning,不需要训练数据就可以对输出进行 cosine
similarity 计算。当然fine tuning 不能太复杂,否则我还要实现全部相关的运算。

w
walkrandom

还是得用Python
把数据传回java即可
s
sanwadie

兜兜转转还是绕不开。不知为何特讨厌python。

【 在 walkrandom (walkrandom) 的大作中提到: 】
: 还是得用Python
: 把数据传回java即可

s
sanwadie

更正一下,不是python,是整个 dl 届的不良风气。

我是做工程的,强调质量、软件一致性,可维护性等。看看他们搞的东西,版本号差 0.0.1,API就天差地别。github上的dl项目,尤其是基于tf的,超过2个月就要小心了,按tutorial 做基本没戏。做个东西,全都留个尾巴,没法拿来直接用。训练个模型,
TM 就是中餐馆厨师,全凭经验。吹得比做得好听,就拿文本分类来说,我用下来,居
然还是svm效果最好。

这股风气来自学术届,蔓延到工业界,狗家为甚。看看狗家的 tf,这得对软件工程多
么无知才会出这么sb的东西,几乎集中了全部软件工程的 anti-pattern 。狗家的东西得小心使用,说改就改,说停就停。

浪费了几天时间,决定转回svm,和bert说再见。又一次狗家很差的体验。

【 在 sanwadie (三娃爹) 的大作中提到: 】
: 兜兜转转还是绕不开。不知为何特讨厌python。

b
beidapig

用 universal sentence encoder
s
silverhawk

先试一下能不能直接用: https://github.com/hanxiao/bert-as-service,看看效果
好不好再工程化

另外句子相似性可能需要前期处理很多,比如normalization,甚至tokenization,直
接上模型不一定好
【 在 sanwadie (三娃爹) 的大作中提到: 】
: 我不熟DL,而且开发语言只能是Java。现在有个问题:
: 我已经可以在Java里使用谷歌PreTrained BERT embedding,获取句子的向量。但是 : BERT 好像不能直接用来做 Sentence Similarity。有没有简单的数学介绍,如何使

: BERT 返回的数据,获取两个句子的相似度。我目前用java做了DOT 和NORM的算法。
: 另外,运行环境的内存和性能都不是很友好。
: 谢谢

c
chebyshev

线性代数的很多基础操作的实现有复杂的学问在里面。免费的库,目前只有fortran,
cpp,python过硬。

假如自己实现的话,哪怕就是DOT,norm,你的效率和质量要赶上fortran,cpp,python那
也很废功夫的。这样写出来你自己不就成了你批评的那些库嘛!

我建议用python的numpy.。绕过基础线性代数操作自己写这个坑。可以在numpy的基础
上写别的算法。

Overall来讲,把数值计算的算法在web server host起来,远不是一般人想象的那么简单。half
made的各种软件的出现很正常。这个倒不是dl届的问题。这是cs的人很少学numerical computation 的问题,传统上这块归EE,ME,化学,生物什么的。跟java不是一套班子。

你弄个石油钻井的流体模拟,放java上变成web service,一样会碰到很多问题。
【 在 sanwadie(三娃爹) 的大作中提到: 】
<br>: 更正一下,不是python,是整个 dl 届的不良风气。
<br>: 我是做工程的,强调质量、软件一致性,可维护性等。看看他们搞的东西,版本
号差 0
<br>: .0.1,API就天差地别。github上的dl项目,尤其是基于tf的,超过2个月就要小
心了,
<br>: 按tutorial 做基本没戏。做个东西,全都留个尾巴,没法拿来直接用。
训练个
模型,
<br>: TM 就是中餐馆厨师,全凭经验。吹得比做得好听,就拿文本分类来说,
我用下
来,居
<br>: 然还是svm效果最好。
<br>: 这股风气来自学术届,蔓延到工业界,狗家为甚。看看狗家的 tf,这得
对软件
工程多
<br>: 么无知才会出这么sb的东西,几乎集中了全部软件工程的 anti-pattern 。狗家
的东西
<br>: 得小心使用,说改就改,说停就停。
<br>: 浪费了几天时间,决定转回svm,和bert说再见。又一次狗家很差的体验。
<br>

s
sanwadie

去看了一下,有小模型,准备以后尝试一下。谢谢
【 在 beidapig (做人要谦虚) 的大作中提到: 】
: 用 universal sentence encoder

s
sanwadie

已经有 web service 版本的应用,虽然比不上外边的专业产品,但够用了。最近公司
的设备遇到了弱网问题,我寻思着是否可以把一部分功能放到前端去。之前的软件都是模块化的,出于部署考虑,所有模块实现了远程/本地调用切换。所以我在考虑,在弱
网时,使用一个弱化版的嵌入式对话机器人,一旦网络通畅,就自动切换回去。这个就是使用场景。

我现在打算先用分类算法将就一下,等以后有时间再考虑一下其他。

【 在 silverhawk (silverhawk) 的大作中提到: 】
: 先试一下能不能直接用: https://github.com/hanxiao/bert-as-service,看看效果
: 好不好再工程化
: 另外句子相似性可能需要前期处理很多,比如normalization,甚至tokenization,直
: 接上模型不一定好
: 用

s
sanwadie

感谢回复。

我平时开发不多,关心部件之间的调用接口,rest api 规范要远多过内部实现代码。
很多时候,哪怕看到屎一样的代码,只要逻辑上没大问题,性能上不太离谱
都捏鼻子认了。

小公司求短平快。我原来打算用ALBERT+Cosine Distance,结果出来不行,就想看看能否自己调整一下,现在看来太复杂,目前已经放弃。

【 在 chebyshev (......) 的大作中提到: 】
: 线性代数的很多基础操作的实现有复杂的学问在里面。免费的库,目前只有fortran,: cpp,python过硬。
: 假如自己实现的话,哪怕就是DOT,norm,你的效率和质量要赶上fortran,cpp,python那
: 也很废功夫的。这样写出来你自己不就成了你批评的那些库嘛!
: 我建议用python的numpy.。绕过基础线性代数操作自己写这个坑。可以在numpy的基础
: 上写别的算法。
: Overall来讲,把数值计算的算法在web server host起来,远不是一般人想象的那么简
: 单。half
: made的各种软件的出现很正常。这个倒不是dl届的问题。这是cs的人很少学
numerical
: computation 的问题,传统上这块归EE,ME,化学,生物什么的。跟java不是一套班
子。
: ...................

s
sanwadie

我用在嵌入设备里,如果太复杂,就准备引入一个包,否则就自己写。我的原则是尽量少用第三方的包,尤其是只用一两个方法,却要几十个M的包。很多时候,引入的包还
有根据需要重新打包。

【 在 chebyshev (......) 的大作中提到: 】
: 线性代数的很多基础操作的实现有复杂的学问在里面。免费的库,目前只有fortran,: cpp,python过硬。
: 假如自己实现的话,哪怕就是DOT,norm,你的效率和质量要赶上fortran,cpp,python那
: 也很废功夫的。这样写出来你自己不就成了你批评的那些库嘛!
: 我建议用python的numpy.。绕过基础线性代数操作自己写这个坑。可以在numpy的基础
: 上写别的算法。
: Overall来讲,把数值计算的算法在web server host起来,远不是一般人想象的那么简
: 单。half
: made的各种软件的出现很正常。这个倒不是dl届的问题。这是cs的人很少学
numerical
: computation 的问题,传统上这块归EE,ME,化学,生物什么的。跟java不是一套班
子。
: ...................

c
chebyshev

嵌入设备(有条件的话)我觉得c/cpp有优势。

【 在 sanwadie(三娃爹) 的大作中提到: 】
<br>: 我用在嵌入设备里,如果太复杂,就准备引入一个包,否则就自己写。我的原则
是尽量
<br>: 少用第三方的包,尤其是只用一两个方法,却要几十个M的包。很多时候
,引入
的包还
<br>: 有根据需要重新打包。
<br>: numerical
<br>: 子。
<br>

s
sanwadie

上次用c是2005之前,也是嵌入系统。如今都安卓嵌入系统。老了,智商不够,拾起来
难了。

【 在 chebyshev (......) 的大作中提到: 】
: 嵌入设备(有条件的话)我觉得c/cpp有优势。
:
: 我用在嵌入设备里,如果太复杂,就准备引入一个包,否则就自己写。我
: 的原则
: 是尽量
:
: 少用第三方的包,尤其是只用一两个方法,却要几十个M的包。很多时候
: ,引入
: 的包还
:
: 有根据需要重新打包。
:
: numerical
:
: 子。
: ...................

b
beidapig

tf的productinization
server端的model用 model server host
mobile端转化成tflite 格式,tflite不支持所有operation 比如文本模型常用的
sparse。不是所有模式都能转化
m
magliner

请问大神为啥svm好 ? 能比线性回归好很多吗 ?
【 在 sanwadie (三娃爹) 的大作中提到: 】
: 更正一下,不是python,是整个 dl 届的不良风气。
: 我是做工程的,强调质量、软件一致性,可维护性等。看看他们搞的东西,版本号差 0
: .0.1,API就天差地别。github上的dl项目,尤其是基于tf的,超过2个月就要小心了,
: 按tutorial 做基本没戏。做个东西,全都留个尾巴,没法拿来直接用。训练个模型,
: TM 就是中餐馆厨师,全凭经验。吹得比做得好听,就拿文本分类来说,我用下来,居
: 然还是svm效果最好。
: 这股风气来自学术届,蔓延到工业界,狗家为甚。看看狗家的 tf,这得对软件工程多
: 么无知才会出这么sb的东西,几乎集中了全部软件工程的 anti-pattern 。狗家的东西
: 得小心使用,说改就改,说停就停。
: 浪费了几天时间,决定转回svm,和bert说再见。又一次狗家很差的体验。

s
sanwadie

我是苦力,不是大神。使用下来感觉准确率略高。其实差别不大,不仔细测试,实际实际使用时感觉不到。

【 在 magliner (magliner) 的大作中提到: 】
: 请问大神为啥svm好 ? 能比线性回归好很多吗 ?
: 0

m
magliner

看来大神在线答疑。
svm这个东西, 我觉着很多做生物统计的特别喜欢,什么原因不知道。 我做的东西比
较简单,经常和普通线性回归比较下,大部分情况性能差不多,但svm很多R软件包调用起来不方便, 比如kernel这个参数,理论上应该有好几种, 圆的,方的(是不是有三角的我是记不清了),有的作者也许图省事,只提供⚪的, radius, 是不是很别扭。 而且其他几个参数, 也完全没有章法可循,从0到无穷大,让人怎么选?
从零到一,或者从一到一万选个最优解,还能试一试。 无穷大, 哪里是个尽头。
【 在 sanwadie (三娃爹) 的大作中提到: 】
: 我是苦力,不是大神。使用下来感觉准确率略高。其实差别不大,不仔细测试,实际实
: 际使用时感觉不到。

S
Shane2014
https://github.com/UKPLab/sentence-transformers
I have tried this, beats USE from google.
w
wdong

我不信他们内部项目也这么倒腾。

【 在 sanwadie (三娃爹) 的大作中提到: 】
: 更正一下,不是python,是整个 dl 届的不良风气。
: 我是做工程的,强调质量、软件一致性,可维护性等。看看他们搞的东西,版本号差 0
: .0.1,API就天差地别。github上的dl项目,尤其是基于tf的,超过2个月就要小心了,
: 按tutorial 做基本没戏。做个东西,全都留个尾巴,没法拿来直接用。训练个模型,
: TM 就是中餐馆厨师,全凭经验。吹得比做得好听,就拿文本分类来说,我用下来,居
: 然还是svm效果最好。
: 这股风气来自学术届,蔓延到工业界,狗家为甚。看看狗家的 tf,这得对软件工程多
: 么无知才会出这么sb的东西,几乎集中了全部软件工程的 anti-pattern 。狗家的东西
: 得小心使用,说改就改,说停就停。
: 浪费了几天时间,决定转回svm,和bert说再见。又一次狗家很差的体验。
: ...................

s
sanwadie

谢谢,尝试了一下,感觉不错,尤其后边的Semantic Search几乎开箱可用。
但还是太大。以后替换服务器端的服务会考虑。

【 在 Shane2014 (Shane2014) 的大作中提到: 】
: https://github.com/UKPLab/sentence-transformers
: I have tried this, beats USE from google.

s
sanwadie

pytorch 感觉比 tf 正规多了。

【 在 sanwadie (三娃爹) 的大作中提到: 】
: 谢谢,尝试了一下,感觉不错,尤其后边的Semantic Search几乎开箱可用。
: 但还是太大。以后替换服务器端的服务会考虑。

s
sanwadie

我了解到部门,都不是这样。但是谷歌开源出来的东西,都不太尊重开发者。有很长一串东西,比如GWT(现在谁还在用,TM我就上过贼船),比如guava,内部一些东西改动太大,TF就更不用说了。

【 在 wdong (万事休) 的大作中提到: 】
: 我不信他们内部项目也这么倒腾。
: 0

w
walkrandom

以后换人换项目
都是重写不是重构
Python重写快
这是优点
s
sanwadie

再次感谢各位的帮助。

感谢 Shane2014 提供的 sentence-transformers
感谢 beidapig 提供的 universal sentence encoder

最近趁热打铁,更新了部分服务器端的NLP组件,sentence similarity 部分最后选用
了 sentence-transformers,套个flask做微服务。

分享一下为啥这么做。这个结果不是分析他们的Paper,我不懂,也没打算弄懂,纯粹
是从应用和工程角度。

sentence-transformer:
Paper 非常新,作者列出的结果比USE好
有几个很直白的 Example,直接上手测试,非常顺利
基于 PyTorch 和 huggingface / transformers

universal sentence encoder:
Paper 比较老(2018vs2019)
Google的模型,很难离开TF
结果也非常好,但比 ST 略差
网上的Example都需要自己组装,让它跑起来也花了点时间,主要还是在和TF做斗争。

我对狗家的东西有点抗拒,所以最后选了Sentence-transformer。

有个非常有趣的结果,两个模型都没有针对中文的预训练模型,但有一个多语言的模型。我尝试了一下,发现可以匹配不同语言之间的语义,跨语言匹配的效果比同语言略差,但也够用。这个对我们的应用还是非常有用的。我开始尝试改造应用,使用同一个机器人,加一个语言侦测器,就可以让我们的机器人同时讲16种语言。

x
xiaoju

pytorch不错

keras被谷歌搞死前也不错

【 在 sanwadie (三娃爹) 的大作中提到: 】
: 更正一下,不是python,是整个 dl 届的不良风气。
: 我是做工程的,强调质量、软件一致性,可维护性等。看看他们搞的东西,版本号差 0
: .0.1,API就天差地别。github上的dl项目,尤其是基于tf的,超过2个月就要小心了,
: 按tutorial 做基本没戏。做个东西,全都留个尾巴,没法拿来直接用。训练个模型,
: TM 就是中餐馆厨师,全凭经验。吹得比做得好听,就拿文本分类来说,我用下来,居
: 然还是svm效果最好。
: 这股风气来自学术届,蔓延到工业界,狗家为甚。看看狗家的 tf,这得对软件工程多
: 么无知才会出这么sb的东西,几乎集中了全部软件工程的 anti-pattern 。狗家的东西
: 得小心使用,说改就改,说停就停。
: 浪费了几天时间,决定转回svm,和bert说再见。又一次狗家很差的体验。

x
xiaoju

一般来说内部项目只会更折腾,不然那么多人干什么啊

【 在 wdong (万事休) 的大作中提到: 】
: 我不信他们内部项目也这么倒腾。
: 0

n
newIdRobot

可以试试java native interface 矩阵运算用c++完成

【在 chebyshev(......)的大作中提到:】
:线性代数的很多基础操作的实现有复杂的学问在里面。免费的库,目前只有fortran,:cpp,python过硬。