最近邻搜索,MIPS,LSH和ALSH

上一篇介绍REALM的文章对文中提到的Maximum Inner Product Search没有作充分的介绍。发出去的标题已经没法改了,这篇文章介绍一下MIPS和最近邻搜索问题,以及两个相关的算法。 问题定义 MIPS的定义很简单,假设你有一堆d维向量,组成集合X,现在输入了一个同样维度的查询向量q(query),请从X中找出一个p,使得p和q的点积在集合X是最大的。用公式写出来就是 $$p=\mathop{\arg\max}_{x \in X}x^Tq$$ 这个问题和最近邻问题很像,最近邻问题只要把上面的定义改成找一个p使得p和q的距离最小,假设这个距离是欧氏距离,则 $$p = \mathop{\arg\min}_{x \in X}\left |q-x\right|^2=(\left | x \right |^2 – 2q^Tx)$$ 如果X中的向量模长都一样,那两个问题其实是等价的。然而在很多实际场景例如BERT编码后的句向量、推荐系统里的各种Embedding等,这个约束是不满足的。 最近邻搜索其实应用非常广泛,如图片检索、推荐系统、问答等等。以问答匹配为例,虽然我们可以用BERT这样的大型模型获得很好的准确度,但如果用BERT直接对语料库中的所有问题进行计算,将耗费大量的时间。所以可以先用关键词检索或者向量检索从语料库里召回一些候选语料后再做高精度匹配。 朴素的算法 对于MIPS问题,一个直观的蛮力算法就是计算出所有相关的内积,然后将内积排序,找到最大的那个。对于最近邻问题其实也类似,即使X中向量模长各不相同,也可以提前计算出来,并不会增加排序的时间复杂度。 内积的计算可以转换成一个矩阵乘法,在CPU和GPU上都有大量的高效实现。当X中有N个向量时,时间复杂度是O(Nd),当N不大的时候是可以接受的,但是通常在工业界的大规模系统中,X的规模往往很大,朴素算法就显得力不从心。 Locality-sensitive hashing 对于某些距离度量(例如欧式距离,cosine距离)下的最近邻问题,可以使用LSH算法来解决。LSH的思路就像下图示意的那样,用hash函数把高维空间的点分到几个桶里去,从而减少距离的计算量。 跟普通的哈希函数不同,这个哈希函数是Locality-sensitive的。具体地说就是它有一个神奇的特点:在空间中离得近的点被分到同一个桶的概率大,离得远的点则大概率被分到不同的桶里去。或者说对于两个点x和y,他们被哈希函数分到同一个桶的概率随着距离的增大单调递减。 这样在查询的时候,只需要精确地比较和查询向量q处在同一个桶里的那些x。如果桶足够多,那便可以将N大大降低,从而提高查询速度。但需要注意的是,LSH是一个近似算法,有可能产生桶内的向量其实都不是最优解的情况,不同哈希函数发生这种情况的概率都不一样,也是作为评价哈希函数好坏的重要依据之一,对这部分感兴趣的朋友可以读参考文献。 下面举一个具体的例子来解释一下LSH。假设某个最近邻问题考虑的距离度量是cosine距离,有一个满足要求的LSH函数(变换),称为Random Projection。 如上图所示,其过程很好理解: 随机取一个空间中的超平面将空间分为两半,X内位于某一半的点标为0,其他标为1; 重复第一步K次。 完成之后,X中的每个点便得到了一个由K个0,1组成的表示(signature)。例如重复了K=32次,那每个点都被分到了一个用一个int32类型的整数编号的桶里。如果这些点在空间中分布足够均匀,那么我们将可以期望每个桶里只有N/2^K个点,当K~logN,则查询的时间复杂度就约为O(dlogN)。整个过程构建出了一张哈希表,由于LSH可能会错过最优解,一个可行的增强鲁棒性的做法是用同样的方法多构造几张哈希表,借助随机的力量来降低犯错的概率。这里有一个讲解LSH的视频,可谓短小精悍,直观易懂,推荐给大家。 LSH看上去相对于朴素算法确实前进了一大步。但别高兴得太早,要达到O(dlogN)的效果必须服从那个很强的假设。而点在空间中分布足够均匀往往是不太现实的。除此之外,一个LSH只能适用于某些距离度量,对于MIPS,找不到符合要求的LSH。 Asymmetric LSH(ALSH) 论文里证明了找不到可用于MIPS问题的LSH函数,但他们发现对LSH稍作点改动即可将MIPS问题转变为欧式距离下的最近邻搜索问题。改动的关键就在于Asymmetric这个词。在LSH算法中,对查询向量q和X中的向量做的是同样(对称) 的变换,而在ALSH中作者对两者使用了 不同(非对称) 的变换。简单起见,假设查询向量q的模长是1。对于X,先做一个放缩变换使得X中所有向量x的所有元素都小于1。然后对X中的向量进行变换P(x),对查询向量q做变换Q(x),P和Q的定义如下: $$P(x) = [x; \left | x \right |_2^{2^1}; \left | x \right |_2^{2^2},…,\left | x \right |_2^{2^m}]\ Q(x) = [x;\frac{1}{2};\frac{1}{2},…,\frac{1}{2}]$$ 可以发现,P和Q虽然变换不同,但都会使输入向量增加m维。进一步观察可以得到 $$Q(q)^TP(x)=q^Tx+\frac{1}{2}(\left | x \right |_2^{2^1}+ \left | x \right |_2^{2^2}]+…+\left | x \right |_2^{2^m})\ \left | P(x) \right |_2^2=\left | x \right |_2^{2^1}+ \left | x \right |_2^{2^2}]+…+\left | x \right |_2^{2^{m+1}}$$...

March 7, 2020 · 1 min · Yuanhao

REALM: Retrieval-Augmented Language Model Pre Training

知识就是力量 ——培根 背景 去年可以说是语言模型快速发展的一年,BERT、XLNET、Albert等等模型不断刷新各个NLP榜单。在NLP榜单中比较引人注目的应该属于阅读理解型的任务,例如SQuAD等等。以SQuAD为例,模型需要阅读一段给定的文本,然后回答几个问题,问题如果存在答案,答案一定可以在文章中找到。所以说虽然叫阅读理解,但其实和序列标注有点相像,是在给定序列中标出答案段。而这篇论文针对的问题叫开放领域问答(Open-domain QA),对于一个问题Q,模型需要从包含大量文档的知识库中找到答案,而不是像SQuAD数据集一样从一篇文章中寻找。 大部分的语言模型都采用一种称为masked language model,简称MLM的任务来训练,让模型学会类似完形填空一样的能力。通过在大规模语料上的训练,预训练语言模型如BERT实际上已经隐含了一些知识。例如输入一句“The is the currency of the United Kingdom”,BERT很有可能会填入单词"pound"。虽然他还是根据词的共现信息学习和推理的,但看上去就像具有所谓的知识一样。从去年开始就有越来越多的研究从单纯语言模型转换为带有知识嵌入的语言模型,例如清华和百度提出的两个同名模型ERNIE。 但上面说的这种隐含知识不好把握,也难以扩展。这篇论文则提出了一种更加模块化且可解释性更强的知识嵌入方法。总的来说,他的方法是训练一个独立的“语境知识抽取器”(contextual knowledge retriever),通过这个抽取器来决定应该在推理时使用哪些知识。而且这个抽取器和语言模型一起进行非监督预训练大大提高模型性能。 方法 如上图所示,整篇论文涉及两个任务,左边是语言模型预训练任务MLM,右边是QA任务。下图是预训练任务一个更加完整的流程图,我们由此切入进行介绍。 整个过程分为两个关键步骤。先看第一步,即neural knowledge retriever,它负责计算p(z|x)。要实现这个过程首先需要对z和x进行编码。论文采用的是BERT,对于问题x,直接输入BERT,取[CLS] token的输出作为编码向量,而对于文档z,则将标题和正文用[SEP]连接后输入BERT,同样去[CLS] token的输出。论文中还对BERT的输出向量进行了降维处理。即 对于文档库中的某一个z,则 其中f是问题和文档的相关性, 以上部分就称为neural knowledge retriever,通过他每篇z都会得到一个p。现在可以进行第二步,综合x和z求y。上图是一个预训练的例子,y是抠掉的词。利用z的方式是将z的正文和x拼在一起来提供上下文信息,然后优化下面的目标 其中j指第j个masked token。 在做QA的时候稍有不同。由于此时是针对某个具体的z,所以作者将开放域问答任务退化成了像SQuAD一样在文档中找答案的阅读理解任务。 这一部分就是knowledge-augmented encoder。 训练 上面已经描述了预训练阶段和QA finetune阶段的任务。训练的过程都是最大化正确y对应的logp(y|z,x),而且以上描述的两个任务都是可以端到端优化的。 但这里面对一个问题,上面有个公式需要对整个知识库中所有的文档z的相关概率求和,这是很困难的。作者提出将这一步用只对概率最高的k个文档计算来近似,因为绝大部分文档由于与问题不相关,p(z|x)都非常小。但问题还没有解决,如何找到概率最高的k个文档呢。 观察公式可以发现p(z|x)是正比于两个编码后的内积的,由于大家的分母都一样,分子的顺序就是整个分数的顺序。所以可以用最大内积搜索算法(Maximum Inner Product Search, MIPS,并不知道是什么,维基百科都没有)来解决。但要构建一个快速检索的索引又要求两个编码后的向量是确定的,而由于编码器是不断训练的,所以这个条件无法满足。为了追求一个平衡,作者决定每隔几百步才更新一下编码器,并重新构建索引。而且这只发生在预训练语言模型的时候,在finetune QA任务的时候只使用语言模型得到的编码器编码一次所有的z和x并构建索引。 额外策略 在研究过程中作者发现了一些能让模型更好训练的策略。 只训练真正需要知识的词(通常是实体和日期)来训练MLM 在topk文档外添加一个虚拟的null document 避免让x出现在z中(因为x被mask过,如果它来源于z,那答案就暴露了!) 避免冷启动的retriever太渣导致的恶性循环,他们用了一个以ICT作为任务的模型来初始化retriever 结果对比 这篇论文的对手主要是原来sparse retriever+神经阅读理解模型的组合,例如大名鼎鼎的DrQA。所谓sparse retriever就是指用例如TFIDF之类的特征进行检索的模型。还有一些跟本文很像的neural retriever+neural reader的组合。其中提到了一个ORQA,跟这篇非常像,只是这篇增加了预训练的步骤。最后是一些生成式模型,例如finetune后的T5(可怕!) 在Natural Questions-Open(NQ)、Web Questions(WQ)和Curated Trec(CT)三个数据集上的结果如下 总之一句话,非常牛逼!而且这里模型只取了top 5文档,其他模型可能取了20-80篇,还是打不过他。注意到ours的括号内有两个数据,Z是知识库,很好理解,X是指预训练用的语料。而且通过文章的Ablation Analysis部分可以知道预训练其实是非常关键的一个步骤,对performance的贡献非常大。 后记 我感觉这篇论文和他提到的ORQA还是很厉害的,知识嵌入也从去年的实体粒度的嵌入发展到了如今句子、篇章级别的嵌入。试想一下,这项技术发展起来之后,如今基于词的Sparse搜索引擎应该很快会发展成对NN更友好的Dense搜索引擎,所有的内容也许都会被映射到一个向量空间。各路神经网络将在这个向量空间尽情驰骋~莫非得encoder者得天下?! 论文链接:https://kentonl.com/pub/gltpc.2020.pdf

March 6, 2020 · 1 min · Yuanhao

能跟你聊DOTA的神经对话模型:Meena&DialoGPT

提到对话机器人或者聊天机器人,国内的朋友可能先想到的是微软小冰或者苹果Siri。这两个机器人由于需要完成一些功能性的任务,都采用了模块化设计,虽然神经网络在其中起到了重要作用,但输出结果并不是从输入语句“端到端”产生的。而且用过的朋友都知道,他们的聊天能力并不是很令人满意。 今天介绍的神经对话模型则是一步到位,将对话历史作为输入,让模型直接生成下一轮的回复。学术一点说,神经对话模型本质上是在解决文本生成的问题。相比于很多聊天机器人(包括我们的晴天一号)目前使用的语料库+检索算法的架构,生成式(包括改写等等)算法能给对话带来更多的可能性和趣味性。最近,得益于大规模预训练语言模型,文本生成任务得到了长足的发展。本文的主角就代表了目前神经对话模型的最高水平,分别是19年十一月由微软发布的DialoGPT和20年一月谷歌发布的Meena。 在开始正文之前,先展示一段机器人生成的对话,让大家对技术现状有个直观感受。 模型 两篇论文都没有在模型方面有什么重大的创新,他们使用的都是如下图所示基于Transformer的seq2seq模型。这里大致介绍一下所谓seq2seq模型的工作原理。每生成一个单词的过程如下:将对话的历史信息输入进编码器(左下角inputs),模型已经生成的当前轮结果输入解码器(右下角outputs,没错,outputs是也用来input的~),然后模型将会综合两者信息输出它预测的下一个词(上方output)。而生成一句完整的回复只需要将刚才新生成的词拼接到当前轮已有结果的后面(图中shifted right的含义),重复上述过程直到模型输出句子结束符。 DialoGPT采用的是标准的GPT-2模型,也就是上图模型的加大号版本;而Meena采用的是去年Google通过神经网络结构搜索(NAS)方法得到的进化版transformer模型(Evolved Transformer)。Meena由1个ET编码器和13个ET解码器构成,ET解码器和标准Transformer解码器的对比如下图所示,两者似乎差别不大,论文注脚说一个ET Decoder Block大概是标准Transformer Decoder Block的两倍深。 虽然Meena和DialoGPT都是Transformer模块搭建的模型,但两者规模的差别非常巨大。Meena使用了极其巨大的隐层规模(2560 hidden size,32 attention heads),总参数量达到了惊人的2.6B。相比之下微软的模型就克制很多,最大规模的DialoGPT参数量为762M,表现最好的模型参数量是345M。作为参照,目前地表最强——google的T5模型参数量是11B,BERT large则只有340M。 数据 数据则是两篇论文提升performance的重中之重,特别是对于模型大小比较正常的DialoGPT来说。 DialoGPT论文里明确说数据是从Reddit上搞下来的。通过解析Reddit上的讨论帖,可以获得“树状”的对话数据,然后把每一条从根节点到叶节点的路径拎出来都能获得一个完整的对话。假设一个对话共说了K轮,每次取出当前轮作为标签,之前轮的对话作为输入,总共可以获得K-1条训练数据。Meena的数据来自于public domain social media conversations,他也是从树状对话中获得的数据,我猜测这些对话的形式应该和reddit这种论坛比较相似。 他们的数据量都是非常之巨大的,DialoGPT的总session数是147116725(147M),总词数是1.8B。再来看Meena,他们的总训练数据量是867M,总词数是40B,存成文本文件是341GB。这里可以对比一下之前的模型,BERT的训练数据是16GB,GPT-2的训练数据是40GB,曾经的数据狂魔Roberta是160GB。谷歌再次定义了什么叫大力出奇迹。我在维基百科看到人的平均阅读速度是每分钟200词,按这样的速度1 Billion单词需要一个人不眠不休阅读大概347天。从这个角度看,目前的训练数据量似乎又显得比较合理了。 两篇论文都提到要对数据做非常大刀阔斧的清洗,例如删掉太长或太短的、重复词语多的、含有URL的、不含有常见词的等等。总之,要保证数据质量足够高。 顺便提一下,DialoGPT尝试了从预训练模型迁移和从对话数据集从头训练两种方式。结果是迁移的表现明显好于从头训练。我认为这个现象非常的合理,使用预训练模型就好比教一个学过好几年语文的小朋友在网上聊天,这应该好过一个从小就只通过网络聊天学语文的小朋友。但Meena好像采用的是从头训练的模式,也许他们预训练一把能得到更好的结果。 由于使用了极大的模型和数据集,两个模型都是使用了豪华的硬件来进行训练。DialoGPT使用16个V100,而Meena则使用了2048个TPU v3核训练了30天。512个v2 TPU组成的POD三年协议价是12万美元一个月,v3应该更贵,所以你如果想复现这个模型,至少要花费48万美元。有钱真好:) 解码方式 解码是生成式任务里很重要的一个部分。因为正如前面介绍的,生成模型在推理时每一个时间步只会生成下一个词,而且后面的结果会依赖前面的结果,所以就需要一个好的解码策略来保证这一个个token最后能组成高质量的句子。去年有不少关于解码的工作,希望让机器人产生更有意义、有个性的回复。 DialoGPT没有采用什么独特的解码方式,而是使用了常见的Beam Search(集束搜索),只在最后用了一个较为新颖的重排序算法来从集束搜索得到的TOP K个结果中选出最佳的那个。在排序时,他们用一个训练好的“反向模型”来由生成的回复倒推输入。选用使输入语句概率最大的那个输出作为最终的输出。由于采用了Beam Search,它的解码过程应该是比较耗时的。 Meena比较有意思,作者们表示由于模型的Perplexity(困惑度)够低,完全不需要使用集束搜索。而是采用非常简洁的采样+重排就可以得到好的句子。 困惑度p可以理解为,如果每个时间步都根据语言模型计算的概率分布随机挑词,那么平均情况下,挑多少个词才能挑到正确的那个。 –知乎用户TimsonShi 所谓采样,就是在每一步都根据输出层得到的概率分布,随机选一个输出token,直到得出一个完整的句子。重复采用过程N次,得能到N个句子,最后将这N句话根据归一化后的句子概率排序,选出最优的。需要注意的是他们的输出层并不是对Vocabulary的简单Softmax,而是像知识蒸馏里一样增加了采样温度,即 $$p_i=\frac{\exp(z_j/T)}{\sum_j{\exp(z_j/T)}}$$ 作者们发现T的大小会影响生成结果。T小的时候,倾向于使用常规词汇,而T大的时候倾向于使用与上下文相关的词汇。论文使用的T为0.88,N为20。他们的结果显示这种采样的效果相比于集束搜索确实有很大的改进。下面一个是集束搜索的结果,另一个是采样,采样很好地避免了集束搜索生成结果丰富性差的弊端。 能得到这么好的结果有一个重要前提,就是模型的困惑度也就是perplexity够低。Meena的困惑度有多低呢,它是10.2,相比较之下DialoGPT的困惑度大约是15。 评价指标与结果 对评价指标的选择,两篇论文有很多共同点。他们都已经从BLEU这种考量词级别重合度的离散客观指标进化到了直接跟对话质量相关的抽象指标。从这一点也可以感觉出这个领域已经进入了相对成熟的阶段。DialoGPT使用人工评价的方式,评价模型的relevance,informativeness和how human-like。而Meena则用综合sensibleness和specificity的称为SSA的指标对机器人进行评价。所谓SSA就是对sensibleness和specificity的简单平均,A对应就是average。 Sensibleness我认为基本对应relevance,是指机器人能否得出符合上下文的有意义回答。但有意义是不够的,正如文章所说,一个只会回答“I don’t know”这类万金油句子的机器人说的话也是符合上下文的,但其实并不好。 Specificity对应infomativeness,是另一个维度,它评估机器人是否能给出有具体信息的答案。例如当人问”你喜欢电影吗”的时候你可以回答“我不知道/这很难说”,但一个更令人满意的回答可能是”当然,我特别喜欢科幻电影”。 我们来看一下Meena论文里的结果,因为他们为了比较,在相同的评测体系下把DialoGPT也测了。在Meena论文的评价指标下Meena的水平相当高,人类的SSA大概是0.82,Meena是0.78,已经相当接近。其他的对手在Meena面前基本抬不起头来,DialoGPT 0.51,Cleverbot 0.44。他们还评估了小冰和Mitsuku这两个著名的模块化机器人(非端到端的神经对话模型),SSA分别是0.36和0.56。文中还特别提到小冰的Specificity很差,只有0.19,这和我的使用感受是一致的。小冰感觉总是在扯淡,很难说出有意义的东西来。 SSA体系虽好,但完全依赖人工评价。Meena论文还评估了perplexity和SSA的相关度。结果如上图所示,横坐标是困惑度,纵坐标是SSA,Perplexity和SSA呈现非常明显的负相关关系,相关度大概是0.94。这就是说在训练模型的时候只需要评估混乱度基本就能知道最终的效果。这个结论我觉得非常重要,它无疑给广大神经对话模型研究人员带来了一个福音,毕竟人工评价实在太麻烦也太贵了。这下好了,以后大家奔着降低perplexity去就好了。 对话样例 在这一小节再放几张对话小样,从图中可以看出,这些模型的表现都很好,回答不仅流畅还符合一些常识。当然,我们在前面的文章里也讲过,这种隐含知识不太好控制。但只要语料够优秀,效果看起来是非常棒的。 后记 DialoGPT去年年底就发布了,而且微软大方地提供了预训练好的模型,他们也成为了这个领域当时的SOTA,但没想到这么快就被谷歌超越了。今年初看到谷歌连续放出Meena和REALM的时候还是蛮激动的,一个在类人闲聊上获得突破,另一个大幅提高了外挂知识库的利用水平。Twitter上针对这两篇论文也充满了乐观的论调,甚至有人预测2021年我们就能看到AGI了。这两年的技术发展确实让我们对文本数据的利用水平有了质的飞越,虽然不知道AGI如何,中文房间我感觉很快就会造好了。 另外也感慨Quoc V. Le带领的团队最近势头真猛。谷歌海量算力给了他们无限的空间,已经有在CV(例如去年的EfficientNet已经红遍Kaggle社区了)、NLP等领域遍地开花之势。如果中文房间真的盖好了,门牌上应该写的是1600 Amphitheatre Parkway, Mountain View, CA, U.S.吧。 参考阅读 DialoGPT: http://arxiv....

March 2, 2020 · 1 min · Yuanhao

大江大海1949

大江大海1949 {: .align-caption style=“text-align:center;font-size:smaller”} 就是上面的这本书,在大陆是买不到,甚至搜不到的。书商也很精明,在封面上印着“全球畅销经典作品,至今未能在中国大陆出版”来增加你对它的好奇心。其实早在多年前我就读过几页电子版,这次去台湾又在诚品书店遇见,便买了一本纸质书。 书是从讲述龙应台他们家如何辗转入台开始,通过描绘不同人物的故事和生平来展现那个特殊历史时期,更重要的可能是如书的扉页中写的 向所有被时代践踏、侮辱、伤害的人 致敬 断断续续花了一个月才读完全书,一些人和事已经记不清楚了,但有几点确实给我比较强烈的冲击。 其一是历史的残酷。不管是从台湾山区被征到东南亚成为狱卒的青年,还是从河南一路往南逃亡的少年,抑或在内战中被自己的同胞兄弟杀死的军人。身处那个时代的人们在历史的巨浪面前,真的就如蝼蚁一般,没有选择的权利,只能随波逐流。但反过来思考,历史往往又是被几个人左右。不管是日军将领,还是国共两党的高层,因为他们的诉求和命令,成千上万的平民百姓便被无故卷入到历史的漩涡中。高层虽然也是成王败寇,但在这个过程中最受伤的还是底层百姓,因为底层往往就只有你死我活的残酷争斗,生死关头,哪还管什么对错,可能连人类的尊严都可以置之不理了。 但历史又有公正的一面,我觉得龙应台的这本书对待这个问题却不够坦诚。书里有许多对解放军的描述,例如让手无寸铁的民兵打头阵与国民党军作战,有一些表述让我这个大陆人读起来不太舒服。我以前对解放战争时期我军如何能以弱胜强还不太清楚,但看了这本海峡对面的书我更加确定,胜利正是因为人民站在解放军这边,因为我党描绘的蓝图更加能打动民众的心。 与残酷的历史形成鲜明对比的当然是人的光辉,这也是龙应台一向擅长的部分。印象最深的是那五千个逃亡的少年和他们的老师,一路风餐露宿却还靠一本《古文观止》传承文化,我是真的为我们民族身上的这种韧性感动了。还有那些为了自己的理想信念甘愿付出生命的人,那些身处邪恶阵营却保有良知的人等等。我也相信不管再黑暗的时代,都会有点点温暖人心的光,而这些星星之火,终可燎原。 最后说一点稍不切题的内容。虽然身处和平年代,但中国大地上这几年涌起的浪潮其实也不小。就拿最简单的房子来做例子。多少人因为早买房、多买房甚至炒房就积累了大量的财富。而这些巨量的财富对于后来者来说就变成了沉重的负担。试想你的房子在一年之内暴涨了几百万,你又怎么还会把心思放在只能带来微薄收入的工作上呢。听说是最近北京的房价跌了,几个月的时间财富就能缩水上百万。但不管是涨价还是跌价,刺激太多,人总会变得狂躁,人生的悲欢也容易被放大,甚至扭曲。

September 1, 2017 · 1 min · Yuanhao

台湾游记之感悟

总体印象 对台湾的总体印象是非常不错的,非常温馨。例如在台北,除了便利店和屈臣氏,最多的当属咖啡店、烘培坊和小吃店了,街道中洋溢着咖啡香、面包香和各种其他食物的气味。城市的规划也很合理,巷子多而不窄,行人走车都没有问题。沿街大多是骑楼,可以为行人遮阳挡雨,这在台湾真的非常重要。厦门中山路一带的老城区也是这种骑楼,但新建的房子却丢掉了这个优良的传统,大多一块地建一个小区或是一个独栋的写字楼。没有沿街的店面,更不要提骑楼了。城市成了一个个孤岛,哪里去找温馨的气氛? 另一处给我震撼很大的地方是花莲。在夜市恰逢他们的嘉年华,舞台非常酷炫,场地中有凳子,不需要票可以自由进出,组织也非常专业,现场秩序很好。虽然表演嘉宾一个都不认识,但现场观众和艺人都很嗨,互动很好,我们也被打动。这个嘉年华已经办了十五届了,已成为花莲的一张名片。但震撼我的并不是演出本身,而是当地政府在开展文化活动方面展现出来的活力和能力。里面没有太多政治的成分,真正能让当地甚至周边的居民乐意参与,并且喜闻乐见,玩嗨玩好。我觉得这种思路大陆官员基本上是没有的。更厉害的是花莲的人口只有三十多万,在大陆绝对算是一个小城了,而我们的小城中又有多少文化活动,群众的参与度又是多少? 花莲嘉年华现场 {: .align-caption style=“text-align:center;font-size:smaller”} 台湾公民的素质普遍较高,还常常能遇见一些动人的细节。例如在台湾,高铁或者景点中出售的盒饭、饮料和城市里的价格是一样的,除了兰屿等离岛会有一个公开的涨价幅度。这在大陆是不可想象的,甚至连铁道部这样的国家队都是迫于压力才推出15元的高铁盒饭。在台湾路边的奶茶店,自带杯子可以打八折;停车场几乎都有孕妇专用车位;不允许带宠物的商店会专门标注导盲犬可以入内等等。店员都很和气,谢谢常挂嘴边;民宿老板对游客也很信任,入住退房几乎都是自助的。还有一件事非常奇怪,台湾的路边垃圾桶实在太少了,但马路却很干净。花莲同住一间民宿的东北老大爷感叹“这里的文明程度大陆再过20年也赶不上”。 导盲犬贴纸 {: .align-caption style=“text-align:center;font-size:smaller”} 旅途中接触了一些台湾的年轻人,他们的一些选择在我看起来也挺有趣。例如在兰屿民宿有个从台北来打工换宿的小姑娘。跟老板联系好后自己一个人就来了,一待一个月,帮老板打扫卫生,接待住客,老板提供食宿;闲的时候就自己在岛上玩。她并不是一个特例,在岛上的饭店、民宿很多这样的年轻人。有些人干脆长期待在小镇,例如前面提到恒春的波波厨房,就是几个对美食有追求的年轻人一起经营的。近几年这种事情在大陆也越来越多,我觉得是好的趋势。我们还在各地遇到许多为了办一场活动筹款的小学和中学生,他们在大街上立着募捐箱,然后用自己的才艺表演吸引路人。在花莲的海边有一对小姐弟,打架子鼓,除了募捐他们的牌子上还写着Facebook粉丝达到多少时爸爸就会带他们去韩国,希望大家点赞。我觉得这些小朋友都好棒,他们这么小就敢于追逐自己的梦想,也用自己的实际行动积累资源,一步一步达成目标。这种自主、自立的精神我觉得在大陆是比较缺乏的。 小朋友们的募捐活动 {: .align-caption style=“text-align:center;font-size:smaller”} 食住行 说起台湾的美食,据说高晓松都控制不住自己,但整个体验下来并没有太多让我惊喜的地方。 先说夜市。我们去了各地的多个夜市,夜市卖的食物大多是煎炸烤的做法,烤肉、蚵仔煎、炸鱿鱼、炸鸡排、烤猪蹄等等。既不太符合我的饮食倾向,似乎大陆也见得多了,没什么新鲜感。还有一些比较有特色的例如大肠包小肠、鱼蛋、淡水阿给等等也没有特别打动我。我印象最深的是在花莲吃的春卷,当时铺位里是几个年轻人,一次做十来个,面饼一字排开,放上不同口味的馅料,卷饼手法娴熟。夜市、小吃店都不乏年轻经营者的身影,这好像和大陆有一些差别。 春卷 {: .align-caption style=“text-align:center;font-size:smaller”} 然后说日常餐饮,有米饭类几大金刚:肉燥饭,卤肉饭,封肉饭,排骨饭,可以搭配各类汤;还有各色牛肉面,担仔面,米线等等。街边店比较便宜,大概80台币以内就可以吃饱,但有字号的店铺就贵很多了。例如台北永康街的牛肉面卖130台币一碗,但我觉得除了肉多吃起来还没有街边65一碗的牛肉面好吃。 此行的住宿除了垦丁、兰屿和花莲是民宿外,其他都是旅馆,都是在agoda定的,平均下来每晚标间大概300左右。总体住宿体验还不错,但感觉agoda并没有提供最优惠的价格,若准备时间充足可多做功课对比一下各大订房平台。 行在台湾也是比较方便的。对于城市间转移,在西岸可以选择高铁,快速宽敞,东岸只能选择台铁。台铁有不同的车型,速度不同。需要注意的是高铁站往往离城区较远,一般还需要乘接驳车或打车。但我们在台中出了高铁站之后乘接驳车是免费的,令人感动。若在城市里,台北有发达的捷运系统,相当于地铁。台北地铁给我的印象实在太好了,车身比北京地铁宽至少百分之三十,车站也很宽敞漂亮。结合台北不到三百万的人口,你应该可以想象乘车体验有多好,即使在上下班高峰也丝毫没有拥挤的情况。公交车也类似,坐了几次公交基本都有座位,而且台北公交的座位实在太舒服了。打车比较贵,但体验很好,台湾的的士都保养的很棒,车体干净到发亮,都是皮座椅,不会像大陆一样包裹肮脏的布垫,中控台也不会安装各种毫无设计感的仪器。 在台南和高雄我们还体验了台湾的共享单车,既有政府运营的有桩车,也有类似ofo的OBike,体验都不错,非常适合用于除台北外的其他城市游览。有桩车虽然要在指定地点借还,但会提供车锁,非常人性化。说到这强烈建议到台湾之后买一张当地手机卡,例如租单车这种服务都是需要短信验证码的。 台南有桩共享单车,可变速,车头有车锁 {: .align-caption style=“text-align:center;font-size:smaller”} 在台湾唯一比较麻烦的是大部分消费都得用现金完成,便利店中只有全家可以用支付宝。游玩时请保证身上有足够的台币。 台湾与大陆 台湾毕竟只是个小岛,自身人口少,市场体量小。近些年随着大陆工业的发展,逐渐丧失原有优势,四小龙的经济活力已大不如前。小英上台以后陆客大量减少,旅游业又受到重创,我们在台湾十几天都没有遇到大规模的旅游团。从经济上来说,依靠大陆已经是她几乎唯一的选择。 在情感上可能岛内人民分歧比较大。兰屿的民宿老板刚见面就说自己祖籍南京,后来聊天又跟我们讲了更多家里的故事。他的父亲今年93岁了,直到前几年他奶奶去世,每年还去南京探母。他奶奶去世之后,父亲年纪也大了,走不动了,换他的三叔每年从南京飞到台湾探望他的父亲,他的三叔今年也有86岁了。老板说,大陆他陪父亲去过很多次,也是有感情的,“统一了最好”。他又指着他还年幼的儿子说,台湾已经没什么发展,有能力的年轻人都流向海外,若他儿子留在台湾,他更加希望两岸交好,“万一有一天真的打起来,难道我要看着我的儿子上前线跟大陆打吗?有什么好打?难道不可笑吗?”而对于没有现实顾虑的年轻人,似乎较少深入思考这些问题,当然也没有和他们深入地交流,印象很深的是有被问到过“你们真的认为台湾是中国的一部分吗?” 结语 十四天的台湾之行结束,我马上将参加工作,踏上新的人生旅程。在大陆天天讲发展,人人逐名利的背景下,台湾就像一个世外桃源。桃源之中虽无摄人心魄的壮美之景,但它却可以让人放松、平静。龙应台在《大江大海一九四九》的卷首写道 正因为,他们在跌倒流血的地方,重新低头播种,我们这一代,得以在和平中,天真而开阔地长大 抛开政治分歧不谈,台湾人民在这个弹丸小岛上辛勤耕耘的精神和对待生活认真的态度是值得我们学习的。衷心希望海峡两岸都越来越好。

August 21, 2017 · 1 min · Yuanhao

台湾游记之行程

乘着毕业,终于把期待了很久的台湾之行落地了。本来光哥想在台北看一场周日的话剧,因此我们把行程定成了14天。虽然话剧没看成,但是十四天给了我们充足的时间环岛。 第一天 7.4 我们是7月四日上午8点多厦门飞台北的飞机,但出门不顺,直到十一点多才起飞。到了台北已是下午一点,一路来到住所放下行李便开始执行我们半天的游玩计划。我们住台北车站,附近就有不少景点,当天下午是一路向西。首先步行来到了总督府(现总统府),卫兵不多,比较有意思的是有一个老人家庄严站在总统府前,面朝外侧举起自己的一只手像在向着空气演讲。 演讲老人 {: .align-caption style=“text-align:center;font-size:smaller”} 而后来到中正纪念堂,这真是个纪念“堂”,大堂里面就有一个蒋先生的雕塑,很空旷。在前面的自由广场上正巧遇到在训练的仪仗队,当时下着大雨,他们仍然照常训练。等雨渐小,我们就出发前往象山,看101大楼。后面101大楼的景色证明冒雨爬一小时的山是非常值得的,我也拍到了此行最满意的几张照片之一。晚上逛了逛诚品书店就回去休息了。 黄昏时的101大楼 {: .align-caption style=“text-align:center;font-size:smaller”} 第二天 7.5 今天基本是沿着捷运淡水线往北游览。第一站是士林官邸,这是此行印象比较深刻的人文景点。官邸内装潢朴素,家具也不算奢华,但在但在电子导览温柔的声音和蒋宋二人的故事衬托下显得格外温馨。宋美龄的化妆室可是“梦幻的粉色系”,即使贵为第一夫人也还有一颗少女心,颇为有趣。接着是台北故宫博物院,重点看了瓷器、玉器、书画展厅。特别是在瓷器展厅里真是感受到了精致的古代工艺品带来的震撼和冲击。可惜里面的空调实在太给力,中午又冷又饿的我们便没有再继续参观。 下午来到了淡水,周董的故乡。沿着老街走了一圈,比较普通。周董母校不让参观,只得在门外留个影,然后便去了旁边的真理大学、红毛城等景点,最后再走到著名的渔人码头,静静地看了看海,听了听歌。 渔人码头 {: .align-caption style=“text-align:center;font-size:smaller”} 晚上乘捷运回到市里,去逛了逛大稻埕以及繁华的西门町,最后回到酒店。 第三天 7.6 这天主要是往南,先去了龙山寺、国立台湾大学,然后去了个艺术村”宝藏岩“(基本工作室都没有开门,感觉略坑),接着去了康永街,吃了牛肉面和芒果冰,附近的师大也顺便逛了逛。基本没有什么特别出彩的景点。下午我们便从台北出发前往台中。 我们到台中酒店放下行李后就近逛了逛“逢甲夜市”。 第四天 7.7 这天游览台中,台中其实景点不多,游客来此多半是因为要去日月潭或清境农场。我们上午去了东海大学,这是一所教会大学,日式风格的校园特别漂亮,最出彩的当然是贝聿铭大师设计的这个路思义教堂。下午的时候我们买了个当地旅游项目,拼车前往高美湿地。湿地的卖点是“最美落日”,可惜当日下着小雨,云层厚重,我们无缘得见。 路思义教堂 {: .align-caption style=“text-align:center;font-size:smaller”} 晚上回到市区,我们便乘火车站前往嘉义。 第五天 7.8 最终我们在日月潭和阿里山中选择了后者,而到嘉义纯粹是为了去阿里山。阿里山其实就是个森林公园,原来日本人为了砍伐山中的林木资源修建了一条铁路,但由于我们功课做得不够,没提前买上火车票。公园里主要看一些“神木”即树龄很长的树木。是个亲友郊游的好去处,但从旅客的角度我觉得可玩性不高。 当晚我们从嘉义乘火车前往台南。晚上乘着去洗衣服夜游了一下古城 第六天 7.9 台湾的开始在台南 台南真是一个充满历史感的小城市。除了城市本身,我们恰好入住了一个极其古老的酒店,装潢、设施可以让你感觉时光倒流了四五十年,打开抽屉里面还放着《圣经》和星云大师写的《献给旅行者》;而酒店对面的电影院外墙海报居然是手绘的,这个电影院本身就像在一部老电影里。离开台南时光哥还专程去买了一张手绘的《爱乐之城》明信片。 电影院 {: .align-caption style=“text-align:center;font-size:smaller”} 台南的人文景观主要有赤坎楼、安平古堡、大天后宫、孔庙等等。整个城市遍布庙宇,偶尔还能看到教堂,估计宗教人口占很大比例。赤坎楼和安平古堡最初均为荷兰人所建,台湾在近代百余年先后受到荷兰、日本、美国的影响,加上本身原住民以及49年后涌入的外省人,也算是个多元文化交织的地区。 大半天台南就逛完了,下午我们又坐火车前往台湾第二大城市——高雄。 到高雄时还不到傍晚,我们走路到附近的六合夜市简单吃了点东西,又来到稍远一点的瑞丰夜市。然后去了小巨蛋,又去了”爱之河“,一通暴走后回到酒店。 第七天 7.10 高雄虽然是台湾第二大城市,但我们给他的分配的时间也只有大半个白天。上午我们往西子湾方向游览,先到了驳二艺术特区。这里有点像北京的七九八,是由海边仓库改建而成的,整片区域有许多有趣的雕塑,仓库内的展览我们并没有参观。离开驳二之后,我们去了附近的国立中山大学。这所学校依山傍海而建,房子几乎是红色的,配上绿树蓝天,画风非常鲜艳。学校的海景简直无敌,大陆的大学我去不过少,论景色几乎没有可与厦大相提并论的,今天在宝岛终于帮它找到了个对手。 中山大学 {: .align-caption style=“text-align:center;font-size:smaller”} 从高雄开始,我们开始领略到台湾湛蓝的海水。下午,我们坐出租车前往台湾最南端——垦丁。 到垦丁的民宿住下后,最重要的事就是租电动车。我们实际上住在恒春,是一个古城,离垦丁骑车还有二十分钟的路程。这片大区域景点分散,没有交通工具是根本不行的。 当天我们先去了猫鼻头公园,在山顶可以遥望垦丁大街,面朝大海的话眼前就是一片湛蓝。这种感觉真的有一种让你安定的力量,相比起来大陆浑浊海水的效果就要大打折扣了。从猫鼻头出来我们去了一个沙滩,台湾人民还是比较奔放,有不少比基尼MM,:P,也有一些传统水上项目比如摩托艇之类的。大约计算号时间,我们便前往台湾第二处适合看日落的地方,号称“全球十二大日落”的关山日落。虽然今天天气很好,但是天边的云朵又一次让我拍日落的想法落空了。 关山日落 {: .align-caption style=“text-align:center;font-size:smaller”} 晚上吃了伙计冬粉鸭,其实冬粉鸭是配角,主角是卤味。老伯切卤味的刀法了得,但感觉卤味比较一般。 第八天 7.11 这天主要在垦丁瞎逛,鹅銮鼻、龙磐公园、风吹沙之类的地方。清华的朋友们如果因为学校不让骑电动车而不爽可以来垦丁释放一下。我们骑了一整天,除了收获美景外,还收获了一双晒伤的膝盖。。就问你意不意外惊不惊喜? 下午还了车晚上就在恒春城里瞎逛,看到了跳高级广场舞的大妈们,路过了海角七号里阿嘉的家,然后去了一个叫波波厨房的文艺小店买了第二天的早餐。 第九天 7.12 这天的主要安排是前往光哥心心念念的离岛——兰屿。早上起来天气大好,我们的心情也大好。兰屿上住的是达悟族,因为捕捉飞鱼而著名,但七月其实飞鱼季已过。从垦丁后壁湖码头乘船到兰屿要两个多小时。我们在兰屿游玩后将直接乘船前往台东,这是一个效率最大化的旅行线路,船票是通过到垦丁的出租车司机提供的电话买到的,简直太巧了。由于船票买的晚,兰屿的住宿我们也没有提前订好。到了岛上第一件事就是找民宿,兰屿有个旅游网站叫兰色大门,我们在上面很快找到了住所,真的很幸运。民宿老板还提供了机车租赁、潜水、拼板舟体验等一系列活动的预定服务。岛上只能用现金交易,我们biaji花了1万多台币,好在有一个取款机。...

August 21, 2017 · 1 min · Yuanhao

人类时代的谢幕?

去年看了《人类简史》,留下了很深的印象。今年初便买了续作《未来简史》,没想到在王者荣耀的干扰下五月底才看完。本书内容延续了前作的高质量,也给我带来了很大的冲击。想写这偏文章还因为一些巧合。一个是与这本书类似的话题居然不断地在其他地方被提起,包括锵锵三人行和前不久看的《攻壳机动队》。另一个是看完这本书的日期,2017年5月26号,是柯洁完败于AlphaGo的日子,天才少年的眼泪再一次给这本书的一些观点加上了生动的注脚。 按先后顺序先从《攻壳机动队》讲起吧。这部95年上映的电影被认为开启了包括《黑客帝国》在内的科幻新篇章。电影的高潮部分AI讲述自己的心路历程,并认为目前的自己和人类(还是生命?)唯一的差别只是它不会死亡。相呼应的是墙上的壁画,长长的进化树上人类雄踞顶端,充满了无上的优越感。如果有一天算法真的进化出了意识,它是否应该得到人类的尊重?又或者它们和人类是否真的有差别? 《未来简史》里作者的观点是明确的,没有差别。不是因为AI有多厉害,而是人类本身就是一堆生化算法的集合。你所谓的意识、思想只是一些生化反应的结果。你的行为、欲望也只是身体器官对这些生化反应的感受罢了。如果非要在人类的框架下讨论,作者又提出了“意识”和“智能”脱钩的观点。我们的算法,就像AlphaGo,已经在智能这方面超过人类,但可能他们没有人类的意识。然而意识真的重要吗?在数据足够多的情况下,智能可以比你更了解你的意识。如果能测量你紧张时上升的心率,愉悦时释放的多巴胺,你的所谓“意识”在智能面前清晰地就像一张流程图,不再有神秘感,也就不再显得神圣。又或者通过各种药物或者装置可以直接控制你的精神,喜怒哀乐全变成不同颜色的药丸。而这一切的确在伴随着传感器和生命科学的发展一步步变成现实。到那个时候,人类也许真的不再是这个世界上唯一的主角。 如果上面的场景还略显遥远的话,科技对人类内部造成的影响却已经真实地发生了。掌握资源的人可以更轻易地获得更多资源,其中一些甚至可以让他们摆脱一些看似“名中注定”的事情。例如锵锵三人行中讲到印度每年有大量的妇女为欧美的同类代孕。他们就像是一台台血肉机器,为大洋彼岸的人们生产另类的产品。想像一下如果有一类女性将来只能靠为另一类女性代孕活下去,这样的世界是你想要的吗? 不想要可能也无济于事了,“没有人知道刹车在哪里”。其实以上的问题已经完全超出个人的控制范围,除了静观其变我们也别无选择。但我还是很感谢作者,知道这些东西对我们有限的生命还是有一定的帮助。首先就是可以更豁达,当你意识到自己只是一些在运行的算法,对很多事应该可以想开一点吧。然后是方法论,昨天吃饭时盛哥说以后学会使用机器学习框架应该会像现在学会编程一样重要,在座各位都深以为然。应该尽早学会利用这些无意识的智能,它们一定可以在各个领域都大放异彩,而作为个人也能在竞争中保持主动。 历史开始于人创造神,历史终结于人成为神。 2017.5.29

May 29, 2017 · 1 min · Yuanhao

用makefile编译tensorflow

官方指南见 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile 前几天已经用bazel编译了一遍tensorflow,但是如果想在嵌入式平台例如树莓派上使用这个框架这条路可能行不通。因为受限于平台资源,可能无法用Bazel来编译(github已经有人成功了)。但已经有人提供了用makefile来进行编译的方案,可以编译出一个不含python绑定和gpu支持的静态库,非常适合在嵌入式平台使用。目前可用的目标平台有 iOS OS X (macOS) Android Raspberry-PI 准备工作 clone tensorflow repo到本地 以下所有的命令都应在在仓库的根目录下执行。首先执行tensorflow/contrib/makefile/download_dependencies.sh下载所需的依赖项。文件保存在tensorflow/contrib/makefile/downloads/目录下。如果是编译Linux版本,这步可以不执行,原因后面会提到。 编译Linux版本 安装必要的包sudo apt-get install autoconf automake libtool curl make g++ unzip zlib1g-dev git python 执行编译,运行tensorflow/contrib/makefile/build_all_linux.sh。整个编译的过程用了一小会儿。README里说需要先执行download_dependencies.sh,其实在这个脚本里会清空downloads文件夹并重新下载一遍。。 验证。执行以下命令下载inception模型 mkdir -p ~/graphs curl -o ~/graphs/inception.zip \ https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip \ && unzip ~/graphs/inception.zip -d ~/graphs/inception 再执行以下命令,注意graph=后面有引号! tensorflow/contrib/makefile/gen/bin/benchmark \ --graph="~/graphs/inception/tensorflow_inception_graph.pb" 应该就成功了,如果提示找不到网络的话自己检查一下路径。 在树莓派上编译 tensorflow/contrib/makefile/download_dependencies.sh #跟之前一样,下载依赖库 sudo apt-get install -y autoconf automake libtool gcc-4.8 g++-4.8 #安装编译工具 以下编译protobuffer cd tensorflow/contrib/makefile/downloads/protobuf/ ./autogen.sh ./configure make CXX=g++-4.8 sudo make install sudo ldconfig # refresh shared library cache,很重要 然后可以验证一下...

March 20, 2017 · 1 min · Yuanhao

编译安装Tensorflow

如果采用官方包安装Tensorflow的话,有许多针对平台的优化都没有打开,会导致性能下降。因此,最佳的安装Tensorflow的方法是从源码编译。整个过程大概如下。 安装Bazel 安装JDK8 $ sudo add-apt-repository ppa:webupd8team/java $ sudo apt-get update $ sudo apt-get install oracle-java8-installer 下载安装包的时候速度极慢,打开VPN快了许多。。 安装其他依赖项 sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel 我还修改了系统的默认python到python3版本 ##配置安装Tensorflow 下载Tensorflow的git仓库 git clone https://github.com/tensorflow/tensorflow 进到目录里,checkout正确的版本 git checkout r1.0 生成编译配置 $ cd tensorflow # cd to the top-level directory created $ ./configure 编译pip文件 bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package 这步执行完后会生成一个脚本,用它可以生成whl包。执行 bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg 生成包,包存在/tmp/tensorflow_pkg里,包名是自动的。然后再用pip安装这个包 sudo pip install /tmp/tensorflow_pkg/***.whl 其中***就是生成的包名,到刚才的目录下看一下就知道了。 ##测试 既然tensorflow可以直接用pip方便地安装,为什么要千辛万苦编译呢?因为官方编译好的软件包为了提高通用性基本不可能发挥硬件的全部性能,很多优化开关都没有打开。而我们自己编译的版本则会根据硬件进行优化。为了测试性能差别,用以下简单的卷积网络在MNIST数据集上进行实验。 import tensorflow as tf import time def weight_variable(shape): initial = tf....

March 10, 2017 · 2 min · Yuanhao

2016总结

不知不觉又到了新的一年,上午帮老师做总结ppt的时候借机回顾了一下自己这一年。感觉还是值得写下来。 坏的开头 今年从刚开始就很艰难,刚开学到实验室就赶紧把行走的论文改完,2月19号改投到了JMR。然后22号在本该合家团圆的元宵佳节就发生了非常令人沮丧的事情。那种无力感是不曾体会过的,真的太难受了。希望它的影响能早点消退,大家都能回到正常的生活轨道上去。经历了这件事,除了让我对自己的看法有了很大的改变,我对我们民族的一些东西也变得反感。大家都给自己和别人背负太多的东西,真的好累。 两篇论文 三四月份开始整人机交互的论文,承蒙组里各位照顾,很快就做好了实验。文章是在ICRA拒稿的基础上改的,git仓库里4月6号是第一次commit,4月16号的commit message写的是submit,应该就是那几天提交的论文。于此同时一边为了项目验收在设计传感器,画电路板。 五月底的时候两篇论文相继回来了审稿意见,都比较正面,但都有个别比较刁钻的审稿人问题。没办法,两篇论文同时修改,JMR的回稿日期是5月24日,我居然六月5日就交了修改稿。Sensors是五月22日回的稿,七月5日提交的修改稿。这里最感谢的是付老师,好几个晚上都和我讨论到十一点多了,帮我出主意,给我提意见。那段时间过得也确实比较苦逼,不过有一次我很晚回宿舍的时候回头望了一眼李兆基,几乎每个房间的灯都还是亮的。有的时候真的想不明白为什么大家都这么忙,我们到底在忙些什么?七月22和七月29两篇论文相继被接收,也算给这个忙碌的学期画上了比较完美的句号。不过比较对不住跟着我做毕设的本科生。在他答辩前我们也没整出一个稳定的传感器。 实习 大概在二三月份的时候,我在水木上看到英特尔招机器人实习生的广告,就去面了一下。但跟老师商量后他不建议我学期中去实习,也就没去了。后来临近暑假觉得还是实习下比较好,便又开始折腾。记得投了微软、阿里、腾讯,年轻的我做在线笔试都不敢用搜索引擎,更逗的是迷之自信居然投MSRA的研究岗。 MSRA和腾讯都挂了,阿里进了面试,映像也比较深刻。第一轮电面聊得还比较欢,问我一学机械的干嘛投产品,我大概回答他感觉技术会被刷,还问我一些关于笔试的问题等等。到了第二面,画风突变,问我最喜欢什么app,为什么,它哪里还可以改进还有三年后希望自己变什么样之类的。好多题是一面问过的,但这位面试官直接跟我说觉得我不适合做产品经理。后面想想其实不是我不适合,只是我真的没有准备。什么app怎么好该怎么改我只能捡了个熟悉的微信扯了扯。互联网节奏这么快,你没有任何准备别人自然也不会给你任何机会。包括前面的微软,我在笔试前都没刷过题,而且居然还用c++,只拿130分也是应该的。 虽然没拿到offer,但这些失败以及面试官的意见倒真的让我开始思考自己想做什么。清华机械真真是通识教育,念到研究生,什么都会一点但什么都不专精,而且学校项目和实际市场脱节比较严重。再加上我对机械的兴趣本来就不大,在仔细思考之后将方向定在了: 控制算法 机器学习 传感器 三个方向中1、3对应比较传统的制造业。2主要对应互联网企业。 找工作 找工作真的是今年比较重要的一件事了,但真的蛮幸苦的。由于有去互联网的想法,所以我比身边的同学早许多就开始了。八月份的时候通过100offer去了一家创业公司面试,技术总监是个清华电机系毕业的师兄,也让我第一次有机会近距离跟技术大牛过招。那次从简单的语言问题聊到算法甚至聊到波士顿动力的机器人,一场面试下来感觉自己真的好弱,要走的路还很长。最后由于我没法去实习他们也没给我offer,不过师兄的一句“你想做AI为什么不用Python”倒是点醒了我,于是开始了leetcode上python刷题之旅。 虽说前面已经梳理了自己的方向,但真的到投简历的时候还是会有“什么都想要,什么都感觉不错”的心理。看了下我的记录,我最后大概投了快40份简历,涵盖的领域远比之前的3个多。这也导致参加了好多好多笔试面试,占用了大量的时间。 拿到的第一个正式offer也是100offer推荐的阿里系创业公司天壤,AI岗,工资超过25w。电面的时候和创始人聊得蛮欢的,面完十分钟就给我发了offer。有了第一个offer就会比较有信心,吹水的时候也更煞有介事。但考虑以我目前的状态可能还不太适合去创业公司,就给回绝了。要是某天突然看到这个公司变得巨牛逼不知道会不会后悔,哈哈。第二个offer应该是海康威视,终面之后加面了总监。总监说我是个图像领域的新兵,给special不太合适,把我推给了机器人部门,还给了我一张名片,说后期可以再联系他,若有机会可以给我发SP。之后机器人部门面试比较顺利,待遇比天壤还高一些,可惜岗位在杭州,和我去一线城市的定位不符,最后也没去。后来还面了恒生电子,明知道他在杭州,却还是去面了,搞不懂自己怎么想的。 面试体验最好的是微软,每一轮的面试官都很nice,会引导你解决他们给出的问题,甚至跟你一起review你的代码,帮你找问题。说真的,这才是模拟真正的工作状态:怎么跟人沟通,寻求别人帮助,一起解决问题。当时面了整整一天,中午饭很好吃。下午是AA面,见到了互联网工程院院长王永东博士。大叔气质真的很好,很有气场。出的题是HMM相关的,刚好项目里学过,解得比较轻松。最后也顺利拿到微软的offer,不过是在苏州,因此也拒了。但就在前几天上海HR打电话说有当地云计算的位置,无奈已经涉及毁约,也就没有去了。错过微软还是蛮可惜的。 微软午饭 后来有一波汽车行业的offer,主机厂、供应商、研究院都有。最后综合考虑决定去上汽做AI,风险其实挺大,看命了。。 经历这次找工作我感觉知道自己想干什么实在太重要了,特别是能力强的人,最后比的基本就是方向和耐力了。还有就是你想在哪,一线城市固然好,但紧抱着不放也确实是没有必要了。不过比较神奇的是本科班同学们这波找工作没有一个留在北京,嗯,把北京留给博士们吧。 在线课程和志愿者 其实很早就有上在线课程了,一开始在清华自己的学堂在线上过几门,去年开始接触Coursera,上了吴恩达老师的Machine Learning。今年大概暑假的时候感觉要充充电,上了宾大GRASP实验室开的几门机器人课程。包括Estimation and Learning,Perception,Computational Motion Planning和Mobility。其中和实验室最贴近的是Mobility,不得不佩服他们的研究水平,很多应该知道的东西我们真的不知道。和我项目最接近的是Estimation and Learning,只可惜讲得比较粗浅。内容最扎实的是Perception,视频贼多,作业也挺花时间。在年底的时候又上了Hinton教授主讲的Neural Networks for Machine Learning。这课真的好,比较全面地介绍了神经网络这门科学。也不得不佩服Hinton教授,一直坚持自己的研究,从ANN的低谷一直坚持到了最近深度学习爆发,一举又成为引领潮流的人物。所以,还是那句话,方向和坚持真的太重要了。 终身学习从我还小的时候就开始讲了,但真正做的人并不是很多。在线教育平台上已经有非常多优质的资源,涵盖面也很广,是非常值得尝试的。 在上机器人系列课程的时候发现没有中文字幕,于是就起了翻译的念头。先是打入中文翻译者社区GTC,然后找到了愿意合作的LC,就开始翻译起来。所以暑假期间基本把自己安排满了,实习、刷题、上课、翻译,还得做实验室的项目。说来也巧,LC也是清华校友,居然还是学机器人的,辈分颇大,目前人在加州做IT行业。除了合作翻译,他还给了我一些职业建议,也是一位非常nice的人。 最终我几乎自己翻译完了Estimation and Learning,后来还当了Perception的组长,招募了一些志愿者一起翻译。这种和世界各地的朋友通过网络协作是从来没有经历过的,感觉很奇妙。可惜后来找工作忙起来又碰上GTC换翻译平台翻译就暂停了,寒假我会争取把Perception弄完的。 奖学金 从没想到自己能拿国奖,不过国庆节收到申请邮件时付老师建议一定要试一试。于是就开始整理材料,有两篇论文打底,加上研一两学期的助教和一次学术会议,东拼西凑还真有点东西。初选的时候排在所里第三,一共三个名额,可能性还挺大的。 答辩的时侯我讲了一些自己上在线课和翻译的事情,没想到老师们都还挺感兴趣,问我感觉国外的课和清华的有什么差别。不留情面地讲,清华有的课实在是太水了,特别是研究生阶段,对教学没有足够的重视,学到的知识太少,做得project太多,作业设计也缺乏参与感。近几年引进的老师越来越多,希望可以带回来优秀的课程设计模式,别把这些好苗子都白瞎了。 答辩之后的最后成绩居然变成了第二名,顺利拿到了国家奖学金,金额可观,名声也好。付出了就会有回报,这句话真是不假,就看你能不能坚持到回报到来的那一天了。 略显混乱的年末 忙完国奖的事就到十月底了,工作也基本定了,寻思着该回到实验室搞搞项目的事情,于是从英特尔离职(九月以后就去的非常少了)。实验室这边有了做SLAM的新任务,还有之前的工作要继续推进,老师也把新招到的本科生派给了我。 为了上海户口求稳,十二月和黄丝一起专程去天津参加了计算机二级考试。报的c++,感觉对自己比较有用。之前都是瞎写,半吊子水平,这次乘着这个机会好好翻了一下《C++ Premier》,还是学到了一些东西的。刚查了成绩,89,差一分优秀,随他去吧。 还有就是这个网站咯,其实从八月份就开始写了,后来忙起来又断了。十一月写了一些,到了十二月底临近元旦放假又来了兴致,咔咔咔连写了好几天,终于基本像个样子。 一些杂事 被超哥等人带入了德扑大门,他们打得挺大的,一群人拿着钱猜手中的两张牌比对手大还是小,一个冲动甚至可以押上几百上千,这种纯粹的赌博的确是一种全新的体验。但打多了感觉这个游戏不太和我胃口,我不明白这样有什么意义,说输钱也很开心我是不相信的,但你赢了就有人要输,应该是个零和的游戏。而且真的会有一种无所谓的感觉,不再珍惜你的钱,感觉这样挺可怕的。真想娱乐和吴老师光头他们打打一毛钱的娱乐局就好了。 统计了一下今年只看了大概25部影视作品。其中比较出彩的是三部电视剧:《信号》,《黑镜》和《西部世界》。书倒是看了几本,《三体》,《人类简史》,《必然》和《思维的形状》都挺不错的。还能静下心来读书是挺值得骄傲的事情。 今年比较遗憾的是基本哪都没去,五一国庆都回家了。倒是去了好几次天津,感觉天津其实还是很不错的。可能是因为来自南方的缘故,感觉一条海河让这座城市有了灵气。 海河沿岸 写在最后 不知不觉写了好长,就这样吧。 2017,希望家人朋友一切都好。

January 1, 2017 · 1 min · Yuanhao