0%

综述

本文主要介绍一个在进行NLP领域深度学习任务时的词嵌入小技巧w2vembeddings。减少不必要的内存占用以及95%的加载时间。也大大加强了词嵌入库的管理能力及复用性。

问题

在进行NLP任务的时候,一般会利用Word2Vec进行嵌入。生成一个基于当前任务的词向量矩阵。正如下面这样。

1
2
3
4
5
6
7
8
def embedding_matrix_p(embeddings_index, word_index, max_features):            
embed_size = embeddings_index.get('a').shape[0]
embedding_matrix = np.random.normal(0, 0, (max_features, embed_size))
for word, i in word_index.items():
if i >= max_features: continue
embedding_vector = embeddings_index.get(word, np.zeros(embed_size))
embedding_matrix[i] = embedding_vector
return embedding_matrix

1
2
3
4
EMBEDDING_FILE = '../input/embeddings/glove.840B.300d/glove.840B.300d.txt'
def get_coefs(word,*arr): return word, np.asarray(arr, dtype='float32')
embeddings_index = dict(get_coefs(*o.split(" ")) for o in open(EMBEDDING_FILE))
embedding_matrix, embed_size = embedding_matrix_p(embeddings_index, word_index, max_features)

但是这样就会有一个问题,如果每次都从文件(txt/bin)中load的话需要解析,是比较费时间的,而且load进内存中向量又不都用得到。假如某次任务分词下来只有2万个,而词向量文件一般都是几百万的级别,所以真正发挥作用的其实只有百分之几。那么如何解决这部分不必要的时间浪费及内存占用呢?

解决方法

了解了一些部署word2vec的方法之后,发现大概是这么两种:
1、从本地load到内存。
2、起服务,调用REST API。
方案1也就上面讲的模式。每次load需要时间,且会占用运行内存。
方案2也就是为请求词向量单独起个服务,这个架构会比较清晰。但是如果需要使用到全局词向量的话也会比较麻烦,而且,真的有必要起个服务这么麻烦吗?

在闲暇时参考embeddings的实现重新封装了一个包w2vembeddings
主要是将词向量内容迁移到SQLite中,本质上来讲也就是将word2vec换了一种存储格式。但是由于SQLite是数据库,且无服务器。所以方便高效,查询快速(也不需要用到写入功能,除了第一次转换格式的时候)。

主要有以下功能:
词向量库管理
词向量即时调用,随取随用

主要解决内存占用和加载耗时的问题。还可以将多个词向量库放在一起管理。
使用方法:

1
2
3
4
5
6
7
8
9
10
from w2vembeddings.w2vemb import EMB
emb = EMB(name='tencent', dimensions=200) # 加载词向量库,相当于原来从文件加载的步骤
# 按需提取词向量矩阵
def embedding_matrix_p(emb, word_index, max_features):
embed_size = len(emb.get_vector('a'))
embedding_matrix = np.random.normal(0, 0, (max_features, embed_size))
for word, i in word_index.items():
if i >= max_features: continue
embedding_matrix[i] = np.array(emb.get_vector(word))
return embedding_matrix

优势

可以节约掉几乎所有的不必要的内存占用,以及95%的时间。

问题

当然这个方案也有问题,跟REST API一样,想要使用词向量全局信息的时候也不方便。如果有这种需求,建议参考gensim。
这个方法主要面向那些经常使用word2vec做研究的人,以及小型的线上部署场景。
原文发表于

Python

pypi包发布

https://pypi.org/project/twine/

1
2
python setup.py sdist bdist_wheel
twine upload dist/* -u {username} -p {pwd} {--skip-existing}

Git

仓库权限添加

  • 生成本地密钥(如果本地密钥更新了,也需要同步更新远程配置的本地key)
  • 将本地key配备到远程仓库上实现免密登陆(拉取/提交等)
    1
    pbcopy < ~/.ssh/id_rsa.pub

开发环境

快速up虚拟环境 vagrant
vagrant cloud
vagrant init hashicorp/bionic64 // hashicorp/bionic64 should be from cloud
vagrant up
vagrant ssh
vagrant destroy

ML

特征工程资源

category_encoders
ce.CountEncoder
ce.TargetEncoder
ce.CatBoostEncoder

特征选择资源

sklearn.feature_selection
基于特征的选择(依据评分函数评价特征对目标的贡献, 𝜒2, ANOVA, F-value, 互信息)
基于模型的选择(l1, l2)

编程语言基础

### NodeJS
    - NodeJS basics.
    - Event Loop.
    - Loop Tick.
    - NodeJS core modules.
    - Node package manager.
    - Asynchronous JavaScript and Promises.
    - How to develop full API

论文资源

画图: sane_tikz

GPU 模型 debug

如果模型在GPU上报错,可能给出的报错信息非常的笼统, 这时如果把模型放到CPU端执行,可能给出的报错信息会更加的具体.

运筹优化求解器评测

由 Hans Mittelmann组织
[1]. http://plato.asu.edu/bench.html
[2]. http://plato.asu.edu/ftp/milp.html
![image](\images_source\_010_\or-sovler.png)

算法黑盒

各种算法,除了决策树一类的模型可解释比较好一点之外,其他的模型的可解释性就目前来说都比较差,黑盒输出。
在某些场景下黑盒算法的效果确实很好,但是为什么就无法说明了。

业务可解释

某些场景,业务的推进尽量希望结果是可复现可控制可解释的。

折中思考

可否利用模型融合的思想,将可解释及效果比较好的特征手动提取出来,结合黑盒模型的输出,进行加权运用(或者类似于决策树一类的模型)。这样便可以两者优势互补。

2018:

1 做了4个月梦
2 搭建了个人博客空间,并断断续续写了一些质量不高的博文
3 翻译了一本特征工程的书籍。之后把目录及对应的个人心得整理出来
4 参加了kaggle比赛获得top2%
5 换了工作
6 复习了数学

2019:

1 跟进kaggle比赛,进入master并为GM打下坚实基础,完成单卡熟练操作并逐步实现3-4卡操作
2 开源kaggle kernel 3-5个,主要偏向分析型的EDA内容
3 维护2-3个有意义的github自己的项目
4 增强编程能力,定向编程题刷到300左右
5 实现基本的周更博客,中英间歇,并保证一定质量,不要粗制滥造
6 强化数学,微分、积分、级数、矩阵、概率。要到化于无形的状态,要能推公式。不要吹水
7 英语水平上一个台阶,目标是词汇量达到6500~7000左右。有一定的应变说读写能力
8 看书,计算机技术基础知识3~5本,前沿领域5~10本,人文社会历史1-2本。论文不限,博客不限
9 锻炼,保持基本每天半小时的锻炼

ps:

(差不多了,不能再列了,再列多半也完不成了,完成了也是垃圾水平的,没啥用,何必浪费时间。基于自身条件及目前状态,把以上做完做好就可以了。
不要再做梦了,你正在被时代抛弃!!! to myself)