项目总结

自我介绍

面试官您好,我是来自西安交通大学的研二学生王诏,我本科同样也就读于西安交通大学。我主要从科研和实践学习两方面介绍一下自己。在科研方面,我的主要研究方向是基于数据挖掘的身份认证技术。自大三进入实验室以来,发表了4篇EI论文和两篇SCI论文,参与第三届全国互联网开发大赛获得三等奖,参与互联网+创新创业大赛获陕西省铜奖。在学习实践方面,我研一入选了华为云计算菁英班,研一暑假于华为cloud BU-EI产品服务部进行实习,主要工作是视频直播内容审核算法开发以及审核api的后台开发,在团队的共同努力下,成功拿下了良品铺子,施耐德电气,一汽大众和映客直播的相关项目。之后的一份实习是在国家互联网应急响应中心,从事反诈骗和app敏感信息检测的工作,主要是做了一些hive相关的数据挖掘和后台开发,与公安部配合抓获400余名犯罪嫌疑人,团队得到了南方都市报和中央电视台的新闻报道,今年暑假在阿里巴巴进行暑期实习,主要从事的是直播日常开发和20周年年会相关的开发内容,进行了新功能开发与性能优化以及稳定性保障和预案开发的工作。在我的科研和实习过程中,极大提升了个人的开发能力与业务能力,但我深知自己在各方面都还有欠缺,因此希望有机会进入xx公司xx部门进行实习,提升自我,与团队一起做一些有意义,有价值的事情。

手环手写用户身份识别

做研究的背景

移动计算这几年越来越火,移动设备也存储着越来越多个人的隐私信息,同时移动设备对比于传统的计算机来说,更容易丢失,因此需要一个安全可靠且方便的认证方式。现有的诸如指纹,面部识别之类的方式都有着很大的安全隐患,比如去年刚推出的屏下指纹,在去年12月的黑客大会上,被一位黑客用一张卡片就破解了,黑客用了一张近似于光滑镜面的设备,在高亮度的情况下,将光滑镜片贴近手机表面,由于每次按压屏下指纹会留下污迹,反射的指纹光线被超声波指纹识别器识别,如此轻而易举就破解了屏下指纹。而更可怕的是,最近几年出现的基于对抗生成神经网络的GAN方法,可以生成一个通用指纹,在低安全度指纹识别系统中可以达到76%的准确度。十分火爆的人脸识别系统也可以通过3D打印技术轻松破解。面对这样的现状,因此我们提出了基于行为的生物特征识别。

总的来说,生物特征识别可以分为两类:第一类基于固定生物特征的,比如指纹,虹膜,人脸等;第二类是基于行为习惯的,诸如步态等。我的主要研究方向就是第二类。

做研究的动机

在手环手写用户身份识别项目中,我做这个项目的动机是因为,我观察到手写动作是一个很复杂的动作,其包含了手掌,手指,手腕的运动轨迹,以及他们之间的交互。手写动作包含了很多可区分的变量,比如首部结构,动作习惯,手写姿势等等,我采集了10个人的200次手写数据,验证到手写姿势的传感器数据区分度足够显著,之后开始了这个实验。最终是收集了50个用户的1000次手写数据,做相关实验。

做研究的问题

实验中遇到了一些问题,其一是用户书写单词的大小可能会有较大的区分性,其二是即使同一个人书写时产生的加速度计和陀螺仪数据可能有很大的差距,比如某次写的快一些,某些时候慢一些,甚至是有时候有一些意外的暂停,单纯地计算书写时手腕的移动距离和方向是没有办法用于认证的。

最终我们是使用了SG滤波和动态时间规整解决了这些问题,在经过滤波算法和规整后,不同用户的手写时产生的传感器数据产生了较大的差别。

具体过程

采集50个用户,62hz采样频率,每个用户要求写一个”love”的单词以及任意个由3-5个字母组成的小写单词,每个用户至少写6遍。为了更精确地捕捉每个用户的手写特征,我们要求每个字母的大小都大于$10*3cm^2$,最终采集得到的是一个六维的数据。三轴加速度计数据和三轴陀螺仪数据。

将采集得到的数据通过sg滤波器,提高数据信噪比(这个其实简单来说就是从最小二乘估计推出来的公式,为了拟合多项式常数,savitzky和golay发现计算a0相当于对原始数据进行fir(有限冲击响应)滤波,可以用卷积公式来实现,也就是对输入数据进行了加权平均)。

DTW可以算出两个序列的最短累计距离,公式如下,其中s(i,j)为到i, j这个位置的累计和
$$
s(i, j)=r(i, j)+\min {s(i-1, j-1), s(i-1, j), s(i, j-1)}
$$
最终表示两个用户的手写动作传感器向量距离是这样的:我们之前不是有六个维度嘛,现在对每个维度计算DTW距离,并且用多次书写的数据进行计算,就得到了6各维度的多次dtw距离值,最终取dtw距离值的上四分位数作为dtw距离,也就是一个六维的向量。为什么要去上四分位数呢,我们当时选取了9个常用的统计特征,发现取上四分位的效果最好,最后就选了上四分位数作为特征。

尽管我们要求用户尽可能保持每次书写的速度和字体大小相同,但是实际结果并不是这样,因此我们计算最终达到dtw距离需要选择一个合适的加权值。现将距离排序,用泊松分布的概率分布函数作为权重,对于两个距离越小的输入值,其给定的权重高,对于距离远的,其给定权重小,对于距离超过n/2的情况,权重几乎为0。对于最终距离得分大于某个值的,我们认为其是真实用户,否则是非法用户。得到的精度大概是假阴率1.78%,假阳率大概是6.5%。

接下来我们做了对系统的攻击实验。总共设计了三种攻击方式,一个是单词攻击,也就是看到用户写了哪几个单词,第二种是能够看到用户书写过程,并拿到用户手写笔迹的纸张,进行模仿,第三种是全程录像,并拿到手稿,多次练习模仿。最终设定的阈值为0.65,精度下降到82%。

手环密码偷取项目

项目背景

传统的密码盗取方法可能是基于肩窥攻击,也就是直接观察,还有屏幕污迹攻击,从屏幕污迹中提取密码,以及通过视频动作分析,录取用户输入密码时的录像,但并不直接录取屏幕,而是通过用户手臂的摆动幅度猜测密码。

而我们这个项目中,用的是在手环上嵌入一个加速度录入程序,直接从加速度的变化数据中,通过一个mutil-SVM分类器和一个KNN分类器,得到最终的密码。

输入密码的过程可以分为三个,按压,释放和移到下一个键。从加速度计z轴的值的变化过程中,可以看到每次按下键盘和抬起的过程中,z轴的值有一个明显的抖动,因为每次按压都不可能是直上直下的,中间存在一些震动。在手指移动的过程中,x,y方向的变化值明显大于z方向,用这几个特征,就可以切开用户的输入数据了。

在项目中,我开发了一个安卓程序,可以展示2个键盘,一个是ATM机键盘,包含9个数字键,一个请取消键,一个清除建,一个确认键。还有一个数字小键盘,包括加减乘除,小数点和确认键。

遇到的困难

1.重力的影响

数据处理首先对用一个高通滤波器对重力进行滤除,最终用的是一个卡尔曼滤波器,具体公式如下,公式右边的g(n)是重力计的值:
$$
\begin{array}{c}{g_{x}[n]=\alpha * g_{x}[n]+(1-\alpha) * \operatorname{acc}{x}[n]} \ {\quad \operatorname{linear}{-} a c c_{x}[n]=\left|\operatorname{acc}{x}[n]-g{x}[n]\right.}\end{array}
$$
2.采样频率不足

因为微软手环的最大采样率是62HZ,当用户快速输入密码的时候,传感器无法捕捉足够的数据值,因此用了重采样来增加数据点,用小波变换来去除数据噪声。( 小波变换去噪可以很好的保护有用的信号尖峰和突变信号。因此小波变换适合用于暂态信号和瞬态信号的噪声去除方面,以及抑制高频噪声的干扰,有效将高频信息和高频噪声区分开来。)

3.数据分割困难

计算窗口能量和,如果这个能量和大于阈值,则认为其实一个移动过程的开始。
$$
\begin{array}{c}{E_{x y} [i]=\operatorname{linear}{-} a c c{x}[i]^{2}+\text { linear }{-} a c c{y}[i]^{2}} \ {A_{x y} [i]=\sum_{n=i}^{i+10} E_{x y} [n]}\end{array}
$$

4.Android程序的开发

用GrideView布局键盘,其实并不是真正的键盘,只是模拟键盘的功能

用hashmap存放键位的值和对应的位置,绑定一个OnItemClickListener,最后为确认键设置一个listener,输入后向手环发出结束信号,手环退出采集程序。

实验结果

项目中我们采用的评价标准有两个:最大概率的k个候选结果的成功率,以及尝试直至成功的次数。

最终在ATM密码版上,top-1成功率达到78%,top-3成功率达到84%,在数字键盘上,top1成功率72%,top3成功率82%,两者在尝试5次左右的成功率约为95%。

手环摇动认证

项目背景

近几年,多种多样的可穿戴设备进入了大众视野,为人机交互提供了全新的方式。智能手表存储着大量的个人隐私信息和重要资料,诸如银行密码或者是联系人信息等等。因此需要一种可靠的身份认证方式来保护这类设备。

传统的身份认证方式,诸如四位PIN码,这种方式由于智能手表的屏幕尺寸限制,在手表上操作极不方便,诸如指纹人脸识别一类的方式,由于设备尺寸限制也不适用于智能手表。因此我们提出了基于个人行为方式的身份认证方法,能够有效保护这类设备。

遇到困难

1.提出一个切实有效的身份特征

一开始我们使用的是传统的20维统计特征,诸如均值,最小值,最大值,四分位数等等。但是这种方法在手表摇动认证这个任务当中,区分度不够强,稳定性也不够高。最终经过大量尝试和实验,我们选择了基于概率密度函数的特征,也就是数据的分布情况。提出了4个摇动特征提取函数,分别以角度和距离提取特征,最终选择的是距离特征提取函数,这个距离用的是随机选择两点之间的欧式距离。

2.分类器选择

众多分类器应该如何选择呢?我们参考了在相似任务上进行身份认证的前期工作,也就是我们在2016年的工作,最后选择了当时对比的21个分类器中效果最好的3个进行对比,最终以平均效果最好的曼哈顿scaled分类器作为系统的分类器。

达到效果

收集150人次的数据,设置了3种攻击方式,一种是在不知道真实用户摇动情况的方式下攻击,第二种是在看过真实用户摇动过程,然后回忆模仿的,第三种是拍摄用户摇动视频,反复训练,然后跟随视频进行摇动的。

最终系统在前两种攻击下得到的等错误率大约是4%,这也是日常生活中最常见的攻击方式,第三种攻击的等错误率大约为20%。

这个系统目前来看精度无法满足欧盟的生物识别标准,但是长远来看,它目前可以用作一个认证的辅助手段。在精度继续提升后,应用前景也较为广泛,比如摇动解锁汽车,摇动开门,超市购物结束后,摇一摇就付款等等。

Spring Boot项目简介

先安装maven,添加path之后,用mvn --version查看是否安装成功,安装成功之后换源,将settings.xml换成阿里源。不过这些都可以通过idea 这个ide来简化

首先是用idea建立一个sping boot的项目,在pom.xml当中配置jdbc,创建买家的数据库表,创建数据库的时候,要选择utf8-mb4字符集,这个编码可以存储emoji表情。

选择了SL4J作为日志框架,常见的还有JUL,log4j等等,创建一个测试类,方法是@RunWith(SpringRunner.class),然后@SpringBootTest,在函数名前面加一个@Test,这样就可以只运行一个test函数。

这里就要提到一个神器插件,当时也是在github上看到推荐的,就是lombok,有了这个插件,只需要在@slf4j,然后在定义某个实例的时候,也不用写getter,setter函数,只需要在上面@Data就行了。

可以直接通过application.yml配置SLF4j,分别配置存放路径,存放文件名,以及log级别,log一共有5个级别。

之后开始开发买家端部分。开发的答题思路是DAO->Service->Controller,最先要开发的内容是dataObject,买家端有ProductCategory,包含类别ID,类别名称,类别编号。id上面是要加一个@ID的注解的,同时,这个类别id一般不会很大,我们就用integer或者long来表示就行了,还要给他注解一个id的生成策略,@GeneratedValue,用的是identity,也就是由数据库生成管理,用刚刚讲的那个lombok插件,就连toString方法都可以省略了。

建立一个repository包,专门用来数据的增删改查。在里面新建一个ProductCategoryRepository,继承JpaRepository,泛型类型是类名和id的数据类型,写完之后先测试一下,用@Autowired注解生成一个repository,然后试一下增删改查,查findOne,增setname,settype,更getOne,setname,settype,在list中找,findByCategoryTypeIn,参数是list。

(hibernate是jpa的一种实现方式,jpa的起名规范一般以get,find,read开头)

接下来是服务层,建立一个CategoryService.java接口,findOne,findAll,findByCategoryIn,save四个方法。

然后建立impl文件夹,继承刚刚建立 的service,在前面要加一个@service的注解,覆写其中定义的方法。到这里商品种类这一部分就写完了,然后写一个test文件进行测试。

商品明细的开发和商品种类的开发大体步骤是一直的,DAO->Service->Controller

建立productService之后,继承实现其中方法,这个有个不同的就是里面有个分页查询,返回的是一个page对象,里面包含productInfo,参数是pageable类型。

之后就可以开始BuyerProductController的书写了。写之前也要先想好他的功能,这个controller的业务逻辑主要包括:查出所有上架的商品,查出上架商品的categoryType,然后是数据拼装出查询结果编码,查询信息和返回的内容。这几个数据可以拼装到一个ResultVO里面,resultvo里面还包含一个list,可以用来存放数据,这个地方就是用泛型的一个好例子,有了泛型就可以返回任意类型的数据值了。我当时给返回的resultvo里面放的值是productVO的list,为了返回json格式数据方便前端调用,要在productVO每个属性前面,加上@JsonProperty。在这个controller上方就可以定义@getmapping的地址。

在这个BuyerProductController里面,又有一个小技巧,是SpringBoot框架提供的方法BeanUtils.copyProperties,这个方法可以直接把两个对象对应的属性值进行拷贝,而不用一个个复制。

后端建好之后就可以开始前后端联调,前端用vue写,写好之后执行npm run dev,前端取数据的地址就是之前getmapping的地址。

之后订单的开发几乎相同,还是dao-service-controller这样一个步骤。不过需要注意的是,每写完一个过程,就要写好对应的测试代码,如果不写测试代码,后面出了问题,就不知道具体是哪个部分出了问题,不好排查。

关于支付部分,因为微信支付需要企业者账号,当时就没有做这部分,打算等有这方面需求的时候再去完成。

hr面准备内容

  1. 项目改进点

    我在学校所做的几个项目几乎都跟机器学习和后台开发相关。首先,机器学习的模型精度很大程度上取决于数据质量,因此,我认为我们项目中训练所用数据的多样性有待提升,我们当初采集数据的受试者几乎都来自于大学校园,本身的数据范围不是非常广,如果要提升模型的可用性和泛化性,需要更加广泛与通用的数据源。其二,系统的跨平台特性还有待提升,现在我们采取的方案是一个类型的终端一种身份认证方式,比如我们给蚂蚁金服的项目中,我们利用的是手机触屏数据进行特征提取和身份认证,以达到金融风控的目的;而我们给战支研究所做的项目中,利用的是手环的加速度计传感器进行特征提取和身份认证,已到达保护重要数据和资料的目的。在未来的研究中,是否有可能找出一种通用于各平台的身份认证方案,是值得研究的,也是我们组现在的一个重要研究方向。

  2. 自己为什么能够胜任这份工作

    我认为主要是我的以往工作经验以及较强的学习能力。我本身是处在一个交叉学科,做过机器学习和后台开发两方面的工作,以及去年也在华为Cloud-BU EI产品服务部进行过实习,对EI部门的相关工作有经验。多年的实验室和实习经验也让我个人的解决问题的能力较强,能够很好地解决我的导师或是leader交代的任务和问题,出色的完成个人工作。

  3. 为什么要读研

    我个人觉得主要有两个原因吧。第一,本科期间,我做过的工作大多偏向于算法研究,开发能力有待提升,当时找工作可能不太能够达到阿里巴巴这样的顶级互联网公司的期望,因此想在研究生期间加强一下自身各方面能力,使自身能够达到较好的工作状态。其二,我大三进入实验室以来,本科发表了2篇论文,我对实验室的研究方向也比较感兴趣,希望能够继续深入一下这个方向的研究,因此我选择了保送研究生,之后在实验室也完成了几个项目,同时在研究生期间还发表了4篇论文。

  4. 想不想来杭州,为什么?

    我个人是非常想来杭州这个城市的。我第一次到杭州是2016年,当时是因为发表了一篇会议论文,去杭州滨江区华美达酒店开会。从机场到酒店的路上,我第一次看到那种五颜六色的民房,那是在别的城市都没有见到过的,然后会议之前有一天的空闲时间,我打车去了西溪园区,绕着园区转了转,感觉整个园区有种气势磅礴的感觉,建筑都很宽,整个园区的绿化面积非常大,有一种在森林里办公的感觉,然后晚上从酒店步行到钱塘江边看了看,感觉风景太美了,同时杭州这个城市的互联网发展水平在国内是非常领先的,所以不管是从人文自然环境还是工作环境来说,我都非常想去杭州。

  5. 为什么想来阿里巴巴

    主要是有两个原因,首先,是阿里巴巴拥抱技术的这种技术氛围十分打动我,阿里开源了很多产品,并且被很多其他公司使用,包括weex,antdesign,taobao jvm,飞冰等等。然后第二个原因,是我个人认为这个公司的前景广阔,且不易被替代。与腾讯对比,腾讯的微信在国外很难打过whats’ app和facebook的messenger,而阿里目前在海外市场正在蒸蒸日上,阿里整体的格局和核心竞争力比同类公司更强,所以我非常希望能够有机会加入像阿里这样的一家企业。

  6. 对前几面评价

    一面因为当时我正在完成蚂蚁金服的项目,内推的同事约定的面试时间是4月4日,然后26号接到了面试电话,由于比较突然,所以表现不是很满意,我给自己打3分;后面两面就比较自然了,我给自己打4分。一面有好几个问题,由于很久没有用过了,当时面试官问的时候,答得不太好。二面几乎问题都回答出来了,三面只有一个newcachedthreadpool的底层实现方式,因为之前没有了解过这一块,当时和面试官一起探讨了一下可能的实现方式,之后查阅资料发现和面试说的存在偏差,我也记录下来了这些面试中存在的问题,写了两篇关于java和redis的博客,加深了对两者的理解。

  7. 同事的什么问题让你接受不了

    我觉得是敷衍工作。大家一起工作,应该同心协力,为一个共同的目标,不论是提升业绩还是提升公司影响力,共同努力。如果有同事只是敷衍了事,没有拼搏和尽力把事情做好的态度,这样会使得团队比较涣散,从而降低大家的工作激情,使整个团队工作效率和工作能力下降。

  8. 最近比较痛苦的事情

    应该是权衡实验室工作和实习面试复习的事情吧。因为在实验室,我目前是带了一个10来人的小团队,要到5月初等师弟上完课,才能把这边的组织工作转交给他。因为实习面试总得复习一下之前的项目,还有做一些算法练习题,比较占用时间,然后带领这个团队呢也需要给每个人安排任务,还有自身的科研任务也需要完成,因此在实习面试准备这方面能分配的时间就不是特别多,只能说是尽可能抽时间出来准备,所以最近时间比较紧迫,大概就是这件事情。

  9. 平时如何学技术

    主要是通过看书,看博客,看官方文档来学习,然后看这三个的时候,都会写一些博客进行记录,以便之后的复习,因为某个技术很久不用的话,可能会淡忘很多,但是如果有良好的记录,那么你再翻阅这些记录的时候,就很容易回想起来。书这方面的话,主要是看一些java,多线程之类的书籍,然后还有一些python,数据分析和机器学习相关的数据;博客主要就是平时自己关注的几个大牛,比如阮一峰,廖雪峰,JakeWharton,linus,还有一些聚合类的博客网站,比如掘金,博客园,segmentfault等等。官方文档基本是在需要用到某个框架或技术的时候,或者是学习某个框架和技术的时候查看的。

  10. 比较佩服的人

    我比较佩服的人是我的导师和在华为实习时候的leader,我导师今年是33岁,博士毕业4年,在博士毕业三年的时候,就评选了副院长,教授,优青,他的工作态度非常积极,我本科时候跟他一起改论文,我俩在实验室呆过2天1夜,他做事情真的是竭尽全力,他的工作态度和工作能力我都非常佩服。第二个比较佩服的就是我在华为的实习leader,我们都叫他柴哥,因为我们实习生要坐班车去公司,所以一般七点多就到公司了,正式员工要求的是9点到公司,但是柴哥经常比我们来的还早,到了公司后,柴哥会先看一小时的书,然后开始一天的正式工作。柴哥对于人员把控和项目把控的能力非常强,能够非常合理地分配项目所需的资源,同时以身作则,永远都保持学习态度。按理说像柴哥这样19级的员工,基本都不会亲自参与代码开发,审查之类的,柴哥经常会把自己带的员工的代码拿出来看,指出他们在代码当中不规范和可以改进的地方,感觉有一个好leader,能够使人进步的非常快。

  11. 为什么不去华为要去阿里

    首先,我个人非常想进一个互联网公司,而华为更偏向于传统的终端和通讯市场,公司的技术氛围比较淡薄,其二,我认为阿里是一个更有前景的公司,通讯行业,目前的5G基本已经挖空了行业十几年来的技术积累,如果要研制6G技术,需要进一步逼近香农极限,在目前看来是遥遥无期的(信道的香农极限(或称香农容量)指的是在会随机发生误码的信道上进行无差错传输的最大传输速率。它的存在是香农定理在带宽有限的信道上的一个结论。),而阿里主要做的是一个交易平台,不管社会如何变革,人与人之间或者公司与公司之间的交易永远不会消失,因此阿里是一个更具有市场前景的公司。

  12. 优点

    坚持,沟通能力强,乐观