从2019年9月到2020年12月中旬,这段时间参与了很多项目,经历了工作上各种酸甜苦辣:从开始的自卑、无助、困惑、迷茫……到最后的自豪、高兴、喜悦、成就……这一切的一切好像做了一个好长的梦~~~
NLP算法模型的应用
论文链接
bert参考论文:https://arxiv.org/pdf/1810.04805.pdf
albert参考论文:https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1909.11942.pdf
albert源代码链接:https://github.com/brightmart/albert_zh
AlBert实战应用
小结
从本科到研究生,从研究生到毕业找工作,我一直被困在一个错误的圈子里面不能自拔:我总认为算法模型很重要,好的模型才能有好效果,复杂的模型才能比简单的模型更会容易表现出色,这真的是个很大误区。工作了做过项目才知道:其实在算法应用过程中,用什么样的模型,并不是那么的重要,数据才是算法落地的王道,换句话说,数据的准确性才是模型好坏的关键。
思路
用albert模型做过垂直搜索多个品类的实战落地,xs、application、xw等。从搜索日志中抽取coquery、pv、uv、session_num等数据,然后用规则的方式实现自动化打标:取随机不去重query进行小样本的调优数据工作(这一步很重要),不断地进行调优,数据集达到90%+的准确率可以批量生成所需数据集,再进行抽取join数据集的特征,然后对模型进行fune,最后对测试集进行不断分析(找出badcase),进行反复调优模型工作,最后可能会达到很好的表现效果。
代码修改
多GPU并行训练
1、bert的opmitizer改为并行merger:
源码bert的重写了tf.train.Optimizer的apply_gradients;
tf的Adam可以应用到并行处理方式上,只是没有权重权重衰减方法;
自定义Adam优化器:tf自带的Adam+源码bertAdamWeightDecayOptimizer实现.
2、修改modeling.py 338行, assignment_map[name]=name_to_variable[name];
3、修改Runconfig.
一次加载多次预测
1、export_savemodel(export_dir, serving_input_fn).
c++项目的开发应用
小结
还记得之前立下过一个flag:攻克c++。虽然这一年没有仔细系统地的学习过c++,但是通过各种线上开发的项目,对c++有了更加深刻的领悟:c++入门难,但是很通用、实用。作为一名算法工程师,其实很多时候我们不必去关心框架代码应该怎么做到兼容性、可维护能力强,因为这些属于框架工程同学的工作范畴。但是有些时候,算法同学的算法模型要上线,工程同学的排期计划可能把你的项目计划排在了很后很后,这就是很反感的事情(你这边着急上线,他们工程却没有时间去管),更反感的事情是:算法需求工程同学听不懂,一个需要做了大半月可能才明白怎么回事,这就很让算法同学头疼。
这时候我们不能干等,我们算法的同学就需要有基本的开发能力(无论哪种语言),更困难的是:工程框架开发的不是那么中意,总要写一堆hard code,这就很头疼。因为算法同学没有接触过这套框架的,就需要先去把框架代码读一遍,然后搞懂你的代码应该加在哪里,配置应该怎么调用,怎么配置等等,熟悉完了框架代码,需要自己去开发算法模型的词典库配置代码,算法逻辑代码,接口代码等,这相当于把框架自己又维护了一遍,一个算法的维护了一个框架,同时还要保证算法效果。这种算法工程师被主管称为:“超级算法工程师”(会开发,会框架,会算法,会上线)
c++框架代码的编译目前接触了三种: cmake、scons、autoconf,虽然我从0到有不太会写,但是可以照猫画虎,总可以写出来,最后还想说,日志、单测很重要,性能、稳定测试更重要,上线之前一定要做足了测试,不然上线后会哭(一堆事)。
总结
我个人觉得作为一名合格的算法工程师,首先要把基础打好(不管是开发,还是数据、算法),
数据:mysql、hive、hbase、kafka、redis、hdfs、爬虫
开发:python动态插件化,c++框架、spark、shell、vim、自动化部署脚本;
算法:算法模型训练、调优,意图识别、ner等等。
我很庆幸我能在这里入门搜索这个领域,我也很庆幸我能接触到各种数据处理工具,能接触到开发架构,能接触到算法模型落地,能一个人主导项目,能给我独立思考问题的经历。