留给2020

很有趣,看了一下,刚好去年也是1月6号写的。嗯,2020,魔幻的一年过去了,如同每年一样,写个总结,既是回顾,又做展望。在去年的基础上,进一步分了三个篇章,回顾是对比2019年初的想法,看看2020年的思考有哪些延续性的不足;总结篇,如同上年度一样分成了方向,方法和技术的三段总结;最后是展望,对方向和技术的2020题一个要求

回顾篇-2020年的那些想法怎么样了:

2020年大概给自己定了技术和业务两个方向的目标,下面一个个分析一下

技术落地,CloudNative+AI增进工程效率提升

CloudNative的了解,相较之前应该有比较大的进步,微服务、DevOps、容器化、持续交付,除了一直以来想对比较深刻的持续交付意外,2020年对于微服务的学习和实践也日益加深了。

想了一下,2020年尝试了2个东西,一个是集成第三方公司邮件,通过自然语言读懂邮件,并将其结构化为需要的内容,这个在NLP领域被称为NER(named-entity recognition),看了些内容论文也因此大体了解了NLP领域常用的语义分析软件。但是很可惜停止在了数据集收集的地方。数据集始终没有准备好,这是个让人很头疼的事。确实也领略了当时有看到行业花大价钱去找人做表标示工作。这的确是个Lessons Learned。接下来这个方向肯定还是要做点什么,就这么放弃了感觉比较可惜。加油吧2021,需要给自己再plan一下

第二个是关于Menu的OCR,后来因为疫情就没继续。不过这块的确衍生出了接下来的Data方向,在数据vision上有了不少思考

业务思考

关于医生经纪人,算了吧,感觉目前还是没有这个动力去做。我觉得从技术出发做点事情可能会更靠谱一点。不过在此基础上,基本上明确了养老这个方向,当然这方向里设计很多上中下游的东西,而且我也知道这个方向不容易做。但是终归还是有这个心,希望做善事吧。接下来的更多思考肯定是做产品行业,还是服务行业

综合来看,2020面对疫情,整个工作出现了比较大的变化。所以在落地的工作方面却少了很多。但是思考的方面,却多了不少时间。所以还是有了不少的思考时间。包括学习了如何思考的方法,也是很不错的东西。

总结篇-2020自己取得了哪些值得骄傲的成就:

方法论:

  • 今年的方法论核心应该是在战略安排上。今年最成功的事情是总结了技术上的stability strategy以及数据的Data strategy,这两个的总结提炼让我对与如何写一个让人看得懂的战略规划有了一个新的认识。在我看来这里可能需要分为如下的几个步骤

    • 根据远景定义核心目标,注意这个核心目标往往不是要解决某个问题,而是这个公司、部门或者这个方向存在的意义,比如技术就是提升研发质量,比如数据就是提供高质量、高价值数据

    • 将这种目标,增加需要执行目标的限定语句,比如对于提升研发质量,“Build sophisticated tools to Reduce developer mistakes significantly”,这里建立成熟的工具,就是后面降低错误的执行方法限定语句

    • 接下里的事情其实就简单了,那就是对这个限定语句进行解释和结构化。比如“Build sophisticated tools”,什么叫成熟的工具,这些工具的彼此支撑结构是什么。后面的东西就是我以前也表熟悉的规划了。特别是对于对词语的抽象能力,这是咨询师必备。

    所以我还挺兴奋于今年在战略规划上所学到的东西。因为以前我的工作模式比较偏线性,走到哪儿算哪儿,持续改进是我的长项。不过这次的战略策略实践,让我的视野上升了一层,有了更佳明确年目标级别的规划能力,这东西是一个产品战略能力,很庆幸!

  • 提升质量方法论的进一步成型。从Code Protector,Scalable Protector到Process Automation,我觉得这三个的总结基本上涵盖了我现在触及到的形形色色的质量改进,并且关于Code Protector,有数据,有工具,有最佳实践,还是蛮成型的了。接下来可能更关注第二个吧,看看通过第二个的总结,2021年能有什么建树。

  • 关于数据的理解以数据中台和DaaS数据业务为蓝本,虽然不一定完整,这里简单罗列一些吧,我相信这个也会在2021年有所演进

    • BI与BI成熟度模型
    • 数据分析师(data analyst)和业务分析师(business analytst)之间的skill set差别
    • 数据工程师(Data Engineer)和数据科学家(Data Scientist)实践中的交集与各自能力,以及他们需要处理的主要问题
    • 数据治理的困难以及如何提升数据质量的基本方法与指标

技术篇:

技术上,想象提升的的确比较少,找个借口就是可能数据那块儿想的比较多,确实看了不少书,也用了不少时间。但是这也不能算是接口,实话实说,刚刚过去的2020年,代码写的的确比较少。这一点可以从Github的提交记录可以看到,自从三月份以后,就鲜有提交了。归其原因也是AI这块儿一直没有突破,给自己比较强的挫折感。

如果一定要说2020学了哪些技术上的东西。我觉得SRE和微服务勉强算吧。之所以说是勉强算是因为自己不是亲身参与,更多的是从书籍以及团队的实践出发。但是这种实践,感觉上还远远不够。SRE嘛,我觉得还得再读,目前皮毛上,确实解决了我一些对于架构的衡量问题,但是具体下来的实际操作还是空白。这不利于给架构组定理合理的目标和预期。

展望篇-2021要干点啥:

方向上要思考的事情:

  • 工程效率大方向应该不会有大的变化,我觉得目前让我百思不得其解的还是在为什么效率本身遇到的瓶颈问题。目前在40左右似乎遇到了非常大的瓶颈。我觉得接下来需要做更精细化的计算,计算到人,先把DO、研发和QA三个角色分拆开。总之得找到提升的核心问题。慢慢应该可以找到各个工种的效率,说白了就是要做细致

  • 战略,2020可以说对于战略的规划有了实践,接下来需要一些书籍进行辅助和体系化,看看之前的实践有哪些问题,优缺点在哪里。从《好战略,坏战略》开始吧。之后进一步改造现有的战略安排

  • 业务,就是养老这件事,继续。。。

技术方法论要提高的:

这个事儿还是得有些改变才行。立几个可能的flag吧

  • Python转Go,Go的成熟度已经开始变高了,而且从外部判断来看,似乎对我而言更合适一些
  • 容器化,做出两个Go容器吧,一个用来做web service,通过这个来学习一下基本框架的使用
  • 把Protobuf要弄一下,刚好要做web service嘛,这个以后还是要自己搞过才行

附录本年度的主要工作结果

  • NLP算法相关论文和材料目录

  • 质量相关

  • 成长模型

留给2019

转眼一年过去了,总结一下。确实发现了不少问题。也想清楚了不少问题。花了不少时间在纠结和思考,乐观一点想,这算是一个蜕变的过程吧。

方向篇:

之前也在和不少人谈,觉得这些年,做了业务,做了技术,但是自己的定位到底在哪儿呢?年轻时候,一直想着做寄一个技术的领导者,去改变世界。这之后可以说一直在沿着这个轨迹走,一个技术的BU head,两任CTO都是技术领导者,但这一年,很明显的感到瓶颈来了。这个瓶颈就在于前半句做到了,但是后半句一直没有,怎么也做不到。我到底改变了什么?在这件事情上,就很纠结。团队一直在50人上下徘徊,似乎这也成了自己一个无法逾越的坎儿。从某种意义上讲,我的公司挑选是正确的,地域的选择也没有问题。这是薪酬一路上涨的原因。也确实随之能力也在不断提升。不过忽略了业务与行业的选择问题。也就是后面一件事,去“改变”。从业务也就是公司(或者个人),到行业,自己是否应该把更多精力放到寻求改变里面呢?回到了一个老生常谈的问题,一到业务发展瓶颈期,就退缩了。在TW当时面临的是创建的业务,因为边界不清,始终得不到认可。然后在杏树林,吸取了经验教训,但其实问题并没有得到改善。刚开始做数据业务的时候,其实更多还是波哥在做,要不是他后来离开了,可能也轮不到我来主导业务。但问题存在于销售端的控制上,缺了这个部分,总觉得不踏实。后来药企这摊事儿,也是努力了好久,做了好多,但是最后因为认可问题,一拍两散。准确的说并不能说一拍两散,遇升还是在最后妥协了的。说明有些事情,力争发展是有可能。然而退缩的是自己,一方面担心搞不定。一方面对财富的增值太看重了。我觉得这可能导致了自己长期上的发展僵局。所以目前自己最重要的是对于方向的决心和信心。

2020年,有两件事情是一定要做的。第一个就是作为技术领导者本身,在AI上一定要取得突破。我觉得自己选择的这个技术数据驱动,提升技术团队效率这个方向蛮有意思的,确实很喜欢。应用Cloud Native + AI技术实现真正的效率提升,代码和测试等一系列自动化编写。我觉得这个的确有可能改变世界些什么。说真的,我是笃信的。然而这个会遇上另一个矛盾,那就是作为业务领导者,因为改变技术本身似乎并不能改造社会,创造多么大的社会价值。或者,我知道机器人的引用,的确是各个公司需要的,因为他们的确在改造传统行业。可技术人员是个相对高级的工种,改造他们,作为技术领导者,他们愿意吗?当然这里也有一个分支方向,就是通过AI赋能Ops,不断寻找和提升Ops的效率,提升系统自动操作性(而不是restaurants,我不觉得restaurants的owner会为更多的功能买账,他们不是搞IT的!!!

2020年,另一件事情,就是纯业务,比如医生经纪人这样的纯业务领域。很有趣,自己之前做了不少,但想想,可能和数据项目当时的状态类似。我有一个很信任我的人,很愿意和我工作的好朋友在。然而我好像也贡献不了太多的东西。哦,也许运营是我可以做的。不过最关键的医院销售端,似乎还没太搞定。这么说来,这个的确有点意思,这不就又是当年的搭配么,我(用户运营),金尹(医生),华丰(私立医院)。不过这个东西和技术差异真的蛮大的,也是一直下不了决心的原因。2020年,需要考虑考虑。最后还有一件和业务相关的事情,就是我的关于美容美发行业的技术化改造。again,这事儿因为没有初期的伙伴。可能更是八字没一撇。

这两个想法,四个子想法,接下来要做个计划,留给2020年!否则肯定达不成结果!

方法论:

  • 提升管理OKR方法论:对于国内还摸不着头脑的OKR来说,可能OKR的掌握自己越来越有效了。运用OKR来指导团队管理,还是很明显的。
  • 提升质量的方法论:自己开始能够运用Tech Solution的四个基础方法,来规范技术解决方案。2020年,有望通过这一些列的技术解决方案提出技术的质量体系。我一直认为,研发的质量体系,应该是可以穷尽的。如果能够积累出一整套tech solution的方面,以后就可以不用这种bug一点一点出的笨办法,就可以把数据和案例驱动,变成最佳实践驱动,这样会大大加快速度。所以这也是2020年,有可能实现的一个重要目标
  • 提升的纯技术管理方法论:Cloud Native:这个应该是最近要重点攻读的部分,因为感觉做了这么久的技术敏捷,一直没给自己找到个合理的原理来解释。Cloud Native因为继承了大量技术方法和管理方法。觉得应该会有点突破。

技术篇:

  • 云端函数计算:2019年做了两个函数计算的项目,都有始有终了。虽然都不大,但是让自己对于函数计算有了比较好的初始实践。一个是部署在Aliyun上的团队index,一个是部署在GCP上的Jenkins每天总结和Wunderlist总结。Serverless的场景在我看来比较适合DevOps和数据团队做定期数据ETL和数据计算。至少这是目前我认为很合适的领域。至于其他的目前不打算探索。
  • 从Code Function到Excel再到Data Studio的数据提取、计算到展现闭环打通。未来很多自动化都可以在这个基础上搞了。这回事OKR的重要基础,让OKR的数据收集工作变得相当简单。我认为这个以被写进OKR方法论。
  • 开始对Python做了一些系统性的总结,这两年用python也比较多了,每次总是要去查,很烦。当然一方面说明还是用得少。训练太少。另一方面,觉得有可能形成一些自己的机械记忆会更好些。

展望篇:

最后展望一下2020年的几个可能的成果

方向上要思考的事情:

  • Cloud Native + AI完善的管理方法(可以自己不是大公司的管理者,或者没有被大公司管理者认可,在这方面也许可以明确一下方向)
  • AI帮助Ops(算了,这个方向是在没精力就算了,虽然有趣,但还是在给别人做嫁衣,最后的结果还是要依靠于业务的发展)
  • 医生经纪人,这个先写,等等华丰
  • 美容美发(算了,在有医生经纪人之前,暂时不考虑)

技术方法论要提高的:

  • 解决质量问题,有没有可能出现最佳实践
  • Cloud Native方法
  • Python进阶语法和编程的进一步总结,需要做些题
  • 对AWS有更深入的使用,(估计是有八九没戏,虽然是公司使用的主要AWS平台,但是交集太少)
  • 对GCP有更深入的使用,这个如果AI能做的话,就比较有可能。

所以综合来说,2020年,属于自己的AI项目势在必行。这个会让自己在2020的技术上进一大步。加油吧2020!

附录本年度的主要工作结果

GCP搭建serverless

之前弄了阿里云的事情,最近因为做公司数据分析到AI的部分,所以必须把GCP彻底整理一遍。首先要澄清,从本身GCP的使用方面自己确实不是专家。但是感谢Google这一年多以来的合作,确实让我对high level的GCP以及相关产品,了解了许多。特别是全套的数据产品服务,也直接导致我来决策了GCP作为数据中心的定位,这也是为什么我需要开始把我的一些分析工具转移到GCP的原因。学习成本也是必须要付出的。

这次转移的部分就是数据分析平台,从原来的RJMetrics转移到以GCP为基础的Data Studio和Tableau上面。既然公司业务已经全面转移了,技术的主要数据分析,我也想一并转进来,并且借这个机会学习一下GCP的几个主要产品,为我在这边这个平台上搭建AI的技术效率分析系统做铺垫,这应该是我最近最大的兴趣所在了。让我们一起动手,消灭我们手里那些反复消磨时间的无意义工作,也许分析业务产生算法,才是程序员,至少是下一代程序员的职责(之后的时代,虽然NLP的普及,也许连分析业务也会被取代,we will see)

GCP合理使用

Google prefer to use Google Cloud SDK. so use gsutil in terminal is much easier to use.

关于serverless

做这件事情的动因是因为做一个个人工作分析器,内容很简单,就是从wunderlist api里把数据拿出来,然后进行分析。这玩意儿明显就是个serverless。刚好之前在阿里云上研究的也就是serverless,索性用一下,应该蛮cool的。

gcloud的serverless分为两种,code function和code run, 前者可以绑定若干种触发器,比如时间,event等等,后者主要绑定http触发。code function这里和阿里云的函数计算差不多,这里就不多说了。本次主要使用的是code run,一套基于container的方法进行的http serverless。我只能说太为程序员着想了。

之前使用阿里云函数计算最大的问题就是,lib被阿里云绑死了,没法进行扩展。而且有些库,阿里云上就没有,导致必须为了兼容serverless该自己的程序。现在不用了,有了code run,完全是一套自己封闭的环境。requirements.txt随便写,系统帮你填上需要的lib和version。好用!好用!

Storage的选择

在GCP上面,一共有五种storage,分别是

  • SQL,这个基本上就是MySQL
  • Datastore, 可扩展的NoSQL database
  • Bigtable,这是一个结构化大数据库,是HBase的姊妹形态。如果有TB级别的结构化数据,存在大量写操作,高频low latency的读写要求,使用Bigtable是最合适的。Bigtable使用Hbase shell quickstart.sh来进行
  • Storage, 这个主要用于做object的存储,分为standard 99.9%,Durable Reduced Availability 99%, Nearline 99%, 可以通过gsutil上传或下载
  • BigQuery

Youtube Video: Chose you storage and database on GCP

其他一些内容

Compute Engine,就是VM,创建instances, 每一个instance都可以依据选择访问project下的所有资源。当使用terminal来访问资源的时候,还需要进行必要的配置工作。进入。首先是在SQL里面,给MySQL配置ip

深度学习顺序模型第三周

来到最后一周了,本周分为10课,两个大部分

Various sequence to sequence architectures

这个部分是本周的重点,8个课都是围绕着展开的。这种模型被广泛应用在了文字翻译和语义识别领域。让我们来看看都讲述了些什么。

Basic Models

1
2
x: Jane visite I'Afrique en septembre
y: Jane is visiting Africa in September

这里用了两套模型进行了组合,

  • 作为encoding network:$x^{<1>}, x^{<2>}, x^{<3>}, x^{<4>} … x^{ < T_x > }$,可以是一个RNN模型(GRU或者LSTM)
  • 作为decoding network:$y^{<1>}, y^{<2>}, y^{<3>}, y^{<4>} … y^{ < T_y > }$,同时后面继续跟随了

这样一种算法,同样对于Image Captioning这样的应用有效。应用是我们的输入是一张图片,应用的输出会把图片转化成一个语义

在这样一个应用场景下,我们可以用CNN模型作为encoding network,把这个的输出,feed到RNN的顺序模型里面,进行训练。这个的输出,就是一个对Image的描述了。

Picking the most likely sentence

Machine translation as building a conditional language model

一个正常的language model,是一个从$a^{0}$ 到 $x^{<1>}$ 再到 $\hat y^{<1>} $ 再进行混合的演进的顺序模型。同时在这个模型里,会有 $ P(y^{<1>}, …, y^{< T_x >})$ 的数值,来代表每一个过程中产生的y的可能性。这个一般是用来生成普通的句子

Machine Translation Model对应的是两个部分,encoding model和decoding model。可以看到decoding model和language model是很相似的。做为encoding model的输出,就是decoding model的输入 $ a_{<0>}$

这也是为什么我们把Machine translation model也叫做conditional language model。在形象一点的说法是,一段被翻译后的句子(比如Jane is visiting Africa)本身,是由前一个被翻译前句子的作为条件形成的。这个说法还挺有意思的,让我认清了翻译这件事情的本质。的确是这样。

Finding the most likely translation (如何找到最好翻译)

1
x: Jane visite I'Afrique en septembre

于是乎,我们就有了 $ P(y^{<1>}, …, y^{< T_x >} |x) $ 这样一个可能性的表示。这里的x就是上面说的那段法语句子。所以整个翻译模型的结果就是寻找P的最大值,找到最有可能的translation结果

Greedy Search是一种算法,大概的意思就是,因为有了x(翻译前句子的输入),我们接下来寻找每一个 $ P(y^{<1>} |x)$, 然后是$ P(y^{<2>} |x y^{<1>})$,一次类推,就是每次都寻找那个最合适的。而不是 $ P(y|x)$。我觉得其实这里不用多解释,这就是一个局部优化和整体优化的问题。如果计算量允许,肯定尽量采用整体优化,这样才能取得好结果。

既然Greedy Search不好用,那么如何从$ 10000^{10} $ (假设vocabulary有10000个,句子有10个单次) 这么多种可能性里进行选取呢?当然第一方法,就是使用x作为输入,寻找较大可能性。那么然后呢?还有什么方法?于是这里就用到了更进一步的Search Algorithm。这就又回到了这一课的主题,就是寻找最好的翻译,而不是随机寻找翻译结果(这里作者列举的例子是going和visiting,前者更加常见,但是后者更加适合Jane的语境)

Beam Search Algorith

关于Beam Search算法,第一步是吧10000 words的vacabulary放进array里面。

所以这里的Step1,第一步就是 $P(y^{<1>}|x)$ 对应的单词。这里插入一个概念B,叫做Beam width, 例如B=3.这里给出的Beam的数值,就是为了系统记录下B个最有可能的单词。看起来,其实意思就是说,Greedy Search不是每次只找一个最好的么,这个Beam Search是根据Beam的数值,找B个最好的。

接下来进行Step2第二步。就很简单了,其实就是因为前一个假设是in了,那想标准的language model一样,会有一个$P(y^{<2>}|x”in“)$这样的表达式,来表示下一个最大可能的单词。因此下面这个公式还挺重要的,就是:

Again, 这里因为Beam Width为3,所以我们还是,选择最大可能的三个,不过这回就是三个pair了 $P(y^{<1>}, y^{<2>} |x) $. 如此循环进行下一步的运算。你看,这里B=1的话,那就真的是Greedy Search了

Length normalization

这个就是Beam Search里面的一个部分。他的用法是这样的。

如同前文讲的,Beam Search的核心是寻找到最大的B个可能性,并进行模型推演。所以

但是这里有一个问题,就是若干个百分之几十的数字相乘,会让这个结果趋近于非常小,不方便计算。于是这里引入了log,作为计算函数。这里P的数值越大,

$ \alpha $ 一般是从0到1的一个中间值,比如0.7。这个数用来对于模型进行校正和调整是比较管用的

关于整个翻译过程实际上是用到了Beam Search算法和两个RNN模型,对于结果而言,如何评价到底是哪里不好导致的问题。Error Analysis提供了一些方法

Case1: $ P(y_{}|x) > P( \hat y|x) $
在这种情况下,因为Beam Search的作用是用来进行选取$\hat y$,那么既然命名$P(y_{
}|x)$会更好,但是Beam Search却选的不对。说明Beam Search有问题

Case2:$ P(y_{*}|x) < P( \hat y|x) $
RNN负责预测 $\hat y$ 而他错误的将$ P( \hat y|x) $ 生成了一个更大的P数值,这说明生成有问题。是RNN需要被调整

Attention Module intuition

对比于简单使用输入RNN和输出RNN,Attention Module更好的处理翻译过程中的长句子问题。我们注意到在日常翻译中,MT在处理10个左右单词的句子时候,表现效果会比较好。但是如果再长,效果就会下降的非常明显。因此我们需要更好的模型来改进这一点。

首先分析一下原因,主要是单词的记忆导致的。事实上,人类在翻译长句子的时候,采用的是一部分一部分的翻译方式,并不会把他们都记录下来,因为记忆的原因。这个事情同样出现在机器上面,因为计算资源有限,所以我们也无法给计算机留出那么大量的选项进行综合运算。

  • Attention Weight,标注了对于一个生成的词来讲,哪些input word是应该被关注的,以及关注Weight是多少

  • $ \alpha^{ <1,2> } $ 这个表示第一个翻译后词汇,需要对翻译前句子中的第二个词的关注度有多高

Atention Module

领域应用

语音识别 (Speech Recorgnition)

Audio Clip x,translate to ,Transcript y

深度学习顺序模型第二周

第二周啦,这一周开始进入更深入的顺序模型的训练,这一周分为了三个部分,一共10课。

Introduct to word embedding

第一部分是NLP and Word Embeddings,词语的嵌入

Word Representation 语言表示

根据先前所学,每一个word被表现在一个Vocabulary的词典里面

1
V=[a, aaron, ..., zulu, <UNK>]  #假设 |V|=10,000

之前的表示,使用1-hot表达法。比如需要表示“Man”,假设这个词在词汇表的5391位置

在实际应用场景中,当我们有一个训练模型来预测下一个单次的时候,例如

1
2
I want a glass of orange ____ (juice)
I want a glass of apple ____

按照常识,我们可以猜到下一个可能是juice,因为orange juice是比较流行常见的词汇。在训练中,我们当然也是这样做的。这样机器可以知道orange的下一个词可能是juice。然而,如果换成Apple呢?按理说,apple juice应该也是个很组合词汇。按照我们人类的推理,我们大约知道orange和apple是很相近的东西,所以既然有orange juice,大约也就有apple juice。但是根据以目前从训练模型的角度,因为在1-hot的词语表示下,每两个词之间相乘(product)得到的结果都是0。因此在这种情况下,我们说单词与单词之间是没有距离的。也就没有关联性可言,我们无法让机器从orange juice推演出apple后面是juice的预测结果。

Featurized representation: word embedding

这里我们新学了一种方法叫做 word embedding

每一个单词都会对应有一系列features,比如Man,对应Gender(性别),Royal(皇室),Age(年龄),Food(食物)。把这些feature和Man这个单词的关联关系进行数据化描述,得到一个数组用字母e来表示,比如Man,表示为$e_{5291}$。如图所示,我们可以通过对比$e_{456}$和$e_{4257}$,得到Apple和Orange两者存在较大关联,因此可以得到后面为juice的预测结果。这就是我们说的Word Embeddings

下一个问题相对简单,就是如何可视化word embeddings。因为按照之前的理论,每一个词,有300个维度(假设这里有300个feature)。为了可视化,我们把它降为展开到2D上。这个被叫做t-SNE

Using word embeddings 使用word embeddings

这一节,主要是学习如何应用word embeddings到NLP,从而完成自然语言模型的训练。还是从例子开始

  • Sally Johnson is an orange farmer

根据前面的学习,我们大概知道了Sally和Johnson是两个名字。根据之前我们的学习,

  • Sally是$x^{<1>}$, Johnsan是$x^{<2>}$, is是$x^{<3>}$, an是$x^{<4>}$, orange是$x^{<5>}$, farmer是$x^{<6>}$

接下来就是通过这个的训练,来生成下面的处理结果

  • Robert Lin is an apple farmer (a durian cultivator)

通过网上上百万千万的词汇和特性关联,我们尝试寻找到durian和apple与orange之间的关联,以及farmer和cultivator之间的关联性。transfer learning

Transfer learning and word embeddings

  1. 从大量词汇文集中(1-100B words)学习word embeddings;当然也可以从线上下载一些被pre-trained embedding
  2. 把这些embedding,通过使用一个相对小的训练集,迁移到新的任务中(比如100k的词汇),在这里我们就可以使用一个小得多的特征向量(比如300个,而不是10000个)
  3. 可选项:通过新的数据,持续调整(finetune)word embeddings,来改进模型

个人觉得,这个其实很容易理解,我们每个人都在学很多的基础知识,然后因为各种不同的场景,我们需要学习一些上下文。比如同样一个词,在军事领域和民用领域就不一样。这个在Wikipedia里查词的时候非常常见。尤其是缩写

Andrew在这之后介绍了,face encoding(DeepFace)和word embedding的雷同之处。两者都是把一个“object”转化成了一系列特征向量,然后进行对比的方法

Properties and word embeddings

一个关键词:analogies(类比),这个确实是一种人类很神奇的东西,但这也是NLP应用最重要的东西

接下来主要描述的是如何让机器理解类比。课程中描述了,一个类比,如果Man到Woman,如何类别出King到Queen。文章使用的方法是

$ e_{man}-e_{woman} \approx \begin {pmatrix}
-2 \\
0 \\
0 \\
0 \\
\end {pmatrix}
$ 和 $ e_{king}-e_{quene} \approx \begin {pmatrix}
-2 \\
0 \\
0 \\
0 \\
\end {pmatrix}
$ 最终我们得到 $ (e_{man}-e_{woman}) \approx (e_{king}-e_{quene})$ 以此来表明类比关系

这个的总结公式是

进一步数学化这个公式,来解释$ sim(e_w, e_{king}-e_{man}+e_{woman}) $. 常用的解释方法是Cosine similarity.

用余弦函数来描述sim的数值。根据余弦函数,$cos \phi$ 是一个在$(1,-1)$区间的值。现实中,也有人使用方差来表示$ ||u-v||^2 $

Some more examples like:

  • Man:Woman as Boy:Girl
  • Ottawa:Canada as Noirobi:Kenya
  • Big:Bigger as Tall:Taller
  • Yen:Japan as Ruble:Russia

Embedding matrix

$ E \cdot O_{6257} = \begin {pmatrix}
0 \\
0 \\
\vdots \\
1 \\
\vdots \\
0 \\
0 \\
\end {pmatrix} = e_{6257} = e_{orange}
$ 这是一个 $(300, 1)$ 的矩阵,来表示Orange这个词对应的embeddings

in common,总结一下

$ E \cdot O_j = e_j $ 等于 embedding for word (j)

因此我们就得到了,对于模型而言,我们的训练目标就是获得这个Embedding Matrix $E$。在Keas里面,事实上使用embedding layer来解决问题,这样更加有效

Learning Word Embeddings: Word2vec & GloVw

好了,进入第二部分,在上一部分,学习了关于embedding,和模型训练目标Embedding Matrix $E$。这个部分就是来讲述如何训练模型$E$

Learning Word Embeddings

按照andew的介绍,现在的算法变得越来越简单。但是为了方便和便于理解,介绍还是从相对复杂的算法开始

1
2
I       want a glass  of   orange ______
4242 9665 1 3852 6163 6257

I represent as $ O_{4343} \longrightarrow E \longrightarrow e_{4343} $
want represent as $ O_{9665} \longrightarrow E \longrightarrow e_{9665} $
a represent as $ O_{1} \longrightarrow E \longrightarrow e_{1} $

$ e_{x} $ is a 300 dimentional embedding vector. fill all e into a neural network and then feed to a softmax into a 10000 output vector. neural network with $w^{[1]}$, $b^{[1]}$; softmax parameters are $w^{[2]}$, $b^{[2]}$. the dimensional of neural network is 6 words times 300 dimentional word, which is a 1800 dimentional network layer. also we can decide a window like “a glass of orange __“, which removed “I want”

接下来文章讲述了不同的context上下文组合方式,列举例子如:

原句是:I want a glass of orange juice to go along with my cereal

  • Last 4 words (a glass of orange _)
  • 4 words on left & right (a glass of orange _ to go along with)
  • Last 1 word (orange _)

作者表达了不同的应用上下文学习的方法,如果the goal is just to learn word embedding那么,使用后集中简单方法,被认为已经可以很好地学习到了

Word2Vec算法

一种跟简单而有效的算法,学习Word Embeddings。先来看一下Skip-grams,依然是刚刚那个句子:

1
I want a glass of orange juice to go along with my cereal.

这个算法里面,随机的选取一个word作为context word,例如在上面那个句子里面,我们选择orange作为context word。接下来继续在一个window的去区间里面,选择一个target,比如选择了下一个word,那就是juice,选择之前两个的那个word,那就是glass等等。接下来,对于supervise learning模型而言,以context word为准,让系统去学习预测制定的target,不断校正其对应的W和b参数。

Model

Vocab size = 10000k

这里的softmax是个相对特殊的公式

关于选择context的问题:

课程中提出,to,the,a,of,for,在英语中是非常常见的词语。因此在随机选择时,会把这些常见词和非常见词分开来,以保证非常见词语,比如apple,orange甚至durian能够被(sampling)采样到。

Negative Sampling算法

定义一种新形式的supervised learning problem,举例原句不变

1
I want a glass of orange juice to go along with my cereal.

接下来会有两组不同的pair

第一排,是和之前的算法一样,通过在句子中进行选取,得到的一组pair,我们把这样的pair对应target值写成1,然后把从vacabulary里面随机选择出来的word,比如king,对应的target数值叫做0。事实上,所有随机从vacabulary里面抽取的数值,都会视为0

Model

接下来的意思是,$ e_{6357} $ 和 在vacabulary里面的10000个词汇进行配对,生成10000个0和1的target(logistic classification). 在实际应用中,每一次迭代选择也不是10000个,而是k个,k一般在5-20之间。每次迭代只需要计算k+1个logistic classification就可以了

同样的问题,如何选择negtive example,作者介绍了一种方法,用来做sampling,不过好像就是一种在词汇出现频次的基础上人为调整了数值的方法而已

GloVe算法

这是本课程介绍learning word embeddings的最后一种算法。这个算法可能并没有Word2Vec和Skip-gram那么普遍使用,但是因为他更简单,所以也值得被介绍一下。

GloVe算法的全称是全向量词语表达(Global Vector for word representation)

1
I want a glass of orange juice to go along with my cereal.

之前我们用的c和t来表示配对关系。在GloVe算法里有如下的公式

$ X_{ij} $ 可以表示为i显示在j的上下文中出现的次数。因此类比一下,这里的i可以相当于Word2Vec里面的target(t), j是context(c)

Model

具体算法暂时不陈述了,因为没太听懂,其实还是使用了上面算法里面的那个 $ \theta^T_te_c $. 我觉得我在这个地方的确没太明白他代表了什么。需要在复习的时候重新看一下。眼下先把考试过了再说

Applications using Word Embeddings

最后一部分了,主要讲述对于Word Embeddings的应用方法。

Sentiment Classification

开始没懂什么意思,看图一下子就明白了

Simple sentiment classification model

1
2
The    desert   is   excellent    # goto 4 stars
8928 2468 4694 3180

假设每一个是300个dimentional embeddings. 把这四个词放在一起,就是一个由1200个dimention组成的neural network layer。err,这里好像不太一样,这里用的是sum或avg这300个特征向量,然后把这个扔给softmax,得到1-5的一个y

RNN for sentiment classification

1
Completely lacking in good taste, good service and good ambience    # goto 1 star

对于这样一句话,刚刚的算法表示很无奈。这里面虽然出现了许多的good,但是并不是说好的,而是lacking in。所以如果完全的sum或者avg很难实现 goto 1 star的效果。

使用Many-to-one RNN Achitecture

这里说明使用word embeddings的方法$ e_{4966} $我们训练的是结果可以有更好的类比性,比如lacking和obsent,而不再只是拘泥于一个固定词汇的训练。这让语言有了更强的灵活性。

Debiasing Word Embeddings

去除偏差,这里指的不是deeplearning里面的bias,与embeddings相关的预测结果的偏差问题。比如

  • Man:Woman as King:Queen 这个是对的
  • Man: Programmer as Woman:Homemaker 这个就不对了
  • Father:Doctor as Mother:Nurse 这个也不合适

源自于我们生活的显示,基于性别,信仰,年龄,性别等造成了许多偏差认知,这在人类社会也广泛存在。但是我们并不希望计算机也有这种所谓偏差,甚至“歧视”出现。所以有了本文中所描述的关于如何去除偏差的方法。

Addressing bias in Word Embeddings

因为内容感觉和我差的有点远,知道就好,所以这里做个特别简要的描述

  1. Identifiy bias direction(比如性别,年龄)
  2. Neutralize: For every word that is not definitional, project to ge rid of bias
  3. Equalize pairs

有篇论文,[Bolukbasi et. al., 2016. Man is to computer programmmer as woman is homemaker?]

物体检测

终于有点时间,可以写继续写notes,这样可以让整个学习过程的印象更加深入。

本节课为CNN的第三周,总的来说就是讲述如何通过pre-train的物体模型,识别整张照片上的物体。和以往前两周的课程一样,围绕着若干篇论文算法展开 Detecting Algorithm

  • Object Localization
  • Landmark Detection, which describe less in the class about how to detect the interal features of an object by key landmarks
  • Object Detection, talking about how to detect an object with bounding box
  • Sliding Window

这里主要重点回顾YOLO(you only look once)。这是本课重点阐述的内容,video有两个,作业也是直接就是讲述YOLO,顺带一点其他算法。

  • 起点,将原图划分成19x19的区块 (方便简化计算)
  • Input image (608, 608, 3)
  • The input image goes through a CNN, resulting in a (19,19,5,85) dimensional output.
  • After flattening the last two dimensions, the output is a volume of shape (19, 19, 425):
    • Each cell in a 19x19 grid over the input image gives 425 numbers.
    • 425 = 5 x 85 because each cell contains predictions for 5 boxes, corresponding to 5 anchor boxes, as seen in lecture.
    • 85 = 5 + 80 where 5 is because (pc,bx,by,bh,bw)(pc,bx,by,bh,bw) has 5 numbers, and and 80 is the number of classes we’d like to detect
  • You then select only few boxes based on:
    • Score-thresholding: throw away boxes that have detected a class with a score less than the threshold
    • Non-max suppression: Compute the Intersection over Union and avoid selecting overlapping boxes
  • This gives you YOLO’s final output.

What you should remember:

  • YOLO is a state-of-the-art object detection model that is fast and accurate
  • It runs an input image through a CNN which outputs a 19x19x5x85 dimensional volume.
  • The encoding can be seen as a grid where each of the 19x19 cells contains information about 5 boxes.
  • You filter through all the boxes using non-max suppression. Specifically:
    • Score thresholding on the probability of detecting a class to keep only accurate (high probability) boxes
    • Intersection over Union (IoU) thresholding to eliminate overlapping boxes
  • Because training a YOLO model from randomly initialized weights is non-trivial and requires a large dataset as well as lot of computation, we used previously trained model parameters in this exercise. If you wish, you can also try fine-tuning the YOLO model with your own dataset, though this would be a fairly non-trivial exercise.

对于tensorflow基本用法的一些记录

最近已经学到了机器学习的第四课CNN的部分。这个部分里面还是用到了一些Tensorflow的基本内容。这里把一些简单的方法做个总结,以做备忘,也许之后用得上。

1
2
# Use tf.image.non_max_suppression() to get the list of indices corresponding to boxes you keep
nms_indices = tf.image.non_max_suppression(boxes, scores, max_boxes, iou_threshold)

对于TF的Run始终觉得需要系统的理解一下

1
2
3
4
# Run the session with the correct tensors and choose the correct placeholders in the feed_dict.
# You'll need to use feed_dict={yolo_model.input: ... , K.learning_phase(): 0})
out_scores, out_boxes, out_classes = sess.run([scores, boxes, classes],
feed_dict={yolo_model.input: image_data, K.learning_phase(): 0})

这里除了TensorFlow还得多提一个Keras,一个构建在TF上面更加丰富函数的第三方包

1
2
keras.backend.argmax(x, axis=-1)
keras.backend.max(x, axis=None, keepdims=False)

np也有一些特殊的方法,比较不常见和不容易理解,下面np.eye就是把一个Y变成C个为一组的one-hot

1
2
3
def convert_to_one_hot(Y, C):
Y = np.eye(C)[Y.reshape(-1)]
return Y

深度学习第二课第二周算法优化

在算法优化这一周的课程里,大纲是这样的

  • Mini-batch gradient descent
  • Understanding mini-batch gradient
  • Exponentially weighted averages
  • Understanding exponentially weighted averages
  • Bias correction in exponentially weighted averages
  • Gradient descent with momentum
  • RMSprop
  • Adam optimization algorithm
  • Learning rate decay
  • The problem of local optima

这一周的课程非常连贯,10节课程一气呵成没有任何分段。我们来看一下他们的内在逻辑。先看几个图:

在一个标准的Gradient Descent中,下降是非常直接而且直线的,很完美。然而根据本章的描述,这种完美在大数据的情况下会出现一定的问题。那就是每一次迭代update parameter的过程,因为涉及到的样本的数量过于庞大,导致需要做完所有的样本才能实现一次下降。这导致计算效率过低。如何才能提高计算效率呢,那就是争取早一点出结果,让后面的计算早一点站在“前人”的肩膀上工作。于是有了基于mini-batch的算法。

这种算法的好处是,虽有下降不再是那么完美的直线,但是它能让数据计算快速产生结果,让参数的更新加快、

在之后的学习中,Andew引入了Exponentially weighted averages概念。说白了,因为mini-batch的引入导致了比较剧烈的震荡,这会让下降的偏移度增加,导致下降到类似cost function指标需要的迭代明显增加了,于是引入了加权平均的概念,帮助缩小振幅,这让mini-batch算法既保留了快速应用前人结果进行下降的优势,又让下降的震荡幅度缩小。随后的momentum和RMSprop以及合体的Adam Optimization,大体就是以上逻辑的算法实现。

最后,章节描述了梯级下降中Learning rate的调优方法以及解释了局部最优困扰为什么是不存在的。

深度学习第四周神经网络

上一周(章)主要学习的是一个Hidden Layer的情况下,如何进行模型搭建。这一周开始进入多个Layer的学习。同样的首先上大纲:

  • L层深的神经网络 (Deep L-layer neural network)
  • 深度网络中的向前扩展 (Forward Propagation in Deep Network)
  • 正确获取和验证行列式 (Getting your matrix dimensions right)
  • 深度代表什么 (Why deep representations)
  • 组建深度神经网络的模块 (Building blocks of deep neural networks)
  • 向前和向后扩展啊 (Forward and Backward Propagation)
  • 参数和高度参数 (Parameters vs Hyperparameters)
  • 计算机神经网络与大脑神经网络 (What does this have to do with the brain)

一个基本的Linear到sigmoid的公式
$A^{[L]} = \sigma(Z^{[L]}) = \sigma(W^{[L]} A^{[L-1]} + b^{[L]})$

In general, initializing all the weights to zero results in the network failing to break symmetry. This means that every neuron in each layer will learn the same thing, and you might as well be training a neural network with n[l]=1n[l]=1 for every layer, and the network is no more powerful than a linear classifier such as logistic regression.