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.

深度学习第三周神经网络

上一周(章)主要学习的是如何构建模型,梯级下降和使用numpy进行向量计算。这一周开始进入神经网络的学习。同样的首先上大纲:

  • 神经网络全景图(Neural Networks Overview)
  • 神经网络表达(Neural Network Representation)
  • 计算神经网络输出(Computing a Neural Network’s Output)
  • 向量化(Vectorizing across multiple examples)
  • 向量实现(Expanation for Vectorized Implmetation)
  • 激励函数(Activation functions)
  • 为什么需要非线性模型(Why do you need non-linear )

这一周的学习说简单也简单,说难也难。我们来先说简单的:

所谓简单,指的是这一周的课程主要是在上一周Logistics Regression的基础上加入了一个Hidden Layer的概念,即将所有的内容从两层输入输出结构,变成了三层,因此引入了$n^0, n^1, n^2$的三个层进行计算。这样做的好处是可以将模型变得拟合度更高,进一步提高Accuracy。而所有在Logistics Regression中用到的公式和方法基本沿用,所以数学本质上并不难,只是增加一个维度。

说他难呢,基本上就是因为增加了一个维度,所以derivative的所有计算方面,确实需要更多的东西了。当然这里也有一些小改变,那就是引入了activation function的概念,将原来那个在逻辑回归中谈到的Sigmoid Functoin,作为一种activation function;从而进一步引入其他的activation function,比如“$tanh$”

把这一周的内容集中在使用场景方面的总结:

对于3到4层Hidden Layer的时候

对于5到20层Hidden Layer的时候

对于50层Hidden Layer的时候

可以明显的看出当Hidden Layer提升了以后,预测拟合度就更高了,这就是神经网络带来的巨大意义

深度学习第二周课程(下)

上一章节提到的梯度下降(Gradient Decent)过程需要多层嵌套For-Loop循环。这种循环非常耗费计算资源。为了降低计算资源消耗,提升计算效率,本章节引入向量计算(Vectorization)的概念。本章的主要内容也是围绕着向量计算和使用Python中的numpy库来实现限量计算的过程。

本章课程内容目录(与本文无关):

  • 向量计算(Vectorization)
  • 使用向量计算逻辑回归(Vectorizing Logistic Regression)
  • 使用向量计算逻辑回归中的梯度下降(Vectorizing Logistic Regression’s Gradient)
  • Python的广播(Broadcasting in Python)
  • Python/numpy向量的介绍
  • 逻辑回归里的Cost Function解释

安装一下jupyter

本章开始需要进行练习,Python是必须要装的,强烈建议Python3,课程使用Jupyter,这里也提示了一下安装,不过后来发现好像用处也不大。这个工具主要是可以把Python的程序脚本和文字进行混排,方便与演示。如果从来没有接触过Python的话,可以考虑用一下,毕竟这个是课程也在用的环境。如果有一点基础的话,Python有自己的IDE工具,PyCharm,很好用直接下载就行。

安装Python&Jupyter。因为一直写Python所以这个一直有没什么大问题,但是Jupyt这个倒是头一次见,好像是一种基于Browser的IDE,挺有意思的。具体可以访问以下几个地址:

  • 安装Python,我一直用Brew install就好了
  • 安装Pip,不过因为买了这个新电脑以后就没怎么写代码,所以竟然没有Pip。这个倒也不难,随便上网搜索“install pip”,两步简单操作就搞定了
  • 安装Jupyter,没有按照web上说的用pkg包的方式,只是担心会安装额外的Python3.所以选择了通过pip命令行形式进行安装。

OK,三个安装结束,键入下面命令,直接启动Browser的界面

1
jupyter notebook

下面是标准编辑页面(竟然Hexo的asset_img可以用,好激动,但是asset_link确实不行,估计是因为marked里面escape的问题)

首界面很简单,就是系统文件夹。右上角有新建功能,可以新建一个可运行的python文件。在课程中,Andrew主要介绍了 np.dot(i,j) 在程序中对比for-loop,超过300倍的优势。笔者后来自己查了一下原因,看来主要还是回到了Python作为解释性语言本身的问题。为了对初学者友好,Python作为解释性语言牺牲了许多性能上的东西。而np.dot之所以much faster,主要原因是一句Python语言,对应的是用C写成numpy库,这个库会将输入进来的数据进行编译,形成编译后的语言进行调用。这种方法,远好于Python一个字符一个字符的进行读取,并根据语法分析器进行描述,占据了大量的时间。当然其他原因也有许多,比如借助编译可以使用CPU或者GPU的SIMD指令集(Simple instuction multiple data)进行并行计算,大大提升效率。根据文章将,numpy的效率可以是原生python的2万倍。而据说选用cpython会达到20万倍之多。具体原理可以参看知乎上的这篇文章:

python的numpy向量化语句为什么会比for快?

建立神经网络的主要过程

先来回顾一下基础算法:

For one example $x^{(i)}$:

The cost is then computed by summing over all training examples:

建模过程

  • 定义模型结构(例如输入feature的数量)
  • 初始化模型参数
  • 升级参数(Gradient Descent)

讲上述三个部分逐个建立并整合进一个叫做model()的 $function$ 里。几个简单的 $function$ 会包含的 $sigmoid$ , initialize_with_zeros() , propagate()

特别说明,关于 propagate() 的算法回顾如下:
Forward Propagation:

  • You get X
  • You compute $A = \sigma(w^T X + b) = (a^{(1)}, a^{(2)}, …, a^{(m-1)}, a^{(m)})$
  • You calculate the cost function: $J = -\frac{1}{m}\sum_{i=1}^{m}y^{(i)}\log(a^{(i)})+(1-y^{(i)})\log(1-a^{(i)})$

Here are the two formulas you will be using:

下面的Code里面用到了一些“内积”、“外积”、“General Dot”的概念。在课程中有相关的联系材料。具体参见这个解释可能会更加实在

使用numpy进行行列式乘积的计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
m = X.shape[1]

# FORWARD PROPAGATION (FROM X TO COST)
### START CODE HERE ### (≈ 2 lines of code)
A = sigmoid(np.dot(X.T, w) + b).reshape(1, -1) # compute activation
cost = - (1/m) * np.sum(Y*np.log(A) + (1-Y) * np.log(1-A)) # compute cost
### END CODE HERE ###

# BACKWARD PROPAGATION (TO FIND GRAD)
### START CODE HERE ### (≈ 2 lines of code)
dw = 1/m * np.dot(X, (A-Y).T)
db = 1/m * np.sum(A-Y)
### END CODE HERE ###

assert(dw.shape == w.shape)
assert(db.dtype == float)
cost = np.squeeze(cost)
assert(cost.shape == ())

grads = {"dw": dw,
"db": db}

return grads, cost

总结一下,这里建立的初始模型包括
$sigmoid$, $initialize$, $propagate$

优化模型参数(Optimization)

  • 初始化参数
  • 计算cost function
  • 通过梯级下降的方式进行参数更新并计算w和b的结果()

最近基本的梯级下降依据如下:

where $\alpha$ is the learning rate

总结一下,这里建立的初始模型包括
$initialize$, $optimize$, $predict$

整合模型

合并模型建立$model$,使用plot建立拟合线