十分钟读懂beam search-2

在上一篇文章中我们介绍了基础版的beam search,这篇文章是对它的一个扩展,可以在模型不改的情况下获得更好的生成结果。今天的介绍围绕的也是一篇蛮新的论文,《The Curious Case of Neural Text Degeneration》,根据这篇论文的版面内容,它应该已经被ICLR 2020接收了。 Beam Search的问题 先解释以下什么要对Beam Search进行改进。因为Beam Search虽然比贪心有所改进,但还是会生成出空洞、重复、前后矛盾的文本。如果你有文本生成经验,一定对这些现象并不陌生。在语言模型还不像如今的BERT、GPT这么厉害的时候,这种现象更加明显。 没有经验也没关系,我们来看一个论文里面的例子。输入模型的引文(context) “The study, published in the Proceedings of the They were cattle called Bolivian Cavalleros; they live in a National Academy of Sciences of the United States of remote desert uninterrupted by town, and they speak huge, America (PNAS), was conducted by researchers from the beautiful, paradisiacal Bolivian linguistic thing. They say, Universidad Nacional Autónoma de México (UNAM) and...

March 23, 2020 · 4 min · Yuanhao

十分钟读懂beam search-1

最近研究了一下用基于BERT的encoder-decoder结构做文本生成任务,碰巧管老师昨天的文章也介绍了以生成任务见长的GPT模型,于是决定用两篇文章大家介绍一下在文本生成任务中常用的解码策略Beam Search(集束搜索)。 解码及贪心搜索 生成式任务相比普通的分类、tagging等NLP任务会复杂不少。在生成的时候,模型的输出是一个时间步一个时间步依次获得的,而且前面时间步的结果还会影响后面时间步的结果。也就是说,每一个时间步,模型给出的都是基于历史生成结果的条件概率。为了生成完整的句子,需要一个称为解码的额外动作来融合模型多个时间步的输出,而且使得最终得到的序列的每一步条件概率连乘起来最大。 在文本生成任务中,每一个时间步可能的输出种类称为字典大小(vocabulary size,我们用$v$表示),进行T步随机的生成可能获得的结果总共有$v^T$种。拿中文文本生成来说,$v$的值大约是5000-6000,即常用汉字的个数。在如此大的基数下,遍历整个生成空间是不现实的。 最容易想到的策略是贪心搜索,即每一个时间步都取出一个条件概率最大的输出,再将从开始到当前步的结果作为输入去获得下一个时间步的输出,直到模型给出生成结束的标志。例如下图,每一个时间步都取出了条件概率最大一个结果,生成了序列[A,B,C]。 很明显,这样做将原来指数级别的求解空间直接压缩到了与长度线性相关的大小。由于丢弃了绝大多数的可能解,这种关注当下的策略无法保证最终得到的序列概率是最优的。 Beam Search 而beam search是对贪心策略一个改进。思路也很简单,就是稍微放宽一些考察的范围。在每一个时间步,不再只保留当前分数最高的1个输出,而是保留num_beams个。当num_beams=1时集束搜索就退化成了贪心搜索。 下图是一个实际的例子,每个时间步有ABCDE共5种可能的输出,即$v=5$,图中的num_beams=2,也就是说每个时间步都会保留到当前步为止条件概率最优的2个序列。 在第一个时间步,A和C是最优的两个,因此得到了两个结果[A],[C],其他三个就被抛弃了; 第二步会基于这两个结果继续进行生成,在A这个分支可以得到5个候选人,[AA],[AB],[AC],[AD],[AE],C也同理得到5个,此时会对这10个进行统一排名,再保留最优的两个,即图中的[AB]和[CE]; 第三步同理,也会从新的10个候选人里再保留最好的两个,最后得到了[ABD],[CED]两个结果。 可以发现,beam search在每一步需要考察的候选人数量是贪心搜索的num_beams倍,因此是一种牺牲时间换性能的方法。 以上就是Beam Search的基本概念,下面我们解析一种高效率实现方式。 Beam Search代码解析 Beam Search的原理虽然简单,但实际实现的时候却有很多细节要考虑。下面要解析这个实现出自于NLP界著名Python包Transformers,我为了说明方便做了一些改动。 一个正确且高效的算法需要处理的问题大概有两个: 充分利用硬件,可以处理批量数据,且尽量使用并行计算少用循环 处理好长短不同的生成结果 下面是基础版的beam search函数定义。其中context是编码器编码获得的向量,batch_size是每批数据中包含的样本量,bos_token_id是句子开头标志的token id,pad_token_id是用于填充的token id,eos_token_id是句子结束标志的token id。这里给参数填上的默认值和我们后面讲解时使用的例子是一致的。 def beam_search_generate(context, batch_size=3, max_length=20, min_length=2, num_beams=2, bos_token_id=101, pad_token_id=0, eos_token_id=102, ): pass 在函数中主要执行以下三个步骤: 准备初始输入 在当前生成的序列长度未达到max_length时扩展生成序列 准备最终输出的序列 下面我们分别解析。 准备初始输入 # 建立beam容器,每个样本一个 generated_hyps = [ BeamHypotheses(num_beams, max_length, length_penalty, early_stopping=early_stopping) for _ in range(batch_size) ] # 每个beam容器的得分,共batch_size*num_beams个 beam_scores = torch.zeros((batch_size, num_beams), dtype=torch.float, device=encoder_input_ids....

March 20, 2020 · 4 min · Yuanhao

最近邻搜索,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